From cad6464317432b493531934b5127ef96182c8720 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Mon, 17 Jul 2017 15:49:36 +0200
Subject: [PATCH] refactor: UserProfile responsive design; Show Membership
 content in UserProfile

---
 .../profile/UserProfile.Membership.html       |  35 +++
 .../profile/UserProfile.MembershipStatus.html |  17 --
 bin/controls/profile/UserProfile.css          |  23 +-
 bin/controls/profile/UserProfile.html         |  10 +-
 bin/controls/profile/UserProfile.js           | 215 ++++++++++--------
 locale.xml                                    |  10 +-
 settings.xml                                  |   2 +-
 7 files changed, 191 insertions(+), 121 deletions(-)
 create mode 100644 bin/controls/profile/UserProfile.Membership.html
 delete mode 100644 bin/controls/profile/UserProfile.MembershipStatus.html

diff --git a/bin/controls/profile/UserProfile.Membership.html b/bin/controls/profile/UserProfile.Membership.html
new file mode 100644
index 0000000..dceeaff
--- /dev/null
+++ b/bin/controls/profile/UserProfile.Membership.html
@@ -0,0 +1,35 @@
+<div class="quiqqer-memberships-profile-userprofile-membership-info grid-60">
+    <h2 class="quiqqer-memberships-profile-userprofile-membership-info-title">
+        {{membershipTitle}}
+    </h2>
+    <p>
+        {{membershipShort}}
+    </p>
+</div>
+<div class="quiqqer-memberships-profile-userprofile-membership-status-container grid-40 grid-parent">
+    <div class="quiqqer-memberships-profile-userprofile-membership-status grid-100">
+        <div class="grid-60">
+            {{labelAddedDate}}
+        </div>
+        <div class="grid-40">
+            {{addedDate}}
+        </div>
+    </div>
+    <div class="quiqqer-memberships-profile-userprofile-membership-status grid-100">
+        <div class="grid-60">
+            {{labelEndDate}}
+        </div>
+        <div class="grid-40">
+            {{endDate}}
+        </div>
+    </div>
+    <div class="quiqqer-memberships-profile-userprofile-membership-status grid-100">
+        <div class="grid-60">
+            {{labelStatus}}
+        </div>
+        <div class="grid-40">
+            {{{status}}}
+            <div class="quiqqer-memberships-profile-userprofile-btn"></div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/bin/controls/profile/UserProfile.MembershipStatus.html b/bin/controls/profile/UserProfile.MembershipStatus.html
deleted file mode 100644
index a067df6..0000000
--- a/bin/controls/profile/UserProfile.MembershipStatus.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<table class="quiqqer-memberships-profile-userprofile-table-status">
-    <tr>
-        <td>{{labelAddedDate}}</td>
-        <td>{{addedDate}}</td>
-    </tr>
-    <tr class="quiqqer-memberships-profile-userprofile-table-status-enddate">
-        <td>{{labelEndDate}}</td>
-        <td>{{endDate}}</td>
-    </tr>
-    <tr>
-        <td>{{labelStatus}}</td>
-        <td>
-            {{{status}}}
-            <div class="quiqqer-memberships-profile-userprofile-btn"></div>
-        </td>
-    </tr>
-</table>
\ No newline at end of file
diff --git a/bin/controls/profile/UserProfile.css b/bin/controls/profile/UserProfile.css
index f396517..8471a64 100644
--- a/bin/controls/profile/UserProfile.css
+++ b/bin/controls/profile/UserProfile.css
@@ -1,3 +1,22 @@
+.quiqqer-memberships-profile-userprofile-membership {
+    float: left;
+    width: 100%;
+}
+
+.quiqqer-memberships-profile-userprofile-membership:not(:last-of-type) {
+    margin-bottom: 20px;
+}
+
+.quiqqer-memberships-profile-userprofile-membership-info-content:hover {
+    cursor: pointer;
+    opacity: 0.7;
+}
+
+.quiqqer-memberships-profile-userprofile-membership-info-content {
+    float: right;
+    font-size: 20px;
+}
+
 .quiqqer-memberships-profile-userprofile-status-cancelled {
     color: #ff0000;
 }
@@ -10,10 +29,6 @@
     color: #008000;
 }
 
