From e38504457c58e7cb4bd76d271d2699a0a9c6dc5a Mon Sep 17 00:00:00 2001 From: William Mantly Date: Wed, 31 Jul 2024 23:30:21 -0400 Subject: [PATCH] WS fixes --- nodejs/public/lib/js/jq-repeat_new.js | 31 +++++++++++++-- nodejs/utils/letsencrypt.js | 2 +- nodejs/utils/model_pubsub.js | 4 +- nodejs/utils/redis_model.js | 54 +++++++++++++-------------- nodejs/views/hosts.ejs | 46 ++++++++++++++++++----- 5 files changed, 91 insertions(+), 46 deletions(-) diff --git a/nodejs/public/lib/js/jq-repeat_new.js b/nodejs/public/lib/js/jq-repeat_new.js index 10f333e..7834eaa 100644 --- a/nodejs/public/lib/js/jq-repeat_new.js +++ b/nodejs/public/lib/js/jq-repeat_new.js @@ -68,6 +68,7 @@ MIT license //re-factor element index's for(var i = 0; i < this.length; i++){ if( i >= index){ + this[i].__jq_$el.attr( 'jq-repeat-index', i+shift ); } } @@ -81,7 +82,7 @@ MIT license //figure out new elements index var key = I + index; // apply values to template - var render = Mustache.render(this.__jqTemplate, toAdd[I] ); + var render = Mustache.render(this.__jqTemplate, toAdd[I]); //set call name and index keys to DOM element var $render = $( render ).addClass( 'jq-repeat-'+ this.__jqRepeatId ).attr( 'jq-repeat-index', key ); @@ -195,15 +196,28 @@ MIT license return []; } var object = $.extend( true, {}, this[index], update ); - return this.splice( index, 1, object )[0]; + + var $render = $(Mustache.render(this.__jqTemplate, object)); + $render.attr('jq-repeat-index', index); + this[index].__jq_$el.replaceWith($render); + + this[index].__jq_$el = $render; + this.__update(this[index].__jq_$el, this[index], this); }; + result.__put = function($el, item, list){ $el.show(); }; + result.__take = function($el, item, list){ $el.remove(); }; + result.__update = function($el, item, list){ + console.log('here', $el) + $el.show(); + }; + result.__setPut = function(fn) { Object.defineProperty(this, '__put', { value: fn, @@ -211,7 +225,7 @@ MIT license enumerable: false, configurable: true }); - } + }; result.__setTake = function(fn) { Object.defineProperty(this, '__take', { @@ -220,7 +234,16 @@ MIT license enumerable: false, configurable: true }); - } + }; + + result.__setUpdate = function(fn) { + Object.defineProperty(this, '__update', { + value: fn, + writable: true, + enumerable: false, + configurable: true + }); + }; var $this = $( element ); result.__jqRepeatId = $this.attr( 'jq-repeat' ); diff --git a/nodejs/utils/letsencrypt.js b/nodejs/utils/letsencrypt.js index af3cc06..a1141f3 100644 --- a/nodejs/utils/letsencrypt.js +++ b/nodejs/utils/letsencrypt.js @@ -11,7 +11,7 @@ class LetsEncrypt{ static AcmeClient = AcmeClient; constructor(options){ - this.loadAccountKey(options.accountKeyPath || '~/le_key', (key)=>{ + this.loadAccountKey(options.accountKeyPath || './le_key.cert', (key)=>{ this.client = new AcmeClient.Client({ directoryUrl: options.directoryUrl || AcmeClient.directory.letsencrypt.production, accountKey: key, diff --git a/nodejs/utils/model_pubsub.js b/nodejs/utils/model_pubsub.js index a352d4c..aac4056 100644 --- a/nodejs/utils/model_pubsub.js +++ b/nodejs/utils/model_pubsub.js @@ -25,11 +25,11 @@ function ModelPs(model){ }, get(target, propKey, receiver) { if(propKey == 'constructor') return target.constructor; - if(propKey === 'isproxy') return 'YESSSSSSSSS' const targetValue = Reflect.get(target, propKey, receiver); if (typeof targetValue === 'function') { return function(...args){ - let res = targetValue.apply(this, args); // (A) + // let res = targetValue.apply(this, args); // (A) + let res = Reflect.apply(targetValue, this, args); if(targetValue.constructor.name === 'AsyncFunction'){ res.then(function(res){ publish(propKey, res, ...args); diff --git a/nodejs/utils/redis_model.js b/nodejs/utils/redis_model.js index 2557fae..d540e5f 100644 --- a/nodejs/utils/redis_model.js +++ b/nodejs/utils/redis_model.js @@ -127,36 +127,33 @@ class Table{ try{ // Check to see if entry name changed. if(data[this.constructor._key] && data[this.constructor._key] !== this[this.constructor._key]){ + // Remove the index key from the tables members list. + await client.SREM( + redisPrefix(this.constructor.name), + this[this.constructor._key] + ); - // Merge the current data into with the updated data - let newData = Object.assign({}, this, data); + // Add the key to the members for this redis table + await client.SADD( + redisPrefix(this.constructor.name), + data[this.constructor._key] + ); - // Remove the updated failed so it doesnt keep it - delete newData.updated; - - // Create a new record for the updated entry. If that succeeds, - // delete the old recored - let newObject = await this.constructor.create(newData); - - if(newObject){ - await this.remove(); - return newObject; - } - }else{ - // Update what ever fields that where passed. - - // Validate the passed data, ignoring required fields. - data = objValidate.processKeys(this.constructor._keyMap, data, true); - - // Loop over the data fields and apply them to redis - for(let key of Object.keys(data)){ - this[key] = data[key]; - await client.HSET( - redisPrefix(`${this.constructor.name}_${this[this.constructor._key]}`), - key, String(data[key]) - ); - } } + // Update what ever fields that where passed. + + // Validate the passed data, ignoring required fields. + data = objValidate.processKeys(this.constructor._keyMap, data, true); + + // Loop over the data fields and apply them to redis + for(let key of Object.keys(data)){ + this[key] = data[key]; + await client.HSET( + redisPrefix(`${this.constructor.name}_${this[this.constructor._key]}`), + key, String(data[key]) + ); + } + return this; @@ -171,7 +168,6 @@ class Table{ try{ // Remove the index key from the tables members list. - await client.SREM( redisPrefix(this.constructor.name), this[this.constructor._key] @@ -183,7 +179,7 @@ class Table{ ); // Return the number of removed values to the caller. - return count; + return this; } catch(error) { throw error; diff --git a/nodejs/views/hosts.ejs b/nodejs/views/hosts.ejs index 4ebf8b9..bab83ff 100755 --- a/nodejs/views/hosts.ejs +++ b/nodejs/views/hosts.ejs @@ -54,9 +54,9 @@ } $.scope.hosts.__setPut(function($el, item, list){ - $el.addClass('bg-success'); - $el.fadeIn(1000, function(){ - $el.removeClass('bg-success'); + $el.addClass('table-success'); + $el.fadeIn(2000, function(){ + $el.removeClass('table-success'); }); }); }); @@ -64,7 +64,6 @@ function cancleHostEdit(){ $('#hostsTable').find('tr').each(function(idx, el){ - console.log('here?') $(el).removeClass('table-warning'); }); $('.editWindow').slideUp('fast'); @@ -104,7 +103,7 @@ populateHosts(); //populate the table $.scope.hosts.__setTake(function($el, item, list){ - $el.addClass('bg-danger'); + $el.addClass('table-danger'); $el.fadeOut(1000, function(){ $el.remove() }); @@ -114,6 +113,33 @@ console.log(topic, data); }); + app.subscribe(/^model:Host:create/, function(data, topic){ + let [a,b, action, host] = topic.split(':'); + + if($.scope.hosts.indexOf(host) >= 0){ + $.scope.hosts.update(host, parseHostRow(data)); + }else{ + $.scope.hosts.splice(0,0, parseHostRow(data)) + } + }); + + app.subscribe(/^model:Host:update/, function(data, topic){ + let [a,b, action, host] = topic.split(':'); + + if($.scope.hosts.indexOf(host) >= 0){ + $.scope.hosts.update(host, parseHostRow(data)); + }else{ + $.scope.hosts.splice(0,0, parseHostRow(data)) + } + }); + + + app.subscribe(/^model:Host:remove/, function(data, topic){ + let [a,b, action, host] = topic.split(':'); + + $.scope.hosts.remove(host); + }); + //search bar html event logic stolen from here // https://github.com/WebDevSimplified/js-search-bar/blob/main/script.js $('[host-search]').on("input", function() { @@ -150,11 +176,11 @@ return; } - if($.scope.hosts.indexOf(data.__requestedHost) >= 0){ - $.scope.hosts.update(data.__requestedHost, parseHostRow(data)); - }else{ - $.scope.hosts.splice(0,0, parseHostRow(data)) - } + // if($.scope.hosts.indexOf(data.__requestedHost) >= 0){ + // $.scope.hosts.update(data.__requestedHost, parseHostRow(data)); + // }else{ + // // $.scope.hosts.splice(0,0, parseHostRow(data)) + // } if(action == 'edit') $('.editWindow').slideUp('fast');