From c37303ccf4daf100008760efa5e497e887965acf Mon Sep 17 00:00:00 2001
From: Sandro Lutz <code@temparus.ch>
Date: Sat, 17 Mar 2018 23:43:40 +0100
Subject: [PATCH] Add confirm button to withdraw group membership

---
 src/components/Button.js |  5 +++
 src/views/profile.js     | 70 +++++++++++++++++++++++++++++-----------
 2 files changed, 57 insertions(+), 18 deletions(-)

diff --git a/src/components/Button.js b/src/components/Button.js
index f21678f0..04c39da9 100644
--- a/src/components/Button.js
+++ b/src/components/Button.js
@@ -7,6 +7,11 @@ ButtonCSS.addStyle('.blue-button', {
   color_light_text: 'white',
 });
 
+ButtonCSS.addStyle('.flat-button', {
+  color_light_background: 'white',
+  color_light_text: 'gray',
+});
+
 /**
  * Generic button component
  *
diff --git a/src/views/profile.js b/src/views/profile.js
index 0b6afdaf..b0612c8d 100644
--- a/src/views/profile.js
+++ b/src/views/profile.js
@@ -166,43 +166,77 @@ class announceSubscriptionForm {
 
 // shows group memberships and allows to withdraw and enroll for selected groups.
 class groupMemberships {
-  static oninit() {
+  oninit() {
     groups.load({ allow_self_enrollment: true });
     groups.loadMemberships();
     this.busy = [];
+    this.confirm = [];
   }
 
-  static view() {
+  view() {
     return m('div', [
       m(
         'div',
         groups.getMemberships().map(membership => {
-          const buttonArgs = {
-            events: {
-              onclick: () => {
-                this.busy[membership.group._id] = true;
-                groups
-                  .withdraw(membership._id, membership._etag)
-                  .then(() => {
-                    this.busy[membership.group._id] = false;
-                  })
-                  .catch(() => {
-                    this.busy[membership.group._id] = false;
-                  });
-              },
-            },
-          };
+          const buttonArgs = {};
+          let buttons;
 
           if (this.busy[membership.group._id]) {
             buttonArgs.disabled = true;
           }
 
+          if (this.confirm[membership.group._id]) {
+            buttons = [
+              m(Button, {
+                ...buttonArgs,
+                label: 'cancel',
+                className: 'flat-button',
+                events: {
+                  onclick: () => {
+                    this.confirm[membership.group._id] = false;
+                    this.busy[membership.group._id] = false;
+                  },
+                },
+              }),
+              m('span', ' '),
+              m(Button, {
+                ...buttonArgs,
+                label: 'confirm',
+                events: {
+                  onclick: () => {
+                    this.busy[membership.group._id] = true;
+                    groups
+                      .withdraw(membership._id, membership._etag)
+                      .then(() => {
+                        this.busy[membership.group._id] = false;
+                        this.confirm[membership.group._id] = false;
+                      })
+                      .catch(() => {
+                        this.busy[membership.group._id] = false;
+                        this.confirm[membership.group._id] = false;
+                      });
+                  },
+                },
+              }),
+            ];
+          } else {
+            buttons = m(Button, {
+              ...buttonArgs,
+              label: 'withdraw',
+              events: {
+                onclick: () => {
+                  this.confirm[membership.group._id] = true;
+                },
+              },
+            });
+          }
+
           return m('div', [
             m('span', membership.group.name),
             membership.expiry === undefined
               ? undefined
               : m('span', `(expires on ${membership.expiry})`),
-            m(Button, { ...buttonArgs, label: 'withdraw' }),
+            buttons,
           ]);
         })
       ),
-- 
GitLab