-.quiqqer-memberships-profile-userprofile-table__hidden {
-    display: none;
-}
-
 .quiqqer-memberships-profile-userprofile-btn .qui-button {
     border: 1px solid #ff0000 !important;
     font-size: 12px;
diff --git a/bin/controls/profile/UserProfile.html b/bin/controls/profile/UserProfile.html
index 9fa8448..654b992 100644
--- a/bin/controls/profile/UserProfile.html
+++ b/bin/controls/profile/UserProfile.html
@@ -1,11 +1,3 @@
 <h1>{{header}}</h1>
 <p class="quiqqer-memberships-profile-userprofile-info"></p>
-<table class="quiqqer-memberships-profile-userprofile-table">
-    <thead>
-    <tr>
-        <th>{{headerMembership}}</th>
-        <th>{{headerMembershipData}}</th>
-    </tr>
-    </thead>
-    <tbody></tbody>
-</table>
\ No newline at end of file
+<div class="quiqqer-memberships-profile-userprofile-memberships grid-parent"></div>
\ No newline at end of file
diff --git a/bin/controls/profile/UserProfile.js b/bin/controls/profile/UserProfile.js
index 0d6bc19..a502c67 100644
--- a/bin/controls/profile/UserProfile.js
+++ b/bin/controls/profile/UserProfile.js
@@ -23,6 +23,7 @@ define('package/quiqqer/memberships/bin/controls/profile/UserProfile', [
     'qui/controls/Control',
     'qui/controls/loader/Loader',
     'qui/controls/windows/Confirm',
+    'qui/controls/windows/Popup',
     'qui/controls/buttons/Button',
 
     'package/quiqqer/memberships/bin/MembershipUsers',
@@ -32,11 +33,11 @@ define('package/quiqqer/memberships/bin/controls/profile/UserProfile', [
     'Mustache',
 
     'text!package/quiqqer/memberships/bin/controls/profile/UserProfile.html',
-    'text!package/quiqqer/memberships/bin/controls/profile/UserProfile.MembershipStatus.html',
+    'text!package/quiqqer/memberships/bin/controls/profile/UserProfile.Membership.html',
     'css!package/quiqqer/memberships/bin/controls/profile/UserProfile.css'
 
-], function (QUIControl, QUILoader, QUIConfirm, QUIButton, MembershipUsers,
-             QUILocale, QUIAjax, Mustache, template, statusTemplate) {
+], function (QUIControl, QUILoader, QUIConfirm, QUIPopup, QUIButton, MembershipUsers,
+             QUILocale, QUIAjax, Mustache, template, membershipTemplate) {
     "use strict";
 
     var lg = 'quiqqer/memberships';
@@ -51,7 +52,8 @@ define('package/quiqqer/memberships/bin/controls/profile/UserProfile', [
             'refresh',
             '$build',
             '$openCancelConfirm',
-            '$openAbortCancelConfirm'
+            '$openAbortCancelConfirm',
+            '$getMembershipElm'
         ],
 
         options: {
@@ -107,11 +109,9 @@ define('package/quiqqer/memberships/bin/controls/profile/UserProfile', [
          * Fill table with membership data
          */
         $build: function () {
-            var self         = this;
-            var lgPrefix     = 'controls.profile.userprofile.datatable.';
-
-            var TableElm = this.$Elm.getElement(
-                '.quiqqer-memberships-profile-userprofile-table'
+            var self           = this;
+            var MembershipsElm = this.$Elm.getElement(
+                '.quiqqer-memberships-profile-userprofile-memberships'
             );
 
             var InfoElm = this.$Elm.getElement(
@@ -120,101 +120,138 @@ define('package/quiqqer/memberships/bin/controls/profile/UserProfile', [
 
             // if user has no memberships, hide table and show info
             if (!this.$memberships.length) {
-                TableElm.addClass('quiqqer-memberships-profile-userprofile-table__hidden');
-                InfoElm.set('html', QUILocale.get(lg, 'controls.profile.userprofile.info.no.memberships'));
+                InfoElm.set('html', QUILocale.get(lg,
+                    'controls.profile.userprofile.info.no.memberships'
+                ));
 
                 return;
             }
 
-            InfoElm.set('html', '');
-            TableElm.removeClass('quiqqer-memberships-profile-userprofile-table__hidden');
-
-            var TableBodyElm = TableElm.getElement('tbody');
-
-            TableBodyElm.set('html', '');
-
             for (var i = 0, len = this.$memberships.length; i < len; i++) {
                 var Membership = this.$memberships[i];
-                var Row        = new Element('tr').inject(TableBodyElm);
+                this.$getMembershipElm(Membership).inject(MembershipsElm);
+            }
+        },
 
-                // Membership title and description
-                new Element('td', {
-                    html: '<h2>' + Membership.membershipTitle + '</h2>' +
-                    '<p>' + Membership.membershipShort + '</p>'
-                }).inject(Row);
+        /**
+         * Get HTMLElement that represents the Membership data
+         *
+         * @param {Object} Membership
+         * @return {HTMLElement}
+         */
+        $getMembershipElm: function (Membership) {
+            var self     = this;
+            var status   = 'active';
+            var lgPrefix = 'controls.profile.userprofile.datatable.';
+
+            if (Membership.cancelled) {
+                status = 'cancelled';
+            } else if (Membership.cancelDate) {
+                status = 'cancelled_start';
+            }
 
-                // Membership data (dates and status)
-                var status = 'active';
+            var endDateLabel;
 
-                if (Membership.cancelled) {
-                    status = 'cancelled';
-                } else if (Membership.cancelDate) {
-                    status = 'cancelled_start';
-                }
+            if (Membership.autoExtend) {
+                endDateLabel = QUILocale.get(lg, lgPrefix + 'labelEndDate.autoExtend');
+            } else {
+                endDateLabel = QUILocale.get(lg, lgPrefix + 'labelEndDate.noAutoExtend');
+            }
 
-                var StatusElm = new Element('td', {
-                    html: Mustache.render(statusTemplate, {
-                        labelAddedDate: QUILocale.get(lg, lgPrefix + 'labelAddedDate'),
-                        addedDate     : Membership.addedDate,
-                        labelEndDate  : QUILocale.get(lg, lgPrefix + 'labelEndDate'),
-                        endDate       : Membership.endDate,
-                        labelStatus   : QUILocale.get(lg, lgPrefix + 'labelStatus'),
-                        status        : '<span class="quiqqer-memberships-profile-userprofile-status-'
-                        + status + '">' + QUILocale.get(lg, lgPrefix + 'status.' + status) +
-                        '</span>'
-                    })
-                }).inject(Row);
-
-                // only show "cancel" and "withdraw cancellation" btns on autoextend
-                if (!Membership.autoExtend) {
-                    continue;
-                }
+            var MembershipElm = new Element('div', {
+                'class': 'quiqqer-memberships-profile-userprofile-membership grid-100',
+                html   : Mustache.render(membershipTemplate, {
+                    membershipTitle: Membership.membershipTitle,
+                    membershipShort: Membership.membershipShort,
+                    labelAddedDate : QUILocale.get(lg, lgPrefix + 'labelAddedDate'),
+                    addedDate      : Membership.addedDate,
+                    labelEndDate   : endDateLabel,
+                    endDate        : Membership.endDate,
+                    labelStatus    : QUILocale.get(lg, lgPrefix + 'labelStatus'),
+                    status         : '<span class="quiqqer-memberships-profile-userprofile-status-'
+                    + status + '">' + QUILocale.get(lg, lgPrefix + 'status.' + status) +
+                    '</span>'
+                })
+            });
 
-                // if autoextend and not cancelled -> hide endDate
-                if (!Membership.cancelled) {
-                    StatusElm.getElement(
-                        '.quiqqer-memberships-profile-userprofile-table-status-enddate'
-                    ).addClass('quiqqer-memberships-profile-userprofile-table__hidden');
-                }
+            // show content btn
+            if (Membership.membershipContent !== '') {
+                var ShowContentElm = MembershipElm.getElement(
+                    '.quiqqer-memberships-profile-userprofile-membership-info-title'
+                );
+
+                new Element('span', {
+                    'class': 'fa fa-info-circle quiqqer-memberships-profile-userprofile-membership-info-content',
+                    events : {
+                        click: function () {
+                            self.$showMembershipContent(Membership);
+                        }
+                    }
+                }).inject(ShowContentElm);
+            }
+
+            // only show "cancel" and "withdraw cancellation" btns on autoextend
+            if (!Membership.autoExtend) {
+                return MembershipElm;
+            }
 
-                if (status === 'active') {
-                    // cancel btn
-                    new QUIButton({
-                        membership: Membership,
-                        text      : QUILocale.get(lg, 'controls.profile.userprofile.btn.cancel.text'),
-                        'class'   : 'btn-red',
-                        events    : {
-                            onClick: function (Btn) {
-                                self.$openCancelConfirm(
-                                    Btn.getAttribute('membership')
-                                );
-                            }
+            // if autoextend and not cancelled -> hide endDate
+            if (status === 'active') {
+                // cancel btn
+                new QUIButton({
+                    membership: Membership,
+                    text      : QUILocale.get(lg, 'controls.profile.userprofile.btn.cancel.text'),
+                    'class'   : 'btn-red',
+                    events    : {
+                        onClick: function (Btn) {
+                            self.$openCancelConfirm(
+                                Btn.getAttribute('membership')
+                            );
                         }
-                    }).inject(
-                        StatusElm.getElement(
-                            '.quiqqer-memberships-profile-userprofile-btn'
-                        )
-                    );
-                } else {
-                    // abort cancel btn
-                    new QUIButton({
-                        membership: Membership,
-                        text      : QUILocale.get(lg, 'controls.profile.userprofile.btn.abortcancel.text'),
-                        'class'   : 'btn-orange',
-                        events    : {
-                            onClick: function (Btn) {
-                                self.$openAbortCancelConfirm(
-                                    Btn.getAttribute('membership')
-                                );
-                            }
+                    }
+                }).inject(
+                    MembershipElm.getElement(
+                        '.quiqqer-memberships-profile-userprofile-btn'
+                    )
+                );
+            } else {
+                // abort cancel btn
+                new QUIButton({
+                    membership: Membership,
+                    text      : QUILocale.get(lg, 'controls.profile.userprofile.btn.abortcancel.text'),
+                    'class'   : 'btn-orange',
+                    events    : {
+                        onClick: function (Btn) {
+                            self.$openAbortCancelConfirm(
+                                Btn.getAttribute('membership')
+                            );
                         }
-                    }).inject(
-                        StatusElm.getElement(
-                            '.quiqqer-memberships-profile-userprofile-btn'
-                        )
-                    );
-                }
+                    }
+                }).inject(
+                    MembershipElm.getElement(
+                        '.quiqqer-memberships-profile-userprofile-btn'
+                    )
+                );
             }
+
+            return MembershipElm;
+        },
+
+        /**
+         * Show Membership Content
+         *
+         * @param {Object} Membership
+         */
+        $showMembershipContent: function (Membership) {
+            new QUIPopup({
+                content: Membership.membershipContent,
+                icon   : 'fa fa-id-card-o',
+                title  : QUILocale.get(lg,
+                    'controls.profile.userprofile.showcontent.title', {
+                        title: Membership.membershipTitle
+                    }
+                )
+            }).open();
         },
 
         /**
diff --git a/locale.xml b/locale.xml
index 925feaf..d5f8510 100644
--- a/locale.xml
+++ b/locale.xml
@@ -797,7 +797,11 @@
             <de><![CDATA[In Mitgliedschaft seit]]></de>
             <en><![CDATA[In membership since]]></en>
         </locale>
-        <locale name="controls.profile.userprofile.datatable.labelEndDate">
+        <locale name="controls.profile.userprofile.datatable.labelEndDate.autoExtend">
+            <de><![CDATA[Autom. Verlängerung am]]></de>
+            <en><![CDATA[Auto extend at]]></en>
+        </locale>
+        <locale name="controls.profile.userprofile.datatable.labelEndDate.noAutoExtend">
             <de><![CDATA[Mitgliedschaft endet]]></de>
             <en><![CDATA[Membership ends]]></en>
         </locale>
@@ -869,6 +873,10 @@
             <de><![CDATA[Es sind z.Z. keine Mitgliedschaften in Ihrem Nutzerprofil vorhanden.]]></de>
             <en><![CDATA[There are currently no memberships in your user profile.]]></en>
         </locale>
+        <locale name="controls.profile.userprofile.showcontent.title">
+            <de><![CDATA[Mitgliedschaft "[title]"]]></de>
+            <en><![CDATA[Membership "[title]"]]></en>
+        </locale>
 
         <!-- Templates -->
         <locale name="templates.mail.greeting">
diff --git a/settings.xml b/settings.xml
index 0d24a12..fb9db4c 100644
--- a/settings.xml
+++ b/settings.xml
@@ -130,7 +130,7 @@
                             </description>
                         </input>
 
-                        <select conf="memberships.viewDataMode">
+                        <select conf="membershipusers.viewDataMode">
                             <text>
                                 <locale group="quiqqer/memberships" var="settings.viewDataMode.title"/>
                             </text>
-- 
GitLab