]> lifelog.hopto.org Git - LifeLog.git/commitdiff
Pagination of record sets, redone and fixed.
authorWill Budic <redacted>
Wed, 6 Nov 2019 01:22:50 +0000 (12:22 +1100)
committerWill Budic <redacted>
Wed, 6 Nov 2019 01:22:50 +0000 (12:22 +1100)
Current Development Check List.md
htdocs/cgi-bin/login_ctr.cgi
htdocs/cgi-bin/main.cgi
htdocs/cgi-bin/wsrc/main.js

index 6201fea5cc7472aa350f1e2b5cf68455ab24d9aa..cee6311d4712202c04d7d6c3ab5ef214ef9f4391 100644 (file)
@@ -5,13 +5,12 @@
 This version is not compatible in data structure to prior versions. Data migration is required, to transfer previous data (see ../dbLifeLog/main.cnf).
 
 ## LifeLog
-* Various system setups, not dealing well with $ENV{'home'} in multi perl environment, releases.
-* Paging of datasets to be redone.
-* &#10004; Implement sticky log entries.
-* $CUR_MTH_SVIEW - Start view page is for current month, and the sticky set.
 * Some System settings to be stored in session. As these are  known even before logon.
 > i.e. $SESSN_EXPR, $RELEASE_VER, $TIME_ZONE, $LOG_PATH
-
+* * &#10004; Various system setups, not dealing well with $ENV{'home'} in multi perl environment, releases.
+* * &#10004; Paging of datasets to be redone.
+* &#10004; Implement sticky log entries.
+* $CUR_MTH_SVIEW - Start view page is for current month, and the sticky set.
 * &#10004; Dropdown for type of log amount (Mark as Expense). Default is Asset. Asset is neither, income or expense.
 * &#10004; Implement RTF Documents.
 > Useful as more document style formated details can be added instead of just plain text.
