Hello community,

here is the log from the commit of package perl-App-MFILE-WWW for 
openSUSE:Factory checked in at 2016-11-10 13:27:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-App-MFILE-WWW (Old)
 and      /work/SRC/openSUSE:Factory/.perl-App-MFILE-WWW.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-App-MFILE-WWW"

Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-App-MFILE-WWW/perl-App-MFILE-WWW.changes    
2016-10-20 23:10:43.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.perl-App-MFILE-WWW.new/perl-App-MFILE-WWW.changes   
    2016-11-10 13:28:00.000000000 +0100
@@ -1,0 +2,31 @@
+Sat Nov  5 06:02:38 UTC 2016 - [email protected]
+
+- updated to 0.151
+   see /usr/share/doc/packages/perl-App-MFILE-WWW/Changes
+
+  
+  0.150 2016-11-03 19:22 CET
+  - Resource.pm: expose REST server URI to JavaScript side
+  - Resource.pm: export foreign site params only if defined
+  - js demo: dtable return to demoSubmenu instead of demoMenu
+  - js demo: implement a proper hook for dbrowser demo
+  - html.js: do not concatenate undefined entries
+  - html.js: use text prop to determine max length
+  - html.js: implement and use getObjStr()
+  - start.js: simplify dtable start/listen code
+  - Implement a drowselect target (widget)
+    - demo: plumb in the new "drowselect" widget
+    - demo: implement proper dtable, drowselect hooks
+    - html.js: initial HTML for drowselect widget
+    - start.js: add drowselect start and listen functions
+    - html.js: put spans around table/rowselect rows
+    - core: implement drowselect reverse video, arrow-key navigation
+    - html.js: remove potential code duplication (dtable/drowselect)
+  
+  0.151 2016-11-04 22:02 CET
+  - demo: storage and accessors for dbrowser data set
+  - demo: move rowselect demo to submenu
+  - demo: enable editing in dbrowser/drowselect demos
+  - core: refactor to eliminate code duplication (and fix a bug)
+
+-------------------------------------------------------------------

Old:
----
  App-MFILE-WWW-0.149.tar.gz

New:
----
  App-MFILE-WWW-0.151.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-App-MFILE-WWW.spec ++++++
--- /var/tmp/diff_new_pack.TDFXgT/_old  2016-11-10 13:28:01.000000000 +0100
+++ /var/tmp/diff_new_pack.TDFXgT/_new  2016-11-10 13:28:01.000000000 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           perl-App-MFILE-WWW
-Version:        0.149
+Version:        0.151
 Release:        0
 %define cpan_name App-MFILE-WWW
 Summary:        Web UI development toolkit with prototype demo app

++++++ App-MFILE-WWW-0.149.tar.gz -> App-MFILE-WWW-0.151.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/Changes 
new/App-MFILE-WWW-0.151/Changes
--- old/App-MFILE-WWW-0.149/Changes     2016-09-29 01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/Changes     2016-11-04 22:02:52.000000000 +0100
@@ -890,3 +890,27 @@
 - html.js: restore proper padding in dform
 - js: make readableDate() take full "YYYY-MM-DD HH:DD:SS+TZ"
 
+0.150 2016-11-03 19:22 CET
+- Resource.pm: expose REST server URI to JavaScript side
+- Resource.pm: export foreign site params only if defined
+- js demo: dtable return to demoSubmenu instead of demoMenu
+- js demo: implement a proper hook for dbrowser demo
+- html.js: do not concatenate undefined entries
+- html.js: use text prop to determine max length
+- html.js: implement and use getObjStr()
+- start.js: simplify dtable start/listen code
+- Implement a drowselect target (widget)
+  - demo: plumb in the new "drowselect" widget
+  - demo: implement proper dtable, drowselect hooks
+  - html.js: initial HTML for drowselect widget
+  - start.js: add drowselect start and listen functions
+  - html.js: put spans around table/rowselect rows
+  - core: implement drowselect reverse video, arrow-key navigation
+  - html.js: remove potential code duplication (dtable/drowselect)
+
+0.151 2016-11-04 22:02 CET
+- demo: storage and accessors for dbrowser data set
+- demo: move rowselect demo to submenu
+- demo: enable editing in dbrowser/drowselect demos
+- core: refactor to eliminate code duplication (and fix a bug)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/MANIFEST 
new/App-MFILE-WWW-0.151/MANIFEST
--- old/App-MFILE-WWW-0.149/MANIFEST    2016-09-29 01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/MANIFEST    2016-11-04 22:02:52.000000000 +0100
@@ -45,6 +45,7 @@
 share/js/mfile-www/dmenu-init.js
 share/js/mfile-www/dnotice-hooks.js
 share/js/mfile-www/dnotice-init.js
+share/js/mfile-www/drowselect-init.js
 share/js/mfile-www/dtable-init.js
 share/js/mfile-www/lib.js
 share/js/mfile-www/target-init.js
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/META.json 
new/App-MFILE-WWW-0.151/META.json
--- old/App-MFILE-WWW-0.149/META.json   2016-09-29 01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/META.json   2016-11-04 22:02:52.000000000 +0100
@@ -58,7 +58,7 @@
    "provides" : {
       "App::MFILE::WWW" : {
          "file" : "lib/App/MFILE/WWW.pm",
-         "version" : "0.149"
+         "version" : "0.151"
       },
       "App::MFILE::WWW::Dispatch" : {
          "file" : "lib/App/MFILE/WWW/Dispatch.pm"
@@ -73,6 +73,6 @@
          "http://opensource.org/licenses/bsd-license.php";
       ]
    },
-   "version" : "0.149",
+   "version" : "0.151",
    "x_serialization_backend" : "JSON::PP version 2.27203"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/META.yml 
new/App-MFILE-WWW-0.151/META.yml
--- old/App-MFILE-WWW-0.149/META.yml    2016-09-29 01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/META.yml    2016-11-04 22:02:52.000000000 +0100
@@ -23,7 +23,7 @@
 provides:
   App::MFILE::WWW:
     file: lib/App/MFILE/WWW.pm
-    version: '0.149'
+    version: '0.151'
   App::MFILE::WWW::Dispatch:
     file: lib/App/MFILE/WWW/Dispatch.pm
   App::MFILE::WWW::Resource:
@@ -50,5 +50,5 @@
   perl: '5.012'
 resources:
   license: http://opensource.org/licenses/bsd-license.php
-version: '0.149'
+version: '0.151'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.012'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/lib/App/MFILE/WWW/Resource.pm 
new/App-MFILE-WWW-0.151/lib/App/MFILE/WWW/Resource.pm
--- old/App-MFILE-WWW-0.149/lib/App/MFILE/WWW/Resource.pm       2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/lib/App/MFILE/WWW/Resource.pm       2016-11-04 
22:02:52.000000000 +0100
@@ -397,6 +397,11 @@
     $r .= 'loginDialogMaxLengthUsername: ' . 
