Create login page
authorSteve Sutton <steve@gaslightmedia.com>
Tue, 29 Aug 2017 19:47:27 +0000 (15:47 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Tue, 29 Aug 2017 19:47:27 +0000 (15:47 -0400)
Ajax returns if good login or not.
Setup .nvmrc file so you can set node version easily.

12 files changed:
.nvmrc [new file with mode: 0644]
gulpfile.js
js/models/login.js
js/regApp.js
js/views/app.js
js/views/login.js
models/admin/ajax/login.php [new file with mode: 0644]
models/front/registrations/list.php
models/front/registrations/registration.php
readme.md [new file with mode: 0644]
setup/validActions.php
views/front/registrations/registration.html

diff --git a/.nvmrc b/.nvmrc
new file mode 100644 (file)
index 0000000..fac714a
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+6.11.1
index d5b7603..6c6dde3 100644 (file)
@@ -10,11 +10,11 @@ gulp.task('scripts', function(){
         .pipe(plumber())
         .pipe(uglify())
         .pipe(jshint())
-        .pipe(gulp.dest('./js/'));
+        .pipe(gulp.dest('js/'));
 });
 
 gulp.task('watch', function(){
-    gulp.watch('js/**/*.js', ['scripts']);
+    gulp.watch('js/**/*.js', {awaitWriteFinish: true}, ['scripts']);
 });
 
 gulp.task('default', ['scripts', 'watch']);
index b203915..1098f07 100644 (file)
@@ -8,6 +8,8 @@ app.Models.Login = Backbone.Model.extend({
         password: ''
     },
 
+    urlRoot: appLoginUrl,
+
     initialize: function(){
         this.on( 'invalid', function( model, error ){
             console.log( error );
index b22333f..f9911c8 100644 (file)
@@ -1 +1 @@
-app.Models.Account=Backbone.Model.extend({defaults:{name:"",email:"",parent:""},initialize:function(){this.on("invalid",function(e,t){console.log(t)})},validate:function(e,t){return void 0===e.name||""===e.name?"Need a name!":void 0===e.email||""===e.email?"Need an email address!":void 0}}),app.Models.Login=Backbone.Model.extend({defaults:{username:"",password:""},initialize:function(){this.on("invalid",function(e,t){console.log(t)})},validate:function(e,t){return void 0===e.username||""===e.username?"Username required!":void 0===e.password||""===e.password?"Password required!":void 0}}),app.Models.RegClass=Backbone.Model.extend({defaults:{reg_event:0,name:"",descr:""},initialize:function(){this.accounts=new app.Collections.Accounts,this.accounts.fetch()}}),app.Models.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.RegClasses},setClasses:function(e){this.classes.reset(e)}}),app.Models.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.Accounts=Backbone.Collection.extend({model:app.Models.Account,localStorage:new Backbone.LocalStorage("Accounts"),sync:function(e,t,n){console.log("sync called on collection. method: "+e)}}),app.Collections.RegClasses=Backbone.Collection.extend({model:app.Models.RegClass}),app.Collections.RegRates=Backbone.Collection.extend({model:app.Models.RegRate}),app.Views.Account=Backbone.View.extend({tagName:"div",className:"glm-reg-level-registrant clearfix",template:_.template($("#account-template").html()),events:{"click label":"edit","click .glm-reg-level-registrant-delete":"deleteOne","click .saveRegistrant":"close"},initialize:function(){return this.listenTo(this.model,"change",this.render),this.listenTo(this.model,"destroy",this.remove),this},render:function(){return this.$el.html(this.template(this.model.toJSON())),this.$nameInput=this.$(".editName"),this.$emailInput=this.$(".editEmail"),this},deleteOne:function(){this.model.destroy()},edit:function(){this.$el.addClass("editing"),this.$nameInput.focus()},close:function(){var e=this.$nameInput.val().trim(),t=this.$emailInput.val().trim();e&&t?this.model.save({name:e,email:t}):this.clear(),this.$el.removeClass("editing")}}),app.Views.App=Backbone.View.extend({el:"#regApp",initialize:function(){this.event=new app.Views.RegEvent({model:app.Models.regEvent}),this.render()},render:function(){return this.$el.append(this.event.render().el),this},events:{"click #appLogin":"login"},login:function(){view=new app.Views.Login({model:new app.Models.Login}),this.$el.append(view.render().el)},start:function(e){app.Models.regEvent=new app.Models.RegEvent(e.regEvent),app.Models.regEvent.setClasses(e.regEventClasses)}}),app.Views.Login=Backbone.View.extend({tagName:"div",className:"glm-reg-login",template:_.template($("#eventReg-account-login").html()),events:{"click .accountLogin":"loginToAccount","click #loginCancel":"closeLoginForm"},initialize:function(){return this},closeLoginForm:function(){return this.remove(),this},loginToAccount:function(){console.log("user: "+this.$userInput.val().trim()),console.log("password: "+this.$pwdInput.val().trim())},render:function(){return this.$el.html(this.template(this.model.toJSON())),this.$userInput=this.$(".login"),this.$pwdInput=this.$(".password"),this}}),app.Views.RegClass=Backbone.View.extend({tagName:"div",className:"glm-reg-level",template:_.template($("#regClass-template").html()),initialize:function(){return this.listenTo(this.model.accounts,"add",this.addOne),this.listenTo(this.model.accounts,"create",this.addOne),this.listenTo(this.model.accounts,"reset",this.addAll),this},events:{"click .addRegistrant":"newEntry"},newEntry:function(){this.$newName=this.$(".addName"),this.$newEmail=this.$(".addEmail"),this.$newName.val().trim()&&this.$newEmail.val().trim()&&(this.model.accounts.create({name:this.$newName.val().trim(),email:this.$newEmail.val().trim(),parent:this.model.id}),this.$newName.val(""),this.$newEmail.val(""))},render:function(){return this.$el.html(this.template(this.model.toJSON())),this},addOne:function(e){if(e.isValid()){var t=new app.Views.Account({model:e});this.$el.append(t.render().el)}},addAll:function(){this.$(".glm-reg-level").html("")}}),app.Views.RegEvent=Backbone.View.extend({tagName:"div",className:"glm-reg-event-item clearfix",template:_.template($("#regEvent-template").html()),initialize:function(){this.listenTo(this.model,"change",this.render)},render:function(){this.$el.html(this.template(this.model.toJSON()));var e=app.Models.regEvent.classes.map(function(e){return new app.Views.RegClass({model:e}).render().el});return this.$el.append(e),this}});
\ No newline at end of file
+app.Models.Account=Backbone.Model.extend({defaults:{name:"",email:"",parent:""},initialize:function(){this.on("invalid",function(e,t){console.log(t)})},validate:function(e,t){return void 0===e.name||""===e.name?"Need a name!":void 0===e.email||""===e.email?"Need an email address!":void 0}}),app.Models.Login=Backbone.Model.extend({defaults:{username:"",password:""},urlRoot:appLoginUrl,initialize:function(){this.on("invalid",function(e,t){console.log(t)})},validate:function(e,t){return void 0===e.username||""===e.username?"Username required!":void 0===e.password||""===e.password?"Password required!":void 0}}),app.Models.RegClass=Backbone.Model.extend({defaults:{reg_event:0,name:"",descr:""},initialize:function(){this.accounts=new app.Collections.Accounts,this.accounts.fetch()}}),app.Models.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.RegClasses},setClasses:function(e){this.classes.reset(e)}}),app.Models.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.Accounts=Backbone.Collection.extend({model:app.Models.Account,localStorage:new Backbone.LocalStorage("Accounts"),sync:function(e,t,n){console.log("sync called on collection. method: "+e)}}),app.Collections.RegClasses=Backbone.Collection.extend({model:app.Models.RegClass}),app.Collections.RegRates=Backbone.Collection.extend({model:app.Models.RegRate}),app.Views.Account=Backbone.View.extend({tagName:"div",className:"glm-reg-level-registrant clearfix",template:_.template($("#account-template").html()),events:{"click label":"edit","click .glm-reg-level-registrant-delete":"deleteOne","click .saveRegistrant":"close"},initialize:function(){return this.listenTo(this.model,"change",this.render),this.listenTo(this.model,"destroy",this.remove),this},render:function(){return this.$el.html(this.template(this.model.toJSON())),this.$nameInput=this.$(".editName"),this.$emailInput=this.$(".editEmail"),this},deleteOne:function(){this.model.destroy()},edit:function(){this.$el.addClass("editing"),this.$nameInput.focus()},close:function(){var e=this.$nameInput.val().trim(),t=this.$emailInput.val().trim();e&&t?this.model.save({name:e,email:t}):this.clear(),this.$el.removeClass("editing")}}),Backbone.emulateJSON=!0,Backbone.emulateHTTP=!0,app.Views.App=Backbone.View.extend({el:"#regApp",initialize:function(){this.event=new app.Views.RegEvent({model:app.Models.regEvent}),this.render()},render:function(){return this.$el.append(this.event.render().el),this},events:{"click #appLogin":"login"},login:function(){this.loginView=new app.Views.Login({model:new app.Models.Login}),this.$el.append(this.loginView.render().el),$("#appLogin").hide()},start:function(e){app.Models.regEvent=new app.Models.RegEvent(e.regEvent),app.Models.regEvent.setClasses(e.regEventClasses)}}),app.Views.Login=Backbone.View.extend({tagName:"div",className:"glm-reg-login",template:_.template($("#eventReg-account-login").html()),events:{"click .accountLogin":"loginToAccount","click #loginCancel":"closeLoginForm"},initialize:function(){return this},closeLoginForm:function(){this.remove(),$("#appLogin").show()},loginToAccount:function(){this.model.set({username:this.$userInput.val().trim(),password:this.$pwdInput.val().trim()}),this.model.save(null,{error:function(e){return console.log({error:"message"}),{error:"message"}},success:function(){this.remove()}})},render:function(){return this.$el.html(this.template(this.model.toJSON())),this.$userInput=this.$(".login"),this.$pwdInput=this.$(".password"),this}}),app.Views.RegClass=Backbone.View.extend({tagName:"div",className:"glm-reg-level",template:_.template($("#regClass-template").html()),initialize:function(){return this.listenTo(this.model.accounts,"add",this.addOne),this.listenTo(this.model.accounts,"create",this.addOne),this.listenTo(this.model.accounts,"reset",this.addAll),this},events:{"click .addRegistrant":"newEntry"},newEntry:function(){this.$newName=this.$(".addName"),this.$newEmail=this.$(".addEmail"),this.$newName.val().trim()&&this.$newEmail.val().trim()&&(this.model.accounts.create({name:this.$newName.val().trim(),email:this.$newEmail.val().trim(),parent:this.model.id}),this.$newName.val(""),this.$newEmail.val(""))},render:function(){return this.$el.html(this.template(this.model.toJSON())),this},addOne:function(e){if(e.isValid()){var t=new app.Views.Account({model:e});this.$el.append(t.render().el)}},addAll:function(){this.$(".glm-reg-level").html("")}}),app.Views.RegEvent=Backbone.View.extend({tagName:"div",className:"glm-reg-event-item clearfix",template:_.template($("#regEvent-template").html()),initialize:function(){this.listenTo(this.model,"change",this.render)},render:function(){this.$el.html(this.template(this.model.toJSON()));var e=app.Models.regEvent.classes.map(function(e){return new app.Views.RegClass({model:e}).render().el});return this.$el.append(e),this}});
\ No newline at end of file
index c46a554..00969b4 100644 (file)
@@ -1,4 +1,6 @@
 // js/views/app.js