index 902157470f2293817ac013e04d32da306a84246d..561d4e613e0dfb8f5edbb9c2e99d2e06960fc610 100755 (executable)
@@ -201,7 +201,19 @@ try{
 
         $st = $db->prepare('INSERT INTO LOG(ID_CAT,DATE,LOG) VALUES (?,?,?)');
         $st->execute( 3, $today, "DB Created!");
-      }
+    }
+
+    # From v.1.6 view use server side views, for pages and correct record by ID and PID lookups.
+    # This should make queries faster, less convulsed, and log renumeration less needed, for accurate pagination.
+    $st = $db->prepare(selSQLView('VW_LOG'));
+    $st->execute();
+    if(!$st->fetchrow_array()) {        
+        $rv = $db->do('CREATE VIEW VW_LOG AS 
+                              SELECT rowid as ID,*, (select count(rowid) from LOG as recount where a.rowid >= recount.rowid) as PID 
+                              FROM LOG as a ORDER BY DATE DESC;');
+        if($rv < 0){print "<p>Error->"& $DBI::errstri &"</p>";}
+    }
+
     $st = $db->prepare(selSQLTbl('CAT'));
     $st->execute();
     if(!$st->fetchrow_array()) {
@@ -440,6 +452,11 @@ sub selSQLTbl{
 return "SELECT name FROM sqlite_master WHERE type='table' AND name='$name';"
 }
 
+sub selSQLView{
+      my $name = $_[0];
+return "SELECT name FROM sqlite_master WHERE type='view' AND name='$name';"
+}
+
 
 sub removeOldSessions {
     opendir(DIR, $LOG_PATH);
index 34c55264d263d49d1feb91b58a4ba6df1ab6eef9..b890019fea6271a6fa39bc22fe5ed65fe4295522 100755 (executable)
@@ -40,6 +40,8 @@ our $RTF_SIZE     = 0;
 my $THEME        = 'Standard';
 my $TH_CSS       = 'main.css';
 my $BGCOL        = '#c8fff8';
+#Set to 1 to get debug help. Switch off with 0.
+my $DEBUG        = 0;
 #END OF SETTINGS
 
 
@@ -73,7 +75,8 @@ my ( $imgw, $imgh );
 
 my $log_rc      = 0;
 my $log_rc_prev = 0;
-my $log_cur_id;
+my $log_cur_id  = 0;
+my $log_top = 0;
 my $rs_keys     = $cgi->param('keywords');
 my $rs_cat_idx  = $cgi->param('category');
 my $prm_vc      = $cgi->param("vc");
@@ -83,11 +86,13 @@ my $rs_dat_to   = $cgi->param('v_to');
 my $rs_prev     = $cgi->param('rs_prev');
 my $rs_cur      = $cgi->param('rs_cur');
 my $rs_page     = $cgi->param('rs_page');
-my $stmS        = "SELECT rowid, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY from LOG WHERE";
-my $stmE        = " ORDER BY DATE DESC;";
+my $stmS        = 'SELECT ID, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY from VW_LOG WHERE';#"SELECT rowid, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY from LOG WHERE";
+my $stmE        = "";#" ORDER BY DATE DESC;";
 my $stmD        = "";
 my $sm_reset_all;
 
+
+
 my $lang  = Date::Language->new($LANGUAGE);
 my $today = DateTime->now;
 $today->set_time_zone($TIME_ZONE);
@@ -130,7 +135,7 @@ print $cgi->header(-expires => "0s", -charset => "UTF-8");
 print $cgi->start_html(
     -title   => "Personal Log",
     -BGCOLOR => $BGCOL,
-    -onload  => "loadedBody('" . $toggle . "');",
+    -onload  => "loadedBody('" . $toggle . "',$rs_cur);",
     -style   => [
         { -type => 'text/css', -src => "wsrc/$TH_CSS" },
         { -type => 'text/css', -src => 'wsrc/jquery-ui.css' },
@@ -177,7 +182,7 @@ print $cgi->start_html(
 my $rv;
 my $st;
 my $stmtCat = "SELECT ID, NAME, DESCRIPTION FROM CAT ORDER BY ID;";
-my $stmt ="SELECT rowid, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY FROM LOG WHERE STICKY =1 ORDER BY DATE DESC, rowid DESC;";
+my $stmt = "SELECT ID, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY FROM VW_LOG WHERE STICKY =1;";
 
 $st = $db->prepare($stmtCat);
 $rv = $st->execute() or die "<p>Error->" & $DBI::errstri & "</p>";
@@ -290,23 +295,23 @@ qq(<form id="frm_log" action="remove.cgi" onSubmit="return formDelValidation();"
 ###############
     &processSubmit;
 ###############
-    #
-    # Uncomment bellow to see main query statement issued!
-    #print $cgi->pre("### -> ".$stmt);
-    #
+    
     my $tfId      = 0;
     my $id        = 0;
     my $log_start = index $stmt, "<=";
     my $re_a_tag  = qr/<a\s+.*?>.*<\/a>/si;
 
+    print $cgi->pre("### -> ".$stmt) if $DEBUG;
+
     if ( $log_start > 0 ) {
 
         #check if we are at the beggining of the LOG table?
         my $stc =
-          $db->prepare('select rowid from LOG order by rowid DESC LIMIT 1;');
+          $db->prepare('SELECT PID from VW_LOG LIMIT 1;');
         $stc->execute();
         my @row = $stc->fetchrow_array();
-        if ( $row[0] == $rs_prev && $rs_cur == $rs_prev ) {
+        $log_top = $row[0];
+        if ($log_top == $rs_prev && $rs_cur == $rs_prev ) {            
             $log_start = -1;
         }
         $stc->finish();
@@ -328,11 +333,10 @@ qq(<form id="frm_log" action="remove.cgi" onSubmit="return formDelValidation();"
     &buildLog;
 
  
-    if(index ($stmt, 'rowid <=') < 1 && !$prm_vc  && !$prm_xc && !$rs_keys && !$rs_dat_from){
+    if(index ($stmt, 'PID <=') < 1 && !$prm_vc  && !$prm_xc && !$rs_keys && !$rs_dat_from){
 
-        $stmt = "SELECT rowid, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY FROM LOG WHERE STICKY != 1 ORDER BY DATE DESC, rowid DESC;";
-        #uncomment
-        #print $cgi->pre("###2 -> ".$stmt);
+        $stmt = "SELECT PID, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY FROM VW_LOG WHERE STICKY != 1;";
+        print $cgi->pre("###2 -> ".$stmt)  if $DEBUG;
         $st = $db->prepare($stmt);
         $rv = $st->execute() or die or die "<p>Error->" & $DBI::errstri & "</p>";
         if ( $rv < 0 ) {
@@ -346,7 +350,7 @@ sub buildLog {
 
     while ( my @row = $st->fetchrow_array() ) {
 
-        $id = $row[0];# rowid
+        $id = $row[0];# PID
 
         my $ct  = $hshCats{$row[1]}; #ID_CAT
         my $dt  = DateTime::Format::SQLite->parse_datetime( $row[2] );
@@ -551,6 +555,7 @@ qq(\n<img src="$lnk" width="$imgw" height="$imgh" class="tag_FRM"/>);
 
         my ( $dty, $dtf ) = $dt->ymd;
         my $dth = $dt->hms;
+        $dth .= " id=($id)" if $DEBUG;
         if ( $DATE_UNI == 1 ) {
             $dtf = $dty;
         }
@@ -610,17 +615,18 @@ qq(\n<img src="$lnk" width="$imgw" height="$imgh" class="tag_FRM"/>);
     $tas = &cam($ass);
     $tot = &cam($tot);
     
-    $log_output .= qq(<tr class="r$tfId">
+    $log_output .= qq(
+    <tr class="r$tfId">
                <td></td>
                <td></td>
                <td id="summary" colspan="4" style="text-align:right"># <i>Totals</i>: Assets[$tas] Gross[<b><i>$tot</i></b> &lt;-- $sum (<font color="red">$exp</font>)]</td>
        </tr>);
 
-    if ( $REC_LIMIT > 0 && $log_rc == $REC_LIMIT ) {
-        &buildNavigationButtons;
-    }
-
-##
+    ###
+    &buildNavigationButtons;
+    ###
+    
+    ##
     #Fetch Keywords autocomplete we go by words larger then three.
     #
     $st = $db->prepare( 'select LOG from LOG' . $stmE );
@@ -632,16 +638,6 @@ qq(\n<img src="$lnk" width="$imgw" height="$imgh" class="tag_FRM"/>);
     }
     &fetchAutocomplete;
 
-    #End of table?
-    if ( $rs_prev && $log_rc < $REC_LIMIT ) {
-        $st = $db->prepare("SELECT count(*) FROM LOG;");
-        $st->execute();
-        my @row = $st->fetchrow_array();
-        if ( $row[0] > $REC_LIMIT ) {
-            &buildNavigationButtons(1);
-        }
-    }
-
     if ( $log_rc == 0 ) {
 
         if ($stmD) {
@@ -657,13 +653,12 @@ qq(\n<img src="$lnk" width="$imgw" height="$imgh" class="tag_FRM"/>);
                        <b>Search Failed to Retrive any records on keywords: [<i>$rs_keys</i>]$criter!</b></td></tr>);
         }
         else {
-            $log_output .=
-'<tr><td colspan="5"><b>Database is New or  Empty!</b></td></tr>\n';
+            $log_output .= '<tr><td colspan="5"><b>Database is New or  Empty!</b></td></tr>\n';
         }
     }
 
     $log_output .= <<_TXT;
-<tr class="r0"><td colspan="2">Show All Again -&#62; 
+<tr class="r0"><td colspan="2">Show All hidden with &#10132;
 <a id="menu_close" href="#" onclick="return showAll();"><span  class="ui-icon ui-icon-heart" style="float:none;></span></a>
 
 <a href="#top">&#x219F;</a></td>
@@ -911,7 +906,7 @@ sub processSubmit {
                     else {
                         $rs_page++;
                     }
-                    $stmt = qq(SELECT rowid, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY from LOG where rowid <= '$rs_cur' and STICKY != 1 ORDER BY DATE DESC;);
+                    $stmt = qq(SELECT PID, ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY from VW_LOG where PID <= $rs_cur and STICKY != 1;);
                     return;
                 }
             }
@@ -934,7 +929,7 @@ sub processSubmit {
                    #last_insert_id() -> Not reliable commented out.
                    #my $gzero = $db->last_insert_id();#//$db->prepare('SELECT last_insert_rowid();');
                    $st->finish();
-                   $st = $db->prepare('SELECT rowid FROM LOG ORDER BY rowid DESC LIMIT 1;');
+                   $st = $db->prepare('SELECT ID FROM VW_LOG LIMIT 1;');
                    $st -> execute(); 
                    my @lid = $st->fetchrow_array();
                    $st = $db->prepare("SELECT DOC FROM NOTES WHERE LID = '0';"); 
@@ -1005,9 +1000,7 @@ sub processSubmit {
 }
 
     sub buildNavigationButtons {
-
-        my $is_end_of_rs = shift;
-
+        
         if ( !$log_cur_id ) {
 
         #Following is a quick hack as previous id as current minus one might not
@@ -1021,31 +1014,40 @@ sub processSubmit {
             $tfId = 1;
         }
 
-        $log_output .= qq!<tr class="r$tfId"><td></td>!;
-
-        if ( $rs_prev && $rs_prev > 0 && $log_start > 0 && $rs_page > 0 ) {
+        
+        if($REC_LIMIT == 0){
 
-            $log_output = $log_output . qq!<td><input type="hidden" value="$rs_prev"/>
-        <input type="button" onclick="submitPrev($rs_prev);return false;"
-         value="&lsaquo;&lsaquo;&ndash; Previous"/></td>!;
+            $log_output .= '';
+            $log_output .= qq!<tr class="r$tfId"><td></td><td colspan="3">
+                               <input class="ui-button" type="button" onclick="submitTop($log_top);return false;" value="Back To Page View"/>!;
 
         }
-        else {
-            $log_output .= '<td><i>Top</i></td>';
-        }
+        else{
+                if ($rs_cur < $log_top && $rs_prev && $rs_prev > 0 && $log_start > 0 && $rs_page > 0) {
 
-        $log_output .=
-'<td colspan="1"><input type="button" onclick="viewAll();return false;" value="View All"/></td>';
+                    $log_output .= qq!<tr class="r$tfId"><td></td><td colspan="3"><input class="ui-button" type="button" onclick="submitTop($log_top);return false;" value="TOP"/>&nbsp;&nbsp;
+                    <input type="hidden" value="$rs_prev"/>
+                    <input class="ui-button" type="button" onclick="submitPrev($log_rc_prev, $REC_LIMIT);return false;" value="&lsaquo;&lsaquo;&nbsp; Previous"/>&nbsp;&nbsp;!;
 
-        if ( $is_end_of_rs == 1 ) {
-            $log_output = $log_output . '<td><i>End</i></td>';
-        }
-        else {
+                }
+                else {
+                    $log_output .= '<tr class="r$tfId"><td></td><td colspan="3"><i>Top</i>&nbsp;&nbsp;&nbsp;&nbsp;';
+                }
 
-            $log_output .=
-qq!<td><input type="button" onclick="submitNext($log_cur_id);return false;"
-                                     value="Next &ndash;&rsaquo;&rsaquo;"/></td>!;
+                               
+                    $log_output .= '<input class="ui-button" type="button" onclick="viewAll();return false;" value="View All"/>&nbsp;&nbsp;';
+                
 
+                if ( $log_cur_id == 0 ) {
+                    $log_output = $log_output . '<i>End</i></td>';
+                }
+                else {
+
+                    $log_output .= qq!<input class="ui-button" type="button" onclick="submitNext($log_cur_id, $REC_LIMIT);return false;"
+                                        value="Next &nbsp;&rsaquo;&rsaquo;"/>&nbsp;&nbsp;
+                                        <input class="ui-button" type="button" onclick="submitEnd($REC_LIMIT);return false;" value="END"/></td>!;
+
+                }
         }
 
         $log_output = $log_output . '<td colspan="2"></td></tr>';
index 03d3780f272c6fad4bf337f672cca1188fdd948c..50255b873af0bc7c6ea09367f6ffb191d24483fb 100644 (file)
@@ -19,13 +19,17 @@ var RTF_DOC_RESIZED = false;
 var RTF_DOC_ORIG;
 
 
-function loadedBody(toggle) {
+function loadedBody(toggle, rs_cur) {
 
 
 
     if (toggle) {
         this.toggle("#div_srh", false);
     }
+    if(rs_cur){
+        _show_all = false;//toggle type switch
+        showAll();
+    }
     $('#ed').datetimepicker({
         dateFormat: 'yy-mm-dd',
         timeFormat: 'HH:mm:ss',
@@ -352,32 +356,58 @@ function deleteSelected() {
     return false;
 }
 
+function submitTop(top) {
+    var frm = document.getElementById("frm_entry");
+    frm.submit_is_view.value = 1;
+    frm.rs_all.value  = 0;
+    frm.rs_cur.value  = 0;
+    frm.rs_prev.value = top;
+    frm.submit_is_view.value = 1;    
+    frm.submit();
+
+    return false;
+}
 
-function submitNext(tbl_rc) {
+function submitPrev(tbl_rc, limit) {
 
     var frm = document.getElementById("frm_entry");
     frm.submit_is_view.value = 1;
     frm.rs_all.value = 0;
-    frm.rs_cur.value = tbl_rc;
+    frm.rs_cur.value = tbl_rc + limit;
+    frm.rs_prev.value = tbl_rc;
     frm.submit_is_view.value = 1;
     frm.submit();
 
     return false;
 }
 
-function submitPrev(tbl_rc) {
+function submitNext(tbl_rc, limit) {
 
     var frm = document.getElementById("frm_entry");
     frm.submit_is_view.value = 1;
     frm.rs_all.value = 0;
     frm.rs_cur.value = tbl_rc;
-    frm.rs_prev.value = tbl_rc;
+    frm.rs_prev.value = tbl_rc + limit;
     frm.submit_is_view.value = 1;
     frm.submit();
 
     return false;
 }
 
+function submitEnd(limit) {
+    var frm = document.getElementById("frm_entry");
+    frm.submit_is_view.value = 1;
+    frm.rs_all.value  = 0;
+    frm.rs_cur.value  = limit;
+    frm.rs_prev.value = limit * 2;
+    frm.submit_is_view.value = 1;
+    frm.submit();
+
+    return false;
+}
+
+
+
 function viewAll() {
 
     var frm = document.getElementById("frm_entry");