diff --git a/agc_2-X/trunk/UPGRADE b/agc_2-X/trunk/UPGRADE index ded528df..3f9d10c1 100644 --- a/agc_2-X/trunk/UPGRADE +++ b/agc_2-X/trunk/UPGRADE @@ -265,6 +265,9 @@ OTHER CHANGES: 70. Added phone outbound alt caller ID to allow for phone-dialed calls to use a separate CID number when dialing through a specific context +71. Added display of admin change differences to last change on the change + detail page + diff --git a/agc_2-X/trunk/www/vicidial/admin.php b/agc_2-X/trunk/www/vicidial/admin.php index e1b415c1..213d5bf1 100644 --- a/agc_2-X/trunk/www/vicidial/admin.php +++ b/agc_2-X/trunk/www/vicidial/admin.php @@ -3822,12 +3822,13 @@ else # 160514-1437 - Added ofcom_uk_drop_calc option # 160517-1927 - formatting fixes # 160602-1450 - Hiding email group settings that are not needed +# 160611-2230 - Added diff to last change on admin change detail display # # make sure you have added a user to the vicidial_users MySQL table with at least user_level 9 to access this page the first time -$admin_version = '2.12-558a'; -$build = '160602-1450'; +$admin_version = '2.12-559a'; +$build = '160611-2230'; $STARTtime = date("U"); $SQLdate = date("Y-m-d H:i:s"); @@ -36097,10 +36098,37 @@ if ($ADD==730000000000000) echo ""._QXZ("NOTES").": "; echo "$row[8]"; echo "\n"; + $new_sql = $row[9]; $row[9] = preg_replace('/\',/i', '\' ,',$row[9]); $row[9] = preg_replace("/\|/","
",$row[9]); echo ""._QXZ("SQL").": "; echo "

$row[9]"; + + $stmt="SELECT admin_log_id,event_date,val.user,ip_address,event_section,event_type,record_id,event_code,event_notes,event_sql,full_name,val.user_group from vicidial_admin_log val, vicidial_users vu where event_section='$row[4]' and event_type='$row[5]' and record_id='$row[6]' and event_code='$row[7]' and admin_log_id < $row[0] and val.user=vu.user $valLOGadmin_viewable_groupsSQL order by admin_log_id desc;"; + if ($DB > 0) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $last_to_print = mysqli_num_rows($rslt); + + if ($last_to_print > 0) + { + $rowx=mysqli_fetch_row($rslt); + echo "\n"; + echo "
"._QXZ("DIFF TO LAST CHANGE")."
"._QXZ("ID").": $rowx[0]          "._QXZ("DATE TIME").": $rowx[1]          "._QXZ("USER").": $rowx[2]
"; + echo ""; + + // include the Diff class + require_once './class.Diff.php'; + + $new_sql = preg_replace('/\',/i', '\' ,',$new_sql); + $new_sql = preg_replace('/ ,/', "\n",$new_sql); + $rowx[9] = preg_replace('/\',/i', '\' ,',$rowx[9]); + $rowx[9] = preg_replace('/ ,/', "\n",$rowx[9]); + + // output the result of comparing two files as HTML + echo Diff::toTable(Diff::compare($rowx[9], $new_sql)); + } + + echo ""; echo "\n"; echo "

