From 38b8cf84d362bb4283dbb871a48100c671b94fe1 Mon Sep 17 00:00:00 2001 From: Abbas Yadollahi Date: Wed, 11 Jul 2018 21:29:09 -0400 Subject: [PATCH 01/34] Major documents/code refactor + Linting setup --- .gitignore | 7 +- Documents/Deliverables/Deliverable1.pdf | Bin Documents/Deliverables/Deliverable2.pdf | Bin Documents/Deliverables/Deliverable3.pdf | Bin Documents/Deliverables/Deliverable4.pdf | Bin .../Meeting 1.docx => Meetings/Meeting1.docx} | Bin .../Meeting 2.docx => Meetings/Meeting2.docx} | Bin .../Meeting 3.docx => Meetings/Meeting3.docx} | Bin .../Meeting 4.docx => Meetings/Meeting4.docx} | Bin .../Meeting 5.docx => Meetings/Meeting5.docx} | Bin .../Meeting 6.docx => Meetings/Meeting6.docx} | Bin .../Meeting 7.docx => Meetings/Meeting7.docx} | Bin .../Meeting 8.docx => Meetings/Meeting8.docx} | Bin .../WorkPlanW1.docx} | Bin .../WorkPlanW10.docx} | Bin .../WorkPlanW2.docx} | Bin .../WorkPlanW3.docx} | Bin .../WorkPlanW4.docx} | Bin .../WorkPlanW5.docx} | Bin .../WorkPlanW6.docx} | Bin .../WorkPlanW7.docx} | Bin .../WorkPlanW8.docx} | Bin .../WorkPlanW9.docx} | Bin Images/{APK.PNG => Android/APK.png} | Bin Images/{ => Android}/ChangePass.png | Bin Images/{ => Android}/CreateSpecies.png | Bin Images/{ => Android}/FirstScreen.png | Bin Images/{ => Android}/PlantTree.png | Bin Images/{ => Android}/SignUpResident.png | Bin Images/{ => Android}/SignUpScientist.png | Bin Images/{ => Android}/UpdateTree.png | Bin Images/{ => Android}/ViewTree.png | Bin Images/CoverageReport.png | Bin Images/M1.PNG | Bin Images/M2.PNG | Bin Images/M3.PNG | Bin Images/M4.PNG | Bin Images/M5.PNG | Bin Images/{treeple_logo.png => TreepleLogo.png} | Bin Images/WP1.PNG | Bin Images/WP2.PNG | Bin Images/WP3.PNG | Bin Images/WP4.PNG | Bin Images/WP5.PNG | Bin .../{AttributesWeb.PNG => Web/Attributes.png} | Bin .../FirstScreen.png} | Bin Images/{ForecastWeb.PNG => Web/Forecast.png} | Bin .../HoverWindow.png} | Bin .../MunicipalityView.png} | Bin .../{CreateTreeWeb.PNG => Web/PlantTree.png} | Bin Images/{ => Web}/SSL.png | Bin Images/{SignInWeb.PNG => Web/SignIn.png} | Bin Images/{RegisterWeb.PNG => Web/SignUp.png} | Bin .../{UpdateTreeWeb.PNG => Web/UpdateTree.png} | Bin Images/{ViewTreeWeb.PNG => Web/ViewTree.png} | Bin TreePLE-Web/.babelrc | 3 + TreePLE-Web/.eslintrc | 170 ++++++++++++++++++ TreePLE-Web/.eslintrc.json | 35 ---- TreePLE-Web/.gitignore | 3 + TreePLE-Web/deployment/build.sh | 2 +- TreePLE-Web/deployment/deploy.sh | 1 - TreePLE-Web/index.html | 2 +- TreePLE-Web/package.json | 7 +- .../src/components/CreateForecastModal.jsx | 62 +++---- .../src/components/CreateTreeModal.jsx | 70 ++++---- TreePLE-Web/src/components/HelpModal.jsx | 8 +- TreePLE-Web/src/components/IconMenu.jsx | 20 +-- .../src/components/MunicipalityModal.jsx | 44 +++-- .../src/components/MyForecastsModal.jsx | 32 ++-- TreePLE-Web/src/components/NavigationBar.jsx | 14 +- TreePLE-Web/src/components/Requests.jsx | 30 ++-- TreePLE-Web/src/components/SignInModal.jsx | 4 +- TreePLE-Web/src/components/SignUpModal.jsx | 10 +- TreePLE-Web/src/components/TreeMap.jsx | 104 ++++++----- TreePLE-Web/src/components/TreeModal.jsx | 50 +++--- TreePLE-Web/src/components/Utils.jsx | 71 ++------ TreePLE-Web/src/constants.jsx | 2 +- TreePLE-Web/src/index.jsx | 2 +- TreePLE-Web/webpack/webpack.dev.config.js | 4 +- TreePLE-Web/webpack/webpack.prod.config.js | 6 +- 80 files changed, 426 insertions(+), 337 deletions(-) mode change 100644 => 100755 Documents/Deliverables/Deliverable1.pdf mode change 100644 => 100755 Documents/Deliverables/Deliverable2.pdf mode change 100644 => 100755 Documents/Deliverables/Deliverable3.pdf mode change 100644 => 100755 Documents/Deliverables/Deliverable4.pdf rename Documents/{Meetings Log/Meeting 1.docx => Meetings/Meeting1.docx} (100%) rename Documents/{Meetings Log/Meeting 2.docx => Meetings/Meeting2.docx} (100%) rename Documents/{Meetings Log/Meeting 3.docx => Meetings/Meeting3.docx} (100%) rename Documents/{Meetings Log/Meeting 4.docx => Meetings/Meeting4.docx} (100%) rename Documents/{Meetings Log/Meeting 5.docx => Meetings/Meeting5.docx} (100%) rename Documents/{Meetings Log/Meeting 6.docx => Meetings/Meeting6.docx} (100%) rename Documents/{Meetings Log/Meeting 7.docx => Meetings/Meeting7.docx} (100%) mode change 100644 => 100755 rename Documents/{Meetings Log/Meeting 8.docx => Meetings/Meeting8.docx} (100%) mode change 100644 => 100755 rename Documents/{Work Plan/Work Plan Week 1.docx => WorkPlans/WorkPlanW1.docx} (100%) rename Documents/{Work Plan/Work Plan Week 10.docx => WorkPlans/WorkPlanW10.docx} (100%) mode change 100644 => 100755 rename Documents/{Work Plan/Work Plan Week 2.docx => WorkPlans/WorkPlanW2.docx} (100%) rename Documents/{Work Plan/Work Plan Week 3.docx => WorkPlans/WorkPlanW3.docx} (100%) rename Documents/{Work Plan/Work Plan Week 4.docx => WorkPlans/WorkPlanW4.docx} (100%) rename Documents/{Work Plan/Work Plan Week 5.docx => WorkPlans/WorkPlanW5.docx} (100%) rename Documents/{Work Plan/Work Plan Week 6.docx => WorkPlans/WorkPlanW6.docx} (100%) rename Documents/{Work Plan/Work Plan Week 7.docx => WorkPlans/WorkPlanW7.docx} (100%) mode change 100644 => 100755 rename Documents/{Work Plan/Work Plan Week 8.docx => WorkPlans/WorkPlanW8.docx} (100%) mode change 100644 => 100755 rename Documents/{Work Plan/Work Plan Week 9.docx => WorkPlans/WorkPlanW9.docx} (100%) mode change 100644 => 100755 rename Images/{APK.PNG => Android/APK.png} (100%) mode change 100644 => 100755 rename Images/{ => Android}/ChangePass.png (100%) mode change 100644 => 100755 rename Images/{ => Android}/CreateSpecies.png (100%) mode change 100644 => 100755 rename Images/{ => Android}/FirstScreen.png (100%) mode change 100644 => 100755 rename Images/{ => Android}/PlantTree.png (100%) mode change 100644 => 100755 rename Images/{ => Android}/SignUpResident.png (100%) mode change 100644 => 100755 rename Images/{ => Android}/SignUpScientist.png (100%) mode change 100644 => 100755 rename Images/{ => Android}/UpdateTree.png (100%) mode change 100644 => 100755 rename Images/{ => Android}/ViewTree.png (100%) mode change 100644 => 100755 mode change 100644 => 100755 Images/CoverageReport.png mode change 100644 => 100755 Images/M1.PNG mode change 100644 => 100755 Images/M2.PNG mode change 100644 => 100755 Images/M3.PNG mode change 100644 => 100755 Images/M4.PNG mode change 100644 => 100755 Images/M5.PNG rename Images/{treeple_logo.png => TreepleLogo.png} (100%) mode change 100644 => 100755 mode change 100644 => 100755 Images/WP1.PNG mode change 100644 => 100755 Images/WP2.PNG mode change 100644 => 100755 Images/WP3.PNG mode change 100644 => 100755 Images/WP4.PNG mode change 100644 => 100755 Images/WP5.PNG rename Images/{AttributesWeb.PNG => Web/Attributes.png} (100%) mode change 100644 => 100755 rename Images/{FirstScreenWeb.PNG => Web/FirstScreen.png} (100%) mode change 100644 => 100755 rename Images/{ForecastWeb.PNG => Web/Forecast.png} (100%) mode change 100644 => 100755 rename Images/{HoverWindowWeb.PNG => Web/HoverWindow.png} (100%) mode change 100644 => 100755 rename Images/{MunicipalityView.PNG => Web/MunicipalityView.png} (100%) mode change 100644 => 100755 rename Images/{CreateTreeWeb.PNG => Web/PlantTree.png} (100%) mode change 100644 => 100755 rename Images/{ => Web}/SSL.png (100%) mode change 100644 => 100755 rename Images/{SignInWeb.PNG => Web/SignIn.png} (100%) mode change 100644 => 100755 rename Images/{RegisterWeb.PNG => Web/SignUp.png} (100%) mode change 100644 => 100755 rename Images/{UpdateTreeWeb.PNG => Web/UpdateTree.png} (100%) mode change 100644 => 100755 rename Images/{ViewTreeWeb.PNG => Web/ViewTree.png} (100%) mode change 100644 => 100755 create mode 100644 TreePLE-Web/.babelrc create mode 100644 TreePLE-Web/.eslintrc delete mode 100644 TreePLE-Web/.eslintrc.json diff --git a/.gitignore b/.gitignore index c75a949..d8e44ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,10 @@ -# Compiled class file +# Mac OS files +*.DS_Store + +# Compiled class files *.class -# Log file +# Log files *.log # Virtual machine crash logs diff --git a/Documents/Deliverables/Deliverable1.pdf b/Documents/Deliverables/Deliverable1.pdf old mode 100644 new mode 100755 diff --git a/Documents/Deliverables/Deliverable2.pdf b/Documents/Deliverables/Deliverable2.pdf old mode 100644 new mode 100755 diff --git a/Documents/Deliverables/Deliverable3.pdf b/Documents/Deliverables/Deliverable3.pdf old mode 100644 new mode 100755 diff --git a/Documents/Deliverables/Deliverable4.pdf b/Documents/Deliverables/Deliverable4.pdf old mode 100644 new mode 100755 diff --git a/Documents/Meetings Log/Meeting 1.docx b/Documents/Meetings/Meeting1.docx similarity index 100% rename from Documents/Meetings Log/Meeting 1.docx rename to Documents/Meetings/Meeting1.docx diff --git a/Documents/Meetings Log/Meeting 2.docx b/Documents/Meetings/Meeting2.docx similarity index 100% rename from Documents/Meetings Log/Meeting 2.docx rename to Documents/Meetings/Meeting2.docx diff --git a/Documents/Meetings Log/Meeting 3.docx b/Documents/Meetings/Meeting3.docx similarity index 100% rename from Documents/Meetings Log/Meeting 3.docx rename to Documents/Meetings/Meeting3.docx diff --git a/Documents/Meetings Log/Meeting 4.docx b/Documents/Meetings/Meeting4.docx similarity index 100% rename from Documents/Meetings Log/Meeting 4.docx rename to Documents/Meetings/Meeting4.docx diff --git a/Documents/Meetings Log/Meeting 5.docx b/Documents/Meetings/Meeting5.docx similarity index 100% rename from Documents/Meetings Log/Meeting 5.docx rename to Documents/Meetings/Meeting5.docx diff --git a/Documents/Meetings Log/Meeting 6.docx b/Documents/Meetings/Meeting6.docx similarity index 100% rename from Documents/Meetings Log/Meeting 6.docx rename to Documents/Meetings/Meeting6.docx diff --git a/Documents/Meetings Log/Meeting 7.docx b/Documents/Meetings/Meeting7.docx old mode 100644 new mode 100755 similarity index 100% rename from Documents/Meetings Log/Meeting 7.docx rename to Documents/Meetings/Meeting7.docx diff --git a/Documents/Meetings Log/Meeting 8.docx b/Documents/Meetings/Meeting8.docx old mode 100644 new mode 100755 similarity index 100% rename from Documents/Meetings Log/Meeting 8.docx rename to Documents/Meetings/Meeting8.docx diff --git a/Documents/Work Plan/Work Plan Week 1.docx b/Documents/WorkPlans/WorkPlanW1.docx similarity index 100% rename from Documents/Work Plan/Work Plan Week 1.docx rename to Documents/WorkPlans/WorkPlanW1.docx diff --git a/Documents/Work Plan/Work Plan Week 10.docx b/Documents/WorkPlans/WorkPlanW10.docx old mode 100644 new mode 100755 similarity index 100% rename from Documents/Work Plan/Work Plan Week 10.docx rename to Documents/WorkPlans/WorkPlanW10.docx diff --git a/Documents/Work Plan/Work Plan Week 2.docx b/Documents/WorkPlans/WorkPlanW2.docx similarity index 100% rename from Documents/Work Plan/Work Plan Week 2.docx rename to Documents/WorkPlans/WorkPlanW2.docx diff --git a/Documents/Work Plan/Work Plan Week 3.docx b/Documents/WorkPlans/WorkPlanW3.docx similarity index 100% rename from Documents/Work Plan/Work Plan Week 3.docx rename to Documents/WorkPlans/WorkPlanW3.docx diff --git a/Documents/Work Plan/Work Plan Week 4.docx b/Documents/WorkPlans/WorkPlanW4.docx similarity index 100% rename from Documents/Work Plan/Work Plan Week 4.docx rename to Documents/WorkPlans/WorkPlanW4.docx diff --git a/Documents/Work Plan/Work Plan Week 5.docx b/Documents/WorkPlans/WorkPlanW5.docx similarity index 100% rename from Documents/Work Plan/Work Plan Week 5.docx rename to Documents/WorkPlans/WorkPlanW5.docx diff --git a/Documents/Work Plan/Work Plan Week 6.docx b/Documents/WorkPlans/WorkPlanW6.docx similarity index 100% rename from Documents/Work Plan/Work Plan Week 6.docx rename to Documents/WorkPlans/WorkPlanW6.docx diff --git a/Documents/Work Plan/Work Plan Week 7.docx b/Documents/WorkPlans/WorkPlanW7.docx old mode 100644 new mode 100755 similarity index 100% rename from Documents/Work Plan/Work Plan Week 7.docx rename to Documents/WorkPlans/WorkPlanW7.docx diff --git a/Documents/Work Plan/Work Plan Week 8.docx b/Documents/WorkPlans/WorkPlanW8.docx old mode 100644 new mode 100755 similarity index 100% rename from Documents/Work Plan/Work Plan Week 8.docx rename to Documents/WorkPlans/WorkPlanW8.docx diff --git a/Documents/Work Plan/Work Plan Week 9.docx b/Documents/WorkPlans/WorkPlanW9.docx old mode 100644 new mode 100755 similarity index 100% rename from Documents/Work Plan/Work Plan Week 9.docx rename to Documents/WorkPlans/WorkPlanW9.docx diff --git a/Images/APK.PNG b/Images/Android/APK.png old mode 100644 new mode 100755 similarity index 100% rename from Images/APK.PNG rename to Images/Android/APK.png diff --git a/Images/ChangePass.png b/Images/Android/ChangePass.png old mode 100644 new mode 100755 similarity index 100% rename from Images/ChangePass.png rename to Images/Android/ChangePass.png diff --git a/Images/CreateSpecies.png b/Images/Android/CreateSpecies.png old mode 100644 new mode 100755 similarity index 100% rename from Images/CreateSpecies.png rename to Images/Android/CreateSpecies.png diff --git a/Images/FirstScreen.png b/Images/Android/FirstScreen.png old mode 100644 new mode 100755 similarity index 100% rename from Images/FirstScreen.png rename to Images/Android/FirstScreen.png diff --git a/Images/PlantTree.png b/Images/Android/PlantTree.png old mode 100644 new mode 100755 similarity index 100% rename from Images/PlantTree.png rename to Images/Android/PlantTree.png diff --git a/Images/SignUpResident.png b/Images/Android/SignUpResident.png old mode 100644 new mode 100755 similarity index 100% rename from Images/SignUpResident.png rename to Images/Android/SignUpResident.png diff --git a/Images/SignUpScientist.png b/Images/Android/SignUpScientist.png old mode 100644 new mode 100755 similarity index 100% rename from Images/SignUpScientist.png rename to Images/Android/SignUpScientist.png diff --git a/Images/UpdateTree.png b/Images/Android/UpdateTree.png old mode 100644 new mode 100755 similarity index 100% rename from Images/UpdateTree.png rename to Images/Android/UpdateTree.png diff --git a/Images/ViewTree.png b/Images/Android/ViewTree.png old mode 100644 new mode 100755 similarity index 100% rename from Images/ViewTree.png rename to Images/Android/ViewTree.png diff --git a/Images/CoverageReport.png b/Images/CoverageReport.png old mode 100644 new mode 100755 diff --git a/Images/M1.PNG b/Images/M1.PNG old mode 100644 new mode 100755 diff --git a/Images/M2.PNG b/Images/M2.PNG old mode 100644 new mode 100755 diff --git a/Images/M3.PNG b/Images/M3.PNG old mode 100644 new mode 100755 diff --git a/Images/M4.PNG b/Images/M4.PNG old mode 100644 new mode 100755 diff --git a/Images/M5.PNG b/Images/M5.PNG old mode 100644 new mode 100755 diff --git a/Images/treeple_logo.png b/Images/TreepleLogo.png old mode 100644 new mode 100755 similarity index 100% rename from Images/treeple_logo.png rename to Images/TreepleLogo.png diff --git a/Images/WP1.PNG b/Images/WP1.PNG old mode 100644 new mode 100755 diff --git a/Images/WP2.PNG b/Images/WP2.PNG old mode 100644 new mode 100755 diff --git a/Images/WP3.PNG b/Images/WP3.PNG old mode 100644 new mode 100755 diff --git a/Images/WP4.PNG b/Images/WP4.PNG old mode 100644 new mode 100755 diff --git a/Images/WP5.PNG b/Images/WP5.PNG old mode 100644 new mode 100755 diff --git a/Images/AttributesWeb.PNG b/Images/Web/Attributes.png old mode 100644 new mode 100755 similarity index 100% rename from Images/AttributesWeb.PNG rename to Images/Web/Attributes.png diff --git a/Images/FirstScreenWeb.PNG b/Images/Web/FirstScreen.png old mode 100644 new mode 100755 similarity index 100% rename from Images/FirstScreenWeb.PNG rename to Images/Web/FirstScreen.png diff --git a/Images/ForecastWeb.PNG b/Images/Web/Forecast.png old mode 100644 new mode 100755 similarity index 100% rename from Images/ForecastWeb.PNG rename to Images/Web/Forecast.png diff --git a/Images/HoverWindowWeb.PNG b/Images/Web/HoverWindow.png old mode 100644 new mode 100755 similarity index 100% rename from Images/HoverWindowWeb.PNG rename to Images/Web/HoverWindow.png diff --git a/Images/MunicipalityView.PNG b/Images/Web/MunicipalityView.png old mode 100644 new mode 100755 similarity index 100% rename from Images/MunicipalityView.PNG rename to Images/Web/MunicipalityView.png diff --git a/Images/CreateTreeWeb.PNG b/Images/Web/PlantTree.png old mode 100644 new mode 100755 similarity index 100% rename from Images/CreateTreeWeb.PNG rename to Images/Web/PlantTree.png diff --git a/Images/SSL.png b/Images/Web/SSL.png old mode 100644 new mode 100755 similarity index 100% rename from Images/SSL.png rename to Images/Web/SSL.png diff --git a/Images/SignInWeb.PNG b/Images/Web/SignIn.png old mode 100644 new mode 100755 similarity index 100% rename from Images/SignInWeb.PNG rename to Images/Web/SignIn.png diff --git a/Images/RegisterWeb.PNG b/Images/Web/SignUp.png old mode 100644 new mode 100755 similarity index 100% rename from Images/RegisterWeb.PNG rename to Images/Web/SignUp.png diff --git a/Images/UpdateTreeWeb.PNG b/Images/Web/UpdateTree.png old mode 100644 new mode 100755 similarity index 100% rename from Images/UpdateTreeWeb.PNG rename to Images/Web/UpdateTree.png diff --git a/Images/ViewTreeWeb.PNG b/Images/Web/ViewTree.png old mode 100644 new mode 100755 similarity index 100% rename from Images/ViewTreeWeb.PNG rename to Images/Web/ViewTree.png diff --git a/TreePLE-Web/.babelrc b/TreePLE-Web/.babelrc new file mode 100644 index 0000000..69f50d5 --- /dev/null +++ b/TreePLE-Web/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["env"] +} \ No newline at end of file diff --git a/TreePLE-Web/.eslintrc b/TreePLE-Web/.eslintrc new file mode 100644 index 0000000..11ea232 --- /dev/null +++ b/TreePLE-Web/.eslintrc @@ -0,0 +1,170 @@ +{ + // https://eslint.org/docs/user-guide/configuring#specifying-parser-options + "parser": "babel-eslint", + + // "parser": "esprima", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true, + } + }, + + // https://eslint.org/docs/user-guide/configuring#specifying-environments + "env": { + "browser": false, // browser global variables + "node": false, // Node.js global variables and Node.js scoping + "commonjs": false, // CommonJS global variables and CommonJS scoping (use this for browser-only code that uses Browserify/WebPack) + "shared-node-browser": false, // Globals common to both Node and Browser + "es6": true, // enable all ECMAScript 6 features except for modules (this automatically sets the ecmaVersion parser option to 6) + "jquery": false, // jQuery globals + }, + + // https://eslint.org/docs/user-guide/configuring#configuring-plugins + "plugins": [ + "react" + ], + + // https://eslint.org/docs/user-guide/configuring#configuring-rules + // https://eslint.org/docs/rules/ + "rules": { + + ////////// Possible Errors ////////// + + "no-console": 1, // disallow the use of console + "no-constant-condition": 1, // disallow constant expressions in conditions + "no-debugger": 1, // disallow the use of debugger + "no-dupe-args": 1, // disallow duplicate arguments in function definitions + "no-dupe-keys": 1, // disallow duplicate keys in object literals + "no-duplicate-case": 1, // disallow duplicate case labels + "no-empty": 1, // disallow empty block statements + "no-extra-boolean-cast": 1, // disallow unnecessary boolean casts + "no-extra-parens": [1, // disallow unnecessary parentheses + "all", { + "returnAssign": false, + "nestedBinaryExpressions": false, + "ignoreJSX": "all", + "enforceForArrowConditionals": false + } + ], + "no-func-assign": 1, // disallow reassigning function declarations + "no-inner-declarations": 1, // disallow variable or function declarations in nested blocks + "no-irregular-whitespace": 1, // disallow irregular whitespace outside of strings and comments + "no-obj-calls": 1, // disallow calling global object properties as functions + "no-sparse-arrays": 1, // disallow sparse arrays + "no-template-curly-in-string": 1, // disallow template literal placeholder syntax in regular strings + "no-unreachable": 1, // disallow unreachable code after return, throw, continue, and break statements + "no-unsafe-negation": 1, // disallow negating the left operand of relational operators + "use-isnan": 1, // require calls to isNaN() when checking for NaN + "valid-jsdoc": 0, // enforce valid JSDoc comments + "valid-typeof": 1, // enforce comparing typeof expressions against valid strings + + ////////// Best Practices ////////// + + "array-callback-return": 1, // enforce return statements in callbacks of array methods + "curly": 0, // enforce consistent brace style for all control statements + "dot-notation": 1, // enforce dot notation whenever possible + "eqeqeq": 1, // require the use of === and !== + "no-empty-pattern": 1, // disallow empty destructuring patterns + "no-fallthrough": 1, // disallow fallthrough of case statements + "no-floating-decimal": 1, // disallow leading or trailing decimal points in numeric literals + "no-lone-blocks": 1, // disallow unnecessary nested blocks + "no-multi-spaces": [1, { // disallow multiple spaces + "ignoreEOLComments": true + }], + "no-multi-str": 1, // disallow multiline strings + "no-octal": 1, // disallow octal literals + "no-redeclare": 1, // disallow variable redeclaration + "no-self-assign": 1, // disallow assignments where both sides are exactly the same + "no-self-compare": 1, // disallow comparisons where both sides are exactly the same + "no-useless-concat": 1, // disallow unnecessary concatenation of literals or template literals + "no-useless-escape": 1, // disallow unnecessary escape characters + "no-useless-return": 0, // disallow redundant return statements + + ////////// Variables ////////// + + "no-shadow": 1, // disallow variable declarations from shadowing variables declared in the outer scope + "no-undef-init": 1, // disallow initializing variables to undefined + "no-unused-vars": 1, // disallow unused variables + + ////////// Node.js and CommonJS ////////// + + "global-require": 1, // require require() calls to be placed at top-level module scope + + ////////// Stylistic Issues ////////// + + "array-bracket-newline": [1, // enforce linebreaks after opening and before closing array brackets + "consistent" + ], + "array-bracket-spacing": 1, // enforce consistent spacing inside array brackets + "brace-style": [1, // enforce consistent brace style for blocks + "1tbs", {"allowSingleLine": true} + ], + "camelcase": 1, // enforce camelcase naming convention + "capitalized-comments": 1, // enforce or disallow capitalization of the first letter of a comment + "comma-dangle": 1, // require or disallow trailing commas + "comma-spacing": 1, // enforce consistent spacing before and after commas + "comma-style": 1, // enforce consistent comma style + "computed-property-spacing": 1, // enforce consistent spacing inside computed property brackets + "eol-last": 1, // require or disallow newline at the end of files + "func-call-spacing": 1, // require or disallow spacing between function identifiers and their invocations + "func-style": 0, // enforce the consistent use of either function declarations or expressions + "indent": [1, // enforce consistent indentation + 2, {"SwitchCase": 1} + ], + "jsx-quotes": [1, // enforce the consistent use of either double or single quotes in JSX attributes + "prefer-single" + ], + "key-spacing": 1, // enforce consistent spacing between keys and values in object literal properties + "keyword-spacing": 1, // enforce consistent spacing before and after keywords + "linebreak-style": 1, // enforce consistent linebreak style + "new-cap": 1, // require constructor names to begin with a capital letter + "new-parens": 1, // require parentheses when invoking a constructor with no arguments + "no-lonely-if": 1, // disallow if statements as the only statement in else blocks + "no-mixed-operators": 0, // disallow mixed binary operators + "no-mixed-spaces-and-tabs": 1, // disallow mixed spaces and tabs for indentation + "no-multiple-empty-lines": [1, // disallow multiple empty lines + {"max": 3, "maxEOF": 1} + ], + "no-trailing-spaces": 1, // disallow trailing whitespace at the end of lines + "no-unneeded-ternary": 1, // disallow ternary operators when simpler alternatives exist + "no-whitespace-before-property": 1, // disallow whitespace before properties + "object-curly-newline": 1, // enforce consistent line breaks inside braces + "object-curly-spacing": 1, // enforce consistent spacing inside braces + "padded-blocks": [1, // require or disallow padding within blocks + "never" + ], + "quotes": [1, // enforce the consistent use of either backticks, double, or single quotes + "single" + ], + "require-jsdoc": 0, // require JSDoc comments + "semi": 1, // require or disallow semicolons instead of ASI + "space-before-blocks": 1, // enforce consistent spacing before blocks + "space-before-function-paren": [1, // enforce consistent spacing before function definition opening parenthesis + "never" + ], + "space-in-parens": 1, // enforce consistent spacing inside parentheses + "space-infix-ops": 0, // require spacing around infix operators + "space-unary-ops": 1, // enforce consistent spacing before or after unary operators + "spaced-comment": 1, // enforce consistent spacing after the // or /* in a comment + + ////////// ECMAScript 6 ////////// + + "arrow-body-style": 1, // require braces around arrow function bodies + "arrow-parens": 1, // require parentheses around arrow function arguments + "arrow-spacing": 1, // enforce consistent spacing before and after the arrow in arrow functions + "constructor-super": 1, // require super() calls in constructors + "no-const-assign": 1, // disallow reassigning const variables + "no-dupe-class-members": 1, // disallow duplicate class members + "no-duplicate-imports": 1, // disallow duplicate module imports + "no-var": 1, // require let or const instead of var + "rest-spread-spacing": 1, // enforce spacing between rest and spread operators and their expressions + "template-curly-spacing": 1, // require or disallow spacing around embedded expressions of template strings + + ////////// React ////////// + + "react/jsx-uses-react": 1, // prevent React to be incorrectly marked as unused + "react/jsx-uses-vars": 1, // prevent variables used in JSX to be incorrectly marked as unused + } +} diff --git a/TreePLE-Web/.eslintrc.json b/TreePLE-Web/.eslintrc.json deleted file mode 100644 index b4a12db..0000000 --- a/TreePLE-Web/.eslintrc.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaFeatures": { - "experimentalObjectRestSpread": true, - "jsx": true - }, - "sourceType": "module" - }, - "plugins": [ - "react" - ], - "rules": { - "indent": [ - "error", - 2 - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "single" - ], - "semi": [ - "error", - "always" - ] - } -} diff --git a/TreePLE-Web/.gitignore b/TreePLE-Web/.gitignore index d6d5931..ea939cd 100644 --- a/TreePLE-Web/.gitignore +++ b/TreePLE-Web/.gitignore @@ -1,3 +1,6 @@ +# Mac OS files +*.DS_Store + # Logs logs *.log diff --git a/TreePLE-Web/deployment/build.sh b/TreePLE-Web/deployment/build.sh index 3baa61d..5d457ce 100644 --- a/TreePLE-Web/deployment/build.sh +++ b/TreePLE-Web/deployment/build.sh @@ -12,4 +12,4 @@ exitStatus $? echo "npm run --prefix $1/TreePLE-Web build" npm run --prefix $1/TreePLE-Web build -exitStatus $? \ No newline at end of file +exitStatus $? diff --git a/TreePLE-Web/deployment/deploy.sh b/TreePLE-Web/deployment/deploy.sh index 23a8a7b..68e0a2a 100644 --- a/TreePLE-Web/deployment/deploy.sh +++ b/TreePLE-Web/deployment/deploy.sh @@ -25,4 +25,3 @@ exitStatus $? echo "systemctl start httpd" systemctl start httpd exitStatus $? - diff --git a/TreePLE-Web/index.html b/TreePLE-Web/index.html index 9a5074a..1b0141b 100644 --- a/TreePLE-Web/index.html +++ b/TreePLE-Web/index.html @@ -9,4 +9,4 @@
- \ No newline at end of file + diff --git a/TreePLE-Web/package.json b/TreePLE-Web/package.json index d070bc1..a9f5bcc 100644 --- a/TreePLE-Web/package.json +++ b/TreePLE-Web/package.json @@ -4,7 +4,7 @@ "description": "Webpage for TreePLE application", "main": "index.jsx", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "test": "echo \"Error: no test specified\"", "dev": "./node_modules/.bin/webpack-dev-server --config ./webpack/webpack.dev.config.js", "prod": "./node_modules/.bin/webpack-dev-server --config ./webpack/webpack.prod.config.js", "build": "./node_modules/.bin/webpack --config ./webpack/webpack.prod.config.js", @@ -36,6 +36,7 @@ "@types/react": "^16.3.8", "ajv": "^6.2.1", "axios": "^0.18.0", + "lodash": "^4.17.10", "react": "^15.6.2", "react-day-picker": "^7.1.6", "react-dom": "^15.6.2", @@ -50,13 +51,13 @@ "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-es2015": "^6.24.1", + "babel-preset-env": "^1.7.0", "babel-preset-react": "^6.24.1", "babel-preset-stage-0": "^6.24.1", "babel-register": "^6.26.0", "compression-webpack-plugin": "^1.1.11", "css-loader": "^0.28.10", - "eslint": "^4.19.1", + "eslint": "^5.1.0", "eslint-plugin-react": "^7.7.0", "extract-text-webpack-plugin": "^3.0.2", "file-loader": "^1.1.11", diff --git a/TreePLE-Web/src/components/CreateForecastModal.jsx b/TreePLE-Web/src/components/CreateForecastModal.jsx index d2b47ee..19f437b 100644 --- a/TreePLE-Web/src/components/CreateForecastModal.jsx +++ b/TreePLE-Web/src/components/CreateForecastModal.jsx @@ -5,9 +5,9 @@ import {Button, Divider, Dropdown, Form, Grid, Header, Icon, List, Message, Moda import {GoogleMap, InfoWindow, Marker, withScriptjs, withGoogleMap} from 'react-google-maps'; import {DrawingManager} from 'react-google-maps/lib/components/drawing/DrawingManager'; import DayPickerInput from 'react-day-picker/DayPickerInput'; -import {getAllTrees, getAllSpecies, getAllMunicipalities, getUserTrees, createForecast} from "./Requests"; +import {getAllTrees, getAllSpecies, getAllMunicipalities, getUserTrees, createForecast} from './Requests'; import {getLatLng, getError, getSelectable, getTreeMarker, getTreeAge, formatDate} from './Utils'; -import {gmapsKey, mtlCenter, huDates, flags, landSelectable, statusSelectable, ownershipSelectable} from '../constants'; +import {gmapsKey, mtlCenter, huDates, flags, landSelectable, statusSelectable} from '../constants'; class CreateForecastModal extends PureComponent { @@ -80,12 +80,12 @@ class CreateForecastModal extends PureComponent { }; createForecast(fcParams) - .then(({data}) => { + .then(() => { this.props.onForecast(); }) .catch(({response: {data}}) => { this.setState({error: data.message}); - }) + }); } onRemoveTree = (treeIdx) => { @@ -103,7 +103,7 @@ class CreateForecastModal extends PureComponent { } onTreeRightClick = (tree) => { - const hover = tree == null ? null : tree.treeId == this.state.hover ? null : tree.treeId; + const hover = tree === null ? null : tree.treeId === this.state.hover ? null : tree.treeId; this.setState({hover: hover}); } @@ -115,14 +115,10 @@ class CreateForecastModal extends PureComponent { if (fcTrees.includes(treeId)) { return; - } else { - if ('latLngs' in area) { - if (google.maps.geometry.poly.containsLocation(latLng, area)) { - fcTrees.push(treeId); - } - } else if (area.getBounds().contains(latLng)) { - fcTrees.push(treeId) - } + } else if ('latLngs' in area && google.maps.geometry.poly.containsLocation(latLng, area)) { + fcTrees.push(treeId); + } else if ('getBounds' in area && area.getBounds().contains(latLng)) { + fcTrees.push(treeId); } }); area.setMap(null); @@ -135,8 +131,8 @@ class CreateForecastModal extends PureComponent { onMaxHeightFilter = (e, {value}) => this.onFilterChange({...this.state.filters, height: {...this.state.filters.height, max: value}}); onMinDiameterFilter = (e, {value}) => this.onFilterChange({...this.state.filters, diameter: {...this.state.filters.diameter, min: value}}); onMaxDiameterFilter = (e, {value}) => this.onFilterChange({...this.state.filters, diameter: {...this.state.filters.diameter, max: value}}); - onMinDateFilter = (day, {selected}) => this.onFilterChange({...this.state.filters, date: {...this.state.filters.date, min: day}}); - onMaxDateFilter = (day, {selected}) => this.onFilterChange({...this.state.filters, date: {...this.state.filters.date, max: day}}); + onMinDateFilter = (day) => this.onFilterChange({...this.state.filters, date: {...this.state.filters.date, min: day}}); + onMaxDateFilter = (day) => this.onFilterChange({...this.state.filters, date: {...this.state.filters.date, max: day}}); onSpeciesFilter = (e, {value}) => this.onFilterChange({...this.state.filters, species: value}); onMunicipalityFilter = (e, {value}) => this.onFilterChange({...this.state.filters, municipality: value}); onStatusFilter = (e, {value}) => this.onFilterChange({...this.state.filters, status: value}); @@ -147,7 +143,7 @@ class CreateForecastModal extends PureComponent { let filteredTrees = []; let trees = filters.myTrees ? this.state.myTrees : this.state.allTrees; - trees.forEach(tree => { + trees.forEach((tree) => { if ((!filters.age.min || getTreeAge(tree) > filters.age.min) && (!filters.age.max || getTreeAge(tree) < filters.age.max) && (!filters.height.min || tree.height > filters.height.min) && @@ -156,10 +152,10 @@ class CreateForecastModal extends PureComponent { (!filters.diameter.max || tree.diameter < filters.diameter.max) && (!filters.date.min || new Date(tree.datePlanted) > filters.date.min) && (!filters.date.max || new Date(tree.datePlanted) < filters.date.max) && - (!filters.species || tree.species.name == filters.species) && - (!filters.municipality || tree.municipality.name == filters.municipality) && - (!filters.status || tree.status == filters.status) && - (!filters.land || tree.land == filters.land)) { + (!filters.species || tree.species.name === filters.species) && + (!filters.municipality || tree.municipality.name === filters.municipality) && + (!filters.status || tree.status === filters.status) && + (!filters.land || tree.land === filters.land)) { filteredTrees.push(tree); } }); @@ -171,7 +167,7 @@ class CreateForecastModal extends PureComponent { } onResetFilter = () => { - this.setState(prevState => ({ + this.setState((prevState) => ({ mapTrees: prevState.allTrees, filters: { age: {min: '', max: ''}, @@ -188,10 +184,10 @@ class CreateForecastModal extends PureComponent { })); } - onDateChange = (day, {selected}) => this.setState({fcDate: day}); + onDateChange = (day) => this.setState({fcDate: day}); onFlagChange = (e, {value}) => this.setState({language: value}); - onShowTrees = () => this.setState(prevState => ({showTrees: !prevState.showTrees})); - onShowFilters = () => this.setState(prevState => ({showFilters: !prevState.showFilters})); + onShowTrees = () => this.setState((prevState) => ({showTrees: !prevState.showTrees})); + onShowFilters = () => this.setState((prevState) => ({showFilters: !prevState.showFilters})); render() { const {mapTrees, fcTrees, filters} = this.state; @@ -201,9 +197,9 @@ class CreateForecastModal extends PureComponent { const dayPickerProps = { locale: this.state.language, - weekdaysShort: this.state.language == 'hu' ? huDates.weekShort : undefined, - weekdaysLong: this.state.language == 'hu' ? huDates.weekLong : undefined, - months: this.state.language == 'hu' ? huDates.months : undefined + weekdaysShort: this.state.language === 'hu' ? huDates.weekShort : undefined, + weekdaysLong: this.state.language === 'hu' ? huDates.weekLong : undefined, + months: this.state.language === 'hu' ? huDates.months : undefined }; return ( @@ -235,7 +231,7 @@ class CreateForecastModal extends PureComponent { {this.state.showTrees ? ( - {treeIter.map(i => ( + {treeIter.map((i) => ( - + @@ -153,31 +153,29 @@ const GMap = compose( googleMapURL: `https://maps.googleapis.com/maps/api/js?key=${gmapsKey}&v=3.exp&libraries=geometry,drawing,places`, loadingElement:
, containerElement:
, - mapElement:
, + mapElement:
}), withScriptjs, withGoogleMap -)(({location, onDrag, onDragEnd}) => { - return ( - - - - ); -}); +)(({location, onDrag, onDragEnd}) => ( + + + +)); CreateTreeModal.propTypes = { location: PropTypes.object.isRequired, onClose: PropTypes.func.isRequired -} +}; -export default CreateTreeModal; \ No newline at end of file +export default CreateTreeModal; diff --git a/TreePLE-Web/src/components/HelpModal.jsx b/TreePLE-Web/src/components/HelpModal.jsx index dd1bff9..dcc4375 100644 --- a/TreePLE-Web/src/components/HelpModal.jsx +++ b/TreePLE-Web/src/components/HelpModal.jsx @@ -1,6 +1,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; -import {Button, Divider, Grid, Header, Icon, Message, Modal, Statistic, Container} from 'semantic-ui-react'; +import {Button, Divider, Grid, Header, Icon, Modal} from 'semantic-ui-react'; import {iconDef, colorDef} from '../constants'; class HelpModal extends PureComponent { @@ -43,7 +43,7 @@ class HelpModal extends PureComponent { - {iconIter.map(i => ( + {iconIter.map((i) => ( @@ -78,7 +78,7 @@ class HelpModal extends PureComponent { - {colorIter.map(i => ( + {colorIter.map((i) => ( {colorDef[2*i].color.toUpperCase()} @@ -112,6 +112,6 @@ class HelpModal extends PureComponent { HelpModal.propTypes = { onClose: PropTypes.func.isRequired -} +}; export default HelpModal; diff --git a/TreePLE-Web/src/components/IconMenu.jsx b/TreePLE-Web/src/components/IconMenu.jsx index 78c9751..2770afc 100644 --- a/TreePLE-Web/src/components/IconMenu.jsx +++ b/TreePLE-Web/src/components/IconMenu.jsx @@ -28,15 +28,15 @@ class IconMenu extends PureComponent { } } - toggleSignIn = () => this.setState(prevState => ({showSignIn: !prevState.showSignIn, user: localStorage.getItem('username')})); - toggleSignUp = () => this.setState(prevState => ({showSignUp: !prevState.showSignUp, user: localStorage.getItem('username')})); - toggleRegister = () => this.setState(prevState => ({showSignIn: !prevState.showSignIn, showSignUp: !prevState.showSignUp})); + toggleSignIn = () => this.setState((prevState) => ({showSignIn: !prevState.showSignIn, user: localStorage.getItem('username')})); + toggleSignUp = () => this.setState((prevState) => ({showSignUp: !prevState.showSignUp, user: localStorage.getItem('username')})); + toggleRegister = () => this.setState((prevState) => ({showSignIn: !prevState.showSignIn, showSignUp: !prevState.showSignUp})); - toggleMyForecasts = () => this.setState(prevState => ({showMyForecasts: !prevState.showMyForecasts})); - toggleCreateForecast = () => this.setState(prevState => ({showCreateForecast: !prevState.showCreateForecast})); - toggleForecast = () => this.setState(prevState => ({showMyForecasts: !prevState.showMyForecasts, showCreateForecast: !prevState.showCreateForecast})); + toggleMyForecasts = () => this.setState((prevState) => ({showMyForecasts: !prevState.showMyForecasts})); + toggleCreateForecast = () => this.setState((prevState) => ({showCreateForecast: !prevState.showCreateForecast})); + toggleForecast = () => this.setState((prevState) => ({showMyForecasts: !prevState.showMyForecasts, showCreateForecast: !prevState.showCreateForecast})); - toggleHelp = () => this.setState(prevState => ({showHelp: !prevState.showHelp})); + toggleHelp = () => this.setState((prevState) => ({showHelp: !prevState.showHelp})); onLogOut = () => { localStorage.clear(); @@ -104,13 +104,13 @@ class IconMenu extends PureComponent { ) : null}
- ) + ); } } IconMenu.propTypes = { show: PropTypes.bool.isRequired, onSustainabilityChange: PropTypes.func.isRequired -} +}; -export default IconMenu; \ No newline at end of file +export default IconMenu; diff --git a/TreePLE-Web/src/components/MunicipalityModal.jsx b/TreePLE-Web/src/components/MunicipalityModal.jsx index d84d574..39750c7 100644 --- a/TreePLE-Web/src/components/MunicipalityModal.jsx +++ b/TreePLE-Web/src/components/MunicipalityModal.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import {compose, withProps} from 'recompose'; import {GoogleMap, Polygon, withScriptjs, withGoogleMap} from 'react-google-maps'; import {Button, Divider, Header, Icon, Grid, Modal} from 'semantic-ui-react'; -import {getLatLngBorders, getMapBounds} from './Utils'; +import {getMapBounds} from './Utils'; import {gmapsKey} from '../constants'; class MunicipalityModal extends PureComponent { @@ -14,17 +14,17 @@ class MunicipalityModal extends PureComponent { update: false, showBorders: true, error: '' - } + }; } - onToggleEdit = () => this.setState(prevState => ({update: !prevState.update})); + onToggleEdit = () => this.setState((prevState) => ({update: !prevState.update})); onShowBorders = () => { - this.setState({showBorders: !this.state.showBorders}) + this.setState({showBorders: !this.state.showBorders}); } onUpdateMunicipality = () => { - this.setState({update: !this.state.update}) + this.setState({update: !this.state.update}); } onGMapLoaded = () => { @@ -80,15 +80,13 @@ class MunicipalityModal extends PureComponent { - {municipality.borders.map(({id, lat, lng}) => { - return ( - - {id} - {lat} - {lng} - - ); - })} + {municipality.borders.map(({id, lat, lng}) => ( + + {id} + {lat} + {lng} + + ))}
) : null} @@ -128,21 +126,19 @@ const GMap = compose( googleMapURL: `https://maps.googleapis.com/maps/api/js?key=${gmapsKey}&v=3.exp&libraries=geometry,drawing,places`, loadingElement:
, containerElement:
, - mapElement:
, + mapElement:
}), withScriptjs, withGoogleMap -)(({municipality}) => { - return ( - - - - ); -}); +)(({municipality}) => ( + + + +)); MunicipalityModal.propTypes = { municipality: PropTypes.object.isRequired, onClose: PropTypes.func.isRequired -} +}; -export default MunicipalityModal; \ No newline at end of file +export default MunicipalityModal; diff --git a/TreePLE-Web/src/components/MyForecastsModal.jsx b/TreePLE-Web/src/components/MyForecastsModal.jsx index 08c89d5..3c77b65 100644 --- a/TreePLE-Web/src/components/MyForecastsModal.jsx +++ b/TreePLE-Web/src/components/MyForecastsModal.jsx @@ -1,7 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {Button, Divider, Grid, Header, Icon, Message, Modal} from 'semantic-ui-react'; -import {getUserForecasts, deleteForecast} from "./Requests"; +import {getUserForecasts, deleteForecast} from './Requests'; class MyForecastsModal extends PureComponent { constructor(props) { @@ -24,7 +24,7 @@ class MyForecastsModal extends PureComponent { }); }) .catch(({response: {data}}) => { - this.setState({error: data.message}) + this.setState({error: data.message}); }); } @@ -38,19 +38,19 @@ class MyForecastsModal extends PureComponent { }; deleteForecast(fcParams) - .then(({data}) => { + .then(() => { let forecasts = this.state.forecasts.slice(); forecasts.some(({forecastId}, idx) => { - if (fcId == forecastId) { + if (forecastId === fcId) { forecasts.splice(idx, 1); this.setState({forecasts: forecasts}); return true; } - }) + }); }) .catch(({response: {data}}) => { - this.setState({error: data.message}) + this.setState({error: data.message}); }); } @@ -108,16 +108,14 @@ class MyForecastsModal extends PureComponent { ))} + ) : this.state.error ? ( + + {this.state.error} + ) : ( - this.state.error ? ( - - {this.state.error} - - ) : ( - - Looks like you haven't created any forecasts yet! - - ) + + Looks like you haven't created any forecasts yet! + )}