Adding edit to admin edit registration levels and charges
authorChuck Scott <cscott@gaslightmedia.com>
Fri, 15 Sep 2017 15:59:37 +0000 (11:59 -0400)
committerChuck Scott <cscott@gaslightmedia.com>
Fri, 15 Sep 2017 15:59:37 +0000 (11:59 -0400)
js/adminRegApp.js
js/views/admin/regClass.js
js/views/admin/regEvent.js
models/admin/registrations/events.php
views/admin/registrations/eventEditLevels.html

index 75cbb65..d4a2dcf 100644 (file)
@@ -1 +1 @@
-app.Models.Admin.RegClass=Backbone.Model.extend({defaults:{id:null,parent:0,reg_event:0,name:"",descr:""},initialize:function(){this.rates=new app.Collections.Admin.RegRates}}),app.Models.Admin.RegEvent=Backbone.Model.extend({defaults:{name:"regEvent",event_name:"",event_code:"",notify_email:"",attendees_max:0,attendees_max_per_reg:0,reg_hold_minutes:0,cart_hold_days:0,terms:""},initialize:function(){this.classes=new app.Collections.Admin.RegClasses},setClasses:function(e){this.classes.reset(e)}}),app.Models.Admin.RegRate=Backbone.Model.extend({defaults:{reg_event:0,reg_class:"",name:"",start_days:0,end_days:0,base_rate:0,per_registrant:0,registrant_credits:0},initialize:function(){}}),app.Collections.Admin.RegClasses=Backbone.Collection.extend({model:app.Models.Admin.RegClass,localStorage:new Backbone.LocalStorage("Classes")}),app.Collections.Admin.RegRates=Backbone.Collection.extend({model:app.Models.Admin.RegRate}),Backbone.emulateJSON=!0,Backbone.emulateHTTP=!0,app.Views.Admin.EventEditLevels=Backbone.View.extend({el:"#regApp",initialize:function(){this.event=new app.Views.Admin.RegEvent({model:regEvent}),this.render()},render:function(){return this.$el.append(this.event.render().el),this},events:{}}),app.Views.Admin.RegClass=Backbone.View.extend({tagName:"div",className:"glm-reg-level",template:_.template(jQuery("#regClass-template").html()),initialize:function(){return this.listenTo(this.model,"change",this.render),this},events:{"click .edit-level":"editLevel","click .class-update":"update","click .class-add":"add","click .class-cancel":"cancel"},update:function(){console.log("Update called");var e=this.$(".class-name").val().trim(),t=this.$(".class-descr").val().trim();this.model.save({name:e,descr:t}),this.$(".class-edit-form").hide(),this.$(".class-label").show()},add:function(){console.log("Add called");var e=this.$(".class-name").val().trim(),t=this.$(".class-descr").val().trim();this.model.set({name:e,descr:t}),this.model.get("parent").classes.create(this.model)},cancel:function(){console.log("Cancel called"),this.remove()},editLevel:function(){this.$(".class-edit-form").show(),this.$(".class-label").hide(),this.$(".class-name").focus()},render:function(){return this.$el.html(this.template(this.model.toJSON())),this},addOne:function(e){if(e.isValid()){var t=new app.Views.Admin.RegClasses({model:e});this.$el.append(t.render().el)}},addAll:function(){jQuery(".glm-reg-level").html("")}}),app.Views.Admin.RegEvent=Backbone.View.extend({tagName:"div",className:"glm-reg-event-item clearfix",template:_.template(jQuery("#regEvent-template").html()),initialize:function(){this.listenTo(this.model,"change",this.render),this.listenTo(this.model.classes,"add",this.addOne),this.listenTo(this.model.classes,"create",this.addOne),this.listenTo(this.model.classes,"reset",this.addAll)},events:{"click #add-reg-level":"addLevel"},addLevel:function(){console.log("Add Level Called");var e=new app.Models.Admin.RegClass({parent:this.model}),t=new app.Views.Admin.RegClass({model:e});this.$el.append(t.render().el)},render:function(){this.$el.html(this.template(this.model.toJSON()));var e=regEvent.classes.map(function(e){return new app.Views.Admin.RegClass({model:e}).render().el});return this.$el.append(e),this}});
\ No newline at end of file
+app.Models.Admin.RegClass=Backbone.Model.extend({defaults:{id:null,reg_event:0,name:"",descr:""},initialize:function(){this.rates=new app.Collections.Admin.RegRates}}),app.Models.Admin.RegEvent=Backbone.Model.extend({defaults:{name:"regEvent",event_name:"",event_code:"",notify_email:"",attendees_max:0,attendees_max_per_reg:0,reg_hold_minutes:0,cart_hold_days:0,terms:""},initialize:function(){this.classes=new app.Collections.Admin.RegClasses},setClasses:function(e){this.classes.reset(e)}}),app.Models.Admin.RegRate=Backbone.Model.extend({defaults:{reg_event:0,reg_class:"",name:"",start_days:0,end_days:0,base_rate:0,per_registrant:0,registrant_credits:0},initialize:function(){}}),app.Collections.Admin.RegClasses=Backbone.Collection.extend({model:app.Models.Admin.RegClass,localStorage:new Backbone.LocalStorage("Classes")}),app.Collections.Admin.RegRates=Backbone.Collection.extend({model:app.Models.Admin.RegRate}),Backbone.emulateJSON=!0,Backbone.emulateHTTP=!0,app.Views.Admin.EventEditLevels=Backbone.View.extend({el:"#regApp",initialize:function(){this.event=new app.Views.Admin.RegEvent({model:regEvent}),this.render()},render:function(){return this.$el.append(this.event.render().el),this},events:{}}),app.Views.Admin.RegClass=Backbone.View.extend({tagName:"div",className:"glm-reg-level",template:_.template(jQuery("#regClass-template").html()),initialize:function(){return this.listenTo(this.model,"change",this.render),this},events:{"click .class-edit":"editLevel","click .class-update":"update","click .class-add":"add","click .class-cancel":"cancel"},update:function(){console.log("update called");var e=this.$(".class-name").val().trim(),s=this.$(".class-descr").val().trim();this.model.save({name:e,descr:s}),this.$(".class-display-template").show(),this.$(".class-edit-template").hide(),glmSubmitRequired--},s:function(){console.log("add called");var e=this.$(".class-name").val().trim(),s=this.$(".class-descr").val().trim();this.model.set({name:e,descr:s}),this.model.get("parent").classes.create(this.model)},cancel:function(){console.log("cancel called"),this.remove()},editLevel:function(){console.log("editLevel called"),this.$(".class-display-template").hide(),this.$(".class-edit-template").show(),this.$(".class-name").focus(),glmSubmitRequired++},render:function(e){return this.$el.html(this.template(this.model.toJSON())),e&&(console.log("New level created"),this.$(".class-display-template").hide(),this.$(".class-edit-template").show(),this.$(".class-name").focus(),glmSubmitRequired++),this},addOne:function(e){if(console.log("addOne called"),e.isValid()){var s=new app.Views.Admin.RegClasses({model:e});this.$el.append(s.render().el)}},addAll:function(){jQuery(".glm-reg-level").html("")}}),app.Views.Admin.RegEvent=Backbone.View.extend({tagName:"div",className:"glm-reg-event-item clearfix",template:_.template(jQuery("#regEvent-template").html()),initialize:function(){this.listenTo(this.model,"change",this.render),this.listenTo(this.model.classes,"add",this.addOne),this.listenTo(this.model.classes,"create",this.addOne),this.listenTo(this.model.classes,"reset",this.addAll)},events:{"click #class-add":"addLevel"},addLevel:function(){console.log("addLevel Called");var e=new app.Models.Admin.RegClass({parent:this.model}),s=new app.Views.Admin.RegClass({model:e});this.$el.append(s.render(!0).el)},render:function(){this.$el.html(this.template(this.model.toJSON()));var e=regEvent.classes.map(function(e){return new app.Views.Admin.RegClass({model:e}).render().el});return this.$el.append(e),this}});
\ No newline at end of file
index c93331d..b6a4f86 100644 (file)
@@ -13,23 +13,24 @@ app.Views.Admin.RegClass = Backbone.View.extend({
     },
 
     events: {
-        'click .edit-level': 'editLevel',
-        'click .class-update': 'update',
-        'click .class-add': 'add',
-        'click .class-cancel': 'cancel',
+        'click .class-edit':   'editLevel',
+        'click .class-update':         'update',
+        'click .class-add':            'add',
+        'click .class-cancel':         'cancel',
     },
 
     update: function(){
-        console.log('Update called');
+        console.log('update called');
         var cName  = this.$('.class-name').val().trim();
         var cDescr = this.$('.class-descr').val().trim();
         this.model.save({ name: cName, descr: cDescr });
-        this.$('.class-edit-form').hide();
-        this.$('.class-label').show();
-    },
+        this.$('.class-display-template').show();
+        this.$('.class-edit-template').hide();
+        glmSubmitRequired--;        
+    },s
 
     add: function(){
-        console.log('Add called');
+       console.log('add called');
         var cName  = this.$('.class-name').val().trim();
         var cDescr = this.$('.class-descr').val().trim();
         this.model.set({ name: cName, descr: cDescr });
@@ -39,23 +40,34 @@ app.Views.Admin.RegClass = Backbone.View.extend({
     },
 
     cancel: function(){
-        console.log('Cancel called');
+        console.log('cancel called');
         this.remove();
     },
 
     editLevel: function(){
-        this.$('.class-edit-form').show();
-        this.$('.class-label').hide();
+        console.log('editLevel called');
+       this.$('.class-display-template').hide();
+        this.$('.class-edit-template').show();
         this.$('.class-name').focus();
+        glmSubmitRequired++;        
     },
 
-    render: function(){
-        this.$el.html( this.template( this.model.toJSON() ) );
+    render: function(addFlag){
+       this.$el.html( this.template( this.model.toJSON() ) );
+       // If addFlag set then we know the call to this is to add a class and not to initialize existing classes
+       if (addFlag) {
+               console.log('New level created');
+               this.$('.class-display-template').hide();
+               this.$('.class-edit-template').show();
+               this.$('.class-name').focus();
+               glmSubmitRequired++;
+       }
         return this;
     },
 
     addOne: function( item ){
-        if ( item.isValid() ) {
+        console.log('addOne called');
+       if ( item.isValid() ) {
             var view = new app.Views.Admin.RegClasses({ model: item });
             this.$el.append( view.render().el );
         }
index 34ce042..3a52ba4 100644 (file)
@@ -18,17 +18,17 @@ app.Views.Admin.RegEvent = Backbone.View.extend({
     },
 
     events: {
-        'click #add-reg-level': 'addLevel',
+        'click #class-add': 'addLevel',
     },
 
     addLevel: function(){
-        console.log( 'Add Level Called' );
+        console.log( 'addLevel Called' );
         // create a new view and model and add it to classes and call render.
         // Create the model for the view and add it to the collection
         var regClass = new app.Models.Admin.RegClass({ parent: this.model });
         //this.model.classes.add( regClass );
         var view = new app.Views.Admin.RegClass({ model: regClass });
-        this.$el.append(view.render().el);
+        this.$el.append(view.render(true).el);
     },
 
     render: function(){
index b9cd4cf..9f5b22f 100644 (file)
@@ -163,10 +163,16 @@ class GlmMembersAdmin_registrations_events extends GlmDataRegistrationsRegEvent
 
                 // Make all arrays of arrays non-associative to make Backbone happy
                 foreach ($regEvent['reg_class'] as $k=>$v) {
-                    $regEvent['reg_class'][$k]['reg_rate'] = array_values($regEvent['reg_class'][$k]['reg_rate']);
+                    if (is_array($regEvent['reg_class'][$k]['reg_rate'])) {
+                        $regEvent['reg_class'][$k]['reg_rate'] = array_values($regEvent['reg_class'][$k]['reg_rate']);
+                    }
+                }
+                if (is_array($regEvent['reg_class'])) {
+                    $regEvent['reg_class'] = array_values($regEvent['reg_class']);
+                }
+                if (is_array($regEvent['reg_time'])) {
+                    $regEvent['reg_time'] = array_values($regEvent['reg_time']);
                 }
-                $regEvent['reg_class'] = array_values($regEvent['reg_class']);
-                $regEvent['reg_time'] = array_values($regEvent['reg_time']);
                 
                 // Separate Event, Classes, and Times and send those as separate JSONs
                 $regClassesJSON = json_encode($regEvent['reg_class']);
index 8623861..0849c3f 100644 (file)
 
         <script type="text/template" id="regEvent-template">
             <div style="margin-bottom: 1em;">
-                <a id="add-reg-level" class="button button-secondary glm-button glm-right">Add a Registration Level</a>
+                <a id="class-add" class="button button-secondary glm-button glm-right">Add a Registration Level</a>
                 <h3>Event: <%= event_name %></h3>
                 <p><%= descr %></p>
             </div>
         </script>
     
         <script type="text/template" id="regClass-template">
-            <div class="glm-class-header">
-                <div class="glm-right">
-                    <a class="delete-level button button-secondary glm-button-small">Delete Level</a>
-                    <a class="edit-level button button-secondary glm-button-small">Edit</a>
-                    <a class="add-reg-rate button button-secondary glm-button-small">Add Reg Rate</a>
-                </div>
-                <div class="glm-class-label">
-                    <h3><%= name %></h3>
+            <div class="class-display-template">
+                <div class="glm-class-header">
+                    <div class="glm-right">
+                        <a class="class-edit button button-secondary glm-button-small">Edit</a>
+                        <a class="class-add-reg-rate button button-secondary glm-button-small">Add Reg Rate</a>
+                        <a class="class-delete-level button button-secondary glm-button-small">Delete Level</a>
+                    </div>
+                    <div class="glm-class-label">
+                        <h3><%= name %></h3>
+                    </div>
                 </div>
+                <%= descr %>
             </div>
-            <%= descr %>
-            <div class="class-edit-form">
-                <input class="class-name" type="text" name="reg_name_<% if (id) { %><%- id %><% } else { %> new <% } %>" value="<% if (name) { %><%- name %><% } %>">
-                <input class="class-descr" type="text" name="reg_descr_<% if (id) { %><%- id %><% } else { %> new <% } %>" size="90" value="<% if (descr) { %><%- descr %><% } %>">
+            <div class="class-edit-template" style="display: none;">
+                <div class="glm-class-header">
+                    <div class="glm-right">
+                        <a class="class-update button glm-button-small-highlighted">Update</a>
+                        <a class="class-add-reg-rate button button-secondary glm-button-small">Add Reg Rate</a>
+                        <a class="class-delete-level button button-secondary glm-button-small">Delete Level</a>
+                    </div>
+                    <div class="glm-class-label" style="padding-bottom: .3em;">
+                        Level Name: <input class="class-name" type="text" name="class_name_<% if (id) { %><%- id %><% } else { %> new <% } %>" value="<% if (name) { %><%- name %><% } %>">
+                    </div>
+                </div>
+                Description: <input class="class-descr" type="text" name="reg_descr_<% if (id) { %><%- id %><% } else { %> new <% } %>" size="90" value="<% if (descr) { %><%- descr %><% } %>">
             </div>
         </script>
 
     {* Need to have RegEvent model created *}
     {* And create the RegClasses collection *}
     <script>
+        
+        // Start with submit not required as 0, this is incremented for each edit area opened
+        var glmSubmitRequired = 0;
+    
         //var $=jQuery.noConflict();
         var ajaxUrl = '{$ajaxUrl}?action=glm_members_admin_ajax';
         var app = {
             Views: { Admin: {} },
         };
         var regEvent = '';
+        
         jQuery(function($){
                regEvent = new app.Models.Admin.RegEvent;
             regEvent.setClasses({$regClassesJSON});
 //            regEvent.setTimes({$regTimesJSON});
             regEvent.set( {$regEventJSON} );   
             new app.Views.Admin.EventEditLevels();
+
+            // If submit is required and we're laving the page, alert the user
+            $(window).bind('beforeunload', function() {
+                if (glmSubmitRequired) {
+                    return true;
+                }
+            });
+
         });
     </script>