$site->MFILE_WWW_LOGIN_DIALOG_MAXLENGTH_USERNAME . ',';
     $r .= 'loginDialogMaxLengthPassword: ' . 
$site->MFILE_WWW_LOGIN_DIALOG_MAXLENGTH_PASSWORD . ',';
 
+    # REST server URI
+    if ( defined( $site->DOCHAZKA_WWW_BACKEND_URI ) ) {
+        $r .= 'restURI: \'' . $site->DOCHAZKA_WWW_BACKEND_URI . '\',';
+    }
+
     # dummyParam in last position so we don't have to worry about comma/no 
comma
     $r .= 'dummyParam: null';
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/lib/App/MFILE/WWW.pm 
new/App-MFILE-WWW-0.151/lib/App/MFILE/WWW.pm
--- old/App-MFILE-WWW-0.149/lib/App/MFILE/WWW.pm        2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/lib/App/MFILE/WWW.pm        2016-11-04 
22:02:52.000000000 +0100
@@ -58,11 +58,11 @@
 
 =head1 VERSION
 
-Version 0.149
+Version 0.151
 
 =cut
 
-our $VERSION = '0.149';
+our $VERSION = '0.151';
 our @EXPORT_OK = ( '$VERSION' );
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/share/js/core/html.js 
new/App-MFILE-WWW-0.151/share/js/core/html.js
--- old/App-MFILE-WWW-0.149/share/js/core/html.js       2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/core/html.js       2016-11-04 
22:02:52.000000000 +0100
@@ -1,5 +1,5 @@
 // ************************************************************************* 
-// Copyright (c) 2014, SUSE LLC
+// Copyright (c) 2014-2016, SUSE LLC
 // 
 // All rights reserved.
 // 
@@ -109,7 +109,7 @@
                     prevVal = elem.text.length;
                 }
                 return prevVal;
-            }, arr[0].name.length);
+            }, arr[0].text.length);
             console.log("The longest entry is " + max + " characters long");
             return max;
         },
@@ -173,15 +173,112 @@
                 r = '';
             }
             return r;
-        };
+        },
+        genericTable = function (tname, tobj, targetType) {
+            return function (set) {
+
+                console.log("Generating source code of " + tname);
+                // console.log("tobj", tobj);
+                // console.log("set", set);
+                var r = '<form id="' + tobj.name + '">',
+                    entry,
+                    column,
+                    row,
+                    col,
+                    headingsentry = {},
+                    superset,
+                    maxl = [];
+
+                r += '<br><b>' + tobj.title + '</b><br><br>';
+
+                if (tobj.preamble) {
+                    r += tobj.preamble + '<br><br>';
+                }
+
+                // populate maxl array
+                tobj.entries.map(function (e) {
+                    headingsentry[e.prop] = e.text;
+                })
+                superset = set.concat([headingsentry]);
+                console.log("superset", superset);
+                for (column = 0; column < tobj.entries.length; column += 1) {
+                    console.log("Column " + column);
+                    entry = tobj.entries[column];
+                    var elems = superset.map(function (obj) {
+                        return obj[entry.prop];
+                    });
+                    var elemlengths = elems.map(function (elem) {
+                        var ep = ((elem === null) ? '' : elem).toString();
+                        return ep.length;
+                    });
+                    maxl[column] = elemlengths.reduce(function (a, b) {
+                        return (a > b) ? a : b;
+                    });
+                }
+
+                // display table header
+                for (column = 0; column < tobj.entries.length; column += 1) {
+                    entry = tobj.entries[column];
+                    if (lib.privCheck(entry.aclProfileRead)) {
+                        r += '<span style="text-decoration: underline">';
+                        r += lib.rightPadSpaces(entry.text, maxl[column]);
+                        r += '</span>';
+                    }
+                    if (column !== tobj.entries.length - 1) {
+                        r += ' ';
+                    }
+                }
+                r += '<br>';
+
+                // display table rows
+                if (set.length > 0) {
+                    for (row = 0; row < set.length; row += 1) {
+                        r += '<span id="row' + row + '">';
+                        var obj = set[row];
+                        for (column = 0; column < tobj.entries.length; column 
+= 1) {
+                            entry = tobj.entries[column];
+                            console.log("entry", entry);
+                            if (lib.privCheck(entry.aclProfileRead)) {
+                                var val = obj[entry.prop];
+                                console.log("value", val);
+                                r += lib.rightPadSpaces(val, maxl[column]);
+                            }
+                            if (column !== tobj.entries.length - 1) {
+                                r += ' ';
+                            }
+                        }
+                        r += '</span>';
+                        r += '<br>';
+                    }
+                    r += '<br>';
+                }
+
+                // Navigation menu (drowselect only)
+                if (targetType === 'drowselect') {
+                    r += 'Navigation:&nbsp;&nbsp;';
+                    r += '<span id="navBack">[\u2190] Previous </span>';
+                    r += '<span id="navForward">[\u2192] Next </span>';
+                    r += '<span id="navJumpToBegin">[\u2303\u2190] Jump to 
first </span>';
+                    r += '<span id="navJumpToEnd">[\u2303\u2192] Jump to last 
</span>';
+                    r += '<br>';
+                }
+
+               // miniMenu at the bottom: selections are target names defined
+               // in the 'miniMenu' property of the dform object
+                r += miniMenu(tobj.miniMenu);
+
+                // your choice section
+                r += yourChoice();
+
+                r += '</form>';
+                console.log("Assembled source code for " + tname + " - it has 
" + r.length + " characters");
+                return r;
+            }
+        }; // genericTable
+
 
     return {
-        demoActionFromMenu: function () {
-            return '<br><br>SAMPLE ACTION - SOMETHING IS 
HAPPENING<br><br><br>';
-        },
-        demoActionFromSubmenu: function () {
-            return '<br><br>SAMPLE ACTION - foo bar actioning 
bazness<br><br><br>';
-        },
+
         loginDialog: function () {
             var r = '';
             r += '<form id="loginform">';
@@ -196,14 +293,16 @@
             r += '<input type="submit" value="Submit"><br><br>';
             r += '</form>';
             return r;
-        },
+        }, // loginDialog
+
         logout: function () {
             var r = '';
             r += '<br><br><br>';
             r += 'You have been logged out of our humble application<br><br>';
             r += 'Have a lot of fun!<br><br><br>';
             return r;
-        },
+        }, // logout
+
         body: function () {
             var r = '';
             r += '<div class="leftright">';
@@ -234,7 +333,8 @@
             // r += appLib.fillNoticesLine();
             r += '</div>';
             return r;
-        },
+        }, // body
+
         dmenu: function (dmn) {
             console.log("Entering html.dmenu with argument " + dmn);
             // dmn is dmenu name
@@ -250,8 +350,8 @@
 
             for (i = 0; i < len; i += 1) {
                 // the entries are names of targets
-                console.log("Attempting to pull target " + dmo.entries[i]);
                 entry = target.pull(dmo.entries[i]);
+                console.log("Pulled target " + dmo.entries[i] + " with result 
", entry);
                 if (lib.privCheck(entry.aclProfile)) {
                     r += i + '. ' + entry.menuText + '<br>';
                 }
@@ -262,7 +362,8 @@
 
             r += '</form>';
             return r;
-        },
+        }, // dmenu
+
         dform: function (dfn) {
             // dfn is dform name
             // dfo is dform object
@@ -285,8 +386,12 @@
         
                 // determine characters needed for padding (based on longest
                 // entry)
-                allEntries = lib.forceArray(dfo.entriesRead);
-                allEntries = allEntries.concat(dfo.entriesWrite);
+                if (dfo.entriesRead !== undefined) {
+                    allEntries = lib.forceArray(dfo.entriesRead);
+                }
+                if (dfo.entriesWrite !== undefined) {
+                    allEntries = allEntries.concat(dfo.entriesWrite);
+                }
                 needed = maxLength(allEntries) + 2;
 
                 // READ-ONLY entries first
@@ -327,14 +432,15 @@
                 //console.log("Assembled source code for " + dfn + " - it has 
" + r.length + " characters");
                 return r;
             };
-        },
+        }, // dform
+
         dbrowser: function (dbn) {
             // dfn is dform name
             // dfo is dform object
             var dbo = target.pull(dbn);
             return function (set, pos) {
         
-                //console.log("Generating source code of dbrowser " + dbn);
+                // console.log("Generating source code of dbrowser " + dbn);
                 var r = '<form id="' + dbo.name + '">',
                     len,
                     i,
@@ -386,7 +492,8 @@
                 console.log("Assembled source code for " + dbn + " - it has " 
+ r.length + " characters");
                 return r;
             };
-        },
+        }, // dbrowser
+
         dnotice: function (dnn) {
             console.log("Entering html.dnotice with argument " + dnn);
             // dnn is dnotice name
@@ -402,95 +509,17 @@
                 r += '</div>';
                 return r;
             };
