From 90f0bf9641fa219d70e329f5684d991e43e359ce Mon Sep 17 00:00:00 2001
From: Bagas <priambudibagaskara@gmail.com>
Date: Mon, 2 Dec 2019 20:38:22 +0700
Subject: [PATCH 1/5] add Utils.js and refactor few line of codes on Profile &
 EditProfile

---
 assets/js/EditProfile.jsx | 21 ++-------------------
 assets/js/ProfilePage.jsx | 19 ++++---------------
 assets/js/Utils.js        |  6 ++++++
 3 files changed, 12 insertions(+), 34 deletions(-)
 create mode 100644 assets/js/Utils.js

diff --git a/assets/js/EditProfile.jsx b/assets/js/EditProfile.jsx
index 289ecdaa..33c349bc 100644
--- a/assets/js/EditProfile.jsx
+++ b/assets/js/EditProfile.jsx
@@ -13,6 +13,7 @@ import Server from './lib/Server';
 import Storage from './lib/Storage';
 import ModalAlert from './components/ModalAlert';
 import Dumper from './lib/Dumper';
+import { isFromGithubLinkValid, gotoLink } from './Utils';
 
 export default class EditProfile extends React.Component {
   static propTypes = {
@@ -97,9 +98,6 @@ export default class EditProfile extends React.Component {
     this.handleCheckbox = this.handleCheckbox.bind(this);
     this.handleSubmit = this.handleSubmit.bind(this);
     this.handleFile = this.handleFile.bind(this);
-    this.gotoLink = this.gotoLink.bind(this);
-    this.gotoStudentResume = this.gotoStudentResume.bind(this);
-    this.gotoStudentTranscript = this.gotoStudentTranscript.bind(this);
     this.getProfile();
   }
 
@@ -164,12 +162,6 @@ export default class EditProfile extends React.Component {
     );
   }
 
-  isFromGithubLinkValid = () => {
-    const github_link = this.state.form.github_url;
-    if (github_link == null) return;
-    return github_link.includes('https://github.com/');
-  };
-
   parseIndonesianDateFormat(dateIndex) {
     const monthNameIndex = {
       '01': 'Januari',
@@ -194,7 +186,7 @@ export default class EditProfile extends React.Component {
 
   handleSubmit = (e) => {
     e.preventDefault();
-    if (!this.isFromGithubLinkValid()) {
+    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>',
@@ -258,15 +250,6 @@ export default class EditProfile extends React.Component {
     this.setState({ form });
   };
 
-  gotoLink = (url) => {
-    const win = window.open(url);
-    win.focus();
-  };
-
-  gotoStudentResume = () => this.gotoLink(this.state.resume || '#');
-
-  gotoStudentTranscript = () => this.gotoLink(`transkrip/${this.state.id}`);
-
   updateForm(show) {
     if (show) {
       return (
diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx
index 218bbc99..11d602be 100755
--- a/assets/js/ProfilePage.jsx
+++ b/assets/js/ProfilePage.jsx
@@ -16,6 +16,7 @@ import Server from './lib/Server';
 import Storage from './lib/Storage';
 import ModalAlert from './components/ModalAlert';
 import Dumper from './lib/Dumper';
+import { isFromGithubLinkValid, gotoLink } from './Utils';
 
 export default class ProfilePage extends React.Component {
   static propTypes = {
@@ -104,7 +105,6 @@ export default class ProfilePage extends React.Component {
     this.handleCheckbox = this.handleCheckbox.bind(this);
     this.handleSubmit = this.handleSubmit.bind(this);
     this.handleFile = this.handleFile.bind(this);
-    this.gotoLink = this.gotoLink.bind(this);
     this.gotoStudentResume = this.gotoStudentResume.bind(this);
     this.gotoStudentTranscript = this.gotoStudentTranscript.bind(this);
     this.getProfile();
@@ -179,12 +179,6 @@ export default class ProfilePage extends React.Component {
     );
   }
 
-  isFromGithubLinkValid = () => {
-    const github_link = this.state.form.github_url;
-    if (github_link == null) return;
-    return github_link.includes('https://github.com/');
-  };
-
   gitlabURL_is_valid = () => {
     if (this.state.form.gitlab_url != null) {
       return this.state.form.gitlab_url.includes('https://gitlab.com/');
@@ -239,7 +233,7 @@ export default class ProfilePage extends React.Component {
 
   handleSubmit = (e) => {
     e.preventDefault();
-    if (!this.isFromGithubLinkValid()) {
+    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>',
@@ -309,14 +303,9 @@ export default class ProfilePage extends React.Component {
     this.setState({ form });
   };
 
-  gotoLink = (url) => {
-    const win = window.open(url);
-    win.focus();
-  };
-
-  gotoStudentResume = () => this.gotoLink(this.state.resume || '#');
+  gotoStudentResume = () => gotoLink(this.state.resume || '#');
 
-  gotoStudentTranscript = () => this.gotoLink(`transkrip/${this.state.id}`);
+  gotoStudentTranscript = () => gotoLink(`transkrip/${this.state.id}`);
 
   updateForm(show) {
     if (show) {
diff --git a/assets/js/Utils.js b/assets/js/Utils.js
new file mode 100644
index 00000000..860ca4c0
--- /dev/null
+++ b/assets/js/Utils.js
@@ -0,0 +1,6 @@
+export const isFromGithubLinkValid = github_link => {
+    if (github_link == null) return;
+    return github_link.includes('https://github.com/');
+  };
+
+export const gotoLink = url => window.open(url).focus();
-- 
GitLab


From 1cd576c8dfec2cdec225884cd85fe1ba063ec009 Mon Sep 17 00:00:00 2001
From: Bagas <priambudibagaskara@gmail.com>
Date: Mon, 2 Dec 2019 20:54:30 +0700
Subject: [PATCH 2/5] aeextract modal

---
 assets/js/components/ModalComponent.jsx | 20 ++++++++++++++++++++
 assets/js/components/ModalSuccess.jsx   | 22 +++++++++-------------
 2 files changed, 29 insertions(+), 13 deletions(-)
 create mode 100644 assets/js/components/ModalComponent.jsx

diff --git a/assets/js/components/ModalComponent.jsx b/assets/js/components/ModalComponent.jsx
new file mode 100644
index 00000000..8168a500
--- /dev/null
+++ b/assets/js/components/ModalComponent.jsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import {
+  Button, Header, Icon, Modal,
+} from 'semantic-ui-react';
+
+export const ModalComponent = (props) => (
+  <Modal open={props.open} basic size="small">
+    <Header icon={props.icon} content={props.header} />
+    <Modal.Content>
+      <p style={props.style}>{props.content}</p>
+    </Modal.Content>
+    <Modal.Actions>
+      <Button color="green" inverted onClick={props.onClick}>
+        <Icon name="checkmark" />
+        {' '}
+        OK
+      </Button>
+    </Modal.Actions>
+  </Modal>
+);
diff --git a/assets/js/components/ModalSuccess.jsx b/assets/js/components/ModalSuccess.jsx
index 36aa8722..4a438dbd 100644
--- a/assets/js/components/ModalSuccess.jsx
+++ b/assets/js/components/ModalSuccess.jsx
@@ -2,6 +2,7 @@ import React from 'react';
 import {
   Button, Header, Icon, Modal,
 } from 'semantic-ui-react';
+import {ModalComponent} from "./ModalComponent";
 
 export default class ModalSuccess extends React.Component {
   constructor(props) {
@@ -41,19 +42,14 @@ export default class ModalSuccess extends React.Component {
   render = () => {
     const style = { whiteSpace: 'pre-wrap' };
     return (
-      <Modal open={this.state.open} basic size="small">
-        <Header icon="checkmark sign" content={this.state.header} />
-        <Modal.Content>
-          <p style={style}>{this.state.content}</p>
-        </Modal.Content>
-        <Modal.Actions>
-          <Button color="green" inverted onClick={this.close}>
-            <Icon name="checkmark" />
-            {' '}
-OK
-          </Button>
-        </Modal.Actions>
-      </Modal>
+      <ModalComponent
+        open={this.state.open}
+        icon={"checkmark sign"}
+        header={this.state.header}
+        style={style}
+        content={this.state.content}
+        onClick={this.close}
+      />
     );
   };
 }
-- 
GitLab


From 4598672b5c8f0a8d6a66d17273ca51fd3c69ce24 Mon Sep 17 00:00:00 2001
From: Bagas <priambudibagaskara@gmail.com>
Date: Mon, 2 Dec 2019 20:56:12 +0700
Subject: [PATCH 3/5] extract alert modal

---
 assets/js/components/ModalAlert.jsx   | 25 +++++++++----------------
 assets/js/components/ModalSuccess.jsx |  3 ---
 2 files changed, 9 insertions(+), 19 deletions(-)

diff --git a/assets/js/components/ModalAlert.jsx b/assets/js/components/ModalAlert.jsx
index af4b095f..324a92df 100755
--- a/assets/js/components/ModalAlert.jsx
+++ b/assets/js/components/ModalAlert.jsx
@@ -1,7 +1,5 @@
 import React from 'react';
-import {
-  Button, Header, Icon, Modal,
-} from 'semantic-ui-react';
+import {ModalComponent} from "./ModalComponent";
 
 export default class ModalAlert extends React.Component {
   constructor(props) {
@@ -46,19 +44,14 @@ export default class ModalAlert extends React.Component {
   render = () => {
     const style = { whiteSpace: 'pre-wrap' };
     return (
-      <Modal open={this.state.open} basic size="small">
-        <Header icon="warning sign" content={this.state.header} />
-        <Modal.Content>
-          <p style={style}>{this.state.content}</p>
-        </Modal.Content>
-        <Modal.Actions>
-          <Button color="green" inverted onClick={this.close}>
-            <Icon name="checkmark" />
-            {' '}
-OK
-          </Button>
-        </Modal.Actions>
-      </Modal>
+      <ModalComponent
+        open={this.state.open}
+        icon={"warning sign"}
+        header={this.state.header}
+        style={style}
+        content={this.state.content}
+        onClick={this.close}
+      />
     );
   };
 }
diff --git a/assets/js/components/ModalSuccess.jsx b/assets/js/components/ModalSuccess.jsx
index 4a438dbd..769b8b30 100644
--- a/assets/js/components/ModalSuccess.jsx
+++ b/assets/js/components/ModalSuccess.jsx
@@ -1,7 +1,4 @@
 import React from 'react';
-import {
-  Button, Header, Icon, Modal,
-} from 'semantic-ui-react';
 import {ModalComponent} from "./ModalComponent";
 
 export default class ModalSuccess extends React.Component {
-- 
GitLab


From 4e35047527c4307a0c6559caefd5220cb0e2b351 Mon Sep 17 00:00:00 2001
From: Bagas <priambudibagaskara@gmail.com>
Date: Mon, 2 Dec 2019 21:02:49 +0700
Subject: [PATCH 4/5] refactor modal

---
 assets/js/components/ModalAlert.jsx   | 17 +++--------------
 assets/js/components/ModalSuccess.jsx | 13 +++----------
 2 files changed, 6 insertions(+), 24 deletions(-)

diff --git a/assets/js/components/ModalAlert.jsx b/assets/js/components/ModalAlert.jsx
index 324a92df..8f9da9ab 100755
--- a/assets/js/components/ModalAlert.jsx
+++ b/assets/js/components/ModalAlert.jsx
@@ -6,9 +6,8 @@ export default class ModalAlert extends React.Component {
     super(props);
     /* istanbul ignore next */
     this.state = {
-      open: false, header: '', content: '', callback: () => {},
+      isOpen: false, header: '', content: '', callback: () => {},
     };
-    this.open = this.open.bind(this);
     this.close = this.close.bind(this);
   }
 
@@ -26,18 +25,8 @@ export default class ModalAlert extends React.Component {
     if (anotherModal > 0) document.body.classList.add('scrolling', 'dimmable', 'dimmed');
   };
 
-  open = (
-    header = this.state.header,
-    content = this.state.content,
-    callback = this.state.callback,
-  ) => {
-    this.setState({
-      open: true, header, content, callback,
-    });
-  };
-
   close = () => {
-    this.setState({ open: false });
+    this.setState({ isOpen: false });
     this.state.callback();
   };
 
@@ -45,7 +34,7 @@ export default class ModalAlert extends React.Component {
     const style = { whiteSpace: 'pre-wrap' };
     return (
       <ModalComponent
-        open={this.state.open}
+        open={this.state.isOpen}
         icon={"warning sign"}
         header={this.state.header}
         style={style}
diff --git a/assets/js/components/ModalSuccess.jsx b/assets/js/components/ModalSuccess.jsx
index 769b8b30..dcf3d498 100644
--- a/assets/js/components/ModalSuccess.jsx
+++ b/assets/js/components/ModalSuccess.jsx
@@ -6,9 +6,8 @@ export default class ModalSuccess extends React.Component {
     super(props);
     /* istanbul ignore next */
     this.state = {
-      open: false, header: '', content: '', callback: () => {},
+      isOpen: false, header: '', content: '', callback: () => {},
     };
-    this.open = this.open.bind(this);
     this.close = this.close.bind(this);
   }
 
@@ -25,14 +24,8 @@ export default class ModalSuccess extends React.Component {
     if (anotherModal > 0) document.body.classList.add('scrolling', 'dimmable', 'dimmed');
   };
 
-  open = (header = this.state.header, content = this.state.content, callback = this.state.callback) => {
-    this.setState({
-      open: true, header, content, callback,
-    });
-  };
-
   close = () => {
-    this.setState({ open: false });
+    this.setState({ isOpen: false });
     this.state.callback();
   };
 
@@ -40,7 +33,7 @@ export default class ModalSuccess extends React.Component {
     const style = { whiteSpace: 'pre-wrap' };
     return (
       <ModalComponent
-        open={this.state.open}
+        open={this.state.isOpen}
         icon={"checkmark sign"}
         header={this.state.header}
         style={style}
-- 
GitLab


From 3e93eae68732ca2cb3a82f64544cec852e839ef2 Mon Sep 17 00:00:00 2001
From: Bagas <priambudibagaskara@gmail.com>
Date: Mon, 2 Dec 2019 21:12:46 +0700
Subject: [PATCH 5/5] fix code modal

---
 assets/js/components/ModalAlert.jsx   | 17 ++++++++++++++---
 assets/js/components/ModalSuccess.jsx | 16 +++++++++++++---
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/assets/js/components/ModalAlert.jsx b/assets/js/components/ModalAlert.jsx
index 8f9da9ab..324a92df 100755
--- a/assets/js/components/ModalAlert.jsx
+++ b/assets/js/components/ModalAlert.jsx
@@ -6,8 +6,9 @@ export default class ModalAlert extends React.Component {
     super(props);
     /* istanbul ignore next */
     this.state = {
-      isOpen: false, header: '', content: '', callback: () => {},
+      open: false, header: '', content: '', callback: () => {},
     };
+    this.open = this.open.bind(this);
     this.close = this.close.bind(this);
   }
 
@@ -25,8 +26,18 @@ export default class ModalAlert extends React.Component {
     if (anotherModal > 0) document.body.classList.add('scrolling', 'dimmable', 'dimmed');
   };
 
+  open = (
+    header = this.state.header,
+    content = this.state.content,
+    callback = this.state.callback,
+  ) => {
+    this.setState({
+      open: true, header, content, callback,
+    });
+  };
+
   close = () => {
-    this.setState({ isOpen: false });
+    this.setState({ open: false });
     this.state.callback();
   };
 
@@ -34,7 +45,7 @@ export default class ModalAlert extends React.Component {
     const style = { whiteSpace: 'pre-wrap' };
     return (
       <ModalComponent
-        open={this.state.isOpen}
+        open={this.state.open}
         icon={"warning sign"}
         header={this.state.header}
         style={style}
diff --git a/assets/js/components/ModalSuccess.jsx b/assets/js/components/ModalSuccess.jsx
index dcf3d498..d9216143 100644
--- a/assets/js/components/ModalSuccess.jsx
+++ b/assets/js/components/ModalSuccess.jsx
@@ -6,8 +6,9 @@ export default class ModalSuccess extends React.Component {
     super(props);
     /* istanbul ignore next */
     this.state = {
-      isOpen: false, header: '', content: '', callback: () => {},
+      open: false, header: '', content: '', callback: () => {},
     };
+    this.open = this.open.bind(this);
     this.close = this.close.bind(this);
   }
 
@@ -24,8 +25,17 @@ export default class ModalSuccess extends React.Component {
     if (anotherModal > 0) document.body.classList.add('scrolling', 'dimmable', 'dimmed');
   };
 
+  open = (header = this.state.header, content = this.state.content, callback = this.state.callback) => {
+    this.setState({
+      open: true,
+      header,
+      content,
+      callback,
+    });
+  };
+
   close = () => {
-    this.setState({ isOpen: false });
+    this.setState({ open: false });
     this.state.callback();
   };
 
@@ -33,7 +43,7 @@ export default class ModalSuccess extends React.Component {
     const style = { whiteSpace: 'pre-wrap' };
     return (
       <ModalComponent
-        open={this.state.isOpen}
+        open={this.state.open}
         icon={"checkmark sign"}
         header={this.state.header}
         style={style}
-- 
GitLab