From 90f9c0e986a4a9bb2fba42237af4c12954168fdc Mon Sep 17 00:00:00 2001
From: Sandro Lutz <code@temparus.ch>
Date: Sun, 18 Feb 2018 09:46:03 +0100
Subject: [PATCH] Allow edits of signup data

---
 src/models/events.js      | 27 ++++++++++++++++++++++++++
 src/views/eventDetails.js | 40 ++++++++++++++++++++++++++++++++-------
 2 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/src/models/events.js b/src/models/events.js
index 54f1810f..c779be86 100644
--- a/src/models/events.js
+++ b/src/models/events.js
@@ -47,6 +47,20 @@ export function loadSignupForSelectedEvent() {
 }
 
 export function _signupUserForSelectedEvent(additionalFieldsString) {
+  if (typeof this.selectedEventSignup !== 'undefined') {
+    return m.request({
+      method: 'PATCH',
+      url: `${apiUrl}/eventsignups/${this.selectedEventSignup._id}`,
+      data: {
+        additional_fields: additionalFieldsString,
+      },
+      headers: getToken() ? {
+        Authorization: `Token ${getToken()}`,
+        'If-Match': this.selectedEventSignup._etag,
+      } : { 'If-Match': this.selectedEventSignup._etag },
+    }).then(() => { this.loadSignupForSelectedEvent(); });
+  }
+
   return m.request({
     method: 'POST',
     url: `${apiUrl}/eventsignups`,
@@ -93,6 +107,19 @@ export function signupForSelectedEvent(additionalFields, email = '') {
   return Promise.reject(new Error('Signup not allowed'));
 }
 
+export function signoffForSelectedEvent() {
+  if (isLoggedIn() && typeof this.selectedEventSignup !== 'undefined') {
+    m.request({
+      method: 'DELETE',
+      url: `${apiUrl}/eventsignups/${this.selectedEventSignup._id}`,
+      headers: getToken() ? {
+        Authorization: `Token ${getToken()}`,
+        'If-Match': this.selectedEventSignup._etag,
+      } : { 'If-Match': this.selectedEventSignup._etag },
+    }).then(() => { this.loadSignupForSelectedEvent(); });
+  }
+}
+
 export function load(query = {}) {
   querySaved = query;
 
diff --git a/src/views/eventDetails.js b/src/views/eventDetails.js
index 7c209999..d8720405 100644
--- a/src/views/eventDetails.js
+++ b/src/views/eventDetails.js
@@ -13,7 +13,12 @@ class EventSignupForm extends JSONSchemaForm {
     this.emailErrors = [];
     this.emailValid = false;
     if (isLoggedIn()) {
-      events.loadSignupForSelectedEvent();
+      events.loadSignupForSelectedEvent()
+        .then(() => {
+          if (typeof events.getSignupForSelectedEvent() !== 'undefined') {
+            this.data = JSON.parse(events.getSignupForSelectedEvent().additional_fields) || {};
+          }
+        });
     }
   }
 
@@ -23,6 +28,11 @@ class EventSignupForm extends JSONSchemaForm {
       .catch(() => log('Could not sign up of the event!'));
   }
 
+  signoff() {
+    events.signoffForSelectedEvent();
+    this.validate();
+  }
+
   view() {
     // do not render anything if there is no data yet
     if (typeof events.getSelectedEvent() === 'undefined') return m();
@@ -30,12 +40,14 @@ class EventSignupForm extends JSONSchemaForm {
     if (isLoggedIn()) {
       // do not render form if there is no signup data of the current user
       if (!events.signupForSelectedEventHasLoaded()) return m('span', 'Loading...');
-      if (typeof events.getSignupForSelectedEvent() === 'undefined') {
-        const elements = this.renderFormElements();
-        elements.push(this._renderSignupButton());
-        return m('form', elements);
+
+      const elements = this.renderFormElements();
+      elements.push(this._renderSignupButton());
+      if (typeof events.getSignupForSelectedEvent() !== 'undefined') {
+        elements.unshift(m('div', 'You have already signed up. Update your data below.'));
+        elements.push(this._renderSignoffButton());
       }
-      return m('div', 'You have already signed up for this event.');
+      return m('form', elements);
     } else if (events.getSelectedEvent().allow_email_signup) {
       const elements = this.renderFormElements();
       elements.push(this._renderEmailField());
@@ -86,6 +98,16 @@ class EventSignupForm extends JSONSchemaForm {
       text: 'Signup',
     });
   }
+
+  _renderSignoffButton() {
+    return m(submitButton, {
+      active: true,
+      args: {
+        onclick: () => this.signoff(),
+      },
+      text: 'Delete signup',
+    });
+  }
 }
 
 export default class EventDetails {
@@ -108,7 +130,11 @@ export default class EventDetails {
             undefined : JSON.parse(events.getSelectedEvent().additional_fields),
         });
       } else {
-        eventSignupForm = m('div', 'The registration period is over.');
+        let participantNotice = '';
+        if (events.getSignupForSelectedEvent() !== 'undefined') {
+          participantNotice = m('You signed up for this event.');
+        }
+        eventSignupForm = m('div', ['The registration period is over.', participantNotice]);
       }
     } else {
       eventSignupForm = m('div', `The registration starts at ${registerStart}`);
-- 
GitLab