From: Will Budic Date: Wed, 6 Nov 2019 01:22:50 +0000 (+1100) Subject: Pagination of record sets, redone and fixed. X-Git-Url: https://lifelog.hopto.org/gitweb/?a=commitdiff_plain;h=7aacdbaf92bc6b6f7aca228320e0bfd260402b0d;p=LifeLog.git Pagination of record sets, redone and fixed. --- diff --git a/Current Development Check List.md b/Current Development Check List.md index 6201fea..cee6311 100644 --- a/Current Development Check List.md +++ b/Current Development Check List.md @@ -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. -* ✔ 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 - +* * ✔ Various system setups, not dealing well with $ENV{'home'} in multi perl environment, releases. +* * ✔ Paging of datasets to be redone. +* ✔ Implement sticky log entries. +* $CUR_MTH_SVIEW - Start view page is for current month, and the sticky set. * ✔ Dropdown for type of log amount (Mark as Expense). Default is Asset. Asset is neither, income or expense. * ✔ Implement RTF Documents. > Useful as more document style formated details can be added instead of just plain text. diff --git a/htdocs/cgi-bin/login_ctr.cgi b/htdocs/cgi-bin/login_ctr.cgi index 9021574..561d4e6 100755 --- a/htdocs/cgi-bin/login_ctr.cgi +++ b/htdocs/cgi-bin/login_ctr.cgi @@ -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 "

Error->"& $DBI::errstri &"

";} + } + $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); diff --git a/htdocs/cgi-bin/main.cgi b/htdocs/cgi-bin/main.cgi index 34c5526..b890019 100755 --- a/htdocs/cgi-bin/main.cgi +++ b/htdocs/cgi-bin/main.cgi @@ -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 "

Error->" & $DBI::errstri & "

"; @@ -290,23 +295,23 @@ qq(
pre("### -> ".$stmt); - # + my $tfId = 0; my $id = 0; my $log_start = index $stmt, "<="; my $re_a_tag = qr/.*<\/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(); } &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); Search Failed to Retrive any records on keywords: [$rs_keys]$criter!); } else { - $log_output .= -'Database is New or Empty!\n'; + $log_output .= 'Database is New or Empty!\n'; } } $log_output .= <<_TXT; -Show All Again -> +Show All hidden with ➔ @@ -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!!; - - if ( $rs_prev && $rs_prev > 0 && $log_start > 0 && $rs_page > 0 ) { + + if($REC_LIMIT == 0){ - $log_output = $log_output . qq! - !; + $log_output .= ''; + $log_output .= qq! + !; } - else { - $log_output .= 'Top'; - } + else{ + if ($rs_cur < $log_top && $rs_prev && $rs_prev > 0 && $log_start > 0 && $rs_page > 0) { - $log_output .= -''; + $log_output .= qq!   + +   !; - if ( $is_end_of_rs == 1 ) { - $log_output = $log_output . 'End'; - } - else { + } + else { + $log_output .= 'Top    '; + } - $log_output .= -qq!!; + + $log_output .= '  '; + + if ( $log_cur_id == 0 ) { + $log_output = $log_output . 'End'; + } + else { + + $log_output .= qq!   + !; + + } } $log_output = $log_output . ''; diff --git a/htdocs/cgi-bin/wsrc/main.js b/htdocs/cgi-bin/wsrc/main.js index 03d3780..50255b8 100644 --- a/htdocs/cgi-bin/wsrc/main.js +++ b/htdocs/cgi-bin/wsrc/main.js @@ -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");