diff --git a/core/client.js b/core/client.js index 5bc795ed..76c44b7a 100644 --- a/core/client.js +++ b/core/client.js @@ -107,7 +107,6 @@ function Client(input, output) { // // Every 1m, check for idle. // - console.log('idleLogoutSeconds=' + Config.misc.idleLogoutSeconds) this.idleCheck = setInterval(function checkForIdle() { var nowMs = Date.now(); diff --git a/core/mci_view_factory.js b/core/mci_view_factory.js index 2bc14631..4000ca83 100644 --- a/core/mci_view_factory.js +++ b/core/mci_view_factory.js @@ -47,7 +47,7 @@ MCIViewFactory.prototype.getPredefinedViewLabel = function(code) { UW : this.client.user.properties.web_address, UF : this.client.user.properties.affiliation, UT : this.client.user.properties.theme_id, - MS : moment(this.client.user.properties.timestamp).format(this.client.currentTheme.helpers.getDateFormat()), + MS : moment(this.client.user.properties.account_created).format(this.client.currentTheme.helpers.getDateFormat()), SH : this.client.term.termHeight.toString(), diff --git a/core/view_controller.js b/core/view_controller.js index f11aa869..a3163791 100644 --- a/core/view_controller.js +++ b/core/view_controller.js @@ -252,6 +252,42 @@ function ViewController(options) { }); }; + // method for comparing submitted form data to configuration entries + this.actionBlockValueComparator = function(formValue, actionValue) { + // + // For a match to occur, one of the following must be true: + // + // * actionValue is a Object: + // a) All key/values must exactly match + // b) value is null; The key (view ID or "argName") must be present + // in formValue. This is a wildcard/any match. + // * actionValue is a Number: This represents a view ID that + // must be present in formValue. + // * actionValue is a string: This represents a view with + // "argName" set that must be present in formValue. + // + if(_.isNumber(actionValue) || _.isString(actionValue)) { + if(_.isUndefined(formValue[actionValue])) { + return false; + } + } else { + var actionValueKeys = Object.keys(actionValue); + for(var i = 0; i < actionValueKeys.length; ++i) { + var viewId = actionValueKeys[i]; + if(!_.has(formValue, viewId)) { + return false; + } + + if(null !== actionValue[viewId] && actionValue[viewId] !== formValue[viewId]) { + return false; + } + } + } + + self.client.log.trace( { formValue : formValue, actionValue : actionValue }, 'Action match'); + return true; + }; + if(!options.detached) { this.attachClientEvents(); } @@ -334,7 +370,7 @@ ViewController.prototype.switchFocus = function(id) { } }; -ViewController.prototype.nextFocus = function() { +ViewController.prototype.nextFocus = function() { if(!this.focusedView) { this.switchFocus(this.views[this.firstId].id); } else { @@ -421,12 +457,41 @@ ViewController.prototype.loadFromPromptConfig = function(options, cb) { callback(null); } }, - function prepareFormSubmission(callback) { + function prepareFormSubmission(callback) { if(false === self.noInput) { self.on('submit', function promptSubmit(formData) { self.client.log.trace( { formData : self.getLogFriendlyFormData(formData) }, 'Prompt submit'); - menuUtil.handleAction(self.client, formData, self.client.currentMenuModule.menuConfig); + if(_.isString(self.client.currentMenuModule.menuConfig.action)) { + menuUtil.handleAction(self.client, formData, self.client.currentMenuModule.menuConfig); + } else { + // + // Menus that reference prompts can have a sepcial "submit" block without the + // hassle of by-form-id configurations, etc. + // + // "submit" : [ + // { ... } + // ] + // + var menuSubmit = self.client.currentMenuModule.menuConfig.submit; + if(!_.isArray(menuSubmit)) { + self.client.log.debug('No configuration to handle submit'); + return; + } + + // + // Locate matching action block + // + // :TODO: this is bacially the same as for menus -- DRY it up! + for(var c = 0; c < menuSubmit.length; ++c) { + var actionBlock = menuSubmit[c]; + + if(_.isEqual(formData.value, actionBlock.value, self.actionBlockValueComparator)) { + menuUtil.handleAction(self.client, formData, actionBlock); + break; // there an only be one... + } + } + } }); } @@ -461,6 +526,7 @@ ViewController.prototype.loadFromMenuConfig = function(options, cb) { // :TODO: honor options.withoutForm // method for comparing submitted form data to configuration entries + /* var actionBlockValueComparator = function(formValue, actionValue) { // // For a match to occur, one of the following must be true: @@ -495,6 +561,7 @@ ViewController.prototype.loadFromMenuConfig = function(options, cb) { self.client.log.trace( { formValue : formValue, actionValue : actionValue }, 'Action match'); return true; }; + */ async.waterfall( [ @@ -569,7 +636,7 @@ ViewController.prototype.loadFromMenuConfig = function(options, cb) { for(var c = 0; c < confForFormId.length; ++c) { var actionBlock = confForFormId[c]; - if(_.isEqual(formData.value, actionBlock.value, actionBlockValueComparator)) { + if(_.isEqual(formData.value, actionBlock.value, self.actionBlockValueComparator)) { menuUtil.handleAction(self.client, formData, actionBlock); break; // there an only be one... } diff --git a/mods/art/MAINMENU.ANS b/mods/art/MAINMENU.ANS index 968aea28..c26cd179 100644 Binary files a/mods/art/MAINMENU.ANS and b/mods/art/MAINMENU.ANS differ diff --git a/mods/art/doortoomany.ans b/mods/art/doortoomany.ans new file mode 100644 index 00000000..e3fa4a31 Binary files /dev/null and b/mods/art/doortoomany.ans differ diff --git a/mods/art/menu_prompt.ans b/mods/art/menu_prompt.ans new file mode 100644 index 00000000..e785578d Binary files /dev/null and b/mods/art/menu_prompt.ans differ diff --git a/mods/menu.json b/mods/menu.json index 69c354c7..d77536fd 100644 --- a/mods/menu.json +++ b/mods/menu.json @@ -220,6 +220,7 @@ "mainMenu" : { "art" : "MAINMENU", "options" : { "cls" : true }, + /* "form" : { "0" : { "ET" : { @@ -254,7 +255,26 @@ } } } - } + },*/ + "prompt" : "menuCommand", + "submit" : [ + { + "value" : { "command" : "G" }, + "action" : "@menu:logoff" + }, + { + "value" : { "command" : "D" }, + "action" : "@menu:doorPimpWars" + }, + { + "value" : { "command" : "L" }, + "action" : "@menu:doorLORD" + }, + { + "value" : 1, + "action" : "@menu:mainMenu" + } + ] }, "doorPimpWars" : { "module" : "abracadabra", diff --git a/mods/prompt.json b/mods/prompt.json index d1f4744f..dafe49ad 100644 --- a/mods/prompt.json +++ b/mods/prompt.json @@ -15,6 +15,22 @@ } } }, + "menuCommand" : { + "art" : "menu_prompt.ans", + "mci" : { + "ET2" : { + "argName" : "command", + "width" : 20, + "maxLength" : 20, + "submit" : true, + "textStyle" : "U", + "focus" : true + } + } + }, + /////////////////////////////////////////////////////////////////////// + // Standard / Required + /////////////////////////////////////////////////////////////////////// "pause" : { // // Any menu 'pause' will use this prompt @@ -40,7 +56,8 @@ * echoKey : false */ - }/*, + } + /*, "standard" : { // any menu 'pause' will display this, pause for a key, then erase and move on "pause" : {