Limit Login Attempts Reloaded - Version 2.23.1

Version Description

  • Added infinite scroll for cloud logs.
Download this release

Release Info

Developer wpchefgadget
Plugin Icon 128x128 Limit Login Attempts Reloaded
Version 2.23.1
Comparing to
See all releases

Code changes from version 2.23.0 to 2.23.1

assets/css/limit-login-attempts.css CHANGED
@@ -1 +1 @@
1
- .limit-login-page-settings .field-col{display:inline-block;margin-right:20px}.limit-login-page-settings .limit-login-log table{background-color:#fff}.limit-login-page-settings .limit-login-log table th,.limit-login-page-settings .limit-login-log table td{padding:10px}.limit-login-page-settings .limit-login-log table tr:nth-child(even){background-color:rgba(0,0,0,0.09)}.limit-login-page-settings #limit-login-app-setup-code{width:85%}.limit-login-page-settings .nav-tab-wrapper{position:relative}.limit-login-page-settings .nav-tab-wrapper .llar-failover-link{font-size:14px;float:right;line-height:2}.limit-login-page-settings .limit-login-app-dashboard .llar-table-scroll-wrap{max-height:400px;overflow-y:auto}.limit-login-page-settings .limit-login-app-dashboard .form-table{background-color:#fff;border:1px solid #f4f4f4;border-top:3px solid #3c8dbc;position:relative}.limit-login-page-settings .limit-login-app-dashboard .form-table.llar-preloader:before{content:"";display:block;width:100%;height:100%;background-color:rgba(255,255,255,0.7);z-index:999;position:absolute;top:0;left:0}.limit-login-page-settings .limit-login-app-dashboard .form-table th{font-weight:bold;border-bottom:1px solid #dbdbdb !important}.limit-login-page-settings .limit-login-app-dashboard .form-table th,.limit-login-page-settings .limit-login-app-dashboard .form-table td{padding:10px;border:1px solid #b9b9b9}.limit-login-page-settings .limit-login-app-dashboard .form-table th.llar-col-nowrap,.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-col-nowrap{white-space:nowrap}.limit-login-page-settings .limit-login-app-dashboard .form-table td button{line-height:1;margin-right:5px}.limit-login-page-settings .limit-login-app-dashboard .form-table td button:last-child{margin-right:0}.limit-login-page-settings .limit-login-app-dashboard .form-table td button .dashicons{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn{display:inline-block;line-height:20px;cursor:pointer}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn i{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn:hover i{color:#3c8dbc}.limit-login-page-settings .limit-login-app-dashboard .form-table tr:nth-child(even){background-color:#f9f9f9}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination>a{font-size:16px;line-height:1.625}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination .spinner{float:none}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col{-webkit-box-flex:0;-ms-flex:0 0 49%;flex:0 0 49%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table select{width:100%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .origin{float:right;opacity:0.5}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-action-col{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-pass{background-color:#cffbe8}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-allow{background-color:#abdfff}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-deny{background-color:#fd2c2c3d}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-remove{color:crimson;border-color:crimson}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section{background-color:#fff;padding:15px;border:1px solid #b9b9b9;border-top:3px solid #3c8dbc}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode{display:inline-block;margin-right:5px;vertical-align:top}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-toggle-countries-list{-webkit-text-decoration-style:dotted;text-decoration-style:dotted;vertical-align:middle;line-height:1.6}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;max-height:400px;overflow-y:auto}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list:first-child{margin-top:0}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country{-webkit-box-flex:0;-ms-flex:0 0 10%;flex:0 0 10%}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country label{padding-bottom:10px;display:inline-block}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected{display:inline;vertical-align:middle;overflow:hidden}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country{margin-bottom:0;display:inline-block;margin-right:10px}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country label{padding-bottom:0;white-space:nowrap}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list{display:none;margin:10px 0}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list.visible{display:-webkit-box;display:-ms-flexbox;display:flex;border-top:1px solid #dddada;padding-top:10px}.limit-login-page-settings .llar-app-notice{background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);padding:15px;border-radius:3px;margin-top:20px;margin-bottom:20px;font-size:14px;border-left:5px solid #ffba00}.limit-login-page-settings .llar-app-notice.success{border-color:#46b450}.limit-login-page-settings .llar-app-notice p{font-size:inherit;margin:0 0 20px}.limit-login-page-settings .llar-app-notice p:last-child{margin-bottom:0}.limit-login-page-settings input[name="admin_notify_email"]{min-width:243px}.limit-login-page-settings .llar-protect-notice{font-size:15px;color:#848484;margin-left:10px}.limit-login-page-settings .llar-protect-notice a{color:#222222;text-decoration:none;border-bottom:1px dashed}.limit-login-page-settings .llar-show-app-fields{position:absolute;right:15px;top:15px;color:#bdbdbd}.limit-login-page-settings .llar-show-app-fields:hover{color:#222}.limit-login-page-settings .llar-app-field{display:none}.limit-login-page-settings .llar-app-field.active{display:table-row}.llar-notice-review,.llar-notice-notify{display:-webkit-box;display:-ms-flexbox;display:flex;padding:15px 20px 0 !important;border-left:4px solid #333 !important}.llar-notice-review .llar-review-image img,.llar-notice-notify .llar-review-image img{margin-top:10px;margin-bottom:20px}.llar-notice-review .llar-review-image span,.llar-notice-notify .llar-review-image span{font-size:80px;color:orange;width:80px;height:auto;margin-bottom:20px}.llar-notice-review .llar-review-info,.llar-notice-notify .llar-review-info{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:30px}.llar-notice-review .llar-review-info .llar-buttons,.llar-notice-notify .llar-review-info .llar-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.llar-notice-review .llar-review-info .llar-buttons li,.llar-notice-notify .llar-review-info .llar-buttons li{margin-right:10px}.llar-notice-review .llar-review-info .llar-buttons li .dashicons,.llar-notice-notify .llar-review-info .llar-buttons li .dashicons{margin-right:5px}.llar-accordion .ui-accordion-header{font-weight:bold;background:#778899;color:#fff}.llar-accordion .ui-accordion-header.ui-accordion-header-active{background:#87CEFA}.custom-app-tab{position:relative}.custom-app-tab .spinner{float:none}.custom-app-tab .llar-app-ajax-msg{font-size:13px;margin-top:5px;display:block}.custom-app-tab .llar-app-ajax-msg.error{color:red}.custom-app-tab .llar-app-ajax-msg.success{color:green}.custom-app-tab .llar-delete-app{color:#dc3232;position:absolute;bottom:15px;right:15px}.custom-app-tab .llar-delete-app:hover{opacity:0.8}.custom-app-tab .llar-why-use-premium-text{margin-top:20px}.custom-app-tab .llar-why-use-premium-text .title{font-weight:bold;font-size:16px;color:#4d4d4d}.custom-app-tab .llar-why-use-premium-text ul li .dashicons{color:#3ab54a;font-size:25px;width:25px;top:-2px;position:relative}#llar-progress-bar{position:fixed;top:0;height:6px;left:0;width:100%;z-index:999999;background-color:#eee}#llar-progress-bar span{height:100%;position:absolute;display:block;width:0;background-color:#00b357;-webkit-transition:width 0.4s;transition:width 0.4s}#llar-header-upgrade-message{text-align:center;background-color:#f5f0c0;color:#222;padding:10px;margin-left:-20px;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.2);box-shadow:0 0 3px rgba(0,0,0,0.2)}#llar-header-upgrade-message p{margin:0}#llar-header-upgrade-message p .dashicons{color:#f2a64c;margin-right:5px}.settings_page_limit-login-attempts .update-nag{display:none}#llar-welcome-page{padding:50px 0}#llar-welcome-page img{max-width:100%;height:auto}#llar-welcome-page .llar-welcome-page-container{width:100%;max-width:760px;margin:0 auto 30px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 0 4px rgba(0,0,0,0.1);box-shadow:0 0 4px rgba(0,0,0,0.1)}#llar-welcome-page .llar-welcome-page-container.llar-premium{border-top:5px solid #50c1cd}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section{padding:20px;text-align:center}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section .llar-logo{text-align:center;margin-top:20px;margin-bottom:30px}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h2{font-size:2.4em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h3{font-size:1.5em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section p{font-size:17px;color:#444}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-video-wrap img{width:100%;height:auto;cursor:pointer}#llar-welcome-page .llar-welcome-page-features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0 15px;counter-reset:cnt1}#llar-welcome-page .llar-welcome-page-features .llar-feature-item{-webkit-box-flex:0;-ms-flex:0 0 24%;flex:0 0 24%;text-align:center;margin-bottom:40px;position:relative;padding-bottom:60px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:before{content:counter(cnt1);counter-increment:cnt1;position:absolute;left:50%;-webkit-transform:translatex(-50%);transform:translatex(-50%);bottom:0;font-size:1em;font-weight:600;width:40px;height:40px;line-height:40px;text-align:center;border-radius:50%;background-color:#ecedef;color:#979aaa}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:after{position:absolute;content:'';left:-39%;width:69%;height:1px;bottom:1.4em;background-color:#ecedef}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:nth-child(4n+1):after{display:none}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-image{margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-title{font-weight:bold;margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-desc{color:#979aaa}@media (max-width: 768px){#llar-welcome-page .llar-welcome-page-features{display:block}}#llar-welcome-page .llar-why-recommend{text-align:left;font-size:17px}#llar-welcome-page .llar-why-recommend ul li span{margin-right:5px;width:auto;height:auto;font-size:25px;vertical-align:middle;color:green}#llar-welcome-page .llar-welcome-list{font-size:17px;text-align:left;line-height:1.4;list-style:none}#llar-welcome-page .llar-welcome-list li span{margin-right:10px;width:auto;height:auto;font-size:22px;vertical-align:top;color:orange}#llar-welcome-page .llar-upgrade-btn-wrap{padding:20px}#llar-welcome-page .llar-upgrade-btn-wrap a{display:inline-block;background-color:#e27800;color:#fff;font-size:22px;padding:20px;text-decoration:none;font-weight:600}#llar-welcome-page .llar-upgrade-btn-wrap a:hover{background-color:#af5d00}#llar-welcome-page .llar-upgrade-questions{font-size:17px}.dashboard_page_llar-welcome .update-nag,.dashboard_page_llar-welcome .notice,.toplevel_page_limit-login-attempts .update-nag,.toplevel_page_limit-login-attempts .notice{display:none}.dashboard_page_llar-welcome .video-container,.toplevel_page_limit-login-attempts .video-container{position:relative;padding-bottom:56.1%;height:0;overflow:hidden}.dashboard_page_llar-welcome .video-container iframe,.toplevel_page_limit-login-attempts .video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.jconfirm .jconfirm-box div.jconfirm-closeIcon{top:-2px !important;right:-2px !important}.llar-tooltip{text-decoration:underline;-webkit-text-decoration-style:dotted;text-decoration-style:dotted;cursor:pointer;position:relative}.llar-tooltip:before{content:attr(data-text);position:absolute;width:200px;padding:5px;background-color:rgba(0,0,0,0.8);color:#fff;font-size:13px;top:100%;z-index:999;visibility:hidden;opacity:0;-webkit-transition:all .2s;transition:all .2s;font-weight:300;cursor:auto}.llar-tooltip:hover:before{visibility:visible;opacity:1}#toplevel_page_limit-login-attempts .wp-menu-image.svg{background-size:25px auto !important;margin-top:7px}#llar-dashboard-page{padding-top:10px}#llar-dashboard-page *{-webkit-box-sizing:border-box;box-sizing:border-box}#llar-dashboard-page ul,#llar-dashboard-page ol{margin-left:0}#llar-dashboard-page ul li,#llar-dashboard-page ol li{list-style-position:inside}#llar-dashboard-page .dashboard-header{background-color:#0071a0;color:#fff;text-align:center;padding:15px}#llar-dashboard-page .dashboard-header h1{color:#fff}#llar-dashboard-page .section-title{font-weight:bold;padding:15px;border-bottom:1px solid #e4e4e4;font-size:14px;text-align:left}#llar-dashboard-page .section-content{padding:15px}#llar-dashboard-page .dashboard-section-1{margin-bottom:20px;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]{text-align:center;-webkit-box-flex:0;-ms-flex:0 0 33.333%;flex:0 0 33.333%;max-width:33.333%;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]:last-child{border:0}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"] .title{font-weight:600;font-size:16px;line-height:1.5;margin-bottom:10px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart{max-width:300px;position:relative;margin-bottom:15px;margin-left:auto;margin-right:auto}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .llar-retries-count{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);font-size:28px;font-weight:bold}#llar-dashboard-page .dashboard-section-1 .info-box-1 .desc{font-size:15px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .actions{margin-top:5px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap canvas{height:300px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .chart-stats-legend{text-align:center;margin-top:10px}#llar-dashboard-page .dashboard-section-1 .info-box-3{text-align:left}#llar-dashboard-page .dashboard-section-1 .info-box-3 .desc{margin-bottom:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions{text-align:center;padding-top:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions a{text-transform:uppercase;font-size:16px;margin-bottom:5px}#llar-dashboard-page .dashboard-section-1.custom .info-box-2{-webkit-box-flex:0;-ms-flex:0 0 66.666%;flex:0 0 66.666%;max-width:66.666%}#llar-dashboard-page .dashboard-section-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-2 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list{padding:0;margin:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li{margin:0;border-bottom:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li:last-child{border:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a{text-decoration:none;padding:15px;font-size:15px;display:block}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a:hover{background-color:#f9f9f9}#llar-dashboard-page .dashboard-section-2 .info-box-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon .dashicons{color:#0073a0;font-size:50px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.5}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-3{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;background-color:#fff;margin-bottom:20px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:30px 15px 30px 0;-webkit-box-flex:1;-ms-flex:1;flex:1;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon .dashicons{color:#a1a2a2;font-size:60px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.3}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title a{text-decoration:none}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-4 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table{width:100%;border-collapse:collapse}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th,#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td{padding:10px;border:1px solid #cecece}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th{background-color:#000;color:#fff;text-align:left}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr:nth-child(odd) td{background-color:#eff0ef}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td .flag-icon{width:24px;vertical-align:middle;margin-right:10px}#llar-dashboard-page .dashboard-section-4 .info-box-1 .countries-table-info{color:#a7a7a7;font-weight:400;margin-top:5px;margin-bottom:0}#llar-dashboard-page .dashboard-section-4 .info-box-2{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap canvas{height:300px}
1
+ .limit-login-page-settings .field-col{display:inline-block;margin-right:20px}.limit-login-page-settings .limit-login-log table{background-color:#fff}.limit-login-page-settings .limit-login-log table th,.limit-login-page-settings .limit-login-log table td{padding:10px}.limit-login-page-settings .limit-login-log table tr:nth-child(even){background-color:rgba(0,0,0,0.09)}.limit-login-page-settings #limit-login-app-setup-code{width:85%}.limit-login-page-settings .nav-tab-wrapper{position:relative}.limit-login-page-settings .nav-tab-wrapper .llar-failover-link{font-size:14px;float:right;line-height:2}.limit-login-page-settings .limit-login-app-dashboard .llar-table-scroll-wrap{max-height:400px;overflow-y:auto}.limit-login-page-settings .limit-login-app-dashboard .form-table{background-color:#fff;border:1px solid #f4f4f4;border-top:3px solid #3c8dbc;position:relative}.limit-login-page-settings .limit-login-app-dashboard .form-table.llar-preloader:before{content:"";display:block;width:100%;height:100%;background-color:rgba(255,255,255,0.7);z-index:999;position:absolute;top:0;left:0}.limit-login-page-settings .limit-login-app-dashboard .form-table th{font-weight:bold;border-bottom:1px solid #dbdbdb !important}.limit-login-page-settings .limit-login-app-dashboard .form-table th,.limit-login-page-settings .limit-login-app-dashboard .form-table td{padding:10px;border:1px solid #b9b9b9}.limit-login-page-settings .limit-login-app-dashboard .form-table th.llar-col-nowrap,.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-col-nowrap{white-space:nowrap}.limit-login-page-settings .limit-login-app-dashboard .form-table td button{line-height:1;margin-right:5px}.limit-login-page-settings .limit-login-app-dashboard .form-table td button:last-child{margin-right:0}.limit-login-page-settings .limit-login-app-dashboard .form-table td button .dashicons{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn{display:inline-block;line-height:20px;cursor:pointer}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn i{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn:hover i{color:#3c8dbc}.limit-login-page-settings .limit-login-app-dashboard .form-table tr:nth-child(even){background-color:#f9f9f9}.limit-login-page-settings .limit-login-app-dashboard .llar-table-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:15px 0 5px}.limit-login-page-settings .limit-login-app-dashboard .llar-table-header h3{margin:0}.limit-login-page-settings .limit-login-app-dashboard .llar-table-header .right-link{line-height:1.625}.limit-login-page-settings .limit-login-app-dashboard .llar-table-header .right-link a{font-size:14px}.limit-login-page-settings .limit-login-app-dashboard .llar-table-header .right-link .llar-tooltip{text-decoration:none;font-size:12px;display:inline-block}.limit-login-page-settings .limit-login-app-dashboard .llar-table-header .right-link .llar-tooltip:before{display:none}.limit-login-page-settings .limit-login-app-dashboard .llar-table-header .right-link .llar-tooltip:hover:before{display:block;right:0;left:auto}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination>a{font-size:16px;line-height:1.625}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination .spinner{float:none}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col{-webkit-box-flex:0;-ms-flex:0 0 49%;flex:0 0 49%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table select{width:100%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .origin{float:right;opacity:0.5}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-action-col{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-pass{background-color:#cffbe8}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-allow{background-color:#abdfff}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-deny{background-color:#fd2c2c3d}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-remove{color:crimson;border-color:crimson}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section{background-color:#fff;padding:15px;border:1px solid #b9b9b9;border-top:3px solid #3c8dbc}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode{display:inline-block;margin-right:5px;vertical-align:top}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-toggle-countries-list{-webkit-text-decoration-style:dotted;text-decoration-style:dotted;vertical-align:middle;line-height:1.6}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;max-height:400px;overflow-y:auto}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list:first-child{margin-top:0}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country{-webkit-box-flex:0;-ms-flex:0 0 10%;flex:0 0 10%}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country label{padding-bottom:10px;display:inline-block}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected{display:inline;vertical-align:middle;overflow:hidden}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country{margin-bottom:0;display:inline-block;margin-right:10px}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country label{padding-bottom:0;white-space:nowrap}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list{display:none;margin:10px 0}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list.visible{display:-webkit-box;display:-ms-flexbox;display:flex;border-top:1px solid #dddada;padding-top:10px}.limit-login-page-settings .llar-app-notice{background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);padding:15px;border-radius:3px;margin-top:20px;margin-bottom:20px;font-size:14px;border-left:5px solid #ffba00}.limit-login-page-settings .llar-app-notice.success{border-color:#46b450}.limit-login-page-settings .llar-app-notice p{font-size:inherit;margin:0 0 20px}.limit-login-page-settings .llar-app-notice p:last-child{margin-bottom:0}.limit-login-page-settings input[name="admin_notify_email"]{min-width:243px}.limit-login-page-settings .llar-protect-notice{font-size:15px;color:#848484;margin-left:10px}.limit-login-page-settings .llar-protect-notice a{color:#222222;text-decoration:none;border-bottom:1px dashed}.limit-login-page-settings .llar-show-app-fields{position:absolute;right:15px;top:15px;color:#bdbdbd}.limit-login-page-settings .llar-show-app-fields:hover{color:#222}.limit-login-page-settings .llar-app-field{display:none}.limit-login-page-settings .llar-app-field.active{display:table-row}.llar-notice-review,.llar-notice-notify{display:-webkit-box;display:-ms-flexbox;display:flex;padding:15px 20px 0 !important;border-left:4px solid #333 !important}.llar-notice-review .llar-review-image img,.llar-notice-notify .llar-review-image img{margin-top:10px;margin-bottom:20px}.llar-notice-review .llar-review-image span,.llar-notice-notify .llar-review-image span{font-size:80px;color:orange;width:80px;height:auto;margin-bottom:20px}.llar-notice-review .llar-review-info,.llar-notice-notify .llar-review-info{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:30px}.llar-notice-review .llar-review-info .llar-buttons,.llar-notice-notify .llar-review-info .llar-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.llar-notice-review .llar-review-info .llar-buttons li,.llar-notice-notify .llar-review-info .llar-buttons li{margin-right:10px}.llar-notice-review .llar-review-info .llar-buttons li .dashicons,.llar-notice-notify .llar-review-info .llar-buttons li .dashicons{margin-right:5px}.llar-accordion .ui-accordion-header{font-weight:bold;background:#778899;color:#fff}.llar-accordion .ui-accordion-header.ui-accordion-header-active{background:#87CEFA}.custom-app-tab{position:relative}.custom-app-tab .spinner{float:none}.custom-app-tab .llar-app-ajax-msg{font-size:13px;margin-top:5px;display:block}.custom-app-tab .llar-app-ajax-msg.error{color:red}.custom-app-tab .llar-app-ajax-msg.success{color:green}.custom-app-tab .llar-delete-app{color:#dc3232;position:absolute;bottom:15px;right:15px}.custom-app-tab .llar-delete-app:hover{opacity:0.8}.custom-app-tab .llar-why-use-premium-text{margin-top:20px}.custom-app-tab .llar-why-use-premium-text .title{font-weight:bold;font-size:16px;color:#4d4d4d}.custom-app-tab .llar-why-use-premium-text ul li .dashicons{color:#3ab54a;font-size:25px;width:25px;top:-2px;position:relative}#llar-progress-bar{position:fixed;top:0;height:6px;left:0;width:100%;z-index:999999;background-color:#eee}#llar-progress-bar span{height:100%;position:absolute;display:block;width:0;background-color:#00b357;-webkit-transition:width 0.4s;transition:width 0.4s}#llar-header-upgrade-message{text-align:center;background-color:#f5f0c0;color:#222;padding:10px;margin-left:-20px;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.2);box-shadow:0 0 3px rgba(0,0,0,0.2)}#llar-header-upgrade-message p{margin:0}#llar-header-upgrade-message p .dashicons{color:#f2a64c;margin-right:5px}.settings_page_limit-login-attempts .update-nag{display:none}#llar-welcome-page{padding:50px 0}#llar-welcome-page img{max-width:100%;height:auto}#llar-welcome-page .llar-welcome-page-container{width:100%;max-width:760px;margin:0 auto 30px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 0 4px rgba(0,0,0,0.1);box-shadow:0 0 4px rgba(0,0,0,0.1)}#llar-welcome-page .llar-welcome-page-container.llar-premium{border-top:5px solid #50c1cd}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section{padding:20px;text-align:center}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section .llar-logo{text-align:center;margin-top:20px;margin-bottom:30px}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h2{font-size:2.4em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h3{font-size:1.5em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section p{font-size:17px;color:#444}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-video-wrap img{width:100%;height:auto;cursor:pointer}#llar-welcome-page .llar-welcome-page-features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0 15px;counter-reset:cnt1}#llar-welcome-page .llar-welcome-page-features .llar-feature-item{-webkit-box-flex:0;-ms-flex:0 0 24%;flex:0 0 24%;text-align:center;margin-bottom:40px;position:relative;padding-bottom:60px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:before{content:counter(cnt1);counter-increment:cnt1;position:absolute;left:50%;-webkit-transform:translatex(-50%);transform:translatex(-50%);bottom:0;font-size:1em;font-weight:600;width:40px;height:40px;line-height:40px;text-align:center;border-radius:50%;background-color:#ecedef;color:#979aaa}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:after{position:absolute;content:'';left:-39%;width:69%;height:1px;bottom:1.4em;background-color:#ecedef}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:nth-child(4n+1):after{display:none}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-image{margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-title{font-weight:bold;margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-desc{color:#979aaa}@media (max-width: 768px){#llar-welcome-page .llar-welcome-page-features{display:block}}#llar-welcome-page .llar-why-recommend{text-align:left;font-size:17px}#llar-welcome-page .llar-why-recommend ul li span{margin-right:5px;width:auto;height:auto;font-size:25px;vertical-align:middle;color:green}#llar-welcome-page .llar-welcome-list{font-size:17px;text-align:left;line-height:1.4;list-style:none}#llar-welcome-page .llar-welcome-list li span{margin-right:10px;width:auto;height:auto;font-size:22px;vertical-align:top;color:orange}#llar-welcome-page .llar-upgrade-btn-wrap{padding:20px}#llar-welcome-page .llar-upgrade-btn-wrap a{display:inline-block;background-color:#e27800;color:#fff;font-size:22px;padding:20px;text-decoration:none;font-weight:600}#llar-welcome-page .llar-upgrade-btn-wrap a:hover{background-color:#af5d00}#llar-welcome-page .llar-upgrade-questions{font-size:17px}.dashboard_page_llar-welcome .update-nag,.dashboard_page_llar-welcome .notice,.toplevel_page_limit-login-attempts .update-nag,.toplevel_page_limit-login-attempts .notice{display:none}.dashboard_page_llar-welcome .video-container,.toplevel_page_limit-login-attempts .video-container{position:relative;padding-bottom:56.1%;height:0;overflow:hidden}.dashboard_page_llar-welcome .video-container iframe,.toplevel_page_limit-login-attempts .video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.jconfirm .jconfirm-box div.jconfirm-closeIcon{top:-2px !important;right:-2px !important}.llar-tooltip{text-decoration:underline;-webkit-text-decoration-style:dotted;text-decoration-style:dotted;cursor:pointer;position:relative}.llar-tooltip:before{content:attr(data-text);position:absolute;width:200px;padding:5px;background-color:rgba(0,0,0,0.8);color:#fff;font-size:13px;top:100%;z-index:999;visibility:hidden;opacity:0;-webkit-transition:all .2s;transition:all .2s;font-weight:300;cursor:auto}.llar-tooltip:hover:before{visibility:visible;opacity:1}#toplevel_page_limit-login-attempts .wp-menu-image.svg{background-size:25px auto !important;margin-top:7px}#llar-dashboard-page{padding-top:10px}#llar-dashboard-page *{-webkit-box-sizing:border-box;box-sizing:border-box}#llar-dashboard-page ul,#llar-dashboard-page ol{margin-left:0}#llar-dashboard-page ul li,#llar-dashboard-page ol li{list-style-position:inside}#llar-dashboard-page .dashboard-header{background-color:#0071a0;color:#fff;text-align:center;padding:15px}#llar-dashboard-page .dashboard-header h1{color:#fff}#llar-dashboard-page .section-title{font-weight:bold;padding:15px;border-bottom:1px solid #e4e4e4;font-size:14px;text-align:left}#llar-dashboard-page .section-content{padding:15px}#llar-dashboard-page .dashboard-section-1{margin-bottom:20px;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]{text-align:center;-webkit-box-flex:0;-ms-flex:0 0 33.333%;flex:0 0 33.333%;max-width:33.333%;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]:last-child{border:0}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"] .title{font-weight:600;font-size:16px;line-height:1.5;margin-bottom:10px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart{max-width:300px;position:relative;margin-bottom:15px;margin-left:auto;margin-right:auto}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .llar-retries-count{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);font-size:28px;font-weight:bold}#llar-dashboard-page .dashboard-section-1 .info-box-1 .desc{font-size:15px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .actions{margin-top:5px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap canvas{height:300px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .chart-stats-legend{text-align:center;margin-top:10px}#llar-dashboard-page .dashboard-section-1 .info-box-3{text-align:left}#llar-dashboard-page .dashboard-section-1 .info-box-3 .desc{margin-bottom:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions{text-align:center;padding-top:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions a{text-transform:uppercase;font-size:16px;margin-bottom:5px}#llar-dashboard-page .dashboard-section-1.custom .info-box-2{-webkit-box-flex:0;-ms-flex:0 0 66.666%;flex:0 0 66.666%;max-width:66.666%}#llar-dashboard-page .dashboard-section-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-2 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list{padding:0;margin:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li{margin:0;border-bottom:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li:last-child{border:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a{text-decoration:none;padding:15px;font-size:15px;display:block}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a:hover{background-color:#f9f9f9}#llar-dashboard-page .dashboard-section-2 .info-box-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon .dashicons{color:#0073a0;font-size:50px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.5}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-3{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;background-color:#fff;margin-bottom:20px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:30px 15px 30px 0;-webkit-box-flex:1;-ms-flex:1;flex:1;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon .dashicons{color:#a1a2a2;font-size:60px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.3}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title a{text-decoration:none}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-4 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table{width:100%;border-collapse:collapse}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th,#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td{padding:10px;border:1px solid #cecece}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th{background-color:#000;color:#fff;text-align:left}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr:nth-child(odd) td{background-color:#eff0ef}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td .flag-icon{width:24px;vertical-align:middle;margin-right:10px}#llar-dashboard-page .dashboard-section-4 .info-box-1 .countries-table-info{color:#a7a7a7;font-weight:400;margin-top:5px;margin-bottom:0}#llar-dashboard-page .dashboard-section-4 .info-box-2{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap canvas{height:300px}
assets/sass/limit-login-attempts.scss CHANGED
@@ -106,6 +106,37 @@
106
  background-color: #f9f9f9;
107
  }
108
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  .llar-app-log-pagination {
110
  > a {
111
  font-size: 16px;
106
  background-color: #f9f9f9;
107
  }
108
  }
109
+ .llar-table-header {
110
+ display: flex;
111
+ justify-content: space-between;
112
+ margin: 15px 0 5px;
113
+
114
+ h3 {
115
+ margin: 0;
116
+ }
117
+ .right-link {
118
+ line-height: 1.625;
119
+ a {
120
+ font-size: 14px;
121
+ }
122
+ .llar-tooltip {
123
+ text-decoration: none;
124
+ font-size: 12px;
125
+ display: inline-block;
126
+
127
+ &:before {
128
+ display: none;
129
+ }
130
+ &:hover {
131
+ &:before {
132
+ display: block;
133
+ right: 0;
134
+ left: auto;
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
  .llar-app-log-pagination {
141
  > a {
142
  font-size: 16px;
core/App.php CHANGED
@@ -244,6 +244,7 @@ class LLAR_App {
244
 
245
  $data['limit'] = $limit;
246
  $data['offset'] = $offset;
 
247
 
248
  return $this->request( 'log', 'get', $data );
249
  }
244
 
245
  $data['limit'] = $limit;
246
  $data['offset'] = $offset;
247
+ $data['is_short'] = 1;
248
 
249
  return $this->request( 'log', 'get', $data );
250
  }
core/LimitLoginAttempts.php CHANGED
@@ -2226,27 +2226,14 @@ into a must-use (MU) folder. You can read more <a href="%s" target="_blank">here
2226
  check_ajax_referer('llar-action', 'sec');
2227
 
2228
  $offset = sanitize_text_field( $_POST['offset'] );
 
2229
 
2230
- $log = $this->app->log( 25, $offset );
2231
 
2232
  if( $log ) {
2233
 
2234
- ob_start(); ?>
2235
-
2236
- <tr>
2237
- <th scope="col"><?php _e( "Time", 'limit-login-attempts-reloaded' ); ?></th>
2238
- <th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
2239
- <th scope="col"><?php _e( "Gateway", 'limit-login-attempts-reloaded' ); ?></th>
2240
- <th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
2241
- <th scope="col"><?php _e( "Rule", 'limit-login-attempts-reloaded' ); ?></th>
2242
- <th scope="col"><?php _e( "Reason", 'limit-login-attempts-reloaded' ); ?></th>
2243
- <th scope="col"><?php _e( "Pattern", 'limit-login-attempts-reloaded' ); ?></th>
2244
- <th scope="col"><?php _e( "Attempts Left", 'limit-login-attempts-reloaded' ); ?></th>
2245
- <th scope="col"><?php _e( "Lockout Duration", 'limit-login-attempts-reloaded' ); ?></th>
2246
- <th scope="col"><?php _e( "Actions", 'limit-login-attempts-reloaded' ); ?></th>
2247
- </tr>
2248
 
2249
- <?php
2250
  $date_format = get_option('date_format') . ' ' . get_option('time_format');
2251
  ?>
2252
 
@@ -2282,13 +2269,16 @@ into a must-use (MU) folder. You can read more <a href="%s" target="_blank">here
2282
  </tr>
2283
  <?php endforeach; ?>
2284
  <?php else : ?>
2285
- <tr class="empty-row"><td colspan="100%" style="text-align: center"><?php _e('No events yet.', 'limit-login-attempts-reloaded' ); ?></td></tr>
 
 
2286
  <?php endif; ?>
2287
  <?php
2288
 
2289
  wp_send_json_success(array(
2290
  'html' => ob_get_clean(),
2291
- 'offset' => $log['offset']
 
2292
  ));
2293
 
2294
  } else {
@@ -2309,20 +2299,14 @@ into a must-use (MU) folder. You can read more <a href="%s" target="_blank">here
2309
  check_ajax_referer('llar-action', 'sec');
2310
 
2311
  $offset = sanitize_text_field( $_POST['offset'] );
 
2312
 
2313
- $lockouts = $this->app->get_lockouts( 25, $offset );
2314
 
2315
  if( $lockouts ) {
2316
 
2317
  ob_start(); ?>
2318
 
2319
- <tr>
2320
- <th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
2321
- <th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
2322
- <th scope="col"><?php _e( "Count", 'limit-login-attempts-reloaded' ); ?></th>
2323
- <th scope="col"><?php _e( "Expires in (minutes)", 'limit-login-attempts-reloaded' ); ?></th>
2324
- </tr>
2325
-
2326
  <?php if( $lockouts['items'] ) : ?>
2327
  <?php foreach ( $lockouts['items'] as $item ) : ?>
2328
  <tr>
@@ -2334,7 +2318,9 @@ into a must-use (MU) folder. You can read more <a href="%s" target="_blank">here
2334
  <?php endforeach; ?>
2335
 
2336
  <?php else: ?>
 
2337
  <tr class="empty-row"><td colspan="4" style="text-align: center"><?php _e('No lockouts yet.', 'limit-login-attempts-reloaded' ); ?></td></tr>
 
2338
  <?php endif; ?>
2339
  <?php
2340
 
@@ -2370,32 +2356,19 @@ into a must-use (MU) folder. You can read more <a href="%s" target="_blank">here
2370
  check_ajax_referer('llar-action', 'sec');
2371
 
2372
  $type = sanitize_text_field( $_POST['type'] );
 
 
2373
 
2374
  $acl_list = $this->app->acl( array(
2375
- 'type' => $type
 
 
2376
  ) );
2377
 
2378
  if( $acl_list ) {
2379
 
2380
  ob_start(); ?>
2381
 
2382
- <tr>
2383
- <th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
2384
- <th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
2385
- <th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
2386
- </tr>
2387
- <tr>
2388
- <td><input class="regular-text llar-app-acl-pattern" type="text" placeholder="<?php esc_attr_e( 'Pattern', 'limit-login-attempts-reloaded' ); ?>"></td>
2389
- <td>
2390
- <select class="llar-app-acl-rule">
2391
- <option value="deny" selected><?php esc_html_e( 'Deny', 'limit-login-attempts-reloaded' ); ?></option>
2392
- <option value="allow"><?php esc_html_e( 'Allow', 'limit-login-attempts-reloaded' ); ?></option>
2393
- <option value="pass"><?php esc_html_e( 'Pass', 'limit-login-attempts-reloaded' ); ?></option>
2394
- </select>
2395
- </td>
2396
- <td class="llar-app-acl-action-col"><button class="button llar-app-acl-add-rule" data-type="<?php echo esc_attr( $type ); ?>"><?php _e( 'Add', 'limit-login-attempts-reloaded' ); ?></button></td>
2397
- </tr>
2398
-
2399
  <?php if( $acl_list['items'] ) : ?>
2400
  <?php foreach ( $acl_list['items'] as $item ) : ?>
2401
  <tr class="llar-app-rule-<?php echo esc_attr( $item['rule'] ); ?>">
@@ -2411,6 +2384,7 @@ into a must-use (MU) folder. You can read more <a href="%s" target="_blank">here
2411
 
2412
  wp_send_json_success(array(
2413
  'html' => ob_get_clean(),
 
2414
  ));
2415
 
2416
  } else {
2226
  check_ajax_referer('llar-action', 'sec');
2227
 
2228
  $offset = sanitize_text_field( $_POST['offset'] );
2229
+ $limit = sanitize_text_field( $_POST['limit'] );
2230
 
2231
+ $log = $this->app->log( $limit, $offset );
2232
 
2233
  if( $log ) {
2234
 
2235
+ ob_start();
 
 
 
 
 
 
 
 
 
 
 
 
 
2236
 
 
2237
  $date_format = get_option('date_format') . ' ' . get_option('time_format');
2238
  ?>
2239
 
2269
  </tr>
2270
  <?php endforeach; ?>
2271
  <?php else : ?>
2272
+ <?php if( empty( $offset ) ) : ?>
2273
+ <tr class="empty-row"><td colspan="100%" style="text-align: center"><?php _e('No events yet.', 'limit-login-attempts-reloaded' ); ?></td></tr>
2274
+ <?php endif; ?>
2275
  <?php endif; ?>
2276
  <?php
2277
 
2278
  wp_send_json_success(array(
2279
  'html' => ob_get_clean(),
2280
+ 'offset' => $log['offset'],
2281
+ 'total_items' => count( $log['items'] )
2282
  ));
2283
 
2284
  } else {
2299
  check_ajax_referer('llar-action', 'sec');
2300
 
2301
  $offset = sanitize_text_field( $_POST['offset'] );
2302
+ $limit = sanitize_text_field( $_POST['limit'] );
2303
 
2304
+ $lockouts = $this->app->get_lockouts( $limit, $offset );
2305
 
2306
  if( $lockouts ) {
2307
 
2308
  ob_start(); ?>
2309
 
 
 
 
 
 
 
 
2310
  <?php if( $lockouts['items'] ) : ?>
2311
  <?php foreach ( $lockouts['items'] as $item ) : ?>
2312
  <tr>
2318
  <?php endforeach; ?>
2319
 
2320
  <?php else: ?>
2321
+ <?php if( empty( $offset ) ) : ?>
2322
  <tr class="empty-row"><td colspan="4" style="text-align: center"><?php _e('No lockouts yet.', 'limit-login-attempts-reloaded' ); ?></td></tr>
2323
+ <?php endif; ?>
2324
  <?php endif; ?>
2325
  <?php
2326
 
2356
  check_ajax_referer('llar-action', 'sec');
2357
 
2358
  $type = sanitize_text_field( $_POST['type'] );
2359
+ $limit = sanitize_text_field( $_POST['limit'] );
2360
+ $offset = sanitize_text_field( $_POST['offset'] );
2361
 
2362
  $acl_list = $this->app->acl( array(
2363
+ 'type' => $type,
2364
+ 'limit' => $limit,
2365
+ 'offset' => $offset
2366
  ) );
2367
 
2368
  if( $acl_list ) {
2369
 
2370
  ob_start(); ?>
2371
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2372
  <?php if( $acl_list['items'] ) : ?>
2373
  <?php foreach ( $acl_list['items'] as $item ) : ?>
2374
  <tr class="llar-app-rule-<?php echo esc_attr( $item['rule'] ); ?>">
2384
 
2385
  wp_send_json_success(array(
2386
  'html' => ob_get_clean(),
2387
+ 'offset' => $acl_list['offset']
2388
  ));
2389
 
2390
  } else {
limit-login-attempts-reloaded.php CHANGED
@@ -5,7 +5,7 @@ Description: Limit the rate of login attempts for each IP address.
5
  Author: Limit Login Attempts Reloaded
6
  Author URI: https://www.limitloginattempts.com/
7
  Text Domain: limit-login-attempts-reloaded
8
- Version: 2.23.0
9
 
10
  Copyright 2008 - 2012 Johan Eenfeldt, 2016 - 2021 Limit Login Attempts Reloaded
11
  */
5
  Author: Limit Login Attempts Reloaded
6
  Author URI: https://www.limitloginattempts.com/
7
  Text Domain: limit-login-attempts-reloaded
8
+ Version: 2.23.1
9
 
10
  Copyright 2008 - 2012 Johan Eenfeldt, 2016 - 2021 Limit Login Attempts Reloaded
11
  */
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: wpchefgadget
3
  Donate link: https://www.paypal.com/donate?hosted_button_id=FKD4MYFCMNVQQ
4
  Tags: brute force, login, security, firewall, protection
5
  Requires at least: 3.0
6
- Tested up to: 5.7
7
- Stable tag: 2.23.0
8
 
9
  Reloaded version of the original Limit Login Attempts plugin for Login Protection by a team of WordPress developers. GDPR compliant.
10
 
@@ -98,6 +98,9 @@ Please follow this link: <a href="https://www.limitloginattempts.com/resources/"
98
 
99
  == Changelog ==
100
 
 
 
 
101
  = 2.23.0 =
102
  * Reduced plugin size by removing obsolete translations.
103
  * Cleaned up the dashboard.
3
  Donate link: https://www.paypal.com/donate?hosted_button_id=FKD4MYFCMNVQQ
4
  Tags: brute force, login, security, firewall, protection
5
  Requires at least: 3.0
6
+ Tested up to: 5.8
7
+ Stable tag: 2.23.1
8
 
9
  Reloaded version of the original Limit Login Attempts plugin for Login Protection by a team of WordPress developers. GDPR compliant.
10
 
98
 
99
  == Changelog ==
100
 
101
+ = 2.23.1 =
102
+ * Added infinite scroll for cloud logs.
103
+
104
  = 2.23.0 =
105
  * Reduced plugin size by removing obsolete translations.
106
  * Cleaned up the dashboard.
views/app-widgets/acl-rules.php CHANGED
@@ -5,23 +5,49 @@ if( !defined( 'ABSPATH' ) ) exit();
5
  <div class="llar-app-acl-rules">
6
  <div class="app-rules-col">
7
  <h3><?php _e( 'Login Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
8
- <table class="form-table llar-app-login-access-rules-table">
9
- <tr>
10
- <th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
11
- <th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
12
- <th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
13
- </tr>
14
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  </div>
16
  <div class="app-rules-col">
17
  <h3><?php _e( 'IP Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
18
- <table class="form-table llar-app-ip-access-rules-table">
19
- <tr>
20
- <th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
21
- <th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
22
- <th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
23
- </tr>
24
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  </div>
26
 
27
  <script type="text/javascript">
@@ -29,7 +55,25 @@ if( !defined( 'ABSPATH' ) ) exit();
29
 
30
  $(document).ready(function () {
31
 
32
- var $app_acl_rules = $('.llar-app-acl-rules');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
  load_rules_data('login');
35
  load_rules_data('ip');
@@ -129,26 +173,69 @@ if( !defined( 'ABSPATH' ) ) exit();
129
 
130
  });
131
 
132
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
 
134
- function load_rules_data(type) {
 
 
 
 
 
 
135
 
136
- llar.progressbar.start();
137
 
138
- $.post(ajaxurl, {
139
- action: 'app_load_acl_rules',
140
- type: type,
141
- sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
142
- }, function(response){
143
 
144
- llar.progressbar.stop();
145
 
146
- if(response.success) {
147
 
148
- $('.llar-app-'+type+'-access-rules-table').html(response.data.html);
149
- }
150
- });
151
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
  })(jQuery);
154
  </script>
5
  <div class="llar-app-acl-rules">
6
  <div class="app-rules-col">
7
  <h3><?php _e( 'Login Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
8
+ <div class="llar-table-scroll-wrap llar-app-login-access-rules-infinity-scroll">
9
+ <table class="form-table llar-app-login-access-rules-table">
10
+ <tr>
11
+ <th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
12
+ <th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
13
+ <th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
14
+ </tr>
15
+ <tr>
16
+ <td><input class="regular-text llar-app-acl-pattern" type="text" placeholder="<?php esc_attr_e( 'Pattern', 'limit-login-attempts-reloaded' ); ?>"></td>
17
+ <td>
18
+ <select class="llar-app-acl-rule">
19
+ <option value="deny" selected><?php esc_html_e( 'Deny', 'limit-login-attempts-reloaded' ); ?></option>
20
+ <option value="allow"><?php esc_html_e( 'Allow', 'limit-login-attempts-reloaded' ); ?></option>
21
+ <option value="pass"><?php esc_html_e( 'Pass', 'limit-login-attempts-reloaded' ); ?></option>
22
+ </select>
23
+ </td>
24
+ <td class="llar-app-acl-action-col"><button class="button llar-app-acl-add-rule" data-type="login"><?php _e( 'Add', 'limit-login-attempts-reloaded' ); ?></button></td>
25
+ </tr>
26
+ </table>
27
+ </div>
28
  </div>
29
  <div class="app-rules-col">
30
  <h3><?php _e( 'IP Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
31
+ <div class="llar-table-scroll-wrap llar-app-ip-access-rules-infinity-scroll">
32
+ <table class="form-table llar-app-ip-access-rules-table">
33
+ <tr>
34
+ <th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
35
+ <th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
36
+ <th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
37
+ </tr>
38
+ <tr>
39
+ <td><input class="regular-text llar-app-acl-pattern" type="text" placeholder="<?php esc_attr_e( 'Pattern', 'limit-login-attempts-reloaded' ); ?>"></td>
40
+ <td>
41
+ <select class="llar-app-acl-rule">
42
+ <option value="deny" selected><?php esc_html_e( 'Deny', 'limit-login-attempts-reloaded' ); ?></option>
43
+ <option value="allow"><?php esc_html_e( 'Allow', 'limit-login-attempts-reloaded' ); ?></option>
44
+ <option value="pass"><?php esc_html_e( 'Pass', 'limit-login-attempts-reloaded' ); ?></option>
45
+ </select>
46
+ </td>
47
+ <td class="llar-app-acl-action-col"><button class="button llar-app-acl-add-rule" data-type="ip"><?php _e( 'Add', 'limit-login-attempts-reloaded' ); ?></button></td>
48
+ </tr>
49
+ </table>
50
+ </div>
51
  </div>
52
 
53
  <script type="text/javascript">
55
 
56
  $(document).ready(function () {
57
 
58
+ var $app_acl_rules = $('.llar-app-acl-rules'),
59
+ $infinity_box1 = $('.llar-app-login-access-rules-infinity-scroll'),
60
+ $infinity_box2 = $('.llar-app-ip-access-rules-infinity-scroll'),
61
+ loading_data1 = false,
62
+ loading_data2 = false,
63
+ page_offset1 = '',
64
+ page_offset2 = '',
65
+ page_limit = 10;
66
+
67
+ $infinity_box1.on('scroll', function (){
68
+ if (!loading_data1 && $infinity_box1.get(0).scrollTop + $infinity_box1.get(0).clientHeight >= $infinity_box1.get(0).scrollHeight - 1) {
69
+ load_rules_data('login');
70
+ }
71
+ });
72
+ $infinity_box2.on('scroll', function (){
73
+ if (!loading_data2 && $infinity_box2.get(0).scrollTop + $infinity_box2.get(0).clientHeight >= $infinity_box2.get(0).scrollHeight - 1) {
74
+ load_rules_data('ip');
75
+ }
76
+ });
77
 
78
  load_rules_data('login');
79
  load_rules_data('ip');
173
 
174
  });
175
 
176
+ function load_rules_data(type) {
177
+
178
+ if(type === 'login') {
179
+
180
+ if(page_offset1 === false) {
181
+ return;
182
+ }
183
+
184
+ loading_data1 = true;
185
+ } else if(type === 'ip') {
186
+
187
+ if(page_offset2 === false) {
188
+ return;
189
+ }
190
+
191
+ loading_data2 = true;
192
+ }
193
+
194
+ llar.progressbar.start();
195
 
196
+ $.post(ajaxurl, {
197
+ action: 'app_load_acl_rules',
198
+ type: type,
199
+ limit: page_limit,
200
+ offset: (type === 'login') ? page_offset1 : page_offset2,
201
+ sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
202
+ }, function(response){
203
 
204
+ llar.progressbar.stop();
205
 
206
+ if(response.success) {
 
 
 
 
207
 
208
+ $('.llar-app-'+type+'-access-rules-table').append(response.data.html);
209
 
210
+ if(type === 'login') {
211
 
212
+ if(response.data.offset) {
213
+ page_offset1 = response.data.offset;
214
+ } else {
215
+ page_offset1 = false;
216
+ }
217
+
218
+ } else if(type === 'ip') {
219
+
220
+ if(response.data.offset) {
221
+ page_offset2 = response.data.offset;
222
+ } else {
223
+ page_offset2 = false;
224
+ }
225
+ }
226
+ }
227
+
228
+ if(type === 'login') {
229
+
230
+ loading_data1 = false;
231
+ } else if(type === 'ip') {
232
+
233
+ loading_data2 = false;
234
+ }
235
+ });
236
+ }
237
+
238
+ });
239
 
240
  })(jQuery);
241
  </script>
views/app-widgets/active-lockouts.php CHANGED
@@ -4,75 +4,50 @@ if( !defined( 'ABSPATH' ) ) exit();
4
 
5
  <h3><?php _e( 'Active Lockouts', 'limit-login-attempts-reloaded' ); ?></h3>
6
 
7
- <div class="llar-app-lockouts-pagination">
8
- <a class="llar-prev-page button disabled" href="#">
9
- <span aria-hidden="true">‹</span>
10
- </a>
11
- <a class="llar-next-page button disabled" href="#">
12
- <span aria-hidden="true">›</span>
13
- </a>
 
 
14
  </div>
15
 
16
- <table class="form-table llar-table-app-lockouts">
17
- <tr>
18
- <th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
19
- <th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
20
- <th scope="col"><?php _e( "Count", 'limit-login-attempts-reloaded' ); ?></th>
21
- <th scope="col"><?php _e( "Expires in (minutes)", 'limit-login-attempts-reloaded' ); ?></th>
22
- </tr>
23
- </table>
24
-
25
  <script type="text/javascript">
26
  ;(function($){
27
 
28
  $(document).ready(function () {
29
 
30
  var $log_table = $('.llar-table-app-lockouts'),
31
- current_page = 0,
32
- page_offsets = [''];
33
-
34
- load_lockouts_data();
35
-
36
- $('.llar-app-lockouts-pagination').on('click', '.llar-prev-page:not(.disabled)', function(e){
37
- e.preventDefault();
38
-
39
- load_lockouts_data(page_offsets[--current_page]);
40
-
41
- toggle_next_btn(true);
42
- });
43
-
44
- $('.llar-app-lockouts-pagination').on('click', '.llar-next-page:not(.disabled)', function(e){
45
- e.preventDefault();
46
-
47
- load_lockouts_data(page_offsets[++current_page]);
48
- });
49
-
50
- function toggle_prev_btn(enable) {
51
- if(enable) {
52
 
53
- $('.llar-app-lockouts-pagination .llar-prev-page').removeClass('disabled');
54
- } else {
 
 
 
55
 
56
- $('.llar-app-lockouts-pagination .llar-prev-page').addClass('disabled');
57
- }
58
- }
59
- function toggle_next_btn(enable) {
60
- if(enable) {
61
 
62
- $('.llar-app-lockouts-pagination .llar-next-page').removeClass('disabled');
63
- } else {
64
 
65
- $('.llar-app-lockouts-pagination .llar-next-page').addClass('disabled');
66
- }
67
- }
68
 
69
- function load_lockouts_data(offset) {
70
 
71
  llar.progressbar.start();
72
 
73
  $.post(ajaxurl, {
74
  action: 'app_load_lockouts',
75
- offset: offset,
 
76
  sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
77
  }, function(response){
78
 
@@ -80,31 +55,22 @@ if( !defined( 'ABSPATH' ) ) exit();
80
 
81
  if(response.success) {
82
 
83
- $log_table.html(response.data.html);
84
-
85
- if(current_page > 0) {
86
- toggle_prev_btn(true);
87
- } else {
88
- toggle_prev_btn(false);
89
-
90
- }
91
-
92
- if(response.data.offset) {
93
- page_offsets.push(response.data.offset);
94
- toggle_next_btn(true);
95
- } else {
96
- toggle_next_btn(false);
97
- }
98
 
 
 
 
 
 
99
  } else {
100
 
101
  if(response.data.error_notice) {
102
  $('.limit-login-app-dashboard').find('.llar-app-notice').remove();
103
  $('.limit-login-app-dashboard').prepend(response.data.error_notice);
104
  }
105
-
106
  }
107
 
 
108
  });
109
 
110
  }
4
 
5
  <h3><?php _e( 'Active Lockouts', 'limit-login-attempts-reloaded' ); ?></h3>
6
 
7
+ <div class="llar-table-scroll-wrap llar-app-lockouts-infinity-scroll">
8
+ <table class="form-table llar-table-app-lockouts">
9
+ <tr>
10
+ <th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
11
+ <th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
12
+ <th scope="col"><?php _e( "Count", 'limit-login-attempts-reloaded' ); ?></th>
13
+ <th scope="col"><?php _e( "Expires in (minutes)", 'limit-login-attempts-reloaded' ); ?></th>
14
+ </tr>
15
+ </table>
16
  </div>
17
 
 
 
 
 
 
 
 
 
 
18
  <script type="text/javascript">
19
  ;(function($){
20
 
21
  $(document).ready(function () {
22
 
23
  var $log_table = $('.llar-table-app-lockouts'),
24
+ $infinity_box = $('.llar-app-lockouts-infinity-scroll'),
25
+ loading_data = false,
26
+ page_offset = '',
27
+ page_limit = 10;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
+ $infinity_box.on('scroll', function (){
30
+ if (!loading_data && $infinity_box.get(0).scrollTop + $infinity_box.get(0).clientHeight >= $infinity_box.get(0).scrollHeight - 1) {
31
+ load_lockouts_data();
32
+ }
33
+ });
34
 
35
+ load_lockouts_data();
 
 
 
 
36
 
37
+ function load_lockouts_data() {
 
38
 
39
+ if(page_offset === false) {
40
+ return;
41
+ }
42
 
43
+ loading_data = true;
44
 
45
  llar.progressbar.start();
46
 
47
  $.post(ajaxurl, {
48
  action: 'app_load_lockouts',
49
+ offset: page_offset,
50
+ limit: page_limit,
51
  sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
52
  }, function(response){
53
 
55
 
56
  if(response.success) {
57
 
58
+ $log_table.append(response.data.html);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
+ if(response.data.offset) {
61
+ page_offset = response.data.offset;
62
+ } else {
63
+ page_offset = false;
64
+ }
65
  } else {
66
 
67
  if(response.data.error_notice) {
68
  $('.limit-login-app-dashboard').find('.llar-app-notice').remove();
69
  $('.limit-login-app-dashboard').prepend(response.data.error_notice);
70
  }
 
71
  }
72
 
73
+ loading_data = false;
74
  });
75
 
76
  }
views/app-widgets/event-log.php CHANGED
@@ -1,19 +1,21 @@
1
  <?php
2
  if( !defined( 'ABSPATH' ) ) exit();
3
  ?>
4
-
5
- <h3><?php _e( 'Event Log', 'limit-login-attempts-reloaded' ); ?></h3>
6
-
7
- <div class="llar-app-log-pagination">
8
- <a class="llar-prev-page button disabled" href="#">
9
- <span aria-hidden="true">‹</span>
10
- </a>
11
- <a class="llar-next-page button disabled" href="#">
12
- <span aria-hidden="true">›</span>
13
- </a>
 
 
14
  </div>
15
 
16
- <div class="llar-table-scroll-wrap">
17
  <table class="form-table llar-table-app-log">
18
  <tr>
19
  <th scope="col"><?php _e( "Time", 'limit-login-attempts-reloaded' ); ?></th>
@@ -35,25 +37,20 @@ if( !defined( 'ABSPATH' ) ) exit();
35
  $(document).ready(function () {
36
 
37
  var $log_table = $('.llar-table-app-log'),
38
- current_page = 0,
39
- page_offsets = [''];
 
 
 
 
 
 
 
 
 
40
 
41
  load_log_data();
42
 
43
- $('.llar-app-log-pagination').on('click', '.llar-prev-page:not(.disabled)', function(e){
44
- e.preventDefault();
45
-
46
- load_log_data(page_offsets[--current_page]);
47
-
48
- toggle_next_btn(true);
49
- });
50
-
51
- $('.llar-app-log-pagination').on('click', '.llar-next-page:not(.disabled)', function(e){
52
- e.preventDefault();
53
-
54
- load_log_data(page_offsets[++current_page]);
55
- });
56
-
57
  $log_table.on('click', '.js-app-log-action', function (e) {
58
  e.preventDefault();
59
 
@@ -83,32 +80,19 @@ if( !defined( 'ABSPATH' ) ) exit();
83
  });
84
  });
85
 
86
- function toggle_prev_btn(enable) {
87
- if(enable) {
88
-
89
- $('.llar-app-log-pagination .llar-prev-page').removeClass('disabled');
90
- } else {
91
-
92
- $('.llar-app-log-pagination .llar-prev-page').addClass('disabled');
93
- }
94
- }
95
- function toggle_next_btn(enable) {
96
- if(enable) {
97
-
98
- $('.llar-app-log-pagination .llar-next-page').removeClass('disabled');
99
- } else {
100
-
101
- $('.llar-app-log-pagination .llar-next-page').addClass('disabled');
102
- }
103
- }
104
 
105
- function load_log_data(offset) {
 
 
106
 
107
  llar.progressbar.start();
 
108
 
109
  $.post(ajaxurl, {
110
  action: 'app_load_log',
111
- offset: offset,
 
112
  sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
113
  }, function(response){
114
 
@@ -116,22 +100,23 @@ if( !defined( 'ABSPATH' ) ) exit();
116
 
117
  if(response.success) {
118
 
119
- $log_table.html(response.data.html);
120
 
121
- if(current_page > 0) {
122
- toggle_prev_btn(true);
123
- } else {
124
- toggle_prev_btn(false);
125
 
126
- }
 
 
 
127
 
128
- if(response.data.offset) {
129
- page_offsets.push(response.data.offset);
130
- toggle_next_btn(true);
131
  } else {
132
- toggle_next_btn(false);
133
- }
134
 
 
135
  }
136
 
137
  });
1
  <?php
2
  if( !defined( 'ABSPATH' ) ) exit();
3
  ?>
4
+ <?php
5
+ $app_config = $this->get_custom_app_config();
6
+ ?>
7
+ <div class="llar-table-header">
8
+ <h3><?php _e( 'Event Log', 'limit-login-attempts-reloaded' ); ?></h3>
9
+ <?php if( !empty( $app_config['key'] ) ): ?>
10
+ <span class="right-link"><a href="https://my.limitloginattempts.com/logs?key=<?php echo esc_attr( $app_config['key'] ); ?>" target="_blank"><?php _e( 'Full Logs', 'limit-login-attempts-reloaded' ); ?></a>
11
+ <i class="llar-tooltip" data-text="<?php esc_attr_e( 'All attempts blocked by access rules are hidden by default. You can see the full log at this link.' ); ?>">
12
+ <span class="dashicons dashicons-editor-help"></span>
13
+ </i>
14
+ </span>
15
+ <?php endif; ?>
16
  </div>
17
 
18
+ <div class="llar-table-scroll-wrap llar-app-log-infinity-scroll">
19
  <table class="form-table llar-table-app-log">
20
  <tr>
21
  <th scope="col"><?php _e( "Time", 'limit-login-attempts-reloaded' ); ?></th>
37
  $(document).ready(function () {
38
 
39
  var $log_table = $('.llar-table-app-log'),
40
+ $infinity_box = $('.llar-app-log-infinity-scroll'),
41
+ loading_data = false,
42
+ page_offset = '',
43
+ page_limit = 10,
44
+ total_loaded = 0;
45
+
46
+ $infinity_box.on('scroll', function (){
47
+ if (!loading_data && $infinity_box.get(0).scrollTop + $infinity_box.get(0).clientHeight >= $infinity_box.get(0).scrollHeight - 1) {
48
+ load_log_data();
49
+ }
50
+ });
51
 
52
  load_log_data();
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  $log_table.on('click', '.js-app-log-action', function (e) {
55
  e.preventDefault();
56
 
80
  });
81
  });
82
 
83
+ function load_log_data() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
 
85
+ if(page_offset === false) {
86
+ return;
87
+ }
88
 
89
  llar.progressbar.start();
90
+ loading_data = true;
91
 
92
  $.post(ajaxurl, {
93
  action: 'app_load_log',
94
+ offset: page_offset,
95
+ limit: page_limit,
96
  sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
97
  }, function(response){
98
 
100
 
101
  if(response.success) {
102
 
103
+ $log_table.append(response.data.html);
104
 
105
+ total_loaded += response.data.total_items;
106
+
107
+ if(response.data.offset) {
108
+ page_offset = response.data.offset;
109
 
110
+ if(response.data.total_items < page_limit && total_loaded < page_limit) {
111
+ console.log('extra load');
112
+ load_log_data();
113
+ }
114
 
 
 
 
115
  } else {
116
+ page_offset = false;
117
+ }
118
 
119
+ loading_data = false;
120
  }
121
 
122
  });