-        },
+        }, // dnotice
+
         dtable: function (dtn) {
             var dto = target.pull(dtn);
-            return function (set) {
-
-                console.log("Generating source code of dtable " + dtn);
-                console.log("dto", dto);
-                var r = '<form id="' + dto.name + '">',
-                    entry,
-                    column,
-                    row,
-                    col,
-                    headingsentry = {},
-                    superset,
-                    maxl = [];
-
-                r += '<br><b>' + dto.title + '</b><br><br>';
-
-                if (dto.preamble) {
-                    r += dto.preamble + '<br><br>';
-                }
-
-                // populate maxl array
-                dto.entries.map(function (e) {
-                    headingsentry[e.prop] = e.text;
-                })
-                superset = set.concat([headingsentry]);
-                console.log("superset", superset);
-                for (column = 0; column < dto.entries.length; column += 1) {
-                    console.log("Column " + column);
-                    entry = dto.entries[column];
-                    var elems = superset.map(function (obj) {
-                        return obj[entry.prop];
-                    });
-                    var elemlengths = elems.map(function (elem) {
-                        var ep = ((elem === null) ? '' : elem).toString();
-                        return ep.length;
-                    });
-                    maxl[column] = elemlengths.reduce(function (a, b) {
-                        return (a > b) ? a : b;
-                    });
-                }
+            return genericTable(dtn, dto, 'dtable');
+        }, // dtable
 
-                // display table header
-                for (column = 0; column < dto.entries.length; column += 1) {
-                    entry = dto.entries[column];
-                    if (lib.privCheck(entry.aclProfileRead)) {
-                        r += '<span style="text-decoration: underline">';
-                        r += lib.rightPadSpaces(entry.text, maxl[column]);
-                        r += '</span>';
-                    }
-                    if (column !== dto.entries.length - 1) {
-                        r += ' ';
-                    }
-                }
-                r += '<br>';
+        drowselect: function (drsn) {
+            var drso = target.pull(drsn);
+            return genericTable(drsn, drso, 'drowselect');
+        } // dtable
 
-                // display table rows
-                if (set.length > 0) {
-                    for (row = 0; row < set.length; row += 1) {
-                        var obj = set[row];
-                        for (column = 0; column < dto.entries.length; column 
+= 1) {
-                            entry = dto.entries[column];
-                            console.log("entry", entry);
-                            if (lib.privCheck(entry.aclProfileRead)) {
-                                var val = obj[entry.prop];
-                                console.log("value", val);
-                                r += lib.rightPadSpaces(val, maxl[column]);
-                            }
-                            if (column !== dto.entries.length - 1) {
-                                r += ' ';
-                            }
-                        }
-                        r += '<br>';
-                    }
-                    r += '<br>';
-                }
-
-               // miniMenu at the bottom: selections are target names defined
-               // in the 'miniMenu' property of the dform object
-                r += miniMenu(dto.miniMenu);
-
-                // your choice section
-                r += yourChoice();
-
-                r += '</form>';
-                console.log("Assembled source code for " + dtn + " - it has " 
+ r.length + " characters");
-                return r;
-            }
-        }
     };
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/share/js/core/lib.js 
new/App-MFILE-WWW-0.151/share/js/core/lib.js
--- old/App-MFILE-WWW-0.149/share/js/core/lib.js        2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/core/lib.js        2016-11-04 
22:02:52.000000000 +0100
@@ -44,7 +44,18 @@
     prototypes
 ) {
 
-    var heldObject = null;
+    var heldObject = null,
+        dbrowserState = {
+            "obj": null,  // the dbrowser object itself
+            "set": null,  // the dataset (array) we are browsing
+            "pos": null   // the current position within that array
+        },
+        drowselectState = {
+            "obj": null,  // the drowselect object itself
+            "set": null,  // the dataset (array) we are selecting from
+            "pos": null   // the current position within that array
+        };
+
 
     return {
 
@@ -182,7 +193,30 @@
         // convert null to empty array
         forceArray: function (arr) {
             return (arr === null) ? [] : arr;
-        }
+        },
+
+        // generate string "n objects" based on array length
+        genObjStr: function (len) {
+            return (len === 1) ?
+                '1 object' :
+                len + " objects";
+        },
+
+        // reverse-video a row (on/off)
+        reverseVideo: function (row, onoff) {
+            if (onoff === true) {
+                $('#row' + row).css('background-color','#000000');
+                $('#row' + row).css('color','#ffffff');
+            }
+            if (onoff === false) {
+                $('#row' + row).css('background-color','#d0e4fe');
+                $('#row' + row).css('color','#000000');
+            }
+        },
+
+        // dbrowser, drowselect states
+        dbrowserState: dbrowserState,
+        drowselectState: drowselectState
 
     };
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/share/js/core/start.js 
new/App-MFILE-WWW-0.151/share/js/core/start.js
--- old/App-MFILE-WWW-0.149/share/js/core/start.js      2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/core/start.js      2016-11-04 
22:02:52.000000000 +0100
@@ -109,8 +109,6 @@
         //
         // miniMenu handlers
         //
