Changeset 3445036
- Timestamp:
- 01/22/2026 05:07:40 PM (4 weeks ago)
- Location:
- tracemyip-visitor-analytics-ip-tracking-control/trunk
- Files:
-
- 6 edited
-
TraceMyIP-Wordpress-Plugin.php (modified) (2 diffs)
-
includes/local_stats/admin/ls-dashboard-widget.php (modified) (3 diffs)
-
includes/local_stats/assets/css/ls-css-admin.css (modified) (6 diffs)
-
includes/local_stats/ls-class.php (modified) (1 diff)
-
includes/local_stats/ls-config.php (modified) (2 diffs)
-
readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tracemyip-visitor-analytics-ip-tracking-control/trunk/TraceMyIP-Wordpress-Plugin.php
r3315425 r3445036 5 5 Plugin URI: https://www.tracemyip.org 6 6 Description: Website visitor IP address activity tracking, IP analytics, visitor email alerts, IP changes tracker and visitor IP address blocking. UnFiltered post stats dashboard. Tag visitors IPs, count and track post views, schedule email alerts, control and manage pages, links and protect contact forms. GDPR options. 7 Version: 2.7 17 Version: 2.72 8 8 Author: TraceMyIP.org 9 9 Author URI: https://www.TraceMyIP.org … … 12 12 License URI: http://www.gnu.org/licenses/gpl-2.0.html 13 13 */ 14 if (!defined('TMIP_VERSION') ) define('TMIP_VERSION', '2.7 1');14 if (!defined('TMIP_VERSION') ) define('TMIP_VERSION', '2.72'); 15 15 16 16 ### SET CONSTANTS ############################################ -
tracemyip-visitor-analytics-ip-tracking-control/trunk/includes/local_stats/admin/ls-dashboard-widget.php
r3315425 r3445036 511 511 512 512 <script> 513 jQuery(document).ready(function($) { 514 $.post(ajaxurl, { 515 action: 'tmip_get_daily_stats', 516 security: '<?php echo wp_create_nonce("tmip_dashboard_nonce"); ?>', 517 }, function(response) { 518 if (response.success) { 519 var chartMode = '<?php echo get_option('tmip_lc_chart_display_mode', 'separate'); ?>'; 520 521 // Define series with their specific colors 522 var selectedSeries = <?php echo json_encode(get_option('tmip_lc_chart_series_display', ['posts', 'pages', 'custom'])); ?>; 523 524 // Ensure selectedSeries is always an array 525 if (!Array.isArray(selectedSeries)) { 526 selectedSeries = ['posts', 'pages', 'custom']; 527 } 528 529 var seriesConfig = chartMode === 'combined' ? [ 530 { 531 name: 'Total Hits', 532 data: response.data.views, 533 color: '#2E93fA' 534 } 535 ] : [ 536 { 537 name: 'Posts', 538 data: response.data.posts_views, 539 color: '#008FFB', 540 enabled: selectedSeries.includes('posts') 541 }, 542 { 543 name: 'Pages', 544 data: response.data.pages_views, 545 color: '#00E396', 546 enabled: selectedSeries.includes('pages') 547 }, 548 { 549 name: 'Custom Posts', 550 data: response.data.custom_views, 551 color: '#FEB019', 552 enabled: selectedSeries.includes('custom') 553 }, 554 { 555 name: 'Media', 556 data: response.data.media_views, 557 color: '#FF4560', 558 enabled: selectedSeries.includes('media') 559 }, 560 { 561 name: 'Other', 562 data: response.data.other_views, 563 color: '#775DD0', 564 enabled: selectedSeries.includes('other') 565 }, 566 { 567 name: 'Bot Hits', 568 data: response.data.bot_views, 569 color: '#546E7A', 570 enabled: selectedSeries.includes('bots') 571 }, 572 { 573 name: 'Unique Visits', 574 data: response.data.unique_visits, 575 color: '#26a69a', 576 enabled: selectedSeries.includes('unique') 577 } 578 ].filter(series => { 579 // Ensure series is enabled and has valid data 580 return series.enabled !== false && 581 Array.isArray(series.data) && 582 series.data.some(value => value !== null && value !== undefined); 583 }); 584 585 586 var storageMethod = '<?php echo get_option('tmip_lc_storage_method', 'cookies'); ?>'; 587 if (storageMethod === 'cookieless') { 588 // Filter out unique visits series 589 seriesConfig = seriesConfig.filter(series => series.name !== 'Unique Visits'); 590 } 591 592 var options = { 593 chart: { 594 type: 'area', 595 height: 250, 596 animations: { 597 enabled: true, 598 easing: 'easeinout', 599 speed: 800 600 }, 601 toolbar: { 602 show: true 603 } 604 }, 605 series: seriesConfig.map(s => ({ 606 name: s.name, 607 data: s.data 608 })), 609 colors: seriesConfig.map(s => s.color), 610 stroke: { 611 curve: 'smooth', 612 width: 3, 613 colors: seriesConfig.map(s => s.color) 614 }, 615 fill: { 616 type: 'solid', 617 opacity: 0.15 618 }, 619 markers: { 620 size: 5, 621 radius: 5, 622 shape: 'circle', 623 colors: seriesConfig.map(s => s.color), 624 strokeColors: '#fff', 625 strokeWidth: 2, 626 hover: { 627 size: 7, 628 sizeOffset: 3 629 }, 630 discrete: [] 631 }, 632 dataLabels: { 633 enabled: false 634 }, 635 xaxis: { 636 categories: response.data.dates, 637 type: 'datetime', 638 labels: { 639 rotate: -45, 640 rotateAlways: false, 641 format: 'dd MMM', 642 style: { 643 fontSize: '12px' 644 } 645 }, 646 tickAmount: Math.min(response.data.retention_days, 15) 647 }, 648 yaxis: { 649 labels: { 650 formatter: function(val) { 651 return Math.floor(val); 652 } 653 } 654 }, 655 tooltip: { 513 514 515 516 517 518 jQuery(document).ready(function($) { 519 $.post(ajaxurl, { 520 action: 'tmip_get_daily_stats', 521 security: '<?php echo wp_create_nonce("tmip_dashboard_nonce"); ?>', 522 }, function(response) { 523 if (response.success) { 524 var chartMode = '<?php echo get_option('tmip_lc_chart_display_mode', 'separate'); ?>'; 525 526 // Define series with their specific colors 527 var selectedSeries = <?php echo json_encode(get_option('tmip_lc_chart_series_display', ['posts', 'pages', 'custom'])); ?>; 528 529 // Ensure selectedSeries is always an array 530 if (!Array.isArray(selectedSeries)) { 531 selectedSeries = ['posts', 'pages', 'custom']; 532 } 533 534 var seriesConfig = chartMode === 'combined' ? [ 535 { 536 name: 'Total Hits', 537 data: response.data.views, 538 color: '#2E93fA' 539 } 540 ] : [ 541 { 542 name: 'Posts', 543 data: response.data.posts_views, 544 color: '#008FFB', 545 enabled: selectedSeries.includes('posts') 546 }, 547 { 548 name: 'Pages', 549 data: response.data.pages_views, 550 color: '#00E396', 551 enabled: selectedSeries.includes('pages') 552 }, 553 { 554 name: 'Custom Posts', 555 data: response.data.custom_views, 556 color: '#FEB019', 557 enabled: selectedSeries.includes('custom') 558 }, 559 { 560 name: 'Media', 561 data: response.data.media_views, 562 color: '#FF4560', 563 enabled: selectedSeries.includes('media') 564 }, 565 { 566 name: 'Other', 567 data: response.data.other_views, 568 color: '#775DD0', 569 enabled: selectedSeries.includes('other') 570 }, 571 { 572 name: 'Bot Hits', 573 data: response.data.bot_views, 574 color: '#546E7A', 575 enabled: selectedSeries.includes('bots') 576 }, 577 { 578 name: 'Unique Visits', 579 data: response.data.unique_visits, 580 color: '#26a69a', 581 enabled: selectedSeries.includes('unique') 582 } 583 ].filter(series => { 584 // Ensure series is enabled and has valid data 585 return series.enabled !== false && 586 Array.isArray(series.data) && 587 series.data.some(value => value !== null && value !== undefined); 588 }); 589 590 var storageMethod = '<?php echo get_option('tmip_lc_storage_method', 'cookies'); ?>'; 591 if (storageMethod === 'cookieless') { 592 // Filter out unique visits series 593 seriesConfig = seriesConfig.filter(series => series.name !== 'Unique Visits'); 594 } 595 596 // Create a shifted color array for chart elements 597 // Shift colors backward by one position (last color becomes first) 598 var chartColors = seriesConfig.map(s => s.color); 599 var shiftedColors = [chartColors[chartColors.length - 1], ...chartColors.slice(0, -1)]; 600 601 var options = { 602 chart: { 603 type: 'area', 604 height: 250, 605 animations: { 606 enabled: true, 607 easing: 'easeinout', 608 speed: 800 609 }, 610 toolbar: { 611 show: true 612 } 613 }, 614 series: seriesConfig.map(s => ({ 615 name: s.name, 616 data: s.data 617 })), 618 // Use original colors for legend 619 colors: chartColors, 620 stroke: { 621 curve: 'smooth', 622 width: 3 623 }, 624 fill: { 625 type: 'solid', 626 opacity: 0.15 627 }, 628 markers: { 629 size: 5, 630 radius: 7, 631 shape: 'circle', 632 strokeColors: '#000', 633 strokeWidth: 1, 634 hover: { 635 size: 7, 636 sizeOffset: 3 637 } 638 }, 639 dataLabels: { 640 enabled: false 641 }, 642 states: { 643 hover: { 644 filter: { 645 type: 'none' // Disable default hover filter 646 } 647 }, 648 active: { 649 allowMultipleDataPointsSelection: false, 650 filter: { 651 type: 'none' // Disable default active filter 652 } 653 } 654 }, 655 xaxis: { 656 categories: response.data.dates, 657 type: 'datetime', 658 labels: { 659 rotate: -45, 660 rotateAlways: false, 661 format: 'dd MMM', 662 style: { 663 fontSize: '12px' 664 } 665 }, 666 tickAmount: Math.min(response.data.retention_days, 15) 667 }, 668 yaxis: { 669 labels: { 670 formatter: function(val) { 671 return Math.floor(val); 672 } 673 } 674 }, 675 tooltip: { 656 676 shared: true, 657 677 intersect: false, … … 676 696 w.globals.seriesNames.map((name, i) => { 677 697 if (series[i][dataPointIndex] !== undefined) { 678 return `<div class="t ooltip-series" style="color: ${colors[i]}">679 <span class="t ooltip-marker" style="background: ${colors[i]}"></span>680 <span class=" series-name">${name}:</span>681 <span class=" series-value">${Math.floor(series[i][dataPointIndex])} hits</span>698 return `<div class="tmip-tooltip-series" style="color: ${colors[i]}"> 699 <span class="tmip-tooltip-marker" style="background: ${colors[i]}"></span> 700 <span class="tmip-series-name">${name}:</span> 701 <span class="tmip-series-value">${Math.floor(series[i][dataPointIndex])} hits</span> 682 702 </div>`; 683 703 } … … 687 707 } 688 708 }, 689 legend: { 690 position: 'bottom', 691 horizontalAlign: 'center', 692 onItemClick: { 693 toggleDataSeries: true 694 }, 695 onItemHover: { 696 highlightDataSeries: true 697 }, 698 markers: { 699 width: 8, 700 height: 8, 701 strokeWidth: 0, 702 strokeColor: '#fff', 703 radius: 12, 704 offsetX: 0, 705 offsetY: 0, 706 shape: 'circle', 707 fillColors: seriesConfig.map(s => s.color) 708 }, 709 showForSingleSeries: true 710 }, 711 grid: { 712 borderColor: '#f1f1f1', 713 padding: { 714 bottom: 15 715 } 716 } 717 }; 718 719 // Update the custom CSS section: 720 $('<style>') 721 .text(` 722 ${seriesConfig.map((s, i) => ` 723 .apexcharts-series[rel="${i}"] { 724 stroke: ${s.color} !important; 725 } 726 .apexcharts-series[rel="${i}"] path.apexcharts-line { 727 stroke: ${s.color} !important; 728 } 729 .apexcharts-series[rel="${i}"] path.apexcharts-area { 730 fill: ${s.color} !important; 731 } 732 .apexcharts-legend-series[data\\:collapsedIndex="${i}"] .apexcharts-legend-marker { 733 background-color: ${s.color} !important; 734 border-color: ${s.color} !important; 735 } 736 .apexcharts-series[rel="${i}"] .apexcharts-marker { 737 fill: ${s.color} !important; 738 } 739 `).join('\n')} 740 741 .apexcharts-area { 742 opacity: 0.15 !important; 743 } 744 .apexcharts-series.apexcharts-active .apexcharts-area { 745 opacity: 0.3 !important; 746 } 747 748 /* Custom tooltip styling */ 749 .tmip-custom-tooltip { 750 padding: 8px; 751 background: #fff; 752 border-radius: 4px; 753 box-shadow: 0 2px 5px rgba(0,0,0,0.1); 754 } 755 .tmip-custom-tooltip .tooltip-series { 756 display: flex; 757 align-items: center; 758 margin: 4px 0; 759 font-size: 12px; 760 } 761 .tmip-custom-tooltip .tooltip-marker { 762 width: 8px; 763 height: 8px; 764 border-radius: 50%; 765 margin-right: 6px; 766 display: inline-block; 767 } 768 .tmip-custom-tooltip .series-name { 769 margin-right: 6px; 770 } 771 .tmip-custom-tooltip .series-value { 772 font-weight: 600; 773 } 774 775 /* Ensure markers are circular */ 776 .apexcharts-marker { 777 border-radius: 50% !important; 778 } 779 `) 780 .appendTo('head'); 781 782 783 784 var chart = new ApexCharts(document.querySelector("#tmip-daily-chart"), options); 785 chart.render(); 786 } 787 }); 788 }); 709 legend: { 710 position: 'bottom', 711 horizontalAlign: 'center', 712 onItemClick: { 713 toggleDataSeries: true 714 }, 715 onItemHover: { 716 highlightDataSeries: true 717 }, 718 markers: { 719 width: 8, 720 height: 8, 721 strokeWidth: 0, 722 strokeColor: '#fff', 723 radius: 12, 724 offsetX: 0, 725 offsetY: 0, 726 shape: 'circle', 727 fillColors: chartColors 728 }, 729 showForSingleSeries: true 730 }, 731 grid: { 732 borderColor: '#f1f1f1', 733 padding: { 734 bottom: 15 735 } 736 } 737 }; 738 739 // Add CSS to fix the color mismatch and enhance hover effects 740 $('<style>').text(` 741 /* Fix the color mismatch by shifting colors backward */ 742 ${seriesConfig.map((s, i) => ` 743 .apexcharts-series[rel="${i}"] { 744 stroke: ${shiftedColors[i]} !important; 745 } 746 .apexcharts-series[rel="${i}"] path.apexcharts-line { 747 stroke: ${shiftedColors[i]} !important; 748 } 749 .apexcharts-series[rel="${i}"] path.apexcharts-area { 750 fill: ${shiftedColors[i]} !important; 751 } 752 .apexcharts-series[rel="${i}"] .apexcharts-marker { 753 fill: ${shiftedColors[i]} !important; 754 } 755 `).join('\n')} 756 757 /* Ensure legend markers match the legend colors */ 758 ${seriesConfig.map((s, i) => ` 759 .apexcharts-legend-series[data\\:collapsedIndex="${i}"] .apexcharts-legend-marker { 760 background-color: ${chartColors[i]} !important; 761 border-color: ${chartColors[i]} !important; 762 } 763 `).join('\n')} 764 765 /* Default opacity for all series areas */ 766 .apexcharts-area { 767 opacity: 0.15 !important; 768 transition: opacity 0.2s ease !important; 769 } 770 771 /* When hovering over chart, reduce opacity of all series */ 772 .apexcharts-canvas:hover .apexcharts-area { 773 opacity: 0.04 !important; 774 } 775 776 /* Active series gets higher opacity */ 777 .apexcharts-series.apexcharts-active .apexcharts-area { 778 opacity: 0.75 !important; 779 } 780 781 /* Non-active series get lower opacity when any series is active */ 782 .apexcharts-canvas.apexcharts-series-highlighted .apexcharts-series:not(.apexcharts-active) .apexcharts-area { 783 opacity: 0.14 !important; 784 } 785 786 /* Improve hover transitions */ 787 .apexcharts-series { 788 transition: opacity 0.2s ease !important; 789 } 790 791 /* Force opacity on inactive series */ 792 .apexcharts-legend-series:hover + .apexcharts-plot-series .apexcharts-series:not(.apexcharts-active) .apexcharts-area { 793 opacity: 0.14 !important; 794 } 795 796 797 `).appendTo('head'); 798 799 var chart = new ApexCharts(document.querySelector("#tmip-daily-chart"), options); 800 chart.render(); 801 } 802 }); 803 }); 804 805 789 806 790 807 -
tracemyip-visitor-analytics-ip-tracking-control/trunk/includes/local_stats/assets/css/ls-css-admin.css
r3315425 r3445036 392 392 393 393 .tmip-ip-requests { 394 text-align: right;394 text-align: left; 395 395 white-space: nowrap; 396 margin-right: 20px; 397 padding-top: 2px; 398 } 396 margin-top: -6px; 397 padding-top: 0; 398 font-size: 1.1em; 399 color: #9C0000; 400 display: flex; 401 align-items: center; 402 gap: 5px; 403 } 404 405 .tmip-ip-value { 406 position: relative; 407 font-family: monospace; 408 font-size: 14px; 409 color: #333; 410 white-space: nowrap; 411 overflow: hidden; 412 text-overflow: ellipsis; 413 max-width: 100%; 414 display: inline-block; 415 cursor: help; 416 } 417 .tmip-ip-value[data-ip]:hover::after { 418 content: attr(data-ip); 419 position: absolute; 420 top: 100%; 421 left: 0; 422 background: #333; 423 color: #fff; 424 padding: 5px; 425 border-radius: 3px; 426 z-index: 1; 427 white-space: nowrap; 428 } 429 430 .tmip-bot-indicator { 431 display: inline-flex; 432 align-items: center; 433 color: #66F; 434 font-size: 1em; 435 opacity: 1; 436 user-select: none; 437 } 438 439 .tmip-bot-indicator .dashicons { 440 font-size: 14px; 441 width: 14px; 442 height: 14px; 443 margin-right: 2px; 444 color: #d63638; /* Bot indicator color */ 445 } 446 447 399 448 400 449 .tmip-ip-last-seen { … … 469 518 } 470 519 471 .tmip-ip-value {472 position: relative;473 font-family: monospace;474 font-size: 13px;475 color: #2271b1;476 white-space: nowrap;477 overflow: hidden;478 text-overflow: ellipsis;479 max-width: 100%;480 display: inline-block;481 cursor: help;482 }483 .tmip-ip-requests {484 text-align: left;485 white-space: nowrap;486 margin-top: 3px;487 padding-top: 0;488 font-size: 0.9em;489 color: #2271b1;490 display: flex;491 align-items: center;492 gap: 5px;493 }494 495 .tmip-ip-value[data-ip]:hover::after {496 content: attr(data-ip);497 position: absolute;498 top: 100%;499 left: 0;500 background: #333;501 color: #fff;502 padding: 5px;503 border-radius: 3px;504 z-index: 1;505 white-space: nowrap;506 }507 508 .tmip-bot-indicator {509 display: inline-flex;510 align-items: center;511 color: #66F;512 font-size: 1em;513 opacity: 1;514 user-select: none;515 }516 517 .tmip-bot-indicator .dashicons {518 font-size: 14px;519 width: 14px;520 height: 14px;521 margin-right: 2px;522 color: #d63638; /* Bot indicator color */523 }524 525 520 .tmip-active-ips-list li.is-bot { 526 521 background-color: rgba(255, 209, 209, 0.70); … … 570 565 } 571 566 .apexcharts-series path { 572 stroke-width: 3px !important;567 /*stroke-width: 3px !important;*/ 573 568 } 574 569 .apexcharts-series[seriesName="Posts"] { 575 stroke: #008FFB !important;570 /*stroke: #008FFB !important;*/ 576 571 } 577 572 .apexcharts-series[seriesName="Pages"] { 578 stroke: #00E396 !important;573 /* stroke: #00E396 !important;*/ 579 574 } 580 575 .apexcharts-series[seriesName="Custom Post Types"] { 581 stroke: #FEB019 !important;576 /*stroke: #FEB019 !important;*/ 582 577 } 583 578 .apexcharts-area-series .apexcharts-series-markers-wrap { … … 585 580 } 586 581 .apexcharts-series .apexcharts-marker { 587 stroke-width: 2px; 582 /*stroke-width: 2px;*/ 583 stroke: #666 !important; /* Ensure SVG stroke is also black */ 588 584 } 589 585 .apexcharts-legend-series:not(.apexcharts-inactive-legend) .apexcharts-legend-marker { … … 635 631 margin-left: 10px; 636 632 } 633 634 635 /* 636 CHART STYLING 637 */ 638 /* Enhanced tooltip styling */ 639 .tmip-custom-tooltip { 640 padding: 12px; 641 border-radius: 6px; 642 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 643 background: #fff; 644 border: 1px solid rgba(0, 0, 0, 0.1); 645 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; 646 } 647 648 .tmip-tooltip-series { 649 display: flex; 650 align-items: center; 651 margin-bottom: 6px; 652 padding: 3px 0; 653 margin-bottom: 2px !important; 654 padding: 1px 0 !important; 655 } 656 657 .tmip-tooltip-marker { 658 display: inline-block; 659 width: 10px; 660 height: 10px; 661 border-radius: 50%; 662 margin-right: 8px; 663 } 664 665 .tmip-series-name { 666 font-weight: 600; 667 margin-right: 6px; 668 } 669 670 .tmip-series-value { 671 font-weight: normal; 672 } 637 673 .tmip-chart-settings { 638 674 margin-bottom: 20px; … … 664 700 color: #646970; 665 701 } 702 703 666 704 .tmip-columns-main-settings { 667 705 margin-bottom: 15px; -
tracemyip-visitor-analytics-ip-tracking-control/trunk/includes/local_stats/ls-class.php
r3309809 r3445036 457 457 458 458 private function define_constants() { 459 define('TMIP_LOCAL_STATS_VERSION', $this->version);459 define('TMIP_LOCAL_STATS_VERSION', defined('TMIP_VERSION') ? TMIP_VERSION : LS_STATS_VERSION); 460 460 define('TMIP_LOCAL_STATS_DB_PREFIX', $this->db_prefix); 461 461 define('TMIP_LOCAL_STATS_PATH', plugin_dir_path(__FILE__)); -
tracemyip-visitor-analytics-ip-tracking-control/trunk/includes/local_stats/ls-config.php
r3315425 r3445036 13 13 defined('ABSPATH') || exit; 14 14 15 // JS debug is enabled in ls-js-admin.js 15 16 define('TMIP_UF_DEBUG', false); // Enable debug states in wp-config.php: define( 'WP_DEBUG', true ); and define('WP_DEBUG_LOG', true ); 16 // JS debug is enabled in ls-js-admin.js17 18 17 19 18 // Add debug logging function … … 32 31 private static $instance; 33 32 33 // Versioning 34 34 const MIN_PHP_VERSION = '7.4.0'; 35 35 const LS_STATS_VERSION = '1.0.0'; // 052425122331 Define TMIP_VERSION to override 36 36 37 // Database configuration 37 38 const DB_PREFIX = 'tmip_lc_'; -
tracemyip-visitor-analytics-ip-tracking-control/trunk/readme.txt
r3315425 r3445036 3 3 Tags: visitor tracking, ip tracker, visitor stats, website analytics, statistics, stats, trace my ip, post views counter, page views tracker, email alerts, hits counter, ip blocker, visitor analytics 4 4 Requires at least: 2.0.4 5 Tested up to: 6. 85 Tested up to: 6.9 6 6 Requires PHP: 7.2 7 Stable tag: 2.7 17 Stable tag: 2.72 8 8 License: GPLv2 (or later) 9 9 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 233 233 == Changelog == 234 234 235 = Version 2.72 = 236 - Verify WordPress 6.9 full compatibility 237 - Corrected versioning updates 238 - Improved the hits stats charts series and tooltip graphics 239 - Improved the hits stats charts highlighting for better visual differention between the series 240 - Added new social platform tracking definitions 241 - Added new social bookmarking tracking definitions 242 235 243 = Version 2.71 = 236 244 - Improved responsive layout for recent IP section
Note: See TracChangeset
for help on using the changeset viewer.