diff --git a/core/client.js b/core/client.js index 9907862e..9ed32132 100644 --- a/core/client.js +++ b/core/client.js @@ -431,7 +431,7 @@ Client.prototype.address = function() { Client.prototype.gotoMenuModule = function(options, cb) { var self = this; - assert(options.name); + assert(_.isString(options.name), 'Missing options.name'); // Assign a default missing module handler callback if none was provided var callbackOnErrorOnly = !_.isFunction(cb); @@ -452,9 +452,17 @@ Client.prototype.gotoMenuModule = function(options, cb) { } else { self.log.debug( { menuName : options.name }, 'Goto menu module'); - modInst.enter(self); + if(self.currentMenuModule) { + self.lastMenuModuleInfo = { + name : self.currentMenuModule.modInfo.name, + extraArgs : self.currentMenuModuleExtraArgs, + }; + } - self.currentMenuModule = modInst; + modInst.enter(self); + + self.currentMenuModule = modInst; // :TODO: should probably be before enter() above + self.currentMenuModuleExtraArgs = options.extraArgs; if(!callbackOnErrorOnly) { cb(null); @@ -464,7 +472,16 @@ Client.prototype.gotoMenuModule = function(options, cb) { }; Client.prototype.fallbackMenuModule = function(cb) { + var self = this; + if(self.lastMenuModuleInfo) { + var modOpts = { + name : self.lastMenuModuleInfo.name, + extraArgs : self.lastMenuModuleInfo.extraArgs, + }; + + self.gotoMenuModule(modOpts, cb); + } }; /////////////////////////////////////////////////////////////////////////////// diff --git a/core/fse.js b/core/fse.js index f9dc034a..f1878b19 100644 --- a/core/fse.js +++ b/core/fse.js @@ -43,12 +43,18 @@ exports.moduleInfo = { TL10 - Message ID TL11 - Reply to message ID + TL12 - User1 + TL13 - User2 + Footer - Viewing HM1 - Menu (prev/next/etc.) TL6 - Message number TL7 - Message total (in area) + TL12 - User1 (fmt message object) + TL13 - User2 + */ var MCICodeIds = { @@ -64,6 +70,10 @@ var MCICodeIds = { HashTags : 9, MessageID : 10, ReplyToMsgID : 11 + }, + ViewModeFooter : { + MsgNum : 6, + MsgTotal : 7, } }; @@ -150,6 +160,7 @@ function FullScreenEditorModule(options) { if(self.isReady) { self.initHeaderViewMode(); + self.initFooterViewMode(); var bodyMessageView = self.viewControllers.body.getView(1); if(bodyMessageView && _.has(self, 'message.message')) { @@ -181,7 +192,7 @@ function FullScreenEditorModule(options) { // Body : We must find this in the config / theme // // :TODO: don't hard code this -- allow footer height to be part of theme/etc. - self.client.term.rawWrite(ansi.goto(23, 1)); + self.client.term.rawWrite(ansi.goto(24, 1)); callback(null); }, function clearFooterArea(callback) { @@ -401,6 +412,7 @@ function FullScreenEditorModule(options) { case 'view' : if(self.message) { self.initHeaderViewMode(); + self.initFooterViewMode(); var bodyMessageView = self.viewControllers.body.getView(1); if(bodyMessageView && _.has(self, 'message.message')) { @@ -502,6 +514,19 @@ function FullScreenEditorModule(options) { setHeaderText(MCICodeIds.ViewModeHeader.ReplyToMsgID, self.message.replyToMessageId); }; + this.initFooterViewMode = function() { + + function setFooterText(id, text) { + var v = self.viewControllers.footerView.getView(id); + if(v) { + v.setText(text); + } + } + + setFooterText(MCICodeIds.ViewModeFooter.MsgNum, (self.messageIndex + 1).toString()); + setFooterText(MCICodeIds.ViewModeFooter.MsgTotal, self.messageTotal.toString()); + }; + this.displayHelp = function() { self.client.term.rawWrite(ansi.resetScreen()); diff --git a/core/mci_view_factory.js b/core/mci_view_factory.js index dc82b4bf..2adb019f 100644 --- a/core/mci_view_factory.js +++ b/core/mci_view_factory.js @@ -62,6 +62,8 @@ 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, + UC : this.client.user.properties.login_count.toString(), + MS : moment(this.client.user.properties.account_created).format(this.client.currentTheme.helpers.getDateFormat()), CS : this.client.currentStatus, MD : getCurrentMenuDescription(), diff --git a/core/menu_module.js b/core/menu_module.js index 5fc80b50..dd295810 100644 --- a/core/menu_module.js +++ b/core/menu_module.js @@ -16,6 +16,8 @@ var _ = require('lodash'); exports.MenuModule = MenuModule; +// :TODO: some of this is a bit off... should pause after finishedLoading() + function MenuModule(options) { PluginModule.call(this, options); diff --git a/mods/menu.json b/mods/menu.json index 5f98d1e7..1f46d9da 100644 --- a/mods/menu.json +++ b/mods/menu.json @@ -63,7 +63,7 @@ "*" : [ { "value" : { "1" : 0 }, - "action" : "@menu:login" + "action" : "@menu:login2" }, { "value" : { "1" : 1 }, @@ -86,8 +86,8 @@ // :TODO: may want { "prompt" : { "name" : "blah", "action" : ... }} "prompt" : "userCredentials", "fallback" : "matrix", - //"next" : "fullLoginSequenceLoginArt", - "next" : "messageArea", + "next" : "fullLoginSequenceLoginArt", + //"next" : "messageArea", "action" : "@systemMethod:login", // :TODO: support alt submit method for prompts @@ -104,6 +104,45 @@ "cls" : true } }, + "login2" : { + "art" : "USRCRED", + "fallback" : "matrix", + "next" : "fullLoginSequenceLoginArt", + "options" : { "cls" : true }, + "form" : { + "0" : { + "mci" : { + "ET1" : { + "width" : 20, + "maxLength" : "@config:users.usernameMax", + "argName" : "username", + "focus" : true + }, + "ET2" : { + "width" : 20, + "password" : true, + "maxLength" : "@config:users.passwordMax", + "argName" : "password", + "submit" : true + } + }, + "submit" : { + "*" : [ + { + "value" : { "password" : null }, + "action" : "@systemMethod:login" + } + ] + }, + "actionKeys" : [ + { + "keys" : [ "escape" ], + "action" : "@menu:matrix" + } + ] + } + } + }, "logoff" : { "art" : "LOGOFF", "action" : "@systemMethod:logoff", @@ -205,10 +244,15 @@ "config" : { "dateTimeFormat" : "ddd MMM Do h:mm a" }, + "action" : "@menu:fullLoginSequenceSysStats" + }, + "fullLoginSequenceSysStats" : { + "art" : "SYSSTAT", + "options" : { "cls" : true, "pause" : true }, "action" : "@menu:fullLoginSequenceUserStats" }, "fullLoginSequenceUserStats" : { - "art" : "userstats", + "art" : "USRSTAT", "options" : { "cls" : true, "pause" : true }, "action" : "@menu:mainMenu" }, @@ -223,7 +267,8 @@ //"action" : "@menu:lastCallers" }, "mainMenu" : { - "art" : "MAINMENU", + "art" : "MMENU1", + "desc" : "Main Menu", "options" : { "cls" : true }, "prompt" : "menuCommand", "submit" : [ @@ -235,10 +280,20 @@ "value" : { "command" : "D" }, "action" : "@menu:doorPimpWars" }, + /* { "value" : { "command" : "L" }, "action" : "@menu:doorLORD" }, + */ + { + "value" : { "command" : "L" }, + "action" : "@menu:mainMenuLastCallers" + }, + { + "value" : { "command" : "U" }, + "action" : "@menu:mainMenuUserStats" + }, { "value" : { "command" : "M" }, "action" : "@menu:messageArea" @@ -249,6 +304,20 @@ } ] }, + "mainMenuLastCallers" : { + "module" : "last_callers", + "art" : "LASTCALL", + "options" : { "cls" : true, "pause" : true }, + "config" : { + "dateTimeFormat" : "ddd MMM Do h:mm a" + }, + "action" : "@menu:mainMenu" + }, + "mainMenuUserStats" : { + "art" : "USRSTAT", + "options" : { "cls" : true, "pause" : true }, + "action" : "@menu:mainMenu" + }, /////////////////////////////////////////////////////////////////////// // Message Area Related /////////////////////////////////////////////////////////////////////// @@ -365,11 +434,11 @@ "fallback" : "messageArea", // :TODO: remove once default fallback is in place "config" : { "art" : { - "header" : "msg_area_view_header", + "header" : "MSGVHDR", "body" : "demo_fse_netmail_body.ans", "footerEdit" : "demo_fse_netmail_footer_edit.ans", "footerEditMenu" : "demo_fse_netmail_footer_edit_menu.ans", - "footerView" : "msg_area_footer_view.ans", + "footerView" : "MSGVFTR", "help" : "demo_fse_netmail_help.ans" }, "editorMode" : "view", @@ -379,20 +448,21 @@ "0" : { "mci" : { "TL1" : { - "width" : 36 + "width" : 27 }, "TL2" : { - "width" : 36 + "width" : 27 }, "TL3" : { - "width" : 39, + //"width" : 39, + "width" : 27, "textOverflow" : "..." }, "TL5" : { - "width" : 19 + "width" : 27 }, "MA5" : { - "width" : 19, + "width" : 27, "textOverflow" : "..." } } @@ -402,7 +472,7 @@ "mci" : { "MT1" : { "width" : 79, - "height" : 17, + "height" : 12, "mode" : "preview" } }, @@ -435,43 +505,53 @@ } }, "4" : { - "HM" : { - "mci" : { - "HM1" : { - // (P)rev/(N)ext/Post/(R)eply/(Q)uit/(?)Help - // (#)Jump/(L)Index (msg list)/Last - "items" : [ "Prev", "Next", "Reply", "Quit", "Help" ] - } - }, - "submit" : { - "*" : [ - { - "value" : { "1" : 0 }, - "action" : "@method:prevMessage" - }, - { - "value" : { "1" : 1 }, - "action" : "@method:nextMessage" - }, - { - "value" : { "1" : 3 }, - "action" : "@menu:messageArea" - } - ] - }, - "actionKeys" : [ - /* + "mci" : { + "HM1" : { + // (P)rev/(N)ext/Post/(R)eply/(Q)uit/(?)Help + // (#)Jump/(L)Index (msg list)/Last + "items" : [ "Prev", "Next", "Reply", "Quit", "Help" ] + } + }, + "submit" : { + "*" : [ { - "keys" : [ "escape" ], - "action" : "@method:editModeEscPressed" // :TODO: fixme + "value" : { "1" : 0 }, + "action" : "@method:prevMessage" + }, + { + "value" : { "1" : 1 }, + "action" : "@method:nextMessage" }, - */ { - "keys" : [ "down arrow", "up arrow", "page up", "page down" ], - "action" : "@method:movementKeyPressed" + "value" : { "1" : 3 }, + "action" : "@menu:messageArea" } ] - } + }, + "actionKeys" : [ + /* + { + "keys" : [ "escape" ], + "action" : "@method:editModeEscPressed" // :TODO: fixme + }, + */ + { + "keys" : [ "P", "p" ], + "action" : "@method:prevMessage" + }, + { + "keys" : [ "N", "n" ], + "action" : "@method:nextMessage" + }, + { + "keys" : [ "escape", "Q", "q" ], + "action" : "@menu:messageArea" + }, + { + "keys" : [ "down arrow", "up arrow", "page up", "page down" ], + "action" : "@method:movementKeyPressed" + } + ] } } }, diff --git a/mods/themes/NU-MAYA/MMENU1.ANS b/mods/themes/NU-MAYA/MMENU1.ANS new file mode 100644 index 00000000..68c690f3 Binary files /dev/null and b/mods/themes/NU-MAYA/MMENU1.ANS differ diff --git a/mods/themes/NU-MAYA/MSGVFTR1.ANS b/mods/themes/NU-MAYA/MSGVFTR1.ANS new file mode 100644 index 00000000..fbc6074d Binary files /dev/null and b/mods/themes/NU-MAYA/MSGVFTR1.ANS differ diff --git a/mods/themes/NU-MAYA/MSGVHDR1.ANS b/mods/themes/NU-MAYA/MSGVHDR1.ANS new file mode 100644 index 00000000..a3a45dfe Binary files /dev/null and b/mods/themes/NU-MAYA/MSGVHDR1.ANS differ diff --git a/mods/themes/NU-MAYA/SYSSTAT1.ANS b/mods/themes/NU-MAYA/SYSSTAT1.ANS new file mode 100644 index 00000000..57211932 Binary files /dev/null and b/mods/themes/NU-MAYA/SYSSTAT1.ANS differ diff --git a/mods/themes/NU-MAYA/USRCRED1.ANS b/mods/themes/NU-MAYA/USRCRED1.ANS new file mode 100644 index 00000000..cd090c7e Binary files /dev/null and b/mods/themes/NU-MAYA/USRCRED1.ANS differ diff --git a/mods/themes/NU-MAYA/USRSTAT1.ANS b/mods/themes/NU-MAYA/USRSTAT1.ANS new file mode 100644 index 00000000..e14289d9 Binary files /dev/null and b/mods/themes/NU-MAYA/USRSTAT1.ANS differ diff --git a/mods/themes/NU-MAYA/theme.json b/mods/themes/NU-MAYA/theme.json index e5ce669c..670e4c5f 100644 --- a/mods/themes/NU-MAYA/theme.json +++ b/mods/themes/NU-MAYA/theme.json @@ -62,6 +62,11 @@ "width" : 17, "textOverflow" : "..." } + }, + "messageAreaViewPost" : { + "TL3" : { + "width" : 25 + } } }, "prompts" : {