-        // mmKeyListener - generalized keypress handler for miniMenus
-        // (see below for usage)
         mmKeyListener = function (evt) {
 
             var len = $("input:text").length,
@@ -142,16 +140,8 @@
             }
 
         },
+        mmSubmit = function (tgt, obj) {
 
-        //
-        // dform handlers
-        //
-        dformSubmit = function (dfn, obj) {
-            // dfn is dform name
-            // dfo is dform object
-            var dfo = target.pull(dfn);
-        
-            //console.log("Entering MFILE.dformSubmit with argument " + dfn);
             lib.clearResult();
         
             var sel = $('input[name="sel"]').val(),
@@ -164,7 +154,7 @@
                 wlen;
         
             // if miniMenu has zero or one entries, 'Back' is the only option
-            len = dfo.miniMenu.entries.length;
+            len = tgt.miniMenu.entries.length;
             if (len === 0) {
                 console.log("Setting sel to 'X' by default because miniMenu 
has no entries");
                 sel = 'X';
@@ -173,35 +163,34 @@
                 return;
             }
         
-            // clone the object
-            newObj = $.extend({}, obj);
+            if (obj !== undefined) {
+                newObj = $.extend({}, obj);
         
-            // replace the writable properties with the values from the form
-            if (dfo.entriesWrite) {
-                wlen = dfo.entriesWrite.length;
-                for (i = 0; i < wlen; i += 1) {
-                    entry = dfo.entriesWrite[i];
-                    newObj[entry.prop] = $('#' + entry.name).val();
+                // replace the writable properties with the values from the 
form
+                if (tgt.entriesWrite) {
+                    wlen = tgt.entriesWrite.length;
+                    for (i = 0; i < wlen; i += 1) {
+                        entry = tgt.entriesWrite[i];
+                        newObj[entry.prop] = $('#' + entry.name).val();
+                    }
+                    //console.log("Modified object based on form contents", 
newObj);
                 }
-                //console.log("Modified object based on form contents", 
newObj);
             }
         
             console.log("sel === " + sel + " and len === " + len);
             if (sel >= 0 && sel <= len) {
                 //console.log("sel " + sel + " is within range");
                 // we can only select the item if we have sufficient priv level
-                selection = target.pull(dfo.miniMenu.entries[sel]);
+                selection = target.pull(tgt.miniMenu.entries[sel]);
                 if (lib.privCheck(selection.aclProfile)) {
                     //console.log('Selection ' + sel + ' passed priv check');
                     item = selection;
                 }
             } else if (sel === 'X' || sel === 'x') {
-                //console.log('dfo.menu.back:', dfo.miniMenu.back);
-                item = target.pull(dfo.miniMenu.back[1]);
+                item = target.pull(tgt.miniMenu.back[1]);
             } else {
                 console.log('Selection is ' + sel + ' (invalid) -- doing 
nothing');
             }
-        
             if (item !== undefined) {
                 //console.log("Selected " + dfn + " menu item: " + item.name);
                 // WARNING about the next line: we send the new object
@@ -217,6 +206,14 @@
                 item.start(newObj);
             }
         },
+
+        //
+        // dform handlers
+        //
+        dformSubmit = function (dfn, obj) {
+            // dfn is dform name
+            mmSubmit(target.pull(dfn), obj);
+        },
         dformListen = function (dfn, obj) {
             console.log("Listening in form " + dfn);
             var dfo = target.pull(dfn);
@@ -236,73 +233,17 @@
         },
 
         //
-        // storage for dbrowser state
-        //
-        dbrowserState = {
-            "obj": null,  // the dbrowser object itself
-            "set": null,  // the set we are browsing
-            "pos": null   // the current position within that set
-        },
-
-        //
         // dbrowser handlers
         //
         dbrowserSubmit = function () {
-            var dbo = dbrowserState.obj,
-                set = dbrowserState.set,
-                pos = dbrowserState.pos;
-            
-            console.log("Submitting browser, whatever that means: ", set[pos]);
-            lib.clearResult();
-        
-            var sel = $('input[name="sel"]').val(),
-                len,
-                i,
-                selection,
-                entry,
-                item;
-        
-            // if miniMenu has zero or one entries, 'Back' is the only option
-            len = dbo.miniMenu.entries.length;
-            if (len === 0) {
-                console.log("Setting sel to 'X' by default because miniMenu 
has no entries");
-                sel = 'X';
-            } else if (sel === '') {
-                // user hit ENTER ambiguously
-                return;
-            }
-        
-            console.log("sel === " + sel + " and len === " + len);
-            if (sel >= 0 && sel <= len) {
-                //console.log("sel " + sel + " is within range");
-                // we can only select the item if we have sufficient priv level
-                selection = target.pull(dbo.miniMenu.entries[sel]);
-                if (lib.privCheck(selection.aclProfile)) {
-                    //console.log('Selection ' + sel + ' passed priv check');
-                    item = selection;
-                }
-            } else if (sel === 'X' || sel === 'x') {
-                //console.log('dfo.menu.back:', dfo.miniMenu.back);
-                item = target.pull(dbo.miniMenu.back[1]);
-            } else {
-                console.log('Selection is ' + sel + ' (invalid) -- doing 
nothing');
-            }
-        
-            if (item !== undefined) {
-                console.log("Selected " + dbo.name + " miniMenu item " + 
item.name);
-                // WARNING about the next line: we send the current object
-                // to the selected target's start method, but it will only 
-                // be available to the start method if the target is a
-                // daction. If the target is a dform or a dbrowser, nothing
-                // will be passed in because the start methods of these
-                // target types do not have an argument. Use the 'hook'
-                // property, instead.
-                item.start(set[pos]);
-            }
+            var dbo = lib.dbrowserState.obj,
+                set = lib.dbrowserState.set,
+                pos = lib.dbrowserState.pos;
+            mmSubmit(dbo, set[pos]);
         },
         dbrowserKeyListener = function () {
-            var set = dbrowserState.set,
-                pos = dbrowserState.pos;
+            var set = lib.dbrowserState.set,
+                pos = lib.dbrowserState.pos;
             
             return function (evt) {
         
@@ -314,13 +255,13 @@
                     if (evt.ctrlKey) {
                         console.log('Listener detected CTRL-\u2190 keypress');
                         if ($("#navJumpToBegin").length) {
-                            dbrowserState.pos = 0;
+                            lib.dbrowserState.pos = 0;
                             dbrowserListen();
                         }
                     } else {
                         console.log('Listener detected \u2190 keypress');
                         if ($("#navBack").length) {
-                            dbrowserState.pos -= 1;
+                            lib.dbrowserState.pos -= 1;
                             dbrowserListen();
                         }
                     }
@@ -328,13 +269,13 @@
                     if (evt.ctrlKey) {
                         console.log('Listener detected CTRL-\u2192 keypress');
                         if ($("#navJumpToEnd").length) {
-                            dbrowserState.pos = set.length - 1;
+                            lib.dbrowserState.pos = set.length - 1;
                             dbrowserListen();
                         }
                     } else {
                         console.log('Listener detected \u2192 keypress');
                         if ($("#navForward").length) {
-                            dbrowserState.pos += 1;
+                            lib.dbrowserState.pos += 1;
                             dbrowserListen();
                         }
                     }
@@ -344,14 +285,15 @@
             };
         },
         dbrowserListen = function () {
-            var dbo = dbrowserState.obj,
-                set = dbrowserState.set,
-                pos = dbrowserState.pos;
+            var dbo = lib.dbrowserState.obj,
+                set = lib.dbrowserState.set,
+                pos = lib.dbrowserState.pos;
             
             console.log("Listening in browser " + dbo.name);
             $('#mainarea').html(dbo.source(set, pos));
             lib.holdObject(set[pos]); // hold object so hooks can get it
-            $('#result').html("Displaying no. " + (pos + 1) + " of " + 
set.length + " objects in result set");
+            $('#result').html("Displaying no. " + (pos + 1) + " of " + 
+                              lib.genObjStr(set.length) + " in result set");
             $('#' + dbo.name).submit( suppressSubmitEvent );
             $('input[name="sel"]').val('').focus();
             $('#submitButton').on("click", function (event) {
@@ -380,24 +322,12 @@
         //
         // dtable handlers
         // 
-        dtableState = {
-            "obj": null,
-            "set": null,
-        },
         dtableSubmit = function (dto) {
-            target.pull(dto.miniMenu.back[1]).start();
+            mmSubmit(dto);
         },
-        dtableListen = function () {
-            var dto = dtableState.obj,
-                set = dtableState.set,
-                msg = 'Displaying table with ';
+        dtableListen = function (dto) {
+            var set = dto.hook();
             console.log("Listening in table " + dto.name);
-            $('#mainarea').html(dto.source(set));
-            lib.holdObject(set); // hold object so hooks can get it
-            msg += (set.length === 1) ?
-                '1 object' :
-                set.length + " objects";
-            $('#result').text(msg);
             $('#' + dto.name).submit(suppressSubmitEvent);
             $('input[name="sel"]').val('').focus();
             $('#submitButton').on("click", function (event) {
@@ -406,9 +336,80 @@
                 dtableSubmit(dto);
             });
             $('#' + dto.name).on("keypress", mmKeyListener);
+        },
+
+        //
+        // drowselect handlers
+        //
+        drowselectSubmit = function () {
+            var drso = lib.drowselectState.obj;
+                set = lib.drowselectState.set,
+                pos = lib.drowselectState.pos;
+            mmSubmit(drso, set[pos]);
+        },
+        drowselectKeyListener = function () {
+            var set = lib.drowselectState.set,
+                pos = lib.drowselectState.pos;
+
+            return function (evt) {
+
+                console.log("Entering drowselectKeyListener");
+                lib.logKeyPress(evt);
+
+                if (evt.keyCode === 37) { // up arrow
+                    if (evt.ctrlKey) {
+                        console.log('Listener detected CTRL-up arrow 
keypress');
+                        lib.reverseVideo(lib.drowselectState.pos, false);
+                        lib.drowselectState.pos = 0;
+                        drowselectListen();
+                    } else {
+                        console.log('Listener detected up arrow keypress');
+                        if (lib.drowselectState.pos > 0) {
+                            lib.reverseVideo(lib.drowselectState.pos, false);
+                            lib.drowselectState.pos -= 1;
+                            drowselectListen();
+                        }
+                    }
+                } else if (evt.keyCode === 39) { // down arrow
+                    if (evt.ctrlKey) {
+                        console.log('Listener detected CTRL-down arrow 
keypress');
+                        lib.reverseVideo(lib.drowselectState.pos, false);
+                        lib.drowselectState.pos = set.length - 1;
+                        drowselectListen();
+                    } else {
+                        console.log('Listener detected down arrow keypress');
+                        if (lib.drowselectState.pos < set.length - 1) {
+                            lib.reverseVideo(lib.drowselectState.pos, false);
+                            lib.drowselectState.pos += 1;
+                            drowselectListen();
+                        }
+                    }
+                } else {
+                    mmKeyListener(evt);
+                }
+            };
+        },
+        drowselectListen = function () {
+            var drso = lib.drowselectState.obj,
+                set = lib.drowselectState.set,
+                pos = lib.drowselectState.pos;
+            $('#result').text("Displaying rowselect with " + 
lib.genObjStr(set.length));
+            $('#mainarea').html(drso.source(set));
+            lib.holdObject(set[pos]); // hold object so hooks can get it
+            lib.reverseVideo(pos, true);
+            console.log("Listening in rowselect " + drso.name);
+            $('#' + drso.name).submit(suppressSubmitEvent);
+            $('input[name="sel"]').val('').focus();
+            $('#submitButton').on("click", function (event) {
+                event.preventDefault;
+                console.log("Submitting rowselect " + drso.name);
+                drowselectSubmit();
+            });
+            $('#' + drso.name).on("keypress", drowselectKeyListener());
         };
 
     return {
+
         dmenu: function (dmn) {
             // dmn is dmenu name
             // dmo is dmenu object
@@ -421,7 +422,8 @@
                 $('#' + dmn).submit(dmenuSubmitKey(dmn));
                 $('input[name="sel"]').keydown(dmenuKeyListener(dmn));
             };
-        },
+        }, // dmenu
+
         dform: function (dfn) {
             var dfo = target.pull(dfn);
             return function () {
@@ -432,7 +434,8 @@
                 $('#mainarea').html(dfo.source(obj));
                 dformListen(dfn, obj);
             };
-        },
+        }, // dform
+
         dbrowser: function (dbn) {
             if (dbn) {
                 // when called with dbn (dbrowser name) argument, we assume
@@ -443,21 +446,22 @@
                     lib.clearResult();
                     console.log('Starting new ' + dbn + ' dbrowser');
                     // (re)initialize dbrowser state
-                    dbrowserState.obj = target.pull(dbn);
-                    dbrowserState.set = dbrowserState.obj.hook();
-                    dbrowserState.pos = 0;
+                    lib.dbrowserState.obj = target.pull(dbn);
+                    lib.dbrowserState.set = lib.dbrowserState.obj.hook();
+                    lib.dbrowserState.pos = 0;
                     // start browsing
                     dbrowserListen(); 
                 };
             } else {
                 // when called _without_ an argument, we assume that there
                 // is an existing browser state to return to
-                console.log('Returning to previous ' + dbrowserState.obj.name 
+ ' dbrowser state');
+                console.log('Returning to previous ' + 
lib.dbrowserState.obj.name + ' dbrowser state');
                 dbrowserListen();
             }
-        },
+        }, // dbrowser
+
         dbrowserListen: dbrowserListen, // export so other modules can call it
-        dbrowserState: dbrowserState, // export so other modules can modify 
browser state
+
         dnotice: function (dnn) {
             var dno = target.pull(dnn);
             return function () {
@@ -468,31 +472,46 @@
                 $('input[name="sel"]').focus();
                 dnoticeListen(dno);
             };
-        },
-        dtableListen: dtableListen, // export so other modules can call it
-        dtableState: dtableState, // export so other modules can modify 
browser state
+        }, // dnotice
+
         dtable: function (dtn) {
             var dto = target.pull(dtn);
-            if (dtn) {
-                // when called with dtn (dtable name) argument, we assume
-                // that we are being called from the second stage of dtable
+            return function () {
+                var set = dto.hook();
+                lib.clearResult();
+                console.log('Starting new ' + dtn + ' dtable');
+                $('#mainarea').html(dto.source(set));
+                $('#result').text('Displaying table with ' + 
lib.genObjStr(set.length));
+                dtableListen(dto);
+            };
+        }, // dtable
+
+        drowselect: function (drsn) {
+            var drso = target.pull(drsn);
+            if (drsn) {
+                // when called with drsn (drowselect name) argument, we assume
+                // that we are being called from the second stage of drowselect
                 // initialization (i.e., one-time event) -- generate and
-                // return the start function for this dtable
+                // return the start function for this drowselect
                 return function () {
                     lib.clearResult();
-                    console.log('Starting new ' + dtn + ' dtable');
-                    // (re)initialize dtable state
-                    dtableState.obj = target.pull(dtn);
-                    dtableState.set = dto.hook();
+                    console.log('Starting new ' + drsn + ' drowselect');
+                    // (re)initialize drowselect state
+                    lib.drowselectState.obj = target.pull(drsn);
+                    lib.drowselectState.set = drso.hook();
+                    lib.drowselectState.pos = 0;
                     // start browsing
-                    dtableListen();
+                    drowselectListen();
                 };
             } else {
                 // when called _without_ an argument, we assume that there
-                // is an existing browser state to return to
-                console.log('Returning to previous ' + dtableState.obj.name + 
' dtable state');
-                dtableListen();
+                // is an existing state to return to
+                console.log('Returning to previous ' + 
lib.drowselectState.obj.name + ' drowselect state');
+                drowselectListen();
             }
-        }
+        }, // drowselect
+
+        drowselectListen: drowselectListen // export so other modules can call 
it
+
     }
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/App-MFILE-WWW-0.149/share/js/mfile-www/daction-init.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/daction-init.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/daction-init.js  2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/daction-init.js  2016-11-04 
22:02:52.000000000 +0100
@@ -71,9 +71,30 @@
             'aclProfile': 'passerby',
             'start': dactionStart('demoActionFromSubmenu')
         }),
+        target.push('demoActionFromTable', {
+            'name': 'demoActionFromTable',
+            'type': 'daction',
+            'menuText': 'Action!',
+            'aclProfile': 'passerby',
+            'start': dactionStart('demoActionFromSubmenu')
+        }),
         //
         // dactions that you will probably want to use in your app
         //
+        target.push('saveToBrowser', {
+            'name': 'saveToBrowser',
+            'type': 'daction',
+            'menuText': 'Save',
+            'aclProfile': 'passerby',
+            'start': dactionStart('saveToBrowser')
+        }),
+        target.push('saveToRowselect', {
+            'name': 'saveToRowselect',
+            'type': 'daction',
+            'menuText': 'Save',
+            'aclProfile': 'passerby',
+            'start': dactionStart('saveToRowselect')
+        }),
         target.push('returnToBrowser', {
             'name': 'returnToBrowser',
             'type': 'daction',
@@ -81,6 +102,13 @@
             'aclProfile': 'passerby',
             'start': dactionStart('returnToBrowser')
         }),
+        target.push('returnToRowselect', {
+            'name': 'returnToRowselect',
+            'type': 'daction',
+            'menuText': 'Return to rowselect',
+            'aclProfile': 'passerby',
+            'start': dactionStart('returnToRowselect')
+        }),
         target.push('logout', {
             'name': 'logout',
             'type': 'daction',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/App-MFILE-WWW-0.149/share/js/mfile-www/daction-start.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/daction-start.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/daction-start.js 2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/daction-start.js 2016-11-04 
22:02:52.000000000 +0100
@@ -42,34 +42,54 @@
 
 define ([
     "jquery",
-    "html",
     "logout",
     "start",
-    "target"
+    "target",
+    "lib"
 ], function (
     $,
-    html,
     logout,
     start,
-    target
+    target,
+    lib
 ) {
 
     var act = {
             "demoActionFromMenu": function () {
-                $('#mainarea').html(html.demoActionFromMenu);
-                setTimeout(function () { 
-                        target.pull('demoMenu').start(); 
-                    }, 1500);
+                $('#mainarea').html(
+                    '<br><br>SAMPLE ACTION - SOMETHING IS 
HAPPENING<br><br><br>'
+                );
+                setTimeout(function () { target.pull('demoMenu').start(); }, 
1500);
             },
             "demoActionFromSubmenu": function () {
-                $('#mainarea').html(html.demoActionFromSubmenu);
-                setTimeout(function () { 
-                        target.pull('demoSubmenu').start(); 
-                    }, 1500);
+                $('#mainarea').html(
+                    '<br><br>SAMPLE ACTION - foo bar actioning 
bazness<br><br><br>'
+                );
+                setTimeout(function () { target.pull('demoSubmenu').start(); 
}, 1500);
+            },
+            "saveToBrowser": function () { 
+                console.log("Now in saveToBrowser daction");
+                lib.dbrowserState.set[lib.dbrowserState.pos] = {
+                    "prop1": $("#RWProp1").val(),
+                    "prop2": $("#RWProp2").val()
+                };
+                start.dbrowserListen();
             },
             "returnToBrowser": function () { 
                 console.log("Now in returnToBrowser daction");
-                start.dbrowser(); 
+                start.dbrowserListen(); 
+            },
+            "saveToRowselect": function () {
+                console.log("Now in saveToRowselect daction");
+                lib.drowselectState.set[lib.drowselectState.pos] = {
+                    "prop1": $("#RWProp1").val(),
+                    "prop2": $("#RWProp2").val()
+                };
+                start.drowselectListen();
+            },
+            "returnToRowselect": function () {
+                console.log("Now in returnToRowselect daction");
+                start.drowselectListen();
             },
             "logout": logout
         };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/App-MFILE-WWW-0.149/share/js/mfile-www/dbrowser-init.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/dbrowser-init.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/dbrowser-init.js 2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/dbrowser-init.js 2016-11-04 
22:02:52.000000000 +0100
@@ -38,9 +38,11 @@
 
 define ([
     'lib',
+    'app/lib',
     'target'
 ], function (
     lib,
+    appLib,
     target
 ) {
 
@@ -49,36 +51,36 @@
     //
     var entries = {        
 
-        // read-only form entry no. 1
-        'browserEntry1': {
-            name: 'browserEntry1',
-            aclProfileRead: 'passerby',
-            text: 'Entry 1',
-            prop: 'prop1',
-            maxlen: 20
-        },
-
-        // read-write form entry no. 1
-        'browserEntry2': {
-            name: 'browserEntry2',
-            aclProfileRead: 'passerby',
-            text: 'Entry 2',
-            prop: 'prop2',
-            maxlen: 20
-        }
-
-    };
+            // read-only form entry no. 1
+            'browserEntry1': {
+                name: 'browserEntry1',
+                aclProfileRead: 'passerby',
+                text: 'Entry 1',
+                prop: 'prop1',
+                maxlen: 20
+            },
+
+            // read-write form entry no. 2
+            'browserEntry2': {
+                name: 'browserEntry2',
+                aclProfileRead: 'passerby',
+                text: 'Entry 2',
+                prop: 'prop2',
+                maxlen: 20
+            }
+
+        };
+
+    appLib.setBrowserSet([
+        { prop1: 'Some information here', prop2: 1234 },
+        { prop1: null, prop2: 'Some other info' },
+        { prop1: 'Mangled crab crackers', prop2: 'Umpteen whizzles' },
+        { prop1: 'Fandango', prop2: 'Professor!' },
+        { prop1: 'Emfeebled whipple weepers', prop2: 'A godg' },
+        { prop1: 'Wuppo wannabe', prop2: 'Jumbo jamb' }
+    ]);
     
     return function () {
-        // initialize sample result set
-        lib.holdObject([
-            { prop1: 'Some information here', prop2: 1234 },
-            { prop1: null, prop2: 'Some other info' },
-            { prop1: 'Mangled crab crackers', prop2: 'Umpteen whizzles' },
-            { prop1: 'Fandango', prop2: 'Professor!' },
-            { prop1: 'Emfeebled whipple weepers', prop2: 'A godg' },
-            { prop1: 'Wuppo wannabe', prop2: 'Jumbo jamb' }
-        ]);
 
         //
         // push dbrowser object definitions onto 'target' here
@@ -91,7 +93,7 @@
             'preamble': 'This is just an illustration',
             'aclProfile': 'passerby',
             'entries': [ entries.browserEntry1, entries.browserEntry2 ],
-            'hook': lib.holdObject,
+            'hook': appLib.getBrowserSet,
             'miniMenu': {
                 entries: ['demoEditFromBrowser'],
                 back: ['Done', 'demoSubmenu']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/share/js/mfile-www/dform-init.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/dform-init.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/dform-init.js    2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/dform-init.js    2016-11-04 
22:02:52.000000000 +0100
@@ -122,14 +122,30 @@
             'preamble': 'This is just an illustration',
             'aclProfile': 'passerby',
             'entriesRead': null,
-            'entriesWrite': [ entries.RWprop1, entries.RWprop2 ],
+            'entriesWrite': [entries.RWprop1, entries.RWprop2],
             'hook': lib.holdObject,
             'miniMenu': {
-                entries: ['demoActionFromForm'],
+                entries: ['saveToBrowser'],
                 back: ['Back', 'returnToBrowser']
             }
         });
 
+        target.push('demoEditFromRowselect', {
+            'name': 'demoEditFromRowselect',
+            'type': 'dform',
+            'menuText': 'Edit',
+            'title': 'Demo edit from rowselect',
+            'preamble': 'This is just an illustration',
+            'aclProfile': 'passerby',
+            'entriesRead': null,
+            'entriesWrite': [entries.RWprop1, entries.RWprop2],
+            'hook': lib.holdObject,
+            'miniMenu': {
+                entries: ['saveToRowselect'],
+                back: ['Back', 'returnToRowselect']
+            }
+        });
+
     };
     
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/share/js/mfile-www/dmenu-init.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/dmenu-init.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/dmenu-init.js    2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/dmenu-init.js    2016-11-04 
22:02:52.000000000 +0100
@@ -50,7 +50,7 @@
             'menuText': 'Demo menu',
             'title': 'Demo menu',
             'aclProfile': 'passerby',
-            'entries': ['demoActionFromMenu', 'demoNotice', 'demoSubmenu' ],
+            'entries': ['demoActionFromMenu', 'demoNotice', 'demoSubmenu'],
             'back': 'logout'
         });
 
@@ -61,11 +61,10 @@
             'title': 'Demo submenu',
             'aclProfile': 'passerby',
             'entries': ['demoActionFromSubmenu', 'demoForm', 'demoBrowser',
-                        'demoTable'],
+                        'demoTable', 'demoRowselect'],
             'back': 'demoMenu'
         });
 
-
     };
 
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/App-MFILE-WWW-0.149/share/js/mfile-www/drowselect-init.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/drowselect-init.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/drowselect-init.js       
1970-01-01 01:00:00.000000000 +0100
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/drowselect-init.js       
2016-11-04 22:02:52.000000000 +0100
@@ -0,0 +1,107 @@
+// ************************************************************************* 
+// Copyright (c) 2014-2016, SUSE LLC
+// 
+// All rights reserved.
+// 
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// 
+// 1. Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// 
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 
+// 3. Neither the name of SUSE LLC nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+// ************************************************************************* 
+//
+// app/drowselect-init.js
+//
+// Round one of drowselect initialization (called from app/target-init)
+//
+"use strict";
+
+define ([
+    'lib',
+    'target'
+], function (
+    lib,
+    target
+) {
+
+    //
+    // define drowselect entries here
+    //
+    var entries = {
+
+            // read-only form entry no. 1
+            'rowselectEntry1': {
+                name: 'rowselectEntry1',
+                aclProfileRead: 'passerby',
+                text: 'Entry 1',
+                prop: 'prop1',
+                maxlen: 20
+            },
+    
+            // read-write form entry no. 1
+            'rowselectEntry2': {
+                name: 'rowselectEntry2',
+                aclProfileRead: 'passerby',
+                text: 'Entry 2',
+                prop: 'prop2',
+                maxlen: 20
+            }
+    
+        },
+
+        // set of objects from which to construct the rowselect
+        rowselectSet = [
+            { prop1: 'Some information here', prop2: 1234 },
+            { prop1: null, prop2: 'Some other info' },
+            { prop1: 'Mangled crab crackers', prop2: 'Umpteen whizzles' },
+            { prop1: 'Fandango', prop2: 'Professor!' },
+            { prop1: 'Emfeebled whipple weepers', prop2: 'A godg' },
+            { prop1: 'Wuppo wannabe', prop2: 'Jumbo jamb' }
+        ],
+        getRowselectSet = function () {
+            return rowselectSet;
+        };
+    
+    return function () {
+
+        //
+        // push drowselect object definitions onto 'target' here
+        //
+        target.push('demoRowselect', {
+            'name': 'demoRowselect',
+            'type': 'drowselect',
+            'menuText': 'Demonstrate rowselect',
+            'title': 'Demo rowselect',
+            'preamble': 'This is just an illustration',
+            'aclProfile': 'passerby',
+            'entries': [ entries.rowselectEntry1, entries.rowselectEntry2 ],
+            'hook': getRowselectSet,
+            'miniMenu': {
+                entries: ['demoEditFromRowselect'],
+                back: ['Done', 'demoSubmenu']
+            }
+        });
+
+    };
+    
+});
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/App-MFILE-WWW-0.149/share/js/mfile-www/dtable-init.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/dtable-init.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/dtable-init.js   2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/dtable-init.js   2016-11-04 
22:02:52.000000000 +0100
@@ -46,34 +46,38 @@
 
     var entries = {
 
-        'tableEntry1': {
-            name: 'tableEntry1',
-            aclProfileRead: 'passerby',
-            text: 'Entry 1',
-            prop: 'prop1',
-            maxlen: 20
+            'tableEntry1': {
+                name: 'tableEntry1',
+                aclProfileRead: 'passerby',
+                text: 'Entry 1',
+                prop: 'prop1',
+                maxlen: 20
+            },
+
+            'tableEntry2': {
+                name: 'tableEntry2',
+                aclProfileRead: 'passerby',
+                text: 'Entry 2',
+                prop: 'prop2',
+                maxlen: 20
+            }
+    
         },
-
-        'tableEntry2': {
-            name: 'tableEntry2',
-            aclProfileRead: 'passerby',
-            text: 'Entry 2',
-            prop: 'prop2',
-            maxlen: 20
-        }
-
-    };
-
-    return function () {
-
-        lib.holdObject([
+        
+        // set of objects from which to construct the table
+        tableSet = [
             { prop1: 'Some information here', prop2: 1234 },
             { prop1: null, prop2: 'Some other info' },
             { prop1: 'Mangled crab crackers', prop2: 'Umpteen whizzles' },
             { prop1: 'Fandango', prop2: 'Professor!' },
             { prop1: 'Emfeebled whipple weepers', prop2: 'A godg' },
             { prop1: 'Wuppo wannabe', prop2: 'Jumbo jamb' }
-        ]);
+        ],
+        getTableSet = function () {
+            return tableSet;
+        };
+    
+    return function () {
 
         target.push('demoTable', {
             'name': 'demoTable',
@@ -83,10 +87,10 @@
             'preamble': 'This is just an illustration',
             'aclProfile': 'passerby',
             'entries': [ entries.tableEntry1, entries.tableEntry2 ],
-            'hook': lib.holdObject,
+            'hook': getTableSet,
             'miniMenu': {
-                entries: ['demoEditFromBrowser'],
-                back: ['Done', 'demoMenu']
+                entries: ['demoActionFromTable'],
+                back: ['Done', 'demoSubmenu']
             }
         });
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/App-MFILE-WWW-0.149/share/js/mfile-www/lib.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/lib.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/lib.js   2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/lib.js   2016-11-04 
22:02:52.000000000 +0100
@@ -42,6 +42,8 @@
     currentUser
 ) {
 
+    var browserSet;
+
     return {
 
         //
@@ -85,7 +87,14 @@
             r += '<a href="http://sourceforge.net/p/mfile/tickets/new/";>';
             r += 'http://sourceforge.net/p/mfile/tickets/new/</a>';
             return r;
-        }   
+        },
+
+        getBrowserSet: function () {
+            return browserSet;
+        },
+        setBrowserSet: function (newBrowserSet) {
+            browserSet = newBrowserSet;
+        }
 
     };
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/App-MFILE-WWW-0.149/share/js/mfile-www/target-init.js 
new/App-MFILE-WWW-0.151/share/js/mfile-www/target-init.js
--- old/App-MFILE-WWW-0.149/share/js/mfile-www/target-init.js   2016-09-29 
01:09:53.000000000 +0200
+++ new/App-MFILE-WWW-0.151/share/js/mfile-www/target-init.js   2016-11-04 
22:02:52.000000000 +0100
@@ -44,6 +44,7 @@
     'app/dbrowser-init',
     'app/dnotice-init',
     'app/dtable-init',
+    'app/drowselect-init',
     'init2'
 ], function (
     target,
@@ -53,6 +54,7 @@
     dbrowserInitRoundOne,
     dnoticeInitRoundOne,
     dtableInitRoundOne,
+    drowselectInitRoundOne,
     initRoundTwo
 ) {
 
@@ -67,6 +69,7 @@
         dbrowserInitRoundOne();
         dnoticeInitRoundOne();
         dtableInitRoundOne();
+        drowselectInitRoundOne();
 
         // round two - add 'source' and 'start' properties
         // (widget targets only)
@@ -75,6 +78,7 @@
         initRoundTwo('dbrowser');
         initRoundTwo('dnotice');
         initRoundTwo('dtable');
+        initRoundTwo('drowselect');
 
         // return name of target to be called first (in main.js)
         return 'demoMenu';


Reply via email to