From: Steve Sutton Date: Tue, 29 Aug 2017 19:47:27 +0000 (-0400) Subject: Create login page X-Git-Tag: v1.0.0^2~434 X-Git-Url: http://cvs2.gaslightmedia.com/gitweb/?a=commitdiff_plain;h=f6af4a64e70386737e91e6a913829a019c6a4e5e;p=WP-Plugins%2Fglm-member-db-registrations.git Create login page Ajax returns if good login or not. Setup .nvmrc file so you can set node version easily. --- diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..fac714a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +6.11.1 diff --git a/gulpfile.js b/gulpfile.js index d5b7603..6c6dde3 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -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']); diff --git a/js/models/login.js b/js/models/login.js index b203915..1098f07 100644 --- a/js/models/login.js +++ b/js/models/login.js @@ -8,6 +8,8 @@ app.Models.Login = Backbone.Model.extend({ password: '' }, + urlRoot: appLoginUrl, + initialize: function(){ this.on( 'invalid', function( model, error ){ console.log( error ); diff --git a/js/regApp.js b/js/regApp.js index b22333f..f9911c8 100644 --- a/js/regApp.js +++ b/js/regApp.js @@ -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 diff --git a/js/views/app.js b/js/views/app.js index c46a554..00969b4 100644 --- a/js/views/app.js +++ b/js/views/app.js @@ -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 ){ diff --git a/js/views/login.js b/js/views/login.js index 9433d67..86798a7 100644 --- a/js/views/login.js +++ b/js/views/login.js @@ -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 index 0000000..f38bb5e --- /dev/null +++ b/models/admin/ajax/login.php @@ -0,0 +1,119 @@ + + * @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(); + + } +} diff --git a/models/front/registrations/list.php b/models/front/registrations/list.php index 2b2cdc7..b2c7406 100644 --- a/models/front/registrations/list.php +++ b/models/front/registrations/list.php @@ -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 '
$listResult: ' . print_r( $listResult, true ) . '
'; + //echo '
$listResult: ' . print_r( $listResult, true ) . '
'; // Get paging results $numbDisplayed = $listResult['returned']; diff --git a/models/front/registrations/registration.php b/models/front/registrations/registration.php index a34a9e7..cfd2d3a 100644 --- a/models/front/registrations/registration.php +++ b/models/front/registrations/registration.php @@ -114,12 +114,16 @@ // $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 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 diff --git a/setup/validActions.php b/setup/validActions.php index d268ca9..b974033 100644 --- a/setup/validActions.php +++ b/setup/validActions.php @@ -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 - + ) ), ); diff --git a/views/front/registrations/registration.html b/views/front/registrations/registration.html index bd2bc34..19d7645 100644 --- a/views/front/registrations/registration.html +++ b/views/front/registrations/registration.html @@ -1,5 +1,4 @@ {* Event Registration App - Backbone.js *} -
{* Underscore Templates for the Event Registration App *} {literal}