From 8dbf88e19e0f3667ca3db23b3b0bfa85c9040536 Mon Sep 17 00:00:00 2001
From: "nixi.sendya" <nixi.sendya@ui.ac.id>
Date: Thu, 5 Dec 2019 15:52:47 +0700
Subject: [PATCH 1/4] Update test frontend profile page and edit profile

---
 assets/js/__test__/EditProfile-test.jsx |   4 +-
 assets/js/__test__/ProfilePage-test.jsx |   4 +-
 core/migrations/0001_initial.py         |   2 +-
 package-lock.json                       | 110 ++++++++++++------------
 4 files changed, 60 insertions(+), 60 deletions(-)

diff --git a/assets/js/__test__/EditProfile-test.jsx b/assets/js/__test__/EditProfile-test.jsx
index 56e1402c..cdb2585d 100644
--- a/assets/js/__test__/EditProfile-test.jsx
+++ b/assets/js/__test__/EditProfile-test.jsx
@@ -30,8 +30,8 @@ describe('EditProfil', () => {
         const submitButton = ReactTestUtils.scryRenderedDOMComponentsWithTag(profile, 'Input')[1];
         ReactTestUtils.Simulate.click(submitButton);
 
-        const form = ReactTestUtils.findRenderedDOMComponentWithTag(profile, 'Form');
-        ReactTestUtils.Simulate.submit(form);
+        const form = ReactTestUtils.findRenderedDOMComponentWithTag(profile, 'Button');
+        ReactTestUtils.Simulate.click(form);
         fetchMock.restore();
     });
 
diff --git a/assets/js/__test__/ProfilePage-test.jsx b/assets/js/__test__/ProfilePage-test.jsx
index 618dd90a..d1374816 100755
--- a/assets/js/__test__/ProfilePage-test.jsx
+++ b/assets/js/__test__/ProfilePage-test.jsx
@@ -61,7 +61,7 @@ describe('ProfilePage', () => {
     );
     profile.getProfile().then(() => expect(profile.state.name).to.equal(response.name));
     profile.getProfile().then(() => expect(profile.state.birth_date).to.equal('24 Februari 1995'));
-    profile.updateForm(true);
+    // profile.updateForm(true);
     fetchMock.restore();
   });
 
@@ -125,7 +125,7 @@ describe('ProfilePage', () => {
     const phoneNumberNode = ReactTestUtils.scryRenderedDOMComponentsWithTag(profile, 'Input')[2];
     profile.getProfile().then(()=> expect(
       profile.state.phone_number).to.equal(phoneNumberNode.value));
-    profile.updateForm(true);
+    // profile.updateForm(true);
     fetchMock.restore();
   });
 
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
index 47979193..4c834c20 100644
--- a/core/migrations/0001_initial.py
+++ b/core/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2.8 on 2019-12-04 06:45
+# Generated by Django 2.2.8 on 2019-12-05 04:16
 
 import core.lib.validators
 import core.models.accounts
diff --git a/package-lock.json b/package-lock.json
index cbe5f517..f6f2a634 100755
--- a/package-lock.json
+++ b/package-lock.json
@@ -1750,7 +1750,7 @@
     "@babel/plugin-proposal-do-expressions": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.6.0.tgz",
