diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..1756b4e84 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +postcss.config.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..237825159 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,24 @@ +module.exports = { + parser: 'babel-eslint', + extends: [ + 'airbnb-base', + 'plugin:react/recommended', + ], + rules: { + 'max-len': ['error', 140, 2], + 'no-underscore-dangle': 'off', + 'no-param-reassign': 'off', + 'react/prop-types': 0, + 'react/jsx-indent': ['error', 2], + 'import/prefer-default-export': 'off', + }, + settings: { + 'react': { + 'pragma': 'React', + 'version': '16.5', + }, + }, + env: { + 'browser': true, + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..c25e5957f --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Optional npm cache directory +.npm + +# Visual Studio Code +.vscode + +#Mac specific files +.DS_Store diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..e4bf041a8 --- /dev/null +++ b/.npmignore @@ -0,0 +1,3 @@ +build +node_modules +.DS_Store diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..4b37b0e16 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team using the online form in the contacts page of the superalgos.org website. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..c67e8d115 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,45 @@ +# Contributing + +We are thrilled you are interested in contributing to this repository. Your help may be essential to the project's success and we want you in! + +Superalgos is a collective project, currently at a very early stage. Although this repository is not open source software yet, we do welcome contributions from the community. + +Contributions are deemed _voluntary work_. There might be incentives in place for certain kinds of contributions. Contact us for more information in this regard. + +In any case, contributors agree to provide an express grant of patent rights for their contributions. Submitting Pull Requests to this repository represents an express agreement with the terms of our Balanced Contributor Intellectual Property Agreement. This agreement is a direct implementation of GitHub's [Balanced Employee Intellectual Property Agreement 1.0.1](https://github.com/github/balanced-employee-ip-agreement/blob/master/Balanced_Employee_IP_Agreement.md). + +# Balanced Contributor Intellectual Property Agreement 1.0.1 + +This BALANCED CONTRIBUTOR INTELLECTUAL PROPERTY AGREEMENT is between person or team submitting Pull Requests to this repository and Superalgos.org ("Project"). + +**What is this?** This is the Project's Intellectual Property Agreement ("Agreement"). If you've worked in the technology space before, there's a good chance that you've run across one or more of these in the past. This document is the official, entire and exclusive agreement on what intellectual property ("IP") is yours, and what belongs to the Project. + +**Why is this?** The Project needs to be clear on what IP it owns and has rights to. Its customers, contributors, and investors depend on the Project having the legal rights to the products and services it is providing so that the Project can continue operating and doing business. + +The Project also believes that it's important to be clear on what it doesn't own. The Project doesn't want you looking over your shoulder every time you work on something personal or worrying that the Project will someday seize your open source non-lethal mousetrap simulation software. In other words, the Project isn't interested in appropriating your personal projects. + +**Read this.** Please read this document and be sure you understand it before you submit any Pull Requests. Due to legal risk and corporate obligations, the Project cannot, by and large, negotiate its terms. If you feel you have a particular circumstance that keeps you from signing, please let the Project's legal department ("Legal") know. And, of course, you're always free and encouraged to get your own legal counsel to explain anything you're not clear on. + +Cool? Then, by submitting your first Pull Request, and as a condition of your contribution, you agree to the following: + +1. **What the Project owns.** The Project owns any IP ("Project IP") that you create, or help create _as its contributor_, but only if it meets one or more of these additional conditions: The IP was (i) related to an existing or prospective Project product or service at the time you developed, invented, or created it, (ii) developed for use by the Project, or (iii) developed or promoted with existing Project IP or with the Project's endorsement. You hereby grant and assign, and will grant and assign, to the Project all rights and interests in all Project IP. + + "Project IP" includes concepts, designs, developments, discoveries, ideas, improvements, inventions, trade secrets, trademarks, and works of authorship. + +2. **What the Project doesn't own.** If you create IP that doesn't fit into one of the categories listed above, the Project doesn't own it. In other words, the Project doesn't own concepts, designs, developments, discoveries, ideas, improvements, inventions, trade secrets, trademarks, or works of authorship that you develop, invent, or create that do not meet any of the conditions in Section 1. + +3. **Contribution of your IP to Project projects.** If you include your own IP – such as IP you created prior to working for the Project – into a Project product or service, it's still yours, of course, but you grant the Project a non-exclusive, irrevocable, fully paid-up, royalty-free, perpetual, sublicensable, transferable, worldwide license to use it without restriction in any way or implementation, in modified form, or as is, by itself, or incorporated into another product or service ("License"). If you include your name in any project over which the Project would have rights under this Agreement, such as in a copyright notice or a comment in code or documentation, then the License covers the rights associated with that use of your name as well. + +4. **Your contributions to non-Project projects.** The Project recognizes that you may be engaged in work that requires you to submit IP to entities other than the Project, such as open source projects used by the Project. Please make sure that Legal is aware of what you're working on so that Legal can help with any licensing issues. If any project asks you to sign a contribution agreement, you should check with Legal before doing so. These agreements may be legally binding on the Project and so should be run through Legal first. + +5. **Voluntary Works** All Project IP that you are involved with or create as part of your work for the Project is voluntary work which does not require compensation. There might be incentives in place for certain kinds of contributions. Feel free to contact the Project to learn more. + +6. **No conflicts.** You agree that you don't have any outstanding agreements or obligations that conflict with those in this Agreement, and that you won't enter into conflicting agreements in the future. + +7. **IP protection.** The Project might someday need to show the work that went into the development of IP that it uses or has used, or to make government filings to establish that it owns the IP or has rights over it. To help in those situations, you agree not to destroy any records you maintain relating to the development of any Project IP or IP under License (together, "All IP"), and, if the Project asks, to provide those records to the Project. You agree to help the Project secure and defend its rights in All IP. For your help the Project will compensate you at a reasonable rate. If the Project is unable to secure your help, you authorize the Project to act on your behalf (as your agent and attorney-in-fact) in securing all rights related to All IP. + +8. **Confidentiality.** As an contributor or contractor of the Project, you will have access to sensitive confidential information that is important to the Project's business. You are responsible for keeping this information confidential, including after you end your work for the Project. + + "Confidential Information" includes non-public technical details about our products or services, financial information, business strategies and forecasts, customer data, or any other information, data or know-how that is valuable to the Project because it is not publicly known. + + The Project's Confidential Information is sensitive and we expect that you'll treat it as such. You agree to only use the Project's Confidential Information for the purpose of performing your contribution and for the benefit of the Project. You will do your best to keep Confidential Information secret. If you are not sure if something is Confidential Information, you should assume that it is, until you can confirm otherwise. \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..2fe09f449 --- /dev/null +++ b/LICENSE @@ -0,0 +1,39 @@ +COPYRIGHT NOTICE + +© Copyright 2018 Superalgos.org + + +LICENSE NOTICE + +Superalgos is a collaborative project currently at a very early stage. Because certain aspects of +the project are still not clearly defined, we have chosen to --temporarily-- grant a restrictive +license for the use of this repository, until those aspects are clarified and a proper open source +license can be granted. + +Superalgos.org is publishing the code of this software for several reasons. However, it shall not be considered free software yet. Superalgos is a collaborative project in the crypto space and this +software is still proprietary software. + +The reasons for opening up the code of this software at this stage are the following: + + * We believe that transparency is paramount to achieving our goals, so we want everyone to + be able to understand what this software does and how. Opening up the code of this software + allows anyone to take a close look. + + * We welcome contributions from the community. Contributions are regarded as voluntary work. + There may be incentives in place for certain kinds of contributions. Contact us to learn more. + Contributors agree to provide an express grant of patent rights for their contributions. + + +LICENSE WORDING + +Superalgos.org grants a limited license for the following uses: + +1. CODE REVIEW AND AUDITS. You are granted permission to clone this repository to analyze, + review or audit the code. + +2. COLLABORATING WITH Superalgos.org. You are granted permission to fork this repository + with the sole purpose of correcting bugs and developing functionality in agreement with + Superalgos.org. By contributing to this repository you explicitely agree to the terms + detailed in CONTRIBUTING.MD. + +PLEASE SEE CONTRIBUTING.MD FOR MORE DETAILS ON THE IMPLICATIONS SURROUNDING YOUR CONTRIBUTIONS TO THIS REPOSITORY. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..4d80d7e95 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +EventsClient diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..f3eb6625a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2625 @@ +{ + "name": "@superalgos/events-client", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.5.tgz", + "integrity": "sha512-IO31r62xfMI+wBJVmgx0JR9ZOHty8HkoYpQAjRWUGG9vykBTlGHdArZ8zoFtpUu2gs17K7qTl/TtPpiSi6t+MA==", + "dev": true, + "requires": { + "@babel/types": "^7.1.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.5.tgz", + "integrity": "sha512-WXKf5K5HT6X0kKiCOezJZFljsfxKV1FpU8Tf1A7ZpGvyd/Q4hlrJm2EwoH2onaUq3O4tLDp+4gk0hHPsMyxmOg==", + "dev": true + }, + "@babel/runtime": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", + "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.5.tgz", + "integrity": "sha512-eU6XokWypl0MVJo+MTSPUtlfPePkrqsF26O+l1qFGlCKWwmiYAYy2Sy44Qw8m2u/LbPCsxYt90rghmqhYMGpPA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.5", + "@babel/types": "^7.1.5", + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.5.tgz", + "integrity": "sha512-sJeqa/d9eM/bax8Ivg+fXF7FpN3E/ZmTrWbkk6r+g7biVYfALMnLin4dKijsaqEhpd2xvOGfQTkQkD31YCVV4A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "@material-ui/core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.5.1.tgz", + "integrity": "sha512-yMBwYV5HQ/kZjncSmzHSx4uxJCePdbq9N58Jl0tq9D1gD5fKVJY/lItnQLRlcpCzZUkGxfDhpDutvLDq58ZAkg==", + "requires": { + "@babel/runtime": "7.1.2", + "@material-ui/utils": "^3.0.0-alpha.0", + "@types/jss": "^9.5.6", + "@types/react-transition-group": "^2.0.8", + "brcast": "^3.0.1", + "classnames": "^2.2.5", + "csstype": "^2.5.2", + "debounce": "^1.1.0", + "deepmerge": "^2.0.1", + "dom-helpers": "^3.2.1", + "hoist-non-react-statics": "^3.0.0", + "is-plain-object": "^2.0.4", + "jss": "^9.3.3", + "jss-camel-case": "^6.0.0", + "jss-default-unit": "^8.0.2", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-vendor-prefixer": "^7.0.0", + "keycode": "^2.1.9", + "normalize-scroll-left": "^0.1.2", + "popper.js": "^1.14.1", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.2", + "react-transition-group": "^2.2.1", + "recompose": "0.28.0 - 0.30.0", + "warning": "^4.0.1" + } + }, + "@material-ui/icons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-3.0.1.tgz", + "integrity": "sha512-1kNcxYiIT1x8iDPEAlgmKrfRTIV8UyK6fLVcZ9kMHIKGWft9I451V5mvSrbCjbf7MX1TbLWzZjph0aVCRf9MqQ==", + "requires": { + "@babel/runtime": "7.0.0", + "recompose": "^0.29.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "recompose": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.29.0.tgz", + "integrity": "sha512-J/qLXNU4W+AeHCDR70ajW8eMd1uroqZaECTj6qqDLPMILz3y0EzpYlvrnxKB9DnqcngWrtGwjXY9JeXaW9kS1A==", + "requires": { + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" + } + } + } + }, + "@material-ui/utils": { + "version": "3.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-3.0.0-alpha.0.tgz", + "integrity": "sha512-HwC/pBcPG81UP4Jh0BaH2i4wAY9aDOrvL5+B/7J6cyFlG/Wip5Li+qI+GDlk9MR3kpG8v0sxfpWA0IlQYcHK6g==", + "requires": { + "@babel/runtime": "7.1.2" + } + }, + "@types/async": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.50.tgz", + "integrity": "sha512-VMhZMMQgV1zsR+lX/0IBfAk+8Eb7dPVMWiQGFAt3qjo5x7Ml6b77jUo0e1C3ToD+XRDXqtrfw+6AB0uUsPEr3Q==", + "optional": true + }, + "@types/jss": { + "version": "9.5.7", + "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.7.tgz", + "integrity": "sha512-OZimStu2QdDMtZ0h72JXqvLVbWUjXd5ZLk8vxLmfuC/nM1AabRyyGoxSufnzixrbpEcVcyy/JV5qeQu2JnjVZw==", + "requires": { + "csstype": "^2.0.0", + "indefinite-observable": "^1.0.1" + } + }, + "@types/prop-types": { + "version": "15.5.6", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.6.tgz", + "integrity": "sha512-ZBFR7TROLVzCkswA3Fmqq+IIJt62/T7aY/Dmz+QkU7CaW2QFqAitCE8Ups7IzmGhcN1YWMBT4Qcoc07jU9hOJQ==" + }, + "@types/react": { + "version": "16.7.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.3.tgz", + "integrity": "sha512-ve/2lnXuLNaTDR1SPvsEX25m+NoNW3PMJxL2jd372UR8oJPwR5+jgtcheUoN27O+qKLFmQy0y0YKRwZcwtny3w==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-transition-group": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.14.tgz", + "integrity": "sha512-pa7qB0/mkhwWMBFoXhX8BcntK8G4eQl4sIfSrJCxnivTYRQWjOWf2ClR9bWdm0EUFBDHzMbKYS+QYfDtBzkY4w==", + "requires": { + "@types/react": "*" + } + }, + "@types/zen-observable": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz", + "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==" + }, + "acorn": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", + "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", + "dev": true + }, + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "apollo-cache": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.20.tgz", + "integrity": "sha512-+Du0/4kUSuf5PjPx0+pvgMGV12ezbHA8/hubYuqRQoy/4AWb4faa61CgJNI6cKz2mhDd9m94VTNKTX11NntwkQ==", + "requires": { + "apollo-utilities": "^1.0.25" + } + }, + "apollo-client": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.4.5.tgz", + "integrity": "sha512-nUm06EGa4TP/IY68OzmC3lTD32TqkjLOQdb69uYo+lHl8NnwebtrAw3qFtsQtTEz6ueBp/Z/HasNZng4jwafVQ==", + "requires": { + "@types/async": "2.0.50", + "@types/zen-observable": "^0.8.0", + "apollo-cache": "1.1.20", + "apollo-link": "^1.0.0", + "apollo-link-dedup": "^1.0.0", + "apollo-utilities": "1.0.25", + "symbol-observable": "^1.0.2", + "zen-observable": "^0.8.0" + } + }, + "apollo-link": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz", + "integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.10" + } + }, + "apollo-link-dedup": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/apollo-link-dedup/-/apollo-link-dedup-1.0.10.tgz", + "integrity": "sha512-tpUI9lMZsidxdNygSY1FxflXEkUZnvKRkMUsXXuQUNoSLeNtEvUX7QtKRAl4k9ubLl8JKKc9X3L3onAFeGTK8w==", + "requires": { + "apollo-link": "^1.2.3" + } + }, + "apollo-utilities": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.25.tgz", + "integrity": "sha512-AXvqkhni3Ir1ffm4SA1QzXn8k8I5BBl4PVKEyak734i4jFdp+xgfUyi2VCqF64TJlFTA/B73TRDUvO2D+tKtZg==", + "requires": { + "fast-json-stable-stringify": "^2.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "autoprefixer": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.3.1.tgz", + "integrity": "sha512-DY9gOh8z3tnCbJ13JIWaeQsoYncTGdsrgCceBaQSIL4nvdrLxgbRSBPevg2XbX7u4QCSfLheSJEEIUUSlkbx6Q==", + "dev": true, + "requires": { + "browserslist": "^4.3.3", + "caniuse-lite": "^1.0.30000898", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.5", + "postcss-value-parser": "^3.3.1" + } + }, + "babel-eslint": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", + "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "brcast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz", + "integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg==" + }, + "browserslist": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", + "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000899", + "electron-to-chromium": "^1.3.82", + "node-releases": "^1.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000907", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000907.tgz", + "integrity": "sha512-No5sQ/OB2Nmka8MNOOM6nJx+Hxt6MQ6h7t7kgJFu9oTuwjykyKRSBP/+i/QAyFHxeHB+ddE0Da1CG5ihx9oehQ==", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "core-js": { + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", + "requires": { + "is-in-browser": "^1.0.2" + } + }, + "csstype": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.7.tgz", + "integrity": "sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw==" + }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", + "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.9.0.tgz", + "integrity": "sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.5.3", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "imurmurhash": "^0.1.4", + "inquirer": "^6.1.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.0.2", + "text-table": "^0.2.0" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz", + "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==", + "dev": true, + "requires": { + "eslint-restricted-globals": "^0.1.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fbjs-css-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.1.tgz", + "integrity": "sha512-IM+v/C40MNZWqsLErc32e0TyIk/NhkkQZL0QmjBh6zi1eXv0/GeVKmKmueQX7nn9SXQBQbTUcB8zuexIF3/88w==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.2.tgz", + "integrity": "sha512-KByBY8c98sLUAGpnmjEdWTrtrLZRtZdwds+kAL/ciFXTCb7AZgqKsAnVnYFQj1hxepwO8JKN/8AsRWwLq+RK0A==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^3.0.0", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "graphql": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", + "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", + "requires": { + "iterall": "^1.2.2" + } + }, + "graphql-tag": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.0.tgz", + "integrity": "sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "hoist-non-react-statics": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.1.0.tgz", + "integrity": "sha512-MYcYuROh7SBM69xHGqXEwQqDux34s9tz+sCnxJmN18kgWh6JFdTw/5YdZtqsOdZJXddE/wUpCzfEdDrJj8p0Iw==", + "requires": { + "react-is": "^16.3.2" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hyphenate-style-name": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", + "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indefinite-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.1.tgz", + "integrity": "sha1-CZFUI8yNb36xy3iCrRNGM8mm7cM=", + "requires": { + "symbol-observable": "1.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", + "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jss": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", + "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", + "requires": { + "is-in-browser": "^1.1.3", + "symbol-observable": "^1.1.0", + "warning": "^3.0.0" + }, + "dependencies": { + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "jss-camel-case": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", + "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", + "requires": { + "hyphenate-style-name": "^1.0.2" + } + }, + "jss-default-unit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", + "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==" + }, + "jss-global": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", + "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==" + }, + "jss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", + "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", + "requires": { + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "jss-props-sort": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", + "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==" + }, + "jss-vendor-prefixer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", + "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", + "requires": { + "css-vendor": "^0.3.8" + } + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.flowright": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flowright/-/lodash.flowright-3.5.0.tgz", + "integrity": "sha1-K1//OZcW1+fcVyT+k0n2cGUYTWc=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "luxon": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.6.2.tgz", + "integrity": "sha512-vZP3vVTK0aH3W6zleLYefctzpKaUaVtdF7G/WblRrf/lbEASMuV5ZlPR+2GBvaUEuD0TAf/r5NB98s3ER4shnQ==" + }, + "material-ui-pickers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/material-ui-pickers/-/material-ui-pickers-1.0.1.tgz", + "integrity": "sha512-FRJwgeFUQdQxzNAybZvf11204KFBxqKS6sg4JvAO0cWmHULXJhrc9kuEDT8F7Pomwnv6+AyfxygsoMgIRcBMNg==", + "requires": { + "classnames": "^2.2.6", + "keycode": "^2.2.0", + "react-event-listener": "^0.6.4", + "react-text-mask": "=5.4.1", + "react-transition-group": "^2.5.0", + "tslib": "^1.9.3" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-releases": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.3.tgz", + "integrity": "sha512-ZaZWMsbuDcetpHmYeKWPO6e63pSXLb50M7lJgCbcM2nC/nQC3daNifmtp5a2kp7EWwYfhuvH6zLPWkrF8IiDdw==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-scroll-left": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", + "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "popper.js": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.5.tgz", + "integrity": "sha512-fs4Sd8bZLgEzrk8aS7Em1qh+wcawtE87kRUJQhK6+LndyV1HerX7+LURzAylVaTyWIn5NTB/lyjnWqw/AZ6Yrw==" + }, + "postcss": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", + "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.5.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "dev": true + }, + "progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "react": { + "version": "16.6.3", + "resolved": "https://registry.npmjs.org/react/-/react-16.6.3.tgz", + "integrity": "sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.11.2" + } + }, + "react-apollo": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.2.4.tgz", + "integrity": "sha512-haS5R30Qvteb65ZLfWomUZQh47VU4ld4Kof3zlqdbLOrYPt3/DdVZC8ZFPZSxd5zPeIJtZqpUfAxD1WHVoMPIA==", + "requires": { + "fbjs": "^1.0.0", + "hoist-non-react-statics": "^3.0.0", + "invariant": "^2.2.2", + "lodash.flowright": "^3.5.0", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.6.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "fbjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", + "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", + "requires": { + "core-js": "^2.4.1", + "fbjs-css-vars": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + } + } + }, + "react-dom": { + "version": "16.6.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.3.tgz", + "integrity": "sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.11.2" + } + }, + "react-event-listener": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.4.tgz", + "integrity": "sha512-t7VSjIuUFmN+GeyKb+wm025YLeojVB85kJL6sSs0wEBJddfmKBEQz+CNBZ2zBLKVWkPy/fZXM6U5yvojjYBVYQ==", + "requires": { + "@babel/runtime": "7.0.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + } + } + }, + "react-hot-loader": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.3.12.tgz", + "integrity": "sha512-GMM4TsqUVss2QPe+Y33NlgydA5/+7tAVQxR0rZqWvBpapM8JhD7p6ymMwSZzr5yxjoXXlK/6P6qNQBOqm1dqdg==", + "dev": true, + "requires": { + "fast-levenshtein": "^2.0.6", + "global": "^4.3.0", + "hoist-non-react-statics": "^2.5.0", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.0.2" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "dev": true + } + } + }, + "react-is": { + "version": "16.6.3", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.6.3.tgz", + "integrity": "sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA==" + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + } + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" + } + }, + "react-sortable-hoc": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-0.8.3.tgz", + "integrity": "sha512-vt2qQ9DnPLjGZ9osM2jBULdi7WfFXtYVuHvjHX8o2em7Rcla9FXIG60aWFbvvpFC1iXyATw5PWZX0B57EUOYfQ==", + "requires": { + "babel-runtime": "^6.11.6", + "invariant": "^2.2.1", + "prop-types": "^15.5.7" + } + }, + "react-text-mask": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/react-text-mask/-/react-text-mask-5.4.1.tgz", + "integrity": "sha512-mGx1n0x0skktwsKcpgAGnrgExFlXDflbWEHh8PC1UaQP8+EdHkW7JYczTghsBo2rnVwU9/4A9x/2bVt3HY46/w==", + "requires": { + "prop-types": "^15.5.6" + } + }, + "react-transition-group": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.0.tgz", + "integrity": "sha512-qYB3JBF+9Y4sE4/Mg/9O6WFpdoYjeeYqx0AFb64PTazVy8RPMiE3A47CG9QmM4WJ/mzDiZYslV+Uly6O1Erlgw==", + "requires": { + "dom-helpers": "^3.3.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "recompose": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", + "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", + "requires": { + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + } + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scheduler": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.2.tgz", + "integrity": "sha512-+WCP3s3wOaW4S7C1tl3TEXp4l9lJn0ZK8G3W3WKRWmw77Z2cIFUW2MiNTMHn5sCjxN+t7N43HAOOgMjyAg5hlg==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "table": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", + "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "dev": true, + "requires": { + "ajv": "^6.5.3", + "lodash": "^4.17.10", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "ua-parser-js": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, + "warning": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", + "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.10.tgz", + "integrity": "sha512-5vqMtRggU/2GhePC9OU4sYEWOdvmayp2k3gjPf4F0mXwB3CSbbNznfDUvDJx9O2ZTa1EIXdJhPchQveFKwNXPQ==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..b04e66be9 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "@superalgos/events-client", + "version": "0.0.2", + "description": "SuperAlgos Event client-side web app", + "author": "", + "license": "", + "main": "src/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Superalgos/EventsClientModule.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "standard": { + "parser": "babel-eslint" + }, + "devDependencies": { + "autoprefixer": "^9.2.0", + "babel-eslint": "^10.0.1", + "eslint": "^5.8.0", + "eslint-config-airbnb-base": "^13.1.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-react": "^7.11.1", + "react-hot-loader": "^4.3.11" + }, + "dependencies": { + "@material-ui/core": "^3.2.0", + "@material-ui/icons": "^3.0.1", + "apollo-client": "^2.4.4", + "graphql": "^14.0.2", + "graphql-tag": "^2.10.0", + "luxon": "^1.4.4", + "material-ui-pickers": "^1.0.1", + "react": "^16.5.2", + "react-apollo": "^2.2.4", + "react-dom": "^16.6.0", + "react-router-dom": "^4.3.1", + "react-sortable-hoc": "^0.8.3" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 000000000..eb022cd60 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: [ + require('autoprefixer'), + ], +}; diff --git a/src/Components/BannerTopBar/index.js b/src/Components/BannerTopBar/index.js new file mode 100644 index 000000000..c006763f9 --- /dev/null +++ b/src/Components/BannerTopBar/index.js @@ -0,0 +1,18 @@ +import React from 'react'; +import Typography from '@material-ui/core/Typography'; + +const BannerTopBar = ({ + size, + backgroundUrl, + title, + text, +}) => ( +
+
+ {title} + {text} +
+
+); + +export default BannerTopBar; diff --git a/src/Components/Event/Create/Tabs/Basic.js b/src/Components/Event/Create/Tabs/Basic.js new file mode 100644 index 000000000..6854ea420 --- /dev/null +++ b/src/Components/Event/Create/Tabs/Basic.js @@ -0,0 +1,111 @@ +import React from 'react'; +import { + TextField, + Button, + FormGroup, + Typography, + Grid, +} from '@material-ui/core'; +import { + ChevronLeft, + ChevronRight, +} from '@material-ui/icons'; +import { DateTimePicker } from 'material-ui-pickers'; + + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class Basic extends React.Component { + render() { + const { + classes, event, edit, create, + } = this.props; + return ( + + + These are the basic information you need to input in order to create an event. + There might be some heavy changes in the near future as the application is still at a very early stage. + + + + + edit('title', newVal.target.value)} + /> + edit('subtitle', newVal.target.value)} + /> + edit('description', newVal.target.value)} + /> + + + + + } + rightArrowIcon={} + value={event.startDatetime} + helperText='Competition start date' + onChange={newVal => edit('startDatetime', newVal)} + /> + + + } + rightArrowIcon={} + value={event.endDatetime} + helperText='Competition ending date' + onChange={newVal => edit('endDatetime', newVal)} + /> + + + + + + + + + + + ); + } +} + +export default withStyles(styles)(Basic); diff --git a/src/Components/Event/Create/Tabs/PresentationPage.js b/src/Components/Event/Create/Tabs/PresentationPage.js new file mode 100644 index 000000000..1c674ddcc --- /dev/null +++ b/src/Components/Event/Create/Tabs/PresentationPage.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class PresentationPage extends React.Component { + render() { + const { classes } = this.props; + return ( + + + PresentationPage + + + ); + } +} + +export default withStyles(styles)(PresentationPage); diff --git a/src/Components/Event/Create/Tabs/TeamsServer.js b/src/Components/Event/Create/Tabs/TeamsServer.js new file mode 100644 index 000000000..874c72d6f --- /dev/null +++ b/src/Components/Event/Create/Tabs/TeamsServer.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class TeamsServer extends React.Component { + render() { + const { classes } = this.props; + return ( + + + TeamsServer + + + ); + } +} + +export default withStyles(styles)(TeamsServer); diff --git a/src/Components/Event/Create/Tabs/Technical/Formula/New.js b/src/Components/Event/Create/Tabs/Technical/Formula/New.js new file mode 100644 index 000000000..605782b2d --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Formula/New.js @@ -0,0 +1,78 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +import { Mutation } from 'react-apollo'; +import { getOptionsCalls } from '../../../../../../GraphQL/Calls/index'; + +class New extends React.Component { + constructor() { + super(); + this.state = { name: '' }; + } + + render() { + const { name } = this.state; + const { closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='createFormula-dialog-title' + > + + Create a new formula + + + + At least for now, all the formulas are publically available, creating it here will let you select it in the select element. + + + { + const { events_Formulas: formulas } = store.readQuery({ + query: getOptionsCalls.EVENTS_FORMULAS, + }); + store.writeQuery({ + query: getOptionsCalls.EVENTS_FORMULAS, + data: { events_Formulas: formulas.concat([data.events_CreateFormula]) }, + }); + closeDialogs(); + } + } + > + {createFormula => ( +
{ + e.preventDefault(); + createFormula({ + variables: { + formula: { name }, + }, + }); + }} + > + this.setState({ name: e.target.value })} + fullWidth + /> + + + )} +
+ +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Create/Tabs/Technical/Formula/index.js b/src/Components/Event/Create/Tabs/Technical/Formula/index.js new file mode 100644 index 000000000..6f7047dad --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Formula/index.js @@ -0,0 +1,5 @@ +import New from './New'; + +export { + New, +}; diff --git a/src/Components/Event/Create/Tabs/Technical/Plotter/New.js b/src/Components/Event/Create/Tabs/Technical/Plotter/New.js new file mode 100644 index 000000000..5dc2b3b06 --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Plotter/New.js @@ -0,0 +1,108 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +import { Mutation } from 'react-apollo'; +import { getOptionsCalls } from '../../../../../../GraphQL/Calls/index'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + name: '', + host: '', + repo: '', + moduleName: '', + }; + } + + render() { + const { + name, host, repo, moduleName, + } = this.state; + const { closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='createPlotter-dialog-title' + > + + Create a new plotter + + + + At least for now, all the plotters are publically available, creating it here will let you select it in the select element. + + + { + const { events_Plotters: plotters } = store.readQuery({ + query: getOptionsCalls.EVENTS_PLOTTERS, + }); + store.writeQuery({ + query: getOptionsCalls.EVENTS_PLOTTERS, + data: { events_Plotters: plotters.concat([data.events_CreatePlotter]) }, + }); + closeDialogs(); + } + } + > + {createPlotter => ( +
{ + e.preventDefault(); + createPlotter({ + variables: { + plotter: { + name, + host, + repo, + moduleName, + }, + }, + }); + }} + > + this.setState({ name: e.target.value })} + fullWidth + /> + this.setState({ host: e.target.value })} + fullWidth + /> + this.setState({ repo: e.target.value })} + fullWidth + /> + this.setState({ moduleName: e.target.value })} + fullWidth + /> + + + )} +
+ +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Create/Tabs/Technical/Plotter/index.js b/src/Components/Event/Create/Tabs/Technical/Plotter/index.js new file mode 100644 index 000000000..6f7047dad --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Plotter/index.js @@ -0,0 +1,5 @@ +import New from './New'; + +export { + New, +}; diff --git a/src/Components/Event/Create/Tabs/Technical/Prizes/List.js b/src/Components/Event/Create/Tabs/Technical/Prizes/List.js new file mode 100644 index 000000000..cc807f2c2 --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Prizes/List.js @@ -0,0 +1,72 @@ +import React from 'react'; +import { + Paper, + Grid, + Typography, +} from '@material-ui/core'; +import { + SortableContainer, + SortableElement, + SortableHandle, +} from 'react-sortable-hoc'; + +const DragHandle = SortableHandle(() =>
); + +const SortableItem = SortableElement(({ value, deletePrize, index }) => ( +
+ + + + + + + + {value.from}{value.to}{value.additional}{value.amount}{value.asset} + + + + + + deletePrize(index)} >Remove + + + +
+)); + +const SortableList = SortableContainer(({ items, deletePrize }) => ( +
+ {items.map((value, index) => ( + deletePrize(deleteId)} /> + ))} +
+)); + +class List extends React.Component { + onSortEnd = ({ oldIndex, newIndex }) => { + const newPrizes = this.props.prizes.slice(0); + newPrizes.splice(newIndex, 0, newPrizes.splice(oldIndex, 1)[0]); + this.props.edit(newPrizes); + } + + deletePrize = (deletedIndex) => { + const newPrizes = this.props.prizes.slice(0); + newPrizes.splice(deletedIndex, 1); + this.props.edit(newPrizes); + } + + render() { + return ( + + this.deletePrize(deleteId)} + /> + + ); + } +} + +export default List; diff --git a/src/Components/Event/Create/Tabs/Technical/Prizes/New.js b/src/Components/Event/Create/Tabs/Technical/Prizes/New.js new file mode 100644 index 000000000..53d702b4e --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Prizes/New.js @@ -0,0 +1,106 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + additional: '', + amount: 0, + asset: '', + }; + } + + render() { + const { + from, to, additional, amount, asset, + } = this.state; + const { addPrize, closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='addPrize-dialog-title' + > + + + Prizes are define textually only. In case of infringement, contact us. + +
{ + e.preventDefault(); + addPrize({ + from, + to, + additional, + amount, + asset, + }); + }} + > + + Conditions : + + + Examples : + If you want to make a price for the best bot only, you set both from and to rank to 1. + If you want the rest of the top 10 to get a price, you add a new price with from rank set to 2 and to rank set to 10. + Caution : + - Leaving "from rank" empty considers it to 0. + - Leaving "to rank" empty considers it as infinite + - Prizes are define in an additive manner, meaning that if a team qualifies for two prices, it gets both. + - Additional allows you to write addionnal textual condition, like "positive ROI only" for example. + + + this.setState({ from: e.target.value })} + type="number" + /> + this.setState({ to: e.target.value })} + type="number" + /> + this.setState({ additional: e.target.value })} + fullWidth + /> + + Pool : + + + Here you define the pool, the amount is a number whereas asset is a text. For example 1BTC, 200$, or whatever. + + this.setState({ amount: e.target.value })} + type="number" + /> + this.setState({ asset: e.target.value })} + /> + + + +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Create/Tabs/Technical/Prizes/index.js b/src/Components/Event/Create/Tabs/Technical/Prizes/index.js new file mode 100644 index 000000000..307bbe029 --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Prizes/index.js @@ -0,0 +1,7 @@ +import List from './List'; +import New from './New'; + +export { + List, + New, +}; diff --git a/src/Components/Event/Create/Tabs/Technical/Rules/List.js b/src/Components/Event/Create/Tabs/Technical/Rules/List.js new file mode 100644 index 000000000..e2966ae7d --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Rules/List.js @@ -0,0 +1,73 @@ +import React from 'react'; +import { + Paper, + Grid, + Typography, +} from '@material-ui/core'; +import { + SortableContainer, + SortableElement, + SortableHandle, +} from 'react-sortable-hoc'; + +const DragHandle = SortableHandle(() =>
); + +const SortableItem = SortableElement(({ value, deleteRule, index }) => ( +
+ + + + + + + + {value.title} + + + {value.description} + + + + deleteRule(index)} >Remove + + + +
+)); + +const SortableList = SortableContainer(({ items, deleteRule }) => ( +
+ {items.map((value, index) => ( + deleteRule(deleteId)} /> + ))} +
+)); + +class List extends React.Component { + onSortEnd = ({ oldIndex, newIndex }) => { + const newRules = this.props.rules.slice(0); + newRules.splice(newIndex, 0, newRules.splice(oldIndex, 1)[0]); + this.props.edit(newRules); + } + + deleteRule = (deletedIndex) => { + const newRules = this.props.rules.slice(0); + newRules.splice(deletedIndex, 1); + this.props.edit(newRules); + } + + render() { + return ( + + this.deleteRule(deleteId)} + /> + + ); + } +} + +export default List; diff --git a/src/Components/Event/Create/Tabs/Technical/Rules/New.js b/src/Components/Event/Create/Tabs/Technical/Rules/New.js new file mode 100644 index 000000000..e133c1508 --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Rules/New.js @@ -0,0 +1,68 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + title: '', + description: '', + }; + } + + render() { + const { + title, description, + } = this.state; + const { addRule, closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='addRule-dialog-title' + > + + Create a new rule + + + + Rules are define textually only. In case of infringement, contact us. + +
{ + e.preventDefault(); + addRule( + title, + description, + ); + }} + > + this.setState({ title: e.target.value })} + fullWidth + /> + this.setState({ description: e.target.value })} + fullWidth + /> + + + +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Create/Tabs/Technical/Rules/index.js b/src/Components/Event/Create/Tabs/Technical/Rules/index.js new file mode 100644 index 000000000..307bbe029 --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/Rules/index.js @@ -0,0 +1,7 @@ +import List from './List'; +import New from './New'; + +export { + List, + New, +}; diff --git a/src/Components/Event/Create/Tabs/Technical/index.js b/src/Components/Event/Create/Tabs/Technical/index.js new file mode 100644 index 000000000..1840c37fb --- /dev/null +++ b/src/Components/Event/Create/Tabs/Technical/index.js @@ -0,0 +1,196 @@ +import React from 'react'; +import { Query } from 'react-apollo'; + +import { + Typography, + FormControl, + InputLabel, + Input, + Select, + FormHelperText, + MenuItem, + Grid, + Button, +} from '@material-ui/core'; +import { withStyles } from '@material-ui/core/styles'; +import styles from '../../styles'; + +import { getOptionsCalls } from '../../../../../GraphQL/Calls/index'; + +import { List as RulesList, New as NewRule } from './Rules'; +import { List as PrizesList, New as NewPrize } from './Prizes'; + +import { New as NewPlotter } from './Plotter'; +import { New as NewFormula } from './Formula'; + +class Technical extends React.Component { + constructor(props) { + super(props); + this.state = { + isNewFormulaOpen: false, + isNewPlotterOpen: false, + isNewRuleOpen: false, + isNewPrizeOpen: false, + }; + } + + addRule = (title, description) => { + this.props.edit('rules', [...this.props.event.rules, { + title, + description, + }]); + this.closeDialogs(); + } + + addPrize = (prize) => { + this.props.edit('prizes', [...this.props.event.prizes, prize]); + this.closeDialogs(); + } + + closeDialogs = () => { + this.setState({ + isNewFormulaOpen: false, + isNewPlotterOpen: false, + isNewRuleOpen: false, + isNewPrizeOpen: false, + }); + } + + render() { + const { + classes, event, edit, create, + } = this.props; + const { + isNewPlotterOpen, isNewFormulaOpen, isNewRuleOpen, isNewPrizeOpen, + } = this.state; + return ( + + + Select the formula and the plotter you want to use, you can also create your own with the corresponding button. + + + + Select the formula + + + {({ loading, error, data }) => { + if (loading) { + return ( + + ); + } + if (error) return `Error! ${error.message}`; + const selects = data.events_Formulas.map((formula, index) => ( + {formula.name} + )); + return ( + + + { isNewFormulaOpen ? this.closeDialogs()} /> : ''} + + ); + }} + + { this.setState({ isNewFormulaOpen: true }); }}> + To create a new formula, click here + + + + + Select the Plotter + + + {({ loading, error, data }) => { + if (loading) { + return ( + + ); + } + if (error) return `Error! ${error.message}`; + const selects = data.events_Plotters.map((plotter, index) => ( + {plotter.name} + )); + return ( + + + { isNewPlotterOpen ? this.closeDialogs()} /> : ''} + + ); + }} + + { this.setState({ isNewPlotterOpen: true }); }} > + To create a new plotter, click here + + + + + + Define the rules of your event. + + edit('rules', newVal)} /> + { isNewRuleOpen + ? this.closeDialogs()} addRule={(title, description) => this.addRule(title, description)} /> + : ''} + { this.setState({ isNewRuleOpen: true }); }} > + To add a new rule, click here + + + + + + Define the prizes of your event. + + edit('prizes', newVal)} /> + { isNewPrizeOpen + ? this.closeDialogs()} addPrize={prize => this.addPrize(prize)} /> + : ''} + { this.setState({ isNewPrizeOpen: true }); }} > + To add a new prize, click here + + + + + + + + + + ); + } +} + +export default withStyles(styles)(Technical); diff --git a/src/Components/Event/Create/Tabs/index.js b/src/Components/Event/Create/Tabs/index.js new file mode 100644 index 000000000..feecaaf55 --- /dev/null +++ b/src/Components/Event/Create/Tabs/index.js @@ -0,0 +1,11 @@ +import Basic from './Basic'; +import PresentationPage from './PresentationPage'; +import TeamsServer from './TeamsServer'; +import Technical from './Technical'; + +export { + Basic, + PresentationPage, + TeamsServer, + Technical, +}; diff --git a/src/Components/Event/Create/index.js b/src/Components/Event/Create/index.js new file mode 100644 index 000000000..3288815b5 --- /dev/null +++ b/src/Components/Event/Create/index.js @@ -0,0 +1,212 @@ +import React from 'react'; +import { Mutation } from 'react-apollo'; +import { DateTime } from 'luxon'; + +import { + Paper, + Typography, + AppBar, + Tabs, + Tab, +} from '@material-ui/core'; +import { + Face as BasicIcon, + Alarm as TechnicalIcon, + Group as TeamAndServerIcon, + PresentToAll as PresentationIcon, +} from '@material-ui/icons'; +import { withStyles } from '@material-ui/core/styles'; +import styles from './styles'; + +import BannerTopBar from '../../BannerTopBar'; + +import { + Basic, + PresentationPage, + TeamsServer, + Technical, +} from './Tabs'; + +import { hostedEventsCalls } from '../../../GraphQL/Calls'; + +function TabContainer(props) { + return ( + + {props.children} + + ); +} + +class Create extends React.Component { + constructor(props) { + super(props); + this.state = { + value: 0, + title: '', + subtitle: '', + description: '', + startDatetime: DateTime.local().plus({ days: 1 }).startOf('day'), + endDatetime: DateTime.local().plus({ days: 8 }).startOf('day'), + formulaId: '', + plotterId: '', + prizes: [], + rules: [], + }; + } + + handleTabChange = (event, value) => { + this.setState({ value }); + } + + handleEventChange = (newType, newVal) => { + this.setState({ [newType]: newVal }); + } + + remapPrizes = (prizes) => { + const remappedPrizes = []; + + prizes.forEach((prize) => { + remappedPrizes.push({ + condition: { + from: parseInt(prize.from, 10), + to: parseInt(prize.to, 10), + additional: prize.additional, + }, + pool: { + amount: parseInt(prize.amount, 10), + asset: prize.asset, + }, + }); + }); + return remappedPrizes; + } + + render() { + const { + title, + subtitle, + description, + startDatetime, + endDatetime, + value, + formulaId, + plotterId, + prizes, + rules, + } = this.state; + const { classes } = this.props; + return ( + + + { + this.props.history.push(`/events/edit/${data.events_CreateEvent.id}`); + } + } + > + {hostEvent => ( +
+ + + } + /> + } + /> + } + disabled + /> + } + disabled + /> + + +
+ + + Create a new event + + {value === 0 && + this.handleEventChange(newType, newVal)} + create={() => hostEvent({ + variables: { + event: { + title, + subtitle, + description, + startDatetime: startDatetime.valueOf() / 1000, + endDatetime: endDatetime.valueOf() / 1000, + formulaId, + plotterId, + prizes: this.remapPrizes(prizes), + rules, + }, + }, + })} + /> + } + {value === 1 && + this.handleEventChange(newType, newVal)} + create={() => hostEvent({ + variables: { + event: { + title, + subtitle, + description, + startDatetime: startDatetime.valueOf() / 1000, + endDatetime: endDatetime.valueOf() / 1000, + formulaId, + plotterId, + prizes: this.remapPrizes(prizes), + rules, + }, + }, + })} + /> + } + {value === 2 && } + {value === 3 && } + +
+
+ )} +
+
+ ); + } +} + +export default withStyles(styles)(Create); diff --git a/src/Components/Event/Create/styles.js b/src/Components/Event/Create/styles.js new file mode 100644 index 000000000..50a3490ca --- /dev/null +++ b/src/Components/Event/Create/styles.js @@ -0,0 +1,51 @@ +const styles = theme => ({ + root: { + flexGrow: 1, + width: '100%', + backgroundColor: theme.palette.background.paper, + padding: 0, + margin: 0, + }, + tabTitle: { + width: '25%', + maxWidth: 'none', + }, + clickable: { + cursor: 'pointer', + }, + buttonList: { + margin: theme.spacing.unit, + float: 'right', + }, + buttonGrid: { + marginTop: -20, + }, + title: { + marginTop: 20, + }, + paperRoot: { + flexGrow: 1, + padding: 10, + marginTop: 25, + marginBottom: 25, + }, + inputField: { + width: '80%', + marginLeft: '10%', + marginTop: 25, + }, + typography: { + width: '80%', + marginLeft: '10%', + marginTop: 40, + }, + selectEmpty: { + marginTop: theme.spacing.unit * 2, + }, + bottomButton: { + padding: 15, + margin: 20, + }, +}); + +export default styles; diff --git a/src/Components/Event/Edit/Tabs/Basic.js b/src/Components/Event/Edit/Tabs/Basic.js new file mode 100644 index 000000000..8210a3720 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Basic.js @@ -0,0 +1,111 @@ +import React from 'react'; +import { + TextField, + Button, + FormGroup, + Typography, + Grid, +} from '@material-ui/core'; +import { + ChevronLeft, + ChevronRight, +} from '@material-ui/icons'; +import { DateTimePicker } from 'material-ui-pickers'; + + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class Basic extends React.Component { + render() { + const { + classes, event, edit, saveChanges, + } = this.props; + return ( + + + These are the basic information you need to input in order to edit an event. + There might be some heavy changes in the near future as the application is still at a very early stage. + + + + + edit('title', newVal.target.value)} + /> + edit('subtitle', newVal.target.value)} + /> + edit('description', newVal.target.value)} + /> + + + + + } + rightArrowIcon={} + value={event.startDatetime} + helperText='Competition start date' + onChange={newVal => edit('startDatetime', newVal)} + /> + + + } + rightArrowIcon={} + value={event.endDatetime} + helperText='Competition ending date' + onChange={newVal => edit('endDatetime', newVal)} + /> + + + + + + + + + + + ); + } +} + +export default withStyles(styles)(Basic); diff --git a/src/Components/Event/Edit/Tabs/PresentationPage.js b/src/Components/Event/Edit/Tabs/PresentationPage.js new file mode 100644 index 000000000..1c674ddcc --- /dev/null +++ b/src/Components/Event/Edit/Tabs/PresentationPage.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class PresentationPage extends React.Component { + render() { + const { classes } = this.props; + return ( + + + PresentationPage + + + ); + } +} + +export default withStyles(styles)(PresentationPage); diff --git a/src/Components/Event/Edit/Tabs/TeamsServer.js b/src/Components/Event/Edit/Tabs/TeamsServer.js new file mode 100644 index 000000000..874c72d6f --- /dev/null +++ b/src/Components/Event/Edit/Tabs/TeamsServer.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class TeamsServer extends React.Component { + render() { + const { classes } = this.props; + return ( + + + TeamsServer + + + ); + } +} + +export default withStyles(styles)(TeamsServer); diff --git a/src/Components/Event/Edit/Tabs/Technical/Formula/New.js b/src/Components/Event/Edit/Tabs/Technical/Formula/New.js new file mode 100644 index 000000000..605782b2d --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Formula/New.js @@ -0,0 +1,78 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +import { Mutation } from 'react-apollo'; +import { getOptionsCalls } from '../../../../../../GraphQL/Calls/index'; + +class New extends React.Component { + constructor() { + super(); + this.state = { name: '' }; + } + + render() { + const { name } = this.state; + const { closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='createFormula-dialog-title' + > + + Create a new formula + + + + At least for now, all the formulas are publically available, creating it here will let you select it in the select element. + + + { + const { events_Formulas: formulas } = store.readQuery({ + query: getOptionsCalls.EVENTS_FORMULAS, + }); + store.writeQuery({ + query: getOptionsCalls.EVENTS_FORMULAS, + data: { events_Formulas: formulas.concat([data.events_CreateFormula]) }, + }); + closeDialogs(); + } + } + > + {createFormula => ( +
{ + e.preventDefault(); + createFormula({ + variables: { + formula: { name }, + }, + }); + }} + > + this.setState({ name: e.target.value })} + fullWidth + /> + + + )} +
+ +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Edit/Tabs/Technical/Formula/index.js b/src/Components/Event/Edit/Tabs/Technical/Formula/index.js new file mode 100644 index 000000000..6f7047dad --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Formula/index.js @@ -0,0 +1,5 @@ +import New from './New'; + +export { + New, +}; diff --git a/src/Components/Event/Edit/Tabs/Technical/Plotter/New.js b/src/Components/Event/Edit/Tabs/Technical/Plotter/New.js new file mode 100644 index 000000000..5dc2b3b06 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Plotter/New.js @@ -0,0 +1,108 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +import { Mutation } from 'react-apollo'; +import { getOptionsCalls } from '../../../../../../GraphQL/Calls/index'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + name: '', + host: '', + repo: '', + moduleName: '', + }; + } + + render() { + const { + name, host, repo, moduleName, + } = this.state; + const { closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='createPlotter-dialog-title' + > + + Create a new plotter + + + + At least for now, all the plotters are publically available, creating it here will let you select it in the select element. + + + { + const { events_Plotters: plotters } = store.readQuery({ + query: getOptionsCalls.EVENTS_PLOTTERS, + }); + store.writeQuery({ + query: getOptionsCalls.EVENTS_PLOTTERS, + data: { events_Plotters: plotters.concat([data.events_CreatePlotter]) }, + }); + closeDialogs(); + } + } + > + {createPlotter => ( +
{ + e.preventDefault(); + createPlotter({ + variables: { + plotter: { + name, + host, + repo, + moduleName, + }, + }, + }); + }} + > + this.setState({ name: e.target.value })} + fullWidth + /> + this.setState({ host: e.target.value })} + fullWidth + /> + this.setState({ repo: e.target.value })} + fullWidth + /> + this.setState({ moduleName: e.target.value })} + fullWidth + /> + + + )} +
+ +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Edit/Tabs/Technical/Plotter/index.js b/src/Components/Event/Edit/Tabs/Technical/Plotter/index.js new file mode 100644 index 000000000..6f7047dad --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Plotter/index.js @@ -0,0 +1,5 @@ +import New from './New'; + +export { + New, +}; diff --git a/src/Components/Event/Edit/Tabs/Technical/Prizes/List.js b/src/Components/Event/Edit/Tabs/Technical/Prizes/List.js new file mode 100644 index 000000000..cc807f2c2 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Prizes/List.js @@ -0,0 +1,72 @@ +import React from 'react'; +import { + Paper, + Grid, + Typography, +} from '@material-ui/core'; +import { + SortableContainer, + SortableElement, + SortableHandle, +} from 'react-sortable-hoc'; + +const DragHandle = SortableHandle(() =>
); + +const SortableItem = SortableElement(({ value, deletePrize, index }) => ( +
+ + + + + + + + {value.from}{value.to}{value.additional}{value.amount}{value.asset} + + + + + + deletePrize(index)} >Remove + + + +
+)); + +const SortableList = SortableContainer(({ items, deletePrize }) => ( +
+ {items.map((value, index) => ( + deletePrize(deleteId)} /> + ))} +
+)); + +class List extends React.Component { + onSortEnd = ({ oldIndex, newIndex }) => { + const newPrizes = this.props.prizes.slice(0); + newPrizes.splice(newIndex, 0, newPrizes.splice(oldIndex, 1)[0]); + this.props.edit(newPrizes); + } + + deletePrize = (deletedIndex) => { + const newPrizes = this.props.prizes.slice(0); + newPrizes.splice(deletedIndex, 1); + this.props.edit(newPrizes); + } + + render() { + return ( + + this.deletePrize(deleteId)} + /> + + ); + } +} + +export default List; diff --git a/src/Components/Event/Edit/Tabs/Technical/Prizes/New.js b/src/Components/Event/Edit/Tabs/Technical/Prizes/New.js new file mode 100644 index 000000000..53d702b4e --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Prizes/New.js @@ -0,0 +1,106 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + additional: '', + amount: 0, + asset: '', + }; + } + + render() { + const { + from, to, additional, amount, asset, + } = this.state; + const { addPrize, closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='addPrize-dialog-title' + > + + + Prizes are define textually only. In case of infringement, contact us. + +
{ + e.preventDefault(); + addPrize({ + from, + to, + additional, + amount, + asset, + }); + }} + > + + Conditions : + + + Examples : + If you want to make a price for the best bot only, you set both from and to rank to 1. + If you want the rest of the top 10 to get a price, you add a new price with from rank set to 2 and to rank set to 10. + Caution : + - Leaving "from rank" empty considers it to 0. + - Leaving "to rank" empty considers it as infinite + - Prizes are define in an additive manner, meaning that if a team qualifies for two prices, it gets both. + - Additional allows you to write addionnal textual condition, like "positive ROI only" for example. + + + this.setState({ from: e.target.value })} + type="number" + /> + this.setState({ to: e.target.value })} + type="number" + /> + this.setState({ additional: e.target.value })} + fullWidth + /> + + Pool : + + + Here you define the pool, the amount is a number whereas asset is a text. For example 1BTC, 200$, or whatever. + + this.setState({ amount: e.target.value })} + type="number" + /> + this.setState({ asset: e.target.value })} + /> + + + +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Edit/Tabs/Technical/Prizes/index.js b/src/Components/Event/Edit/Tabs/Technical/Prizes/index.js new file mode 100644 index 000000000..307bbe029 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Prizes/index.js @@ -0,0 +1,7 @@ +import List from './List'; +import New from './New'; + +export { + List, + New, +}; diff --git a/src/Components/Event/Edit/Tabs/Technical/Rules/List.js b/src/Components/Event/Edit/Tabs/Technical/Rules/List.js new file mode 100644 index 000000000..e2966ae7d --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Rules/List.js @@ -0,0 +1,73 @@ +import React from 'react'; +import { + Paper, + Grid, + Typography, +} from '@material-ui/core'; +import { + SortableContainer, + SortableElement, + SortableHandle, +} from 'react-sortable-hoc'; + +const DragHandle = SortableHandle(() =>
); + +const SortableItem = SortableElement(({ value, deleteRule, index }) => ( +
+ + + + + + + + {value.title} + + + {value.description} + + + + deleteRule(index)} >Remove + + + +
+)); + +const SortableList = SortableContainer(({ items, deleteRule }) => ( +
+ {items.map((value, index) => ( + deleteRule(deleteId)} /> + ))} +
+)); + +class List extends React.Component { + onSortEnd = ({ oldIndex, newIndex }) => { + const newRules = this.props.rules.slice(0); + newRules.splice(newIndex, 0, newRules.splice(oldIndex, 1)[0]); + this.props.edit(newRules); + } + + deleteRule = (deletedIndex) => { + const newRules = this.props.rules.slice(0); + newRules.splice(deletedIndex, 1); + this.props.edit(newRules); + } + + render() { + return ( + + this.deleteRule(deleteId)} + /> + + ); + } +} + +export default List; diff --git a/src/Components/Event/Edit/Tabs/Technical/Rules/New.js b/src/Components/Event/Edit/Tabs/Technical/Rules/New.js new file mode 100644 index 000000000..e133c1508 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Rules/New.js @@ -0,0 +1,68 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + title: '', + description: '', + }; + } + + render() { + const { + title, description, + } = this.state; + const { addRule, closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='addRule-dialog-title' + > + + Create a new rule + + + + Rules are define textually only. In case of infringement, contact us. + +
{ + e.preventDefault(); + addRule( + title, + description, + ); + }} + > + this.setState({ title: e.target.value })} + fullWidth + /> + this.setState({ description: e.target.value })} + fullWidth + /> + + + +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Edit/Tabs/Technical/Rules/index.js b/src/Components/Event/Edit/Tabs/Technical/Rules/index.js new file mode 100644 index 000000000..307bbe029 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/Rules/index.js @@ -0,0 +1,7 @@ +import List from './List'; +import New from './New'; + +export { + List, + New, +}; diff --git a/src/Components/Event/Edit/Tabs/Technical/index.js b/src/Components/Event/Edit/Tabs/Technical/index.js new file mode 100644 index 000000000..212aa6d50 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/Technical/index.js @@ -0,0 +1,196 @@ +import React from 'react'; +import { Query } from 'react-apollo'; + +import { + Typography, + FormControl, + InputLabel, + Input, + Select, + FormHelperText, + MenuItem, + Grid, + Button, +} from '@material-ui/core'; +import { withStyles } from '@material-ui/core/styles'; +import styles from '../../styles'; + +import { getOptionsCalls } from '../../../../../GraphQL/Calls/index'; + +import { List as RulesList, New as NewRule } from './Rules'; +import { List as PrizesList, New as NewPrize } from './Prizes'; + +import { New as NewPlotter } from './Plotter'; +import { New as NewFormula } from './Formula'; + +class Technical extends React.Component { + constructor(props) { + super(props); + this.state = { + isNewFormulaOpen: false, + isNewPlotterOpen: false, + isNewRuleOpen: false, + isNewPrizeOpen: false, + }; + } + + addRule = (title, description) => { + this.props.edit('rules', [...this.props.event.rules, { + title, + description, + }]); + this.closeDialogs(); + } + + addPrize = (prize) => { + this.props.edit('prizes', [...this.props.event.prizes, prize]); + this.closeDialogs(); + } + + closeDialogs = () => { + this.setState({ + isNewFormulaOpen: false, + isNewPlotterOpen: false, + isNewRuleOpen: false, + isNewPrizeOpen: false, + }); + } + + render() { + const { + classes, event, edit, saveChanges, + } = this.props; + const { + isNewPlotterOpen, isNewFormulaOpen, isNewRuleOpen, isNewPrizeOpen, + } = this.state; + return ( + + + Select the formula and the plotter you want to use, you can also create your own with the corresponding button. + + + + Select the formula + + + {({ loading, error, data }) => { + if (loading) { + return ( + + ); + } + if (error) return `Error! ${error.message}`; + const selects = data.events_Formulas.map((formula, index) => ( + {formula.name} + )); + return ( + + + { isNewFormulaOpen ? this.closeDialogs()} /> : ''} + + ); + }} + + { this.setState({ isNewFormulaOpen: true }); }}> + To create a new formula, click here + + + + + Select the Plotter + + + {({ loading, error, data }) => { + if (loading) { + return ( + + ); + } + if (error) return `Error! ${error.message}`; + const selects = data.events_Plotters.map((plotter, index) => ( + {plotter.name} + )); + return ( + + + { isNewPlotterOpen ? this.closeDialogs()} /> : ''} + + ); + }} + + { this.setState({ isNewPlotterOpen: true }); }} > + To create a new plotter, click here + + + + + + Define the rules of your event. + + edit('rules', newVal)} /> + { isNewRuleOpen + ? this.closeDialogs()} addRule={(title, description) => this.addRule(title, description)} /> + : ''} + { this.setState({ isNewRuleOpen: true }); }} > + To add a new rule, click here + + + + + + Define the prizes of your event. + + edit('prizes', newVal)} /> + { isNewPrizeOpen + ? this.closeDialogs()} addPrize={prize => this.addPrize(prize)} /> + : ''} + { this.setState({ isNewPrizeOpen: true }); }} > + To add a new prize, click here + + + + + + + + + + ); + } +} + +export default withStyles(styles)(Technical); diff --git a/src/Components/Event/Edit/Tabs/index.js b/src/Components/Event/Edit/Tabs/index.js new file mode 100644 index 000000000..feecaaf55 --- /dev/null +++ b/src/Components/Event/Edit/Tabs/index.js @@ -0,0 +1,11 @@ +import Basic from './Basic'; +import PresentationPage from './PresentationPage'; +import TeamsServer from './TeamsServer'; +import Technical from './Technical'; + +export { + Basic, + PresentationPage, + TeamsServer, + Technical, +}; diff --git a/src/Components/Event/Edit/index.js b/src/Components/Event/Edit/index.js new file mode 100644 index 000000000..1db70051c --- /dev/null +++ b/src/Components/Event/Edit/index.js @@ -0,0 +1,33 @@ +import React from 'react'; +import { Query } from 'react-apollo'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from './styles'; +import Queried from './queried'; + +import BannerTopBar from '../../BannerTopBar'; + +import { showEventCalls } from '../../../GraphQL/Calls/index'; + +class Edit extends React.Component { + render() { + return ( + + + + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + return (); + }} + + + ); + } +} + +export default withStyles(styles)(Edit); diff --git a/src/Components/Event/Edit/queried.js b/src/Components/Event/Edit/queried.js new file mode 100644 index 000000000..3ba72b60a --- /dev/null +++ b/src/Components/Event/Edit/queried.js @@ -0,0 +1,228 @@ +import React from 'react'; +import { Mutation } from 'react-apollo'; + +import { + Paper, + Typography, + AppBar, + Tabs, + Tab, +} from '@material-ui/core'; +import { + Face as BasicIcon, + Alarm as TechnicalIcon, + Group as TeamAndServerIcon, + PresentToAll as PresentationIcon, +} from '@material-ui/icons'; +import { withStyles } from '@material-ui/core/styles'; +import styles from './styles'; + +import { + Basic, + PresentationPage, + TeamsServer, + Technical, +} from './Tabs'; + +import { hostedEventsCalls } from '../../../GraphQL/Calls/index'; + +function TabContainer(props) { + return ( + + {props.children} + + ); +} + +class Queried extends React.Component { + constructor(props) { + super(props); + this.state = { + value: 0, + id: this.props.event.id, + title: this.props.event.title, + subtitle: this.props.event.subtitle, + description: this.props.event.description, + startDatetime: this.props.event.startDatetime * 1000, + endDatetime: this.props.event.endDatetime * 1000, + formulaId: this.props.event.formula.id, + plotterId: this.props.event.plotter.id, + prizes: this.counterremapPrizes(this.props.event.prizes), + rules: this.props.event.rules, + }; + } + + handleTabChange = (event, value) => { + this.setState({ value }); + } + + handleEventChange = (newType, newVal) => { + this.setState({ [newType]: newVal }); + } + + counterremapPrizes = (prizes) => { + const counterremapPrizes = []; + prizes.forEach((prize) => { + counterremapPrizes.push({ + from: parseInt(prize.condition.from, 10), + to: parseInt(prize.condition.to, 10), + additional: prize.condition.additional, + amount: parseInt(prize.pool.amount, 10), + asset: prize.pool.asset, + }); + }); + return counterremapPrizes; + } + + remapPrizes = (prizes) => { + const remappedPrizes = []; + + prizes.forEach((prize) => { + remappedPrizes.push({ + condition: { + from: parseInt(prize.from, 10), + to: parseInt(prize.to, 10), + additional: prize.additional, + }, + pool: { + amount: parseInt(prize.amount, 10), + asset: prize.asset, + }, + }); + }); + return remappedPrizes; + } + + render() { + const { + id, + title, + subtitle, + description, + startDatetime, + endDatetime, + value, + formulaId, + plotterId, + prizes, + rules, + } = this.state; + const { classes } = this.props; + return ( + + { + this.props.history.push(`/events/edit/${data.events_EditEvent.id}`); + }} + > + {editHosted => ( +
+ + + } + /> + } + /> + } + disabled + /> + } + disabled + /> + + +
+ + + Edit an event + + {value === 0 && + this.handleEventChange(newType, newVal)} + saveChanges={() => editHosted({ + variables: { + eventId: id, + event: { + title, + subtitle, + description, + startDatetime: startDatetime.valueOf() / 1000, + endDatetime: endDatetime.valueOf() / 1000, + formulaId, + plotterId, + prizes: this.remapPrizes(prizes), + rules, + }, + }, + })} + /> + } + {value === 1 && + this.handleEventChange(newType, newVal)} + saveChanges={() => editHosted({ + variables: { + eventId: id, + event: { + title, + subtitle, + description, + startDatetime: startDatetime.valueOf() / 1000, + endDatetime: endDatetime.valueOf() / 1000, + formulaId, + plotterId, + prizes: this.remapPrizes(prizes), + rules, + }, + }, + })} + /> + } + {value === 2 && } + {value === 3 && } + +
+
+ )} +
+
+ ); + } +} + +export default withStyles(styles)(Queried); diff --git a/src/Components/Event/Edit/styles.js b/src/Components/Event/Edit/styles.js new file mode 100644 index 000000000..50a3490ca --- /dev/null +++ b/src/Components/Event/Edit/styles.js @@ -0,0 +1,51 @@ +const styles = theme => ({ + root: { + flexGrow: 1, + width: '100%', + backgroundColor: theme.palette.background.paper, + padding: 0, + margin: 0, + }, + tabTitle: { + width: '25%', + maxWidth: 'none', + }, + clickable: { + cursor: 'pointer', + }, + buttonList: { + margin: theme.spacing.unit, + float: 'right', + }, + buttonGrid: { + marginTop: -20, + }, + title: { + marginTop: 20, + }, + paperRoot: { + flexGrow: 1, + padding: 10, + marginTop: 25, + marginBottom: 25, + }, + inputField: { + width: '80%', + marginLeft: '10%', + marginTop: 25, + }, + typography: { + width: '80%', + marginLeft: '10%', + marginTop: 40, + }, + selectEmpty: { + marginTop: theme.spacing.unit * 2, + }, + bottomButton: { + padding: 15, + margin: 20, + }, +}); + +export default styles; diff --git a/src/Components/Event/Show/Tabs/Basic.js b/src/Components/Event/Show/Tabs/Basic.js new file mode 100644 index 000000000..6854ea420 --- /dev/null +++ b/src/Components/Event/Show/Tabs/Basic.js @@ -0,0 +1,111 @@ +import React from 'react'; +import { + TextField, + Button, + FormGroup, + Typography, + Grid, +} from '@material-ui/core'; +import { + ChevronLeft, + ChevronRight, +} from '@material-ui/icons'; +import { DateTimePicker } from 'material-ui-pickers'; + + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class Basic extends React.Component { + render() { + const { + classes, event, edit, create, + } = this.props; + return ( + + + These are the basic information you need to input in order to create an event. + There might be some heavy changes in the near future as the application is still at a very early stage. + + + + + edit('title', newVal.target.value)} + /> + edit('subtitle', newVal.target.value)} + /> + edit('description', newVal.target.value)} + /> + + + + + } + rightArrowIcon={} + value={event.startDatetime} + helperText='Competition start date' + onChange={newVal => edit('startDatetime', newVal)} + /> + + + } + rightArrowIcon={} + value={event.endDatetime} + helperText='Competition ending date' + onChange={newVal => edit('endDatetime', newVal)} + /> + + + + + + + + + + + ); + } +} + +export default withStyles(styles)(Basic); diff --git a/src/Components/Event/Show/Tabs/PresentationPage.js b/src/Components/Event/Show/Tabs/PresentationPage.js new file mode 100644 index 000000000..1c674ddcc --- /dev/null +++ b/src/Components/Event/Show/Tabs/PresentationPage.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class PresentationPage extends React.Component { + render() { + const { classes } = this.props; + return ( + + + PresentationPage + + + ); + } +} + +export default withStyles(styles)(PresentationPage); diff --git a/src/Components/Event/Show/Tabs/TeamsServer.js b/src/Components/Event/Show/Tabs/TeamsServer.js new file mode 100644 index 000000000..874c72d6f --- /dev/null +++ b/src/Components/Event/Show/Tabs/TeamsServer.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + + +class TeamsServer extends React.Component { + render() { + const { classes } = this.props; + return ( + + + TeamsServer + + + ); + } +} + +export default withStyles(styles)(TeamsServer); diff --git a/src/Components/Event/Show/Tabs/Technical/Formula/New.js b/src/Components/Event/Show/Tabs/Technical/Formula/New.js new file mode 100644 index 000000000..605782b2d --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Formula/New.js @@ -0,0 +1,78 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +import { Mutation } from 'react-apollo'; +import { getOptionsCalls } from '../../../../../../GraphQL/Calls/index'; + +class New extends React.Component { + constructor() { + super(); + this.state = { name: '' }; + } + + render() { + const { name } = this.state; + const { closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='createFormula-dialog-title' + > + + Create a new formula + + + + At least for now, all the formulas are publically available, creating it here will let you select it in the select element. + + + { + const { events_Formulas: formulas } = store.readQuery({ + query: getOptionsCalls.EVENTS_FORMULAS, + }); + store.writeQuery({ + query: getOptionsCalls.EVENTS_FORMULAS, + data: { events_Formulas: formulas.concat([data.events_CreateFormula]) }, + }); + closeDialogs(); + } + } + > + {createFormula => ( +
{ + e.preventDefault(); + createFormula({ + variables: { + formula: { name }, + }, + }); + }} + > + this.setState({ name: e.target.value })} + fullWidth + /> + + + )} +
+ +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Show/Tabs/Technical/Formula/index.js b/src/Components/Event/Show/Tabs/Technical/Formula/index.js new file mode 100644 index 000000000..6f7047dad --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Formula/index.js @@ -0,0 +1,5 @@ +import New from './New'; + +export { + New, +}; diff --git a/src/Components/Event/Show/Tabs/Technical/Plotter/New.js b/src/Components/Event/Show/Tabs/Technical/Plotter/New.js new file mode 100644 index 000000000..5dc2b3b06 --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Plotter/New.js @@ -0,0 +1,108 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +import { Mutation } from 'react-apollo'; +import { getOptionsCalls } from '../../../../../../GraphQL/Calls/index'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + name: '', + host: '', + repo: '', + moduleName: '', + }; + } + + render() { + const { + name, host, repo, moduleName, + } = this.state; + const { closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='createPlotter-dialog-title' + > + + Create a new plotter + + + + At least for now, all the plotters are publically available, creating it here will let you select it in the select element. + + + { + const { events_Plotters: plotters } = store.readQuery({ + query: getOptionsCalls.EVENTS_PLOTTERS, + }); + store.writeQuery({ + query: getOptionsCalls.EVENTS_PLOTTERS, + data: { events_Plotters: plotters.concat([data.events_CreatePlotter]) }, + }); + closeDialogs(); + } + } + > + {createPlotter => ( +
{ + e.preventDefault(); + createPlotter({ + variables: { + plotter: { + name, + host, + repo, + moduleName, + }, + }, + }); + }} + > + this.setState({ name: e.target.value })} + fullWidth + /> + this.setState({ host: e.target.value })} + fullWidth + /> + this.setState({ repo: e.target.value })} + fullWidth + /> + this.setState({ moduleName: e.target.value })} + fullWidth + /> + + + )} +
+ +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Show/Tabs/Technical/Plotter/index.js b/src/Components/Event/Show/Tabs/Technical/Plotter/index.js new file mode 100644 index 000000000..6f7047dad --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Plotter/index.js @@ -0,0 +1,5 @@ +import New from './New'; + +export { + New, +}; diff --git a/src/Components/Event/Show/Tabs/Technical/Prizes/List.js b/src/Components/Event/Show/Tabs/Technical/Prizes/List.js new file mode 100644 index 000000000..cc807f2c2 --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Prizes/List.js @@ -0,0 +1,72 @@ +import React from 'react'; +import { + Paper, + Grid, + Typography, +} from '@material-ui/core'; +import { + SortableContainer, + SortableElement, + SortableHandle, +} from 'react-sortable-hoc'; + +const DragHandle = SortableHandle(() =>
); + +const SortableItem = SortableElement(({ value, deletePrize, index }) => ( +
+ + + + + + + + {value.from}{value.to}{value.additional}{value.amount}{value.asset} + + + + + + deletePrize(index)} >Remove + + + +
+)); + +const SortableList = SortableContainer(({ items, deletePrize }) => ( +
+ {items.map((value, index) => ( + deletePrize(deleteId)} /> + ))} +
+)); + +class List extends React.Component { + onSortEnd = ({ oldIndex, newIndex }) => { + const newPrizes = this.props.prizes.slice(0); + newPrizes.splice(newIndex, 0, newPrizes.splice(oldIndex, 1)[0]); + this.props.edit(newPrizes); + } + + deletePrize = (deletedIndex) => { + const newPrizes = this.props.prizes.slice(0); + newPrizes.splice(deletedIndex, 1); + this.props.edit(newPrizes); + } + + render() { + return ( + + this.deletePrize(deleteId)} + /> + + ); + } +} + +export default List; diff --git a/src/Components/Event/Show/Tabs/Technical/Prizes/New.js b/src/Components/Event/Show/Tabs/Technical/Prizes/New.js new file mode 100644 index 000000000..53d702b4e --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Prizes/New.js @@ -0,0 +1,106 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + additional: '', + amount: 0, + asset: '', + }; + } + + render() { + const { + from, to, additional, amount, asset, + } = this.state; + const { addPrize, closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='addPrize-dialog-title' + > + + + Prizes are define textually only. In case of infringement, contact us. + +
{ + e.preventDefault(); + addPrize({ + from, + to, + additional, + amount, + asset, + }); + }} + > + + Conditions : + + + Examples : + If you want to make a price for the best bot only, you set both from and to rank to 1. + If you want the rest of the top 10 to get a price, you add a new price with from rank set to 2 and to rank set to 10. + Caution : + - Leaving "from rank" empty considers it to 0. + - Leaving "to rank" empty considers it as infinite + - Prizes are define in an additive manner, meaning that if a team qualifies for two prices, it gets both. + - Additional allows you to write addionnal textual condition, like "positive ROI only" for example. + + + this.setState({ from: e.target.value })} + type="number" + /> + this.setState({ to: e.target.value })} + type="number" + /> + this.setState({ additional: e.target.value })} + fullWidth + /> + + Pool : + + + Here you define the pool, the amount is a number whereas asset is a text. For example 1BTC, 200$, or whatever. + + this.setState({ amount: e.target.value })} + type="number" + /> + this.setState({ asset: e.target.value })} + /> + + + +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Show/Tabs/Technical/Prizes/index.js b/src/Components/Event/Show/Tabs/Technical/Prizes/index.js new file mode 100644 index 000000000..307bbe029 --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Prizes/index.js @@ -0,0 +1,7 @@ +import List from './List'; +import New from './New'; + +export { + List, + New, +}; diff --git a/src/Components/Event/Show/Tabs/Technical/Rules/List.js b/src/Components/Event/Show/Tabs/Technical/Rules/List.js new file mode 100644 index 000000000..e2966ae7d --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Rules/List.js @@ -0,0 +1,73 @@ +import React from 'react'; +import { + Paper, + Grid, + Typography, +} from '@material-ui/core'; +import { + SortableContainer, + SortableElement, + SortableHandle, +} from 'react-sortable-hoc'; + +const DragHandle = SortableHandle(() =>
); + +const SortableItem = SortableElement(({ value, deleteRule, index }) => ( +
+ + + + + + + + {value.title} + + + {value.description} + + + + deleteRule(index)} >Remove + + + +
+)); + +const SortableList = SortableContainer(({ items, deleteRule }) => ( +
+ {items.map((value, index) => ( + deleteRule(deleteId)} /> + ))} +
+)); + +class List extends React.Component { + onSortEnd = ({ oldIndex, newIndex }) => { + const newRules = this.props.rules.slice(0); + newRules.splice(newIndex, 0, newRules.splice(oldIndex, 1)[0]); + this.props.edit(newRules); + } + + deleteRule = (deletedIndex) => { + const newRules = this.props.rules.slice(0); + newRules.splice(deletedIndex, 1); + this.props.edit(newRules); + } + + render() { + return ( + + this.deleteRule(deleteId)} + /> + + ); + } +} + +export default List; diff --git a/src/Components/Event/Show/Tabs/Technical/Rules/New.js b/src/Components/Event/Show/Tabs/Technical/Rules/New.js new file mode 100644 index 000000000..e133c1508 --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Rules/New.js @@ -0,0 +1,68 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Button, + TextField, +} from '@material-ui/core'; + +class New extends React.Component { + constructor() { + super(); + this.state = { + title: '', + description: '', + }; + } + + render() { + const { + title, description, + } = this.state; + const { addRule, closeDialogs } = this.props; + return ( + closeDialogs()} + aria-labelledby='addRule-dialog-title' + > + + Create a new rule + + + + Rules are define textually only. In case of infringement, contact us. + +
{ + e.preventDefault(); + addRule( + title, + description, + ); + }} + > + this.setState({ title: e.target.value })} + fullWidth + /> + this.setState({ description: e.target.value })} + fullWidth + /> + + + +
+
+ ); + } +} + +export default New; diff --git a/src/Components/Event/Show/Tabs/Technical/Rules/index.js b/src/Components/Event/Show/Tabs/Technical/Rules/index.js new file mode 100644 index 000000000..307bbe029 --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/Rules/index.js @@ -0,0 +1,7 @@ +import List from './List'; +import New from './New'; + +export { + List, + New, +}; diff --git a/src/Components/Event/Show/Tabs/Technical/index.js b/src/Components/Event/Show/Tabs/Technical/index.js new file mode 100644 index 000000000..1840c37fb --- /dev/null +++ b/src/Components/Event/Show/Tabs/Technical/index.js @@ -0,0 +1,196 @@ +import React from 'react'; +import { Query } from 'react-apollo'; + +import { + Typography, + FormControl, + InputLabel, + Input, + Select, + FormHelperText, + MenuItem, + Grid, + Button, +} from '@material-ui/core'; +import { withStyles } from '@material-ui/core/styles'; +import styles from '../../styles'; + +import { getOptionsCalls } from '../../../../../GraphQL/Calls/index'; + +import { List as RulesList, New as NewRule } from './Rules'; +import { List as PrizesList, New as NewPrize } from './Prizes'; + +import { New as NewPlotter } from './Plotter'; +import { New as NewFormula } from './Formula'; + +class Technical extends React.Component { + constructor(props) { + super(props); + this.state = { + isNewFormulaOpen: false, + isNewPlotterOpen: false, + isNewRuleOpen: false, + isNewPrizeOpen: false, + }; + } + + addRule = (title, description) => { + this.props.edit('rules', [...this.props.event.rules, { + title, + description, + }]); + this.closeDialogs(); + } + + addPrize = (prize) => { + this.props.edit('prizes', [...this.props.event.prizes, prize]); + this.closeDialogs(); + } + + closeDialogs = () => { + this.setState({ + isNewFormulaOpen: false, + isNewPlotterOpen: false, + isNewRuleOpen: false, + isNewPrizeOpen: false, + }); + } + + render() { + const { + classes, event, edit, create, + } = this.props; + const { + isNewPlotterOpen, isNewFormulaOpen, isNewRuleOpen, isNewPrizeOpen, + } = this.state; + return ( + + + Select the formula and the plotter you want to use, you can also create your own with the corresponding button. + + + + Select the formula + + + {({ loading, error, data }) => { + if (loading) { + return ( + + ); + } + if (error) return `Error! ${error.message}`; + const selects = data.events_Formulas.map((formula, index) => ( + {formula.name} + )); + return ( + + + { isNewFormulaOpen ? this.closeDialogs()} /> : ''} + + ); + }} + + { this.setState({ isNewFormulaOpen: true }); }}> + To create a new formula, click here + + + + + Select the Plotter + + + {({ loading, error, data }) => { + if (loading) { + return ( + + ); + } + if (error) return `Error! ${error.message}`; + const selects = data.events_Plotters.map((plotter, index) => ( + {plotter.name} + )); + return ( + + + { isNewPlotterOpen ? this.closeDialogs()} /> : ''} + + ); + }} + + { this.setState({ isNewPlotterOpen: true }); }} > + To create a new plotter, click here + + + + + + Define the rules of your event. + + edit('rules', newVal)} /> + { isNewRuleOpen + ? this.closeDialogs()} addRule={(title, description) => this.addRule(title, description)} /> + : ''} + { this.setState({ isNewRuleOpen: true }); }} > + To add a new rule, click here + + + + + + Define the prizes of your event. + + edit('prizes', newVal)} /> + { isNewPrizeOpen + ? this.closeDialogs()} addPrize={prize => this.addPrize(prize)} /> + : ''} + { this.setState({ isNewPrizeOpen: true }); }} > + To add a new prize, click here + + + + + + + + + + ); + } +} + +export default withStyles(styles)(Technical); diff --git a/src/Components/Event/Show/Tabs/index.js b/src/Components/Event/Show/Tabs/index.js new file mode 100644 index 000000000..feecaaf55 --- /dev/null +++ b/src/Components/Event/Show/Tabs/index.js @@ -0,0 +1,11 @@ +import Basic from './Basic'; +import PresentationPage from './PresentationPage'; +import TeamsServer from './TeamsServer'; +import Technical from './Technical'; + +export { + Basic, + PresentationPage, + TeamsServer, + Technical, +}; diff --git a/src/Components/Event/Show/index.js b/src/Components/Event/Show/index.js new file mode 100644 index 000000000..b37a17302 --- /dev/null +++ b/src/Components/Event/Show/index.js @@ -0,0 +1,79 @@ +import React from 'react'; +import { Query } from 'react-apollo'; + +import { + Paper, + Typography, +} from '@material-ui/core'; +import { withStyles } from '@material-ui/core/styles'; +import styles from './styles'; + +import { toLocalTime } from '../../../utils'; + +import BannerTopBar from '../../BannerTopBar'; + +import { showEventCalls } from '../../../GraphQL/Calls/index'; + +class Show extends React.Component { + render() { + const { classes } = this.props; + return ( + + +
+ + + Event Details : + + + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + return ( + + + Title : + + + {data.events_Event.title} + + + Subtitle : + + + {data.events_Event.subtitle} + + + Dates : + + + From {toLocalTime(data.events_Event.startDatetime)} to {toLocalTime(data.events_Event.endDatetime)} + + + Formula : + + + {data.events_Event.formula.name} + + + Plotter : + + + {data.events_Event.plotter.name} + + + ); + }} + + +
+
+ ); + } +} + +export default withStyles(styles)(Show); diff --git a/src/Components/Event/Show/styles.js b/src/Components/Event/Show/styles.js new file mode 100644 index 000000000..50a3490ca --- /dev/null +++ b/src/Components/Event/Show/styles.js @@ -0,0 +1,51 @@ +const styles = theme => ({ + root: { + flexGrow: 1, + width: '100%', + backgroundColor: theme.palette.background.paper, + padding: 0, + margin: 0, + }, + tabTitle: { + width: '25%', + maxWidth: 'none', + }, + clickable: { + cursor: 'pointer', + }, + buttonList: { + margin: theme.spacing.unit, + float: 'right', + }, + buttonGrid: { + marginTop: -20, + }, + title: { + marginTop: 20, + }, + paperRoot: { + flexGrow: 1, + padding: 10, + marginTop: 25, + marginBottom: 25, + }, + inputField: { + width: '80%', + marginLeft: '10%', + marginTop: 25, + }, + typography: { + width: '80%', + marginLeft: '10%', + marginTop: 40, + }, + selectEmpty: { + marginTop: theme.spacing.unit * 2, + }, + bottomButton: { + padding: 15, + margin: 20, + }, +}); + +export default styles; diff --git a/src/Components/HostedEvents/Event.js b/src/Components/HostedEvents/Event.js new file mode 100644 index 000000000..4186326b5 --- /dev/null +++ b/src/Components/HostedEvents/Event.js @@ -0,0 +1,104 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Mutation } from 'react-apollo'; + + +import { + Grid, Paper, + Typography, + Button, +} from '@material-ui/core'; +import { withStyles } from '@material-ui/core/styles'; +import styles from './styles'; + +import { hostedEventsCalls } from '../../GraphQL/Calls/index'; + +import { toLocalTime } from '../../utils'; + +class Event extends React.Component { + render() { + const { classes, showOnly, event } = this.props; + const { + id, + title, + subtitle, + startDatetime, + endDatetime, + host, + formula, + description, + } = event; + return ( + + + + {title} + {subtitle} + From : {toLocalTime(startDatetime)} + To : {toLocalTime(endDatetime)} + + + Description : + {description} + + + + + + Hosted by: {host.alias} ({host.lastName} {host.firstName}) + + Formula: {formula.name} + + + { !showOnly + ? + { + window.location.reload(); + }} + > + {publishEvent => ( + + )} + + + + : '' + } + + + + + + + ); + } +} + +export default withStyles(styles)(Event); diff --git a/src/Components/HostedEvents/index.js b/src/Components/HostedEvents/index.js new file mode 100644 index 000000000..2e429fe30 --- /dev/null +++ b/src/Components/HostedEvents/index.js @@ -0,0 +1,82 @@ +import React from 'react'; +import { Query } from 'react-apollo'; +import { Typography } from '@material-ui/core'; +import { DateTime } from 'luxon'; + +import BannerTopBar from '../BannerTopBar'; + +import { hostedEventsCalls } from '../../GraphQL/Calls/index'; + +import Event from './Event'; + + +const HostedEvent = () => ( + + + + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + const list = data.events_Events.map((event, index) => ( + + )); + return ( +
+ Unpublished : + { list } +
+ ); + }} +
+ + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + const list = data.events_Events.map((event, index) => ( + + )); + return ( +
+ Published : + { list } +
+ ); + }} +
+ + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + const list = data.events_Events.map((event, index) => ( + + )); + return ( +
+ Old : + { list } +
+ ); + }} +
+
+); + + +export default HostedEvent; diff --git a/src/Components/HostedEvents/styles.js b/src/Components/HostedEvents/styles.js new file mode 100644 index 000000000..62239d966 --- /dev/null +++ b/src/Components/HostedEvents/styles.js @@ -0,0 +1,17 @@ +const styles = theme => ({ + card: { + flexGrow: 1, + padding: 20, + marginTop: 20, + marginBottom: 20, + }, + buttonList: { + margin: theme.spacing.unit, + float: 'right', + }, + buttonGrid: { + marginTop: -20, + }, +}); + +export default styles; diff --git a/src/Components/Search/Event.js b/src/Components/Search/Event.js new file mode 100644 index 000000000..089a06957 --- /dev/null +++ b/src/Components/Search/Event.js @@ -0,0 +1,164 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Mutation } from 'react-apollo'; + +import { + Grid, Paper, + Typography, + Button, + Select, + MenuItem, +} from '@material-ui/core'; +import { withStyles } from '@material-ui/core/styles'; +import styles from './styles'; +import { hostedEventsCalls } from '../../GraphQL/Calls/index'; + +import { toLocalTime } from '../../utils'; + +class Event extends React.Component { + constructor() { + super(); + this.state = { + keyId: '', + participantId: '', + botId: '', + }; + } + + render() { + const { keyId, participantId, botId } = this.state; + const { + classes, + event, + availableKey = [], + enrollable = false, + } = this.props; + const { + id, + title, + subtitle, + startDatetime, + endDatetime, + host, + formula, + description, + participatingAs, + canParticipateAs, + } = event; + + const fbs = []; + + canParticipateAs.forEach((team) => { + team.fb.forEach((finb) => { + fbs.push({ + value: `${team.id}|${finb.id}`, + text: `${team.name} > ${finb.name}`, + }); + }); + }); + + return ( + + + + {title} + {subtitle} + From : {toLocalTime(startDatetime)} + To : {toLocalTime(endDatetime)} + + + Description : + {description} + + + + + + Hosted by: {host.alias} ({host.lastName} {host.firstName}) + + Formula: {formula.name} + You are participating as : { participatingAs.map(team => `${team.name}, `) } + + + { enrollable && fbs.length + ? { + window.location.reload(); + }} + > + {enrollToEvent => ( + + + + + + )} + + : '' + } + + + + + + + ); + } +} + +export default withStyles(styles)(Event); diff --git a/src/Components/Search/Tabs/Future.js b/src/Components/Search/Tabs/Future.js new file mode 100644 index 000000000..90fba08a7 --- /dev/null +++ b/src/Components/Search/Tabs/Future.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + +import Event from '../Event'; + +class Future extends React.Component { + render() { + const { classes } = this.props; + const { Events, AKey } = this.props; + + const events = Events.map((event, index) => ( + + )); + return ( +
+ + Future events + + {events} +
+ ); + } +} + +export default withStyles(styles)(Future); diff --git a/src/Components/Search/Tabs/History.js b/src/Components/Search/Tabs/History.js new file mode 100644 index 000000000..10aa4f001 --- /dev/null +++ b/src/Components/Search/Tabs/History.js @@ -0,0 +1,26 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + +class History extends React.Component { + render() { + const { classes } = this.props; + return ( +
+ + Your old events (comming soon) + +
+ ); + } +} + +export default withStyles(styles)(History); diff --git a/src/Components/Search/Tabs/Ongoing.js b/src/Components/Search/Tabs/Ongoing.js new file mode 100644 index 000000000..24b392491 --- /dev/null +++ b/src/Components/Search/Tabs/Ongoing.js @@ -0,0 +1,33 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + +import Event from '../Event'; + +class Ongoing extends React.Component { + render() { + const { Events, classes } = this.props; + + const events = Events.map((event, index) => ( + + )); + return ( +
+ + Ongoing events: + + {events} +
+ ); + } +} + +export default withStyles(styles)(Ongoing); diff --git a/src/Components/Search/Tabs/Past.js b/src/Components/Search/Tabs/Past.js new file mode 100644 index 000000000..c4939b19b --- /dev/null +++ b/src/Components/Search/Tabs/Past.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from '../styles'; + +import Event from '../Event'; + +class Past extends React.Component { + render() { + const { classes } = this.props; + const { PastEvents } = this.props; + + const pastEvents = PastEvents.map((event, index) => ( + + )); + return ( +
+ + A list of passed events + + {pastEvents} +
+ ); + } +} + +export default withStyles(styles)(Past); diff --git a/src/Components/Search/Tabs/index.js b/src/Components/Search/Tabs/index.js new file mode 100644 index 000000000..c7cccd28e --- /dev/null +++ b/src/Components/Search/Tabs/index.js @@ -0,0 +1,11 @@ +import Future from './Future'; +import History from './History'; +import Ongoing from './Ongoing'; +import Past from './Past'; + +export { + Future, + History, + Ongoing, + Past, +}; diff --git a/src/Components/Search/index.js b/src/Components/Search/index.js new file mode 100644 index 000000000..e5f1d5fdd --- /dev/null +++ b/src/Components/Search/index.js @@ -0,0 +1,157 @@ +import React from 'react'; +import { Query } from 'react-apollo'; +import { DateTime } from 'luxon'; + +import { + Typography, + AppBar, + Tabs, + Tab, +} from '@material-ui/core'; +import { + GetApp as OngoingIcon, + AlarmAdd as FutureIcon, + History as HistoryIcon, +} from '@material-ui/icons'; + +import { withStyles } from '@material-ui/core/styles'; +import styles from './styles'; + +import BannerTopBar from '../BannerTopBar'; + +import { hostedEventsCalls } from '../../GraphQL/Calls/index'; + +import { + Future, + History, + Ongoing, + Past, +} from './Tabs'; + +function TabContainer(props) { + return ( + + {props.children} + + ); +} + +class Search extends React.Component { + constructor(props) { + super(props); + this.state = { + value: 0, + }; + } + + handleChange = (event, value) => { + this.setState({ value }); + } + + render() { + const { classes } = this.props; + const { value } = this.state; + const time = { now: Math.floor(DateTime.local().valueOf() / 1000) }; + return ( + + +
+ + + } + /> + } + /> + } + /> + } + /> + + + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + return ( + + {value === 0 && } + + ); + }} + + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + return ( + + {value === 1 && } + + ); + }} + + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + return ( + + {value === 2 && } + + ); + }} + + + {({ loading, error, data }) => { + if (loading) return 'Loading...'; + if (error) return `Error! ${error.message}`; + return ( + + {value === 3 && } + + ); + }} + +
+
+ ); + } +} + +export default withStyles(styles)(Search); diff --git a/src/Components/Search/styles.js b/src/Components/Search/styles.js new file mode 100644 index 000000000..6291210c8 --- /dev/null +++ b/src/Components/Search/styles.js @@ -0,0 +1,31 @@ +const styles = theme => ({ + root: { + flexGrow: 1, + width: '100%', + backgroundColor: theme.palette.background.paper, + padding: 0, + margin: 0, + }, + tabTitle: { + width: '25%', + maxWidth: 'none', + }, + card: { + flexGrow: 1, + padding: 20, + marginTop: 20, + marginBottom: 20, + }, + buttonList: { + margin: theme.spacing.unit, + float: 'right', + }, + buttonGrid: { + marginTop: -20, + }, + title: { + marginTop: 20, + }, +}); + +export default styles; diff --git a/src/GraphQL/Calls/getOptions.js b/src/GraphQL/Calls/getOptions.js new file mode 100644 index 000000000..979ab6d2b --- /dev/null +++ b/src/GraphQL/Calls/getOptions.js @@ -0,0 +1,45 @@ +import gql from 'graphql-tag'; +import { formulaInfo, plotterInfo } from '../Fragments'; + +const EVENTS_FORMULAS = gql` + query Events_Formulas{ + events_Formulas { + ...FormulaInfo + } + } + ${formulaInfo} +`; + +const EVENTS_PLOTTERS = gql` + query Events_Plotters{ + events_Plotters { + ...PlotterInfo + } + } + ${plotterInfo} +`; + +const EVENTS_CREATEFORMULA = gql` + mutation Events_CreateFormula($formula: events_FormulaInput!) { + events_CreateFormula(formula: $formula) { + ...FormulaInfo + } + } + ${formulaInfo} +`; + +const EVENTS_CREATEPLOTTER = gql` + mutation Events_CreatePlotter($plotter: events_PlotterInput!) { + events_CreatePlotter(plotter: $plotter) { + ...PlotterInfo + } + } + ${plotterInfo} +`; + +export default { + EVENTS_PLOTTERS, + EVENTS_FORMULAS, + EVENTS_CREATEFORMULA, + EVENTS_CREATEPLOTTER, +}; diff --git a/src/GraphQL/Calls/hostedEvents.js b/src/GraphQL/Calls/hostedEvents.js new file mode 100644 index 000000000..489119c7f --- /dev/null +++ b/src/GraphQL/Calls/hostedEvents.js @@ -0,0 +1,100 @@ +import gql from 'graphql-tag'; +import { eventFullInfo } from '../Fragments'; + +const EVENTS_CREATEEVENT = gql` + mutation Events_CreateEvent($event: events_EventInput!) { + events_CreateEvent(event: $event) { + ...EventFullInfo + } + } + ${eventFullInfo} +`; + +const EVENTS_EDITEVENT = gql` + mutation Events_EditEvent($eventId: ID!, $event: events_EventInput!) { + events_EditEvent(eventId: $eventId, event: $event) { + ...EventFullInfo + } + } + ${eventFullInfo} +`; + +const EVENTS_EVENTSBYHOST = gql` + query Events_Events( + $hostId: String, + $state: events_EventStateEnum, + $minStartDate: Int, + $maxStartDate: Int, + $minEndDate: Int, + $maxEndDate: Int + ){ + events_Events( + hostId: $hostId, + state: $state, + minStartDate: $minStartDate, + maxStartDate: $maxStartDate, + minEndDate: $minEndDate, + maxEndDate: $maxEndDate + ) { + ...EventFullInfo + } + } + ${eventFullInfo} +`; + +const EVENTS_EVENT_AND_AKEY = gql` + query Events_Events( + $hostId: String, + $state: events_EventStateEnum, + $minStartDate: Int, + $maxStartDate: Int, + $minEndDate: Int, + $maxEndDate: Int + ){ + events_Events( + hostId: $hostId, + state: $state, + minStartDate: $minStartDate, + maxStartDate: $maxStartDate, + minEndDate: $minEndDate, + maxEndDate: $maxEndDate + ) { + ...EventFullInfo + } + keyVault_AvailableKeys{ + id + key + } + } + ${eventFullInfo} +`; + +const EVENTS_PUBLISHEVENT = gql` + mutation Events_ChangeEventState($eventId: ID!, $state: events_EventStateEnum) { + events_ChangeEventState(eventId: $eventId, state: $state) { + ...EventFullInfo + } + } + ${eventFullInfo} +`; + +const REGISTER_EVENT = gql` + mutation Events_RegisterToEvent($eventId: ID!, $keyId: String!, $participantId: String!, $botId: String!) { + events_RegisterToEvent( + eventId: $eventId + participant: { keyId: $keyId, participantId: $participantId, botId: $botId } + ) { + ...EventFullInfo + } + } + ${eventFullInfo} +`; + +export default { + EVENTS_CREATEEVENT, + EVENTS_EDITEVENT, + EVENTS_EVENTSBYHOST, + EVENTS_EVENT_AND_AKEY, + EVENTS_PUBLISHEVENT, + REGISTER_EVENT, +}; diff --git a/src/GraphQL/Calls/index.js b/src/GraphQL/Calls/index.js new file mode 100644 index 000000000..b8225b64b --- /dev/null +++ b/src/GraphQL/Calls/index.js @@ -0,0 +1,11 @@ +import hostedEventsCalls from './hostedEvents'; +import listEventsCalls from './listEvents'; +import showEventCalls from './showEvent'; +import getOptionsCalls from './getOptions'; + +export { + hostedEventsCalls, + listEventsCalls, + showEventCalls, + getOptionsCalls, +}; diff --git a/src/GraphQL/Calls/listEvents.js b/src/GraphQL/Calls/listEvents.js new file mode 100644 index 000000000..795dd369f --- /dev/null +++ b/src/GraphQL/Calls/listEvents.js @@ -0,0 +1,15 @@ +import gql from 'graphql-tag'; +import { eventFullInfo } from '../Fragments'; + +const EVENTS_EVENTS = gql` + query Events_Events($minStartDate: Int, $maxStartDate: Int, $minEndDate: Int, $maxEndDate: Int){ + events_Events(minStartDate: $minStartDate, maxStartDate: $maxStartDate, minEndDate: $minEndDate, maxEndDate: $maxEndDate) { + ...EventFullInfo + } + } + ${eventFullInfo} +`; + +export default { + EVENTS_EVENTS, +}; diff --git a/src/GraphQL/Calls/showEvent.js b/src/GraphQL/Calls/showEvent.js new file mode 100644 index 000000000..855c9b510 --- /dev/null +++ b/src/GraphQL/Calls/showEvent.js @@ -0,0 +1,15 @@ +import gql from 'graphql-tag'; +import { eventFullInfo } from '../Fragments'; + +const EVENTS_EVENT = gql` + query Events_Event($eventId: ID!) { + events_Event(eventId: $eventId) { + ...EventFullInfo + } + } + ${eventFullInfo} +`; + +export default { + EVENTS_EVENT, +}; diff --git a/src/GraphQL/Fragments/event.js b/src/GraphQL/Fragments/event.js new file mode 100644 index 000000000..10a82f57f --- /dev/null +++ b/src/GraphQL/Fragments/event.js @@ -0,0 +1,138 @@ +import gql from 'graphql-tag'; + +export const eventMinimalInfo = gql` + fragment EventMinimalInfo on events_Event { + id + state + title + startDatetime + endDatetime + host { + alias + firstName + lastName + } + description + formula{ + name + } + plotter{ + name + } + } +`; + +export const eventFullInfo = gql` + fragment EventFullInfo on events_Event { + id + title + subtitle + hostId + host { + id + email + firstName + middleName + lastName + } + description + startDatetime + endDatetime + state + rules { + title + description + } + prizes { + condition { + from + to + additional + } + pool { + amount + asset + } + } + participants { + participantId + participant { + id + name + } + state + operationId + clone{ + botId + } + } + participatingAs{ + id + name + } + canParticipateAs{ + id + name + fb{ + id + name + } + } + invitations { + inviteeId + invitee { + id + name + } + acceptedDate + refusedDate + by { + date + inviterId + inviter { + id + email + firstName + middleName + lastName + } + } + } + presentation { + banner + profile + page + } + formula { + id + ownerId + + owner { + id + email + firstName + middleName + lastName + } + isTemplate + name + } + + plotter { + id + ownerId + owner { + id + email + firstName + middleName + lastName + } + isTemplate + name + host + repo + moduleName + } + } +`; diff --git a/src/GraphQL/Fragments/index.js b/src/GraphQL/Fragments/index.js new file mode 100644 index 000000000..a28f9ce7c --- /dev/null +++ b/src/GraphQL/Fragments/index.js @@ -0,0 +1,15 @@ +import { + eventMinimalInfo, + eventFullInfo, +} from './event'; +import { + formulaInfo, + plotterInfo, +} from './options'; + +export { + eventMinimalInfo, + eventFullInfo, + formulaInfo, + plotterInfo, +}; diff --git a/src/GraphQL/Fragments/options.js b/src/GraphQL/Fragments/options.js new file mode 100644 index 000000000..c25a82d08 --- /dev/null +++ b/src/GraphQL/Fragments/options.js @@ -0,0 +1,22 @@ +import gql from 'graphql-tag'; + +export const plotterInfo = gql` + fragment PlotterInfo on events_Plotter { + id + ownerId + isTemplate + name + host + repo + moduleName + } +`; + +export const formulaInfo = gql` + fragment FormulaInfo on events_Formula { + id + ownerId + isTemplate + name + } +`; diff --git a/src/index.js b/src/index.js new file mode 100644 index 000000000..b08dca31f --- /dev/null +++ b/src/index.js @@ -0,0 +1,29 @@ +import React from 'react'; +import { Route, Switch } from 'react-router-dom'; + +import { MuiPickersUtilsProvider } from 'material-ui-pickers'; +import LuxonUtils from 'material-ui-pickers/utils/luxon-utils'; + +import Search from './Components/Search'; +import HostedEvents from './Components/HostedEvents'; +import EditEvent from './Components/Event/Edit'; +import ShowEvent from './Components/Event/Show'; +import CreateEvent from './Components/Event/Create'; + +import './styles.scss'; + +const App = () => ( + +
+ + + + + + + +
+
+); + +export default App; diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 000000000..09aac0f1c --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,22 @@ +.eventsModule{ + .sortableListItem{ + padding-top: 15px; + margin-right: 15px; + padding-bottom: 15px; + margin-left: 15px; + border-bottom: 1px solid rgba(142, 144, 146, 0.3); + } +} + +.dragHandle{ + position: relative; + top: 1px; + display: block; + width: 18px; + height: 11px; + opacity: .25; + margin-right: 20px; + cursor: row-resize; + background: -webkit-linear-gradient(top,#000,#000 20%,#fff 0,#fff 40%,#000 0,#000 60%,#fff 0,#fff 80%,#000 0,#000); + background: linear-gradient(180deg,#000,#000 20%,#fff 0,#fff 40%,#000 0,#000 60%,#fff 0,#fff 80%,#000 0,#000); +} diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 000000000..2d2a69e07 --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,12 @@ +export const toLocalTime = (epoch) => { + const localDate = new Date(0); + localDate.setUTCSeconds(epoch); + const options = { year: 'numeric', month: 'long', day: '2-digit' }; + return ( + `${localDate.toLocaleDateString(options) + } at ${ + localDate.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })}` + ); +}; + +export const temporaryFunction = input => input; diff --git a/src/utils/local-storage.js b/src/utils/local-storage.js new file mode 100644 index 000000000..9da53f424 --- /dev/null +++ b/src/utils/local-storage.js @@ -0,0 +1,9 @@ +const getItem = async name => window.localStorage.getItem(name); +const setItem = async (name, value) => window.localStorage.setItem(name, value); +const removeItem = async name => window.localStorage.removeItem(name); + +export { + getItem, + setItem, + removeItem, +};