+Backbone.emulateJSON = true;
+Backbone.emulateHTTP = true;
 
 // Event Registrant List View
 app.Views.App = Backbone.View.extend({
@@ -20,8 +22,9 @@ app.Views.App = Backbone.View.extend({
     },
 
     login: function(){
-        view = new app.Views.Login({ model: new app.Models.Login() });
-        this.$el.append( view.render().el );
+        this.loginView = new app.Views.Login({ model: new app.Models.Login() });
+        this.$el.append( this.loginView.render().el );
+        $('#appLogin').hide();
     },
 
     start: function( bootstrap ){
index 9433d67..86798a7 100644 (file)
@@ -19,12 +19,25 @@ app.Views.Login = Backbone.View.extend({
 
     closeLoginForm: function(){
         this.remove();
-        return this;
+        $('#appLogin').show();
+        return;
     },
 
     loginToAccount: function(){
-        console.log( 'user: ' + this.$userInput.val().trim() );
-        console.log( 'password: ' + this.$pwdInput.val().trim() );
+        // console.log( 'user: ' + this.$userInput.val().trim() );
+        // console.log( 'password: ' + this.$pwdInput.val().trim() );
+        this.model.set({ username: this.$userInput.val().trim(), password: this.$pwdInput.val().trim()});
+        //console.log( this.model.url() );
+        this.model.save(null, {
+            error: function(msg) {
+                console.log( {error: 'message'} );
+                return {error: 'message'};
+            },
+            success: function() {
+                //console.log( 'success login' );
+                this.remove();
+            },
+        });
         // Send data to login ajax and verify user login
     },
 
diff --git a/models/admin/ajax/login.php b/models/admin/ajax/login.php
new file mode 100644 (file)
index 0000000..f38bb5e
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * Gaslight Media Members Database
+ * PDF Output by admin-ajax
+ *
+ * PHP version 5.5
+ *
+ * @category glmWordPressPlugin
+ * @package  glmMembersDatabase
+ * @author   Chuck Scott <cscott@gaslightmedia.com>
+ * @license  http://www.gaslightmedia.com Gaslightmedia
+ * @version  0.1
+ */
+
+/**
+ * Steve Note...
+ *
+ * You can get to this using the following URL.
+ *
+ * {host}/wp-admin/admin-ajax.php?action=glm_members_admin_ajax&glm_action=login
+ *
+ * You should be able to do this as POST or GET and should be able to add and read additional parameters.
+ * I added a "mystuff" parameter to the URL above and it does output from the code in the
+ * modelAction() function below.
+ *
+ * To add another model under models/admin/ajax all you need to do is create it and add it to the
+ * setup/validActions.php file.
+ *
+ */
+
+// Load Members data abstract
+// require_once GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataImages.php';
+
+/**
+ * This class performs the work of handling images passed to it via
+ * an AJAX call that goes through the WorPress AJAX Handler.
+ *
+ */
+class GlmMembersAdmin_ajax_login
+{
+
+    /**
+     * WordPress Database Object
+     *
+     * @var $wpdb
+     * @access public
+     */
+    public $wpdb;
+    /**
+     * Plugin Configuration Data
+     *
+     * @var $config
+     * @access public
+     */
+    public $config;
+
+    /*
+     * Constructor
+     *
+     * This contructor sets up this model. At this time that only includes
+     * storing away the WordPress data object.
+     *
+     * @return object Class object
+     *
+     */
+    public function __construct ($wpdb, $config)
+    {
+
+        // Save WordPress Database object
+        $this->wpdb = $wpdb;
+
+        // Save plugin configuration object
+        $this->config = $config;
+
+        // Run constructor for data class
+        //parent::__construct(false, false);
+
+    }
+
+    /*
+     * Perform Model Action
+     *
+     * This model checks to see if the creditials passed in are correct.
+     *
+     * This model action does not return, it simply does it's work then calls die();
+     *
+     * @param $actionData
+     *
+     * Echos JSON string as response and does not return
+     */
+    public function modelAction( $actionData = false )
+    {
+        $return = false;
+
+        // Get the model from $_REQUEST
+        $jsonData = json_decode( stripslashes( $_REQUEST['model'] ) );
+
+        // Check accounts for ones that match
+        $returnPassword = $this->wpdb->get_var(
+            $this->wpdb->prepare(
+                "SELECT password
+                   FROM " . GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX .  "account
+                  WHERE email = %s",
+                $jsonData->username
+            )
+        );
+
+        if ( $returnPassword == crypt( $jsonData->password, $returnPassword ) ) {
+            header('Content-type:application/json;charset=utf-8', true);
+            json_encode( array( true ) );
+        } else {
+            echo 'error message';
+            exit();
+        }
+        wp_die();
+
+    }
+}
index 2b2cdc7..b2c7406 100644 (file)
@@ -97,7 +97,7 @@
         default:
             // Get a current list of reg events
             $listResult = $this->getSimpleRegEventsList($where.$alphaWhere, 'event_name', true, 'id', $start, $limit, true);
-            echo '<pre>$listResult: ' . print_r( $listResult, true ) . '</pre>';
+            //echo '<pre>$listResult: ' . print_r( $listResult, true ) . '</pre>';
 
             // Get paging results
             $numbDisplayed = $listResult['returned'];
index a34a9e7..cfd2d3a 100644 (file)
         //     $regEvent = array();
         // }
 
+        $regClass = $regEventSample['reg_class'][1];
+
+        unset($regClass['reg_rate']);
+
         // Compile template data
         $templateData = array(
             'entry'          => $regEventSample,
             'thisJsUrl'      => GLM_MEMBERS_REGISTRATIONS_PLUGIN_URL . '/js',
             'regEventJSON'   => json_encode( $regEventSample['reg_event'] ),
-            'regClassesJSON' => json_encode( $regEventSample['reg_class'][1] )
+            'regClassesJSON' => json_encode( $regClass )
         );
              // Return status, any suggested view, and any data to controller
         return array(
diff --git a/readme.md b/readme.md
new file mode 100644 (file)
index 0000000..311c975
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,12 @@
+# GLM Associate Event Registrations
+
+## Developers setup
+
+1. Gulp setup
+* npm install
+2. Run gulp default task
+* gulp
+
+### That's it
+Gulp will continue to watch the js files and concat/uglify them into one file
+js/regApp.js
index d268ca9..b974033 100644 (file)
@@ -59,6 +59,9 @@
 
 $glmMembersRegistrationsAddOnValidActions = array(
     'adminActions' => array(
+        'ajax' => array(
+            'login'                      => GLM_MEMBERS_REGISTRATIONS_PLUGIN_SLUG,
+        ),
         'registrations' => array(
             'index'                     => GLM_MEMBERS_REGISTRATIONS_PLUGIN_SLUG,
             'list'                      => GLM_MEMBERS_REGISTRATIONS_PLUGIN_SLUG,
@@ -78,7 +81,7 @@ $glmMembersRegistrationsAddOnValidActions = array(
     'frontActions' => array(
         'registrations' => array(
             'index'                     => GLM_MEMBERS_REGISTRATIONS_PLUGIN_SLUG
-         
+
         )
     ),
 );
index bd2bc34..19d7645 100644 (file)
@@ -1,5 +1,4 @@
 {* Event Registration App - Backbone.js *}
-<div id="eventapp"></div>
 {* Underscore Templates for the Event Registration App *}
 {literal}
 <script type="text/template" id="regEvent-template">
@@ -7,7 +6,11 @@
     <div class="glm-reg-compcode-entry">
         <input type="text" placeholder="Enter Comp Code Here" />
     </div>
-    <p> - event description - </p>
+    <div>
+        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+        <p>Maximum Registrants: <%- attendee_max %></p>
+    </div>
+
     <div class="glm-reg-entryforms clearfix">
         <div class="glm-reg-dates">
             <h4>Pick your registration dates</h4>
 {* Need to have RegEvent model created *}
 {* And create the RegClasses collection *}
 <script>
+var appLoginUrl = '{$ajaxUrl}?action=glm_members_admin_ajax&glm_action=login';
 var app = {
     Models: {},
     Collections: {},
-    Views: {}
+    Views: {},
 };
 jQuery(function($){
     app.Models.regEvent = new app.Models.RegEvent;