-      "integrity": "sha1-GSlT/thiDRPRKmH2je/Sb0EFkZM=",
+      "integrity": "sha512-qJDaoBDbLySwU1tG0jbAomOwz8W1PEiiiK0iLQAnHLr4PYIMVX4ltDGkj3uAKx4HDs1WJ0tozGW1zAQjuTIiWg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1770,7 +1770,7 @@
     "@babel/plugin-proposal-export-default-from": {
       "version": "7.5.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz",
-      "integrity": "sha1-LArC3MNuOyRD/q0sPF/HlvsbUUU=",
+      "integrity": "sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1780,7 +1780,7 @@
     "@babel/plugin-proposal-export-namespace-from": {
       "version": "7.5.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.5.2.tgz",
-      "integrity": "sha1-zNXtBbBtcAaI/x2wGp3ScVXg0qA=",
+      "integrity": "sha512-TKUdOL07anjZEbR1iSxb5WFh810KyObdd29XLFLGo1IDsSuGrjH3ouWSbAxHNmrVKzr9X71UYl2dQ7oGGcRp0g==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1801,7 +1801,7 @@
     "@babel/plugin-proposal-json-strings": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
-      "integrity": "sha1-Vo7MRGxhSK5rJn8CVREwiR4p8xc=",
+      "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1811,7 +1811,7 @@
     "@babel/plugin-proposal-logical-assignment-operators": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.2.0.tgz",
-      "integrity": "sha1-ilzqbEKnyHRGlZ4C//X60BLFb1c=",
+      "integrity": "sha512-0w797xwdPXKk0m3Js74hDi0mCTZplIu93MOSfb1ZLd/XFe3abWypx1QknVk0J+ohnsjYpvjH4Gwfo2i3RicB6Q==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1821,7 +1821,7 @@
     "@babel/plugin-proposal-nullish-coalescing-operator": {
       "version": "7.4.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz",
-      "integrity": "sha1-QcNg1ZSB2I4M46P4N98QEhp2mzk=",
+      "integrity": "sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1831,7 +1831,7 @@
     "@babel/plugin-proposal-numeric-separator": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.2.0.tgz",
-      "integrity": "sha1-ZGhU2vTNIv1nM/YHYBOpNjEEQ6w=",
+      "integrity": "sha512-DohMOGDrZiMKS7LthjUZNNcWl8TAf5BZDwZAH4wpm55FuJTHgfqPGdibg7rZDmont/8Yg0zA03IgT6XLeP+4sg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1861,7 +1861,7 @@
     "@babel/plugin-proposal-optional-chaining": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.6.0.tgz",
-      "integrity": "sha1-6b8fm5uhDHfAMwgtp18Gg4kEGvg=",
+      "integrity": "sha512-kj4gkZ6qUggkprRq3Uh5KP8XnE1MdIO0J7MhdDX8+rAbB6dJ2UrensGIS+0NPZAaaJ1Vr0PN6oLUgXMU1uMcSg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1871,7 +1871,7 @@
     "@babel/plugin-proposal-pipeline-operator": {
       "version": "7.5.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.5.0.tgz",
-      "integrity": "sha1-QQDsVe9PakwkkLX1pPKiLfonLAY=",
+      "integrity": "sha512-HFYuu/yGnkn69ligXxU0ohOVvQDsMNOUJs/c4PYLUVS6ntCYOyGmRQQaSYJARJ9rvc7/ulZKIzxd4wk91hN63A==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1881,7 +1881,7 @@
     "@babel/plugin-proposal-throw-expressions": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.2.0.tgz",
-      "integrity": "sha1-LZ5FLTcPE5AA5R22XQqF3GDGRzk=",
+      "integrity": "sha512-adsydM8DQF4i5DLNO4ySAU5VtHTPewOtNBV3u7F4lNMPADFF9bWQ+iDtUUe8+033cYCUz+bFlQdXQJmJOwoLpw==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1928,7 +1928,7 @@
     "@babel/plugin-syntax-dynamic-import": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
-      "integrity": "sha1-acFZ/69JmBIhYa2OvF5tH1XfhhI=",
+      "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -1964,7 +1964,7 @@
     "@babel/plugin-syntax-import-meta": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.2.0.tgz",
-      "integrity": "sha1-IzPvS4dVU6O80ek/jrwJ9bkhOkA=",
+      "integrity": "sha512-Hq6kFSZD7+PHkmBN8bCpHR6J8QEoCuEV/B38AIQscYjgMZkGlXB7cHNFzP5jR4RCh5545yP1ujHdmO7hAgKtBA==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -3068,7 +3068,7 @@
     "ajv": {
       "version": "6.10.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
-      "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=",
+      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -3350,7 +3350,7 @@
     "axios": {
       "version": "0.19.0",
       "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
-      "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=",
+      "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
       "requires": {
         "follow-redirects": "1.5.10",
         "is-buffer": "^2.0.2"
@@ -3367,7 +3367,7 @@
         "follow-redirects": {
           "version": "1.5.10",
           "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
-          "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=",
+          "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
           "requires": {
             "debug": "=3.1.0"
           }
@@ -3375,7 +3375,7 @@
         "is-buffer": {
           "version": "2.0.4",
           "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
-          "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM="
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
         }
       }
     },
@@ -3429,7 +3429,7 @@
     "babel-eslint": {
       "version": "10.0.3",
       "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz",
-      "integrity": "sha1-gaLGab4PIF4ZRi/tJILTPkaHqIo=",
+      "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -3443,7 +3443,7 @@
         "resolve": {
           "version": "1.12.0",
           "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
-          "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=",
+          "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
           "dev": true,
           "requires": {
             "path-parse": "^1.0.6"
@@ -3490,7 +3490,7 @@
     "babel-loader": {
       "version": "8.0.6",
       "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
-      "integrity": "sha1-4zvbbzYrA/S7FBoMIauHxQG3Dfs=",
+      "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
       "dev": true,
       "requires": {
         "find-cache-dir": "^2.0.0",
@@ -3517,7 +3517,7 @@
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -3534,7 +3534,7 @@
         "pify": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-          "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
           "dev": true
         }
       }
@@ -4513,7 +4513,7 @@
     "compression-webpack-plugin": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-3.0.0.tgz",
-      "integrity": "sha1-CX0uTZXDoUy1yO0giZAJq1ubvKA=",
+      "integrity": "sha512-ls+oKw4eRbvaSv/hj9NmctihhBcR26j76JxV0bLRLcWhrUBdQFgd06z/Kgg7exyQvtWWP484wZxs0gIUX3NO0Q==",
       "requires": {
         "cacache": "^11.2.0",
         "find-cache-dir": "^3.0.0",
@@ -4526,7 +4526,7 @@
         "cacache": {
           "version": "11.3.3",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
-          "integrity": "sha1-i9Kd+ManGKbr0tAQ2k15cq47utw=",
+          "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
           "requires": {
             "bluebird": "^3.5.5",
             "chownr": "^1.1.1",
@@ -4547,7 +4547,7 @@
         "find-cache-dir": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz",
-          "integrity": "sha1-zUt92Xtxhbfhfb/i1uQRXuPuuPw=",
+          "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==",
           "requires": {
             "commondir": "^1.0.1",
             "make-dir": "^3.0.0",
@@ -5695,7 +5695,7 @@
         "estraverse": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-          "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+          "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
           "dev": true
         },
         "fast-levenshtein": {
@@ -5769,7 +5769,7 @@
     "eslint-config-airbnb": {
       "version": "18.0.1",
       "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz",
-      "integrity": "sha1-o6dMwptGQTtglpZQJTgd+PuQhVk=",
+      "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==",
       "dev": true,
       "requires": {
         "eslint-config-airbnb-base": "^14.0.0",
@@ -5899,7 +5899,7 @@
     "eslint-plugin-jsx-a11y": {
       "version": "6.2.3",
       "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz",
-      "integrity": "sha1-uHKgnV3lGvcKl9se6n3JMwQ3CKo=",
+      "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.4.5",
@@ -5916,7 +5916,7 @@
     "eslint-plugin-react": {
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz",
-      "integrity": "sha1-mSjk8+ISLtO6altW0DA7o+QdjAk=",
+      "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==",
       "dev": true,
       "requires": {
         "array-includes": "^3.0.3",
@@ -5933,7 +5933,7 @@
         "doctrine": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-          "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2"
@@ -5942,7 +5942,7 @@
         "resolve": {
           "version": "1.12.0",
           "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
-          "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=",
+          "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
           "dev": true,
           "requires": {
             "path-parse": "^1.0.6"
@@ -5953,7 +5953,7 @@
     "eslint-plugin-react-hooks": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
-      "integrity": "sha1-YhC21aNyBfC5KFj4laToJwIKfQQ="
+      "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA=="
     },
     "eslint-scope": {
       "version": "4.0.3",
@@ -5989,7 +5989,7 @@
     "eslint-watch": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/eslint-watch/-/eslint-watch-6.0.1.tgz",
-      "integrity": "sha1-4Jg5FlinwUjeyhcq0glQZa2gU1k=",
+      "integrity": "sha512-tWT6gQQWzGVn4KMs6ZAdG+nkNNQHg+c6wGdw/mwhp+jWyA7OWEOLxQnRhrP34ddJjpgDafhHOHBNtpVOtXXv4g==",
       "dev": true,
       "requires": {
         "chokidar": "^3.1.1",
@@ -6009,7 +6009,7 @@
         "core-js": {
           "version": "3.2.1",
           "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz",
-          "integrity": "sha1-zUHzhTTabMWffbBQ/mcwfemGiwk=",
+          "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==",
           "dev": true
         },
         "cross-spawn": {
@@ -6026,7 +6026,7 @@
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
             "ms": "^2.1.1"
@@ -6035,7 +6035,7 @@
         "execa": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
-          "integrity": "sha1-5dPs2DfSpg7FDz2nj9OXZ3R7vpk=",
+          "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
           "dev": true,
           "requires": {
             "cross-spawn": "^7.0.0",
@@ -8552,7 +8552,7 @@
     "istanbul-instrumenter-loader": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
-      "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=",
+      "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
       "dev": true,
       "requires": {
         "convert-source-map": "^1.5.0",
@@ -8603,7 +8603,7 @@
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -8918,7 +8918,7 @@
     "karma-chrome-launcher": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
-      "integrity": "sha1-gFpYZ5mk0F9OVPcqIEl58/MGZzg=",
+      "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
       "dev": true,
       "requires": {
         "which": "^1.2.1"
@@ -8938,7 +8938,7 @@
     "karma-coverage": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.1.tgz",
-      "integrity": "sha1-8CTxkfDxNd7iQDdjrDbMUqrCeaw=",
+      "integrity": "sha512-SnFkHsnLsaXfxkey51rRN9JDLAEKYW2Lb0qOEvcruukk0NkSNDkjobNDZPt9Ni3kIhLZkLtpGOz661hN7OaZvQ==",
       "dev": true,
       "requires": {
         "dateformat": "^1.0.6",
@@ -8956,13 +8956,13 @@
         "istanbul-lib-coverage": {
           "version": "2.0.5",
           "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
-          "integrity": "sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k=",
+          "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
           "dev": true
         },
         "istanbul-lib-instrument": {
           "version": "3.3.0",
           "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
-          "integrity": "sha1-pfY9kfC7wMPkee9MXeAnM17G1jA=",
+          "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
           "dev": true,
           "requires": {
             "@babel/generator": "^7.4.0",
@@ -8985,7 +8985,7 @@
     "karma-coverage-istanbul-reporter": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.0.tgz",
-      "integrity": "sha1-XxvME8XhTuHZGCHuiUaGFnT1THU=",
+      "integrity": "sha512-UH0mXPJFJyK5uiK7EkwGtQ8f30lCBAfqRResnZ4pzLJ04SOp4SPlYkmwbbZ6iVJ6sQFVzlDUXlntBEsLRdgZpg==",
       "dev": true,
       "requires": {
         "istanbul-api": "^2.1.6",
@@ -9087,7 +9087,7 @@
     "karma-webpack": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-4.0.2.tgz",
-      "integrity": "sha1-IyGb2VvdqFPjBz04dNNER8d7ztA=",
+      "integrity": "sha512-970/okAsdUOmiMOCY8sb17A2I8neS25Ad9uhyK3GHgmRSIFJbDcNEFE8dqqUhNe9OHiCC9k3DMrSmtd/0ymP1A==",
       "dev": true,
       "requires": {
         "clone-deep": "^4.0.1",
@@ -9133,7 +9133,7 @@
         "source-map": {
           "version": "0.7.3",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
           "dev": true
         }
       }
@@ -11304,7 +11304,7 @@
     "react-chartjs-2": {
       "version": "2.8.0",
       "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-2.8.0.tgz",
-      "integrity": "sha1-HCTekfs3VfjEMCZ13n1m/dozl1k=",
+      "integrity": "sha512-BPpC+qfnh37DkcXvxRwA1rdD9rX/0AQrwru4VZTLofCCuZBwRsc7PbfxjilvoB6YlHhorwZu40YDWEQkoz7xfQ==",
       "requires": {
         "lodash": "^4.17.4",
         "prop-types": "^15.5.8"
@@ -11326,7 +11326,7 @@
     "react-datepicker": {
       "version": "0.60.2",
       "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-0.60.2.tgz",
-      "integrity": "sha1-EIPcHLn/BjK8oywDmYz4PuHOLgE=",
+      "integrity": "sha512-5WNtLhozO5i6iGlcgpvjP/Wu4l7RqvTC48CEE/pS1juUny/T4juYHSv53mo+Z90qO4qfyUj59jECTT8AIwAVRQ==",
       "requires": {
         "classnames": "^2.2.5",
         "moment": "^2.17.1",
@@ -11883,7 +11883,7 @@
     "semantic-ui-react": {
       "version": "0.79.1",
       "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.79.1.tgz",
-      "integrity": "sha1-gL0Mz7OzwRhKGxs/YGerEiWu1fA=",
+      "integrity": "sha512-Z/QHE/h+l4MrZMilKe7RCBv6wPSBopcwRh5fPPZ1Cavxw4703XizJ3m+g7qcYXa5F40NnM0LKaVDuaReJ0f/3w==",
       "requires": {
         "babel-runtime": "^6.25.0",
         "classnames": "^2.2.5",
@@ -12596,7 +12596,7 @@
     "starwars": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/starwars/-/starwars-1.0.1.tgz",
-      "integrity": "sha512-d23qkhEuFNlHas4/w2J6ZF6qS7jqy8OK4N3gfQbtTk/5Lt1wKe+xv0cIweuNxwtwBGVXvmsLV2mdUOBKfj12cA=="
+      "integrity": "sha1-+OIWt4KUs/y/ytJbRPJxF543U9U="
     },
     "static-extend": {
       "version": "0.1.2",
@@ -13149,7 +13149,7 @@
     "uglifyjs-webpack-plugin": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz",
-      "integrity": "sha1-51vIDn8ZN/cllUybTFoeln6p0Nc=",
+      "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==",
       "requires": {
         "cacache": "^12.0.2",
         "find-cache-dir": "^2.1.0",
@@ -13170,7 +13170,7 @@
         "find-cache-dir": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-          "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
           "requires": {
             "commondir": "^1.0.1",
             "make-dir": "^2.0.0",
@@ -13241,12 +13241,12 @@
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
         },
         "uglify-js": {
           "version": "3.6.1",
           "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz",
-          "integrity": "sha1-rnaIxQ4b3PL3Cg4WJBAAPPl5gxE=",
+          "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==",
           "requires": {
             "commander": "2.20.0",
             "source-map": "~0.6.1"
@@ -13255,7 +13255,7 @@
         "webpack-sources": {
           "version": "1.4.3",
           "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-          "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=",
+          "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
           "requires": {
             "source-list-map": "^2.0.0",
             "source-map": "~0.6.1"
@@ -13715,7 +13715,7 @@
     "webpack-bundle-tracker": {
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/webpack-bundle-tracker/-/webpack-bundle-tracker-0.4.3.tgz",
-      "integrity": "sha1-SKPiIm3bnSTXBGQKtBaMLRIPRSY=",
+      "integrity": "sha512-Sl/+OsNhFAH3/c6XADupRu8jLvGojfXX0pZIIm3O5ZcJqkHHqlY4nLG+NVRcbDgM/jOeWimKDGQMVEa8FBeJ2g==",
       "requires": {
         "deep-extend": "^0.6.0",
         "mkdirp": "^0.5.1",
@@ -13730,7 +13730,7 @@
         "strip-ansi": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "requires": {
             "ansi-regex": "^4.1.0"
           }
-- 
GitLab


From 68e8ec2fd355977fc2f56c1925793b116f66652d Mon Sep 17 00:00:00 2001
From: "nixi.sendya" <nixi.sendya@ui.ac.id>
Date: Thu, 5 Dec 2019 16:02:09 +0700
Subject: [PATCH 2/4] Implement frontend, divide information into sections

---
 assets/js/EditProfile.jsx | 186 ++++++-----
 assets/js/ProfilePage.jsx | 661 ++++++--------------------------------
 2 files changed, 210 insertions(+), 637 deletions(-)

diff --git a/assets/js/EditProfile.jsx b/assets/js/EditProfile.jsx
index 9fc6f4c8..525deebc 100644
--- a/assets/js/EditProfile.jsx
+++ b/assets/js/EditProfile.jsx
@@ -226,6 +226,7 @@ export default class EditProfile extends React.Component {
   updateForm(show) {
     if (show) {
       return (
+        <div className="editProfile">
         <Segment className="profile-form">
           <Header as="h3" textAlign="center">
             <Icon name="edit" />
@@ -242,7 +243,6 @@ export default class EditProfile extends React.Component {
             }}
             key={this.state.refresh}
             size="small"
-            onSubmit={this.handleSubmit}
           >
             <Form.Field>
               <label htmlFor="photo">Profile Picture</label>
@@ -308,83 +308,7 @@ export default class EditProfile extends React.Component {
                 name="self_description"
               />
             </Form.Field>
-            <Form.Field>
-              <label htmlFor="linkedin_url">URL Profile LinkedIn</label>
-              <input
-                onChange={this.handleChange}
-                placeholder={
-                  this.state.linkedin_url === null
-                    ? 'https://www.linkedin.com/in/jojo/'
-                    : this.state.linkedin_url
-                }
-                defaultValue={
-                  this.state.linkedin_url === null
-                    ? null
-                    : this.state.linkedin_url
-                }
-                name="linkedin_url"
-              />
-            </Form.Field>
-            <Form.Field>
-              <label htmlFor="hackerrank_url">URL Profile Hackerrank</label>
-              <input
-                onChange={this.handleChange}
-                placeholder={
-                  this.state.hackerrank_url === null
-                    ? 'https://www.hackerrank.com/james'
-                    : this.state.hackerrank_url
-                }
-                defaultValue={
-                  this.state.hackerrank_url === null
-                    ? null
-                    : this.state.hackerrank_url
-                }
-                name="hackerrank_url"
-              />
-            </Form.Field>
-            <Form.Field>
-              <label htmlFor="portfolio_link">Portfolio Link</label>
-              <input
-                onChange={this.handleChange}
-                placeholder={
-                  this.state.portfolio_link === null
-                    ? 'https://www.example.com/myproject/'
-                    : this.state.portfolio_link
-                }
-                defaultValue={
-                  this.state.portfolio_link === null
-                    ? null
-                    : this.state.portfolio_link
-                }
-                name="portfolio_link"
-              />
-            </Form.Field>
-            <Form.Field>
-              <label htmlFor="website_url">Website URL</label>
-              <input
-                onChange={this.handleChange}
-                placeholder={
-                  this.state.website_url === null
-                    ? 'https://www.example.com/'
-                    : this.state.website_url
-                }
-                defaultValue={
-                  this.state.website_url === null
-                    ? null
-                    : this.state.website_url
-                }
-                name="website_url"
-              />
-            </Form.Field>
-            <Form.Field>
-              <label htmlFor="github_url">URL Profile Github</label>
-              <input
-                onChange={this.handleChange}
-                placeholder={this.state.github_url === null ? 'https://github.com/bob' : this.state.github_url}
-                defaultValue={this.state.github_url === null ? null : this.state.github_url}
-                name="github_url"
-              />
-            </Form.Field>
+            
             <Form.Field>
               <label htmlFor="region">Region</label>
               <input
@@ -677,18 +601,116 @@ export default class EditProfile extends React.Component {
                 name="dependants"
               />
             </Form.Field>
+          </Form>
+        </Segment>
 
-            <Button
+        <Segment className="links-form">
+          <Header as="h3" textAlign="center">
+            <Icon name="edit" />
+            <Header.Content>Edit Links</Header.Content>
+          </Header>
+          <Form
+            ref={(input) => {
+              this.form = input;
+            }}
+            key={this.state.refresh}
+            size="small"
+            onSubmit={this.handleSubmit}
+          >
+
+          <Form.Field>
+              <label htmlFor="portfolio_link">Portfolio Link</label>
+              <input
+                onChange={this.handleChange}
+                placeholder={
+                  this.state.portfolio_link === null
+                    ? 'https://www.example.com/myproject/'
+                    : this.state.portfolio_link
+                }
+                defaultValue={
+                  this.state.portfolio_link === null
+                    ? null
+                    : this.state.portfolio_link
+                }
+                name="portfolio_link"
+              />
+            </Form.Field>
+
+            <Form.Field>
+              <label htmlFor="linkedin_url">URL Profile LinkedIn</label>
+              <input
+                onChange={this.handleChange}
+                placeholder={
+                  this.state.linkedin_url === null
+                    ? 'https://www.linkedin.com/in/jojo/'
+                    : this.state.linkedin_url
+                }
+                defaultValue={
+                  this.state.linkedin_url === null
+                    ? null
+                    : this.state.linkedin_url
+                }
+                name="linkedin_url"
+              />
+            </Form.Field>
+
+            <Form.Field>
+              <label htmlFor="hackerrank_url">URL Profile Hackerrank</label>
+              <input
+                onChange={this.handleChange}
+                placeholder={
+                  this.state.hackerrank_url === null
+                    ? 'https://www.hackerrank.com/james'
+                    : this.state.hackerrank_url
+                }
+                defaultValue={
+                  this.state.hackerrank_url === null
+                    ? null
+                    : this.state.hackerrank_url
+                }
+                name="hackerrank_url"
+              />
+            </Form.Field>
+
+            <Form.Field>
+              <label htmlFor="website_url">Website URL</label>
+              <input
+                onChange={this.handleChange}
+                placeholder={
+                  this.state.website_url === null
+                    ? 'https://www.example.com/'
+                    : this.state.website_url
+                }
+                defaultValue={
+                  this.state.website_url === null
+                    ? null
+                    : this.state.website_url
+                }
+                name="website_url"
+              />
+            </Form.Field>
+
+            <Form.Field>
+              <label htmlFor="github_url">URL Profile Github</label>
+              <input
+                onChange={this.handleChange}
+                placeholder={this.state.github_url === null ? 'https://github.com/bob' : this.state.github_url}
+                defaultValue={this.state.github_url === null ? null : this.state.github_url}
+                name="github_url"
+              />
+            </Form.Field>
+            </Form>
+        </Segment>
+        <Button onClick={this.handleSubmit}
+              fluid
               type="submit"
               size="small"
               loading={this.state.loading}
               primary
-              floated="right"
             >
               Submit
             </Button>
-          </Form>
-        </Segment>
+        </div>
       );
     }
 
diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx
index db2278db..4d16e32a 100755
--- a/assets/js/ProfilePage.jsx
+++ b/assets/js/ProfilePage.jsx
@@ -317,463 +317,6 @@ export default class ProfilePage extends React.Component {
 
   gotoStudentTranscript = () => gotoLink(`transkrip/${this.state.id}`);
 
-  updateForm(show) {
-    if (show) {
-      return (
-        <Segment className="profile-form">
-          <Header as="h3" textAlign="center">
-            <Icon name="edit" />
-            <Header.Content>Edit Profile Page</Header.Content>
-          </Header>
-          <ModalAlert ref={(modal) => { this.modalAlert = modal; }} />
-          <Form.Field ref={(input) => { this.form = input; }} key={this.state.refresh} size="small" onSubmit={this.handleSubmit}>
-            <ModalAlert
-              ref={(modal) => {
-                this.modalAlert = modal;
-              }}
-            />
-            <Form
-              ref={(input) => {
-                this.form = input;
-              }}
-              key={this.state.refresh}
-              size="small"
-              onSubmit={this.handleSubmit}
-            >
-              <Form.Field>
-                <label htmlFor="photo">Profile Picture</label>
-                <input
-                  onChange={this.handleFile}
-                  placeholder="Profile Photo.jpg"
-                  name="photo"
-                  type="File"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="email">Email</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.email === null
-                      ? 'jojon@email.com'
-                      : this.state.email
-                  }
-                  defaultValue={
-                    this.state.email === null ? null : this.state.email
-                  }
-                  name="email"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="phone_number">No. Hp</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.phone_number === null
-                      ? '08123456789'
-                      : this.state.phone_number
-                  }
-                  defaultValue={
-                    this.state.phone_number === null
-                      ? null
-                      : this.state.phone_number
-                  }
-                  name="phone_number"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="gender">Jenis Kelamin</label>
-                <Form.Radio
-                  label="Perempuan"
-                  name="gender"
-                  value="Perempuan"
-                  onClick={this.handleRadioGender}
-                />
-                <Form.Radio
-                  label="Laki-laki"
-                  name="gender"
-                  value="Laki-laki"
-                  onClick={this.handleRadioGender}
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="self_description">Deskripsi Diri</label>
-                <input onChange={this.handleChange} maxLength="500" placeholder="Saya suka belajar" name="self_description" />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="linkedin_url">URL Profile LinkedIn</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.linkedin_url === null
-                      ? 'https://www.linkedin.com/in/jojo/'
-                      : this.state.linkedin_url
-                  }
-                  defaultValue={
-                    this.state.linkedin_url === null
-                      ? null
-                      : this.state.linkedin_url
-                  }
-                  name="linkedin_url"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="hackerrank_url">URL Profile Hackerrank</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.hackerrank_url === null
-                      ? 'https://www.hackerrank.com/james'
-                      : this.state.hackerrank_url
-                  }
-                  defaultValue={
-                    this.state.hackerrank_url === null
-                      ? null
-                      : this.state.hackerrank_url
-                  }
-                  name="hackerrank_url"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="portfolio_link">Portfolio Link</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={this.state.portfolio_link === null ? 'https://www.example.com/myproject/'
-                    : this.state.portfolio_link}
-                  defaultValue={this.state.portfolio_link === null ? null : this.state.portfolio_link}
-                  placeholder={
-                    this.state.portfolio_link === null
-                      ? 'https://www.example.com/myproject/'
-                      : this.state.portfolio_link
-                  }
-                  defaultValue={
-                    this.state.portfolio_link === null
-                      ? null
-                      : this.state.portfolio_link
-                  }
-                  name="portfolio_link"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="website_url">Website URL</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.website_url === null
-                      ? 'https://www.example.com/'
-                      : this.state.website_url
-                  }
-                  defaultValue={
-                    this.state.website_url === null
-                      ? null
-                      : this.state.website_url
-                  }
-                  name="website_url"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="linkedin_url">URL Profile Github</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder="https://github.com/bob"
-                  name="github_url"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="gitlab_url">URL Profile Gitlab</label>
-                <input onChange={this.handleChange} placeholder="https://gitlab.com/<username>" name="gitlab_url" />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="alamat">Alamat</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.alamat === null ? 'Indonesia' : this.state.alamat
-                  }
-                  defaultValue={
-                    this.state.alamat === null ? null : this.state.alamat
-                  }
-                  name="alamat"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="region">Region</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.region === null ? 'Indonesia' : this.state.region
-                  }
-                  defaultValue={
-                    this.state.region === null ? null : this.state.region
-                  }
-                  name="region"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="skills">Skills</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder="Isi sesuai dengan keahlian anda"
-                  name="skills"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="latest_work">Latest Working Experience</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.latest_work === null
-                      ? 'Teaching Asssistant at Fasilkom UI'
-                      : this.state.latest_work
-                  }
-                  defaultValue={
-                    this.state.latest_work === null
-                      ? null
-                      : this.state.latest_work
-                  }
-                  name="latest_work"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="latest_work_desc">
-                  Latest Working Experience Description
-                </label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.latest_work_desc === null
-                      ? 'Evaluate weekly assignment for 15 students'
-                      : this.state.latest_work_desc
-                  }
-                  defaultValue={
-                    this.state.latest_work_desc === null
-                      ? null
-                      : this.state.latest_work_desc
-                  }
-                  name="latest_work_desc"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="awards">Awards and Achievements</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.awards === null
-                      ? 'Juara 2 UIUX Gemastik 2019'
-                      : this.state.awards
-                  }
-                  defaultValue={
-                    this.state.awards === null ? null : this.state.awards
-                  }
-                  name="awards"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="projects">Projects</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.projects === null
-                      ? 'Ow-Jek - Android Mobile Project'
-                      : this.state.projects
-                  }
-                  defaultValue={
-                    this.state.projects === null ? null : this.state.projects
-                  }
-                  name="projects"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="certification">Sertifikasi</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.certification === null
-                      ? 'TOEFL'
-                      : this.state.certification
-                  }
-                  defaultValue={
-                    this.state.certification === null
-                      ? null
-                      : this.state.certification
-                  }
-                  name="certification"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="seminar">Seminar dan Training</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.seminar === null
-                      ? 'Seminar Compfest'
-                      : this.state.seminar
-                  }
-                  defaultValue={
-                    this.state.seminar === null ? null : this.state.seminar
-                  }
-                  name="seminar"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="interests">Interests</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={this.state.interests === null ? 'Machine Learning' : this.state.interests}
-                  defaultValue={this.state.interests === null ? null : this.state.interests}
-                  name="interests"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="related_course">Related Coursework Taken</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.related_course === null
-                      ? 'Interaction System, Machine Learning'
-                      : this.state.related_course
-                  }
-                  defaultValue={
-                    this.state.related_course === null ? null : this.state.related_course
-                  }
-                  name="related_course"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="resume">Resume</label>
-                <input
-                  onChange={this.handleFile}
-                  placeholder="Resume"
-                  name="resume"
-                  type="File"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="phone_number">Expected Salary</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder="2000000"
-                  name="expected_salary"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="intro">Intro</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.intro === null
-                      ? 'Ceritakan dirimu secara singkat'
-                      : this.state.intro
-                  }
-                  defaultValue={
-                    this.state.intro === null ? null : this.state.intro
-                  }
-                  name="intro"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="volunteer">Volunteering Experience</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder="Ketua Organisasi A - 2020"
-                  name="volunteer"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="intro">Status Pencarian Kerja</label>
-                <Form.Radio
-                  label="Aktif"
-                  name="job_seeking_status"
-                  value="Active"
-                  onClick={this.handleRadio}
-                />
-                <Form.Radio
-                  label="Pasif"
-                  name="job_seeking_status"
-                  value="Passive"
-                  onClick={this.handleRadio}
-                />
-              </Form.Field>
-              <Form.Field>
-                <Checkbox
-                  onChange={this.handleCheckbox}
-                  checked={!!this.state.show_transcript}
-                  label="Ijinkan perusahaan tempat saya mendaftar untuk melihat transkrip akademik saya"
-                  name="show_transcript"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="student_gpa">GPA</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.student_gpa === null
-                      ? '3.50'
-                      : this.state.student_gpa
-                  }
-                  defaultValue={
-                    this.state.student_gpa === null
-                      ? null
-                      : this.state.student_gpa
-                  }
-                  name="student_gpa"
-                />
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="student_toefl">TOEFL</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.student_toefl === null
-                      ? '400'
-                      : this.state.student_toefl
-                  }
-                  defaultValue={
-                    this.state.student_toefl === null
-                      ? null
-                      : this.state.student_toefl
-                  }
-                  name="student_toefl"
-                />
-                <input
-                  onChange={this.handleFile}
-                  placeholder="Student Toefl"
-                  name="student_toefl_file"
-                  type="File"
-                /> 
-              </Form.Field>
-              <Form.Field>
-                <label htmlFor="dependants">Dependants</label>
-                <input
-                  onChange={this.handleChange}
-                  placeholder={
-                    this.state.dependants === null ? '0' : this.state.dependants
-                  }
-                  defaultValue={
-                    this.state.dependants === null ? null : this.state.dependants
-                  }
-                  name="dependants"
-                />
-              </Form.Field>
-
-              <Button
-                type="submit"
-                size="small"
-                loading={this.state.loading}
-                primary
-                floated="right"
-              >
-                Submit
-              </Button>
-            </Form>
-          </Form.Field>
-        </Segment>
-      );
-    }
-
-    return <div />;
-  }
-
   render() {
     const sertifikat_exists = this.state.sertifikat;
     let sertifikat_state;
@@ -852,21 +395,6 @@ export default class ProfilePage extends React.Component {
                     </Grid>
                   </Segment>
 
-                  <Segment basic vertical>
-                    <Grid>
-                      <Grid.Column width={2}>
-                        <Icon name="linkify" size="big" />
-                      </Grid.Column>
-                      <Grid.Column width={13}>
-                        <a href={this.state.portfolio_link}>
-                          {' '}
-                          {this.state.portfolio_link || 'Portofolio belum ditambahkan'}
-                          {' '}
-                        </a>
-                      </Grid.Column>
-                    </Grid>
-                  </Segment>
-
                   <Segment basic vertical>
                     <Grid>
                       <Grid.Column width={2}>
@@ -913,36 +441,6 @@ export default class ProfilePage extends React.Component {
                     </Grid>
                   </Segment>
 
-                  <Segment basic vertical>
-                    <Grid>
-                      <Grid.Column width={2}>
-                        <Icon name="linkedin" size="big" />
-                      </Grid.Column>
-                      <Grid.Column width={13}>
-                        <a href={this.state.linkedin_url}>
-                          {' '}
-                          {this.state.linkedin_url || 'N/A'}
-                          {' '}
-                        </a>
-                      </Grid.Column>
-                    </Grid>
-                  </Segment>
-
-                  <Segment basic vertical>
-                    <Grid>
-                      <Grid.Column width={2}>
-                        <Icon name="hackerrank" size="big" />
-                      </Grid.Column>
-                      <Grid.Column width={13}>
-                        <a href={this.state.hackerrank_url}>
-                          {' '}
-                          {this.state.hackerrank_url || 'N/A'}
-                          {' '}
-                        </a>
-                      </Grid.Column>
-                    </Grid>
-                  </Segment>
-
                   <Segment basic vertical>
                     <Grid>
                       <Grid.Column width={2}>
@@ -987,59 +485,6 @@ export default class ProfilePage extends React.Component {
                       </Grid.Column>
                     </Grid>
                   </Segment>
-
-                  <Segment basic vertical>
-                    <Grid>
-                      <Grid.Column width={2}>
-                        <Icon name="globe" size="big" />
-                      </Grid.Column>
-                      <Grid.Column width={13}>
-                        <a href={this.state.website_url}>
-                          {' '}
-                          {this.state.website_url || 'N/A'}
-                          {' '}
-                        </a>
-                      </Grid.Column>
-                    </Grid>
-                  </Segment>
-                  <Segment basic vertical>
-                    <Grid>
-                      <Grid.Column width={2}>
-                        <Icon name="github" size="big" />
-                      </Grid.Column>
-                      <Grid.Column width={13}>
-                        {this.state.github_url ? (
-                          <a href={this.state.github_url}>
-                            {' '}
-                            {this.state.github_url}
-                            {' '}
-                          </a>
-                        ) : (
-                          <p> N/A </p>
-                        )}
-                      </Grid.Column>
-                    </Grid>
-                  </Segment>
-                  <Segment basic vertical>
-                    <Grid>
-                      <Grid.Column width={2}>
-                        <Icon name="gitlab" size="big" />
-                      </Grid.Column>
-                      <Grid.Column width={13}>
-                        {
-                          this.state.gitlab_url
-                            ? (
-                              <a href={this.state.gitlab_url}>
-                                {' '}
-                                { this.state.gitlab_url }
-                                {' '}
-                              </a>
-                            )
-                            : <p> N/A </p>
-                        }
-                      </Grid.Column>
-                    </Grid>
-                  </Segment>
                 </div>
 
                 <Segment basic vertical>
@@ -1406,6 +851,112 @@ export default class ProfilePage extends React.Component {
           </div>
         </Segment>
 
+        <Segment className="links-form">
+          <h3>Links</h3>
+          <Grid stackable>
+            <Grid.Column width={6}>
+            <Segment basic vertical>
+                    <Grid>
+                      <Grid.Column width={2}>
+                        <Icon name="linkify" size="big" />
+                      </Grid.Column>
+                      <Grid.Column width={13}>
+                        <a href={this.state.portfolio_link}>
+                          {' '}
+                          {this.state.portfolio_link || 'Portofolio belum ditambahkan'}
+                          {' '}
+                        </a>
+                      </Grid.Column>
+                    </Grid>
+          </Segment>
+
+          <Segment basic vertical>
+                    <Grid>
+                      <Grid.Column width={2}>
+                        <Icon name="linkedin" size="big" />
+                      </Grid.Column>
+                      <Grid.Column width={13}>
+                        <a href={this.state.linkedin_url}>
+                          {' '}
+                          {this.state.linkedin_url || 'N/A'}
+                          {' '}
+                        </a>
+                      </Grid.Column>
+                    </Grid>
+                  </Segment>
+
+        <Segment basic vertical>
+                    <Grid>
+                      <Grid.Column width={2}>
+                        <Icon name="hackerrank" size="big" />
+                      </Grid.Column>
+                      <Grid.Column width={13}>
+                        <a href={this.state.hackerrank_url}>
+                          {' '}
+                          {this.state.hackerrank_url || 'N/A'}
+                          {' '}
+                        </a>
+                      </Grid.Column>
+                    </Grid>
+        </Segment>
+
+        <Segment basic vertical>
+                    <Grid>
+                      <Grid.Column width={2}>
+                        <Icon name="globe" size="big" />
+                      </Grid.Column>
+                      <Grid.Column width={13}>
+                        <a href={this.state.website_url}>
+                          {' '}
+                          {this.state.website_url || 'N/A'}
+                          {' '}
+                        </a>
+                      </Grid.Column>
+                    </Grid>
+                  </Segment>
+
+                  <Segment basic vertical>
+                    <Grid>
+                      <Grid.Column width={2}>
+                        <Icon name="github" size="big" />
+                      </Grid.Column>
+                      <Grid.Column width={13}>
+                        {this.state.github_url ? (
+                          <a href={this.state.github_url}>
+                            {' '}
+                            {this.state.github_url}
+                            {' '}
+                          </a>
+                        ) : (
+                          <p> N/A </p>
+                        )}
+                      </Grid.Column>
+                    </Grid>
+                  </Segment>
+                  <Segment basic vertical>
+                    <Grid>
+                      <Grid.Column width={2}>
+                        <Icon name="gitlab" size="big" />
+                      </Grid.Column>
+                      <Grid.Column width={13}>
+                        {
+                          this.state.gitlab_url
+                            ? (
+                              <a href={this.state.gitlab_url}>
+                                {' '}
+                                { this.state.gitlab_url }
+                                {' '}
+                              </a>
+                            )
+                            : <p> N/A </p>
+                        }
+                      </Grid.Column>
+                    </Grid>
+                  </Segment>
+            </Grid.Column>
+          </Grid>
+        </Segment>
+
         {/* { this.updateForm(this.props.route.own) } */}
       </div>
     );
-- 
GitLab


From 10be6afacae0f8685572070898d85685f263fb83 Mon Sep 17 00:00:00 2001
From: "nixi.sendya" <nixi.sendya@ui.ac.id>
Date: Thu, 5 Dec 2019 17:00:01 +0700
Subject: [PATCH 3/4] removed unused import

---
 assets/js/ProfilePage.jsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx
index 4d16e32a..ca793aec 100755
--- a/assets/js/ProfilePage.jsx
+++ b/assets/js/ProfilePage.jsx
@@ -5,7 +5,6 @@ import {
   Image,
   Header,
   Icon,
-  Checkbox,
   Container,
   Button,
   Form,
-- 
GitLab


From 8689a2b2cf2d11a6287b8a822b430a29b8b45a82 Mon Sep 17 00:00:00 2001
From: "nixi.sendya" <nixi.sendya@ui.ac.id>
Date: Thu, 5 Dec 2019 17:07:58 +0700
Subject: [PATCH 4/4] Added back lost function from merge in EditProfile

---
 assets/js/EditProfile.jsx | 71 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 69 insertions(+), 2 deletions(-)

diff --git a/assets/js/EditProfile.jsx b/assets/js/EditProfile.jsx
index dadbd4d2..525deebc 100644
--- a/assets/js/EditProfile.jsx
+++ b/assets/js/EditProfile.jsx
@@ -11,9 +11,10 @@ import {
 import Server from './lib/Server';
 import Storage from './lib/Storage';
 import ModalAlert from './components/ModalAlert';
-import ProfileHandler from './ProfileHandler';
+import Dumper from './lib/Dumper';
+import { isFromGithubLinkValid } from './Utils';
 
-export default class EditProfile extends ProfileHandler {
+export default class EditProfile extends React.Component {
   static propTypes = {
     route: PropTypes.object.isRequired,
     params: PropTypes.object.isRequired,
@@ -156,6 +157,72 @@ export default class EditProfile extends ProfileHandler {
     return dateIndexArray.reverse().join(' ');
   }
 
+  handleSubmit = (e) => {
+    e.preventDefault();
+    if (!isFromGithubLinkValid(this.state.form.github_url)) {
+      this.modalAlert.open(
+        'Pembaharuan profil gagal',
+        'Pastikan link github yang anda tulis benar.(Berpola : https://github.com/<username>',
+      );
+    } else {
+      const submitForm = {};
+      Object.keys(this.state.form).forEach((key) => {
+        if (this.state.form[key] !== '') {
+          submitForm[key] = this.state.form[key];
+        }
+      });
+      this.setState({ loading: true });
+      Server.submit(
+        `/students/${this.state.id}/profile/`,
+        submitForm,
+        'PATCH',
+      ).then(
+        () => {
+          this.setState({ loading: false });
+          this.modalAlert.open(
+            'Profil berhasil diperbaharui',
+            'Silakan periksa kembali profil anda',
+            this.getProfile,
+          );
+        },
+        (error) => error.then((r) => {
+          this.setState({ loading: false });
+          this.modalAlert.open('Pembaharuan profil gagal', Dumper.dump(r));
+        }),
+      );
+    }
+  };
+
+  handleFile = (e) => {
+    const { form } = this.state;
+    form[e.target.name] = e.target.files[0];
+    this.setState({ form });
+  };
+
+  handleChange = (e) => {
+    const { form } = this.state;
+    form[e.target.name] = e.target.value;
+    this.setState({ form });
+  };
+
+  handleCheckbox = (e, d) => {
+    const { form } = this.state;
+    form[d.name] = d.checked;
+    this.setState({ form, show_transcript: d.checked });
+  };
+
+  handleRadioGender = (e, { value }) => {
+    const { form } = this.state;
+    form.gender = value;
+    this.setState({ form });
+  };
+
+  handleRadio = (e, { value }) => {
+    const { form } = this.state;
+    form.job_seeking_status = value;
+    this.setState({ form });
+  };
+
   updateForm(show) {
     if (show) {
       return (
-- 
GitLab