\n"; echo "\n"; diff --git a/agc_2-X/trunk/www/vicidial/admin_header.php b/agc_2-X/trunk/www/vicidial/admin_header.php index 4118872f..baa95fdd 100644 --- a/agc_2-X/trunk/www/vicidial/admin_header.php +++ b/agc_2-X/trunk/www/vicidial/admin_header.php @@ -64,6 +64,7 @@ # 160404-0934 - design changes # 160429-1014 - Added admin_row_click option # 160507-2324 - Added screen colors section +# 160611-2229 - Added style for diff on admin changes # @@ -1245,6 +1246,54 @@ echo "\n"; = $start && $end2 >= $start + && $sequence1[$end1] == $sequence2[$end2]){ + $end1 --; + $end2 --; + } + + // compute the table of longest common subsequence lengths + $table = self::computeTable($sequence1, $sequence2, $start, $end1, $end2); + + // generate the partial diff + $partialDiff = + self::generatePartialDiff($table, $sequence1, $sequence2, $start); + + // generate the full diff + $diff = array(); + for ($index = 0; $index < $start; $index ++){ + $diff[] = array($sequence1[$index], self::UNMODIFIED); + } + while (count($partialDiff) > 0) $diff[] = array_pop($partialDiff); + for ($index = $end1 + 1; + $index < ($compareCharacters ? strlen($sequence1) : count($sequence1)); + $index ++){ + $diff[] = array($sequence1[$index], self::UNMODIFIED); + } + + // return the diff + return $diff; + + } + + /* Returns the diff for two files. The parameters are: + * + * $file1 - the path to the first file + * $file2 - the path to the second file + * $compareCharacters - true to compare characters, and false to compare + * lines; this optional parameter defaults to false + */ + public static function compareFiles( + $file1, $file2, $compareCharacters = false){ + + // return the diff of the files + return self::compare( + file_get_contents($file1), + file_get_contents($file2), + $compareCharacters); + + } + + /* Returns the table of longest common subsequence lengths for the specified + * sequences. The parameters are: + * + * $sequence1 - the first sequence + * $sequence2 - the second sequence + * $start - the starting index + * $end1 - the ending index for the first sequence + * $end2 - the ending index for the second sequence + */ + private static function computeTable( + $sequence1, $sequence2, $start, $end1, $end2){ + + // determine the lengths to be compared + $length1 = $end1 - $start + 1; + $length2 = $end2 - $start + 1; + + // initialise the table + $table = array(array_fill(0, $length2 + 1, 0)); + + // loop over the rows + for ($index1 = 1; $index1 <= $length1; $index1 ++){ + + // create the new row + $table[$index1] = array(0); + + // loop over the columns + for ($index2 = 1; $index2 <= $length2; $index2 ++){ + + // store the longest common subsequence length + if ($sequence1[$index1 + $start - 1] + == $sequence2[$index2 + $start - 1]){ + $table[$index1][$index2] = $table[$index1 - 1][$index2 - 1] + 1; + }else{ + $table[$index1][$index2] = + max($table[$index1 - 1][$index2], $table[$index1][$index2 - 1]); + } + + } + } + + // return the table + return $table; + + } + + /* Returns the partial diff for the specificed sequences, in reverse order. + * The parameters are: + * + * $table - the table returned by the computeTable function + * $sequence1 - the first sequence + * $sequence2 - the second sequence + * $start - the starting index + */ + private static function generatePartialDiff( + $table, $sequence1, $sequence2, $start){ + + // initialise the diff + $diff = array(); + + // initialise the indices + $index1 = count($table) - 1; + $index2 = count($table[0]) - 1; + + // loop until there are no items remaining in either sequence + while ($index1 > 0 || $index2 > 0){ + + // check what has happened to the items at these indices + if ($index1 > 0 && $index2 > 0 + && $sequence1[$index1 + $start - 1] + == $sequence2[$index2 + $start - 1]){ + + // update the diff and the indices + $diff[] = array($sequence1[$index1 + $start - 1], self::UNMODIFIED); + $index1 --; + $index2 --; + + }elseif ($index2 > 0 + && $table[$index1][$index2] == $table[$index1][$index2 - 1]){ + + // update the diff and the indices + $diff[] = array($sequence2[$index2 + $start - 1], self::INSERTED); + $index2 --; + + }else{ + + // update the diff and the indices + $diff[] = array($sequence1[$index1 + $start - 1], self::DELETED); + $index1 --; + + } + + } + + // return the diff + return $diff; + + } + + /* Returns a diff as a string, where unmodified lines are prefixed by ' ', + * deletions are prefixed by '- ', and insertions are prefixed by '+ '. The + * parameters are: + * + * $diff - the diff array + * $separator - the separator between lines; this optional parameter defaults + * to "\n" + */ + public static function toString($diff, $separator = "\n"){ + + // initialise the string + $string = ''; + + // loop over the lines in the diff + foreach ($diff as $line){ + + // extend the string with the line + switch ($line[1]){ + case self::UNMODIFIED : $string .= ' ' . $line[0];break; + case self::DELETED : $string .= '- ' . $line[0];break; + case self::INSERTED : $string .= '+ ' . $line[0];break; + } + + // extend the string with the separator + $string .= $separator; + + } + + // return the string + return $string; + + } + + /* Returns a diff as an HTML string, where unmodified lines are contained + * within 'span' elements, deletions are contained within 'del' elements, and + * insertions are contained within 'ins' elements. The parameters are: + * + * $diff - the diff array + * $separator - the separator between lines; this optional parameter defaults + * to '
' + */ + public static function toHTML($diff, $separator = '
'){ + + // initialise the HTML + $html = ''; + + // loop over the lines in the diff + foreach ($diff as $line){ + + // extend the HTML with the line + switch ($line[1]){ + case self::UNMODIFIED : $element = 'span'; break; + case self::DELETED : $element = 'del'; break; + case self::INSERTED : $element = 'ins'; break; + } + $html .= + '<' . $element . '>' + . htmlspecialchars($line[0]) + . ''; + + // extend the HTML with the separator + $html .= $separator; + + } + + // return the HTML + return $html; + + } + + /* Returns a diff as an HTML table. The parameters are: + * + * $diff - the diff array + * $indentation - indentation to add to every line of the generated HTML; this + * optional parameter defaults to '' + * $separator - the separator between lines; this optional parameter + * defaults to '
' + */ + public static function toTable($diff, $indentation = '', $separator = ''){ + + // initialise the HTML + $html = $indentation . "\n"; + + // loop over the lines in the diff + $index = 0; + while ($index < count($diff)){ + + // determine the line type + switch ($diff[$index][1]){ + + // display the content on the left and right + case self::UNMODIFIED: + $leftCell = + self::getCellContent( + $diff, $indentation, $separator, $index, self::UNMODIFIED); + $rightCell = $leftCell; + break; + + // display the deleted on the left and inserted content on the right + case self::DELETED: + $leftCell = + self::getCellContent( + $diff, $indentation, $separator, $index, self::DELETED); + $rightCell = + self::getCellContent( + $diff, $indentation, $separator, $index, self::INSERTED); + break; + + // display the inserted content on the right + case self::INSERTED: + $leftCell = ''; + $rightCell = + self::getCellContent( + $diff, $indentation, $separator, $index, self::INSERTED); + break; + + } + + // extend the HTML with the new row + $html .= + $indentation + . " \n" + . $indentation + . ' \n" + . $indentation + . ' \n" + . $indentation + . " \n"; + + } + + // return the HTML + return $html . $indentation . "
' + . $leftCell + . "' + . $rightCell + . "
\n"; + + } + + /* Returns the content of the cell, for use in the toTable function. The + * parameters are: + * + * $diff - the diff array + * $indentation - indentation to add to every line of the generated HTML + * $separator - the separator between lines + * $index - the current index, passes by reference + * $type - the type of line + */ + private static function getCellContent( + $diff, $indentation, $separator, &$index, $type){ + + // initialise the HTML + $html = ''; + + // loop over the matching lines, adding them to the HTML + while ($index < count($diff) && $diff[$index][1] == $type){ + $html .= + '' + . htmlspecialchars($diff[$index][0]) + . '' + . $separator; + $index ++; + } + + // return the HTML + return $html; + + } + +} + +?>