Plugin Directory

Changeset 3233179


Ignore:
Timestamp:
02/01/2025 05:14:33 PM (14 months ago)
Author:
hcaptcha
Message:

Update to version 4.10.0 from GitHub

Location:
hcaptcha-for-forms-and-more
Files:
14 added
110 edited
1 copied

Legend:

Unmodified
Added
Removed
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/events.css

    r3166267 r3233179  
    4949}
    5050
    51 @media (max-width: 600px) {
     51@media (max-width: 782px) {
    5252    #hcaptcha-options #hcaptcha-events-wrap table tbody tr td {
    5353        padding-block-start: 3px;
     
    5555        padding-block-end: 3px;
    5656        padding-inline-start: 35%;
     57        min-height: 19.5px;
    5758    }
    5859
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/events.min.css

    r3166267 r3233179  
    1 #hcaptcha-options #hcaptcha-events-wrap table tbody tr td{padding:8px 10px}.hcaptcha-events-sample-bg{aspect-ratio:2882/1943;background-image:url(../images/events-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-events-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-events-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-events-sample-text p a{color:#f0f2f5}#hcaptcha-events-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}#hcaptcha-events-wrap #user_agent{width:220px}@media (max-width:600px){#hcaptcha-options #hcaptcha-events-wrap table tbody tr td{padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-events-wrap table tbody tr td.column-primary{padding:3px 10px}}
     1#hcaptcha-options #hcaptcha-events-wrap table tbody tr td{padding:8px 10px}.hcaptcha-events-sample-bg{aspect-ratio:2882/1943;background-image:url(../images/events-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-events-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-events-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-events-sample-text p a{color:#f0f2f5}#hcaptcha-events-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}#hcaptcha-events-wrap #user_agent{width:220px}@media (max-width:782px){#hcaptcha-options #hcaptcha-events-wrap table tbody tr td{min-height:19.5px;padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-events-wrap table tbody tr td.column-primary{padding:3px 10px}}
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/forms.css

    r3166267 r3233179  
    4545}
    4646
    47 @media (max-width: 600px) {
     47@media (max-width: 782px) {
    4848    #hcaptcha-options #hcaptcha-forms-wrap table tbody tr td {
    4949        padding-block-start: 3px;
     
    5151        padding-block-end: 3px;
    5252        padding-inline-start: 35%;
     53        min-height: 19.5px;
    5354    }
    5455
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/forms.min.css

    r3166267 r3233179  
    1 #hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{padding:8px 10px}.hcaptcha-forms-sample-bg{aspect-ratio:2845/1637;background-image:url(../images/forms-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-forms-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-forms-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-forms-sample-text p a{color:#f0f2f5}#hcaptcha-forms-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}@media (max-width:600px){#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td.column-primary{padding:3px 10px}}
     1#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{padding:8px 10px}.hcaptcha-forms-sample-bg{aspect-ratio:2845/1637;background-image:url(../images/forms-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-forms-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-forms-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-forms-sample-text p a{color:#f0f2f5}#hcaptcha-forms-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}@media (max-width:782px){#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{min-height:19.5px;padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td.column-primary{padding:3px 10px}}
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/settings-base.css

    r3215681 r3233179  
    5454    position: sticky;
    5555    top: 60px;
    56     z-index: 1;
     56    z-index: 2;
    5757    background: #f0f2f5;
    5858    display: flex;
     
    8787}
    8888
    89 #hcaptcha-options table tr td input[type="checkbox"] {
     89#hcaptcha-options table tr td fieldset input[type="checkbox"] {
    9090    display: inline;
    9191    border: none;
     
    9999}
    100100
    101 #hcaptcha-options table tr td input[type="checkbox"]::before {
     101#hcaptcha-options table tr td fieldset input[type="checkbox"]::before {
    102102    background: url('../images/checkbox-off.svg');
    103103    background-size: cover;
     
    109109}
    110110
    111 #hcaptcha-options table tr td input[type="checkbox"]:checked::before {
     111#hcaptcha-options table tr td fieldset input[type="checkbox"]:checked::before {
    112112    background: no-repeat url('../images/checkbox-on.svg');
    113113    background-size: cover;
     
    251251.hcaptcha-excerpt {
    252252    display: block;
     253    position: relative;
     254    width: max-content;
     255    max-width: 100%;
    253256    overflow: hidden;
    254257    white-space: nowrap;
    255258    text-overflow: ellipsis;
     259}
     260
     261.hcaptcha-excerpt:hover {
     262    overflow: visible;
    256263}
    257264
     
    265272    width: max-content;
    266273    padding: 8px 10px;
    267     top: 0;
    268     inset-inline-start: 0;
     274    top: 50%;
     275    inset-inline-start: 50%;
     276    transform: translate(-50%, -50%);
    269277    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
    270278    border-radius: 6px;
     
    275283
    276284@media (max-width: 782px) {
     285    #hcaptcha-options .wp-list-table .toggle-row {
     286        top: 15px;
     287    }
     288
     289    #hcaptcha-options .wp-list-table tr.is-expanded .toggle-row {
     290        top: 6.5px;
     291    }
     292
     293    #hcaptcha-options .widefat tbody th.check-column {
     294        padding: 0;
     295        vertical-align: middle;
     296    }
     297
     298    #hcaptcha-options .widefat thead td.check-column, .widefat tfoot td.check-column {
     299        padding-left: 0;
     300    }
     301
     302    #hcaptcha-options .widefat th input[type="checkbox"] {
     303        margin-bottom: 0;
     304    }
     305
     306    #hcaptcha-options .wp-list-table .is-expanded td:not(.hidden) {
     307        overflow: visible;
     308    }
     309
    277310    .hcaptcha-settings-tabs {
    278311        margin: unset;
     
    286319        padding-inline-start: 10px;
    287320    }
     321
     322    .hcaptcha-excerpt {
     323        display: table-cell;
     324        vertical-align: middle;
     325        height: 44px;
     326    }
     327
     328    tr.is-expanded .hcaptcha-excerpt {
     329        height: 19.5px;
     330    }
    288331}
    289332
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/settings-base.min.css

    r3215681 r3233179  
    1 body.settings_page_hcaptcha{background:#f0f2f5;color:#5c6f8a}.wrap h1.hcaptcha-settings-header{align-items:center;display:flex;font-size:34px;font-weight:700}.hcaptcha-logo{height:64px;margin-block-end:10px;margin-block-start:10px;margin-inline-end:5px;margin-inline-start:0}.hcaptcha-settings-tabs{background:#fff;display:flex;flex-wrap:wrap;justify-content:space-between;line-height:4.5em;margin:10px -20px 0;padding:0 20px;position:sticky;top:0;z-index:2}.hcaptcha-settings-tab{border-bottom:2px solid transparent;color:#646970;display:inline-block;font-size:1.1em;margin-inline-end:30px;text-decoration:none}.hcaptcha-settings-tab:hover{border-bottom-color:#025176!important;border-bottom:2px solid;color:#666}.hcaptcha-settings-tab.active{border-bottom:2px solid #0075ab}.hcaptcha-header-bar{align-items:center;background:#f0f2f5;display:flex;justify-content:space-between;margin:0 -20px;padding:0 20px;position:sticky;top:60px;z-index:1}#hcaptcha-options h2{color:#5c6f8a;font-size:1.5em}#hcaptcha-options h2~*{display:none}#hcaptcha-options h3{color:#5c6f8a;margin:1.5em 0 1em}#hcaptcha-options .notice-dismiss:before{color:#5c6f8a}#hcaptcha-options table tbody tr td{margin:0;padding:0;position:relative}#hcaptcha-options table tr td input[type=checkbox]{border:none;box-shadow:none;display:inline;height:1.25rem;margin-block-end:0;margin-block-start:-.125rem;margin-inline-end:.5rem;margin-inline-start:0;width:2.3611rem}#hcaptcha-options table tr td input[type=checkbox]:before{background:url(../images/checkbox-off.svg);background-size:cover;content:"";display:inline-block;height:1.25rem;margin:0;width:2.3611rem}#hcaptcha-options table tr td input[type=checkbox]:checked:before{background:no-repeat url(../images/checkbox-on.svg);background-size:cover}#hcaptcha-options fieldset:disabled{color:#dadada}#hcaptcha-options .button-primary{background-color:#026593;border-color:#026593;color:#fff}#hcaptcha-options .button-primary:hover{background-color:#025176}#hcaptcha-options .button-secondary{background-color:#fff;border-color:#026593;color:#026593}#hcaptcha-options .button-secondary:hover{background-color:#ccc}#hcaptcha-options a{color:#0075ab}#hcaptcha-navigation a{border-color:#0075ab}#hcaptcha-options a.hcaptcha-settings-tab{color:#5c6f8a}#hcaptcha-options .helper:before{background:#5c6f8a;border-radius:1.2em;color:#fff;content:"?";height:1.2em;inset-inline-end:0;position:absolute;text-align:center;top:0;transform:translateY(-27px);width:1.2em}#hcaptcha-options fieldset+.helper:before{top:50%;transform:translate(25px,-.7em)}.rtl #hcaptcha-options fieldset+.helper:before{transform:translate(-25px,-.8em)}#hcaptcha-options .helper .helper-content{background:#5c6f8a;box-sizing:border-box;color:#f0f2f5;display:none;inset-inline-end:0;padding:.5em 1em;position:absolute;top:0;transform:translate(1px,10px);width:100%}.rtl #hcaptcha-options .helper .helper-content{transform:translate(-1px,10px)}#hcaptcha-options fieldset+.helper .helper-content{top:50%;transform:translate(25px,25px);width:calc(100% + 25px)}#hcaptcha-options .helper:hover{cursor:help}#hcaptcha-options .helper:hover .helper-content{display:block;z-index:1}#hcaptcha-options .helper .helper-content:after{border:10px solid transparent;border-bottom-color:#5c6f8a;content:"";inset-inline-end:0;position:absolute;top:0;transform:translateY(-100%)}#hcaptcha-options .helper .helper-content a{color:#fff}#hcaptcha-message{box-sizing:border-box}#hcaptcha-message>p{font-size:13px;font-weight:600;line-height:1.5;margin:.5em 0}@keyframes blink{0%{opacity:1}16.7%{opacity:0}33.3%{opacity:1}50%{opacity:0}66.7%{opacity:1}83.3%{opacity:0}to{opacity:1}}.blink{animation:blink 3s linear}.hcaptcha-hide{display:none}.hcaptcha-excerpt{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hcaptcha-excerpt:hover .hcaptcha-hide{background:#5c6f8a;border:1px solid #c3c4c7;border-radius:6px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);color:#f0f2f5;display:block;inset-inline-start:0;max-width:300px;padding:8px 10px;position:absolute;text-align:center;top:0;white-space:normal;width:max-content;z-index:1}@media (max-width:782px){.hcaptcha-settings-tabs{margin:unset;margin-block-end:0;margin-block-start:10px;margin-inline-end:-12px;margin-inline-start:-10px;padding-block-end:0;padding-block-start:0;padding-inline-end:12px;padding-inline-start:10px}}@media (max-width:600px){#hcaptcha-options table tbody{grid-template-columns:1fr}#hcaptcha-options table tbody tr{position:relative}#hcaptcha-options fieldset+.helper:before{transform:translateY(-.7em)}#hcaptcha-options fieldset+.helper .helper-content{transform:translateY(25px);width:100%}#hcaptcha-options .helper{z-index:1}.hcaptcha-settings-tab{inset-inline-end:15px}}
     1body.settings_page_hcaptcha{background:#f0f2f5;color:#5c6f8a}.wrap h1.hcaptcha-settings-header{align-items:center;display:flex;font-size:34px;font-weight:700}.hcaptcha-logo{height:64px;margin-block-end:10px;margin-block-start:10px;margin-inline-end:5px;margin-inline-start:0}.hcaptcha-settings-tabs{background:#fff;display:flex;flex-wrap:wrap;justify-content:space-between;line-height:4.5em;margin:10px -20px 0;padding:0 20px;position:sticky;top:0;z-index:2}.hcaptcha-settings-tab{border-bottom:2px solid transparent;color:#646970;display:inline-block;font-size:1.1em;margin-inline-end:30px;text-decoration:none}.hcaptcha-settings-tab:hover{border-bottom-color:#025176!important;border-bottom:2px solid;color:#666}.hcaptcha-settings-tab.active{border-bottom:2px solid #0075ab}.hcaptcha-header-bar{align-items:center;background:#f0f2f5;display:flex;justify-content:space-between;margin:0 -20px;padding:0 20px;position:sticky;top:60px;z-index:2}#hcaptcha-options h2{color:#5c6f8a;font-size:1.5em}#hcaptcha-options h2~*{display:none}#hcaptcha-options h3{color:#5c6f8a;margin:1.5em 0 1em}#hcaptcha-options .notice-dismiss:before{color:#5c6f8a}#hcaptcha-options table tbody tr td{margin:0;padding:0;position:relative}#hcaptcha-options table tr td fieldset input[type=checkbox]{border:none;box-shadow:none;display:inline;height:1.25rem;margin-block-end:0;margin-block-start:-.125rem;margin-inline-end:.5rem;margin-inline-start:0;width:2.3611rem}#hcaptcha-options table tr td fieldset input[type=checkbox]:before{background:url(../images/checkbox-off.svg);background-size:cover;content:"";display:inline-block;height:1.25rem;margin:0;width:2.3611rem}#hcaptcha-options table tr td fieldset input[type=checkbox]:checked:before{background:no-repeat url(../images/checkbox-on.svg);background-size:cover}#hcaptcha-options fieldset:disabled{color:#dadada}#hcaptcha-options .button-primary{background-color:#026593;border-color:#026593;color:#fff}#hcaptcha-options .button-primary:hover{background-color:#025176}#hcaptcha-options .button-secondary{background-color:#fff;border-color:#026593;color:#026593}#hcaptcha-options .button-secondary:hover{background-color:#ccc}#hcaptcha-options a{color:#0075ab}#hcaptcha-navigation a{border-color:#0075ab}#hcaptcha-options a.hcaptcha-settings-tab{color:#5c6f8a}#hcaptcha-options .helper:before{background:#5c6f8a;border-radius:1.2em;color:#fff;content:"?";height:1.2em;inset-inline-end:0;position:absolute;text-align:center;top:0;transform:translateY(-27px);width:1.2em}#hcaptcha-options fieldset+.helper:before{top:50%;transform:translate(25px,-.7em)}.rtl #hcaptcha-options fieldset+.helper:before{transform:translate(-25px,-.8em)}#hcaptcha-options .helper .helper-content{background:#5c6f8a;box-sizing:border-box;color:#f0f2f5;display:none;inset-inline-end:0;padding:.5em 1em;position:absolute;top:0;transform:translate(1px,10px);width:100%}.rtl #hcaptcha-options .helper .helper-content{transform:translate(-1px,10px)}#hcaptcha-options fieldset+.helper .helper-content{top:50%;transform:translate(25px,25px);width:calc(100% + 25px)}#hcaptcha-options .helper:hover{cursor:help}#hcaptcha-options .helper:hover .helper-content{display:block;z-index:1}#hcaptcha-options .helper .helper-content:after{border:10px solid transparent;border-bottom-color:#5c6f8a;content:"";inset-inline-end:0;position:absolute;top:0;transform:translateY(-100%)}#hcaptcha-options .helper .helper-content a{color:#fff}#hcaptcha-message{box-sizing:border-box}#hcaptcha-message>p{font-size:13px;font-weight:600;line-height:1.5;margin:.5em 0}@keyframes blink{0%{opacity:1}16.7%{opacity:0}33.3%{opacity:1}50%{opacity:0}66.7%{opacity:1}83.3%{opacity:0}to{opacity:1}}.blink{animation:blink 3s linear}.hcaptcha-hide{display:none}.hcaptcha-excerpt{display:block;max-width:100%;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:max-content}.hcaptcha-excerpt:hover{overflow:visible}.hcaptcha-excerpt:hover .hcaptcha-hide{background:#5c6f8a;border:1px solid #c3c4c7;border-radius:6px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);color:#f0f2f5;display:block;inset-inline-start:50%;max-width:300px;padding:8px 10px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);white-space:normal;width:max-content;z-index:1}@media (max-width:782px){#hcaptcha-options .wp-list-table .toggle-row{top:15px}#hcaptcha-options .wp-list-table tr.is-expanded .toggle-row{top:6.5px}#hcaptcha-options .widefat tbody th.check-column{padding:0;vertical-align:middle}#hcaptcha-options .widefat thead td.check-column,.widefat tfoot td.check-column{padding-left:0}#hcaptcha-options .widefat th input[type=checkbox]{margin-bottom:0}#hcaptcha-options .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.hcaptcha-settings-tabs{margin:unset;margin-block-end:0;margin-block-start:10px;margin-inline-end:-12px;margin-inline-start:-10px;padding-block-end:0;padding-block-start:0;padding-inline-end:12px;padding-inline-start:10px}.hcaptcha-excerpt{display:table-cell;height:44px;vertical-align:middle}tr.is-expanded .hcaptcha-excerpt{height:19.5px}}@media (max-width:600px){#hcaptcha-options table tbody{grid-template-columns:1fr}#hcaptcha-options table tbody tr{position:relative}#hcaptcha-options fieldset+.helper:before{transform:translateY(-.7em)}#hcaptcha-options fieldset+.helper .helper-content{transform:translateY(25px);width:100%}#hcaptcha-options .helper{z-index:1}.hcaptcha-settings-tab{inset-inline-end:15px}}
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/settings-list-page-base.css

    r3166267 r3233179  
    33    display: flex;
    44    flex-direction: row-reverse;
    5     margin-bottom: 15px;
    65}
    76
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/css/settings-list-page-base.min.css

    r3166267 r3233179  
    1 .hcaptcha-filter{display:flex;flex-direction:row-reverse;margin-bottom:15px;position:relative}#hcaptcha-datepicker-popover-button{align-items:center;background:#fff;border-color:#8c8f94;color:#3c434a;display:flex;font-size:14px;gap:16px}.hcaptcha-datepicker-popover{background:#fff;border-radius:6px;box-shadow:0 5px 15px rgba(0,0,0,.15);display:none;inset-inline-end:0;margin-top:10px;max-width:80vw;position:absolute;top:32px;width:416px;z-index:30}.hcaptcha-datepicker-popover-content{display:flex;flex-wrap:wrap}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{display:flex;flex-direction:column;flex-grow:1;font-size:14px;gap:15px;justify-content:space-between;line-height:14px;margin:0;padding:20px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices label{cursor:pointer}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices .hcaptcha-is-selected{color:#0075ab}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{padding:10px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-action{border-top:1px solid #ccd0d4;display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-end;padding:15px 20px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .form-control,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices [type=radio]{border:none;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar.inline{top:0}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar{box-shadow:none;width:100%}.flatpickr-current-month .flatpickr-monthDropdown-months,.flatpickr-current-month input.cur-year{font-size:14px;font-weight:700;opacity:.7}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-days,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-rContainer{font-size:13px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer{max-width:100%;min-width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar *{box-sizing:border-box}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-day{align-items:center;aspect-ratio:1;border-style:hidden;box-shadow:none;display:flex;height:auto;line-height:30px;margin:0;max-width:none}@media (min-width:601px){.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{width:245px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{border-inline-end:1px solid #ccd0d4;margin-inline-end:4px}}
     1.hcaptcha-filter{display:flex;flex-direction:row-reverse;position:relative}#hcaptcha-datepicker-popover-button{align-items:center;background:#fff;border-color:#8c8f94;color:#3c434a;display:flex;font-size:14px;gap:16px}.hcaptcha-datepicker-popover{background:#fff;border-radius:6px;box-shadow:0 5px 15px rgba(0,0,0,.15);display:none;inset-inline-end:0;margin-top:10px;max-width:80vw;position:absolute;top:32px;width:416px;z-index:30}.hcaptcha-datepicker-popover-content{display:flex;flex-wrap:wrap}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{display:flex;flex-direction:column;flex-grow:1;font-size:14px;gap:15px;justify-content:space-between;line-height:14px;margin:0;padding:20px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices label{cursor:pointer}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices .hcaptcha-is-selected{color:#0075ab}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{padding:10px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-action{border-top:1px solid #ccd0d4;display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-end;padding:15px 20px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .form-control,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices [type=radio]{border:none;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar.inline{top:0}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar{box-shadow:none;width:100%}.flatpickr-current-month .flatpickr-monthDropdown-months,.flatpickr-current-month input.cur-year{font-size:14px;font-weight:700;opacity:.7}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-days,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-rContainer{font-size:13px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer{max-width:100%;min-width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar *{box-sizing:border-box}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-day{align-items:center;aspect-ratio:1;border-style:hidden;box-shadow:none;display:flex;height:auto;line-height:30px;margin:0;max-width:none}@media (min-width:601px){.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{width:245px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{border-inline-end:1px solid #ccd0d4;margin-inline-end:4px}}
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/apps/hcaptcha.js

    r3200161 r3233179  
    1 (()=>{"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t){return function(t){if(Array.isArray(t))return r(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||n(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}function r(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n<e;n++)r[n]=t[n];return r}function o(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,a(r.key),r)}}function a(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,n||"default");if("object"!=t(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}var i=function(){return r=function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.foundForms=[],this.params=null,this.observing=!1,this.darkElement=null,this.darkClass=null,this.callback=this.callback.bind(this),this.validate=this.validate.bind(this),this.addedDCLCallbacks=new Set},a=[{key:"generateID",value:function(){var t=function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)};return t()+"-"+t()+"-"+t()+"-"+t()}},{key:"getFoundFormById",value:function(t){var e;return null!==(e=this.foundForms.filter((function(e){return t===e.hCaptchaId}))[0])&&void 0!==e?e:null}},{key:"getWidgetId",value:function(t){var e,n,r;if(void 0===t)return"";var o=null!==(e=null===(n=t.closest(this.formSelector))||void 0===n||null===(n=n.dataset)||void 0===n?void 0:n.hCaptchaId)&&void 0!==e?e:"";if(!o)return"";var a=this.getFoundFormById(o);return null!==(r=null==a?void 0:a.widgetId)&&void 0!==r?r:""}},{key:"reset",value:function(t){var e=this.getWidgetId(t);e&&hcaptcha.reset(e)}},{key:"isSameOrDescendant",value:function(t,e){for(var n=e;n;){if(n===t)return!0;n=n.parentElement}return!1}},{key:"validate",value:function(t){var e=t.currentTarget.closest(this.formSelector),n=this.getFoundFormById(e.dataset.hCaptchaId),r=n.submitButtonElement,o=n.widgetId;if(this.isSameOrDescendant(r,t.target)&&(t.preventDefault(),t.stopPropagation(),this.currentForm={formElement:e,submitButtonElement:r},o)){var a=e.querySelector(this.responseSelector),i=a?a.value:"";""===i?hcaptcha.execute(o):this.callback(i)}}},{key:"isValidated",value:function(){return void 0!==this.currentForm}},{key:"getForms",value:function(){return e(document.querySelectorAll(this.formSelector))}},{key:"getParams",value:function(){if(null!==this.params)return this.params;var t;try{var e,n;t=JSON.parse(wp.hooks.applyFilters("hcaptcha.params",null!==(e=null===(n=HCaptchaMainObject)||void 0===n?void 0:n.params)&&void 0!==e?e:""))}catch(e){t={}}return t.callback=this.callback,t}},{key:"setParams",value:function(t){this.params=t}},{key:"setDarkData",value:function(){var t={"twenty-twenty-one":{darkStyleId:"twenty-twenty-one-style-css",darkElement:document.body,darkClass:"is-dark-theme"},"wp-dark-mode":{darkStyleId:"wp-dark-mode-frontend-css",darkElement:document.documentElement,darkClass:"wp-dark-mode-active"},"droit-dark-mode":{darkStyleId:"dtdr-public-inline-css",darkElement:document.documentElement,darkClass:"drdt-dark-mode"}};t=wp.hooks.applyFilters("hcaptcha.darkData",t);for(var e=0,n=Object.values(t);e<n.length;e++){var r=n[e];if(document.getElementById(r.darkStyleId))return this.darkElement=r.darkElement,void(this.darkClass=r.darkClass)}}},{key:"observeDarkMode",value:function(){var t=this;this.observing||(this.observing=!0,"auto"!==this.getParams().theme)||(this.setDarkData(),this.darkElement&&this.darkClass&&new MutationObserver((function(e){var r,o=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=n(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var o=0,a=function(){};return{s:a,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,c=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){c=!0,i=t},f:function(){try{u||null==r.return||r.return()}finally{if(c)throw i}}}}(e);try{var a=function(){var e=r.value.oldValue,n=t.darkElement.getAttribute("class");e=e?e.split(" "):[],(n=n?n.split(" "):[]).filter((function(t){return!e.includes(t)})).concat(e.filter((function(t){return!n.includes(t)}))).includes(t.darkClass)&&t.bindEvents()};for(o.s();!(r=o.n()).done;)a()}catch(t){o.e(t)}finally{o.f()}})).observe(this.darkElement,{attributes:!0,attributeOldValue:!0}))}},{key:"getWidgetByToken",value:function(t){var n=e(document.querySelectorAll(this.responseSelector)).find((function(e){return e.value===t}));return n?n.closest(".h-captcha"):null}},{key:"callback",value:function(t){document.dispatchEvent(new CustomEvent("hCaptchaSubmitted",{detail:{token:t}}));var e=this.getParams(),n=this.getWidgetByToken(t),r=n?n.dataset.force:null;("invisible"===e.size||"true"===r&&this.isValidated())&&this.submit()}},{key:"applyAutoTheme",value:function(t){if("auto"!==t.theme)return t;if(t.theme="light",!this.darkElement)return t;var e=this.darkElement.getAttribute("class");return(e=e||"").includes(this.darkClass)&&(t.theme="dark"),t}},{key:"render",value:function(e){this.observeDarkMode();var n,r,o=this.getParams();return"object"===t(o.theme)?null!==(n=null===(r=o)||void 0===r||null===(r=r.theme)||void 0===r||null===(r=r.component)||void 0===r||null===(r=r.checkbox)||void 0===r||null===(r=r.main)||void 0===r?void 0:r.fill)&&void 0!==n&&n&&(e.dataset.theme="custom"):o.theme=e.dataset.theme,o.size=e.dataset.size,o=this.applyAutoTheme(o),hcaptcha.render(e,o)}},{key:"addSyncedEventListener",value:function(t){if("loading"===document.readyState){if(this.addedDCLCallbacks.has(t))return;this.addedDCLCallbacks.add(t),window.addEventListener("DOMContentLoaded",t)}else t()}},{key:"bindEvents",value:function(){var t=this;"undefined"!=typeof hcaptcha&&(this.formSelector=wp.hooks.applyFilters("hcaptcha.formSelector","form, section.cwginstock-subscribe-form, div.sdm_download_item, .gform_editor, #nf-builder, .wpforms-captcha-preview"),this.submitButtonSelector=wp.hooks.applyFilters("hcaptcha.submitButtonSelector",'*[type="submit"]:not(.quform-default-submit), #check_config, button[type="button"].ff-btn, a.et_pb_newsletter_button.et_pb_button, .forminator-button-submit, .frm_button_submit, a.sdm_download, .uagb-forms-main-submit-button'),this.responseSelector='textarea[name="h-captcha-response"]',this.getForms().map((function(e){var n=e.querySelector(".h-captcha");if(null===n)return e;if(n.classList.contains("hcaptcha-widget-id"))return e;n.innerHTML="";var r=t.generateID(),o=e.querySelectorAll(t.submitButtonSelector)[0],a=t.render(n);return e.dataset.hCaptchaId=r,t.foundForms.push({hCaptchaId:r,submitButtonElement:o,widgetId:a}),"invisible"!==n.dataset.size&&"true"!==n.dataset.force?e:o?(o.addEventListener("click",t.validate,!0),e):e}),this))}},{key:"isAjaxSubmitButton",value:function(t){var e=t.getAttribute("type"),n="submit"!==(e=e?e.toLowerCase():"");return wp.hooks.applyFilters("hcaptcha.ajaxSubmitButton",n,t)}},{key:"submit",value:function(){var t=this.currentForm.formElement,e=this.currentForm.submitButtonElement;if("form"!==t.tagName.toLowerCase()||this.isAjaxSubmitButton(e))return e.removeEventListener("click",this.validate,!0),void e.click();t.requestSubmit?t.requestSubmit(e):t.submit()}}],a&&o(r.prototype,a),i&&o(r,i),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,a,i}();window.HCaptchaMainObject=window.HCaptchaMainObject||{};const u=i;function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function l(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,s(r.key),r)}}function s(t){var e=function(t,e){if("object"!=c(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!=c(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==c(e)?e:e+""}function d(t,e,n){return e=p(e),function(t,e){if(e&&("object"==c(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,h()?Reflect.construct(e,n||[],p(t).constructor):e.apply(t,n))}function f(t){var e="function"==typeof Map?new Map:void 0;return f=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(h())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var o=new(t.bind.apply(t,r));return n&&m(o,n.prototype),o}(t,arguments,p(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),m(n,t)},f(t)}function h(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(h=function(){return!!t})()}function m(t,e){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},m(t,e)}function p(t){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},p(t)}const v=function(t){function e(){return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),d(this,e,arguments)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&m(t,e)}(e,t),n=e,(r=[{key:"connectedCallback",value:function(){window.hCaptcha.addSyncedEventListener(window.hCaptchaBindEvents)}}])&&l(n.prototype,r),o&&l(n,o),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,o}(f(HTMLElement));var y=new u;window.hCaptcha=y,window.hCaptchaGetWidgetId=function(t){y.getWidgetId(t)},window.hCaptchaReset=function(t){y.reset(t)},window.hCaptchaBindEvents=function(){y.bindEvents()},window.hCaptchaSubmit=function(){y.submit()},window.hCaptchaOnLoad=function(){y.addSyncedEventListener((function(){document.dispatchEvent(new CustomEvent("hCaptchaBeforeBindEvents")),window.hCaptchaBindEvents(),document.dispatchEvent(new CustomEvent("hCaptchaLoaded"))}))},window.customElements.define("h-captcha",v),document.dispatchEvent(new CustomEvent("hCaptchaBeforeAPI"))})();
     1(()=>{"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t){return function(t){if(Array.isArray(t))return r(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||n(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}function r(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n<e;n++)r[n]=t[n];return r}function o(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,i(r.key),r)}}function i(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,n||"default");if("object"!=t(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}var a=function(){return r=function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.foundForms=[],this.params=null,this.observing=!1,this.darkElement=null,this.darkClass=null,this.callback=this.callback.bind(this),this.validate=this.validate.bind(this),this.addedDCLCallbacks=new Set},i=[{key:"generateID",value:function(){var t=function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)};return t()+"-"+t()+"-"+t()+"-"+t()}},{key:"getFoundFormById",value:function(t){var e;return null!==(e=this.foundForms.filter((function(e){return t===e.hCaptchaId}))[0])&&void 0!==e?e:null}},{key:"getWidgetId",value:function(t){var e,n,r;if(void 0===t)return"";var o=null!==(e=null===(n=t.closest(this.formSelector))||void 0===n||null===(n=n.dataset)||void 0===n?void 0:n.hCaptchaId)&&void 0!==e?e:"";if(!o)return"";var i=this.getFoundFormById(o);return null!==(r=null==i?void 0:i.widgetId)&&void 0!==r?r:""}},{key:"reset",value:function(t){var e=this.getWidgetId(t);e&&hcaptcha.reset(e)}},{key:"isSameOrDescendant",value:function(t,e){for(var n=e;n;){if(n===t)return!0;n=n.parentElement}return!1}},{key:"getCurrentForm",value:function(t){var e,n=t.currentTarget.closest(this.formSelector),r=this.getFoundFormById(null==n||null===(e=n.dataset)||void 0===e?void 0:e.hCaptchaId),o=null==r?void 0:r.submitButtonElement,i=null==r?void 0:r.widgetId;if(i&&this.isSameOrDescendant(o,t.target))return t.preventDefault(),t.stopPropagation(),{formElement:n,submitButtonElement:o,widgetId:i}}},{key:"validate",value:function(t){if(this.currentForm=this.getCurrentForm(t),this.currentForm){var e=this.currentForm,n=e.formElement,r=e.widgetId,o=n.querySelector(this.responseSelector),i=o?o.value:"";""===i?hcaptcha.execute(r):this.callback(i)}}},{key:"isValidated",value:function(){return void 0!==this.currentForm}},{key:"getForms",value:function(){return e(document.querySelectorAll(this.formSelector))}},{key:"getParams",value:function(){if(null!==this.params)return this.params;var t;try{var e,n;t=JSON.parse(wp.hooks.applyFilters("hcaptcha.params",null!==(e=null===(n=HCaptchaMainObject)||void 0===n?void 0:n.params)&&void 0!==e?e:""))}catch(e){t={}}return t.callback=this.callback,t}},{key:"setParams",value:function(t){this.params=t}},{key:"setDarkData",value:function(){var t={"twenty-twenty-one":{darkStyleId:"twenty-twenty-one-style-css",darkElement:document.body,darkClass:"is-dark-theme"},"wp-dark-mode":{darkStyleId:"wp-dark-mode-frontend-css",darkElement:document.documentElement,darkClass:"wp-dark-mode-active"},"droit-dark-mode":{darkStyleId:"dtdr-public-inline-css",darkElement:document.documentElement,darkClass:"drdt-dark-mode"}};t=wp.hooks.applyFilters("hcaptcha.darkData",t);for(var e=0,n=Object.values(t);e<n.length;e++){var r=n[e];if(document.getElementById(r.darkStyleId))return this.darkElement=r.darkElement,void(this.darkClass=r.darkClass)}}},{key:"observeDarkMode",value:function(){var t=this;this.observing||(this.observing=!0,"auto"!==this.getParams().theme)||(this.setDarkData(),this.darkElement&&this.darkClass&&new MutationObserver((function(e){var r,o=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=n(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,c=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){c=!0,a=t},f:function(){try{u||null==r.return||r.return()}finally{if(c)throw a}}}}(e);try{var i=function(){var e=r.value.oldValue,n=t.darkElement.getAttribute("class");e=e?e.split(" "):[],(n=n?n.split(" "):[]).filter((function(t){return!e.includes(t)})).concat(e.filter((function(t){return!n.includes(t)}))).includes(t.darkClass)&&t.bindEvents()};for(o.s();!(r=o.n()).done;)i()}catch(t){o.e(t)}finally{o.f()}})).observe(this.darkElement,{attributes:!0,attributeOldValue:!0}))}},{key:"getWidgetByToken",value:function(t){var n=e(document.querySelectorAll(this.responseSelector)).find((function(e){return e.value===t}));return n?n.closest(".h-captcha"):null}},{key:"callback",value:function(t){document.dispatchEvent(new CustomEvent("hCaptchaSubmitted",{detail:{token:t}}));var e=this.getParams(),n=this.getWidgetByToken(t),r=n?n.dataset.force:null;("invisible"===e.size||"true"===r&&this.isValidated())&&this.submit()}},{key:"applyAutoTheme",value:function(t){if("auto"!==t.theme)return t;if(t.theme="light",!this.darkElement)return t;var e=this.darkElement.getAttribute("class");return(e=e||"").includes(this.darkClass)&&(t.theme="dark"),t}},{key:"render",value:function(e){this.observeDarkMode();var n,r,o=this.getParams();return"object"===t(o.theme)?null!==(n=null===(r=o)||void 0===r||null===(r=r.theme)||void 0===r||null===(r=r.component)||void 0===r||null===(r=r.checkbox)||void 0===r||null===(r=r.main)||void 0===r?void 0:r.fill)&&void 0!==n&&n&&(e.dataset.theme="custom"):o.theme=e.dataset.theme,o.size=e.dataset.size,o=this.applyAutoTheme(o),hcaptcha.render(e,o)}},{key:"addSyncedEventListener",value:function(t){if("loading"===document.readyState){if(this.addedDCLCallbacks.has(t))return;this.addedDCLCallbacks.add(t),window.addEventListener("DOMContentLoaded",t)}else t()}},{key:"bindEvents",value:function(){var t=this;"undefined"!=typeof hcaptcha&&(this.formSelector=wp.hooks.applyFilters("hcaptcha.formSelector","form, section.cwginstock-subscribe-form, div.sdm_download_item, .gform_editor, #nf-builder, .wpforms-captcha-preview"),this.submitButtonSelector=wp.hooks.applyFilters("hcaptcha.submitButtonSelector",'*[type="submit"]:not(.quform-default-submit), #check_config, button[type="button"].ff-btn, a.et_pb_newsletter_button.et_pb_button, .forminator-button-submit, .frm_button_submit, a.sdm_download, .uagb-forms-main-submit-button'),this.responseSelector='textarea[name="h-captcha-response"]',this.getForms().map((function(e){var n=e.querySelector(".h-captcha");if(null===n)return e;if(n.classList.contains("hcaptcha-widget-id"))return e;n.innerHTML="";var r=t.generateID(),o=e.querySelectorAll(t.submitButtonSelector)[0],i=t.render(n);if(e.dataset.hCaptchaId=r,t.foundForms.push({hCaptchaId:r,submitButtonElement:o,widgetId:i}),!o)return e;var a=n.dataset;return"invisible"!==a.size&&"true"!==a.force||o.addEventListener("click",t.validate,!0),e}),this))}},{key:"isAjaxSubmitButton",value:function(t){var e=t.getAttribute("type"),n="submit"!==(e=e?e.toLowerCase():"");return wp.hooks.applyFilters("hcaptcha.ajaxSubmitButton",n,t)}},{key:"submit",value:function(){if(this.currentForm){var t=this.currentForm,e=t.formElement,n=t.submitButtonElement;if("form"!==e.tagName.toLowerCase()||this.isAjaxSubmitButton(n))return n.removeEventListener("click",this.validate,!0),void n.click();e.requestSubmit?e.requestSubmit(n):e.submit()}}}],i&&o(r.prototype,i),a&&o(r,a),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,i,a}();window.HCaptchaMainObject=window.HCaptchaMainObject||{};const u=a;function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function l(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,s(r.key),r)}}function s(t){var e=function(t,e){if("object"!=c(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!=c(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==c(e)?e:e+""}function d(t,e,n){return e=p(e),function(t,e){if(e&&("object"==c(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,h()?Reflect.construct(e,n||[],p(t).constructor):e.apply(t,n))}function f(t){var e="function"==typeof Map?new Map:void 0;return f=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(h())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var o=new(t.bind.apply(t,r));return n&&m(o,n.prototype),o}(t,arguments,p(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),m(n,t)},f(t)}function h(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(h=function(){return!!t})()}function m(t,e){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},m(t,e)}function p(t){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},p(t)}const v=function(t){function e(){return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),d(this,e,arguments)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&m(t,e)}(e,t),n=e,(r=[{key:"connectedCallback",value:function(){window.hCaptcha.addSyncedEventListener(window.hCaptchaBindEvents)}}])&&l(n.prototype,r),o&&l(n,o),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,o}(f(HTMLElement));var y=new u;window.hCaptcha=y,window.hCaptchaGetWidgetId=function(t){y.getWidgetId(t)},window.hCaptchaReset=function(t){y.reset(t)},window.hCaptchaBindEvents=function(){y.bindEvents()},window.hCaptchaSubmit=function(){y.submit()},window.hCaptchaOnLoad=function(){y.addSyncedEventListener((function(){document.dispatchEvent(new CustomEvent("hCaptchaBeforeBindEvents")),window.hCaptchaBindEvents(),document.dispatchEvent(new CustomEvent("hCaptchaLoaded"))}))},window.customElements.define("h-captcha",v),document.dispatchEvent(new CustomEvent("hCaptchaBeforeAPI"))})();
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/events.js

    r3095958 r3233179  
    1 /* global Chart, HCaptchaEventsObject */
     1/* global jQuery, Chart, hCaptchaSettingsBase, HCaptchaListPageBaseObject, HCaptchaEventsObject */
    22
    33/**
     4 * @param HCaptchaEventsObject.ajaxUrl
     5 * @param HCaptchaEventsObject.bulkAction
     6 * @param HCaptchaEventsObject.bulkNonce
    47 * @param HCaptchaEventsObject.failed
    58 * @param HCaptchaEventsObject.failedLabel
     
    811 * @param HCaptchaEventsObject.unit
    912 */
    10 document.addEventListener( 'DOMContentLoaded', function() {
    11     const ctx = document.getElementById( 'eventsChart' );
    12     const aspectRatio = window.innerWidth > 600 ? 3 : 2;
    1313
    14     new Chart( ctx, {
    15         type: 'bar',
    16         data: {
    17             datasets: [
    18                 {
    19                     label: HCaptchaEventsObject.succeedLabel,
    20                     data: HCaptchaEventsObject.succeed,
    21                     borderWidth: 1,
    22                 },
    23                 {
    24                     label: HCaptchaEventsObject.failedLabel,
    25                     data: HCaptchaEventsObject.failed,
    26                     borderWidth: 1,
    27                 },
    28             ],
    29         },
    30         options: {
    31             responsive: true,
    32             maintainAspectRatio: true,
    33             aspectRatio,
    34             scales: {
    35                 x: {
    36                     type: 'time',
    37                     time: {
    38                         displayFormats: {
    39                             millisecond: 'HH:mm:ss',
    40                             second: 'HH:mm:ss',
    41                             minute: 'HH:mm',
    42                             hour: 'HH:mm',
    43                             day: 'dd.MM.yyyy',
    44                             week: 'dd.MM.yyyy',
    45                             month: 'dd.MM.yyyy',
    46                             quarter: 'dd.MM.yyyy',
    47                             year: 'dd.MM.yyyy',
     14/**
     15 * Events page logic.
     16 *
     17 * @param {Object} $ jQuery instance.
     18 */
     19const events = function( $ ) {
     20    function initChart() {
     21        const ctx = document.getElementById( 'eventsChart' );
     22        const aspectRatio = window.innerWidth > 600 ? 3 : 2;
     23
     24        new Chart( ctx, {
     25            type: 'bar',
     26            data: {
     27                datasets: [
     28                    {
     29                        label: HCaptchaEventsObject.succeedLabel,
     30                        data: HCaptchaEventsObject.succeed,
     31                        borderWidth: 1,
     32                    },
     33                    {
     34                        label: HCaptchaEventsObject.failedLabel,
     35                        data: HCaptchaEventsObject.failed,
     36                        borderWidth: 1,
     37                    },
     38                ],
     39            },
     40            options: {
     41                responsive: true,
     42                maintainAspectRatio: true,
     43                aspectRatio,
     44                scales: {
     45                    x: {
     46                        type: 'time',
     47                        time: {
     48                            displayFormats: {
     49                                millisecond: 'HH:mm:ss',
     50                                second: 'HH:mm:ss',
     51                                minute: 'HH:mm',
     52                                hour: 'HH:mm',
     53                                day: 'dd.MM.yyyy',
     54                                week: 'dd.MM.yyyy',
     55                                month: 'dd.MM.yyyy',
     56                                quarter: 'dd.MM.yyyy',
     57                                year: 'dd.MM.yyyy',
     58                            },
     59                            tooltipFormat: 'dd.MM.yyyy HH:mm',
     60                            unit: HCaptchaEventsObject.unit,
    4861                        },
    49                         tooltipFormat: 'dd.MM.yyyy HH:mm',
    50                         unit: HCaptchaEventsObject.unit,
    5162                    },
    52                 },
    53                 y: {
    54                     beginAtZero: true,
    55                     ticks: {
    56                         precision: 0,
     63                    y: {
     64                        beginAtZero: true,
     65                        ticks: {
     66                            precision: 0,
     67                        },
    5768                    },
    5869                },
    5970            },
    60         },
    61     } );
    62 } );
     71        } );
     72    }
     73
     74    function handleBulkAction( event ) {
     75        event.preventDefault();
     76
     77        const form = event.target.closest( 'form' );
     78        const formData = new FormData( form );
     79
     80        const bulk = formData.get( 'action' );
     81
     82        if ( bulk === '-1' ) {
     83            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noAction );
     84
     85            return;
     86        }
     87
     88        const ids = formData.getAll( 'bulk-checkbox[]' );
     89
     90        if ( ! ids.length ) {
     91            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noItems );
     92
     93            return;
     94        }
     95
     96        const data = {
     97            action: HCaptchaEventsObject.bulkAction,
     98            nonce: HCaptchaEventsObject.bulkNonce,
     99            bulk,
     100            ids: JSON.stringify( ids ),
     101        };
     102
     103        $.post( {
     104            url: HCaptchaEventsObject.ajaxUrl,
     105            data,
     106            beforeSend: () => hCaptchaSettingsBase.showSuccessMessage( HCaptchaListPageBaseObject.DoingBulk ),
     107        } )
     108            .done( function( response ) {
     109                if ( ! response.success ) {
     110                    hCaptchaSettingsBase.showErrorMessage( response.data );
     111
     112                    return;
     113                }
     114
     115                window.location.reload();
     116            } )
     117            .fail(
     118                function( response ) {
     119                    hCaptchaSettingsBase.showErrorMessage( response.statusText );
     120                },
     121            );
     122    }
     123
     124    initChart();
     125    document.getElementById( 'doaction' ).addEventListener( 'click', handleBulkAction );
     126};
     127
     128window.hCaptchaForms = events;
     129
     130jQuery( document ).ready( events );
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/events.min.js

    r3095958 r3233179  
    1 document.addEventListener("DOMContentLoaded",(function(){var e=document.getElementById("eventsChart"),t=window.innerWidth>600?3:2;new Chart(e,{type:"bar",data:{datasets:[{label:HCaptchaEventsObject.succeedLabel,data:HCaptchaEventsObject.succeed,borderWidth:1},{label:HCaptchaEventsObject.failedLabel,data:HCaptchaEventsObject.failed,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:t,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaEventsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}})}));
     1(()=>{var e=function(e){var t,a;t=document.getElementById("eventsChart"),a=window.innerWidth>600?3:2,new Chart(t,{type:"bar",data:{datasets:[{label:HCaptchaEventsObject.succeedLabel,data:HCaptchaEventsObject.succeed,borderWidth:1},{label:HCaptchaEventsObject.failedLabel,data:HCaptchaEventsObject.failed,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:a,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaEventsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}}),document.getElementById("doaction").addEventListener("click",(function(t){t.preventDefault();var a=t.target.closest("form"),s=new FormData(a),n=s.get("action");if("-1"!==n){var c=s.getAll("bulk-checkbox[]");if(c.length){var o={action:HCaptchaEventsObject.bulkAction,nonce:HCaptchaEventsObject.bulkNonce,bulk:n,ids:JSON.stringify(c)};e.post({url:HCaptchaEventsObject.ajaxUrl,data:o,beforeSend:function(){return hCaptchaSettingsBase.showSuccessMessage(HCaptchaListPageBaseObject.DoingBulk)}}).done((function(e){e.success?window.location.reload():hCaptchaSettingsBase.showErrorMessage(e.data)})).fail((function(e){hCaptchaSettingsBase.showErrorMessage(e.statusText)}))}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noItems)}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noAction)}))};window.hCaptchaForms=e,jQuery(document).ready(e)})();
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/forms.js

    r3095958 r3233179  
    1 /* global Chart, HCaptchaFormsObject */
     1/* global jQuery, Chart, hCaptchaSettingsBase, HCaptchaListPageBaseObject, HCaptchaFormsObject */
    22
    33/**
     4 * @param HCaptchaFormsObject.ajaxUrl
     5 * @param HCaptchaFormsObject.bulkAction
     6 * @param HCaptchaFormsObject.bulkNonce
    47 * @param HCaptchaFormsObject.served
    58 * @param HCaptchaFormsObject.servedLabel
    69 * @param HCaptchaFormsObject.unit
     10 * @param HCaptchaListPageBaseObject.noAction
     11 * @param HCaptchaListPageBaseObject.noItems
     12 * @param HCaptchaListPageBaseObject.DoingBulk
    713 */
    8 document.addEventListener( 'DOMContentLoaded', function() {
    9     const ctx = document.getElementById( 'formsChart' );
    10     const aspectRatio = window.innerWidth > 600 ? 3 : 2;
    1114
    12     new Chart( ctx, {
    13         type: 'bar',
    14         data: {
    15             datasets: [
    16                 {
    17                     label: HCaptchaFormsObject.servedLabel,
    18                     backgroundColor: 'rgba(2,101,147,0.5)',
    19                     data: HCaptchaFormsObject.served,
    20                     borderWidth: 1,
    21                 },
    22             ],
    23         },
    24         options: {
    25             responsive: true,
    26             maintainAspectRatio: true,
    27             aspectRatio,
    28             scales: {
    29                 x: {
    30                     type: 'time',
    31                     time: {
    32                         displayFormats: {
    33                             millisecond: 'HH:mm:ss',
    34                             second: 'HH:mm:ss',
    35                             minute: 'HH:mm',
    36                             hour: 'HH:mm',
    37                             day: 'dd.MM.yyyy',
    38                             week: 'dd.MM.yyyy',
    39                             month: 'dd.MM.yyyy',
    40                             quarter: 'dd.MM.yyyy',
    41                             year: 'dd.MM.yyyy',
     15/**
     16 * Forms page logic.
     17 *
     18 * @param {Object} $ jQuery instance.
     19 */
     20const forms = function( $ ) {
     21    function initChart() {
     22        const ctx = document.getElementById( 'formsChart' );
     23        const aspectRatio = window.innerWidth > 600 ? 3 : 2;
     24
     25        new Chart( ctx, {
     26            type: 'bar',
     27            data: {
     28                datasets: [
     29                    {
     30                        label: HCaptchaFormsObject.servedLabel,
     31                        backgroundColor: 'rgba(2,101,147,0.5)',
     32                        data: HCaptchaFormsObject.served,
     33                        borderWidth: 1,
     34                    },
     35                ],
     36            },
     37            options: {
     38                responsive: true,
     39                maintainAspectRatio: true,
     40                aspectRatio,
     41                scales: {
     42                    x: {
     43                        type: 'time',
     44                        time: {
     45                            displayFormats: {
     46                                millisecond: 'HH:mm:ss',
     47                                second: 'HH:mm:ss',
     48                                minute: 'HH:mm',
     49                                hour: 'HH:mm',
     50                                day: 'dd.MM.yyyy',
     51                                week: 'dd.MM.yyyy',
     52                                month: 'dd.MM.yyyy',
     53                                quarter: 'dd.MM.yyyy',
     54                                year: 'dd.MM.yyyy',
     55                            },
     56                            tooltipFormat: 'dd.MM.yyyy HH:mm',
     57                            unit: HCaptchaFormsObject.unit,
    4258                        },
    43                         tooltipFormat: 'dd.MM.yyyy HH:mm',
    44                         unit: HCaptchaFormsObject.unit,
    4559                    },
    46                 },
    47                 y: {
    48                     beginAtZero: true,
    49                     ticks: {
    50                         precision: 0,
     60                    y: {
     61                        beginAtZero: true,
     62                        ticks: {
     63                            precision: 0,
     64                        },
    5165                    },
    5266                },
    5367            },
    54         },
    55     } );
    56 } );
     68        } );
     69    }
     70
     71    function handleBulkAction( event ) {
     72        event.preventDefault();
     73
     74        const form = event.target.closest( 'form' );
     75        const formData = new FormData( form );
     76
     77        const bulk = formData.get( 'action' );
     78
     79        if ( bulk === '-1' ) {
     80            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noAction );
     81
     82            return;
     83        }
     84
     85        const ids = formData.getAll( 'bulk-checkbox[]' ).map(
     86            ( id ) => {
     87                const row = form.querySelector( `input[name="bulk-checkbox[]"][value="${ id }"]` ).closest( 'tr' );
     88                const source = row.querySelector( 'td.name .hcaptcha-excerpt' ).dataset.source;
     89                const formId = row.querySelector( 'td.form_id' ).textContent;
     90
     91                return { source, formId };
     92            },
     93        );
     94
     95        if ( ! ids.length ) {
     96            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noItems );
     97
     98            return;
     99        }
     100
     101        const data = {
     102            action: HCaptchaFormsObject.bulkAction,
     103            nonce: HCaptchaFormsObject.bulkNonce,
     104            bulk,
     105            ids: JSON.stringify( ids ),
     106        };
     107
     108        $.post( {
     109            url: HCaptchaFormsObject.ajaxUrl,
     110            data,
     111            beforeSend: () => hCaptchaSettingsBase.showSuccessMessage( HCaptchaListPageBaseObject.DoingBulk ),
     112        } )
     113            .done( function( response ) {
     114                if ( ! response.success ) {
     115                    hCaptchaSettingsBase.showErrorMessage( response.data );
     116
     117                    return;
     118                }
     119
     120                window.location.reload();
     121            } )
     122            .fail(
     123                function( response ) {
     124                    hCaptchaSettingsBase.showErrorMessage( response.statusText );
     125                },
     126            );
     127    }
     128
     129    initChart();
     130    document.getElementById( 'doaction' ).addEventListener( 'click', handleBulkAction );
     131};
     132
     133window.hCaptchaForms = forms;
     134
     135jQuery( document ).ready( forms );
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/forms.min.js

    r3095958 r3233179  
    1 document.addEventListener("DOMContentLoaded",(function(){var t=document.getElementById("formsChart"),e=window.innerWidth>600?3:2;new Chart(t,{type:"bar",data:{datasets:[{label:HCaptchaFormsObject.servedLabel,backgroundColor:"rgba(2,101,147,0.5)",data:HCaptchaFormsObject.served,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:e,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaFormsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}})}));
     1(()=>{var e=function(e){var t,a;t=document.getElementById("formsChart"),a=window.innerWidth>600?3:2,new Chart(t,{type:"bar",data:{datasets:[{label:HCaptchaFormsObject.servedLabel,backgroundColor:"rgba(2,101,147,0.5)",data:HCaptchaFormsObject.served,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:a,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaFormsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}}),document.getElementById("doaction").addEventListener("click",(function(t){t.preventDefault();var a=t.target.closest("form"),s=new FormData(a),o=s.get("action");if("-1"!==o){var r=s.getAll("bulk-checkbox[]").map((function(e){var t=a.querySelector('input[name="bulk-checkbox[]"][value="'.concat(e,'"]')).closest("tr");return{source:t.querySelector("td.name .hcaptcha-excerpt").dataset.source,formId:t.querySelector("td.form_id").textContent}}));if(r.length){var c={action:HCaptchaFormsObject.bulkAction,nonce:HCaptchaFormsObject.bulkNonce,bulk:o,ids:JSON.stringify(r)};e.post({url:HCaptchaFormsObject.ajaxUrl,data:c,beforeSend:function(){return hCaptchaSettingsBase.showSuccessMessage(HCaptchaListPageBaseObject.DoingBulk)}}).done((function(e){e.success?window.location.reload():hCaptchaSettingsBase.showErrorMessage(e.data)})).fail((function(e){hCaptchaSettingsBase.showErrorMessage(e.statusText)}))}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noItems)}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noAction)}))};window.hCaptchaForms=e,jQuery(document).ready(e)})();
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/general.js

    r3200161 r3233179  
    1 /* global jQuery, hCaptcha, HCaptchaGeneralObject, kaggDialog */
     1/* global jQuery, hCaptcha, hCaptchaSettingsBase, HCaptchaGeneralObject, kaggDialog */
    22
    33/**
     
    154154    function clearMessage() {
    155155        $message.remove();
    156         // Concat below to avoid inspection message.
     156        // Concat below to avoid an inspection message.
    157157        $( '<div id="hcaptcha-message">' + '</div>' ).insertAfter( headerBarSelector );
    158158        $message = $( msgSelector );
     
    181181        $( document ).trigger( 'wp-updates-notice-added' );
    182182
    183         const $wpwrap = $( '#wpwrap' );
    184         const top = $wpwrap.position().top;
    185 
    186183        $( 'html, body' ).animate(
    187184            {
    188                 scrollTop: $message.offset().top - top - parseInt( $message.css( 'margin-bottom' ) ),
     185                scrollTop: $message.offset().top - hCaptchaSettingsBase.getStickyHeight(),
    189186            },
    190187            1000
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/general.min.js

    r3200161 r3233179  
    1 (()=>{var t={};function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var a=function(a){var n="#hcaptcha-message",c=a(n),o=a("form.hcaptcha-general"),r=a('[name="hcaptcha_settings[site_key]"]'),i=a('[name="hcaptcha_settings[secret_key]"]'),s=a("#hcaptcha-options .h-captcha"),h=a("#check_config"),l=a("#reset_notifications"),p=a('[name="hcaptcha_settings[theme]"]'),d=a('[name="hcaptcha_settings[size]"]'),u=a('[name="hcaptcha_settings[language]"]'),f=a('[name="hcaptcha_settings[mode]"]'),m=a('[name="hcaptcha_settings[custom_themes][]"]'),v=a(".hcaptcha-general-custom-prop select"),g=a(".hcaptcha-general-custom-value input"),b=a('[name="hcaptcha_settings[config_params]"]'),y=a(".hcaptcha-section-enterprise + table input"),C=a('[name="hcaptcha_settings[recaptcha_compat_off][]"]'),j=o.find("#submit"),O={},k=r.val(),H=i.val(),w=A();O[HCaptchaGeneralObject.modeLive]=HCaptchaGeneralObject.siteKey,O[HCaptchaGeneralObject.modeTestPublisher]=HCaptchaGeneralObject.modeTestPublisherSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseSafeEndUser]=HCaptchaGeneralObject.modeTestEnterpriseSafeEndUserSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseBotDetected]=HCaptchaGeneralObject.modeTestEnterpriseBotDetectedSiteKey;var G=!1,_=!1,S=[];function T(t){var e={};return t.each((function(){var t=a(this),n=t.attr("name").replace(/hcaptcha_settings\[(.+)]/,"$1");e[n]=t.val()})),e}function A(){return T(y)}function x(){c.remove(),a('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),c=a(n)}function E(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(t=void 0===t?"":String(t),t=(t+="\n"+function(){for(var t=["recaptchacompat disabled","Missing sitekey - https://docs.hcaptcha.com/configuration#javascript-api"],e=[],a=0;a<S.length;a++){for(var n=S[a],c=n[0],o=n[1],r=Object.keys(o),i=[],s=0;s<r.length;s++){var h=o[s];"string"==typeof h&&-1===t.indexOf(h)&&i.push([c,h].join(" "))}e.push(i.join("\n"))}return S=[],e.join("\n")}()).trim()){c.removeClass(),c.addClass(e+" notice is-dismissible");var n=t.split("\n").map((function(t){return"<p>".concat(t,"</p>")}));c.html(n.join("")),a(document).trigger("wp-updates-notice-added");var o=a("#wpwrap").position().top;a("html, body").animate({scrollTop:c.offset().top-o-parseInt(c.css("margin-bottom"))},1e3)}}function N(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-success")}function K(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-error")}function L(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=Object.assign({},hCaptcha.getParams(),t),n=m.prop("checked"),c="live"===f.val();for(var o in n&&c?s.attr("data-theme","custom"):s.attr("data-theme",p.val()),n&&"object"===e(t.theme)||!n&&"object"!==e(t.theme)?a.theme=t.theme:a.theme=hCaptcha.getParams().theme,hCaptcha.setParams(a),s.html(""),t)"object"!==e(t[o])&&s.attr("data-".concat(o),"".concat(t[o]));hCaptcha.bindEvents()}function P(t,a){var n=function(t){return t&&"object"===e(t)};return n(t)&&n(a)?(Object.keys(a).forEach((function(e){var c=t[e],o=a[e];Array.isArray(c)&&Array.isArray(o)?t[e]=c.concat(o):n(c)&&n(o)?t[e]=P(Object.assign({},c),o):t[e]=o})),t):a}function U(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";for(var n in t){var c=a?"".concat(a,"--").concat(n):n;if("object"===e(t[n])&&null!==t[n])U(t[n],c);else{var o=t[n],r=c.replace(/theme--/g,""),i="".concat(r,"=").concat(o),s=v.find('option[value*="'.concat(r,'="]'));1===s.length&&(s.attr("value",i),s.is(":selected")&&g.val(o))}}}function B(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=b.val().trim();a=a||null;try{t=JSON.parse(a)}catch(t){return b.css("background-color","#ffabaf"),j.attr("disabled",!0),void K("Bad JSON!")}t=P(t,e),b.val(JSON.stringify(t,null,2)),U(t),m.prop("checked")||(t={sitekey:r.val(),theme:p.val(),size:d.val(),hl:u.val()}),L(t)}function J(){r.val()===k&&i.val()===H?(G=!1,x(),j.attr("disabled",!1)):G||(G=!0,K(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))}function D(t){return t=t.replace(/(http|https):\/\//,""),"https://"+new URL("https://"+t).host}!function(){S=[];var t=console.log,e=console.warn,a=console.info,n=console.error,c=console.clear;console.log=function(e){S.push(["Console log:",arguments]),t.apply(console,arguments)},console.warn=function(t){S.push(["Console warn:",arguments]),e.apply(console,arguments)},console.info=function(t){S.push(["Console info:",arguments]),a.apply(console,arguments)},console.error=function(t){S.push(["Console error:",arguments]),n.apply(console,arguments)},console.clear=function(){S=[],c()}}(),document.addEventListener("hCaptchaLoaded",(function(){K()})),h.on("click",(function(t){t.preventDefault(),""!==a('.hcaptcha-general-sample-hcaptcha textarea[name="h-captcha-response"]').val()?function(){x(),j.attr("disabled",!0);var t={action:HCaptchaGeneralObject.checkConfigAction,nonce:HCaptchaGeneralObject.checkConfigNonce,mode:f.val(),siteKey:r.val(),secretKey:i.val(),"h-captcha-response":a('textarea[name="h-captcha-response"]').val(),"hcaptcha-widget-id":a('input[name="hcaptcha-widget-id"]').val()};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:t,beforeSend:function(){return N(HCaptchaGeneralObject.checkingConfigMsg)}}).done((function(t){t.success?(k=r.val(),H=i.val(),w=T(y),_=!1,N(t.data),j.attr("disabled",!1)):K(t.data)})).fail((function(t){K(t.statusText)})).always((function(){L()}))}():kaggDialog.confirm({title:HCaptchaGeneralObject.completeHCaptchaTitle,content:HCaptchaGeneralObject.completeHCaptchaContent,type:"info",buttons:{ok:{text:HCaptchaGeneralObject.OKBtnText}},onAction:function(){return window.hCaptchaReset(document.querySelector(".hcaptcha-general-sample-hcaptcha"))}})})),r.on("change",(function(t){L({sitekey:a(t.target).val()}),J()})),i.on("change",(function(){J()})),p.on("change",(function(t){L({theme:a(t.target).val()})})),d.on("change",(function(t){var e=a("#hcaptcha-invisible-notice"),n=a(t.target).val();"invisible"===n?e.show():e.hide(),L({size:n})})),u.on("change",(function(t){L({hl:a(t.target).val()})})),f.on("change",(function(t){var e=a(t.target).val();O.hasOwnProperty(e)&&(e===HCaptchaGeneralObject.modeLive?(r.attr("disabled",!1),i.attr("disabled",!1)):(r.attr("disabled",!0),i.attr("disabled",!0)),L({sitekey:O[e]}))})),m.on("change",(function(){B()})),b.on("blur",(function(){B()})),b.on("focus",(function(){b.css("background-color","unset"),j.attr("disabled",!1)})),y.on("change",(function(){!function(){var e={onload:"hCaptchaOnLoad",render:"explicit"};C.prop("checked")&&(e.recaptchacompat="off"),m.prop("checked")&&(e.custom="true");var a={asset_host:"assethost",endpoint:"endpoint",host:"host",image_host:"imghost",report_api:"reportapi",sentry:"sentry"},n=A();for(var c in a){var o=n[c].trim();o&&(e[a[c]]=encodeURIComponent(D(o)))}var r=n.api_host.trim();r=D(r=r||"js.hcaptcha.com")+"/1/api.js";var i=new URL(r);for(var h in e)i.searchParams.append(h,e[h]);document.getElementById("hcaptcha-api").remove(),delete t.g.hcaptcha,s.html("");var l=document.getElementsByTagName("head")[0],p=document.createElement("script");p.type="text/javascript",p.id="hcaptcha-api",p.src=i.href,l.appendChild(p)}(),JSON.stringify(A())===JSON.stringify(w)?(_=!1,x(),j.attr("disabled",!1)):_||(_=!0,K(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))})),a(".hcaptcha-general h3").on("click",(function(t){var e=a(t.currentTarget);e.toggleClass("closed");var n={action:HCaptchaGeneralObject.toggleSectionAction,nonce:HCaptchaGeneralObject.toggleSectionNonce,section:e.attr("class").replaceAll(/(hcaptcha-section-|closed)/g,"").trim(),status:!e.hasClass("closed")};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:n}).done((function(t){t.success||K(t.data)})).fail((function(t){K(t.statusText)}))})),h.removeAttr("name"),l.removeAttr("name"),v.removeAttr("name"),g.removeAttr("name"),v.find("option").each((function(){var t=a(this);t.val().split("=")[1]||t.attr("disabled",!0)})),g.val(""),v.on("change",(function(){var t=a(this).find("option:selected").val().split("="),e=t[0],n=t[1];"palette--mode"===e?(g.attr("type","text"),g.val(n)):(g.val(n),g.attr("type","color"))})),g.on("change",(function(t){var e=a(t.target).val(),n=v.find("option:selected"),c=n.val().split("="),o=c[0],r=e;n.val(o+"="+e),B(r=(o="theme--"+c[0]).split("--").reverse().reduce((function(t,e){var a={};return a[e]=t,a}),r))}))};window.hCaptchaGeneral=a,jQuery(document).ready(a)})();
     1(()=>{var t={};function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var a=function(a){var n="#hcaptcha-message",c=a(n),o=a("form.hcaptcha-general"),r=a('[name="hcaptcha_settings[site_key]"]'),i=a('[name="hcaptcha_settings[secret_key]"]'),s=a("#hcaptcha-options .h-captcha"),h=a("#check_config"),l=a("#reset_notifications"),p=a('[name="hcaptcha_settings[theme]"]'),d=a('[name="hcaptcha_settings[size]"]'),u=a('[name="hcaptcha_settings[language]"]'),f=a('[name="hcaptcha_settings[mode]"]'),m=a('[name="hcaptcha_settings[custom_themes][]"]'),v=a(".hcaptcha-general-custom-prop select"),g=a(".hcaptcha-general-custom-value input"),b=a('[name="hcaptcha_settings[config_params]"]'),y=a(".hcaptcha-section-enterprise + table input"),C=a('[name="hcaptcha_settings[recaptcha_compat_off][]"]'),j=o.find("#submit"),O={},k=r.val(),H=i.val(),G=A();O[HCaptchaGeneralObject.modeLive]=HCaptchaGeneralObject.siteKey,O[HCaptchaGeneralObject.modeTestPublisher]=HCaptchaGeneralObject.modeTestPublisherSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseSafeEndUser]=HCaptchaGeneralObject.modeTestEnterpriseSafeEndUserSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseBotDetected]=HCaptchaGeneralObject.modeTestEnterpriseBotDetectedSiteKey;var S=!1,_=!1,w=[];function T(t){var e={};return t.each((function(){var t=a(this),n=t.attr("name").replace(/hcaptcha_settings\[(.+)]/,"$1");e[n]=t.val()})),e}function A(){return T(y)}function x(){c.remove(),a('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),c=a(n)}function E(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(t=void 0===t?"":String(t),t=(t+="\n"+function(){for(var t=["recaptchacompat disabled","Missing sitekey - https://docs.hcaptcha.com/configuration#javascript-api"],e=[],a=0;a<w.length;a++){for(var n=w[a],c=n[0],o=n[1],r=Object.keys(o),i=[],s=0;s<r.length;s++){var h=o[s];"string"==typeof h&&-1===t.indexOf(h)&&i.push([c,h].join(" "))}e.push(i.join("\n"))}return w=[],e.join("\n")}()).trim()){c.removeClass(),c.addClass(e+" notice is-dismissible");var n=t.split("\n").map((function(t){return"<p>".concat(t,"</p>")}));c.html(n.join("")),a(document).trigger("wp-updates-notice-added"),a("html, body").animate({scrollTop:c.offset().top-hCaptchaSettingsBase.getStickyHeight()},1e3)}}function N(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-success")}function B(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-error")}function K(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=Object.assign({},hCaptcha.getParams(),t),n=m.prop("checked"),c="live"===f.val();for(var o in n&&c?s.attr("data-theme","custom"):s.attr("data-theme",p.val()),n&&"object"===e(t.theme)||!n&&"object"!==e(t.theme)?a.theme=t.theme:a.theme=hCaptcha.getParams().theme,hCaptcha.setParams(a),s.html(""),t)"object"!==e(t[o])&&s.attr("data-".concat(o),"".concat(t[o]));hCaptcha.bindEvents()}function L(t,a){var n=function(t){return t&&"object"===e(t)};return n(t)&&n(a)?(Object.keys(a).forEach((function(e){var c=t[e],o=a[e];Array.isArray(c)&&Array.isArray(o)?t[e]=c.concat(o):n(c)&&n(o)?t[e]=L(Object.assign({},c),o):t[e]=o})),t):a}function P(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";for(var n in t){var c=a?"".concat(a,"--").concat(n):n;if("object"===e(t[n])&&null!==t[n])P(t[n],c);else{var o=t[n],r=c.replace(/theme--/g,""),i="".concat(r,"=").concat(o),s=v.find('option[value*="'.concat(r,'="]'));1===s.length&&(s.attr("value",i),s.is(":selected")&&g.val(o))}}}function U(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=b.val().trim();a=a||null;try{t=JSON.parse(a)}catch(t){return b.css("background-color","#ffabaf"),j.attr("disabled",!0),void B("Bad JSON!")}t=L(t,e),b.val(JSON.stringify(t,null,2)),P(t),m.prop("checked")||(t={sitekey:r.val(),theme:p.val(),size:d.val(),hl:u.val()}),K(t)}function J(){r.val()===k&&i.val()===H?(S=!1,x(),j.attr("disabled",!1)):S||(S=!0,B(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))}function D(t){return t=t.replace(/(http|https):\/\//,""),"https://"+new URL("https://"+t).host}!function(){w=[];var t=console.log,e=console.warn,a=console.info,n=console.error,c=console.clear;console.log=function(e){w.push(["Console log:",arguments]),t.apply(console,arguments)},console.warn=function(t){w.push(["Console warn:",arguments]),e.apply(console,arguments)},console.info=function(t){w.push(["Console info:",arguments]),a.apply(console,arguments)},console.error=function(t){w.push(["Console error:",arguments]),n.apply(console,arguments)},console.clear=function(){w=[],c()}}(),document.addEventListener("hCaptchaLoaded",(function(){B()})),h.on("click",(function(t){t.preventDefault(),""!==a('.hcaptcha-general-sample-hcaptcha textarea[name="h-captcha-response"]').val()?function(){x(),j.attr("disabled",!0);var t={action:HCaptchaGeneralObject.checkConfigAction,nonce:HCaptchaGeneralObject.checkConfigNonce,mode:f.val(),siteKey:r.val(),secretKey:i.val(),"h-captcha-response":a('textarea[name="h-captcha-response"]').val(),"hcaptcha-widget-id":a('input[name="hcaptcha-widget-id"]').val()};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:t,beforeSend:function(){return N(HCaptchaGeneralObject.checkingConfigMsg)}}).done((function(t){t.success?(k=r.val(),H=i.val(),G=T(y),_=!1,N(t.data),j.attr("disabled",!1)):B(t.data)})).fail((function(t){B(t.statusText)})).always((function(){K()}))}():kaggDialog.confirm({title:HCaptchaGeneralObject.completeHCaptchaTitle,content:HCaptchaGeneralObject.completeHCaptchaContent,type:"info",buttons:{ok:{text:HCaptchaGeneralObject.OKBtnText}},onAction:function(){return window.hCaptchaReset(document.querySelector(".hcaptcha-general-sample-hcaptcha"))}})})),r.on("change",(function(t){K({sitekey:a(t.target).val()}),J()})),i.on("change",(function(){J()})),p.on("change",(function(t){K({theme:a(t.target).val()})})),d.on("change",(function(t){var e=a("#hcaptcha-invisible-notice"),n=a(t.target).val();"invisible"===n?e.show():e.hide(),K({size:n})})),u.on("change",(function(t){K({hl:a(t.target).val()})})),f.on("change",(function(t){var e=a(t.target).val();O.hasOwnProperty(e)&&(e===HCaptchaGeneralObject.modeLive?(r.attr("disabled",!1),i.attr("disabled",!1)):(r.attr("disabled",!0),i.attr("disabled",!0)),K({sitekey:O[e]}))})),m.on("change",(function(){U()})),b.on("blur",(function(){U()})),b.on("focus",(function(){b.css("background-color","unset"),j.attr("disabled",!1)})),y.on("change",(function(){!function(){var e={onload:"hCaptchaOnLoad",render:"explicit"};C.prop("checked")&&(e.recaptchacompat="off"),m.prop("checked")&&(e.custom="true");var a={asset_host:"assethost",endpoint:"endpoint",host:"host",image_host:"imghost",report_api:"reportapi",sentry:"sentry"},n=A();for(var c in a){var o=n[c].trim();o&&(e[a[c]]=encodeURIComponent(D(o)))}var r=n.api_host.trim();r=D(r=r||"js.hcaptcha.com")+"/1/api.js";var i=new URL(r);for(var h in e)i.searchParams.append(h,e[h]);document.getElementById("hcaptcha-api").remove(),delete t.g.hcaptcha,s.html("");var l=document.getElementsByTagName("head")[0],p=document.createElement("script");p.type="text/javascript",p.id="hcaptcha-api",p.src=i.href,l.appendChild(p)}(),JSON.stringify(A())===JSON.stringify(G)?(_=!1,x(),j.attr("disabled",!1)):_||(_=!0,B(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))})),a(".hcaptcha-general h3").on("click",(function(t){var e=a(t.currentTarget);e.toggleClass("closed");var n={action:HCaptchaGeneralObject.toggleSectionAction,nonce:HCaptchaGeneralObject.toggleSectionNonce,section:e.attr("class").replaceAll(/(hcaptcha-section-|closed)/g,"").trim(),status:!e.hasClass("closed")};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:n}).done((function(t){t.success||B(t.data)})).fail((function(t){B(t.statusText)}))})),h.removeAttr("name"),l.removeAttr("name"),v.removeAttr("name"),g.removeAttr("name"),v.find("option").each((function(){var t=a(this);t.val().split("=")[1]||t.attr("disabled",!0)})),g.val(""),v.on("change",(function(){var t=a(this).find("option:selected").val().split("="),e=t[0],n=t[1];"palette--mode"===e?(g.attr("type","text"),g.val(n)):(g.val(n),g.attr("type","color"))})),g.on("change",(function(t){var e=a(t.target).val(),n=v.find("option:selected"),c=n.val().split("="),o=c[0],r=e;n.val(o+"="+e),U(r=(o="theme--"+c[0]).split("--").reverse().reduce((function(t,e){var a={};return a[e]=t,a}),r))}))};window.hCaptchaGeneral=a,jQuery(document).ready(a)})();
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/integrations.js

    r3215681 r3233179  
    1 /* global jQuery, HCaptchaIntegrationsObject, kaggDialog */
     1/* global jQuery, hCaptchaSettingsBase, HCaptchaIntegrationsObject, kaggDialog */
    22
    33/**
     
    2626 */
    2727const integrations = function( $ ) {
    28     /**
    29      * @type {HTMLElement}
    30      */
    31     const adminBar = document.querySelector( '#wpadminbar' );
    32 
    33     /**
    34      * @type {HTMLElement}
    35      */
    36     const tabs = document.querySelector( '.hcaptcha-settings-tabs' );
    37 
    38     /**
    39      * @type {HTMLElement}
    40      */
    41     const headerBar = document.querySelector( '.hcaptcha-header-bar' );
    4228    const msgSelector = '#hcaptcha-message';
    4329    let $message = $( msgSelector );
     
    4632    const $search = $( '#hcaptcha-integrations-search' );
    4733
    48     function getStickyHeight() {
    49         const isAbsolute = adminBar ? window.getComputedStyle( adminBar ).position === 'absolute' : true;
    50         const adminBarHeight = ( adminBar && ! isAbsolute ) ? adminBar.offsetHeight : 0;
    51         const tabsHeight = tabs ? tabs.offsetHeight : 0;
    52         const headerBarHeight = headerBar ? headerBar.offsetHeight : 0;
    53 
    54         return adminBarHeight + tabsHeight + headerBarHeight;
    55     }
    56 
    5734    function clearMessage() {
    5835        $message.remove();
    59         // Concat below to avoid inspection message.
     36        // Concat to avoid an inspection message.
    6037        $( '<div id="hcaptcha-message">' + '</div>' ).insertAfter( '.hcaptcha-header-bar' );
    6138        $message = $( msgSelector );
     
    278255                    $( 'html, body' ).animate(
    279256                        {
    280                             scrollTop: $tr.offset().top - getStickyHeight(),
     257                            scrollTop: $tr.offset().top - hCaptchaSettingsBase.getStickyHeight(),
    281258                        },
    282259                        1000
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/integrations.min.js

    r3215681 r3233179  
    1 (()=>{function t(t,a){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var a=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=a){var n,i,o,r,c=[],s=!0,l=!1;try{if(o=(a=a.call(t)).next,0===e){if(Object(a)!==a)return;s=!1}else for(;!(s=(n=o.call(a)).done)&&(c.push(n.value),c.length!==e);s=!0);}catch(t){l=!0,i=t}finally{try{if(!s&&null!=a.return&&(r=a.return(),Object(r)!==r))return}finally{if(l)throw i}}return c}}(t,a)||function(t,a){if(t){if("string"==typeof t)return e(t,a);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(t,a):void 0}}(t,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=Array(e);a<e;a++)n[a]=t[a];return n}var a=function(e){var a=document.querySelector("#wpadminbar"),n=document.querySelector(".hcaptcha-settings-tabs"),i=document.querySelector(".hcaptcha-header-bar"),o="#hcaptcha-message",r=e(o),c=e("#wpwrap"),s=e("#adminmenuwrap"),l=e("#hcaptcha-integrations-search");function d(t,a){r.removeClass(),r.addClass(a+" notice settings-error is-dismissible"),r.html("<p>".concat(t,"</p>")),e(document).trigger("wp-updates-notice-added");var n=r.clone();r.css("visibility","hidden"),n.css("margin","0px"),n.css("top",c.position().top),n.css("z-index","999999");var i="block"===s.css("display")?s.width():0;n.css("left",i),n.width(e(window).width()-i),n.css("position","fixed"),e("body").append(n),setTimeout((function(){r.css("visibility","unset"),n.remove()}),3e3)}function h(t){d(t,"notice-error")}function u(t){return t.is(jQuery(".form-table").eq(0))}function f(t,a,n){var i=!1,o=a.toLowerCase(),r=!u(t),c=n.find("fieldset");c.attr("disabled",r),c.find("input").attr("disabled",r),t.find("tbody").children().each((function(t,a){var r=e(a).find(".hcaptcha-integrations-logo img").attr("alt");if((r=(r=r||"").replace(" Logo","")).toLowerCase()>o)return n.insertBefore(e(a)),i=!0,!1})),i||t.find("tbody").append(n)}e(".form-table img").on("click",(function(c){function s(){l(!0)}function l(){var o=arguments.length>0&&void 0!==arguments[0]&&arguments[0],r=v?"on":"off";r=o?"install":r;var c,s,l=(s=document.querySelector(".kagg-dialog select"))&&null!==(c=s.value)&&void 0!==c?c:"",g={action:HCaptchaIntegrationsObject.action,nonce:HCaptchaIntegrationsObject.nonce,install:o,activate:v,entity:p,status:j,newTheme:l};y.addClass(r),e.post({url:HCaptchaIntegrationsObject.ajaxUrl,data:g}).done((function(o){if(void 0!==o.success)if(void 0!==o.data.themes&&(HCaptchaIntegrationsObject.themes=o.data.themes,HCaptchaIntegrationsObject.defaultTheme=o.data.defaultTheme),o.success){var r,c=e(".form-table").eq(v?0:1);!function(t,a,n){if("theme"===a){var i=e(".form-table"),o=t?"":'[data-label="'+n+'"]',r=i.eq(t?0:1).find('.hcaptcha-integrations-logo img[data-entity="theme"]'+o);if(r.length){var c=i.eq(t?1:0),s=r.closest("tr");f(c,r.attr("data-label"),s)}}}(v,p,l),f(c,m,y),function(t){d(t,"notice-success")}(o.data.message),function(a){for(var n=e(".form-table"),i=0,o=Object.entries(a);i<o.length;i++){var r=t(o[i],2),c=r[0],s=r[1],l="hcaptcha-integrations-"+c.replace(/_/g,"-"),d=e("tr.".concat(l)),h=d.find(".hcaptcha-integrations-logo"),g=u(d.closest(".form-table"));s&&h.attr("data-installed",!0),g!==s&&f(n.eq(s?0:1),h.find("img").attr("alt"),d)}}(o.data.stati),e("html, body").animate({scrollTop:y.offset().top-(r=!a||"absolute"===window.getComputedStyle(a).position,(a&&!r?a.offsetHeight:0)+(n?n.offsetHeight:0)+(i?i.offsetHeight:0))},1e3)}else{var s,g;h(null!==(s=null===(g=o.data)||void 0===g?void 0:g.message)&&void 0!==s?s:o.data)}else d(HCaptchaIntegrationsObject.unexpectedErrorMsg,"notice-error")})).fail((function(t){h(t.statusText)})).always((function(){y.removeClass("install on off")}))}c.preventDefault(),r.remove(),e('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),r=e(o);var g=e(c.target),p=g.data("entity");if(p=p||"",-1!==e.inArray(p,["core","theme","plugin"])&&-1===e.inArray(p,["core"])){var m=g.attr("alt");m=(m=m||"").replace(" Logo","");var b,v,y=g.closest("tr"),C=y.attr("class").match(/hcaptcha-integrations-([a-z0-9-]+)/),j=C?C[1]:"",O="";if(y.find("fieldset").attr("disabled"))b="plugin"===p?HCaptchaIntegrationsObject.activatePluginMsg:HCaptchaIntegrationsObject.activateThemeMsg,v=!0;else{if("plugin"===p)b=HCaptchaIntegrationsObject.deactivatePluginMsg;else{for(var w in b=HCaptchaIntegrationsObject.deactivateThemeMsg,O="<p>"+HCaptchaIntegrationsObject.selectThemeMsg+"</p>",O+="<select>",HCaptchaIntegrationsObject.themes){var H=w===HCaptchaIntegrationsObject.defaultTheme?' selected="selected"':"";O+='<option value="'.concat(w,'"').concat(H,">").concat(HCaptchaIntegrationsObject.themes[w],"</option>")}O+="</select>"}v=!1}if(-1===e.inArray(p,["theme"])||v||0!==Object.keys(HCaptchaIntegrationsObject.themes).length){if("false"===y.find(".hcaptcha-integrations-logo").attr("data-installed"))return c.ctrlKey?void s():(b=(b="plugin"===p?HCaptchaIntegrationsObject.installPluginMsg:HCaptchaIntegrationsObject.installThemeMsg).replace("%s",m),void kaggDialog.confirm({title:b,content:O,type:"install",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&s()}}));c.ctrlKey?l():(b=b.replace("%s",m),kaggDialog.confirm({title:b,content:O,type:v?"activate":"deactivate",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&l()}}))}else kaggDialog.confirm({title:HCaptchaIntegrationsObject.onlyOneThemeMsg,content:"",type:"info",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText}}})}}));var g,p,m;l.on("input",(g=function(){var t=l.val().trim().toLowerCase(),a=e(".hcaptcha-integrations-logo img"),n=null;if(a.each((function(a,i){var o=e(i);if("core"!==o.data("entity")){var r,c=o.closest("tr");o.data("label").toLowerCase().includes(t)?(c.show(),n=null!==(r=n)&&void 0!==r?r:c):c.hide()}})),n){var i=n.offset().top+n.outerHeight()-e(window).height()+5;e("html").stop().animate({scrollTop:i},1e3)}},p=100,function(){var t=this,e=arguments;clearTimeout(m),m=setTimeout((function(){return g.apply(t,e)}),p)})),e("#hcaptcha-options").keydown((function(t){e(t.target).is(l)&&13===t.which&&t.preventDefault()}))};window.hCaptchaIntegrations=a,jQuery(document).ready(a)})();
     1(()=>{function t(t,a){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var a=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=a){var n,i,o,r,c=[],s=!0,l=!1;try{if(o=(a=a.call(t)).next,0===e){if(Object(a)!==a)return;s=!1}else for(;!(s=(n=o.call(a)).done)&&(c.push(n.value),c.length!==e);s=!0);}catch(t){l=!0,i=t}finally{try{if(!s&&null!=a.return&&(r=a.return(),Object(r)!==r))return}finally{if(l)throw i}}return c}}(t,a)||function(t,a){if(t){if("string"==typeof t)return e(t,a);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(t,a):void 0}}(t,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=Array(e);a<e;a++)n[a]=t[a];return n}var a=function(e){var a="#hcaptcha-message",n=e(a),i=e("#wpwrap"),o=e("#adminmenuwrap"),r=e("#hcaptcha-integrations-search");function c(t,a){n.removeClass(),n.addClass(a+" notice settings-error is-dismissible"),n.html("<p>".concat(t,"</p>")),e(document).trigger("wp-updates-notice-added");var r=n.clone();n.css("visibility","hidden"),r.css("margin","0px"),r.css("top",i.position().top),r.css("z-index","999999");var c="block"===o.css("display")?o.width():0;r.css("left",c),r.width(e(window).width()-c),r.css("position","fixed"),e("body").append(r),setTimeout((function(){n.css("visibility","unset"),r.remove()}),3e3)}function s(t){c(t,"notice-error")}function l(t){return t.is(jQuery(".form-table").eq(0))}function h(t,a,n){var i=!1,o=a.toLowerCase(),r=!l(t),c=n.find("fieldset");c.attr("disabled",r),c.find("input").attr("disabled",r),t.find("tbody").children().each((function(t,a){var r=e(a).find(".hcaptcha-integrations-logo img").attr("alt");if((r=(r=r||"").replace(" Logo","")).toLowerCase()>o)return n.insertBefore(e(a)),i=!0,!1})),i||t.find("tbody").append(n)}e(".form-table img").on("click",(function(i){function o(){r(!0)}function r(){var a=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=p?"on":"off";n=a?"install":n;var i,o,r=(o=document.querySelector(".kagg-dialog select"))&&null!==(i=o.value)&&void 0!==i?i:"",d={action:HCaptchaIntegrationsObject.action,nonce:HCaptchaIntegrationsObject.nonce,install:a,activate:p,entity:u,status:b,newTheme:r};m.addClass(n),e.post({url:HCaptchaIntegrationsObject.ajaxUrl,data:d}).done((function(a){if(void 0!==a.success)if(void 0!==a.data.themes&&(HCaptchaIntegrationsObject.themes=a.data.themes,HCaptchaIntegrationsObject.defaultTheme=a.data.defaultTheme),a.success){var n=e(".form-table").eq(p?0:1);!function(t,a,n){if("theme"===a){var i=e(".form-table"),o=t?"":'[data-label="'+n+'"]',r=i.eq(t?0:1).find('.hcaptcha-integrations-logo img[data-entity="theme"]'+o);if(r.length){var c=i.eq(t?1:0),s=r.closest("tr");h(c,r.attr("data-label"),s)}}}(p,u,r),h(n,f,m),function(t){c(t,"notice-success")}(a.data.message),function(a){for(var n=e(".form-table"),i=0,o=Object.entries(a);i<o.length;i++){var r=t(o[i],2),c=r[0],s=r[1],d="hcaptcha-integrations-"+c.replace(/_/g,"-"),u=e("tr.".concat(d)),f=u.find(".hcaptcha-integrations-logo"),g=l(u.closest(".form-table"));s&&f.attr("data-installed",!0),g!==s&&h(n.eq(s?0:1),f.find("img").attr("alt"),u)}}(a.data.stati),e("html, body").animate({scrollTop:m.offset().top-hCaptchaSettingsBase.getStickyHeight()},1e3)}else{var i,o;s(null!==(i=null===(o=a.data)||void 0===o?void 0:o.message)&&void 0!==i?i:a.data)}else c(HCaptchaIntegrationsObject.unexpectedErrorMsg,"notice-error")})).fail((function(t){s(t.statusText)})).always((function(){m.removeClass("install on off")}))}i.preventDefault(),n.remove(),e('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),n=e(a);var d=e(i.target),u=d.data("entity");if(u=u||"",-1!==e.inArray(u,["core","theme","plugin"])&&-1===e.inArray(u,["core"])){var f=d.attr("alt");f=(f=f||"").replace(" Logo","");var g,p,m=d.closest("tr"),v=m.attr("class").match(/hcaptcha-integrations-([a-z0-9-]+)/),b=v?v[1]:"",y="";if(m.find("fieldset").attr("disabled"))g="plugin"===u?HCaptchaIntegrationsObject.activatePluginMsg:HCaptchaIntegrationsObject.activateThemeMsg,p=!0;else{if("plugin"===u)g=HCaptchaIntegrationsObject.deactivatePluginMsg;else{for(var C in g=HCaptchaIntegrationsObject.deactivateThemeMsg,y="<p>"+HCaptchaIntegrationsObject.selectThemeMsg+"</p>",y+="<select>",HCaptchaIntegrationsObject.themes){var j=C===HCaptchaIntegrationsObject.defaultTheme?' selected="selected"':"";y+='<option value="'.concat(C,'"').concat(j,">").concat(HCaptchaIntegrationsObject.themes[C],"</option>")}y+="</select>"}p=!1}if(-1===e.inArray(u,["theme"])||p||0!==Object.keys(HCaptchaIntegrationsObject.themes).length){if("false"===m.find(".hcaptcha-integrations-logo").attr("data-installed"))return i.ctrlKey?void o():(g=(g="plugin"===u?HCaptchaIntegrationsObject.installPluginMsg:HCaptchaIntegrationsObject.installThemeMsg).replace("%s",f),void kaggDialog.confirm({title:g,content:y,type:"install",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&o()}}));i.ctrlKey?r():(g=g.replace("%s",f),kaggDialog.confirm({title:g,content:y,type:p?"activate":"deactivate",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&r()}}))}else kaggDialog.confirm({title:HCaptchaIntegrationsObject.onlyOneThemeMsg,content:"",type:"info",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText}}})}}));var d,u,f;r.on("input",(d=function(){var t=r.val().trim().toLowerCase(),a=e(".hcaptcha-integrations-logo img"),n=null;if(a.each((function(a,i){var o=e(i);if("core"!==o.data("entity")){var r=o.closest("tr");o.data("label").toLowerCase().includes(t)?(r.show(),n=null!=n?n:r):r.hide()}})),n){var i=n.offset().top+n.outerHeight()-e(window).height()+5;e("html").stop().animate({scrollTop:i},1e3)}},u=100,function(){var t=this,e=arguments;clearTimeout(f),f=setTimeout((function(){return d.apply(t,e)}),u)})),e("#hcaptcha-options").keydown((function(t){e(t.target).is(r)&&13===t.which&&t.preventDefault()}))};window.hCaptchaIntegrations=a,jQuery(document).ready(a)})();
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/settings-base.js

    r3200161 r3233179  
    66 * @param {Object} $ jQuery instance.
    77 */
    8 const settingsBase = function( $ ) {
     8const settingsBase = ( function( $ ) {
     9    /**
     10     * @type {HTMLElement}
     11     */
     12    const adminBar = document.querySelector( '#wpadminbar' );
     13
     14    /**
     15     * @type {HTMLElement}
     16     */
     17    const tabs = document.querySelector( '.hcaptcha-settings-tabs' );
     18
     19    /**
     20     * @type {HTMLElement}
     21     */
     22    const headerBar = document.querySelector( '.hcaptcha-header-bar' );
     23
    924    const h2Selector = '.hcaptcha-header h2';
     25    const headerBarSelector = '.hcaptcha-header-bar';
    1026    const msgSelector = '#hcaptcha-message';
     27    let $message = $( msgSelector );
    1128
    1229    function setHeaderBarTop() {
    13         /**
    14          * @type {HTMLElement}
    15          */
    16         const adminBar = document.querySelector( '#wpadminbar' );
    17 
    18         /**
    19          * @type {HTMLElement}
    20          */
    21         const tabs = document.querySelector( '.hcaptcha-settings-tabs' );
    22 
    23         /**
    24          * @type {HTMLElement}
    25          */
    26         const headerBar = document.querySelector( '.hcaptcha-header-bar' );
    27 
    2830        const isAbsolute = adminBar ? window.getComputedStyle( adminBar ).position === 'absolute' : true;
    2931        const adminBarHeight = ( adminBar && ! isAbsolute ) ? adminBar.offsetHeight : 0;
     
    7173    }
    7274
     75    /**
     76     * Public properties and functions.
     77     */
     78    const app = {
     79        getStickyHeight() {
     80            const isAbsolute = adminBar ? window.getComputedStyle( adminBar ).position === 'absolute' : true;
     81            const adminBarHeight = ( adminBar && ! isAbsolute ) ? adminBar.offsetHeight : 0;
     82            const tabsHeight = tabs ? tabs.offsetHeight : 0;
     83            const headerBarHeight = headerBar ? headerBar.offsetHeight : 0;
     84
     85            return adminBarHeight + tabsHeight + headerBarHeight;
     86        },
     87
     88        clearMessage() {
     89            $message.remove();
     90            // Concat below to avoid an inspection message.
     91            $( '<div id="hcaptcha-message">' + '</div>' ).insertAfter( headerBarSelector );
     92            $message = $( msgSelector );
     93        },
     94
     95        showMessage( message = '', msgClass = '' ) {
     96            message = message === undefined ? '' : String( message );
     97
     98            if ( ! message ) {
     99                return;
     100            }
     101
     102            app.clearMessage();
     103            $message.addClass( msgClass + ' notice is-dismissible' );
     104
     105            const messageLines = message.split( '\n' ).map( function( line ) {
     106                return `<p>${ line }</p>`;
     107            } );
     108
     109            $message.html( messageLines.join( '' ) );
     110
     111            $( document ).trigger( 'wp-updates-notice-added' );
     112
     113            $( 'html, body' ).animate(
     114                {
     115                    scrollTop: $message.offset().top - app.getStickyHeight(),
     116                },
     117                1000,
     118            );
     119        },
     120
     121        showSuccessMessage( message = '' ) {
     122            app.showMessage( message, 'notice-success' );
     123        },
     124
     125        showErrorMessage( message = '' ) {
     126            app.showMessage( message, 'notice-error' );
     127        },
     128    };
     129
    73130    // Move WP notices to the message area.
    74131    $( h2Selector ).siblings().appendTo( msgSelector );
     
    81138
    82139    highLight();
    83 };
     140
     141    return app;
     142}( jQuery ) );
    84143
    85144window.hCaptchaSettingsBase = settingsBase;
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/settings-base.min.js

    r3143189 r3233179  
    1 (()=>{var e=function(e){function t(){var e=document.querySelector("#wpadminbar"),t=document.querySelector(".hcaptcha-settings-tabs"),a=document.querySelector(".hcaptcha-header-bar"),o=!e||"absolute"===window.getComputedStyle(e).position,n=e&&!o?e.offsetHeight:0,c=n+(t?t.offsetHeight:0)-1;t&&(t.style.top="".concat(n,"px")),a&&(a.style.top="".concat(c,"px"))}e(".hcaptcha-header h2").siblings().appendTo("#hcaptcha-message"),window.addEventListener("resize",(function(){t()})),t(),function(){var t=window.location.href,a=document.referrer;if(a&&a!==t){var o=window.location.hash;if(o){var n=e(o);n&&(n.is(":checkbox")?n.closest("fieldset").addClass("blink"):n.addClass("blink"))}}}()};window.hCaptchaSettingsBase=e,jQuery(document).ready(e)})();
     1(()=>{var e=function(e){var t=document.querySelector("#wpadminbar"),o=document.querySelector(".hcaptcha-settings-tabs"),a=document.querySelector(".hcaptcha-header-bar"),s="#hcaptcha-message",i=e(s);function n(){var e=!t||"absolute"===window.getComputedStyle(t).position,s=t&&!e?t.offsetHeight:0,i=s+(o?o.offsetHeight:0)-1;o&&(o.style.top="".concat(s,"px")),a&&(a.style.top="".concat(i,"px"))}var c={getStickyHeight:function(){var e=!t||"absolute"===window.getComputedStyle(t).position;return(t&&!e?t.offsetHeight:0)+(o?o.offsetHeight:0)+(a?a.offsetHeight:0)},clearMessage:function(){i.remove(),e('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),i=e(s)},showMessage:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(t=void 0===t?"":String(t)){c.clearMessage(),i.addClass(o+" notice is-dismissible");var a=t.split("\n").map((function(e){return"<p>".concat(e,"</p>")}));i.html(a.join("")),e(document).trigger("wp-updates-notice-added"),e("html, body").animate({scrollTop:i.offset().top-c.getStickyHeight()},1e3)}},showSuccessMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";c.showMessage(e,"notice-success")},showErrorMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";c.showMessage(e,"notice-error")}};return e(".hcaptcha-header h2").siblings().appendTo(s),window.addEventListener("resize",(function(){n()})),n(),function(){var t=window.location.href,o=document.referrer;if(o&&o!==t){var a=window.location.hash;if(a){var s=e(a);s&&(s.is(":checkbox")?s.closest("fieldset").addClass("blink"):s.addClass("blink"))}}}(),c}(jQuery);window.hCaptchaSettingsBase=e,jQuery(document).ready(e)})();
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/settings-list-page-base.js

    r3215681 r3233179  
    1 /* global HCaptchaFlatPickerObject, flatpickr */
     1/* global HCaptchaListPageBaseObject, flatpickr */
    22
    33/**
     
    1818        selected: 'hcaptcha-is-selected',
    1919    };
    20     const delimiter = HCaptchaFlatPickerObject.delimiter;
    21     const locale = HCaptchaFlatPickerObject.locale;
     20    const delimiter = HCaptchaListPageBaseObject.delimiter;
     21    const locale = HCaptchaListPageBaseObject.locale;
    2222    let flatPickerObj;
    2323
  • hcaptcha-for-forms-and-more/tags/4.10.0/assets/js/settings-list-page-base.min.js

    r3215681 r3233179  
    1 (()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(e){for(var r=1;r<arguments.length;r++){var a=null!=arguments[r]?arguments[r]:{};r%2?t(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function n(t,r,n){return(r=function(t){var r=function(t,r){if("object"!=e(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var a=n.call(t,r||"default");if("object"!=e(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==e(r)?r:r+""}(r))in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,t}document.addEventListener("DOMContentLoaded",(function(){var e=document.getElementById("hcaptcha-datepicker");if(e){var t,n,a="hcaptcha-is-selected",o=HCaptchaFlatPickerObject.delimiter,c=HCaptchaFlatPickerObject.locale,i=document.getElementById("hcaptcha-options"),l=document.querySelector(".hcaptcha-filter"),u=document.getElementById("hcaptcha-datepicker-popover-button"),p=l.querySelector('input[type="radio"][data-default]');document.addEventListener("click",f),i.querySelector("#hcaptcha-datepicker-popover-button").addEventListener("click",d),i.querySelectorAll('[type="radio"]').forEach((function(e){e.addEventListener("change",v)})),i.querySelector('[type="reset"]').addEventListener("click",b),i.addEventListener("submit",s),i.querySelector("#current-page-selector").addEventListener("keydown",y),n=l.querySelector('input[value="custom"]'),t=flatpickr(e,{mode:"range",inline:!0,allowInput:!1,enableTime:!1,clickOpens:!1,altInput:!0,altFormat:"M j, Y",dateFormat:"Y-m-d",locale:r(r({},flatpickr.l10ns[c]||{}),{},{rangeSeparator:o}),onChange:function(e,t,r){n.checked=!0,m(n.parentElement),t&&(u.textContent=r.altInput.value)}}),v({},n.checked)}function s(t){var r;t.preventDefault(),this.querySelectorAll('input[type="radio"]').forEach((function(e){e.name=""})),(r=u.nextElementSibling).setAttribute("aria-expanded","false"),r.style.display="none";var n=new URL(window.location.href),a=n.searchParams;a.delete("date"),e.value&&a.append("date",e.value),window.location.href=n.toString()}function d(e){e.preventDefault(),e.stopPropagation();var t=e.target.nextElementSibling;"none"===t.style.display||""===t.style.display?t.style.display="block":t.style.display="none",t.setAttribute("aria-expanded","block"===t.style.display?"true":"false")}function y(e){if("Enter"===e.key){e.preventDefault();var t=new URL(window.location.href),r=parseInt(t.searchParams.get("paged")),n=parseInt(e.target.value);(isNaN(r)||r<1)&&(r=1),isNaN(n)||n<1||(t.searchParams.delete("paged"),n!==r&&(t.searchParams.set("paged",n.toString()),window.location.href=t.href))}}function f(e){var t=document.querySelector(".hcaptcha-datepicker-popover");t.contains(e.target)||(t.style.display="none")}function m(e){l.querySelectorAll("label").forEach((function(e){e.classList.remove(a)})),e.classList.add(a)}function b(e){e.preventDefault(),p.checked=!0,v()}function v(){var r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=l.querySelector("input:checked"),a=n.parentElement,c=r?e:n,i=c.value.split(o),p=c.nextElementSibling;u.textContent=r?p.value:a.textContent,m(a),Array.isArray(i)&&2===i.length?t.setDate(i):t.clear()}}))})();
     1(()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?t(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function r(t,n,r){return(n=function(t){var n=function(t,n){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var a=r.call(t,n||"default");if("object"!=e(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}(t,"string");return"symbol"==e(n)?n:n+""}(n))in t?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r,t}document.addEventListener("DOMContentLoaded",(function(){var e=document.getElementById("hcaptcha-datepicker");if(e){var t,r,a="hcaptcha-is-selected",o=HCaptchaListPageBaseObject.delimiter,c=HCaptchaListPageBaseObject.locale,i=document.getElementById("hcaptcha-options"),l=document.querySelector(".hcaptcha-filter"),u=document.getElementById("hcaptcha-datepicker-popover-button"),p=l.querySelector('input[type="radio"][data-default]');document.addEventListener("click",f),i.querySelector("#hcaptcha-datepicker-popover-button").addEventListener("click",d),i.querySelectorAll('[type="radio"]').forEach((function(e){e.addEventListener("change",v)})),i.querySelector('[type="reset"]').addEventListener("click",b),i.addEventListener("submit",s),i.querySelector("#current-page-selector").addEventListener("keydown",y),r=l.querySelector('input[value="custom"]'),t=flatpickr(e,{mode:"range",inline:!0,allowInput:!1,enableTime:!1,clickOpens:!1,altInput:!0,altFormat:"M j, Y",dateFormat:"Y-m-d",locale:n(n({},flatpickr.l10ns[c]||{}),{},{rangeSeparator:o}),onChange:function(e,t,n){r.checked=!0,m(r.parentElement),t&&(u.textContent=n.altInput.value)}}),v({},r.checked)}function s(t){var n;t.preventDefault(),this.querySelectorAll('input[type="radio"]').forEach((function(e){e.name=""})),(n=u.nextElementSibling).setAttribute("aria-expanded","false"),n.style.display="none";var r=new URL(window.location.href),a=r.searchParams;a.delete("date"),e.value&&a.append("date",e.value),window.location.href=r.toString()}function d(e){e.preventDefault(),e.stopPropagation();var t=e.target.nextElementSibling;"none"===t.style.display||""===t.style.display?t.style.display="block":t.style.display="none",t.setAttribute("aria-expanded","block"===t.style.display?"true":"false")}function y(e){if("Enter"===e.key){e.preventDefault();var t=new URL(window.location.href),n=parseInt(t.searchParams.get("paged")),r=parseInt(e.target.value);(isNaN(n)||n<1)&&(n=1),isNaN(r)||r<1||(t.searchParams.delete("paged"),r!==n&&(t.searchParams.set("paged",r.toString()),window.location.href=t.href))}}function f(e){var t=document.querySelector(".hcaptcha-datepicker-popover");t.contains(e.target)||(t.style.display="none")}function m(e){l.querySelectorAll("label").forEach((function(e){e.classList.remove(a)})),e.classList.add(a)}function b(e){e.preventDefault(),p.checked=!0,v()}function v(){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=l.querySelector("input:checked"),a=r.parentElement,c=n?e:r,i=c.value.split(o),p=c.nextElementSibling;u.textContent=n?p.value:a.textContent,m(a),Array.isArray(i)&&2===i.length?t.setDate(i):t.clear()}}))})();
  • hcaptcha-for-forms-and-more/tags/4.10.0/changelog.txt

    r3215681 r3233179  
     1= 4.10.0 =
     2* Added support for wp_login_form() function and LoginOut block.
     3* Added support for hCaptcha in HTML Gravity Forms fields.
     4* Added support for custom nonce action and name in the [hcaptcha] shortcode.
     5* Added compatibility with Cookies and Content Security Policy plugin.
     6* Added auto-verification of arbitrary forms in ajax.
     7* Added deletion of events on the Forms page.
     8* Added deletion of events on the Events page.
     9* Improved error messaging for hCaptcha verification.
     10* Fixed IP detection in the WordPress core via filter. Now syncs with hCaptcha event information when IP collection is activated.
     11* Fixed fatal error with the WPForms plugin in rare cases.
     12* Fixed error message at the first entry to the login page when Hide Login Errors in on.
     13* Fixed scrolling to the message on the General page.
     14* Fixed fatal error during integration installation in some cases.
     15* Fixed the Integrations page when active plugin was deleted.
     16* Fixed error when hCaptcha is disabled for standard login but enabled for LearnPress login.
     17* Fixed error when hCaptcha is disabled for standard login but enabled for Tutor login.
     18* Fixed layout for Forms and Events pages on small screens.
     19
    120= 4.9.0 =
    221* Added LearnPress integration.
  • hcaptcha-for-forms-and-more/tags/4.10.0/hcaptcha.php

    r3215681 r3233179  
    1111 * Plugin URI:           https://www.hcaptcha.com/
    1212 * Description:          hCaptcha keeps out bots and spam while putting privacy first. It is a drop-in replacement for reCAPTCHA.
    13  * Version:              4.9.0
     13 * Version:              4.10.0
    1414 * Requires at least:    5.3
    1515 * Requires PHP:         7.2
     
    2222 *
    2323 * WC requires at least: 3.0
    24  * WC tested up to:      9.3
     24 * WC tested up to:      9.6
    2525 */
    2626
     
    4040 * Plugin version.
    4141 */
    42 const HCAPTCHA_VERSION = '4.9.0';
     42const HCAPTCHA_VERSION = '4.10.0';
    4343
    4444/**
  • hcaptcha-for-forms-and-more/tags/4.10.0/readme.txt

    r3215681 r3233179  
    55Tested up to: 6.7
    66Requires PHP: 7.2
    7 Stable tag: 4.9.0
     7Stable tag: 4.10.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    112112
    113113`
    114 [hcaptcha action="my_hcap_action" name="my_hcap_name" auto="true|false" force="true|false" theme="light|dark|auto" size="normal|compact|invisible"]
     114[hcaptcha action="my_hcap_action" name="my_hcap_name" auto="true|false" ajax="true|false" force="true|false" theme="light|dark|auto" size="normal|compact|invisible"]
    115115`
    116116
     
    186186`
    187187[hcaptcha auto="true" force="true"]
     188`
     189
     190Arbitrary forms can also be verified in ajax via the `ajax` argument. There is no need to specify `auto="true"` in this case, as `ajax` implies `auto="true"`.
     191
     192`
     193[hcaptcha ajax="true"]
    188194`
    189195
     
    552558* Colorlib Customizer Login, Lost Password, and Customizer Register Forms
    553559* Contact Form 7
     560* Cookies and Content Security Policy
    554561* Divi Comment, Contact, Email Optin and Login Forms
    555562* Divi Builder Comment, Contact, Email Optin and Login Forms
     
    621628== Changelog ==
    622629
     630= 4.10.0 =
     631* Added support for wp_login_form() function and LoginOut block.
     632* Added support for hCaptcha in HTML Gravity Forms fields.
     633* Added support for custom nonce action and name in the [hcaptcha] shortcode.
     634* Added compatibility with Cookies and Content Security Policy plugin.
     635* Added auto-verification of arbitrary forms in ajax.
     636* Added deletion of events on the Forms page.
     637* Added deletion of events on the Events page.
     638* Improved error messaging for hCaptcha verification.
     639* Fixed IP detection in the WordPress core via filter. Now syncs with hCaptcha event information when IP collection is activated.
     640* Fixed fatal error with the WPForms plugin in rare cases.
     641* Fixed error message at the first entry to the login page when Hide Login Errors in on.
     642* Fixed scrolling to the message on the General page.
     643* Fixed fatal error during integration installation in some cases.
     644* Fixed the Integrations page when active plugin was deleted.
     645* Fixed error when hCaptcha is disabled for standard login but enabled for LearnPress login.
     646* Fixed error when hCaptcha is disabled for standard login but enabled for Tutor login.
     647* Fixed layout for Forms and Events pages on small screens.
     648
    623649= 4.9.0 =
    624650* Added LearnPress integration.
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Abstracts/LoginBase.php

    r3215681 r3233179  
    159159
    160160        if ( ! hcaptcha()->settings()->is_on( 'hide_login_errors' ) ) {
     161            return $user;
     162        }
     163
     164        $ignore_codes = [ 'empty_username', 'empty_password' ];
     165
     166        if ( in_array( $user->get_error_code(), $ignore_codes, true ) ) {
    161167            return $user;
    162168        }
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Admin/Events/Events.php

    r3215681 r3233179  
    234234                "SELECT
    235235                        SQL_CALC_FOUND_ROWS
    236                         source, form_id, COUNT(*) as served
     236                        id, source, form_id, COUNT(*) as served
    237237                        FROM $table_name
    238238                        WHERE $where_date
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Admin/Events/EventsTable.php

    r3215681 r3233179  
    99
    1010use HCaptcha\Settings\ListPageBase;
    11 use WP_List_Table;
    12 
    13 // If this file is called directly, abort.
    14 if ( ! defined( 'ABSPATH' ) ) {
    15     // @codeCoverageIgnoreStart
    16     exit;
    17     // @codeCoverageIgnoreEnd
    18 }
    19 
    20 if ( ! class_exists( 'WP_List_Table', false ) ) {
    21     // IMPORTANT NOTICE:
    22     // This line is needed to prevent fatal errors in the third-party plugins.
    23     // We know that Jetpack (probably others also) can load WP classes during cron jobs.
    24     require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
    25 }
    2611
    2712/**
    2813 * List events in the table.
    2914 */
    30 class EventsTable extends WP_List_Table {
    31 
    32     /**
    33      * Events per page option.
    34      */
    35     private const EVENTS_PER_PAGE = 'hcaptcha_events_per_page';
    36 
    37     /**
    38      * Plugin page hook.
    39      *
    40      * @var string
    41      */
    42     private $plugin_page_hook;
    43 
    44     /**
    45      * Default number of events to show per page.
    46      *
    47      * @var int
    48      */
    49     public $per_page_default = 20;
     15class EventsTable extends TableBase {
     16
     17    /**
     18     * Singular table name.
     19     */
     20    protected const SINGULAR = 'event';
     21
     22    /**
     23     * Plural table name.
     24     */
     25    protected const PLURAL = 'events';
     26
     27    /**
     28     * Items per page option.
     29     */
     30    protected const ITEMS_PER_PAGE = 'hcaptcha_events_per_page';
    5031
    5132    /**
     
    5536     */
    5637    private $datetime_format = [];
    57 
    58     /**
    59      * Columns.
    60      *
    61      * @var array
    62      */
    63     private $columns;
    64 
    65     /**
    66      * Plugins installed.
    67      *
    68      * @var array[]
    69      */
    70     private $plugins;
    71 
    72     /**
    73      * Class constructor.
    74      *
    75      * @param string $plugin_page_hook Plugin page hook.
    76      */
    77     public function __construct( string $plugin_page_hook ) {
    78         parent::__construct(
    79             [
    80                 'singular' => 'event',
    81                 'plural'   => 'events',
    82                 'screen'   => $plugin_page_hook,
    83             ]
    84         );
    85 
    86         $this->plugin_page_hook = $plugin_page_hook;
    87 
    88         $this->init();
    89     }
    9038
    9139    /**
     
    10149
    10250        $this->columns = [
     51            'cb'          => '<input type="checkbox" />',
    10352            'name'        => __( 'Source', 'hcaptcha-for-forms-and-more' ),
    10453            'form_id'     => __( 'Form Id', 'hcaptcha-for-forms-and-more' ),
     
    10958        ];
    11059
    111         $this->plugins = get_plugins();
    112 
    113         add_action( 'load-' . $this->plugin_page_hook, [ $this, 'add_screen_option' ] );
    114         add_filter( 'set_screen_option_' . self::EVENTS_PER_PAGE, [ $this, 'set_screen_option' ], 10, 3 );
    115 
    116         set_screen_options();
    117     }
    118 
    119     /**
    120      * Add screen options.
    121      *
    122      * @return void
    123      */
    124     public function add_screen_option(): void {
    125         $args = [
    126             'label'   => __( 'Number of items per page:', 'hcaptcha-for-forms-and-more' ),
    127             'default' => $this->per_page_default,
    128             'option'  => self::EVENTS_PER_PAGE,
    129         ];
    130 
    131         add_screen_option( 'per_page', $args );
    132     }
    133 
    134     /**
    135      * Set screen option.
    136      *
    137      * @param mixed  $screen_option  The value to save instead of the option value.
    138      *                               Default false (to skip saving the current option).
    139      * @param string $option         The option name.
    140      * @param mixed  $value          The option value.
    141      *
    142      * @return mixed
    143      * @noinspection PhpUnusedParameterInspection
    144      */
    145     public function set_screen_option( $screen_option, string $option, $value ) {
    146         return $value;
    147     }
    148 
    149     /**
    150      * Retrieve the table columns.
    151      *
    152      * @return array Array of all the list table columns.
    153      */
    154     public function get_columns(): array {
    155         return $this->columns;
     60        parent::init();
    15661    }
    15762
     
    18792    /**
    18893     * Fetch and set up the final data for the table.
     94     *
     95     * @return void
    18996     */
    19097    public function prepare_items(): void {
     
    204111        $dates        = explode( ListPageBase::TIMESPAN_DELIMITER, $date );
    205112        $dates        = array_filter( array_map( 'trim', $dates ) );
    206         $column_slugs = str_replace( 'name', 'source', array_keys( $this->columns ) );
    207         $per_page     = $this->get_items_per_page( self::EVENTS_PER_PAGE, $this->per_page_default );
     113        $column_slugs = str_replace( [ 'cb', 'name' ], [ 'id', 'source' ], array_keys( $this->columns ) );
     114        $per_page     = $this->get_items_per_page( self::ITEMS_PER_PAGE, $this->per_page_default );
    208115        $offset       = ( $paged - 1 ) * $per_page;
    209116        $args         = [
     
    230137
    231138    /**
    232      * Column Source.
    233      * Has 'name' slug not to be hidden.
    234      * WP has no filter for special columns.
    235      *
    236      * @see          \WP_Screen::render_list_table_columns_preferences.
    237      *
    238      * @param object $item Item.
    239      *
    240      * @noinspection PhpUnused PhpUnused.
    241      */
    242     protected function column_name( object $item ): string {
    243         $source = (array) json_decode( $item->source, true );
    244 
    245         foreach ( $source as &$slug ) {
    246             if ( 'WordPress' === $slug ) {
    247                 continue;
    248             }
    249 
    250             if ( false === strpos( $slug, '/' ) ) {
    251                 continue;
    252             }
    253 
    254             $slug = isset( $this->plugins[ $slug ] ) ? $this->plugins[ $slug ]['Name'] : $slug;
    255         }
    256 
    257         unset( $slug );
    258 
    259         return $this->excerpt( implode( ', ', $source ), 15 );
    260     }
    261 
    262     /**
    263139     * Column IP.
    264140     *
     
    324200        );
    325201    }
    326 
    327     /**
    328      * Column default.
    329      *
    330      * @param object $item        Item.
    331      * @param string $column_name Column name.
    332      */
    333     protected function column_default( $item, $column_name ): string {
    334         return (string) $item->$column_name;
    335     }
    336 
    337     /**
    338      * Excerpt text.
    339      *
    340      * @param string $text   Text.
    341      * @param int    $length Excerpt length.
    342      *
    343      * @return string
    344      */
    345     private function excerpt( string $text, int $length = 35 ): string {
    346         $excerpt = mb_substr( $text, 0, $length );
    347 
    348         ob_start();
    349 
    350         ?>
    351         <span class="hcaptcha-excerpt"><?php echo esc_html( $excerpt ); ?>
    352             <span class="hcaptcha-hide"><?php echo esc_html( $text ); ?></span>
    353         </span>
    354         <?php
    355 
    356         return ob_get_clean();
    357     }
    358202}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Admin/Events/FormsTable.php

    r3185570 r3233179  
    99
    1010use HCaptcha\Settings\ListPageBase;
    11 use WP_List_Table;
    12 
    13 // If this file is called directly, abort.
    14 if ( ! defined( 'ABSPATH' ) ) {
    15     // @codeCoverageIgnoreStart
    16     exit;
    17     // @codeCoverageIgnoreEnd
    18 }
    19 
    20 if ( ! class_exists( 'WP_List_Table', false ) ) {
    21     // IMPORTANT NOTICE:
    22     // This line is needed to prevent fatal errors in the third-party plugins.
    23     // We know that Jetpack (probably others also) can load WP classes during cron jobs.
    24     require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
    25 }
    2611
    2712/**
    2813 * List forms in the table.
    2914 */
    30 class FormsTable extends WP_List_Table {
     15class FormsTable extends TableBase {
    3116
    3217    /**
    33      * Forms per page option.
     18     * Singular table name.
    3419     */
    35     private const FORMS_PER_PAGE = 'hcaptcha_forms_per_page';
     20    protected const SINGULAR = 'form';
    3621
    3722    /**
    38      * Plugin page hook.
    39      *
    40      * @var string
     23     * Plural table name.
    4124     */
    42     private $plugin_page_hook;
     25    protected const PLURAL = 'forms';
    4326
    4427    /**
    45      * Default number of forms to show per page.
    46      *
    47      * @var int
     28     * Items per page option.
    4829     */
    49     public $per_page_default = 20;
     30    protected const ITEMS_PER_PAGE = 'hcaptcha_forms_per_page';
    5031
    5132    /**
     
    5738
    5839    /**
    59      * Columns.
    60      *
    61      * @var array
    62      */
    63     private $columns;
    64 
    65     /**
    66      * Plugins installed.
    67      *
    68      * @var array[]
    69      */
    70     private $plugins;
    71 
    72     /**
    73      * Class constructor.
    74      *
    75      * @param string $plugin_page_hook Plugin page hook.
    76      */
    77     public function __construct( string $plugin_page_hook ) {
    78         parent::__construct(
    79             [
    80                 'singular' => 'form',
    81                 'plural'   => 'forms',
    82                 'screen'   => $plugin_page_hook,
    83             ]
    84         );
    85 
    86         $this->plugin_page_hook = $plugin_page_hook;
    87 
    88         $this->init();
    89     }
    90 
    91     /**
    9240     * Init class.
    9341     *
     
    9644    public function init(): void {
    9745        $this->columns = [
     46            'cb'      => '<input type="checkbox" />',
    9847            'name'    => __( 'Source', 'hcaptcha-for-forms-and-more' ),
    9948            'form_id' => __( 'Form Id', 'hcaptcha-for-forms-and-more' ),
     
    10150        ];
    10251
    103         $this->plugins = get_plugins();
    104 
    105         add_action( 'load-' . $this->plugin_page_hook, [ $this, 'add_screen_option' ] );
    106         add_filter( 'set_screen_option_' . self::FORMS_PER_PAGE, [ $this, 'set_screen_option' ], 10, 3 );
    107 
    108         set_screen_options();
    109     }
    110 
    111     /**
    112      * Add screen options.
    113      *
    114      * @return void
    115      */
    116     public function add_screen_option(): void {
    117         $args = [
    118             'label'   => __( 'Number of items per page:', 'hcaptcha-for-forms-and-more' ),
    119             'default' => $this->per_page_default,
    120             'option'  => self::FORMS_PER_PAGE,
    121         ];
    122 
    123         add_screen_option( 'per_page', $args );
    124     }
    125 
    126     /**
    127      * Set screen option.
    128      *
    129      * @param mixed  $screen_option  The value to save instead of the option value.
    130      *                               Default false (to skip saving the current option).
    131      * @param string $option         The option name.
    132      * @param mixed  $value          The option value.
    133      *
    134      * @return mixed
    135      * @noinspection PhpUnusedParameterInspection
    136      */
    137     public function set_screen_option( $screen_option, string $option, $value ) {
    138         return $value;
    139     }
    140 
    141     /**
    142      * Retrieve the table columns.
    143      *
    144      * @return array Array of all the list table columns.
    145      */
    146     public function get_columns(): array {
    147         return $this->columns;
     52        parent::init();
    14853    }
    14954
     
    197102        $dates    = explode( ListPageBase::TIMESPAN_DELIMITER, $date );
    198103        $dates    = array_filter( array_map( 'trim', $dates ) );
    199         $per_page = $this->get_items_per_page( self::FORMS_PER_PAGE, $this->per_page_default );
     104        $per_page = $this->get_items_per_page( self::ITEMS_PER_PAGE, $this->per_page_default );
    200105        $offset   = ( $paged - 1 ) * $per_page;
    201106        $args     = [
     
    220125        );
    221126    }
    222 
    223     /**
    224      * Column Source.
    225      * Has 'name' slug not to be hidden.
    226      * WP has no filter for special columns.
    227      *
    228      * @see          \WP_Screen::render_list_table_columns_preferences.
    229      *
    230      * @param object $item Item.
    231      *
    232      * @noinspection PhpUnused PhpUnused.
    233      */
    234     protected function column_name( object $item ): string {
    235         $source = (array) json_decode( $item->source, true );
    236 
    237         foreach ( $source as &$slug ) {
    238             if ( 'WordPress' === $slug ) {
    239                 continue;
    240             }
    241 
    242             if ( false === strpos( $slug, '/' ) ) {
    243                 continue;
    244             }
    245 
    246             $slug = isset( $this->plugins[ $slug ] ) ? $this->plugins[ $slug ]['Name'] : $slug;
    247         }
    248 
    249         unset( $slug );
    250 
    251         return $this->excerpt( implode( ', ', $source ), 15 );
    252     }
    253 
    254     /**
    255      * Column default.
    256      *
    257      * @param object $item        Item.
    258      * @param string $column_name Column name.
    259      */
    260     protected function column_default( $item, $column_name ): string {
    261         return (string) $item->$column_name;
    262     }
    263 
    264     /**
    265      * Excerpt text.
    266      *
    267      * @param string $text   Text.
    268      * @param int    $length Excerpt length.
    269      *
    270      * @return string
    271      */
    272     private function excerpt( string $text, int $length = 35 ): string {
    273         $excerpt = mb_substr( $text, 0, $length );
    274 
    275         ob_start();
    276 
    277         ?>
    278         <span class="hcaptcha-excerpt"><?php echo esc_html( $excerpt ); ?>
    279             <span class="hcaptcha-hide"><?php echo esc_html( $text ); ?></span>
    280         </span>
    281         <?php
    282 
    283         return ob_get_clean();
    284     }
    285127}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/AutoVerify/AutoVerify.php

    r3129246 r3233179  
    88namespace HCaptcha\AutoVerify;
    99
     10use HCaptcha\Helpers\HCaptcha;
    1011use HCaptcha\Helpers\Request;
    1112use WP_Widget_Block;
     
    2223
    2324    /**
     25     * Script handle.
     26     */
     27    public const HANDLE = 'hcaptcha-auto-verify';
     28
     29    /**
     30     * Script localization object.
     31     */
     32    public const OBJECT = 'HCaptchaAutoVerifyObject';
     33
     34    /**
     35     * The hCaptcha forms registry.
     36     *
     37     * @var array
     38     */
     39    protected $registry = [];
     40
     41    /**
    2442     * Init class.
    2543     *
     
    3654     */
    3755    private function init_hooks(): void {
    38         add_action( 'init', [ $this, 'verify_form' ], - PHP_INT_MAX );
     56        add_action( 'init', [ $this, 'verify' ], - PHP_INT_MAX );
    3957        add_filter( 'the_content', [ $this, 'content_filter' ], PHP_INT_MAX );
    4058        add_filter( 'widget_block_content', [ $this, 'widget_block_content_filter' ], PHP_INT_MAX, 3 );
    4159        add_action( 'hcap_auto_verify_register', [ $this, 'content_filter' ] );
     60        add_action( 'hcap_register_form', [ $this, 'register_hcaptcha' ] );
     61        add_action( 'wp_print_footer_scripts', [ $this, 'enqueue_scripts' ], 9 );
    4262    }
    4363
     
    6888
    6989    /**
     90     * Register hCaptcha form.
     91     *
     92     * @param array|mixed $args Arguments.
     93     *
     94     * @return void
     95     */
     96    public function register_hcaptcha( $args ): void {
     97        if ( ! is_array( $args ) ) {
     98            return;
     99        }
     100
     101        $widget_id = HCaptcha::widget_id_value( $args['id'] ?? [] );
     102
     103        $this->registry[ $widget_id ] = $args;
     104    }
     105
     106    /**
     107     * Enqueue scripts.
     108     *
     109     * @return void
     110     */
     111    public function enqueue_scripts(): void {
     112        if ( ! array_filter( array_column( $this->registry ?? [], 'ajax' ) ) ) {
     113            return;
     114        }
     115
     116        $min = hcap_min_suffix();
     117
     118        wp_enqueue_script(
     119            self::HANDLE,
     120            constant( 'HCAPTCHA_URL' ) . "/assets/js/hcaptcha-auto-verify$min.js",
     121            [ 'jquery' ],
     122            constant( 'HCAPTCHA_VERSION' ),
     123            true
     124        );
     125
     126        wp_localize_script(
     127            self::HANDLE,
     128            self::OBJECT,
     129            [
     130                'successMsg' => __( 'The form was submitted successfully.', 'hcaptcha-for-forms-and-more' ),
     131            ]
     132        );
     133
     134        wp_enqueue_script( 'hcaptcha' );
     135    }
     136
     137    /**
    70138     * Verify a form automatically.
    71139     *
     
    73141     * @noinspection ForgottenDebugOutputInspection
    74142     */
    75     public function verify_form(): void {
     143    public function verify(): void {
    76144        if ( ! Request::is_post() || ! Request::is_frontend() ) {
    77145            return;
     
    84152        }
    85153
    86         if ( ! $this->is_form_registered( $path ) ) {
     154        $registered_form = $this->get_registered_form( $path );
     155
     156        if ( null === $registered_form ) {
    87157            return;
    88158        }
    89159
    90         $result = hcaptcha_verify_post();
     160        $args   = $registered_form['args'] ?? [];
     161        $action = $args['action'] ?? '';
     162        $name   = $args['name'] ?? '';
     163        $ajax   = $args['ajax'] ?? '';
     164        $result = hcaptcha_verify_post( $name, $action );
     165
     166        if ( $ajax ) {
     167            add_filter( 'wp_doing_ajax', '__return_true' );
     168        }
    91169
    92170        if ( null !== $result ) {
    93171            $_POST = [];
     172
    94173            wp_die(
    95174                esc_html( $result ),
     
    119198            }
    120199
     200            $widget_id_value = $this->get_widget_id_value( $form );
     201            $args            = $this->registry[ $widget_id_value ] ?? [];
     202
    121203            $forms_data[] = [
    122204                'action' => $action,
    123205                'inputs' => $this->get_visible_input_names( $form ),
    124                 'auto'   => $this->is_form_auto( $form ),
     206                'args'   => $args,
    125207            ];
    126208        }
     
    139221        $form_action = '';
    140222
    141         if ( preg_match( '#<form [\S\s]*?action="(.*?)"[\S\s]*?>#', $form, $m ) ) {
     223        if ( preg_match( '#<form\s[\S\s]*?action="(.*?)"[\S\s]*?>#', $form, $m ) ) {
    142224            $form_action = $m[1];
    143225        }
     
    146228
    147229        return $this->get_path( $form_action );
     230    }
     231
     232    /**
     233     * Get widget id value.
     234     *
     235     * @param string $form Form.
     236     *
     237     * @return string
     238     */
     239    private function get_widget_id_value( string $form ): string {
     240        $widget_id_value = '';
     241
     242        if ( preg_match( '#<input\s[\S\s]*?name="hcaptcha-widget-id"\s[\S\s]*?value="(.*?)"[\S\s]*?>#', $form, $m ) ) {
     243            $widget_id_value = $m[1];
     244        }
     245
     246        return $widget_id_value;
    148247    }
    149248
     
    229328
    230329    /**
    231      * Get form auto.
    232      *
    233      * @param string $form Form.
    234      *
    235      * @return string|null
    236      */
    237     private function get_form_auto( string $form ): ?string {
    238         if ( preg_match( '#class="h-captcha"[\S\s]+?data-auto="(.*)"[\S\s]*?>#', $form, $matches ) ) {
    239             return $matches[1];
    240         }
    241 
    242         return null;
    243     }
    244 
    245     /**
    246      * Check if the form is auto.
    247      *
    248      * @param string $form Form.
    249      *
    250      * @return bool
    251      */
    252     private function is_form_auto( string $form ): bool {
    253         return 'true' === $this->get_form_auto( $form );
    254     }
    255 
    256     /**
    257330     * Update form data in transient.
    258331     *
     
    264337
    265338        foreach ( $forms_data as $form_data ) {
     339            $data   = $form_data;
    266340            $action = $form_data['action'];
    267             $inputs = $form_data['inputs'];
    268             $auto   = $form_data['auto'];
    269 
    270             $key = isset( $registered_forms[ $action ] ) ?
    271                 array_search( $inputs, $registered_forms[ $action ], true ) :
    272                 false;
     341
     342            unset( $data['action'] );
     343
     344            $inputs = $data['inputs'];
     345            $args   = $data['args'];
     346            $auto   = $args['auto'];
     347
     348            $key          = false;
     349            $action_forms = $registered_forms[ $action ] ?? [];
     350
     351            foreach ( $action_forms as $index => $action_form ) {
     352                if ( $inputs === $action_form['inputs'] ) {
     353                    $key = $index;
     354                    break;
     355                }
     356            }
    273357
    274358            $registered = false !== $key;
    275359
    276             if ( $auto && ! $registered ) {
    277                 $registered_forms[ $action ][] = $inputs;
    278             }
    279 
    280             if ( ! $auto && $registered ) {
     360            if ( $auto ) {
     361                if ( $registered ) {
     362                    $registered_forms[ $action ][ $key ] = $data;
     363                } else {
     364                    $registered_forms[ $action ][] = $data;
     365                }
     366
     367                continue;
     368            }
     369
     370            if ( $registered ) {
    281371                unset( $registered_forms[ $action ][ $key ] );
    282372            }
     
    292382
    293383    /**
    294      * Is the form registered?
     384     * Get registered form.
    295385     *
    296386     * @param string $path URL path.
    297387     *
    298      * @return bool
    299      */
    300     protected function is_form_registered( string $path ): bool {
     388     * @return array|null
     389     */
     390    protected function get_registered_form( string $path ): ?array {
    301391        $registered_forms = get_transient( self::TRANSIENT );
    302392
    303393        if ( empty( $registered_forms ) ) {
    304             return false;
     394            return null;
    305395        }
    306396
    307397        if ( ! isset( $registered_forms[ $path ] ) ) {
    308             return false;
    309         }
     398            return null;
     399        }
     400
     401        // Nonce is verified later, in hcaptcha_verify_post().
     402        // phpcs:ignore WordPress.Security.NonceVerification.Missing
     403        $post_keys = array_keys( $_POST );
    310404
    311405        foreach ( $registered_forms[ $path ] as $registered_form ) {
    312             // Nonce is verified later, in hcaptcha_verify_post().
    313             // phpcs:ignore WordPress.Security.NonceVerification.Missing
    314             if ( ! empty( array_intersect( array_keys( $_POST ), $registered_form ) ) ) {
    315                 return true;
    316             }
    317         }
    318 
    319         return false;
     406            $inputs = $registered_form['inputs'] ?? [];
     407
     408            // Make sure that all inputs are present in the $_POST array.
     409            if ( $inputs && ! array_diff( $inputs, $post_keys ) ) {
     410                return $registered_form;
     411            }
     412        }
     413
     414        return null;
    320415    }
    321416
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/ClassifiedListing/Login.php

    r3114572 r3233179  
    3737     *
    3838     * @return WP_User|WP_Error
    39      * @noinspection PhpUnusedParameterInspection
    4039     */
    4140    public function verify( $user, string $password ) {
     
    4544        }
    4645
    47         if ( ! $this->is_login_limit_exceeded() ) {
    48             return $user;
    49         }
    50 
    51         $error_message = hcaptcha_verify_post(
    52             self::NONCE,
    53             self::ACTION
    54         );
    55 
    56         if ( null === $error_message ) {
    57             return $user;
    58         }
    59 
    60         $code = array_search( $error_message, hcap_get_error_messages(), true ) ?: 'fail';
    61 
    62         return new WP_Error( $code, $error_message, 400 );
     46        return $this->login_base_verify( $user, $password );
    6347    }
    6448}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/GravityForms/Base.php

    r3114572 r3233179  
    1616     * Nonce action.
    1717     */
    18     public const ACTION = 'gravity_forms_form';
     18    public const ACTION = 'gravity_forms';
    1919
    2020    /**
    2121     * Nonce name.
    2222     */
    23     public const NONCE = 'gravity_forms_form_nonce';
     23    public const NONCE = 'gravity_forms_nonce';
    2424}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/GravityForms/Form.php

    r3114572 r3233179  
    4646
    4747    /**
     48     * Current form id.
     49     *
     50     * @var int
     51     */
     52    protected $form_id = 0;
     53
     54    /**
    4855     * Constructor.
    4956     */
     
    6269
    6370        if ( $this->mode_auto ) {
    64             add_filter( 'gform_submit_button', [ $this, 'add_captcha' ], 10, 2 );
    65         }
     71            add_filter( 'gform_submit_button', [ $this, 'add_hcaptcha' ], 10, 2 );
     72        }
     73
     74        add_filter( 'gform_form_after_open', [ $this, 'gform_open' ], 10, 2 );
     75        add_filter( 'gform_get_form_filter', [ $this, 'gform_close' ], 10, 2 );
    6676
    6777        add_filter( 'gform_validation', [ $this, 'verify' ], 10, 2 );
     
    8090     * @noinspection PhpUnusedParameterInspection
    8191     */
    82     public function add_captcha( $button_input, array $form ): string {
     92    public function add_hcaptcha( $button_input, array $form ): string {
    8393        if ( is_admin() ) {
    8494            return $button_input;
     
    8797        $form_id = $form['id'] ?? 0;
    8898
    89         if ( $this->mode_embed && $this->has_hcaptcha( $form_id ) ) {
     99        if ( $this->has_hcaptcha( $form_id ) ) {
    90100            return $button_input;
    91101        }
    92102
    93         $args = [
    94             'action' => self::ACTION,
    95             'name'   => self::NONCE,
    96             'id'     => [
    97                 'source'  => HCaptcha::get_class_source( __CLASS__ ),
    98                 'form_id' => $form_id,
    99             ],
    100         ];
    101 
    102         return HCaptcha::form( $args ) . $button_input;
     103        return HCaptcha::form() . $button_input;
     104    }
     105
     106    /**
     107     * Add hCaptcha args filter on opening the form.
     108     *
     109     * @param string|mixed $markup The current string to append.
     110     * @param array        $form   The form being displayed.
     111     *
     112     * @return string
     113     */
     114    public function gform_open( $markup, array $form ): string {
     115        $this->form_id = (int) ( $form['id'] ?? 0 );
     116
     117        add_filter( 'hcap_form_args', [ $this, 'hcap_form_args' ] );
     118
     119        return (string) $markup;
     120    }
     121
     122    /**
     123     * Remove hCaptcha args filter on closing the form.
     124     *
     125     * @param string|mixed $form_string The current form string.
     126     * @param array        $form        The form being displayed.
     127     *
     128     * @return string
     129     * @noinspection PhpMissingParamTypeInspection
     130     * @noinspection PhpUnusedParameterInspection
     131     */
     132    public function gform_close( $form_string, $form ): string {
     133        $this->form_id = 0;
     134
     135        remove_filter( 'hcap_form_args', [ $this, 'hcap_form_args' ] );
     136
     137        return (string) $form_string;
     138    }
     139
     140    /**
     141     * Filter hCaptcha from args on form.
     142     *
     143     * @param array|mixed $args The form arguments.
     144     *
     145     * @return array
     146     */
     147    public function hcap_form_args( $args ): array {
     148        $args = (array) $args;
     149
     150        return array_merge(
     151            $args,
     152            [
     153                'action' => self::ACTION,
     154                'name'   => self::NONCE,
     155                'id'     => [
     156                    'source'  => HCaptcha::get_class_source( __CLASS__ ),
     157                    'form_id' => $this->form_id,
     158                ],
     159            ]
     160        );
    103161    }
    104162
     
    297355
    298356            if (
    299                 0 !== (int) $_POST[ $target_page_name ] &&
     357                0 !== $target_page &&
    300358                $target_page !== $source_page &&
    301359                isset(
     
    316374        }
    317375
    318         if ( $this->mode_embed && $this->has_hcaptcha( $form_id ) ) {
    319             // In embed mode, verify only a form having hCaptcha field.
     376        if ( $this->has_hcaptcha( $form_id ) ) {
     377            // Verify only a form having hCaptcha field.
    320378            return true;
    321379        }
     
    341399
    342400        foreach ( $form['fields'] as $field ) {
    343             if ( in_array( $field->type, $captcha_types, true ) ) {
     401            $type    = $field->type ?? '';
     402            $content = $field->content ?? '';
     403
     404            if (
     405                ( $this->mode_embed && in_array( $type, $captcha_types, true ) ) ||
     406                has_shortcode( $content, 'hcaptcha' )
     407            ) {
    344408                return true;
    345409            }
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Helpers/HCaptcha.php

    r3200161 r3233179  
    7878                'name'    => '', // Nonce name for wp_nonce_field.
    7979                'auto'    => false, // Whether a form has to be auto-verified.
     80                'ajax'    => false, // Whether a form has to be auto-verified in ajax.
    8081                'force'   => $hcaptcha_force, // Whether to execute hCaptcha widget before submit (like for invisible).
    8182                'theme'   => $hcaptcha_theme, // The hCaptcha theme.
     
    9697
    9798        /**
    98          * Filters the form arguments.
     99         * Filters the hCaptcha form arguments.
    99100         *
    100          * @param array $args The form arguments.
     101         * @param array $args The hCaptcha form arguments.
    101102         */
    102103        $args = (array) apply_filters( 'hcap_form_args', $args );
     
    104105        $args['action']  = (string) $args['action'];
    105106        $args['name']    = (string) $args['name'];
    106         $args['auto']    = filter_var( $args['auto'], FILTER_VALIDATE_BOOLEAN );
     107        $auto            = filter_var( $args['auto'], FILTER_VALIDATE_BOOLEAN );
     108        $args['ajax']    = filter_var( $args['ajax'], FILTER_VALIDATE_BOOLEAN );
     109        $args['auto']    = $args['ajax'] ? true : $auto; // Auto-verify in ajax.
    107110        $args['force']   = filter_var( $args['force'], FILTER_VALIDATE_BOOLEAN );
    108111        $args['theme']   = in_array( (string) $args['theme'], $allowed_themes, true ) ? (string) $args['theme'] : $hcaptcha_theme;
     
    110113        $args['size']    = in_array( (string) $args['size'], $allowed_sizes, true ) ? (string) $args['size'] : $hcaptcha_size;
    111114        $args['id']      = (array) $args['id'];
     115        $id              = $args['id'];
     116        $source          = empty( $id['source'] ) ? self::$default_id['source'] : $id['source'];
     117        $form_id         = $id['form_id'] ?? self::$default_id['form_id'];
     118        $id              = [
     119            'source'  => $source,
     120            'form_id' => $form_id,
     121        ];
     122        $args['id']      = $id;
    112123        $args['protect'] = filter_var( $args['protect'], FILTER_VALIDATE_BOOLEAN );
    113124
    114         $id = wp_parse_args(
    115             $args['id'],
    116             self::$default_id
    117         );
     125        /**
     126         * Register hCaptcha form.
     127         *
     128         * @param array $args The hCaptcha form arguments.
     129         */
     130        do_action( 'hcap_register_form', $args );
    118131
    119132        self::display_widget( $id );
     
    142155                data-size="<?php echo esc_attr( $args['size'] ); ?>"
    143156                data-auto="<?php echo $args['auto'] ? 'true' : 'false'; ?>"
     157                data-ajax="<?php echo $args['ajax'] ? 'true' : 'false'; ?>"
    144158                data-force="<?php echo $args['force'] ? 'true' : 'false'; ?>">
    145159        </h-captcha>
     
    152166
    153167    /**
    154      * Display widget.
     168     * Get widget id value.
    155169     *
    156170     * @param array $id The hCaptcha widget id.
    157171     *
    158      * @return void
    159      */
    160     private static function display_widget( array $id ): void {
     172     * @return string
     173     */
     174    public static function widget_id_value( array $id ): string {
    161175        $id['source']  = (array) ( $id['source'] ?? [] );
    162176        $id['form_id'] = $id['form_id'] ?? 0;
     
    164178        // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
    165179        $encoded_id = base64_encode( wp_json_encode( $id ) );
    166         $widget_id  = $encoded_id . '-' . wp_hash( $encoded_id );
    167 
     180
     181        return $encoded_id . '-' . wp_hash( $encoded_id );
     182    }
     183
     184    /**
     185     * Display widget.
     186     *
     187     * @param array $id The hCaptcha widget id.
     188     *
     189     * @return void
     190     */
     191    private static function display_widget( array $id ): void {
    168192        ?>
    169193        <input
     
    171195                class="<?php echo esc_attr( self::HCAPTCHA_WIDGET_ID ); ?>"
    172196                name="<?php echo esc_attr( self::HCAPTCHA_WIDGET_ID ); ?>"
    173                 value="<?php echo esc_attr( $widget_id ); ?>">
     197                value="<?php echo esc_attr( self::widget_id_value( $id ) ); ?>">
    174198        <?php
    175199    }
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/LearnPress/Login.php

    r3215681 r3233179  
    99
    1010use HCaptcha\Abstracts\LoginBase;
     11use HCaptcha\Helpers\HCaptcha;
     12use WP_Error;
     13use WP_User;
    1114
    1215/**
     
    2427
    2528        add_action( 'login_form', [ $this, 'add_captcha' ] );
    26         add_filter( 'wp_authenticate_user', [ $this, 'login_base_verify' ], PHP_INT_MAX, 2 );
     29        add_filter( 'wp_authenticate_user', [ $this, 'verify' ], 10, 2 );
    2730    }
    2831
     
    3942        parent::add_captcha();
    4043    }
     44
     45    /**
     46     * Verify a login form.
     47     *
     48     * @param WP_User|WP_Error $user     WP_User or WP_Error object
     49     *                                   if a previous callback failed authentication.
     50     * @param string           $password Password to check against the user.
     51     *
     52     * @return WP_User|WP_Error
     53     */
     54    public function verify( $user, string $password ) {
     55        if ( ! $this->is_learn_press_form() ) {
     56            return $user;
     57        }
     58
     59        return $this->login_base_verify( $user, $password );
     60    }
     61
     62    /**
     63     * Whether we process the Learn Press login form.
     64     *
     65     * @return bool
     66     */
     67    private function is_learn_press_form(): bool {
     68        return HCaptcha::did_filter( 'learnpress_login_credentials' );
     69    }
    4170}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/LearnPress/Register.php

    r3215681 r3233179  
    6868     *
    6969     * @return void
     70     * @noinspection PhpUndefinedFunctionInspection
    7071     */
    7172    public function verify(): void {
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Main.php

    r3215681 r3233179  
    1818use HCaptcha\AutoVerify\AutoVerify;
    1919use HCaptcha\CF7\Admin;
     20use HCaptcha\CACSP\Compatibility;
    2021use HCaptcha\CF7\CF7;
    2122use HCaptcha\DelayedScript\DelayedScript;
     
    832833                [ 'wp_status', 'login' ],
    833834                '',
    834                 WP\Login::class,
     835                [ WP\Login::class, WP\LoginOut::class ],
    835836            ],
    836837            'Lost Password Form'                   => [
     
    974975                [ CF7::class, Admin::class ],
    975976            ],
     977            'Cookies and Content Security Policy'  => [
     978                [ 'cacsp_status', null ],
     979                'cookies-and-content-security-policy/cookies-and-content-security-policy.php',
     980                [ Compatibility::class ],
     981            ],
    976982            'Divi Comment Form'                    => [
    977983                [ 'divi_status', 'comment' ],
     
    13041310                Tutor\Checkout::class,
    13051311            ],
    1306             'Tutor LMS Login'                      => [
     1312            'Tutor Login'                          => [
    13071313                [ 'tutor_status', 'login' ],
    13081314                'tutor/tutor.php',
    13091315                Tutor\Login::class,
    13101316            ],
    1311             'Tutor LMS LostPassword'               => [
     1317            'Tutor LostPassword'                   => [
    13121318                [ 'tutor_status', 'lost_pass' ],
    13131319                'tutor/tutor.php',
    13141320                Tutor\LostPassword::class,
    13151321            ],
    1316             'Tutor LMS Register'                   => [
     1322            'Tutor Register'                       => [
    13171323                [ 'tutor_status', 'register' ],
    13181324                'tutor/tutor.php',
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/ProfileBuilder/Login.php

    r3114572 r3233179  
    7676        }
    7777
    78         if ( ! $this->is_login_limit_exceeded() ) {
    79             return $user;
    80         }
    81 
    82         $error_message = hcaptcha_verify_post(
    83             self::NONCE,
    84             self::ACTION
    85         );
    86 
    87         if ( null === $error_message ) {
    88             return $user;
    89         }
    90 
    91         $code = array_search( $error_message, hcap_get_error_messages(), true ) ?: 'fail';
    92 
    93         return new WP_Error( $code, $error_message, 400 );
     78        return $this->login_base_verify( $user, $password );
    9479    }
    9580
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Sendinblue/Sendinblue.php

    r3114572 r3233179  
    6767
    6868        /**
    69          * Filters the HTML containing a form to register it for auto-verification.
     69         * Register a form containing hCaptcha for auto-verification purposes.
    7070         *
    71          * @param string $html HTML content.
     71         * @param string $output HTML content.
    7272         */
    7373        do_action( 'hcap_auto_verify_register', $output );
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Settings/EventsPage.php

    r3114572 r3233179  
    99
    1010use HCaptcha\Admin\Events\EventsTable;
     11use HCaptcha\Helpers\DB;
    1112use KAGG\Settings\Abstracts\SettingsBase;
    1213
     
    2930
    3031    /**
     32     * Bulk ajax action.
     33     */
     34    public const BULK_ACTION = 'hcaptcha-events-bulk';
     35
     36    /**
    3137     * ListTable instance.
    3238     *
     
    4854     */
    4955    protected $failed;
     56
     57    /**
     58     * Init class hooks.
     59     */
     60    protected function init_hooks(): void {
     61        parent::init_hooks();
     62
     63        add_action( 'wp_ajax_' . self::BULK_ACTION, [ $this, 'bulk_action' ] );
     64    }
    5065
    5166    /**
     
    7792
    7893    /**
    79      * Init class hooks.
    80      */
    81     protected function init_hooks(): void {
    82         parent::init_hooks();
    83 
    84         add_action( 'admin_init', [ $this, 'admin_init' ] );
    85         add_action( 'kagg_settings_header', [ $this, 'date_picker_display' ] );
    86     }
    87 
    88     /**
    8994     * Admin init.
    9095     *
     
    103108
    104109        $this->prepare_chart_data();
     110    }
     111
     112    /**
     113     * Ajax callback for bulk actions.
     114     *
     115     * @return void
     116     */
     117    public function bulk_action(): void {
     118        $this->run_checks( self::BULK_ACTION );
     119
     120        // Nonce is checked by check_ajax_referer() in run_checks().
     121        // phpcs:disable WordPress.Security.NonceVerification.Missing
     122        $bulk = isset( $_POST['bulk'] ) ? sanitize_text_field( wp_unslash( $_POST['bulk'] ) ) : '';
     123        $ids  = isset( $_POST['ids'] )
     124            ? (array) json_decode( sanitize_text_field( wp_unslash( $_POST['ids'] ) ), true )
     125            : [];
     126        // phpcs:enable WordPress.Security.NonceVerification.Missing
     127
     128        if ( 'trash' === $bulk ) {
     129            if ( ! $this->delete_hcaptcha_events( $ids ) ) {
     130                wp_send_json_error( __( 'Failed to delete the selected items.', 'hcaptcha-for-forms-and-more' ) );
     131            }
     132
     133            wp_send_json_success();
     134
     135            // For testing purposes.
     136            return;
     137        }
     138
     139        wp_send_json_error( __( 'Invalid bulk action.', 'hcaptcha-for-forms-and-more' ) );
    105140    }
    106141
     
    136171            self::OBJECT,
    137172            [
     173                'ajaxUrl'      => admin_url( 'admin-ajax.php' ),
     174                'bulkAction'   => self::BULK_ACTION,
     175                'bulkNonce'    => wp_create_nonce( self::BULK_ACTION ),
    138176                'succeed'      => $this->succeed,
    139177                'failed'       => $this->failed,
     
    155193    public function section_callback( array $arguments ): void {
    156194        $this->print_header();
     195
     196        ?>
     197        <div id="hcaptcha-message"></div>
     198        <?php
    157199
    158200        if ( ! $this->allowed ) {
     
    236278        }
    237279    }
     280
     281    /**
     282     * Delete hCaptcha events by IDs.
     283     *
     284     * @param array $ids Array of event IDs to delete.
     285     *
     286     * @return bool
     287     */
     288    private function delete_hcaptcha_events( array $ids ): bool {
     289        global $wpdb;
     290
     291        $table_name = $wpdb->prefix . 'hcaptcha_events';
     292
     293        $in = DB::prepare_in( $ids, '%d' );
     294
     295        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
     296        $result = $wpdb->query(
     297            $wpdb->prepare(
     298            // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     299                "DELETE FROM $table_name WHERE id IN($in)"
     300            )
     301        );
     302
     303        return (bool) $result;
     304    }
    238305}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Settings/FormsPage.php

    r3114572 r3233179  
    2929
    3030    /**
     31     * Bulk ajax action.
     32     */
     33    public const BULK_ACTION = 'hcaptcha-forms-bulk';
     34
     35    /**
    3136     * ListTable instance.
    3237     *
     
    4146     */
    4247    protected $served;
     48
     49    /**
     50     * Init class hooks.
     51     */
     52    protected function init_hooks(): void {
     53        parent::init_hooks();
     54
     55        add_action( 'wp_ajax_' . self::BULK_ACTION, [ $this, 'bulk_action' ] );
     56    }
    4357
    4458    /**
     
    7084
    7185    /**
    72      * Init class hooks.
    73      */
    74     protected function init_hooks(): void {
    75         parent::init_hooks();
    76 
    77         add_action( 'admin_init', [ $this, 'admin_init' ] );
    78         add_action( 'kagg_settings_header', [ $this, 'date_picker_display' ] );
    79     }
    80 
    81     /**
    8286     * Admin init.
    8387     *
     
    9498
    9599        $this->prepare_chart_data();
     100    }
     101
     102    /**
     103     * Ajax callback for bulk actions.
     104     *
     105     * @return void
     106     */
     107    public function bulk_action(): void {
     108        $this->run_checks( self::BULK_ACTION );
     109
     110        // Nonce is checked by check_ajax_referer() in run_checks().
     111        // phpcs:disable WordPress.Security.NonceVerification.Missing
     112        $bulk = isset( $_POST['bulk'] ) ? sanitize_text_field( wp_unslash( $_POST['bulk'] ) ) : '';
     113        $ids  = isset( $_POST['ids'] )
     114            ? (array) json_decode( sanitize_text_field( wp_unslash( $_POST['ids'] ) ), true )
     115            : [];
     116        // phpcs:enable WordPress.Security.NonceVerification.Missing
     117
     118        if ( 'trash' === $bulk ) {
     119            if ( ! $this->delete_hcaptcha_events_by_forms( $ids ) ) {
     120                wp_send_json_error( __( 'Failed to delete the selected items.', 'hcaptcha-for-forms-and-more' ) );
     121            }
     122
     123            wp_send_json_success();
     124
     125            // For testing purposes.
     126            return;
     127        }
     128
     129        wp_send_json_error( __( 'Invalid bulk action.', 'hcaptcha-for-forms-and-more' ) );
    96130    }
    97131
     
    127161            self::OBJECT,
    128162            [
     163                'ajaxUrl'     => admin_url( 'admin-ajax.php' ),
     164                'bulkAction'  => self::BULK_ACTION,
     165                'bulkNonce'   => wp_create_nonce( self::BULK_ACTION ),
    129166                'served'      => $this->served,
    130167                'servedLabel' => __( 'Served', 'hcaptcha-for-forms-and-more' ),
     
    144181    public function section_callback( array $arguments ): void {
    145182        $this->print_header();
     183
     184        ?>
     185        <div id="hcaptcha-message"></div>
     186        <?php
    146187
    147188        if ( ! $this->allowed ) {
     
    212253        }
    213254    }
     255
     256    /**
     257     * Delete hCaptcha events by forms.
     258     *
     259     * @param array $ids Array of event IDs to delete.
     260     *
     261     * @return bool
     262     */
     263    private function delete_hcaptcha_events_by_forms( array $ids ): bool {
     264        global $wpdb;
     265
     266        $table_name = $wpdb->prefix . 'hcaptcha_events';
     267        $conditions = [];
     268        $values     = [];
     269
     270        foreach ( $ids as $item ) {
     271            $conditions[] = '(source = %s AND form_id = %d)';
     272            $values[]     = $item['source'];
     273            $values[]     = $item['formId'];
     274        }
     275
     276        $where_clause = implode( ' OR ', $conditions );
     277
     278        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
     279        $result = $wpdb->query(
     280            $wpdb->prepare(
     281            // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
     282                "DELETE FROM $table_name WHERE $where_clause",
     283                ...$values
     284            )
     285        );
     286
     287        return (bool) $result;
     288    }
    214289}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Settings/General.php

    r3215681 r3233179  
    116116
    117117    /**
    118      * Check config form id.
     118     * The 'check config' form id.
    119119     */
    120120    public const CHECK_CONFIG_FORM_ID = 'check-config';
     
    581581                ],
    582582                'default' => 'on',
    583                 'helper'  => __( 'Store collected IP and User Agent as hashed values to conform to GDPR requirements.', 'hcaptcha-for-forms-and-more' ),
     583                'helper'  => __( 'Store collected IP and User Agent locally as hashed values to conform to GDPR requirements.', 'hcaptcha-for-forms-and-more' ),
    584584            ],
    585585            'collect_ip'           => [
     
    857857     *
    858858     * @return void
    859      * @noinspection PhpUnusedParameterInspection
    860859     */
    861860    public function check_config(): void {
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Settings/Integrations.php

    r3215681 r3233179  
    751751        $installed = array_unique( $installed );
    752752
    753         $this->form_fields = $this->sort_fields( $this->form_fields );
    754 
    755         $prefix = self::PREFIX . '-' . $this->section_title() . '-';
    756 
    757753        foreach ( $this->form_fields as $status => &$form_field ) {
    758754            $form_field['installed'] = in_array( $status, $installed, true );
    759             $form_field['section']   = ( ! $form_field['installed'] ) || $form_field['disabled']
    760                 ? self::SECTION_DISABLED
    761                 : self::SECTION_ENABLED;
     755            $form_field['disabled']  = ( ! $form_field['installed'] ) || $form_field['disabled'];
     756        }
     757
     758        unset( $form_field );
     759
     760        $this->form_fields = $this->sort_fields( $this->form_fields );
     761
     762        $prefix = self::PREFIX . '-' . $this->section_title() . '-';
     763
     764        foreach ( $this->form_fields as $status => &$form_field ) {
     765            $form_field['installed'] = in_array( $status, $installed, true );
     766            $form_field['section']   = $form_field['disabled'] ? self::SECTION_DISABLED : self::SECTION_ENABLED;
    762767
    763768            if ( isset( $form_field['label'] ) ) {
     
    16841689
    16851690        if ( is_wp_error( $result ) ) {
    1686             return new WP_Error( $result->get_error_code(), $result->get_error_message() );
     1691            return $result;
    16871692        }
    16881693
    16891694        if ( is_wp_error( $skin->result ) ) {
    1690             return new WP_Error( $skin->result->get_error_code(), $skin->result->get_error_message() );
    1691         }
    1692 
    1693         if ( $skin->get_errors() && $skin->get_errors()->has_errors() ) {
    1694             return new WP_Error( $skin->result->get_error_code(), $skin->result->get_error_message() );
     1695            return $skin->result;
     1696        }
     1697
     1698        $skin_errors = $skin->get_errors();
     1699
     1700        if ( $skin_errors && $skin_errors->has_errors() ) {
     1701            return $skin_errors;
    16951702        }
    16961703
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Settings/ListPageBase.php

    r3185570 r3233179  
    99
    1010use DateTimeImmutable;
     11use Exception;
    1112
    1213/**
     
    3536     * Base object.
    3637     */
    37     public const OBJECT = 'HCaptchaFlatPickerObject';
     38    public const OBJECT = 'HCaptchaListPageBaseObject';
    3839
    3940    /**
     
    6667     */
    6768    protected $allowed = false;
     69
     70    /**
     71     * Init class hooks.
     72     */
     73    protected function init_hooks(): void {
     74        parent::init_hooks();
     75
     76        add_action( 'admin_init', [ $this, 'admin_init' ] );
     77        add_action( 'kagg_settings_header', [ $this, 'date_picker_display' ] );
     78    }
    6879
    6980    /**
     
    175186            self::OBJECT,
    176187            [
     188                'noAction'  => __( 'Please select a bulk action.', 'hcaptcha-for-forms-and-more' ),
     189                'noItems'   => __( 'Please select at least one item to perform this action on.', 'hcaptcha-for-forms-and-more' ),
     190                'DoingBulk' => __( 'Doing bulk action...', 'hcaptcha-for-forms-and-more' ),
    177191                'delimiter' => self::TIMESPAN_DELIMITER,
    178192                'locale'    => $this->get_language_code(),
     
    222236                        <label for="hcaptcha-datepicker">
    223237                            <input
    224                                 type="text"
    225                                 name="date"
    226                                 tabindex="-1"
    227                                 aria-hidden="true"
    228                                 id="hcaptcha-datepicker"
    229                                 value="<?php echo esc_attr( $value ); ?>">
     238                                    type="text"
     239                                    name="date"
     240                                    tabindex="-1"
     241                                    aria-hidden="true"
     242                                    id="hcaptcha-datepicker"
     243                                    value="<?php echo esc_attr( $value ); ?>">
    230244                        </label>
    231245                    </div>
     
    386400
    387401        if ( (int) $days > 0 ) {
    388             $start_date = $start_date->modify( "-$days day" );
     402            try {
     403                $start_date = $start_date->modify( "-$days day" );
     404            } catch ( Exception $e ) {
     405                // @codeCoverageIgnoreStart
     406                $start_date = $end_date;
     407                // @codeCoverageIgnoreEnd
     408            }
    389409        }
    390410
     
    432452
    433453    /**
    434      * Concatenate given dates into a single string. i.e. "2024-04-16 - 2024-05-16".
     454     * Concatenate given dates into a single string.
     455     * Should be like that: "2024-04-16 - 2024-05-16".
    435456     *
    436457     * @param DateTimeImmutable|mixed $start_date Start date.
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/Tutor/Login.php

    r3215681 r3233179  
    99
    1010use HCaptcha\Abstracts\LoginBase;
     11use HCaptcha\Helpers\HCaptcha;
     12use WP_Error;
     13use WP_User;
    1114
    1215/**
     
    2427
    2528        add_action( 'tutor_login_form_middle', [ $this, 'add_captcha' ] );
    26         add_filter( 'wp_authenticate_user', [ $this, 'login_base_verify' ], PHP_INT_MAX, 2 );
     29        add_filter( 'wp_authenticate_user', [ $this, 'verify' ], 10, 2 );
     30    }
     31
     32    /**
     33     * Verify a login form.
     34     *
     35     * @param WP_User|WP_Error $user     WP_User or WP_Error object
     36     *                                   if a previous callback failed authentication.
     37     * @param string           $password Password to check against the user.
     38     *
     39     * @return WP_User|WP_Error
     40     */
     41    public function verify( $user, string $password ) {
     42        if ( ! $this->is_tutor_login_form() ) {
     43            return $user;
     44        }
     45
     46        return $this->login_base_verify( $user, $password );
     47    }
     48
     49    /**
     50     * Whether we process the Tutor login form.
     51     *
     52     * @return bool
     53     */
     54    private function is_tutor_login_form(): bool {
     55        return HCaptcha::did_filter( 'tutor_login_credentials' );
    2756    }
    2857}
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/WP/Comment.php

    r3114572 r3233179  
    119119        }
    120120
     121        // Override poor IP detection by WP Core and make sure that IP is the same in the 'comments' table and in the 'hcaptcha_events' table.
     122        $comment_data['comment_author_IP'] = hcap_get_user_ip();
     123
    121124        $this->result = hcaptcha_get_verify_message_html( self::NONCE, self::ACTION );
    122125
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/WP/Login.php

    r3114572 r3233179  
    66 */
    77
    8 // phpcs:disable Generic.Commenting.DocComment.MissingShort
    9 /** @noinspection PhpUndefinedNamespaceInspection */
    10 /** @noinspection PhpUndefinedClassInspection */
    11 // phpcs:enable Generic.Commenting.DocComment.MissingShort
    12 
    138namespace HCaptcha\WP;
    149
    1510use HCaptcha\Abstracts\LoginBase;
    16 use WordfenceLS\Controller_WordfenceLS;
    1711
    1812/**
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/WPForms/Form.php

    r3114572 r3233179  
    5656     */
    5757    protected function init_hooks(): void {
     58        if ( ! function_exists( 'wpforms' ) ) {
     59            return;
     60        }
     61
    5862        $this->mode_auto  = hcaptcha()->settings()->is( 'wpforms_status', 'form' );
    5963        $this->mode_embed =
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/includes/functions.php

    r3200161 r3233179  
    2626     * Do not set the default size here.
    2727     * If size is not normal|compact|invisible, it will be taken from plugin settings in HCaptcha::form().
     28     * Same for theme and force.
    2829     */
    2930    $atts = shortcode_atts(
     
    3233            'name'    => HCAPTCHA_NONCE,
    3334            'auto'    => false,
     35            'ajax'    => false,
    3436            'force'   => $hcaptcha_force,
    3537            'theme'   => $hcaptcha_theme,
  • hcaptcha-for-forms-and-more/tags/4.10.0/src/php/includes/request.php

    r3200161 r3233179  
    138138    $raw_response = wp_remote_post( $url );
    139139
     140    if ( is_wp_error( $raw_response ) ) {
     141        return [
     142            'error' => implode( "\n", $raw_response->get_error_messages() ),
     143        ];
     144    }
     145
    140146    $raw_body = wp_remote_retrieve_body( $raw_response );
    141147
     
    235241            [ 'body' => $params ]
    236242        );
     243
     244        if ( is_wp_error( $raw_response ) ) {
     245            $result      = implode( "\n", $raw_response->get_error_messages() );
     246            $error_codes = $raw_response->get_error_codes();
     247
     248            /** This filter is documented above. */
     249            return apply_filters( 'hcap_verify_request', $result, $error_codes );
     250        }
    237251
    238252        $raw_body = wp_remote_retrieve_body( $raw_response );
     
    348362if ( ! function_exists( 'hcaptcha_get_verify_message_html' ) ) {
    349363    /**
    350      * Get verify message html.
     364     * Get verify message HTML.
    351365     *
    352366     * @param string $nonce_field_name  Nonce field name.
  • hcaptcha-for-forms-and-more/tags/4.10.0/vendor/autoload.php

    r3215681 r3233179  
    2323require_once __DIR__ . '/composer/autoload_real.php';
    2424
    25 return ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7::getLoader();
     25return ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18::getLoader();
  • hcaptcha-for-forms-and-more/tags/4.10.0/vendor/composer/InstalledVersions.php

    r3215681 r3233179  
    3232     */
    3333    private static $installed;
     34
     35    /**
     36     * @var bool
     37     */
     38    private static $installedIsLocalDir;
    3439
    3540    /**
     
    310315        self::$installed = $data;
    311316        self::$installedByVendor = array();
     317
     318        // when using reload, we disable the duplicate protection to ensure that self::$installed data is
     319        // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
     320        // so we have to assume it does not, and that may result in duplicate data being returned when listing
     321        // all installed packages for example
     322        self::$installedIsLocalDir = false;
    312323    }
    313324
     
    326337
    327338        if (self::$canGetVendors) {
     339            $selfDir = strtr(__DIR__, '\\', '/');
    328340            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
     341                $vendorDir = strtr($vendorDir, '\\', '/');
    329342                if (isset(self::$installedByVendor[$vendorDir])) {
    330343                    $installed[] = self::$installedByVendor[$vendorDir];
     
    334347                    self::$installedByVendor[$vendorDir] = $required;
    335348                    $installed[] = $required;
    336                     if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
     349                    if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
    337350                        self::$installed = $required;
    338                         $copiedLocalDir = true;
     351                        self::$installedIsLocalDir = true;
    339352                    }
     353                }
     354                if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
     355                    $copiedLocalDir = true;
    340356                }
    341357            }
  • hcaptcha-for-forms-and-more/tags/4.10.0/vendor/composer/autoload_classmap.php

    r3215681 r3233179  
    1414    'HCaptcha\\Admin\\Events\\EventsTable' => $baseDir . '/src/php/Admin/Events/EventsTable.php',
    1515    'HCaptcha\\Admin\\Events\\FormsTable' => $baseDir . '/src/php/Admin/Events/FormsTable.php',
     16    'HCaptcha\\Admin\\Events\\TableBase' => $baseDir . '/src/php/Admin/Events/TableBase.php',
    1617    'HCaptcha\\Admin\\Notifications' => $baseDir . '/src/php/Admin/Notifications.php',
    1718    'HCaptcha\\Admin\\PluginStats' => $baseDir . '/src/php/Admin/PluginStats.php',
     
    3637    'HCaptcha\\BuddyPress\\CreateGroup' => $baseDir . '/src/php/BuddyPress/CreateGroup.php',
    3738    'HCaptcha\\BuddyPress\\Register' => $baseDir . '/src/php/BuddyPress/Register.php',
     39    'HCaptcha\\CACSP\\Compatibility' => $baseDir . '/src/php/CACSP/Compatibility.php',
    3840    'HCaptcha\\CF7\\Admin' => $baseDir . '/src/php/CF7/Admin.php',
    3941    'HCaptcha\\CF7\\Base' => $baseDir . '/src/php/CF7/Base.php',
     
    7577    'HCaptcha\\GravityForms\\Form' => $baseDir . '/src/php/GravityForms/Form.php',
    7678    'HCaptcha\\HTMLForms\\Form' => $baseDir . '/src/php/HTMLForms/Form.php',
     79    'HCaptcha\\Helpers\\DB' => $baseDir . '/src/php/Helpers/DB.php',
    7780    'HCaptcha\\Helpers\\HCaptcha' => $baseDir . '/src/php/Helpers/HCaptcha.php',
    7881    'HCaptcha\\Helpers\\Minify\\CSS' => $baseDir . '/src/php/Helpers/Minify/CSS.php',
     
    173176    'HCaptcha\\WP\\Comment' => $baseDir . '/src/php/WP/Comment.php',
    174177    'HCaptcha\\WP\\Login' => $baseDir . '/src/php/WP/Login.php',
     178    'HCaptcha\\WP\\LoginOut' => $baseDir . '/src/php/WP/LoginOut.php',
    175179    'HCaptcha\\WP\\LostPassword' => $baseDir . '/src/php/WP/LostPassword.php',
    176180    'HCaptcha\\WP\\PasswordProtected' => $baseDir . '/src/php/WP/PasswordProtected.php',
  • hcaptcha-for-forms-and-more/tags/4.10.0/vendor/composer/autoload_real.php

    r3215681 r3233179  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7
     5class ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18
    66{
    77    private static $loader;
     
    2323        }
    2424
    25         spl_autoload_register(array('ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7', 'loadClassLoader'), true, true);
     25        spl_autoload_register(array('ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18', 'loadClassLoader'), true, true);
    2626        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    27         spl_autoload_unregister(array('ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7', 'loadClassLoader'));
     27        spl_autoload_unregister(array('ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18', 'loadClassLoader'));
    2828
    2929        require __DIR__ . '/autoload_static.php';
    30         call_user_func(\Composer\Autoload\ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::getInitializer($loader));
     30        call_user_func(\Composer\Autoload\ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::getInitializer($loader));
    3131
    3232        $loader->setClassMapAuthoritative(true);
  • hcaptcha-for-forms-and-more/tags/4.10.0/vendor/composer/autoload_static.php

    r3215681 r3233179  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInit0c3f450f81223af0ef151675e6b814b7
     7class ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18
    88{
    99    public static $prefixLengthsPsr4 = array (
     
    4242        'HCaptcha\\Admin\\Events\\EventsTable' => __DIR__ . '/../..' . '/src/php/Admin/Events/EventsTable.php',
    4343        'HCaptcha\\Admin\\Events\\FormsTable' => __DIR__ . '/../..' . '/src/php/Admin/Events/FormsTable.php',
     44        'HCaptcha\\Admin\\Events\\TableBase' => __DIR__ . '/../..' . '/src/php/Admin/Events/TableBase.php',
    4445        'HCaptcha\\Admin\\Notifications' => __DIR__ . '/../..' . '/src/php/Admin/Notifications.php',
    4546        'HCaptcha\\Admin\\PluginStats' => __DIR__ . '/../..' . '/src/php/Admin/PluginStats.php',
     
    6465        'HCaptcha\\BuddyPress\\CreateGroup' => __DIR__ . '/../..' . '/src/php/BuddyPress/CreateGroup.php',
    6566        'HCaptcha\\BuddyPress\\Register' => __DIR__ . '/../..' . '/src/php/BuddyPress/Register.php',
     67        'HCaptcha\\CACSP\\Compatibility' => __DIR__ . '/../..' . '/src/php/CACSP/Compatibility.php',
    6668        'HCaptcha\\CF7\\Admin' => __DIR__ . '/../..' . '/src/php/CF7/Admin.php',
    6769        'HCaptcha\\CF7\\Base' => __DIR__ . '/../..' . '/src/php/CF7/Base.php',
     
    103105        'HCaptcha\\GravityForms\\Form' => __DIR__ . '/../..' . '/src/php/GravityForms/Form.php',
    104106        'HCaptcha\\HTMLForms\\Form' => __DIR__ . '/../..' . '/src/php/HTMLForms/Form.php',
     107        'HCaptcha\\Helpers\\DB' => __DIR__ . '/../..' . '/src/php/Helpers/DB.php',
    105108        'HCaptcha\\Helpers\\HCaptcha' => __DIR__ . '/../..' . '/src/php/Helpers/HCaptcha.php',
    106109        'HCaptcha\\Helpers\\Minify\\CSS' => __DIR__ . '/../..' . '/src/php/Helpers/Minify/CSS.php',
     
    201204        'HCaptcha\\WP\\Comment' => __DIR__ . '/../..' . '/src/php/WP/Comment.php',
    202205        'HCaptcha\\WP\\Login' => __DIR__ . '/../..' . '/src/php/WP/Login.php',
     206        'HCaptcha\\WP\\LoginOut' => __DIR__ . '/../..' . '/src/php/WP/LoginOut.php',
    203207        'HCaptcha\\WP\\LostPassword' => __DIR__ . '/../..' . '/src/php/WP/LostPassword.php',
    204208        'HCaptcha\\WP\\PasswordProtected' => __DIR__ . '/../..' . '/src/php/WP/PasswordProtected.php',
     
    212216    {
    213217        return \Closure::bind(function () use ($loader) {
    214             $loader->prefixLengthsPsr4 = ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::$prefixLengthsPsr4;
    215             $loader->prefixDirsPsr4 = ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::$prefixDirsPsr4;
    216             $loader->classMap = ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::$classMap;
     218            $loader->prefixLengthsPsr4 = ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::$prefixLengthsPsr4;
     219            $loader->prefixDirsPsr4 = ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::$prefixDirsPsr4;
     220            $loader->classMap = ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::$classMap;
    217221
    218222        }, null, ClassLoader::class);
  • hcaptcha-for-forms-and-more/tags/4.10.0/vendor/composer/installed.php

    r3215681 r3233179  
    22    'root' => array(
    33        'name' => 'hcaptcha/hcaptcha-wordpress-plugin',
    4         'pretty_version' => '4.9.0',
    5         'version' => '4.9.0.0',
    6         'reference' => 'bcf1d7e3058f194fdf32b0c257caf651ab195121',
     4        'pretty_version' => '4.10.0',
     5        'version' => '4.10.0.0',
     6        'reference' => '3f3d675e6a0c12404a0a7aa20b4472b5d37ea88d',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
     
    1212    'versions' => array(
    1313        'hcaptcha/hcaptcha-wordpress-plugin' => array(
    14             'pretty_version' => '4.9.0',
    15             'version' => '4.9.0.0',
    16             'reference' => 'bcf1d7e3058f194fdf32b0c257caf651ab195121',
     14            'pretty_version' => '4.10.0',
     15            'version' => '4.10.0.0',
     16            'reference' => '3f3d675e6a0c12404a0a7aa20b4472b5d37ea88d',
    1717            'type' => 'wordpress-plugin',
    1818            'install_path' => __DIR__ . '/../../',
  • hcaptcha-for-forms-and-more/trunk/assets/css/events.css

    r3166267 r3233179  
    4949}
    5050
    51 @media (max-width: 600px) {
     51@media (max-width: 782px) {
    5252    #hcaptcha-options #hcaptcha-events-wrap table tbody tr td {
    5353        padding-block-start: 3px;
     
    5555        padding-block-end: 3px;
    5656        padding-inline-start: 35%;
     57        min-height: 19.5px;
    5758    }
    5859
  • hcaptcha-for-forms-and-more/trunk/assets/css/events.min.css

    r3166267 r3233179  
    1 #hcaptcha-options #hcaptcha-events-wrap table tbody tr td{padding:8px 10px}.hcaptcha-events-sample-bg{aspect-ratio:2882/1943;background-image:url(../images/events-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-events-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-events-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-events-sample-text p a{color:#f0f2f5}#hcaptcha-events-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}#hcaptcha-events-wrap #user_agent{width:220px}@media (max-width:600px){#hcaptcha-options #hcaptcha-events-wrap table tbody tr td{padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-events-wrap table tbody tr td.column-primary{padding:3px 10px}}
     1#hcaptcha-options #hcaptcha-events-wrap table tbody tr td{padding:8px 10px}.hcaptcha-events-sample-bg{aspect-ratio:2882/1943;background-image:url(../images/events-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-events-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-events-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-events-sample-text p a{color:#f0f2f5}#hcaptcha-events-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}#hcaptcha-events-wrap #user_agent{width:220px}@media (max-width:782px){#hcaptcha-options #hcaptcha-events-wrap table tbody tr td{min-height:19.5px;padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-events-wrap table tbody tr td.column-primary{padding:3px 10px}}
  • hcaptcha-for-forms-and-more/trunk/assets/css/forms.css

    r3166267 r3233179  
    4545}
    4646
    47 @media (max-width: 600px) {
     47@media (max-width: 782px) {
    4848    #hcaptcha-options #hcaptcha-forms-wrap table tbody tr td {
    4949        padding-block-start: 3px;
     
    5151        padding-block-end: 3px;
    5252        padding-inline-start: 35%;
     53        min-height: 19.5px;
    5354    }
    5455
  • hcaptcha-for-forms-and-more/trunk/assets/css/forms.min.css

    r3166267 r3233179  
    1 #hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{padding:8px 10px}.hcaptcha-forms-sample-bg{aspect-ratio:2845/1637;background-image:url(../images/forms-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-forms-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-forms-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-forms-sample-text p a{color:#f0f2f5}#hcaptcha-forms-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}@media (max-width:600px){#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td.column-primary{padding:3px 10px}}
     1#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{padding:8px 10px}.hcaptcha-forms-sample-bg{aspect-ratio:2845/1637;background-image:url(../images/forms-page.png);background-position:50%;background-repeat:no-repeat;background-size:cover;box-sizing:border-box;filter:blur(1px);-webkit-filter:blur(1px);width:100%}.hcaptcha-forms-sample-text{background-color:rgba(92,111,138,.8);border:3px solid #f0f2f5;color:#f0f2f5;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:80%;z-index:1}.hcaptcha-forms-sample-text p{font-size:1.3em}#hcaptcha-options .hcaptcha-forms-sample-text p a{color:#f0f2f5}#hcaptcha-forms-chart{aspect-ratio:3/1;background-color:#fff;margin:auto;position:relative;width:100%}@media (max-width:782px){#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td{min-height:19.5px;padding-block-end:3px;padding-block-start:3px;padding-inline-end:8px;padding-inline-start:35%}#hcaptcha-options #hcaptcha-forms-wrap table tbody tr td.column-primary{padding:3px 10px}}
  • hcaptcha-for-forms-and-more/trunk/assets/css/settings-base.css

    r3215681 r3233179  
    5454    position: sticky;
    5555    top: 60px;
    56     z-index: 1;
     56    z-index: 2;
    5757    background: #f0f2f5;
    5858    display: flex;
     
    8787}
    8888
    89 #hcaptcha-options table tr td input[type="checkbox"] {
     89#hcaptcha-options table tr td fieldset input[type="checkbox"] {
    9090    display: inline;
    9191    border: none;
     
    9999}
    100100
    101 #hcaptcha-options table tr td input[type="checkbox"]::before {
     101#hcaptcha-options table tr td fieldset input[type="checkbox"]::before {
    102102    background: url('../images/checkbox-off.svg');
    103103    background-size: cover;
     
    109109}
    110110
    111 #hcaptcha-options table tr td input[type="checkbox"]:checked::before {
     111#hcaptcha-options table tr td fieldset input[type="checkbox"]:checked::before {
    112112    background: no-repeat url('../images/checkbox-on.svg');
    113113    background-size: cover;
     
    251251.hcaptcha-excerpt {
    252252    display: block;
     253    position: relative;
     254    width: max-content;
     255    max-width: 100%;
    253256    overflow: hidden;
    254257    white-space: nowrap;
    255258    text-overflow: ellipsis;
     259}
     260
     261.hcaptcha-excerpt:hover {
     262    overflow: visible;
    256263}
    257264
     
    265272    width: max-content;
    266273    padding: 8px 10px;
    267     top: 0;
    268     inset-inline-start: 0;
     274    top: 50%;
     275    inset-inline-start: 50%;
     276    transform: translate(-50%, -50%);
    269277    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
    270278    border-radius: 6px;
     
    275283
    276284@media (max-width: 782px) {
     285    #hcaptcha-options .wp-list-table .toggle-row {
     286        top: 15px;
     287    }
     288
     289    #hcaptcha-options .wp-list-table tr.is-expanded .toggle-row {
     290        top: 6.5px;
     291    }
     292
     293    #hcaptcha-options .widefat tbody th.check-column {
     294        padding: 0;
     295        vertical-align: middle;
     296    }
     297
     298    #hcaptcha-options .widefat thead td.check-column, .widefat tfoot td.check-column {
     299        padding-left: 0;
     300    }
     301
     302    #hcaptcha-options .widefat th input[type="checkbox"] {
     303        margin-bottom: 0;
     304    }
     305
     306    #hcaptcha-options .wp-list-table .is-expanded td:not(.hidden) {
     307        overflow: visible;
     308    }
     309
    277310    .hcaptcha-settings-tabs {
    278311        margin: unset;
     
    286319        padding-inline-start: 10px;
    287320    }
     321
     322    .hcaptcha-excerpt {
     323        display: table-cell;
     324        vertical-align: middle;
     325        height: 44px;
     326    }
     327
     328    tr.is-expanded .hcaptcha-excerpt {
     329        height: 19.5px;
     330    }
    288331}
    289332
  • hcaptcha-for-forms-and-more/trunk/assets/css/settings-base.min.css

    r3215681 r3233179  
    1 body.settings_page_hcaptcha{background:#f0f2f5;color:#5c6f8a}.wrap h1.hcaptcha-settings-header{align-items:center;display:flex;font-size:34px;font-weight:700}.hcaptcha-logo{height:64px;margin-block-end:10px;margin-block-start:10px;margin-inline-end:5px;margin-inline-start:0}.hcaptcha-settings-tabs{background:#fff;display:flex;flex-wrap:wrap;justify-content:space-between;line-height:4.5em;margin:10px -20px 0;padding:0 20px;position:sticky;top:0;z-index:2}.hcaptcha-settings-tab{border-bottom:2px solid transparent;color:#646970;display:inline-block;font-size:1.1em;margin-inline-end:30px;text-decoration:none}.hcaptcha-settings-tab:hover{border-bottom-color:#025176!important;border-bottom:2px solid;color:#666}.hcaptcha-settings-tab.active{border-bottom:2px solid #0075ab}.hcaptcha-header-bar{align-items:center;background:#f0f2f5;display:flex;justify-content:space-between;margin:0 -20px;padding:0 20px;position:sticky;top:60px;z-index:1}#hcaptcha-options h2{color:#5c6f8a;font-size:1.5em}#hcaptcha-options h2~*{display:none}#hcaptcha-options h3{color:#5c6f8a;margin:1.5em 0 1em}#hcaptcha-options .notice-dismiss:before{color:#5c6f8a}#hcaptcha-options table tbody tr td{margin:0;padding:0;position:relative}#hcaptcha-options table tr td input[type=checkbox]{border:none;box-shadow:none;display:inline;height:1.25rem;margin-block-end:0;margin-block-start:-.125rem;margin-inline-end:.5rem;margin-inline-start:0;width:2.3611rem}#hcaptcha-options table tr td input[type=checkbox]:before{background:url(../images/checkbox-off.svg);background-size:cover;content:"";display:inline-block;height:1.25rem;margin:0;width:2.3611rem}#hcaptcha-options table tr td input[type=checkbox]:checked:before{background:no-repeat url(../images/checkbox-on.svg);background-size:cover}#hcaptcha-options fieldset:disabled{color:#dadada}#hcaptcha-options .button-primary{background-color:#026593;border-color:#026593;color:#fff}#hcaptcha-options .button-primary:hover{background-color:#025176}#hcaptcha-options .button-secondary{background-color:#fff;border-color:#026593;color:#026593}#hcaptcha-options .button-secondary:hover{background-color:#ccc}#hcaptcha-options a{color:#0075ab}#hcaptcha-navigation a{border-color:#0075ab}#hcaptcha-options a.hcaptcha-settings-tab{color:#5c6f8a}#hcaptcha-options .helper:before{background:#5c6f8a;border-radius:1.2em;color:#fff;content:"?";height:1.2em;inset-inline-end:0;position:absolute;text-align:center;top:0;transform:translateY(-27px);width:1.2em}#hcaptcha-options fieldset+.helper:before{top:50%;transform:translate(25px,-.7em)}.rtl #hcaptcha-options fieldset+.helper:before{transform:translate(-25px,-.8em)}#hcaptcha-options .helper .helper-content{background:#5c6f8a;box-sizing:border-box;color:#f0f2f5;display:none;inset-inline-end:0;padding:.5em 1em;position:absolute;top:0;transform:translate(1px,10px);width:100%}.rtl #hcaptcha-options .helper .helper-content{transform:translate(-1px,10px)}#hcaptcha-options fieldset+.helper .helper-content{top:50%;transform:translate(25px,25px);width:calc(100% + 25px)}#hcaptcha-options .helper:hover{cursor:help}#hcaptcha-options .helper:hover .helper-content{display:block;z-index:1}#hcaptcha-options .helper .helper-content:after{border:10px solid transparent;border-bottom-color:#5c6f8a;content:"";inset-inline-end:0;position:absolute;top:0;transform:translateY(-100%)}#hcaptcha-options .helper .helper-content a{color:#fff}#hcaptcha-message{box-sizing:border-box}#hcaptcha-message>p{font-size:13px;font-weight:600;line-height:1.5;margin:.5em 0}@keyframes blink{0%{opacity:1}16.7%{opacity:0}33.3%{opacity:1}50%{opacity:0}66.7%{opacity:1}83.3%{opacity:0}to{opacity:1}}.blink{animation:blink 3s linear}.hcaptcha-hide{display:none}.hcaptcha-excerpt{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hcaptcha-excerpt:hover .hcaptcha-hide{background:#5c6f8a;border:1px solid #c3c4c7;border-radius:6px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);color:#f0f2f5;display:block;inset-inline-start:0;max-width:300px;padding:8px 10px;position:absolute;text-align:center;top:0;white-space:normal;width:max-content;z-index:1}@media (max-width:782px){.hcaptcha-settings-tabs{margin:unset;margin-block-end:0;margin-block-start:10px;margin-inline-end:-12px;margin-inline-start:-10px;padding-block-end:0;padding-block-start:0;padding-inline-end:12px;padding-inline-start:10px}}@media (max-width:600px){#hcaptcha-options table tbody{grid-template-columns:1fr}#hcaptcha-options table tbody tr{position:relative}#hcaptcha-options fieldset+.helper:before{transform:translateY(-.7em)}#hcaptcha-options fieldset+.helper .helper-content{transform:translateY(25px);width:100%}#hcaptcha-options .helper{z-index:1}.hcaptcha-settings-tab{inset-inline-end:15px}}
     1body.settings_page_hcaptcha{background:#f0f2f5;color:#5c6f8a}.wrap h1.hcaptcha-settings-header{align-items:center;display:flex;font-size:34px;font-weight:700}.hcaptcha-logo{height:64px;margin-block-end:10px;margin-block-start:10px;margin-inline-end:5px;margin-inline-start:0}.hcaptcha-settings-tabs{background:#fff;display:flex;flex-wrap:wrap;justify-content:space-between;line-height:4.5em;margin:10px -20px 0;padding:0 20px;position:sticky;top:0;z-index:2}.hcaptcha-settings-tab{border-bottom:2px solid transparent;color:#646970;display:inline-block;font-size:1.1em;margin-inline-end:30px;text-decoration:none}.hcaptcha-settings-tab:hover{border-bottom-color:#025176!important;border-bottom:2px solid;color:#666}.hcaptcha-settings-tab.active{border-bottom:2px solid #0075ab}.hcaptcha-header-bar{align-items:center;background:#f0f2f5;display:flex;justify-content:space-between;margin:0 -20px;padding:0 20px;position:sticky;top:60px;z-index:2}#hcaptcha-options h2{color:#5c6f8a;font-size:1.5em}#hcaptcha-options h2~*{display:none}#hcaptcha-options h3{color:#5c6f8a;margin:1.5em 0 1em}#hcaptcha-options .notice-dismiss:before{color:#5c6f8a}#hcaptcha-options table tbody tr td{margin:0;padding:0;position:relative}#hcaptcha-options table tr td fieldset input[type=checkbox]{border:none;box-shadow:none;display:inline;height:1.25rem;margin-block-end:0;margin-block-start:-.125rem;margin-inline-end:.5rem;margin-inline-start:0;width:2.3611rem}#hcaptcha-options table tr td fieldset input[type=checkbox]:before{background:url(../images/checkbox-off.svg);background-size:cover;content:"";display:inline-block;height:1.25rem;margin:0;width:2.3611rem}#hcaptcha-options table tr td fieldset input[type=checkbox]:checked:before{background:no-repeat url(../images/checkbox-on.svg);background-size:cover}#hcaptcha-options fieldset:disabled{color:#dadada}#hcaptcha-options .button-primary{background-color:#026593;border-color:#026593;color:#fff}#hcaptcha-options .button-primary:hover{background-color:#025176}#hcaptcha-options .button-secondary{background-color:#fff;border-color:#026593;color:#026593}#hcaptcha-options .button-secondary:hover{background-color:#ccc}#hcaptcha-options a{color:#0075ab}#hcaptcha-navigation a{border-color:#0075ab}#hcaptcha-options a.hcaptcha-settings-tab{color:#5c6f8a}#hcaptcha-options .helper:before{background:#5c6f8a;border-radius:1.2em;color:#fff;content:"?";height:1.2em;inset-inline-end:0;position:absolute;text-align:center;top:0;transform:translateY(-27px);width:1.2em}#hcaptcha-options fieldset+.helper:before{top:50%;transform:translate(25px,-.7em)}.rtl #hcaptcha-options fieldset+.helper:before{transform:translate(-25px,-.8em)}#hcaptcha-options .helper .helper-content{background:#5c6f8a;box-sizing:border-box;color:#f0f2f5;display:none;inset-inline-end:0;padding:.5em 1em;position:absolute;top:0;transform:translate(1px,10px);width:100%}.rtl #hcaptcha-options .helper .helper-content{transform:translate(-1px,10px)}#hcaptcha-options fieldset+.helper .helper-content{top:50%;transform:translate(25px,25px);width:calc(100% + 25px)}#hcaptcha-options .helper:hover{cursor:help}#hcaptcha-options .helper:hover .helper-content{display:block;z-index:1}#hcaptcha-options .helper .helper-content:after{border:10px solid transparent;border-bottom-color:#5c6f8a;content:"";inset-inline-end:0;position:absolute;top:0;transform:translateY(-100%)}#hcaptcha-options .helper .helper-content a{color:#fff}#hcaptcha-message{box-sizing:border-box}#hcaptcha-message>p{font-size:13px;font-weight:600;line-height:1.5;margin:.5em 0}@keyframes blink{0%{opacity:1}16.7%{opacity:0}33.3%{opacity:1}50%{opacity:0}66.7%{opacity:1}83.3%{opacity:0}to{opacity:1}}.blink{animation:blink 3s linear}.hcaptcha-hide{display:none}.hcaptcha-excerpt{display:block;max-width:100%;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:max-content}.hcaptcha-excerpt:hover{overflow:visible}.hcaptcha-excerpt:hover .hcaptcha-hide{background:#5c6f8a;border:1px solid #c3c4c7;border-radius:6px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);color:#f0f2f5;display:block;inset-inline-start:50%;max-width:300px;padding:8px 10px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);white-space:normal;width:max-content;z-index:1}@media (max-width:782px){#hcaptcha-options .wp-list-table .toggle-row{top:15px}#hcaptcha-options .wp-list-table tr.is-expanded .toggle-row{top:6.5px}#hcaptcha-options .widefat tbody th.check-column{padding:0;vertical-align:middle}#hcaptcha-options .widefat thead td.check-column,.widefat tfoot td.check-column{padding-left:0}#hcaptcha-options .widefat th input[type=checkbox]{margin-bottom:0}#hcaptcha-options .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.hcaptcha-settings-tabs{margin:unset;margin-block-end:0;margin-block-start:10px;margin-inline-end:-12px;margin-inline-start:-10px;padding-block-end:0;padding-block-start:0;padding-inline-end:12px;padding-inline-start:10px}.hcaptcha-excerpt{display:table-cell;height:44px;vertical-align:middle}tr.is-expanded .hcaptcha-excerpt{height:19.5px}}@media (max-width:600px){#hcaptcha-options table tbody{grid-template-columns:1fr}#hcaptcha-options table tbody tr{position:relative}#hcaptcha-options fieldset+.helper:before{transform:translateY(-.7em)}#hcaptcha-options fieldset+.helper .helper-content{transform:translateY(25px);width:100%}#hcaptcha-options .helper{z-index:1}.hcaptcha-settings-tab{inset-inline-end:15px}}
  • hcaptcha-for-forms-and-more/trunk/assets/css/settings-list-page-base.css

    r3166267 r3233179  
    33    display: flex;
    44    flex-direction: row-reverse;
    5     margin-bottom: 15px;
    65}
    76
  • hcaptcha-for-forms-and-more/trunk/assets/css/settings-list-page-base.min.css

    r3166267 r3233179  
    1 .hcaptcha-filter{display:flex;flex-direction:row-reverse;margin-bottom:15px;position:relative}#hcaptcha-datepicker-popover-button{align-items:center;background:#fff;border-color:#8c8f94;color:#3c434a;display:flex;font-size:14px;gap:16px}.hcaptcha-datepicker-popover{background:#fff;border-radius:6px;box-shadow:0 5px 15px rgba(0,0,0,.15);display:none;inset-inline-end:0;margin-top:10px;max-width:80vw;position:absolute;top:32px;width:416px;z-index:30}.hcaptcha-datepicker-popover-content{display:flex;flex-wrap:wrap}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{display:flex;flex-direction:column;flex-grow:1;font-size:14px;gap:15px;justify-content:space-between;line-height:14px;margin:0;padding:20px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices label{cursor:pointer}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices .hcaptcha-is-selected{color:#0075ab}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{padding:10px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-action{border-top:1px solid #ccd0d4;display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-end;padding:15px 20px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .form-control,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices [type=radio]{border:none;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar.inline{top:0}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar{box-shadow:none;width:100%}.flatpickr-current-month .flatpickr-monthDropdown-months,.flatpickr-current-month input.cur-year{font-size:14px;font-weight:700;opacity:.7}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-days,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-rContainer{font-size:13px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer{max-width:100%;min-width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar *{box-sizing:border-box}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-day{align-items:center;aspect-ratio:1;border-style:hidden;box-shadow:none;display:flex;height:auto;line-height:30px;margin:0;max-width:none}@media (min-width:601px){.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{width:245px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{border-inline-end:1px solid #ccd0d4;margin-inline-end:4px}}
     1.hcaptcha-filter{display:flex;flex-direction:row-reverse;position:relative}#hcaptcha-datepicker-popover-button{align-items:center;background:#fff;border-color:#8c8f94;color:#3c434a;display:flex;font-size:14px;gap:16px}.hcaptcha-datepicker-popover{background:#fff;border-radius:6px;box-shadow:0 5px 15px rgba(0,0,0,.15);display:none;inset-inline-end:0;margin-top:10px;max-width:80vw;position:absolute;top:32px;width:416px;z-index:30}.hcaptcha-datepicker-popover-content{display:flex;flex-wrap:wrap}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{display:flex;flex-direction:column;flex-grow:1;font-size:14px;gap:15px;justify-content:space-between;line-height:14px;margin:0;padding:20px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices label{cursor:pointer}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices .hcaptcha-is-selected{color:#0075ab}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{padding:10px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-action{border-top:1px solid #ccd0d4;display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-end;padding:15px 20px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .form-control,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices [type=radio]{border:none;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar.inline{top:0}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar{box-shadow:none;width:100%}.flatpickr-current-month .flatpickr-monthDropdown-months,.flatpickr-current-month input.cur-year{font-size:14px;font-weight:700;opacity:.7}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-days,.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-rContainer{font-size:13px;width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .dayContainer{max-width:100%;min-width:100%}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar *{box-sizing:border-box}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar .flatpickr-calendar .flatpickr-day{align-items:center;aspect-ratio:1;border-style:hidden;box-shadow:none;display:flex;height:auto;line-height:30px;margin:0;max-width:none}@media (min-width:601px){.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-calendar{width:245px}.hcaptcha-datepicker-popover-content .hcaptcha-datepicker-choices{border-inline-end:1px solid #ccd0d4;margin-inline-end:4px}}
  • hcaptcha-for-forms-and-more/trunk/assets/js/apps/hcaptcha.js

    r3200161 r3233179  
    1 (()=>{"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t){return function(t){if(Array.isArray(t))return r(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||n(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}function r(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n<e;n++)r[n]=t[n];return r}function o(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,a(r.key),r)}}function a(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,n||"default");if("object"!=t(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}var i=function(){return r=function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.foundForms=[],this.params=null,this.observing=!1,this.darkElement=null,this.darkClass=null,this.callback=this.callback.bind(this),this.validate=this.validate.bind(this),this.addedDCLCallbacks=new Set},a=[{key:"generateID",value:function(){var t=function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)};return t()+"-"+t()+"-"+t()+"-"+t()}},{key:"getFoundFormById",value:function(t){var e;return null!==(e=this.foundForms.filter((function(e){return t===e.hCaptchaId}))[0])&&void 0!==e?e:null}},{key:"getWidgetId",value:function(t){var e,n,r;if(void 0===t)return"";var o=null!==(e=null===(n=t.closest(this.formSelector))||void 0===n||null===(n=n.dataset)||void 0===n?void 0:n.hCaptchaId)&&void 0!==e?e:"";if(!o)return"";var a=this.getFoundFormById(o);return null!==(r=null==a?void 0:a.widgetId)&&void 0!==r?r:""}},{key:"reset",value:function(t){var e=this.getWidgetId(t);e&&hcaptcha.reset(e)}},{key:"isSameOrDescendant",value:function(t,e){for(var n=e;n;){if(n===t)return!0;n=n.parentElement}return!1}},{key:"validate",value:function(t){var e=t.currentTarget.closest(this.formSelector),n=this.getFoundFormById(e.dataset.hCaptchaId),r=n.submitButtonElement,o=n.widgetId;if(this.isSameOrDescendant(r,t.target)&&(t.preventDefault(),t.stopPropagation(),this.currentForm={formElement:e,submitButtonElement:r},o)){var a=e.querySelector(this.responseSelector),i=a?a.value:"";""===i?hcaptcha.execute(o):this.callback(i)}}},{key:"isValidated",value:function(){return void 0!==this.currentForm}},{key:"getForms",value:function(){return e(document.querySelectorAll(this.formSelector))}},{key:"getParams",value:function(){if(null!==this.params)return this.params;var t;try{var e,n;t=JSON.parse(wp.hooks.applyFilters("hcaptcha.params",null!==(e=null===(n=HCaptchaMainObject)||void 0===n?void 0:n.params)&&void 0!==e?e:""))}catch(e){t={}}return t.callback=this.callback,t}},{key:"setParams",value:function(t){this.params=t}},{key:"setDarkData",value:function(){var t={"twenty-twenty-one":{darkStyleId:"twenty-twenty-one-style-css",darkElement:document.body,darkClass:"is-dark-theme"},"wp-dark-mode":{darkStyleId:"wp-dark-mode-frontend-css",darkElement:document.documentElement,darkClass:"wp-dark-mode-active"},"droit-dark-mode":{darkStyleId:"dtdr-public-inline-css",darkElement:document.documentElement,darkClass:"drdt-dark-mode"}};t=wp.hooks.applyFilters("hcaptcha.darkData",t);for(var e=0,n=Object.values(t);e<n.length;e++){var r=n[e];if(document.getElementById(r.darkStyleId))return this.darkElement=r.darkElement,void(this.darkClass=r.darkClass)}}},{key:"observeDarkMode",value:function(){var t=this;this.observing||(this.observing=!0,"auto"!==this.getParams().theme)||(this.setDarkData(),this.darkElement&&this.darkClass&&new MutationObserver((function(e){var r,o=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=n(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var o=0,a=function(){};return{s:a,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,c=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){c=!0,i=t},f:function(){try{u||null==r.return||r.return()}finally{if(c)throw i}}}}(e);try{var a=function(){var e=r.value.oldValue,n=t.darkElement.getAttribute("class");e=e?e.split(" "):[],(n=n?n.split(" "):[]).filter((function(t){return!e.includes(t)})).concat(e.filter((function(t){return!n.includes(t)}))).includes(t.darkClass)&&t.bindEvents()};for(o.s();!(r=o.n()).done;)a()}catch(t){o.e(t)}finally{o.f()}})).observe(this.darkElement,{attributes:!0,attributeOldValue:!0}))}},{key:"getWidgetByToken",value:function(t){var n=e(document.querySelectorAll(this.responseSelector)).find((function(e){return e.value===t}));return n?n.closest(".h-captcha"):null}},{key:"callback",value:function(t){document.dispatchEvent(new CustomEvent("hCaptchaSubmitted",{detail:{token:t}}));var e=this.getParams(),n=this.getWidgetByToken(t),r=n?n.dataset.force:null;("invisible"===e.size||"true"===r&&this.isValidated())&&this.submit()}},{key:"applyAutoTheme",value:function(t){if("auto"!==t.theme)return t;if(t.theme="light",!this.darkElement)return t;var e=this.darkElement.getAttribute("class");return(e=e||"").includes(this.darkClass)&&(t.theme="dark"),t}},{key:"render",value:function(e){this.observeDarkMode();var n,r,o=this.getParams();return"object"===t(o.theme)?null!==(n=null===(r=o)||void 0===r||null===(r=r.theme)||void 0===r||null===(r=r.component)||void 0===r||null===(r=r.checkbox)||void 0===r||null===(r=r.main)||void 0===r?void 0:r.fill)&&void 0!==n&&n&&(e.dataset.theme="custom"):o.theme=e.dataset.theme,o.size=e.dataset.size,o=this.applyAutoTheme(o),hcaptcha.render(e,o)}},{key:"addSyncedEventListener",value:function(t){if("loading"===document.readyState){if(this.addedDCLCallbacks.has(t))return;this.addedDCLCallbacks.add(t),window.addEventListener("DOMContentLoaded",t)}else t()}},{key:"bindEvents",value:function(){var t=this;"undefined"!=typeof hcaptcha&&(this.formSelector=wp.hooks.applyFilters("hcaptcha.formSelector","form, section.cwginstock-subscribe-form, div.sdm_download_item, .gform_editor, #nf-builder, .wpforms-captcha-preview"),this.submitButtonSelector=wp.hooks.applyFilters("hcaptcha.submitButtonSelector",'*[type="submit"]:not(.quform-default-submit), #check_config, button[type="button"].ff-btn, a.et_pb_newsletter_button.et_pb_button, .forminator-button-submit, .frm_button_submit, a.sdm_download, .uagb-forms-main-submit-button'),this.responseSelector='textarea[name="h-captcha-response"]',this.getForms().map((function(e){var n=e.querySelector(".h-captcha");if(null===n)return e;if(n.classList.contains("hcaptcha-widget-id"))return e;n.innerHTML="";var r=t.generateID(),o=e.querySelectorAll(t.submitButtonSelector)[0],a=t.render(n);return e.dataset.hCaptchaId=r,t.foundForms.push({hCaptchaId:r,submitButtonElement:o,widgetId:a}),"invisible"!==n.dataset.size&&"true"!==n.dataset.force?e:o?(o.addEventListener("click",t.validate,!0),e):e}),this))}},{key:"isAjaxSubmitButton",value:function(t){var e=t.getAttribute("type"),n="submit"!==(e=e?e.toLowerCase():"");return wp.hooks.applyFilters("hcaptcha.ajaxSubmitButton",n,t)}},{key:"submit",value:function(){var t=this.currentForm.formElement,e=this.currentForm.submitButtonElement;if("form"!==t.tagName.toLowerCase()||this.isAjaxSubmitButton(e))return e.removeEventListener("click",this.validate,!0),void e.click();t.requestSubmit?t.requestSubmit(e):t.submit()}}],a&&o(r.prototype,a),i&&o(r,i),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,a,i}();window.HCaptchaMainObject=window.HCaptchaMainObject||{};const u=i;function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function l(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,s(r.key),r)}}function s(t){var e=function(t,e){if("object"!=c(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!=c(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==c(e)?e:e+""}function d(t,e,n){return e=p(e),function(t,e){if(e&&("object"==c(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,h()?Reflect.construct(e,n||[],p(t).constructor):e.apply(t,n))}function f(t){var e="function"==typeof Map?new Map:void 0;return f=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(h())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var o=new(t.bind.apply(t,r));return n&&m(o,n.prototype),o}(t,arguments,p(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),m(n,t)},f(t)}function h(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(h=function(){return!!t})()}function m(t,e){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},m(t,e)}function p(t){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},p(t)}const v=function(t){function e(){return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),d(this,e,arguments)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&m(t,e)}(e,t),n=e,(r=[{key:"connectedCallback",value:function(){window.hCaptcha.addSyncedEventListener(window.hCaptchaBindEvents)}}])&&l(n.prototype,r),o&&l(n,o),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,o}(f(HTMLElement));var y=new u;window.hCaptcha=y,window.hCaptchaGetWidgetId=function(t){y.getWidgetId(t)},window.hCaptchaReset=function(t){y.reset(t)},window.hCaptchaBindEvents=function(){y.bindEvents()},window.hCaptchaSubmit=function(){y.submit()},window.hCaptchaOnLoad=function(){y.addSyncedEventListener((function(){document.dispatchEvent(new CustomEvent("hCaptchaBeforeBindEvents")),window.hCaptchaBindEvents(),document.dispatchEvent(new CustomEvent("hCaptchaLoaded"))}))},window.customElements.define("h-captcha",v),document.dispatchEvent(new CustomEvent("hCaptchaBeforeAPI"))})();
     1(()=>{"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t){return function(t){if(Array.isArray(t))return r(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||n(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}function r(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n<e;n++)r[n]=t[n];return r}function o(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,i(r.key),r)}}function i(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,n||"default");if("object"!=t(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}var a=function(){return r=function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.foundForms=[],this.params=null,this.observing=!1,this.darkElement=null,this.darkClass=null,this.callback=this.callback.bind(this),this.validate=this.validate.bind(this),this.addedDCLCallbacks=new Set},i=[{key:"generateID",value:function(){var t=function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)};return t()+"-"+t()+"-"+t()+"-"+t()}},{key:"getFoundFormById",value:function(t){var e;return null!==(e=this.foundForms.filter((function(e){return t===e.hCaptchaId}))[0])&&void 0!==e?e:null}},{key:"getWidgetId",value:function(t){var e,n,r;if(void 0===t)return"";var o=null!==(e=null===(n=t.closest(this.formSelector))||void 0===n||null===(n=n.dataset)||void 0===n?void 0:n.hCaptchaId)&&void 0!==e?e:"";if(!o)return"";var i=this.getFoundFormById(o);return null!==(r=null==i?void 0:i.widgetId)&&void 0!==r?r:""}},{key:"reset",value:function(t){var e=this.getWidgetId(t);e&&hcaptcha.reset(e)}},{key:"isSameOrDescendant",value:function(t,e){for(var n=e;n;){if(n===t)return!0;n=n.parentElement}return!1}},{key:"getCurrentForm",value:function(t){var e,n=t.currentTarget.closest(this.formSelector),r=this.getFoundFormById(null==n||null===(e=n.dataset)||void 0===e?void 0:e.hCaptchaId),o=null==r?void 0:r.submitButtonElement,i=null==r?void 0:r.widgetId;if(i&&this.isSameOrDescendant(o,t.target))return t.preventDefault(),t.stopPropagation(),{formElement:n,submitButtonElement:o,widgetId:i}}},{key:"validate",value:function(t){if(this.currentForm=this.getCurrentForm(t),this.currentForm){var e=this.currentForm,n=e.formElement,r=e.widgetId,o=n.querySelector(this.responseSelector),i=o?o.value:"";""===i?hcaptcha.execute(r):this.callback(i)}}},{key:"isValidated",value:function(){return void 0!==this.currentForm}},{key:"getForms",value:function(){return e(document.querySelectorAll(this.formSelector))}},{key:"getParams",value:function(){if(null!==this.params)return this.params;var t;try{var e,n;t=JSON.parse(wp.hooks.applyFilters("hcaptcha.params",null!==(e=null===(n=HCaptchaMainObject)||void 0===n?void 0:n.params)&&void 0!==e?e:""))}catch(e){t={}}return t.callback=this.callback,t}},{key:"setParams",value:function(t){this.params=t}},{key:"setDarkData",value:function(){var t={"twenty-twenty-one":{darkStyleId:"twenty-twenty-one-style-css",darkElement:document.body,darkClass:"is-dark-theme"},"wp-dark-mode":{darkStyleId:"wp-dark-mode-frontend-css",darkElement:document.documentElement,darkClass:"wp-dark-mode-active"},"droit-dark-mode":{darkStyleId:"dtdr-public-inline-css",darkElement:document.documentElement,darkClass:"drdt-dark-mode"}};t=wp.hooks.applyFilters("hcaptcha.darkData",t);for(var e=0,n=Object.values(t);e<n.length;e++){var r=n[e];if(document.getElementById(r.darkStyleId))return this.darkElement=r.darkElement,void(this.darkClass=r.darkClass)}}},{key:"observeDarkMode",value:function(){var t=this;this.observing||(this.observing=!0,"auto"!==this.getParams().theme)||(this.setDarkData(),this.darkElement&&this.darkClass&&new MutationObserver((function(e){var r,o=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=n(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,c=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){c=!0,a=t},f:function(){try{u||null==r.return||r.return()}finally{if(c)throw a}}}}(e);try{var i=function(){var e=r.value.oldValue,n=t.darkElement.getAttribute("class");e=e?e.split(" "):[],(n=n?n.split(" "):[]).filter((function(t){return!e.includes(t)})).concat(e.filter((function(t){return!n.includes(t)}))).includes(t.darkClass)&&t.bindEvents()};for(o.s();!(r=o.n()).done;)i()}catch(t){o.e(t)}finally{o.f()}})).observe(this.darkElement,{attributes:!0,attributeOldValue:!0}))}},{key:"getWidgetByToken",value:function(t){var n=e(document.querySelectorAll(this.responseSelector)).find((function(e){return e.value===t}));return n?n.closest(".h-captcha"):null}},{key:"callback",value:function(t){document.dispatchEvent(new CustomEvent("hCaptchaSubmitted",{detail:{token:t}}));var e=this.getParams(),n=this.getWidgetByToken(t),r=n?n.dataset.force:null;("invisible"===e.size||"true"===r&&this.isValidated())&&this.submit()}},{key:"applyAutoTheme",value:function(t){if("auto"!==t.theme)return t;if(t.theme="light",!this.darkElement)return t;var e=this.darkElement.getAttribute("class");return(e=e||"").includes(this.darkClass)&&(t.theme="dark"),t}},{key:"render",value:function(e){this.observeDarkMode();var n,r,o=this.getParams();return"object"===t(o.theme)?null!==(n=null===(r=o)||void 0===r||null===(r=r.theme)||void 0===r||null===(r=r.component)||void 0===r||null===(r=r.checkbox)||void 0===r||null===(r=r.main)||void 0===r?void 0:r.fill)&&void 0!==n&&n&&(e.dataset.theme="custom"):o.theme=e.dataset.theme,o.size=e.dataset.size,o=this.applyAutoTheme(o),hcaptcha.render(e,o)}},{key:"addSyncedEventListener",value:function(t){if("loading"===document.readyState){if(this.addedDCLCallbacks.has(t))return;this.addedDCLCallbacks.add(t),window.addEventListener("DOMContentLoaded",t)}else t()}},{key:"bindEvents",value:function(){var t=this;"undefined"!=typeof hcaptcha&&(this.formSelector=wp.hooks.applyFilters("hcaptcha.formSelector","form, section.cwginstock-subscribe-form, div.sdm_download_item, .gform_editor, #nf-builder, .wpforms-captcha-preview"),this.submitButtonSelector=wp.hooks.applyFilters("hcaptcha.submitButtonSelector",'*[type="submit"]:not(.quform-default-submit), #check_config, button[type="button"].ff-btn, a.et_pb_newsletter_button.et_pb_button, .forminator-button-submit, .frm_button_submit, a.sdm_download, .uagb-forms-main-submit-button'),this.responseSelector='textarea[name="h-captcha-response"]',this.getForms().map((function(e){var n=e.querySelector(".h-captcha");if(null===n)return e;if(n.classList.contains("hcaptcha-widget-id"))return e;n.innerHTML="";var r=t.generateID(),o=e.querySelectorAll(t.submitButtonSelector)[0],i=t.render(n);if(e.dataset.hCaptchaId=r,t.foundForms.push({hCaptchaId:r,submitButtonElement:o,widgetId:i}),!o)return e;var a=n.dataset;return"invisible"!==a.size&&"true"!==a.force||o.addEventListener("click",t.validate,!0),e}),this))}},{key:"isAjaxSubmitButton",value:function(t){var e=t.getAttribute("type"),n="submit"!==(e=e?e.toLowerCase():"");return wp.hooks.applyFilters("hcaptcha.ajaxSubmitButton",n,t)}},{key:"submit",value:function(){if(this.currentForm){var t=this.currentForm,e=t.formElement,n=t.submitButtonElement;if("form"!==e.tagName.toLowerCase()||this.isAjaxSubmitButton(n))return n.removeEventListener("click",this.validate,!0),void n.click();e.requestSubmit?e.requestSubmit(n):e.submit()}}}],i&&o(r.prototype,i),a&&o(r,a),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,i,a}();window.HCaptchaMainObject=window.HCaptchaMainObject||{};const u=a;function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function l(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,s(r.key),r)}}function s(t){var e=function(t,e){if("object"!=c(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!=c(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==c(e)?e:e+""}function d(t,e,n){return e=p(e),function(t,e){if(e&&("object"==c(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,h()?Reflect.construct(e,n||[],p(t).constructor):e.apply(t,n))}function f(t){var e="function"==typeof Map?new Map:void 0;return f=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(h())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var o=new(t.bind.apply(t,r));return n&&m(o,n.prototype),o}(t,arguments,p(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),m(n,t)},f(t)}function h(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(h=function(){return!!t})()}function m(t,e){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},m(t,e)}function p(t){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},p(t)}const v=function(t){function e(){return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),d(this,e,arguments)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&m(t,e)}(e,t),n=e,(r=[{key:"connectedCallback",value:function(){window.hCaptcha.addSyncedEventListener(window.hCaptchaBindEvents)}}])&&l(n.prototype,r),o&&l(n,o),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,o}(f(HTMLElement));var y=new u;window.hCaptcha=y,window.hCaptchaGetWidgetId=function(t){y.getWidgetId(t)},window.hCaptchaReset=function(t){y.reset(t)},window.hCaptchaBindEvents=function(){y.bindEvents()},window.hCaptchaSubmit=function(){y.submit()},window.hCaptchaOnLoad=function(){y.addSyncedEventListener((function(){document.dispatchEvent(new CustomEvent("hCaptchaBeforeBindEvents")),window.hCaptchaBindEvents(),document.dispatchEvent(new CustomEvent("hCaptchaLoaded"))}))},window.customElements.define("h-captcha",v),document.dispatchEvent(new CustomEvent("hCaptchaBeforeAPI"))})();
  • hcaptcha-for-forms-and-more/trunk/assets/js/events.js

    r3095958 r3233179  
    1 /* global Chart, HCaptchaEventsObject */
     1/* global jQuery, Chart, hCaptchaSettingsBase, HCaptchaListPageBaseObject, HCaptchaEventsObject */
    22
    33/**
     4 * @param HCaptchaEventsObject.ajaxUrl
     5 * @param HCaptchaEventsObject.bulkAction
     6 * @param HCaptchaEventsObject.bulkNonce
    47 * @param HCaptchaEventsObject.failed
    58 * @param HCaptchaEventsObject.failedLabel
     
    811 * @param HCaptchaEventsObject.unit
    912 */
    10 document.addEventListener( 'DOMContentLoaded', function() {
    11     const ctx = document.getElementById( 'eventsChart' );
    12     const aspectRatio = window.innerWidth > 600 ? 3 : 2;
    1313
    14     new Chart( ctx, {
    15         type: 'bar',
    16         data: {
    17             datasets: [
    18                 {
    19                     label: HCaptchaEventsObject.succeedLabel,
    20                     data: HCaptchaEventsObject.succeed,
    21                     borderWidth: 1,
    22                 },
    23                 {
    24                     label: HCaptchaEventsObject.failedLabel,
    25                     data: HCaptchaEventsObject.failed,
    26                     borderWidth: 1,
    27                 },
    28             ],
    29         },
    30         options: {
    31             responsive: true,
    32             maintainAspectRatio: true,
    33             aspectRatio,
    34             scales: {
    35                 x: {
    36                     type: 'time',
    37                     time: {
    38                         displayFormats: {
    39                             millisecond: 'HH:mm:ss',
    40                             second: 'HH:mm:ss',
    41                             minute: 'HH:mm',
    42                             hour: 'HH:mm',
    43                             day: 'dd.MM.yyyy',
    44                             week: 'dd.MM.yyyy',
    45                             month: 'dd.MM.yyyy',
    46                             quarter: 'dd.MM.yyyy',
    47                             year: 'dd.MM.yyyy',
     14/**
     15 * Events page logic.
     16 *
     17 * @param {Object} $ jQuery instance.
     18 */
     19const events = function( $ ) {
     20    function initChart() {
     21        const ctx = document.getElementById( 'eventsChart' );
     22        const aspectRatio = window.innerWidth > 600 ? 3 : 2;
     23
     24        new Chart( ctx, {
     25            type: 'bar',
     26            data: {
     27                datasets: [
     28                    {
     29                        label: HCaptchaEventsObject.succeedLabel,
     30                        data: HCaptchaEventsObject.succeed,
     31                        borderWidth: 1,
     32                    },
     33                    {
     34                        label: HCaptchaEventsObject.failedLabel,
     35                        data: HCaptchaEventsObject.failed,
     36                        borderWidth: 1,
     37                    },
     38                ],
     39            },
     40            options: {
     41                responsive: true,
     42                maintainAspectRatio: true,
     43                aspectRatio,
     44                scales: {
     45                    x: {
     46                        type: 'time',
     47                        time: {
     48                            displayFormats: {
     49                                millisecond: 'HH:mm:ss',
     50                                second: 'HH:mm:ss',
     51                                minute: 'HH:mm',
     52                                hour: 'HH:mm',
     53                                day: 'dd.MM.yyyy',
     54                                week: 'dd.MM.yyyy',
     55                                month: 'dd.MM.yyyy',
     56                                quarter: 'dd.MM.yyyy',
     57                                year: 'dd.MM.yyyy',
     58                            },
     59                            tooltipFormat: 'dd.MM.yyyy HH:mm',
     60                            unit: HCaptchaEventsObject.unit,
    4861                        },
    49                         tooltipFormat: 'dd.MM.yyyy HH:mm',
    50                         unit: HCaptchaEventsObject.unit,
    5162                    },
    52                 },
    53                 y: {
    54                     beginAtZero: true,
    55                     ticks: {
    56                         precision: 0,
     63                    y: {
     64                        beginAtZero: true,
     65                        ticks: {
     66                            precision: 0,
     67                        },
    5768                    },
    5869                },
    5970            },
    60         },
    61     } );
    62 } );
     71        } );
     72    }
     73
     74    function handleBulkAction( event ) {
     75        event.preventDefault();
     76
     77        const form = event.target.closest( 'form' );
     78        const formData = new FormData( form );
     79
     80        const bulk = formData.get( 'action' );
     81
     82        if ( bulk === '-1' ) {
     83            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noAction );
     84
     85            return;
     86        }
     87
     88        const ids = formData.getAll( 'bulk-checkbox[]' );
     89
     90        if ( ! ids.length ) {
     91            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noItems );
     92
     93            return;
     94        }
     95
     96        const data = {
     97            action: HCaptchaEventsObject.bulkAction,
     98            nonce: HCaptchaEventsObject.bulkNonce,
     99            bulk,
     100            ids: JSON.stringify( ids ),
     101        };
     102
     103        $.post( {
     104            url: HCaptchaEventsObject.ajaxUrl,
     105            data,
     106            beforeSend: () => hCaptchaSettingsBase.showSuccessMessage( HCaptchaListPageBaseObject.DoingBulk ),
     107        } )
     108            .done( function( response ) {
     109                if ( ! response.success ) {
     110                    hCaptchaSettingsBase.showErrorMessage( response.data );
     111
     112                    return;
     113                }
     114
     115                window.location.reload();
     116            } )
     117            .fail(
     118                function( response ) {
     119                    hCaptchaSettingsBase.showErrorMessage( response.statusText );
     120                },
     121            );
     122    }
     123
     124    initChart();
     125    document.getElementById( 'doaction' ).addEventListener( 'click', handleBulkAction );
     126};
     127
     128window.hCaptchaForms = events;
     129
     130jQuery( document ).ready( events );
  • hcaptcha-for-forms-and-more/trunk/assets/js/events.min.js

    r3095958 r3233179  
    1 document.addEventListener("DOMContentLoaded",(function(){var e=document.getElementById("eventsChart"),t=window.innerWidth>600?3:2;new Chart(e,{type:"bar",data:{datasets:[{label:HCaptchaEventsObject.succeedLabel,data:HCaptchaEventsObject.succeed,borderWidth:1},{label:HCaptchaEventsObject.failedLabel,data:HCaptchaEventsObject.failed,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:t,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaEventsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}})}));
     1(()=>{var e=function(e){var t,a;t=document.getElementById("eventsChart"),a=window.innerWidth>600?3:2,new Chart(t,{type:"bar",data:{datasets:[{label:HCaptchaEventsObject.succeedLabel,data:HCaptchaEventsObject.succeed,borderWidth:1},{label:HCaptchaEventsObject.failedLabel,data:HCaptchaEventsObject.failed,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:a,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaEventsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}}),document.getElementById("doaction").addEventListener("click",(function(t){t.preventDefault();var a=t.target.closest("form"),s=new FormData(a),n=s.get("action");if("-1"!==n){var c=s.getAll("bulk-checkbox[]");if(c.length){var o={action:HCaptchaEventsObject.bulkAction,nonce:HCaptchaEventsObject.bulkNonce,bulk:n,ids:JSON.stringify(c)};e.post({url:HCaptchaEventsObject.ajaxUrl,data:o,beforeSend:function(){return hCaptchaSettingsBase.showSuccessMessage(HCaptchaListPageBaseObject.DoingBulk)}}).done((function(e){e.success?window.location.reload():hCaptchaSettingsBase.showErrorMessage(e.data)})).fail((function(e){hCaptchaSettingsBase.showErrorMessage(e.statusText)}))}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noItems)}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noAction)}))};window.hCaptchaForms=e,jQuery(document).ready(e)})();
  • hcaptcha-for-forms-and-more/trunk/assets/js/forms.js

    r3095958 r3233179  
    1 /* global Chart, HCaptchaFormsObject */
     1/* global jQuery, Chart, hCaptchaSettingsBase, HCaptchaListPageBaseObject, HCaptchaFormsObject */
    22
    33/**
     4 * @param HCaptchaFormsObject.ajaxUrl
     5 * @param HCaptchaFormsObject.bulkAction
     6 * @param HCaptchaFormsObject.bulkNonce
    47 * @param HCaptchaFormsObject.served
    58 * @param HCaptchaFormsObject.servedLabel
    69 * @param HCaptchaFormsObject.unit
     10 * @param HCaptchaListPageBaseObject.noAction
     11 * @param HCaptchaListPageBaseObject.noItems
     12 * @param HCaptchaListPageBaseObject.DoingBulk
    713 */
    8 document.addEventListener( 'DOMContentLoaded', function() {
    9     const ctx = document.getElementById( 'formsChart' );
    10     const aspectRatio = window.innerWidth > 600 ? 3 : 2;
    1114
    12     new Chart( ctx, {
    13         type: 'bar',
    14         data: {
    15             datasets: [
    16                 {
    17                     label: HCaptchaFormsObject.servedLabel,
    18                     backgroundColor: 'rgba(2,101,147,0.5)',
    19                     data: HCaptchaFormsObject.served,
    20                     borderWidth: 1,
    21                 },
    22             ],
    23         },
    24         options: {
    25             responsive: true,
    26             maintainAspectRatio: true,
    27             aspectRatio,
    28             scales: {
    29                 x: {
    30                     type: 'time',
    31                     time: {
    32                         displayFormats: {
    33                             millisecond: 'HH:mm:ss',
    34                             second: 'HH:mm:ss',
    35                             minute: 'HH:mm',
    36                             hour: 'HH:mm',
    37                             day: 'dd.MM.yyyy',
    38                             week: 'dd.MM.yyyy',
    39                             month: 'dd.MM.yyyy',
    40                             quarter: 'dd.MM.yyyy',
    41                             year: 'dd.MM.yyyy',
     15/**
     16 * Forms page logic.
     17 *
     18 * @param {Object} $ jQuery instance.
     19 */
     20const forms = function( $ ) {
     21    function initChart() {
     22        const ctx = document.getElementById( 'formsChart' );
     23        const aspectRatio = window.innerWidth > 600 ? 3 : 2;
     24
     25        new Chart( ctx, {
     26            type: 'bar',
     27            data: {
     28                datasets: [
     29                    {
     30                        label: HCaptchaFormsObject.servedLabel,
     31                        backgroundColor: 'rgba(2,101,147,0.5)',
     32                        data: HCaptchaFormsObject.served,
     33                        borderWidth: 1,
     34                    },
     35                ],
     36            },
     37            options: {
     38                responsive: true,
     39                maintainAspectRatio: true,
     40                aspectRatio,
     41                scales: {
     42                    x: {
     43                        type: 'time',
     44                        time: {
     45                            displayFormats: {
     46                                millisecond: 'HH:mm:ss',
     47                                second: 'HH:mm:ss',
     48                                minute: 'HH:mm',
     49                                hour: 'HH:mm',
     50                                day: 'dd.MM.yyyy',
     51                                week: 'dd.MM.yyyy',
     52                                month: 'dd.MM.yyyy',
     53                                quarter: 'dd.MM.yyyy',
     54                                year: 'dd.MM.yyyy',
     55                            },
     56                            tooltipFormat: 'dd.MM.yyyy HH:mm',
     57                            unit: HCaptchaFormsObject.unit,
    4258                        },
    43                         tooltipFormat: 'dd.MM.yyyy HH:mm',
    44                         unit: HCaptchaFormsObject.unit,
    4559                    },
    46                 },
    47                 y: {
    48                     beginAtZero: true,
    49                     ticks: {
    50                         precision: 0,
     60                    y: {
     61                        beginAtZero: true,
     62                        ticks: {
     63                            precision: 0,
     64                        },
    5165                    },
    5266                },
    5367            },
    54         },
    55     } );
    56 } );
     68        } );
     69    }
     70
     71    function handleBulkAction( event ) {
     72        event.preventDefault();
     73
     74        const form = event.target.closest( 'form' );
     75        const formData = new FormData( form );
     76
     77        const bulk = formData.get( 'action' );
     78
     79        if ( bulk === '-1' ) {
     80            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noAction );
     81
     82            return;
     83        }
     84
     85        const ids = formData.getAll( 'bulk-checkbox[]' ).map(
     86            ( id ) => {
     87                const row = form.querySelector( `input[name="bulk-checkbox[]"][value="${ id }"]` ).closest( 'tr' );
     88                const source = row.querySelector( 'td.name .hcaptcha-excerpt' ).dataset.source;
     89                const formId = row.querySelector( 'td.form_id' ).textContent;
     90
     91                return { source, formId };
     92            },
     93        );
     94
     95        if ( ! ids.length ) {
     96            hCaptchaSettingsBase.showErrorMessage( HCaptchaListPageBaseObject.noItems );
     97
     98            return;
     99        }
     100
     101        const data = {
     102            action: HCaptchaFormsObject.bulkAction,
     103            nonce: HCaptchaFormsObject.bulkNonce,
     104            bulk,
     105            ids: JSON.stringify( ids ),
     106        };
     107
     108        $.post( {
     109            url: HCaptchaFormsObject.ajaxUrl,
     110            data,
     111            beforeSend: () => hCaptchaSettingsBase.showSuccessMessage( HCaptchaListPageBaseObject.DoingBulk ),
     112        } )
     113            .done( function( response ) {
     114                if ( ! response.success ) {
     115                    hCaptchaSettingsBase.showErrorMessage( response.data );
     116
     117                    return;
     118                }
     119
     120                window.location.reload();
     121            } )
     122            .fail(
     123                function( response ) {
     124                    hCaptchaSettingsBase.showErrorMessage( response.statusText );
     125                },
     126            );
     127    }
     128
     129    initChart();
     130    document.getElementById( 'doaction' ).addEventListener( 'click', handleBulkAction );
     131};
     132
     133window.hCaptchaForms = forms;
     134
     135jQuery( document ).ready( forms );
  • hcaptcha-for-forms-and-more/trunk/assets/js/forms.min.js

    r3095958 r3233179  
    1 document.addEventListener("DOMContentLoaded",(function(){var t=document.getElementById("formsChart"),e=window.innerWidth>600?3:2;new Chart(t,{type:"bar",data:{datasets:[{label:HCaptchaFormsObject.servedLabel,backgroundColor:"rgba(2,101,147,0.5)",data:HCaptchaFormsObject.served,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:e,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaFormsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}})}));
     1(()=>{var e=function(e){var t,a;t=document.getElementById("formsChart"),a=window.innerWidth>600?3:2,new Chart(t,{type:"bar",data:{datasets:[{label:HCaptchaFormsObject.servedLabel,backgroundColor:"rgba(2,101,147,0.5)",data:HCaptchaFormsObject.served,borderWidth:1}]},options:{responsive:!0,maintainAspectRatio:!0,aspectRatio:a,scales:{x:{type:"time",time:{displayFormats:{millisecond:"HH:mm:ss",second:"HH:mm:ss",minute:"HH:mm",hour:"HH:mm",day:"dd.MM.yyyy",week:"dd.MM.yyyy",month:"dd.MM.yyyy",quarter:"dd.MM.yyyy",year:"dd.MM.yyyy"},tooltipFormat:"dd.MM.yyyy HH:mm",unit:HCaptchaFormsObject.unit}},y:{beginAtZero:!0,ticks:{precision:0}}}}}),document.getElementById("doaction").addEventListener("click",(function(t){t.preventDefault();var a=t.target.closest("form"),s=new FormData(a),o=s.get("action");if("-1"!==o){var r=s.getAll("bulk-checkbox[]").map((function(e){var t=a.querySelector('input[name="bulk-checkbox[]"][value="'.concat(e,'"]')).closest("tr");return{source:t.querySelector("td.name .hcaptcha-excerpt").dataset.source,formId:t.querySelector("td.form_id").textContent}}));if(r.length){var c={action:HCaptchaFormsObject.bulkAction,nonce:HCaptchaFormsObject.bulkNonce,bulk:o,ids:JSON.stringify(r)};e.post({url:HCaptchaFormsObject.ajaxUrl,data:c,beforeSend:function(){return hCaptchaSettingsBase.showSuccessMessage(HCaptchaListPageBaseObject.DoingBulk)}}).done((function(e){e.success?window.location.reload():hCaptchaSettingsBase.showErrorMessage(e.data)})).fail((function(e){hCaptchaSettingsBase.showErrorMessage(e.statusText)}))}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noItems)}else hCaptchaSettingsBase.showErrorMessage(HCaptchaListPageBaseObject.noAction)}))};window.hCaptchaForms=e,jQuery(document).ready(e)})();
  • hcaptcha-for-forms-and-more/trunk/assets/js/general.js

    r3200161 r3233179  
    1 /* global jQuery, hCaptcha, HCaptchaGeneralObject, kaggDialog */
     1/* global jQuery, hCaptcha, hCaptchaSettingsBase, HCaptchaGeneralObject, kaggDialog */
    22
    33/**
     
    154154    function clearMessage() {
    155155        $message.remove();
    156         // Concat below to avoid inspection message.
     156        // Concat below to avoid an inspection message.
    157157        $( '<div id="hcaptcha-message">' + '</div>' ).insertAfter( headerBarSelector );
    158158        $message = $( msgSelector );
     
    181181        $( document ).trigger( 'wp-updates-notice-added' );
    182182
    183         const $wpwrap = $( '#wpwrap' );
    184         const top = $wpwrap.position().top;
    185 
    186183        $( 'html, body' ).animate(
    187184            {
    188                 scrollTop: $message.offset().top - top - parseInt( $message.css( 'margin-bottom' ) ),
     185                scrollTop: $message.offset().top - hCaptchaSettingsBase.getStickyHeight(),
    189186            },
    190187            1000
  • hcaptcha-for-forms-and-more/trunk/assets/js/general.min.js

    r3200161 r3233179  
    1 (()=>{var t={};function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var a=function(a){var n="#hcaptcha-message",c=a(n),o=a("form.hcaptcha-general"),r=a('[name="hcaptcha_settings[site_key]"]'),i=a('[name="hcaptcha_settings[secret_key]"]'),s=a("#hcaptcha-options .h-captcha"),h=a("#check_config"),l=a("#reset_notifications"),p=a('[name="hcaptcha_settings[theme]"]'),d=a('[name="hcaptcha_settings[size]"]'),u=a('[name="hcaptcha_settings[language]"]'),f=a('[name="hcaptcha_settings[mode]"]'),m=a('[name="hcaptcha_settings[custom_themes][]"]'),v=a(".hcaptcha-general-custom-prop select"),g=a(".hcaptcha-general-custom-value input"),b=a('[name="hcaptcha_settings[config_params]"]'),y=a(".hcaptcha-section-enterprise + table input"),C=a('[name="hcaptcha_settings[recaptcha_compat_off][]"]'),j=o.find("#submit"),O={},k=r.val(),H=i.val(),w=A();O[HCaptchaGeneralObject.modeLive]=HCaptchaGeneralObject.siteKey,O[HCaptchaGeneralObject.modeTestPublisher]=HCaptchaGeneralObject.modeTestPublisherSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseSafeEndUser]=HCaptchaGeneralObject.modeTestEnterpriseSafeEndUserSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseBotDetected]=HCaptchaGeneralObject.modeTestEnterpriseBotDetectedSiteKey;var G=!1,_=!1,S=[];function T(t){var e={};return t.each((function(){var t=a(this),n=t.attr("name").replace(/hcaptcha_settings\[(.+)]/,"$1");e[n]=t.val()})),e}function A(){return T(y)}function x(){c.remove(),a('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),c=a(n)}function E(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(t=void 0===t?"":String(t),t=(t+="\n"+function(){for(var t=["recaptchacompat disabled","Missing sitekey - https://docs.hcaptcha.com/configuration#javascript-api"],e=[],a=0;a<S.length;a++){for(var n=S[a],c=n[0],o=n[1],r=Object.keys(o),i=[],s=0;s<r.length;s++){var h=o[s];"string"==typeof h&&-1===t.indexOf(h)&&i.push([c,h].join(" "))}e.push(i.join("\n"))}return S=[],e.join("\n")}()).trim()){c.removeClass(),c.addClass(e+" notice is-dismissible");var n=t.split("\n").map((function(t){return"<p>".concat(t,"</p>")}));c.html(n.join("")),a(document).trigger("wp-updates-notice-added");var o=a("#wpwrap").position().top;a("html, body").animate({scrollTop:c.offset().top-o-parseInt(c.css("margin-bottom"))},1e3)}}function N(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-success")}function K(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-error")}function L(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=Object.assign({},hCaptcha.getParams(),t),n=m.prop("checked"),c="live"===f.val();for(var o in n&&c?s.attr("data-theme","custom"):s.attr("data-theme",p.val()),n&&"object"===e(t.theme)||!n&&"object"!==e(t.theme)?a.theme=t.theme:a.theme=hCaptcha.getParams().theme,hCaptcha.setParams(a),s.html(""),t)"object"!==e(t[o])&&s.attr("data-".concat(o),"".concat(t[o]));hCaptcha.bindEvents()}function P(t,a){var n=function(t){return t&&"object"===e(t)};return n(t)&&n(a)?(Object.keys(a).forEach((function(e){var c=t[e],o=a[e];Array.isArray(c)&&Array.isArray(o)?t[e]=c.concat(o):n(c)&&n(o)?t[e]=P(Object.assign({},c),o):t[e]=o})),t):a}function U(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";for(var n in t){var c=a?"".concat(a,"--").concat(n):n;if("object"===e(t[n])&&null!==t[n])U(t[n],c);else{var o=t[n],r=c.replace(/theme--/g,""),i="".concat(r,"=").concat(o),s=v.find('option[value*="'.concat(r,'="]'));1===s.length&&(s.attr("value",i),s.is(":selected")&&g.val(o))}}}function B(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=b.val().trim();a=a||null;try{t=JSON.parse(a)}catch(t){return b.css("background-color","#ffabaf"),j.attr("disabled",!0),void K("Bad JSON!")}t=P(t,e),b.val(JSON.stringify(t,null,2)),U(t),m.prop("checked")||(t={sitekey:r.val(),theme:p.val(),size:d.val(),hl:u.val()}),L(t)}function J(){r.val()===k&&i.val()===H?(G=!1,x(),j.attr("disabled",!1)):G||(G=!0,K(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))}function D(t){return t=t.replace(/(http|https):\/\//,""),"https://"+new URL("https://"+t).host}!function(){S=[];var t=console.log,e=console.warn,a=console.info,n=console.error,c=console.clear;console.log=function(e){S.push(["Console log:",arguments]),t.apply(console,arguments)},console.warn=function(t){S.push(["Console warn:",arguments]),e.apply(console,arguments)},console.info=function(t){S.push(["Console info:",arguments]),a.apply(console,arguments)},console.error=function(t){S.push(["Console error:",arguments]),n.apply(console,arguments)},console.clear=function(){S=[],c()}}(),document.addEventListener("hCaptchaLoaded",(function(){K()})),h.on("click",(function(t){t.preventDefault(),""!==a('.hcaptcha-general-sample-hcaptcha textarea[name="h-captcha-response"]').val()?function(){x(),j.attr("disabled",!0);var t={action:HCaptchaGeneralObject.checkConfigAction,nonce:HCaptchaGeneralObject.checkConfigNonce,mode:f.val(),siteKey:r.val(),secretKey:i.val(),"h-captcha-response":a('textarea[name="h-captcha-response"]').val(),"hcaptcha-widget-id":a('input[name="hcaptcha-widget-id"]').val()};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:t,beforeSend:function(){return N(HCaptchaGeneralObject.checkingConfigMsg)}}).done((function(t){t.success?(k=r.val(),H=i.val(),w=T(y),_=!1,N(t.data),j.attr("disabled",!1)):K(t.data)})).fail((function(t){K(t.statusText)})).always((function(){L()}))}():kaggDialog.confirm({title:HCaptchaGeneralObject.completeHCaptchaTitle,content:HCaptchaGeneralObject.completeHCaptchaContent,type:"info",buttons:{ok:{text:HCaptchaGeneralObject.OKBtnText}},onAction:function(){return window.hCaptchaReset(document.querySelector(".hcaptcha-general-sample-hcaptcha"))}})})),r.on("change",(function(t){L({sitekey:a(t.target).val()}),J()})),i.on("change",(function(){J()})),p.on("change",(function(t){L({theme:a(t.target).val()})})),d.on("change",(function(t){var e=a("#hcaptcha-invisible-notice"),n=a(t.target).val();"invisible"===n?e.show():e.hide(),L({size:n})})),u.on("change",(function(t){L({hl:a(t.target).val()})})),f.on("change",(function(t){var e=a(t.target).val();O.hasOwnProperty(e)&&(e===HCaptchaGeneralObject.modeLive?(r.attr("disabled",!1),i.attr("disabled",!1)):(r.attr("disabled",!0),i.attr("disabled",!0)),L({sitekey:O[e]}))})),m.on("change",(function(){B()})),b.on("blur",(function(){B()})),b.on("focus",(function(){b.css("background-color","unset"),j.attr("disabled",!1)})),y.on("change",(function(){!function(){var e={onload:"hCaptchaOnLoad",render:"explicit"};C.prop("checked")&&(e.recaptchacompat="off"),m.prop("checked")&&(e.custom="true");var a={asset_host:"assethost",endpoint:"endpoint",host:"host",image_host:"imghost",report_api:"reportapi",sentry:"sentry"},n=A();for(var c in a){var o=n[c].trim();o&&(e[a[c]]=encodeURIComponent(D(o)))}var r=n.api_host.trim();r=D(r=r||"js.hcaptcha.com")+"/1/api.js";var i=new URL(r);for(var h in e)i.searchParams.append(h,e[h]);document.getElementById("hcaptcha-api").remove(),delete t.g.hcaptcha,s.html("");var l=document.getElementsByTagName("head")[0],p=document.createElement("script");p.type="text/javascript",p.id="hcaptcha-api",p.src=i.href,l.appendChild(p)}(),JSON.stringify(A())===JSON.stringify(w)?(_=!1,x(),j.attr("disabled",!1)):_||(_=!0,K(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))})),a(".hcaptcha-general h3").on("click",(function(t){var e=a(t.currentTarget);e.toggleClass("closed");var n={action:HCaptchaGeneralObject.toggleSectionAction,nonce:HCaptchaGeneralObject.toggleSectionNonce,section:e.attr("class").replaceAll(/(hcaptcha-section-|closed)/g,"").trim(),status:!e.hasClass("closed")};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:n}).done((function(t){t.success||K(t.data)})).fail((function(t){K(t.statusText)}))})),h.removeAttr("name"),l.removeAttr("name"),v.removeAttr("name"),g.removeAttr("name"),v.find("option").each((function(){var t=a(this);t.val().split("=")[1]||t.attr("disabled",!0)})),g.val(""),v.on("change",(function(){var t=a(this).find("option:selected").val().split("="),e=t[0],n=t[1];"palette--mode"===e?(g.attr("type","text"),g.val(n)):(g.val(n),g.attr("type","color"))})),g.on("change",(function(t){var e=a(t.target).val(),n=v.find("option:selected"),c=n.val().split("="),o=c[0],r=e;n.val(o+"="+e),B(r=(o="theme--"+c[0]).split("--").reverse().reduce((function(t,e){var a={};return a[e]=t,a}),r))}))};window.hCaptchaGeneral=a,jQuery(document).ready(a)})();
     1(()=>{var t={};function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var a=function(a){var n="#hcaptcha-message",c=a(n),o=a("form.hcaptcha-general"),r=a('[name="hcaptcha_settings[site_key]"]'),i=a('[name="hcaptcha_settings[secret_key]"]'),s=a("#hcaptcha-options .h-captcha"),h=a("#check_config"),l=a("#reset_notifications"),p=a('[name="hcaptcha_settings[theme]"]'),d=a('[name="hcaptcha_settings[size]"]'),u=a('[name="hcaptcha_settings[language]"]'),f=a('[name="hcaptcha_settings[mode]"]'),m=a('[name="hcaptcha_settings[custom_themes][]"]'),v=a(".hcaptcha-general-custom-prop select"),g=a(".hcaptcha-general-custom-value input"),b=a('[name="hcaptcha_settings[config_params]"]'),y=a(".hcaptcha-section-enterprise + table input"),C=a('[name="hcaptcha_settings[recaptcha_compat_off][]"]'),j=o.find("#submit"),O={},k=r.val(),H=i.val(),G=A();O[HCaptchaGeneralObject.modeLive]=HCaptchaGeneralObject.siteKey,O[HCaptchaGeneralObject.modeTestPublisher]=HCaptchaGeneralObject.modeTestPublisherSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseSafeEndUser]=HCaptchaGeneralObject.modeTestEnterpriseSafeEndUserSiteKey,O[HCaptchaGeneralObject.modeTestEnterpriseBotDetected]=HCaptchaGeneralObject.modeTestEnterpriseBotDetectedSiteKey;var S=!1,_=!1,w=[];function T(t){var e={};return t.each((function(){var t=a(this),n=t.attr("name").replace(/hcaptcha_settings\[(.+)]/,"$1");e[n]=t.val()})),e}function A(){return T(y)}function x(){c.remove(),a('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),c=a(n)}function E(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(t=void 0===t?"":String(t),t=(t+="\n"+function(){for(var t=["recaptchacompat disabled","Missing sitekey - https://docs.hcaptcha.com/configuration#javascript-api"],e=[],a=0;a<w.length;a++){for(var n=w[a],c=n[0],o=n[1],r=Object.keys(o),i=[],s=0;s<r.length;s++){var h=o[s];"string"==typeof h&&-1===t.indexOf(h)&&i.push([c,h].join(" "))}e.push(i.join("\n"))}return w=[],e.join("\n")}()).trim()){c.removeClass(),c.addClass(e+" notice is-dismissible");var n=t.split("\n").map((function(t){return"<p>".concat(t,"</p>")}));c.html(n.join("")),a(document).trigger("wp-updates-notice-added"),a("html, body").animate({scrollTop:c.offset().top-hCaptchaSettingsBase.getStickyHeight()},1e3)}}function N(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-success")}function B(){E(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"","notice-error")}function K(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=Object.assign({},hCaptcha.getParams(),t),n=m.prop("checked"),c="live"===f.val();for(var o in n&&c?s.attr("data-theme","custom"):s.attr("data-theme",p.val()),n&&"object"===e(t.theme)||!n&&"object"!==e(t.theme)?a.theme=t.theme:a.theme=hCaptcha.getParams().theme,hCaptcha.setParams(a),s.html(""),t)"object"!==e(t[o])&&s.attr("data-".concat(o),"".concat(t[o]));hCaptcha.bindEvents()}function L(t,a){var n=function(t){return t&&"object"===e(t)};return n(t)&&n(a)?(Object.keys(a).forEach((function(e){var c=t[e],o=a[e];Array.isArray(c)&&Array.isArray(o)?t[e]=c.concat(o):n(c)&&n(o)?t[e]=L(Object.assign({},c),o):t[e]=o})),t):a}function P(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";for(var n in t){var c=a?"".concat(a,"--").concat(n):n;if("object"===e(t[n])&&null!==t[n])P(t[n],c);else{var o=t[n],r=c.replace(/theme--/g,""),i="".concat(r,"=").concat(o),s=v.find('option[value*="'.concat(r,'="]'));1===s.length&&(s.attr("value",i),s.is(":selected")&&g.val(o))}}}function U(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=b.val().trim();a=a||null;try{t=JSON.parse(a)}catch(t){return b.css("background-color","#ffabaf"),j.attr("disabled",!0),void B("Bad JSON!")}t=L(t,e),b.val(JSON.stringify(t,null,2)),P(t),m.prop("checked")||(t={sitekey:r.val(),theme:p.val(),size:d.val(),hl:u.val()}),K(t)}function J(){r.val()===k&&i.val()===H?(S=!1,x(),j.attr("disabled",!1)):S||(S=!0,B(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))}function D(t){return t=t.replace(/(http|https):\/\//,""),"https://"+new URL("https://"+t).host}!function(){w=[];var t=console.log,e=console.warn,a=console.info,n=console.error,c=console.clear;console.log=function(e){w.push(["Console log:",arguments]),t.apply(console,arguments)},console.warn=function(t){w.push(["Console warn:",arguments]),e.apply(console,arguments)},console.info=function(t){w.push(["Console info:",arguments]),a.apply(console,arguments)},console.error=function(t){w.push(["Console error:",arguments]),n.apply(console,arguments)},console.clear=function(){w=[],c()}}(),document.addEventListener("hCaptchaLoaded",(function(){B()})),h.on("click",(function(t){t.preventDefault(),""!==a('.hcaptcha-general-sample-hcaptcha textarea[name="h-captcha-response"]').val()?function(){x(),j.attr("disabled",!0);var t={action:HCaptchaGeneralObject.checkConfigAction,nonce:HCaptchaGeneralObject.checkConfigNonce,mode:f.val(),siteKey:r.val(),secretKey:i.val(),"h-captcha-response":a('textarea[name="h-captcha-response"]').val(),"hcaptcha-widget-id":a('input[name="hcaptcha-widget-id"]').val()};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:t,beforeSend:function(){return N(HCaptchaGeneralObject.checkingConfigMsg)}}).done((function(t){t.success?(k=r.val(),H=i.val(),G=T(y),_=!1,N(t.data),j.attr("disabled",!1)):B(t.data)})).fail((function(t){B(t.statusText)})).always((function(){K()}))}():kaggDialog.confirm({title:HCaptchaGeneralObject.completeHCaptchaTitle,content:HCaptchaGeneralObject.completeHCaptchaContent,type:"info",buttons:{ok:{text:HCaptchaGeneralObject.OKBtnText}},onAction:function(){return window.hCaptchaReset(document.querySelector(".hcaptcha-general-sample-hcaptcha"))}})})),r.on("change",(function(t){K({sitekey:a(t.target).val()}),J()})),i.on("change",(function(){J()})),p.on("change",(function(t){K({theme:a(t.target).val()})})),d.on("change",(function(t){var e=a("#hcaptcha-invisible-notice"),n=a(t.target).val();"invisible"===n?e.show():e.hide(),K({size:n})})),u.on("change",(function(t){K({hl:a(t.target).val()})})),f.on("change",(function(t){var e=a(t.target).val();O.hasOwnProperty(e)&&(e===HCaptchaGeneralObject.modeLive?(r.attr("disabled",!1),i.attr("disabled",!1)):(r.attr("disabled",!0),i.attr("disabled",!0)),K({sitekey:O[e]}))})),m.on("change",(function(){U()})),b.on("blur",(function(){U()})),b.on("focus",(function(){b.css("background-color","unset"),j.attr("disabled",!1)})),y.on("change",(function(){!function(){var e={onload:"hCaptchaOnLoad",render:"explicit"};C.prop("checked")&&(e.recaptchacompat="off"),m.prop("checked")&&(e.custom="true");var a={asset_host:"assethost",endpoint:"endpoint",host:"host",image_host:"imghost",report_api:"reportapi",sentry:"sentry"},n=A();for(var c in a){var o=n[c].trim();o&&(e[a[c]]=encodeURIComponent(D(o)))}var r=n.api_host.trim();r=D(r=r||"js.hcaptcha.com")+"/1/api.js";var i=new URL(r);for(var h in e)i.searchParams.append(h,e[h]);document.getElementById("hcaptcha-api").remove(),delete t.g.hcaptcha,s.html("");var l=document.getElementsByTagName("head")[0],p=document.createElement("script");p.type="text/javascript",p.id="hcaptcha-api",p.src=i.href,l.appendChild(p)}(),JSON.stringify(A())===JSON.stringify(G)?(_=!1,x(),j.attr("disabled",!1)):_||(_=!0,B(HCaptchaGeneralObject.checkConfigNotice),j.attr("disabled",!0))})),a(".hcaptcha-general h3").on("click",(function(t){var e=a(t.currentTarget);e.toggleClass("closed");var n={action:HCaptchaGeneralObject.toggleSectionAction,nonce:HCaptchaGeneralObject.toggleSectionNonce,section:e.attr("class").replaceAll(/(hcaptcha-section-|closed)/g,"").trim(),status:!e.hasClass("closed")};a.post({url:HCaptchaGeneralObject.ajaxUrl,data:n}).done((function(t){t.success||B(t.data)})).fail((function(t){B(t.statusText)}))})),h.removeAttr("name"),l.removeAttr("name"),v.removeAttr("name"),g.removeAttr("name"),v.find("option").each((function(){var t=a(this);t.val().split("=")[1]||t.attr("disabled",!0)})),g.val(""),v.on("change",(function(){var t=a(this).find("option:selected").val().split("="),e=t[0],n=t[1];"palette--mode"===e?(g.attr("type","text"),g.val(n)):(g.val(n),g.attr("type","color"))})),g.on("change",(function(t){var e=a(t.target).val(),n=v.find("option:selected"),c=n.val().split("="),o=c[0],r=e;n.val(o+"="+e),U(r=(o="theme--"+c[0]).split("--").reverse().reduce((function(t,e){var a={};return a[e]=t,a}),r))}))};window.hCaptchaGeneral=a,jQuery(document).ready(a)})();
  • hcaptcha-for-forms-and-more/trunk/assets/js/integrations.js

    r3215681 r3233179  
    1 /* global jQuery, HCaptchaIntegrationsObject, kaggDialog */
     1/* global jQuery, hCaptchaSettingsBase, HCaptchaIntegrationsObject, kaggDialog */
    22
    33/**
     
    2626 */
    2727const integrations = function( $ ) {
    28     /**
    29      * @type {HTMLElement}
    30      */
    31     const adminBar = document.querySelector( '#wpadminbar' );
    32 
    33     /**
    34      * @type {HTMLElement}
    35      */
    36     const tabs = document.querySelector( '.hcaptcha-settings-tabs' );
    37 
    38     /**
    39      * @type {HTMLElement}
    40      */
    41     const headerBar = document.querySelector( '.hcaptcha-header-bar' );
    4228    const msgSelector = '#hcaptcha-message';
    4329    let $message = $( msgSelector );
     
    4632    const $search = $( '#hcaptcha-integrations-search' );
    4733
    48     function getStickyHeight() {
    49         const isAbsolute = adminBar ? window.getComputedStyle( adminBar ).position === 'absolute' : true;
    50         const adminBarHeight = ( adminBar && ! isAbsolute ) ? adminBar.offsetHeight : 0;
    51         const tabsHeight = tabs ? tabs.offsetHeight : 0;
    52         const headerBarHeight = headerBar ? headerBar.offsetHeight : 0;
    53 
    54         return adminBarHeight + tabsHeight + headerBarHeight;
    55     }
    56 
    5734    function clearMessage() {
    5835        $message.remove();
    59         // Concat below to avoid inspection message.
     36        // Concat to avoid an inspection message.
    6037        $( '<div id="hcaptcha-message">' + '</div>' ).insertAfter( '.hcaptcha-header-bar' );
    6138        $message = $( msgSelector );
     
    278255                    $( 'html, body' ).animate(
    279256                        {
    280                             scrollTop: $tr.offset().top - getStickyHeight(),
     257                            scrollTop: $tr.offset().top - hCaptchaSettingsBase.getStickyHeight(),
    281258                        },
    282259                        1000
  • hcaptcha-for-forms-and-more/trunk/assets/js/integrations.min.js

    r3215681 r3233179  
    1 (()=>{function t(t,a){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var a=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=a){var n,i,o,r,c=[],s=!0,l=!1;try{if(o=(a=a.call(t)).next,0===e){if(Object(a)!==a)return;s=!1}else for(;!(s=(n=o.call(a)).done)&&(c.push(n.value),c.length!==e);s=!0);}catch(t){l=!0,i=t}finally{try{if(!s&&null!=a.return&&(r=a.return(),Object(r)!==r))return}finally{if(l)throw i}}return c}}(t,a)||function(t,a){if(t){if("string"==typeof t)return e(t,a);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(t,a):void 0}}(t,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=Array(e);a<e;a++)n[a]=t[a];return n}var a=function(e){var a=document.querySelector("#wpadminbar"),n=document.querySelector(".hcaptcha-settings-tabs"),i=document.querySelector(".hcaptcha-header-bar"),o="#hcaptcha-message",r=e(o),c=e("#wpwrap"),s=e("#adminmenuwrap"),l=e("#hcaptcha-integrations-search");function d(t,a){r.removeClass(),r.addClass(a+" notice settings-error is-dismissible"),r.html("<p>".concat(t,"</p>")),e(document).trigger("wp-updates-notice-added");var n=r.clone();r.css("visibility","hidden"),n.css("margin","0px"),n.css("top",c.position().top),n.css("z-index","999999");var i="block"===s.css("display")?s.width():0;n.css("left",i),n.width(e(window).width()-i),n.css("position","fixed"),e("body").append(n),setTimeout((function(){r.css("visibility","unset"),n.remove()}),3e3)}function h(t){d(t,"notice-error")}function u(t){return t.is(jQuery(".form-table").eq(0))}function f(t,a,n){var i=!1,o=a.toLowerCase(),r=!u(t),c=n.find("fieldset");c.attr("disabled",r),c.find("input").attr("disabled",r),t.find("tbody").children().each((function(t,a){var r=e(a).find(".hcaptcha-integrations-logo img").attr("alt");if((r=(r=r||"").replace(" Logo","")).toLowerCase()>o)return n.insertBefore(e(a)),i=!0,!1})),i||t.find("tbody").append(n)}e(".form-table img").on("click",(function(c){function s(){l(!0)}function l(){var o=arguments.length>0&&void 0!==arguments[0]&&arguments[0],r=v?"on":"off";r=o?"install":r;var c,s,l=(s=document.querySelector(".kagg-dialog select"))&&null!==(c=s.value)&&void 0!==c?c:"",g={action:HCaptchaIntegrationsObject.action,nonce:HCaptchaIntegrationsObject.nonce,install:o,activate:v,entity:p,status:j,newTheme:l};y.addClass(r),e.post({url:HCaptchaIntegrationsObject.ajaxUrl,data:g}).done((function(o){if(void 0!==o.success)if(void 0!==o.data.themes&&(HCaptchaIntegrationsObject.themes=o.data.themes,HCaptchaIntegrationsObject.defaultTheme=o.data.defaultTheme),o.success){var r,c=e(".form-table").eq(v?0:1);!function(t,a,n){if("theme"===a){var i=e(".form-table"),o=t?"":'[data-label="'+n+'"]',r=i.eq(t?0:1).find('.hcaptcha-integrations-logo img[data-entity="theme"]'+o);if(r.length){var c=i.eq(t?1:0),s=r.closest("tr");f(c,r.attr("data-label"),s)}}}(v,p,l),f(c,m,y),function(t){d(t,"notice-success")}(o.data.message),function(a){for(var n=e(".form-table"),i=0,o=Object.entries(a);i<o.length;i++){var r=t(o[i],2),c=r[0],s=r[1],l="hcaptcha-integrations-"+c.replace(/_/g,"-"),d=e("tr.".concat(l)),h=d.find(".hcaptcha-integrations-logo"),g=u(d.closest(".form-table"));s&&h.attr("data-installed",!0),g!==s&&f(n.eq(s?0:1),h.find("img").attr("alt"),d)}}(o.data.stati),e("html, body").animate({scrollTop:y.offset().top-(r=!a||"absolute"===window.getComputedStyle(a).position,(a&&!r?a.offsetHeight:0)+(n?n.offsetHeight:0)+(i?i.offsetHeight:0))},1e3)}else{var s,g;h(null!==(s=null===(g=o.data)||void 0===g?void 0:g.message)&&void 0!==s?s:o.data)}else d(HCaptchaIntegrationsObject.unexpectedErrorMsg,"notice-error")})).fail((function(t){h(t.statusText)})).always((function(){y.removeClass("install on off")}))}c.preventDefault(),r.remove(),e('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),r=e(o);var g=e(c.target),p=g.data("entity");if(p=p||"",-1!==e.inArray(p,["core","theme","plugin"])&&-1===e.inArray(p,["core"])){var m=g.attr("alt");m=(m=m||"").replace(" Logo","");var b,v,y=g.closest("tr"),C=y.attr("class").match(/hcaptcha-integrations-([a-z0-9-]+)/),j=C?C[1]:"",O="";if(y.find("fieldset").attr("disabled"))b="plugin"===p?HCaptchaIntegrationsObject.activatePluginMsg:HCaptchaIntegrationsObject.activateThemeMsg,v=!0;else{if("plugin"===p)b=HCaptchaIntegrationsObject.deactivatePluginMsg;else{for(var w in b=HCaptchaIntegrationsObject.deactivateThemeMsg,O="<p>"+HCaptchaIntegrationsObject.selectThemeMsg+"</p>",O+="<select>",HCaptchaIntegrationsObject.themes){var H=w===HCaptchaIntegrationsObject.defaultTheme?' selected="selected"':"";O+='<option value="'.concat(w,'"').concat(H,">").concat(HCaptchaIntegrationsObject.themes[w],"</option>")}O+="</select>"}v=!1}if(-1===e.inArray(p,["theme"])||v||0!==Object.keys(HCaptchaIntegrationsObject.themes).length){if("false"===y.find(".hcaptcha-integrations-logo").attr("data-installed"))return c.ctrlKey?void s():(b=(b="plugin"===p?HCaptchaIntegrationsObject.installPluginMsg:HCaptchaIntegrationsObject.installThemeMsg).replace("%s",m),void kaggDialog.confirm({title:b,content:O,type:"install",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&s()}}));c.ctrlKey?l():(b=b.replace("%s",m),kaggDialog.confirm({title:b,content:O,type:v?"activate":"deactivate",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&l()}}))}else kaggDialog.confirm({title:HCaptchaIntegrationsObject.onlyOneThemeMsg,content:"",type:"info",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText}}})}}));var g,p,m;l.on("input",(g=function(){var t=l.val().trim().toLowerCase(),a=e(".hcaptcha-integrations-logo img"),n=null;if(a.each((function(a,i){var o=e(i);if("core"!==o.data("entity")){var r,c=o.closest("tr");o.data("label").toLowerCase().includes(t)?(c.show(),n=null!==(r=n)&&void 0!==r?r:c):c.hide()}})),n){var i=n.offset().top+n.outerHeight()-e(window).height()+5;e("html").stop().animate({scrollTop:i},1e3)}},p=100,function(){var t=this,e=arguments;clearTimeout(m),m=setTimeout((function(){return g.apply(t,e)}),p)})),e("#hcaptcha-options").keydown((function(t){e(t.target).is(l)&&13===t.which&&t.preventDefault()}))};window.hCaptchaIntegrations=a,jQuery(document).ready(a)})();
     1(()=>{function t(t,a){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var a=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=a){var n,i,o,r,c=[],s=!0,l=!1;try{if(o=(a=a.call(t)).next,0===e){if(Object(a)!==a)return;s=!1}else for(;!(s=(n=o.call(a)).done)&&(c.push(n.value),c.length!==e);s=!0);}catch(t){l=!0,i=t}finally{try{if(!s&&null!=a.return&&(r=a.return(),Object(r)!==r))return}finally{if(l)throw i}}return c}}(t,a)||function(t,a){if(t){if("string"==typeof t)return e(t,a);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(t,a):void 0}}(t,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=Array(e);a<e;a++)n[a]=t[a];return n}var a=function(e){var a="#hcaptcha-message",n=e(a),i=e("#wpwrap"),o=e("#adminmenuwrap"),r=e("#hcaptcha-integrations-search");function c(t,a){n.removeClass(),n.addClass(a+" notice settings-error is-dismissible"),n.html("<p>".concat(t,"</p>")),e(document).trigger("wp-updates-notice-added");var r=n.clone();n.css("visibility","hidden"),r.css("margin","0px"),r.css("top",i.position().top),r.css("z-index","999999");var c="block"===o.css("display")?o.width():0;r.css("left",c),r.width(e(window).width()-c),r.css("position","fixed"),e("body").append(r),setTimeout((function(){n.css("visibility","unset"),r.remove()}),3e3)}function s(t){c(t,"notice-error")}function l(t){return t.is(jQuery(".form-table").eq(0))}function h(t,a,n){var i=!1,o=a.toLowerCase(),r=!l(t),c=n.find("fieldset");c.attr("disabled",r),c.find("input").attr("disabled",r),t.find("tbody").children().each((function(t,a){var r=e(a).find(".hcaptcha-integrations-logo img").attr("alt");if((r=(r=r||"").replace(" Logo","")).toLowerCase()>o)return n.insertBefore(e(a)),i=!0,!1})),i||t.find("tbody").append(n)}e(".form-table img").on("click",(function(i){function o(){r(!0)}function r(){var a=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=p?"on":"off";n=a?"install":n;var i,o,r=(o=document.querySelector(".kagg-dialog select"))&&null!==(i=o.value)&&void 0!==i?i:"",d={action:HCaptchaIntegrationsObject.action,nonce:HCaptchaIntegrationsObject.nonce,install:a,activate:p,entity:u,status:b,newTheme:r};m.addClass(n),e.post({url:HCaptchaIntegrationsObject.ajaxUrl,data:d}).done((function(a){if(void 0!==a.success)if(void 0!==a.data.themes&&(HCaptchaIntegrationsObject.themes=a.data.themes,HCaptchaIntegrationsObject.defaultTheme=a.data.defaultTheme),a.success){var n=e(".form-table").eq(p?0:1);!function(t,a,n){if("theme"===a){var i=e(".form-table"),o=t?"":'[data-label="'+n+'"]',r=i.eq(t?0:1).find('.hcaptcha-integrations-logo img[data-entity="theme"]'+o);if(r.length){var c=i.eq(t?1:0),s=r.closest("tr");h(c,r.attr("data-label"),s)}}}(p,u,r),h(n,f,m),function(t){c(t,"notice-success")}(a.data.message),function(a){for(var n=e(".form-table"),i=0,o=Object.entries(a);i<o.length;i++){var r=t(o[i],2),c=r[0],s=r[1],d="hcaptcha-integrations-"+c.replace(/_/g,"-"),u=e("tr.".concat(d)),f=u.find(".hcaptcha-integrations-logo"),g=l(u.closest(".form-table"));s&&f.attr("data-installed",!0),g!==s&&h(n.eq(s?0:1),f.find("img").attr("alt"),u)}}(a.data.stati),e("html, body").animate({scrollTop:m.offset().top-hCaptchaSettingsBase.getStickyHeight()},1e3)}else{var i,o;s(null!==(i=null===(o=a.data)||void 0===o?void 0:o.message)&&void 0!==i?i:a.data)}else c(HCaptchaIntegrationsObject.unexpectedErrorMsg,"notice-error")})).fail((function(t){s(t.statusText)})).always((function(){m.removeClass("install on off")}))}i.preventDefault(),n.remove(),e('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),n=e(a);var d=e(i.target),u=d.data("entity");if(u=u||"",-1!==e.inArray(u,["core","theme","plugin"])&&-1===e.inArray(u,["core"])){var f=d.attr("alt");f=(f=f||"").replace(" Logo","");var g,p,m=d.closest("tr"),v=m.attr("class").match(/hcaptcha-integrations-([a-z0-9-]+)/),b=v?v[1]:"",y="";if(m.find("fieldset").attr("disabled"))g="plugin"===u?HCaptchaIntegrationsObject.activatePluginMsg:HCaptchaIntegrationsObject.activateThemeMsg,p=!0;else{if("plugin"===u)g=HCaptchaIntegrationsObject.deactivatePluginMsg;else{for(var C in g=HCaptchaIntegrationsObject.deactivateThemeMsg,y="<p>"+HCaptchaIntegrationsObject.selectThemeMsg+"</p>",y+="<select>",HCaptchaIntegrationsObject.themes){var j=C===HCaptchaIntegrationsObject.defaultTheme?' selected="selected"':"";y+='<option value="'.concat(C,'"').concat(j,">").concat(HCaptchaIntegrationsObject.themes[C],"</option>")}y+="</select>"}p=!1}if(-1===e.inArray(u,["theme"])||p||0!==Object.keys(HCaptchaIntegrationsObject.themes).length){if("false"===m.find(".hcaptcha-integrations-logo").attr("data-installed"))return i.ctrlKey?void o():(g=(g="plugin"===u?HCaptchaIntegrationsObject.installPluginMsg:HCaptchaIntegrationsObject.installThemeMsg).replace("%s",f),void kaggDialog.confirm({title:g,content:y,type:"install",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&o()}}));i.ctrlKey?r():(g=g.replace("%s",f),kaggDialog.confirm({title:g,content:y,type:p?"activate":"deactivate",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText},cancel:{text:HCaptchaIntegrationsObject.CancelBtnText}},onAction:function(t){t&&r()}}))}else kaggDialog.confirm({title:HCaptchaIntegrationsObject.onlyOneThemeMsg,content:"",type:"info",buttons:{ok:{text:HCaptchaIntegrationsObject.OKBtnText}}})}}));var d,u,f;r.on("input",(d=function(){var t=r.val().trim().toLowerCase(),a=e(".hcaptcha-integrations-logo img"),n=null;if(a.each((function(a,i){var o=e(i);if("core"!==o.data("entity")){var r=o.closest("tr");o.data("label").toLowerCase().includes(t)?(r.show(),n=null!=n?n:r):r.hide()}})),n){var i=n.offset().top+n.outerHeight()-e(window).height()+5;e("html").stop().animate({scrollTop:i},1e3)}},u=100,function(){var t=this,e=arguments;clearTimeout(f),f=setTimeout((function(){return d.apply(t,e)}),u)})),e("#hcaptcha-options").keydown((function(t){e(t.target).is(r)&&13===t.which&&t.preventDefault()}))};window.hCaptchaIntegrations=a,jQuery(document).ready(a)})();
  • hcaptcha-for-forms-and-more/trunk/assets/js/settings-base.js

    r3200161 r3233179  
    66 * @param {Object} $ jQuery instance.
    77 */
    8 const settingsBase = function( $ ) {
     8const settingsBase = ( function( $ ) {
     9    /**
     10     * @type {HTMLElement}
     11     */
     12    const adminBar = document.querySelector( '#wpadminbar' );
     13
     14    /**
     15     * @type {HTMLElement}
     16     */
     17    const tabs = document.querySelector( '.hcaptcha-settings-tabs' );
     18
     19    /**
     20     * @type {HTMLElement}
     21     */
     22    const headerBar = document.querySelector( '.hcaptcha-header-bar' );
     23
    924    const h2Selector = '.hcaptcha-header h2';
     25    const headerBarSelector = '.hcaptcha-header-bar';
    1026    const msgSelector = '#hcaptcha-message';
     27    let $message = $( msgSelector );
    1128
    1229    function setHeaderBarTop() {
    13         /**
    14          * @type {HTMLElement}
    15          */
    16         const adminBar = document.querySelector( '#wpadminbar' );
    17 
    18         /**
    19          * @type {HTMLElement}
    20          */
    21         const tabs = document.querySelector( '.hcaptcha-settings-tabs' );
    22 
    23         /**
    24          * @type {HTMLElement}
    25          */
    26         const headerBar = document.querySelector( '.hcaptcha-header-bar' );
    27 
    2830        const isAbsolute = adminBar ? window.getComputedStyle( adminBar ).position === 'absolute' : true;
    2931        const adminBarHeight = ( adminBar && ! isAbsolute ) ? adminBar.offsetHeight : 0;
     
    7173    }
    7274
     75    /**
     76     * Public properties and functions.
     77     */
     78    const app = {
     79        getStickyHeight() {
     80            const isAbsolute = adminBar ? window.getComputedStyle( adminBar ).position === 'absolute' : true;
     81            const adminBarHeight = ( adminBar && ! isAbsolute ) ? adminBar.offsetHeight : 0;
     82            const tabsHeight = tabs ? tabs.offsetHeight : 0;
     83            const headerBarHeight = headerBar ? headerBar.offsetHeight : 0;
     84
     85            return adminBarHeight + tabsHeight + headerBarHeight;
     86        },
     87
     88        clearMessage() {
     89            $message.remove();
     90            // Concat below to avoid an inspection message.
     91            $( '<div id="hcaptcha-message">' + '</div>' ).insertAfter( headerBarSelector );
     92            $message = $( msgSelector );
     93        },
     94
     95        showMessage( message = '', msgClass = '' ) {
     96            message = message === undefined ? '' : String( message );
     97
     98            if ( ! message ) {
     99                return;
     100            }
     101
     102            app.clearMessage();
     103            $message.addClass( msgClass + ' notice is-dismissible' );
     104
     105            const messageLines = message.split( '\n' ).map( function( line ) {
     106                return `<p>${ line }</p>`;
     107            } );
     108
     109            $message.html( messageLines.join( '' ) );
     110
     111            $( document ).trigger( 'wp-updates-notice-added' );
     112
     113            $( 'html, body' ).animate(
     114                {
     115                    scrollTop: $message.offset().top - app.getStickyHeight(),
     116                },
     117                1000,
     118            );
     119        },
     120
     121        showSuccessMessage( message = '' ) {
     122            app.showMessage( message, 'notice-success' );
     123        },
     124
     125        showErrorMessage( message = '' ) {
     126            app.showMessage( message, 'notice-error' );
     127        },
     128    };
     129
    73130    // Move WP notices to the message area.
    74131    $( h2Selector ).siblings().appendTo( msgSelector );
     
    81138
    82139    highLight();
    83 };
     140
     141    return app;
     142}( jQuery ) );
    84143
    85144window.hCaptchaSettingsBase = settingsBase;
  • hcaptcha-for-forms-and-more/trunk/assets/js/settings-base.min.js

    r3143189 r3233179  
    1 (()=>{var e=function(e){function t(){var e=document.querySelector("#wpadminbar"),t=document.querySelector(".hcaptcha-settings-tabs"),a=document.querySelector(".hcaptcha-header-bar"),o=!e||"absolute"===window.getComputedStyle(e).position,n=e&&!o?e.offsetHeight:0,c=n+(t?t.offsetHeight:0)-1;t&&(t.style.top="".concat(n,"px")),a&&(a.style.top="".concat(c,"px"))}e(".hcaptcha-header h2").siblings().appendTo("#hcaptcha-message"),window.addEventListener("resize",(function(){t()})),t(),function(){var t=window.location.href,a=document.referrer;if(a&&a!==t){var o=window.location.hash;if(o){var n=e(o);n&&(n.is(":checkbox")?n.closest("fieldset").addClass("blink"):n.addClass("blink"))}}}()};window.hCaptchaSettingsBase=e,jQuery(document).ready(e)})();
     1(()=>{var e=function(e){var t=document.querySelector("#wpadminbar"),o=document.querySelector(".hcaptcha-settings-tabs"),a=document.querySelector(".hcaptcha-header-bar"),s="#hcaptcha-message",i=e(s);function n(){var e=!t||"absolute"===window.getComputedStyle(t).position,s=t&&!e?t.offsetHeight:0,i=s+(o?o.offsetHeight:0)-1;o&&(o.style.top="".concat(s,"px")),a&&(a.style.top="".concat(i,"px"))}var c={getStickyHeight:function(){var e=!t||"absolute"===window.getComputedStyle(t).position;return(t&&!e?t.offsetHeight:0)+(o?o.offsetHeight:0)+(a?a.offsetHeight:0)},clearMessage:function(){i.remove(),e('<div id="hcaptcha-message"></div>').insertAfter(".hcaptcha-header-bar"),i=e(s)},showMessage:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(t=void 0===t?"":String(t)){c.clearMessage(),i.addClass(o+" notice is-dismissible");var a=t.split("\n").map((function(e){return"<p>".concat(e,"</p>")}));i.html(a.join("")),e(document).trigger("wp-updates-notice-added"),e("html, body").animate({scrollTop:i.offset().top-c.getStickyHeight()},1e3)}},showSuccessMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";c.showMessage(e,"notice-success")},showErrorMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";c.showMessage(e,"notice-error")}};return e(".hcaptcha-header h2").siblings().appendTo(s),window.addEventListener("resize",(function(){n()})),n(),function(){var t=window.location.href,o=document.referrer;if(o&&o!==t){var a=window.location.hash;if(a){var s=e(a);s&&(s.is(":checkbox")?s.closest("fieldset").addClass("blink"):s.addClass("blink"))}}}(),c}(jQuery);window.hCaptchaSettingsBase=e,jQuery(document).ready(e)})();
  • hcaptcha-for-forms-and-more/trunk/assets/js/settings-list-page-base.js

    r3215681 r3233179  
    1 /* global HCaptchaFlatPickerObject, flatpickr */
     1/* global HCaptchaListPageBaseObject, flatpickr */
    22
    33/**
     
    1818        selected: 'hcaptcha-is-selected',
    1919    };
    20     const delimiter = HCaptchaFlatPickerObject.delimiter;
    21     const locale = HCaptchaFlatPickerObject.locale;
     20    const delimiter = HCaptchaListPageBaseObject.delimiter;
     21    const locale = HCaptchaListPageBaseObject.locale;
    2222    let flatPickerObj;
    2323
  • hcaptcha-for-forms-and-more/trunk/assets/js/settings-list-page-base.min.js

    r3215681 r3233179  
    1 (()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(e){for(var r=1;r<arguments.length;r++){var a=null!=arguments[r]?arguments[r]:{};r%2?t(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function n(t,r,n){return(r=function(t){var r=function(t,r){if("object"!=e(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var a=n.call(t,r||"default");if("object"!=e(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==e(r)?r:r+""}(r))in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,t}document.addEventListener("DOMContentLoaded",(function(){var e=document.getElementById("hcaptcha-datepicker");if(e){var t,n,a="hcaptcha-is-selected",o=HCaptchaFlatPickerObject.delimiter,c=HCaptchaFlatPickerObject.locale,i=document.getElementById("hcaptcha-options"),l=document.querySelector(".hcaptcha-filter"),u=document.getElementById("hcaptcha-datepicker-popover-button"),p=l.querySelector('input[type="radio"][data-default]');document.addEventListener("click",f),i.querySelector("#hcaptcha-datepicker-popover-button").addEventListener("click",d),i.querySelectorAll('[type="radio"]').forEach((function(e){e.addEventListener("change",v)})),i.querySelector('[type="reset"]').addEventListener("click",b),i.addEventListener("submit",s),i.querySelector("#current-page-selector").addEventListener("keydown",y),n=l.querySelector('input[value="custom"]'),t=flatpickr(e,{mode:"range",inline:!0,allowInput:!1,enableTime:!1,clickOpens:!1,altInput:!0,altFormat:"M j, Y",dateFormat:"Y-m-d",locale:r(r({},flatpickr.l10ns[c]||{}),{},{rangeSeparator:o}),onChange:function(e,t,r){n.checked=!0,m(n.parentElement),t&&(u.textContent=r.altInput.value)}}),v({},n.checked)}function s(t){var r;t.preventDefault(),this.querySelectorAll('input[type="radio"]').forEach((function(e){e.name=""})),(r=u.nextElementSibling).setAttribute("aria-expanded","false"),r.style.display="none";var n=new URL(window.location.href),a=n.searchParams;a.delete("date"),e.value&&a.append("date",e.value),window.location.href=n.toString()}function d(e){e.preventDefault(),e.stopPropagation();var t=e.target.nextElementSibling;"none"===t.style.display||""===t.style.display?t.style.display="block":t.style.display="none",t.setAttribute("aria-expanded","block"===t.style.display?"true":"false")}function y(e){if("Enter"===e.key){e.preventDefault();var t=new URL(window.location.href),r=parseInt(t.searchParams.get("paged")),n=parseInt(e.target.value);(isNaN(r)||r<1)&&(r=1),isNaN(n)||n<1||(t.searchParams.delete("paged"),n!==r&&(t.searchParams.set("paged",n.toString()),window.location.href=t.href))}}function f(e){var t=document.querySelector(".hcaptcha-datepicker-popover");t.contains(e.target)||(t.style.display="none")}function m(e){l.querySelectorAll("label").forEach((function(e){e.classList.remove(a)})),e.classList.add(a)}function b(e){e.preventDefault(),p.checked=!0,v()}function v(){var r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=l.querySelector("input:checked"),a=n.parentElement,c=r?e:n,i=c.value.split(o),p=c.nextElementSibling;u.textContent=r?p.value:a.textContent,m(a),Array.isArray(i)&&2===i.length?t.setDate(i):t.clear()}}))})();
     1(()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?t(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function r(t,n,r){return(n=function(t){var n=function(t,n){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var a=r.call(t,n||"default");if("object"!=e(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}(t,"string");return"symbol"==e(n)?n:n+""}(n))in t?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r,t}document.addEventListener("DOMContentLoaded",(function(){var e=document.getElementById("hcaptcha-datepicker");if(e){var t,r,a="hcaptcha-is-selected",o=HCaptchaListPageBaseObject.delimiter,c=HCaptchaListPageBaseObject.locale,i=document.getElementById("hcaptcha-options"),l=document.querySelector(".hcaptcha-filter"),u=document.getElementById("hcaptcha-datepicker-popover-button"),p=l.querySelector('input[type="radio"][data-default]');document.addEventListener("click",f),i.querySelector("#hcaptcha-datepicker-popover-button").addEventListener("click",d),i.querySelectorAll('[type="radio"]').forEach((function(e){e.addEventListener("change",v)})),i.querySelector('[type="reset"]').addEventListener("click",b),i.addEventListener("submit",s),i.querySelector("#current-page-selector").addEventListener("keydown",y),r=l.querySelector('input[value="custom"]'),t=flatpickr(e,{mode:"range",inline:!0,allowInput:!1,enableTime:!1,clickOpens:!1,altInput:!0,altFormat:"M j, Y",dateFormat:"Y-m-d",locale:n(n({},flatpickr.l10ns[c]||{}),{},{rangeSeparator:o}),onChange:function(e,t,n){r.checked=!0,m(r.parentElement),t&&(u.textContent=n.altInput.value)}}),v({},r.checked)}function s(t){var n;t.preventDefault(),this.querySelectorAll('input[type="radio"]').forEach((function(e){e.name=""})),(n=u.nextElementSibling).setAttribute("aria-expanded","false"),n.style.display="none";var r=new URL(window.location.href),a=r.searchParams;a.delete("date"),e.value&&a.append("date",e.value),window.location.href=r.toString()}function d(e){e.preventDefault(),e.stopPropagation();var t=e.target.nextElementSibling;"none"===t.style.display||""===t.style.display?t.style.display="block":t.style.display="none",t.setAttribute("aria-expanded","block"===t.style.display?"true":"false")}function y(e){if("Enter"===e.key){e.preventDefault();var t=new URL(window.location.href),n=parseInt(t.searchParams.get("paged")),r=parseInt(e.target.value);(isNaN(n)||n<1)&&(n=1),isNaN(r)||r<1||(t.searchParams.delete("paged"),r!==n&&(t.searchParams.set("paged",r.toString()),window.location.href=t.href))}}function f(e){var t=document.querySelector(".hcaptcha-datepicker-popover");t.contains(e.target)||(t.style.display="none")}function m(e){l.querySelectorAll("label").forEach((function(e){e.classList.remove(a)})),e.classList.add(a)}function b(e){e.preventDefault(),p.checked=!0,v()}function v(){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=l.querySelector("input:checked"),a=r.parentElement,c=n?e:r,i=c.value.split(o),p=c.nextElementSibling;u.textContent=n?p.value:a.textContent,m(a),Array.isArray(i)&&2===i.length?t.setDate(i):t.clear()}}))})();
  • hcaptcha-for-forms-and-more/trunk/changelog.txt

    r3215681 r3233179  
     1= 4.10.0 =
     2* Added support for wp_login_form() function and LoginOut block.
     3* Added support for hCaptcha in HTML Gravity Forms fields.
     4* Added support for custom nonce action and name in the [hcaptcha] shortcode.
     5* Added compatibility with Cookies and Content Security Policy plugin.
     6* Added auto-verification of arbitrary forms in ajax.
     7* Added deletion of events on the Forms page.
     8* Added deletion of events on the Events page.
     9* Improved error messaging for hCaptcha verification.
     10* Fixed IP detection in the WordPress core via filter. Now syncs with hCaptcha event information when IP collection is activated.
     11* Fixed fatal error with the WPForms plugin in rare cases.
     12* Fixed error message at the first entry to the login page when Hide Login Errors in on.
     13* Fixed scrolling to the message on the General page.
     14* Fixed fatal error during integration installation in some cases.
     15* Fixed the Integrations page when active plugin was deleted.
     16* Fixed error when hCaptcha is disabled for standard login but enabled for LearnPress login.
     17* Fixed error when hCaptcha is disabled for standard login but enabled for Tutor login.
     18* Fixed layout for Forms and Events pages on small screens.
     19
    120= 4.9.0 =
    221* Added LearnPress integration.
  • hcaptcha-for-forms-and-more/trunk/hcaptcha.php

    r3215681 r3233179  
    1111 * Plugin URI:           https://www.hcaptcha.com/
    1212 * Description:          hCaptcha keeps out bots and spam while putting privacy first. It is a drop-in replacement for reCAPTCHA.
    13  * Version:              4.9.0
     13 * Version:              4.10.0
    1414 * Requires at least:    5.3
    1515 * Requires PHP:         7.2
     
    2222 *
    2323 * WC requires at least: 3.0
    24  * WC tested up to:      9.3
     24 * WC tested up to:      9.6
    2525 */
    2626
     
    4040 * Plugin version.
    4141 */
    42 const HCAPTCHA_VERSION = '4.9.0';
     42const HCAPTCHA_VERSION = '4.10.0';
    4343
    4444/**
  • hcaptcha-for-forms-and-more/trunk/readme.txt

    r3215681 r3233179  
    55Tested up to: 6.7
    66Requires PHP: 7.2
    7 Stable tag: 4.9.0
     7Stable tag: 4.10.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    112112
    113113`
    114 [hcaptcha action="my_hcap_action" name="my_hcap_name" auto="true|false" force="true|false" theme="light|dark|auto" size="normal|compact|invisible"]
     114[hcaptcha action="my_hcap_action" name="my_hcap_name" auto="true|false" ajax="true|false" force="true|false" theme="light|dark|auto" size="normal|compact|invisible"]
    115115`
    116116
     
    186186`
    187187[hcaptcha auto="true" force="true"]
     188`
     189
     190Arbitrary forms can also be verified in ajax via the `ajax` argument. There is no need to specify `auto="true"` in this case, as `ajax` implies `auto="true"`.
     191
     192`
     193[hcaptcha ajax="true"]
    188194`
    189195
     
    552558* Colorlib Customizer Login, Lost Password, and Customizer Register Forms
    553559* Contact Form 7
     560* Cookies and Content Security Policy
    554561* Divi Comment, Contact, Email Optin and Login Forms
    555562* Divi Builder Comment, Contact, Email Optin and Login Forms
     
    621628== Changelog ==
    622629
     630= 4.10.0 =
     631* Added support for wp_login_form() function and LoginOut block.
     632* Added support for hCaptcha in HTML Gravity Forms fields.
     633* Added support for custom nonce action and name in the [hcaptcha] shortcode.
     634* Added compatibility with Cookies and Content Security Policy plugin.
     635* Added auto-verification of arbitrary forms in ajax.
     636* Added deletion of events on the Forms page.
     637* Added deletion of events on the Events page.
     638* Improved error messaging for hCaptcha verification.
     639* Fixed IP detection in the WordPress core via filter. Now syncs with hCaptcha event information when IP collection is activated.
     640* Fixed fatal error with the WPForms plugin in rare cases.
     641* Fixed error message at the first entry to the login page when Hide Login Errors in on.
     642* Fixed scrolling to the message on the General page.
     643* Fixed fatal error during integration installation in some cases.
     644* Fixed the Integrations page when active plugin was deleted.
     645* Fixed error when hCaptcha is disabled for standard login but enabled for LearnPress login.
     646* Fixed error when hCaptcha is disabled for standard login but enabled for Tutor login.
     647* Fixed layout for Forms and Events pages on small screens.
     648
    623649= 4.9.0 =
    624650* Added LearnPress integration.
  • hcaptcha-for-forms-and-more/trunk/src/php/Abstracts/LoginBase.php

    r3215681 r3233179  
    159159
    160160        if ( ! hcaptcha()->settings()->is_on( 'hide_login_errors' ) ) {
     161            return $user;
     162        }
     163
     164        $ignore_codes = [ 'empty_username', 'empty_password' ];
     165
     166        if ( in_array( $user->get_error_code(), $ignore_codes, true ) ) {
    161167            return $user;
    162168        }
  • hcaptcha-for-forms-and-more/trunk/src/php/Admin/Events/Events.php

    r3215681 r3233179  
    234234                "SELECT
    235235                        SQL_CALC_FOUND_ROWS
    236                         source, form_id, COUNT(*) as served
     236                        id, source, form_id, COUNT(*) as served
    237237                        FROM $table_name
    238238                        WHERE $where_date
  • hcaptcha-for-forms-and-more/trunk/src/php/Admin/Events/EventsTable.php

    r3215681 r3233179  
    99
    1010use HCaptcha\Settings\ListPageBase;
    11 use WP_List_Table;
    12 
    13 // If this file is called directly, abort.
    14 if ( ! defined( 'ABSPATH' ) ) {
    15     // @codeCoverageIgnoreStart
    16     exit;
    17     // @codeCoverageIgnoreEnd
    18 }
    19 
    20 if ( ! class_exists( 'WP_List_Table', false ) ) {
    21     // IMPORTANT NOTICE:
    22     // This line is needed to prevent fatal errors in the third-party plugins.
    23     // We know that Jetpack (probably others also) can load WP classes during cron jobs.
    24     require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
    25 }
    2611
    2712/**
    2813 * List events in the table.
    2914 */
    30 class EventsTable extends WP_List_Table {
    31 
    32     /**
    33      * Events per page option.
    34      */
    35     private const EVENTS_PER_PAGE = 'hcaptcha_events_per_page';
    36 
    37     /**
    38      * Plugin page hook.
    39      *
    40      * @var string
    41      */
    42     private $plugin_page_hook;
    43 
    44     /**
    45      * Default number of events to show per page.
    46      *
    47      * @var int
    48      */
    49     public $per_page_default = 20;
     15class EventsTable extends TableBase {
     16
     17    /**
     18     * Singular table name.
     19     */
     20    protected const SINGULAR = 'event';
     21
     22    /**
     23     * Plural table name.
     24     */
     25    protected const PLURAL = 'events';
     26
     27    /**
     28     * Items per page option.
     29     */
     30    protected const ITEMS_PER_PAGE = 'hcaptcha_events_per_page';
    5031
    5132    /**
     
    5536     */
    5637    private $datetime_format = [];
    57 
    58     /**
    59      * Columns.
    60      *
    61      * @var array
    62      */
    63     private $columns;
    64 
    65     /**
    66      * Plugins installed.
    67      *
    68      * @var array[]
    69      */
    70     private $plugins;
    71 
    72     /**
    73      * Class constructor.
    74      *
    75      * @param string $plugin_page_hook Plugin page hook.
    76      */
    77     public function __construct( string $plugin_page_hook ) {
    78         parent::__construct(
    79             [
    80                 'singular' => 'event',
    81                 'plural'   => 'events',
    82                 'screen'   => $plugin_page_hook,
    83             ]
    84         );
    85 
    86         $this->plugin_page_hook = $plugin_page_hook;
    87 
    88         $this->init();
    89     }
    9038
    9139    /**
     
    10149
    10250        $this->columns = [
     51            'cb'          => '<input type="checkbox" />',
    10352            'name'        => __( 'Source', 'hcaptcha-for-forms-and-more' ),
    10453            'form_id'     => __( 'Form Id', 'hcaptcha-for-forms-and-more' ),
     
    10958        ];
    11059
    111         $this->plugins = get_plugins();
    112 
    113         add_action( 'load-' . $this->plugin_page_hook, [ $this, 'add_screen_option' ] );
    114         add_filter( 'set_screen_option_' . self::EVENTS_PER_PAGE, [ $this, 'set_screen_option' ], 10, 3 );
    115 
    116         set_screen_options();
    117     }
    118 
    119     /**
    120      * Add screen options.
    121      *
    122      * @return void
    123      */
    124     public function add_screen_option(): void {
    125         $args = [
    126             'label'   => __( 'Number of items per page:', 'hcaptcha-for-forms-and-more' ),
    127             'default' => $this->per_page_default,
    128             'option'  => self::EVENTS_PER_PAGE,
    129         ];
    130 
    131         add_screen_option( 'per_page', $args );
    132     }
    133 
    134     /**
    135      * Set screen option.
    136      *
    137      * @param mixed  $screen_option  The value to save instead of the option value.
    138      *                               Default false (to skip saving the current option).
    139      * @param string $option         The option name.
    140      * @param mixed  $value          The option value.
    141      *
    142      * @return mixed
    143      * @noinspection PhpUnusedParameterInspection
    144      */
    145     public function set_screen_option( $screen_option, string $option, $value ) {
    146         return $value;
    147     }
    148 
    149     /**
    150      * Retrieve the table columns.
    151      *
    152      * @return array Array of all the list table columns.
    153      */
    154     public function get_columns(): array {
    155         return $this->columns;
     60        parent::init();
    15661    }
    15762
     
    18792    /**
    18893     * Fetch and set up the final data for the table.
     94     *
     95     * @return void
    18996     */
    19097    public function prepare_items(): void {
     
    204111        $dates        = explode( ListPageBase::TIMESPAN_DELIMITER, $date );
    205112        $dates        = array_filter( array_map( 'trim', $dates ) );
    206         $column_slugs = str_replace( 'name', 'source', array_keys( $this->columns ) );
    207         $per_page     = $this->get_items_per_page( self::EVENTS_PER_PAGE, $this->per_page_default );
     113        $column_slugs = str_replace( [ 'cb', 'name' ], [ 'id', 'source' ], array_keys( $this->columns ) );
     114        $per_page     = $this->get_items_per_page( self::ITEMS_PER_PAGE, $this->per_page_default );
    208115        $offset       = ( $paged - 1 ) * $per_page;
    209116        $args         = [
     
    230137
    231138    /**
    232      * Column Source.
    233      * Has 'name' slug not to be hidden.
    234      * WP has no filter for special columns.
    235      *
    236      * @see          \WP_Screen::render_list_table_columns_preferences.
    237      *
    238      * @param object $item Item.
    239      *
    240      * @noinspection PhpUnused PhpUnused.
    241      */
    242     protected function column_name( object $item ): string {
    243         $source = (array) json_decode( $item->source, true );
    244 
    245         foreach ( $source as &$slug ) {
    246             if ( 'WordPress' === $slug ) {
    247                 continue;
    248             }
    249 
    250             if ( false === strpos( $slug, '/' ) ) {
    251                 continue;
    252             }
    253 
    254             $slug = isset( $this->plugins[ $slug ] ) ? $this->plugins[ $slug ]['Name'] : $slug;
    255         }
    256 
    257         unset( $slug );
    258 
    259         return $this->excerpt( implode( ', ', $source ), 15 );
    260     }
    261 
    262     /**
    263139     * Column IP.
    264140     *
     
    324200        );
    325201    }
    326 
    327     /**
    328      * Column default.
    329      *
    330      * @param object $item        Item.
    331      * @param string $column_name Column name.
    332      */
    333     protected function column_default( $item, $column_name ): string {
    334         return (string) $item->$column_name;
    335     }
    336 
    337     /**
    338      * Excerpt text.
    339      *
    340      * @param string $text   Text.
    341      * @param int    $length Excerpt length.
    342      *
    343      * @return string
    344      */
    345     private function excerpt( string $text, int $length = 35 ): string {
    346         $excerpt = mb_substr( $text, 0, $length );
    347 
    348         ob_start();
    349 
    350         ?>
    351         <span class="hcaptcha-excerpt"><?php echo esc_html( $excerpt ); ?>
    352             <span class="hcaptcha-hide"><?php echo esc_html( $text ); ?></span>
    353         </span>
    354         <?php
    355 
    356         return ob_get_clean();
    357     }
    358202}
  • hcaptcha-for-forms-and-more/trunk/src/php/Admin/Events/FormsTable.php

    r3185570 r3233179  
    99
    1010use HCaptcha\Settings\ListPageBase;
    11 use WP_List_Table;
    12 
    13 // If this file is called directly, abort.
    14 if ( ! defined( 'ABSPATH' ) ) {
    15     // @codeCoverageIgnoreStart
    16     exit;
    17     // @codeCoverageIgnoreEnd
    18 }
    19 
    20 if ( ! class_exists( 'WP_List_Table', false ) ) {
    21     // IMPORTANT NOTICE:
    22     // This line is needed to prevent fatal errors in the third-party plugins.
    23     // We know that Jetpack (probably others also) can load WP classes during cron jobs.
    24     require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
    25 }
    2611
    2712/**
    2813 * List forms in the table.
    2914 */
    30 class FormsTable extends WP_List_Table {
     15class FormsTable extends TableBase {
    3116
    3217    /**
    33      * Forms per page option.
     18     * Singular table name.
    3419     */
    35     private const FORMS_PER_PAGE = 'hcaptcha_forms_per_page';
     20    protected const SINGULAR = 'form';
    3621
    3722    /**
    38      * Plugin page hook.
    39      *
    40      * @var string
     23     * Plural table name.
    4124     */
    42     private $plugin_page_hook;
     25    protected const PLURAL = 'forms';
    4326
    4427    /**
    45      * Default number of forms to show per page.
    46      *
    47      * @var int
     28     * Items per page option.
    4829     */
    49     public $per_page_default = 20;
     30    protected const ITEMS_PER_PAGE = 'hcaptcha_forms_per_page';
    5031
    5132    /**
     
    5738
    5839    /**
    59      * Columns.
    60      *
    61      * @var array
    62      */
    63     private $columns;
    64 
    65     /**
    66      * Plugins installed.
    67      *
    68      * @var array[]
    69      */
    70     private $plugins;
    71 
    72     /**
    73      * Class constructor.
    74      *
    75      * @param string $plugin_page_hook Plugin page hook.
    76      */
    77     public function __construct( string $plugin_page_hook ) {
    78         parent::__construct(
    79             [
    80                 'singular' => 'form',
    81                 'plural'   => 'forms',
    82                 'screen'   => $plugin_page_hook,
    83             ]
    84         );
    85 
    86         $this->plugin_page_hook = $plugin_page_hook;
    87 
    88         $this->init();
    89     }
    90 
    91     /**
    9240     * Init class.
    9341     *
     
    9644    public function init(): void {
    9745        $this->columns = [
     46            'cb'      => '<input type="checkbox" />',
    9847            'name'    => __( 'Source', 'hcaptcha-for-forms-and-more' ),
    9948            'form_id' => __( 'Form Id', 'hcaptcha-for-forms-and-more' ),
     
    10150        ];
    10251
    103         $this->plugins = get_plugins();
    104 
    105         add_action( 'load-' . $this->plugin_page_hook, [ $this, 'add_screen_option' ] );
    106         add_filter( 'set_screen_option_' . self::FORMS_PER_PAGE, [ $this, 'set_screen_option' ], 10, 3 );
    107 
    108         set_screen_options();
    109     }
    110 
    111     /**
    112      * Add screen options.
    113      *
    114      * @return void
    115      */
    116     public function add_screen_option(): void {
    117         $args = [
    118             'label'   => __( 'Number of items per page:', 'hcaptcha-for-forms-and-more' ),
    119             'default' => $this->per_page_default,
    120             'option'  => self::FORMS_PER_PAGE,
    121         ];
    122 
    123         add_screen_option( 'per_page', $args );
    124     }
    125 
    126     /**
    127      * Set screen option.
    128      *
    129      * @param mixed  $screen_option  The value to save instead of the option value.
    130      *                               Default false (to skip saving the current option).
    131      * @param string $option         The option name.
    132      * @param mixed  $value          The option value.
    133      *
    134      * @return mixed
    135      * @noinspection PhpUnusedParameterInspection
    136      */
    137     public function set_screen_option( $screen_option, string $option, $value ) {
    138         return $value;
    139     }
    140 
    141     /**
    142      * Retrieve the table columns.
    143      *
    144      * @return array Array of all the list table columns.
    145      */
    146     public function get_columns(): array {
    147         return $this->columns;
     52        parent::init();
    14853    }
    14954
     
    197102        $dates    = explode( ListPageBase::TIMESPAN_DELIMITER, $date );
    198103        $dates    = array_filter( array_map( 'trim', $dates ) );
    199         $per_page = $this->get_items_per_page( self::FORMS_PER_PAGE, $this->per_page_default );
     104        $per_page = $this->get_items_per_page( self::ITEMS_PER_PAGE, $this->per_page_default );
    200105        $offset   = ( $paged - 1 ) * $per_page;
    201106        $args     = [
     
    220125        );
    221126    }
    222 
    223     /**
    224      * Column Source.
    225      * Has 'name' slug not to be hidden.
    226      * WP has no filter for special columns.
    227      *
    228      * @see          \WP_Screen::render_list_table_columns_preferences.
    229      *
    230      * @param object $item Item.
    231      *
    232      * @noinspection PhpUnused PhpUnused.
    233      */
    234     protected function column_name( object $item ): string {
    235         $source = (array) json_decode( $item->source, true );
    236 
    237         foreach ( $source as &$slug ) {
    238             if ( 'WordPress' === $slug ) {
    239                 continue;
    240             }
    241 
    242             if ( false === strpos( $slug, '/' ) ) {
    243                 continue;
    244             }
    245 
    246             $slug = isset( $this->plugins[ $slug ] ) ? $this->plugins[ $slug ]['Name'] : $slug;
    247         }
    248 
    249         unset( $slug );
    250 
    251         return $this->excerpt( implode( ', ', $source ), 15 );
    252     }
    253 
    254     /**
    255      * Column default.
    256      *
    257      * @param object $item        Item.
    258      * @param string $column_name Column name.
    259      */
    260     protected function column_default( $item, $column_name ): string {
    261         return (string) $item->$column_name;
    262     }
    263 
    264     /**
    265      * Excerpt text.
    266      *
    267      * @param string $text   Text.
    268      * @param int    $length Excerpt length.
    269      *
    270      * @return string
    271      */
    272     private function excerpt( string $text, int $length = 35 ): string {
    273         $excerpt = mb_substr( $text, 0, $length );
    274 
    275         ob_start();
    276 
    277         ?>
    278         <span class="hcaptcha-excerpt"><?php echo esc_html( $excerpt ); ?>
    279             <span class="hcaptcha-hide"><?php echo esc_html( $text ); ?></span>
    280         </span>
    281         <?php
    282 
    283         return ob_get_clean();
    284     }
    285127}
  • hcaptcha-for-forms-and-more/trunk/src/php/AutoVerify/AutoVerify.php

    r3129246 r3233179  
    88namespace HCaptcha\AutoVerify;
    99
     10use HCaptcha\Helpers\HCaptcha;
    1011use HCaptcha\Helpers\Request;
    1112use WP_Widget_Block;
     
    2223
    2324    /**
     25     * Script handle.
     26     */
     27    public const HANDLE = 'hcaptcha-auto-verify';
     28
     29    /**
     30     * Script localization object.
     31     */
     32    public const OBJECT = 'HCaptchaAutoVerifyObject';
     33
     34    /**
     35     * The hCaptcha forms registry.
     36     *
     37     * @var array
     38     */
     39    protected $registry = [];
     40
     41    /**
    2442     * Init class.
    2543     *
     
    3654     */
    3755    private function init_hooks(): void {
    38         add_action( 'init', [ $this, 'verify_form' ], - PHP_INT_MAX );
     56        add_action( 'init', [ $this, 'verify' ], - PHP_INT_MAX );
    3957        add_filter( 'the_content', [ $this, 'content_filter' ], PHP_INT_MAX );
    4058        add_filter( 'widget_block_content', [ $this, 'widget_block_content_filter' ], PHP_INT_MAX, 3 );
    4159        add_action( 'hcap_auto_verify_register', [ $this, 'content_filter' ] );
     60        add_action( 'hcap_register_form', [ $this, 'register_hcaptcha' ] );
     61        add_action( 'wp_print_footer_scripts', [ $this, 'enqueue_scripts' ], 9 );
    4262    }
    4363
     
    6888
    6989    /**
     90     * Register hCaptcha form.
     91     *
     92     * @param array|mixed $args Arguments.
     93     *
     94     * @return void
     95     */
     96    public function register_hcaptcha( $args ): void {
     97        if ( ! is_array( $args ) ) {
     98            return;
     99        }
     100
     101        $widget_id = HCaptcha::widget_id_value( $args['id'] ?? [] );
     102
     103        $this->registry[ $widget_id ] = $args;
     104    }
     105
     106    /**
     107     * Enqueue scripts.
     108     *
     109     * @return void
     110     */
     111    public function enqueue_scripts(): void {
     112        if ( ! array_filter( array_column( $this->registry ?? [], 'ajax' ) ) ) {
     113            return;
     114        }
     115
     116        $min = hcap_min_suffix();
     117
     118        wp_enqueue_script(
     119            self::HANDLE,
     120            constant( 'HCAPTCHA_URL' ) . "/assets/js/hcaptcha-auto-verify$min.js",
     121            [ 'jquery' ],
     122            constant( 'HCAPTCHA_VERSION' ),
     123            true
     124        );
     125
     126        wp_localize_script(
     127            self::HANDLE,
     128            self::OBJECT,
     129            [
     130                'successMsg' => __( 'The form was submitted successfully.', 'hcaptcha-for-forms-and-more' ),
     131            ]
     132        );
     133
     134        wp_enqueue_script( 'hcaptcha' );
     135    }
     136
     137    /**
    70138     * Verify a form automatically.
    71139     *
     
    73141     * @noinspection ForgottenDebugOutputInspection
    74142     */
    75     public function verify_form(): void {
     143    public function verify(): void {
    76144        if ( ! Request::is_post() || ! Request::is_frontend() ) {
    77145            return;
     
    84152        }
    85153
    86         if ( ! $this->is_form_registered( $path ) ) {
     154        $registered_form = $this->get_registered_form( $path );
     155
     156        if ( null === $registered_form ) {
    87157            return;
    88158        }
    89159
    90         $result = hcaptcha_verify_post();
     160        $args   = $registered_form['args'] ?? [];
     161        $action = $args['action'] ?? '';
     162        $name   = $args['name'] ?? '';
     163        $ajax   = $args['ajax'] ?? '';
     164        $result = hcaptcha_verify_post( $name, $action );
     165
     166        if ( $ajax ) {
     167            add_filter( 'wp_doing_ajax', '__return_true' );
     168        }
    91169
    92170        if ( null !== $result ) {
    93171            $_POST = [];
     172
    94173            wp_die(
    95174                esc_html( $result ),
     
    119198            }
    120199
     200            $widget_id_value = $this->get_widget_id_value( $form );
     201            $args            = $this->registry[ $widget_id_value ] ?? [];
     202
    121203            $forms_data[] = [
    122204                'action' => $action,
    123205                'inputs' => $this->get_visible_input_names( $form ),
    124                 'auto'   => $this->is_form_auto( $form ),
     206                'args'   => $args,
    125207            ];
    126208        }
     
    139221        $form_action = '';
    140222
    141         if ( preg_match( '#<form [\S\s]*?action="(.*?)"[\S\s]*?>#', $form, $m ) ) {
     223        if ( preg_match( '#<form\s[\S\s]*?action="(.*?)"[\S\s]*?>#', $form, $m ) ) {
    142224            $form_action = $m[1];
    143225        }
     
    146228
    147229        return $this->get_path( $form_action );
     230    }
     231
     232    /**
     233     * Get widget id value.
     234     *
     235     * @param string $form Form.
     236     *
     237     * @return string
     238     */
     239    private function get_widget_id_value( string $form ): string {
     240        $widget_id_value = '';
     241
     242        if ( preg_match( '#<input\s[\S\s]*?name="hcaptcha-widget-id"\s[\S\s]*?value="(.*?)"[\S\s]*?>#', $form, $m ) ) {
     243            $widget_id_value = $m[1];
     244        }
     245
     246        return $widget_id_value;
    148247    }
    149248
     
    229328
    230329    /**
    231      * Get form auto.
    232      *
    233      * @param string $form Form.
    234      *
    235      * @return string|null
    236      */
    237     private function get_form_auto( string $form ): ?string {
    238         if ( preg_match( '#class="h-captcha"[\S\s]+?data-auto="(.*)"[\S\s]*?>#', $form, $matches ) ) {
    239             return $matches[1];
    240         }
    241 
    242         return null;
    243     }
    244 
    245     /**
    246      * Check if the form is auto.
    247      *
    248      * @param string $form Form.
    249      *
    250      * @return bool
    251      */
    252     private function is_form_auto( string $form ): bool {
    253         return 'true' === $this->get_form_auto( $form );
    254     }
    255 
    256     /**
    257330     * Update form data in transient.
    258331     *
     
    264337
    265338        foreach ( $forms_data as $form_data ) {
     339            $data   = $form_data;
    266340            $action = $form_data['action'];
    267             $inputs = $form_data['inputs'];
    268             $auto   = $form_data['auto'];
    269 
    270             $key = isset( $registered_forms[ $action ] ) ?
    271                 array_search( $inputs, $registered_forms[ $action ], true ) :
    272                 false;
     341
     342            unset( $data['action'] );
     343
     344            $inputs = $data['inputs'];
     345            $args   = $data['args'];
     346            $auto   = $args['auto'];
     347
     348            $key          = false;
     349            $action_forms = $registered_forms[ $action ] ?? [];
     350
     351            foreach ( $action_forms as $index => $action_form ) {
     352                if ( $inputs === $action_form['inputs'] ) {
     353                    $key = $index;
     354                    break;
     355                }
     356            }
    273357
    274358            $registered = false !== $key;
    275359
    276             if ( $auto && ! $registered ) {
    277                 $registered_forms[ $action ][] = $inputs;
    278             }
    279 
    280             if ( ! $auto && $registered ) {
     360            if ( $auto ) {
     361                if ( $registered ) {
     362                    $registered_forms[ $action ][ $key ] = $data;
     363                } else {
     364                    $registered_forms[ $action ][] = $data;
     365                }
     366
     367                continue;
     368            }
     369
     370            if ( $registered ) {
    281371                unset( $registered_forms[ $action ][ $key ] );
    282372            }
     
    292382
    293383    /**
    294      * Is the form registered?
     384     * Get registered form.
    295385     *
    296386     * @param string $path URL path.
    297387     *
    298      * @return bool
    299      */
    300     protected function is_form_registered( string $path ): bool {
     388     * @return array|null
     389     */
     390    protected function get_registered_form( string $path ): ?array {
    301391        $registered_forms = get_transient( self::TRANSIENT );
    302392
    303393        if ( empty( $registered_forms ) ) {
    304             return false;
     394            return null;
    305395        }
    306396
    307397        if ( ! isset( $registered_forms[ $path ] ) ) {
    308             return false;
    309         }
     398            return null;
     399        }
     400
     401        // Nonce is verified later, in hcaptcha_verify_post().
     402        // phpcs:ignore WordPress.Security.NonceVerification.Missing
     403        $post_keys = array_keys( $_POST );
    310404
    311405        foreach ( $registered_forms[ $path ] as $registered_form ) {
    312             // Nonce is verified later, in hcaptcha_verify_post().
    313             // phpcs:ignore WordPress.Security.NonceVerification.Missing
    314             if ( ! empty( array_intersect( array_keys( $_POST ), $registered_form ) ) ) {
    315                 return true;
    316             }
    317         }
    318 
    319         return false;
     406            $inputs = $registered_form['inputs'] ?? [];
     407
     408            // Make sure that all inputs are present in the $_POST array.
     409            if ( $inputs && ! array_diff( $inputs, $post_keys ) ) {
     410                return $registered_form;
     411            }
     412        }
     413
     414        return null;
    320415    }
    321416
  • hcaptcha-for-forms-and-more/trunk/src/php/ClassifiedListing/Login.php

    r3114572 r3233179  
    3737     *
    3838     * @return WP_User|WP_Error
    39      * @noinspection PhpUnusedParameterInspection
    4039     */
    4140    public function verify( $user, string $password ) {
     
    4544        }
    4645
    47         if ( ! $this->is_login_limit_exceeded() ) {
    48             return $user;
    49         }
    50 
    51         $error_message = hcaptcha_verify_post(
    52             self::NONCE,
    53             self::ACTION
    54         );
    55 
    56         if ( null === $error_message ) {
    57             return $user;
    58         }
    59 
    60         $code = array_search( $error_message, hcap_get_error_messages(), true ) ?: 'fail';
    61 
    62         return new WP_Error( $code, $error_message, 400 );
     46        return $this->login_base_verify( $user, $password );
    6347    }
    6448}
  • hcaptcha-for-forms-and-more/trunk/src/php/GravityForms/Base.php

    r3114572 r3233179  
    1616     * Nonce action.
    1717     */
    18     public const ACTION = 'gravity_forms_form';
     18    public const ACTION = 'gravity_forms';
    1919
    2020    /**
    2121     * Nonce name.
    2222     */
    23     public const NONCE = 'gravity_forms_form_nonce';
     23    public const NONCE = 'gravity_forms_nonce';
    2424}
  • hcaptcha-for-forms-and-more/trunk/src/php/GravityForms/Form.php

    r3114572 r3233179  
    4646
    4747    /**
     48     * Current form id.
     49     *
     50     * @var int
     51     */
     52    protected $form_id = 0;
     53
     54    /**
    4855     * Constructor.
    4956     */
     
    6269
    6370        if ( $this->mode_auto ) {
    64             add_filter( 'gform_submit_button', [ $this, 'add_captcha' ], 10, 2 );
    65         }
     71            add_filter( 'gform_submit_button', [ $this, 'add_hcaptcha' ], 10, 2 );
     72        }
     73
     74        add_filter( 'gform_form_after_open', [ $this, 'gform_open' ], 10, 2 );
     75        add_filter( 'gform_get_form_filter', [ $this, 'gform_close' ], 10, 2 );
    6676
    6777        add_filter( 'gform_validation', [ $this, 'verify' ], 10, 2 );
     
    8090     * @noinspection PhpUnusedParameterInspection
    8191     */
    82     public function add_captcha( $button_input, array $form ): string {
     92    public function add_hcaptcha( $button_input, array $form ): string {
    8393        if ( is_admin() ) {
    8494            return $button_input;
     
    8797        $form_id = $form['id'] ?? 0;
    8898
    89         if ( $this->mode_embed && $this->has_hcaptcha( $form_id ) ) {
     99        if ( $this->has_hcaptcha( $form_id ) ) {
    90100            return $button_input;
    91101        }
    92102
    93         $args = [
    94             'action' => self::ACTION,
    95             'name'   => self::NONCE,
    96             'id'     => [
    97                 'source'  => HCaptcha::get_class_source( __CLASS__ ),
    98                 'form_id' => $form_id,
    99             ],
    100         ];
    101 
    102         return HCaptcha::form( $args ) . $button_input;
     103        return HCaptcha::form() . $button_input;
     104    }
     105
     106    /**
     107     * Add hCaptcha args filter on opening the form.
     108     *
     109     * @param string|mixed $markup The current string to append.
     110     * @param array        $form   The form being displayed.
     111     *
     112     * @return string
     113     */
     114    public function gform_open( $markup, array $form ): string {
     115        $this->form_id = (int) ( $form['id'] ?? 0 );
     116
     117        add_filter( 'hcap_form_args', [ $this, 'hcap_form_args' ] );
     118
     119        return (string) $markup;
     120    }
     121
     122    /**
     123     * Remove hCaptcha args filter on closing the form.
     124     *
     125     * @param string|mixed $form_string The current form string.
     126     * @param array        $form        The form being displayed.
     127     *
     128     * @return string
     129     * @noinspection PhpMissingParamTypeInspection
     130     * @noinspection PhpUnusedParameterInspection
     131     */
     132    public function gform_close( $form_string, $form ): string {
     133        $this->form_id = 0;
     134
     135        remove_filter( 'hcap_form_args', [ $this, 'hcap_form_args' ] );
     136
     137        return (string) $form_string;
     138    }
     139
     140    /**
     141     * Filter hCaptcha from args on form.
     142     *
     143     * @param array|mixed $args The form arguments.
     144     *
     145     * @return array
     146     */
     147    public function hcap_form_args( $args ): array {
     148        $args = (array) $args;
     149
     150        return array_merge(
     151            $args,
     152            [
     153                'action' => self::ACTION,
     154                'name'   => self::NONCE,
     155                'id'     => [
     156                    'source'  => HCaptcha::get_class_source( __CLASS__ ),
     157                    'form_id' => $this->form_id,
     158                ],
     159            ]
     160        );
    103161    }
    104162
     
    297355
    298356            if (
    299                 0 !== (int) $_POST[ $target_page_name ] &&
     357                0 !== $target_page &&
    300358                $target_page !== $source_page &&
    301359                isset(
     
    316374        }
    317375
    318         if ( $this->mode_embed && $this->has_hcaptcha( $form_id ) ) {
    319             // In embed mode, verify only a form having hCaptcha field.
     376        if ( $this->has_hcaptcha( $form_id ) ) {
     377            // Verify only a form having hCaptcha field.
    320378            return true;
    321379        }
     
    341399
    342400        foreach ( $form['fields'] as $field ) {
    343             if ( in_array( $field->type, $captcha_types, true ) ) {
     401            $type    = $field->type ?? '';
     402            $content = $field->content ?? '';
     403
     404            if (
     405                ( $this->mode_embed && in_array( $type, $captcha_types, true ) ) ||
     406                has_shortcode( $content, 'hcaptcha' )
     407            ) {
    344408                return true;
    345409            }
  • hcaptcha-for-forms-and-more/trunk/src/php/Helpers/HCaptcha.php

    r3200161 r3233179  
    7878                'name'    => '', // Nonce name for wp_nonce_field.
    7979                'auto'    => false, // Whether a form has to be auto-verified.
     80                'ajax'    => false, // Whether a form has to be auto-verified in ajax.
    8081                'force'   => $hcaptcha_force, // Whether to execute hCaptcha widget before submit (like for invisible).
    8182                'theme'   => $hcaptcha_theme, // The hCaptcha theme.
     
    9697
    9798        /**
    98          * Filters the form arguments.
     99         * Filters the hCaptcha form arguments.
    99100         *
    100          * @param array $args The form arguments.
     101         * @param array $args The hCaptcha form arguments.
    101102         */
    102103        $args = (array) apply_filters( 'hcap_form_args', $args );
     
    104105        $args['action']  = (string) $args['action'];
    105106        $args['name']    = (string) $args['name'];
    106         $args['auto']    = filter_var( $args['auto'], FILTER_VALIDATE_BOOLEAN );
     107        $auto            = filter_var( $args['auto'], FILTER_VALIDATE_BOOLEAN );
     108        $args['ajax']    = filter_var( $args['ajax'], FILTER_VALIDATE_BOOLEAN );
     109        $args['auto']    = $args['ajax'] ? true : $auto; // Auto-verify in ajax.
    107110        $args['force']   = filter_var( $args['force'], FILTER_VALIDATE_BOOLEAN );
    108111        $args['theme']   = in_array( (string) $args['theme'], $allowed_themes, true ) ? (string) $args['theme'] : $hcaptcha_theme;
     
    110113        $args['size']    = in_array( (string) $args['size'], $allowed_sizes, true ) ? (string) $args['size'] : $hcaptcha_size;
    111114        $args['id']      = (array) $args['id'];
     115        $id              = $args['id'];
     116        $source          = empty( $id['source'] ) ? self::$default_id['source'] : $id['source'];
     117        $form_id         = $id['form_id'] ?? self::$default_id['form_id'];
     118        $id              = [
     119            'source'  => $source,
     120            'form_id' => $form_id,
     121        ];
     122        $args['id']      = $id;
    112123        $args['protect'] = filter_var( $args['protect'], FILTER_VALIDATE_BOOLEAN );
    113124
    114         $id = wp_parse_args(
    115             $args['id'],
    116             self::$default_id
    117         );
     125        /**
     126         * Register hCaptcha form.
     127         *
     128         * @param array $args The hCaptcha form arguments.
     129         */
     130        do_action( 'hcap_register_form', $args );
    118131
    119132        self::display_widget( $id );
     
    142155                data-size="<?php echo esc_attr( $args['size'] ); ?>"
    143156                data-auto="<?php echo $args['auto'] ? 'true' : 'false'; ?>"
     157                data-ajax="<?php echo $args['ajax'] ? 'true' : 'false'; ?>"
    144158                data-force="<?php echo $args['force'] ? 'true' : 'false'; ?>">
    145159        </h-captcha>
     
    152166
    153167    /**
    154      * Display widget.
     168     * Get widget id value.
    155169     *
    156170     * @param array $id The hCaptcha widget id.
    157171     *
    158      * @return void
    159      */
    160     private static function display_widget( array $id ): void {
     172     * @return string
     173     */
     174    public static function widget_id_value( array $id ): string {
    161175        $id['source']  = (array) ( $id['source'] ?? [] );
    162176        $id['form_id'] = $id['form_id'] ?? 0;
     
    164178        // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
    165179        $encoded_id = base64_encode( wp_json_encode( $id ) );
    166         $widget_id  = $encoded_id . '-' . wp_hash( $encoded_id );
    167 
     180
     181        return $encoded_id . '-' . wp_hash( $encoded_id );
     182    }
     183
     184    /**
     185     * Display widget.
     186     *
     187     * @param array $id The hCaptcha widget id.
     188     *
     189     * @return void
     190     */
     191    private static function display_widget( array $id ): void {
    168192        ?>
    169193        <input
     
    171195                class="<?php echo esc_attr( self::HCAPTCHA_WIDGET_ID ); ?>"
    172196                name="<?php echo esc_attr( self::HCAPTCHA_WIDGET_ID ); ?>"
    173                 value="<?php echo esc_attr( $widget_id ); ?>">
     197                value="<?php echo esc_attr( self::widget_id_value( $id ) ); ?>">
    174198        <?php
    175199    }
  • hcaptcha-for-forms-and-more/trunk/src/php/LearnPress/Login.php

    r3215681 r3233179  
    99
    1010use HCaptcha\Abstracts\LoginBase;
     11use HCaptcha\Helpers\HCaptcha;
     12use WP_Error;
     13use WP_User;
    1114
    1215/**
     
    2427
    2528        add_action( 'login_form', [ $this, 'add_captcha' ] );
    26         add_filter( 'wp_authenticate_user', [ $this, 'login_base_verify' ], PHP_INT_MAX, 2 );
     29        add_filter( 'wp_authenticate_user', [ $this, 'verify' ], 10, 2 );
    2730    }
    2831
     
    3942        parent::add_captcha();
    4043    }
     44
     45    /**
     46     * Verify a login form.
     47     *
     48     * @param WP_User|WP_Error $user     WP_User or WP_Error object
     49     *                                   if a previous callback failed authentication.
     50     * @param string           $password Password to check against the user.
     51     *
     52     * @return WP_User|WP_Error
     53     */
     54    public function verify( $user, string $password ) {
     55        if ( ! $this->is_learn_press_form() ) {
     56            return $user;
     57        }
     58
     59        return $this->login_base_verify( $user, $password );
     60    }
     61
     62    /**
     63     * Whether we process the Learn Press login form.
     64     *
     65     * @return bool
     66     */
     67    private function is_learn_press_form(): bool {
     68        return HCaptcha::did_filter( 'learnpress_login_credentials' );
     69    }
    4170}
  • hcaptcha-for-forms-and-more/trunk/src/php/LearnPress/Register.php

    r3215681 r3233179  
    6868     *
    6969     * @return void
     70     * @noinspection PhpUndefinedFunctionInspection
    7071     */
    7172    public function verify(): void {
  • hcaptcha-for-forms-and-more/trunk/src/php/Main.php

    r3215681 r3233179  
    1818use HCaptcha\AutoVerify\AutoVerify;
    1919use HCaptcha\CF7\Admin;
     20use HCaptcha\CACSP\Compatibility;
    2021use HCaptcha\CF7\CF7;
    2122use HCaptcha\DelayedScript\DelayedScript;
     
    832833                [ 'wp_status', 'login' ],
    833834                '',
    834                 WP\Login::class,
     835                [ WP\Login::class, WP\LoginOut::class ],
    835836            ],
    836837            'Lost Password Form'                   => [
     
    974975                [ CF7::class, Admin::class ],
    975976            ],
     977            'Cookies and Content Security Policy'  => [
     978                [ 'cacsp_status', null ],
     979                'cookies-and-content-security-policy/cookies-and-content-security-policy.php',
     980                [ Compatibility::class ],
     981            ],
    976982            'Divi Comment Form'                    => [
    977983                [ 'divi_status', 'comment' ],
     
    13041310                Tutor\Checkout::class,
    13051311            ],
    1306             'Tutor LMS Login'                      => [
     1312            'Tutor Login'                          => [
    13071313                [ 'tutor_status', 'login' ],
    13081314                'tutor/tutor.php',
    13091315                Tutor\Login::class,
    13101316            ],
    1311             'Tutor LMS LostPassword'               => [
     1317            'Tutor LostPassword'                   => [
    13121318                [ 'tutor_status', 'lost_pass' ],
    13131319                'tutor/tutor.php',
    13141320                Tutor\LostPassword::class,
    13151321            ],
    1316             'Tutor LMS Register'                   => [
     1322            'Tutor Register'                       => [
    13171323                [ 'tutor_status', 'register' ],
    13181324                'tutor/tutor.php',
  • hcaptcha-for-forms-and-more/trunk/src/php/ProfileBuilder/Login.php

    r3114572 r3233179  
    7676        }
    7777
    78         if ( ! $this->is_login_limit_exceeded() ) {
    79             return $user;
    80         }
    81 
    82         $error_message = hcaptcha_verify_post(
    83             self::NONCE,
    84             self::ACTION
    85         );
    86 
    87         if ( null === $error_message ) {
    88             return $user;
    89         }
    90 
    91         $code = array_search( $error_message, hcap_get_error_messages(), true ) ?: 'fail';
    92 
    93         return new WP_Error( $code, $error_message, 400 );
     78        return $this->login_base_verify( $user, $password );
    9479    }
    9580
  • hcaptcha-for-forms-and-more/trunk/src/php/Sendinblue/Sendinblue.php

    r3114572 r3233179  
    6767
    6868        /**
    69          * Filters the HTML containing a form to register it for auto-verification.
     69         * Register a form containing hCaptcha for auto-verification purposes.
    7070         *
    71          * @param string $html HTML content.
     71         * @param string $output HTML content.
    7272         */
    7373        do_action( 'hcap_auto_verify_register', $output );
  • hcaptcha-for-forms-and-more/trunk/src/php/Settings/EventsPage.php

    r3114572 r3233179  
    99
    1010use HCaptcha\Admin\Events\EventsTable;
     11use HCaptcha\Helpers\DB;
    1112use KAGG\Settings\Abstracts\SettingsBase;
    1213
     
    2930
    3031    /**
     32     * Bulk ajax action.
     33     */
     34    public const BULK_ACTION = 'hcaptcha-events-bulk';
     35
     36    /**
    3137     * ListTable instance.
    3238     *
     
    4854     */
    4955    protected $failed;
     56
     57    /**
     58     * Init class hooks.
     59     */
     60    protected function init_hooks(): void {
     61        parent::init_hooks();
     62
     63        add_action( 'wp_ajax_' . self::BULK_ACTION, [ $this, 'bulk_action' ] );
     64    }
    5065
    5166    /**
     
    7792
    7893    /**
    79      * Init class hooks.
    80      */
    81     protected function init_hooks(): void {
    82         parent::init_hooks();
    83 
    84         add_action( 'admin_init', [ $this, 'admin_init' ] );
    85         add_action( 'kagg_settings_header', [ $this, 'date_picker_display' ] );
    86     }
    87 
    88     /**
    8994     * Admin init.
    9095     *
     
    103108
    104109        $this->prepare_chart_data();
     110    }
     111
     112    /**
     113     * Ajax callback for bulk actions.
     114     *
     115     * @return void
     116     */
     117    public function bulk_action(): void {
     118        $this->run_checks( self::BULK_ACTION );
     119
     120        // Nonce is checked by check_ajax_referer() in run_checks().
     121        // phpcs:disable WordPress.Security.NonceVerification.Missing
     122        $bulk = isset( $_POST['bulk'] ) ? sanitize_text_field( wp_unslash( $_POST['bulk'] ) ) : '';
     123        $ids  = isset( $_POST['ids'] )
     124            ? (array) json_decode( sanitize_text_field( wp_unslash( $_POST['ids'] ) ), true )
     125            : [];
     126        // phpcs:enable WordPress.Security.NonceVerification.Missing
     127
     128        if ( 'trash' === $bulk ) {
     129            if ( ! $this->delete_hcaptcha_events( $ids ) ) {
     130                wp_send_json_error( __( 'Failed to delete the selected items.', 'hcaptcha-for-forms-and-more' ) );
     131            }
     132
     133            wp_send_json_success();
     134
     135            // For testing purposes.
     136            return;
     137        }
     138
     139        wp_send_json_error( __( 'Invalid bulk action.', 'hcaptcha-for-forms-and-more' ) );
    105140    }
    106141
     
    136171            self::OBJECT,
    137172            [
     173                'ajaxUrl'      => admin_url( 'admin-ajax.php' ),
     174                'bulkAction'   => self::BULK_ACTION,
     175                'bulkNonce'    => wp_create_nonce( self::BULK_ACTION ),
    138176                'succeed'      => $this->succeed,
    139177                'failed'       => $this->failed,
     
    155193    public function section_callback( array $arguments ): void {
    156194        $this->print_header();
     195
     196        ?>
     197        <div id="hcaptcha-message"></div>
     198        <?php
    157199
    158200        if ( ! $this->allowed ) {
     
    236278        }
    237279    }
     280
     281    /**
     282     * Delete hCaptcha events by IDs.
     283     *
     284     * @param array $ids Array of event IDs to delete.
     285     *
     286     * @return bool
     287     */
     288    private function delete_hcaptcha_events( array $ids ): bool {
     289        global $wpdb;
     290
     291        $table_name = $wpdb->prefix . 'hcaptcha_events';
     292
     293        $in = DB::prepare_in( $ids, '%d' );
     294
     295        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
     296        $result = $wpdb->query(
     297            $wpdb->prepare(
     298            // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     299                "DELETE FROM $table_name WHERE id IN($in)"
     300            )
     301        );
     302
     303        return (bool) $result;
     304    }
    238305}
  • hcaptcha-for-forms-and-more/trunk/src/php/Settings/FormsPage.php

    r3114572 r3233179  
    2929
    3030    /**
     31     * Bulk ajax action.
     32     */
     33    public const BULK_ACTION = 'hcaptcha-forms-bulk';
     34
     35    /**
    3136     * ListTable instance.
    3237     *
     
    4146     */
    4247    protected $served;
     48
     49    /**
     50     * Init class hooks.
     51     */
     52    protected function init_hooks(): void {
     53        parent::init_hooks();
     54
     55        add_action( 'wp_ajax_' . self::BULK_ACTION, [ $this, 'bulk_action' ] );
     56    }
    4357
    4458    /**
     
    7084
    7185    /**
    72      * Init class hooks.
    73      */
    74     protected function init_hooks(): void {
    75         parent::init_hooks();
    76 
    77         add_action( 'admin_init', [ $this, 'admin_init' ] );
    78         add_action( 'kagg_settings_header', [ $this, 'date_picker_display' ] );
    79     }
    80 
    81     /**
    8286     * Admin init.
    8387     *
     
    9498
    9599        $this->prepare_chart_data();
     100    }
     101
     102    /**
     103     * Ajax callback for bulk actions.
     104     *
     105     * @return void
     106     */
     107    public function bulk_action(): void {
     108        $this->run_checks( self::BULK_ACTION );
     109
     110        // Nonce is checked by check_ajax_referer() in run_checks().
     111        // phpcs:disable WordPress.Security.NonceVerification.Missing
     112        $bulk = isset( $_POST['bulk'] ) ? sanitize_text_field( wp_unslash( $_POST['bulk'] ) ) : '';
     113        $ids  = isset( $_POST['ids'] )
     114            ? (array) json_decode( sanitize_text_field( wp_unslash( $_POST['ids'] ) ), true )
     115            : [];
     116        // phpcs:enable WordPress.Security.NonceVerification.Missing
     117
     118        if ( 'trash' === $bulk ) {
     119            if ( ! $this->delete_hcaptcha_events_by_forms( $ids ) ) {
     120                wp_send_json_error( __( 'Failed to delete the selected items.', 'hcaptcha-for-forms-and-more' ) );
     121            }
     122
     123            wp_send_json_success();
     124
     125            // For testing purposes.
     126            return;
     127        }
     128
     129        wp_send_json_error( __( 'Invalid bulk action.', 'hcaptcha-for-forms-and-more' ) );
    96130    }
    97131
     
    127161            self::OBJECT,
    128162            [
     163                'ajaxUrl'     => admin_url( 'admin-ajax.php' ),
     164                'bulkAction'  => self::BULK_ACTION,
     165                'bulkNonce'   => wp_create_nonce( self::BULK_ACTION ),
    129166                'served'      => $this->served,
    130167                'servedLabel' => __( 'Served', 'hcaptcha-for-forms-and-more' ),
     
    144181    public function section_callback( array $arguments ): void {
    145182        $this->print_header();
     183
     184        ?>
     185        <div id="hcaptcha-message"></div>
     186        <?php
    146187
    147188        if ( ! $this->allowed ) {
     
    212253        }
    213254    }
     255
     256    /**
     257     * Delete hCaptcha events by forms.
     258     *
     259     * @param array $ids Array of event IDs to delete.
     260     *
     261     * @return bool
     262     */
     263    private function delete_hcaptcha_events_by_forms( array $ids ): bool {
     264        global $wpdb;
     265
     266        $table_name = $wpdb->prefix . 'hcaptcha_events';
     267        $conditions = [];
     268        $values     = [];
     269
     270        foreach ( $ids as $item ) {
     271            $conditions[] = '(source = %s AND form_id = %d)';
     272            $values[]     = $item['source'];
     273            $values[]     = $item['formId'];
     274        }
     275
     276        $where_clause = implode( ' OR ', $conditions );
     277
     278        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
     279        $result = $wpdb->query(
     280            $wpdb->prepare(
     281            // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
     282                "DELETE FROM $table_name WHERE $where_clause",
     283                ...$values
     284            )
     285        );
     286
     287        return (bool) $result;
     288    }
    214289}
  • hcaptcha-for-forms-and-more/trunk/src/php/Settings/General.php

    r3215681 r3233179  
    116116
    117117    /**
    118      * Check config form id.
     118     * The 'check config' form id.
    119119     */
    120120    public const CHECK_CONFIG_FORM_ID = 'check-config';
     
    581581                ],
    582582                'default' => 'on',
    583                 'helper'  => __( 'Store collected IP and User Agent as hashed values to conform to GDPR requirements.', 'hcaptcha-for-forms-and-more' ),
     583                'helper'  => __( 'Store collected IP and User Agent locally as hashed values to conform to GDPR requirements.', 'hcaptcha-for-forms-and-more' ),
    584584            ],
    585585            'collect_ip'           => [
     
    857857     *
    858858     * @return void
    859      * @noinspection PhpUnusedParameterInspection
    860859     */
    861860    public function check_config(): void {
  • hcaptcha-for-forms-and-more/trunk/src/php/Settings/Integrations.php

    r3215681 r3233179  
    751751        $installed = array_unique( $installed );
    752752
    753         $this->form_fields = $this->sort_fields( $this->form_fields );
    754 
    755         $prefix = self::PREFIX . '-' . $this->section_title() . '-';
    756 
    757753        foreach ( $this->form_fields as $status => &$form_field ) {
    758754            $form_field['installed'] = in_array( $status, $installed, true );
    759             $form_field['section']   = ( ! $form_field['installed'] ) || $form_field['disabled']
    760                 ? self::SECTION_DISABLED
    761                 : self::SECTION_ENABLED;
     755            $form_field['disabled']  = ( ! $form_field['installed'] ) || $form_field['disabled'];
     756        }
     757
     758        unset( $form_field );
     759
     760        $this->form_fields = $this->sort_fields( $this->form_fields );
     761
     762        $prefix = self::PREFIX . '-' . $this->section_title() . '-';
     763
     764        foreach ( $this->form_fields as $status => &$form_field ) {
     765            $form_field['installed'] = in_array( $status, $installed, true );
     766            $form_field['section']   = $form_field['disabled'] ? self::SECTION_DISABLED : self::SECTION_ENABLED;
    762767
    763768            if ( isset( $form_field['label'] ) ) {
     
    16841689
    16851690        if ( is_wp_error( $result ) ) {
    1686             return new WP_Error( $result->get_error_code(), $result->get_error_message() );
     1691            return $result;
    16871692        }
    16881693
    16891694        if ( is_wp_error( $skin->result ) ) {
    1690             return new WP_Error( $skin->result->get_error_code(), $skin->result->get_error_message() );
    1691         }
    1692 
    1693         if ( $skin->get_errors() && $skin->get_errors()->has_errors() ) {
    1694             return new WP_Error( $skin->result->get_error_code(), $skin->result->get_error_message() );
     1695            return $skin->result;
     1696        }
     1697
     1698        $skin_errors = $skin->get_errors();
     1699
     1700        if ( $skin_errors && $skin_errors->has_errors() ) {
     1701            return $skin_errors;
    16951702        }
    16961703
  • hcaptcha-for-forms-and-more/trunk/src/php/Settings/ListPageBase.php

    r3185570 r3233179  
    99
    1010use DateTimeImmutable;
     11use Exception;
    1112
    1213/**
     
    3536     * Base object.
    3637     */
    37     public const OBJECT = 'HCaptchaFlatPickerObject';
     38    public const OBJECT = 'HCaptchaListPageBaseObject';
    3839
    3940    /**
     
    6667     */
    6768    protected $allowed = false;
     69
     70    /**
     71     * Init class hooks.
     72     */
     73    protected function init_hooks(): void {
     74        parent::init_hooks();
     75
     76        add_action( 'admin_init', [ $this, 'admin_init' ] );
     77        add_action( 'kagg_settings_header', [ $this, 'date_picker_display' ] );
     78    }
    6879
    6980    /**
     
    175186            self::OBJECT,
    176187            [
     188                'noAction'  => __( 'Please select a bulk action.', 'hcaptcha-for-forms-and-more' ),
     189                'noItems'   => __( 'Please select at least one item to perform this action on.', 'hcaptcha-for-forms-and-more' ),
     190                'DoingBulk' => __( 'Doing bulk action...', 'hcaptcha-for-forms-and-more' ),
    177191                'delimiter' => self::TIMESPAN_DELIMITER,
    178192                'locale'    => $this->get_language_code(),
     
    222236                        <label for="hcaptcha-datepicker">
    223237                            <input
    224                                 type="text"
    225                                 name="date"
    226                                 tabindex="-1"
    227                                 aria-hidden="true"
    228                                 id="hcaptcha-datepicker"
    229                                 value="<?php echo esc_attr( $value ); ?>">
     238                                    type="text"
     239                                    name="date"
     240                                    tabindex="-1"
     241                                    aria-hidden="true"
     242                                    id="hcaptcha-datepicker"
     243                                    value="<?php echo esc_attr( $value ); ?>">
    230244                        </label>
    231245                    </div>
     
    386400
    387401        if ( (int) $days > 0 ) {
    388             $start_date = $start_date->modify( "-$days day" );
     402            try {
     403                $start_date = $start_date->modify( "-$days day" );
     404            } catch ( Exception $e ) {
     405                // @codeCoverageIgnoreStart
     406                $start_date = $end_date;
     407                // @codeCoverageIgnoreEnd
     408            }
    389409        }
    390410
     
    432452
    433453    /**
    434      * Concatenate given dates into a single string. i.e. "2024-04-16 - 2024-05-16".
     454     * Concatenate given dates into a single string.
     455     * Should be like that: "2024-04-16 - 2024-05-16".
    435456     *
    436457     * @param DateTimeImmutable|mixed $start_date Start date.
  • hcaptcha-for-forms-and-more/trunk/src/php/Tutor/Login.php

    r3215681 r3233179  
    99
    1010use HCaptcha\Abstracts\LoginBase;
     11use HCaptcha\Helpers\HCaptcha;
     12use WP_Error;
     13use WP_User;
    1114
    1215/**
     
    2427
    2528        add_action( 'tutor_login_form_middle', [ $this, 'add_captcha' ] );
    26         add_filter( 'wp_authenticate_user', [ $this, 'login_base_verify' ], PHP_INT_MAX, 2 );
     29        add_filter( 'wp_authenticate_user', [ $this, 'verify' ], 10, 2 );
     30    }
     31
     32    /**
     33     * Verify a login form.
     34     *
     35     * @param WP_User|WP_Error $user     WP_User or WP_Error object
     36     *                                   if a previous callback failed authentication.
     37     * @param string           $password Password to check against the user.
     38     *
     39     * @return WP_User|WP_Error
     40     */
     41    public function verify( $user, string $password ) {
     42        if ( ! $this->is_tutor_login_form() ) {
     43            return $user;
     44        }
     45
     46        return $this->login_base_verify( $user, $password );
     47    }
     48
     49    /**
     50     * Whether we process the Tutor login form.
     51     *
     52     * @return bool
     53     */
     54    private function is_tutor_login_form(): bool {
     55        return HCaptcha::did_filter( 'tutor_login_credentials' );
    2756    }
    2857}
  • hcaptcha-for-forms-and-more/trunk/src/php/WP/Comment.php

    r3114572 r3233179  
    119119        }
    120120
     121        // Override poor IP detection by WP Core and make sure that IP is the same in the 'comments' table and in the 'hcaptcha_events' table.
     122        $comment_data['comment_author_IP'] = hcap_get_user_ip();
     123
    121124        $this->result = hcaptcha_get_verify_message_html( self::NONCE, self::ACTION );
    122125
  • hcaptcha-for-forms-and-more/trunk/src/php/WP/Login.php

    r3114572 r3233179  
    66 */
    77
    8 // phpcs:disable Generic.Commenting.DocComment.MissingShort
    9 /** @noinspection PhpUndefinedNamespaceInspection */
    10 /** @noinspection PhpUndefinedClassInspection */
    11 // phpcs:enable Generic.Commenting.DocComment.MissingShort
    12 
    138namespace HCaptcha\WP;
    149
    1510use HCaptcha\Abstracts\LoginBase;
    16 use WordfenceLS\Controller_WordfenceLS;
    1711
    1812/**
  • hcaptcha-for-forms-and-more/trunk/src/php/WPForms/Form.php

    r3114572 r3233179  
    5656     */
    5757    protected function init_hooks(): void {
     58        if ( ! function_exists( 'wpforms' ) ) {
     59            return;
     60        }
     61
    5862        $this->mode_auto  = hcaptcha()->settings()->is( 'wpforms_status', 'form' );
    5963        $this->mode_embed =
  • hcaptcha-for-forms-and-more/trunk/src/php/includes/functions.php

    r3200161 r3233179  
    2626     * Do not set the default size here.
    2727     * If size is not normal|compact|invisible, it will be taken from plugin settings in HCaptcha::form().
     28     * Same for theme and force.
    2829     */
    2930    $atts = shortcode_atts(
     
    3233            'name'    => HCAPTCHA_NONCE,
    3334            'auto'    => false,
     35            'ajax'    => false,
    3436            'force'   => $hcaptcha_force,
    3537            'theme'   => $hcaptcha_theme,
  • hcaptcha-for-forms-and-more/trunk/src/php/includes/request.php

    r3200161 r3233179  
    138138    $raw_response = wp_remote_post( $url );
    139139
     140    if ( is_wp_error( $raw_response ) ) {
     141        return [
     142            'error' => implode( "\n", $raw_response->get_error_messages() ),
     143        ];
     144    }
     145
    140146    $raw_body = wp_remote_retrieve_body( $raw_response );
    141147
     
    235241            [ 'body' => $params ]
    236242        );
     243
     244        if ( is_wp_error( $raw_response ) ) {
     245            $result      = implode( "\n", $raw_response->get_error_messages() );
     246            $error_codes = $raw_response->get_error_codes();
     247
     248            /** This filter is documented above. */
     249            return apply_filters( 'hcap_verify_request', $result, $error_codes );
     250        }
    237251
    238252        $raw_body = wp_remote_retrieve_body( $raw_response );
     
    348362if ( ! function_exists( 'hcaptcha_get_verify_message_html' ) ) {
    349363    /**
    350      * Get verify message html.
     364     * Get verify message HTML.
    351365     *
    352366     * @param string $nonce_field_name  Nonce field name.
  • hcaptcha-for-forms-and-more/trunk/vendor/autoload.php

    r3215681 r3233179  
    2323require_once __DIR__ . '/composer/autoload_real.php';
    2424
    25 return ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7::getLoader();
     25return ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18::getLoader();
  • hcaptcha-for-forms-and-more/trunk/vendor/composer/InstalledVersions.php

    r3215681 r3233179  
    3232     */
    3333    private static $installed;
     34
     35    /**
     36     * @var bool
     37     */
     38    private static $installedIsLocalDir;
    3439
    3540    /**
     
    310315        self::$installed = $data;
    311316        self::$installedByVendor = array();
     317
     318        // when using reload, we disable the duplicate protection to ensure that self::$installed data is
     319        // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
     320        // so we have to assume it does not, and that may result in duplicate data being returned when listing
     321        // all installed packages for example
     322        self::$installedIsLocalDir = false;
    312323    }
    313324
     
    326337
    327338        if (self::$canGetVendors) {
     339            $selfDir = strtr(__DIR__, '\\', '/');
    328340            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
     341                $vendorDir = strtr($vendorDir, '\\', '/');
    329342                if (isset(self::$installedByVendor[$vendorDir])) {
    330343                    $installed[] = self::$installedByVendor[$vendorDir];
     
    334347                    self::$installedByVendor[$vendorDir] = $required;
    335348                    $installed[] = $required;
    336                     if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
     349                    if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
    337350                        self::$installed = $required;
    338                         $copiedLocalDir = true;
     351                        self::$installedIsLocalDir = true;
    339352                    }
     353                }
     354                if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
     355                    $copiedLocalDir = true;
    340356                }
    341357            }
  • hcaptcha-for-forms-and-more/trunk/vendor/composer/autoload_classmap.php

    r3215681 r3233179  
    1414    'HCaptcha\\Admin\\Events\\EventsTable' => $baseDir . '/src/php/Admin/Events/EventsTable.php',
    1515    'HCaptcha\\Admin\\Events\\FormsTable' => $baseDir . '/src/php/Admin/Events/FormsTable.php',
     16    'HCaptcha\\Admin\\Events\\TableBase' => $baseDir . '/src/php/Admin/Events/TableBase.php',
    1617    'HCaptcha\\Admin\\Notifications' => $baseDir . '/src/php/Admin/Notifications.php',
    1718    'HCaptcha\\Admin\\PluginStats' => $baseDir . '/src/php/Admin/PluginStats.php',
     
    3637    'HCaptcha\\BuddyPress\\CreateGroup' => $baseDir . '/src/php/BuddyPress/CreateGroup.php',
    3738    'HCaptcha\\BuddyPress\\Register' => $baseDir . '/src/php/BuddyPress/Register.php',
     39    'HCaptcha\\CACSP\\Compatibility' => $baseDir . '/src/php/CACSP/Compatibility.php',
    3840    'HCaptcha\\CF7\\Admin' => $baseDir . '/src/php/CF7/Admin.php',
    3941    'HCaptcha\\CF7\\Base' => $baseDir . '/src/php/CF7/Base.php',
     
    7577    'HCaptcha\\GravityForms\\Form' => $baseDir . '/src/php/GravityForms/Form.php',
    7678    'HCaptcha\\HTMLForms\\Form' => $baseDir . '/src/php/HTMLForms/Form.php',
     79    'HCaptcha\\Helpers\\DB' => $baseDir . '/src/php/Helpers/DB.php',
    7780    'HCaptcha\\Helpers\\HCaptcha' => $baseDir . '/src/php/Helpers/HCaptcha.php',
    7881    'HCaptcha\\Helpers\\Minify\\CSS' => $baseDir . '/src/php/Helpers/Minify/CSS.php',
     
    173176    'HCaptcha\\WP\\Comment' => $baseDir . '/src/php/WP/Comment.php',
    174177    'HCaptcha\\WP\\Login' => $baseDir . '/src/php/WP/Login.php',
     178    'HCaptcha\\WP\\LoginOut' => $baseDir . '/src/php/WP/LoginOut.php',
    175179    'HCaptcha\\WP\\LostPassword' => $baseDir . '/src/php/WP/LostPassword.php',
    176180    'HCaptcha\\WP\\PasswordProtected' => $baseDir . '/src/php/WP/PasswordProtected.php',
  • hcaptcha-for-forms-and-more/trunk/vendor/composer/autoload_real.php

    r3215681 r3233179  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7
     5class ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18
    66{
    77    private static $loader;
     
    2323        }
    2424
    25         spl_autoload_register(array('ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7', 'loadClassLoader'), true, true);
     25        spl_autoload_register(array('ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18', 'loadClassLoader'), true, true);
    2626        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    27         spl_autoload_unregister(array('ComposerAutoloaderInit0c3f450f81223af0ef151675e6b814b7', 'loadClassLoader'));
     27        spl_autoload_unregister(array('ComposerAutoloaderInit5b9e71c5ecc4233f8a6f35918bdc1f18', 'loadClassLoader'));
    2828
    2929        require __DIR__ . '/autoload_static.php';
    30         call_user_func(\Composer\Autoload\ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::getInitializer($loader));
     30        call_user_func(\Composer\Autoload\ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::getInitializer($loader));
    3131
    3232        $loader->setClassMapAuthoritative(true);
  • hcaptcha-for-forms-and-more/trunk/vendor/composer/autoload_static.php

    r3215681 r3233179  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInit0c3f450f81223af0ef151675e6b814b7
     7class ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18
    88{
    99    public static $prefixLengthsPsr4 = array (
     
    4242        'HCaptcha\\Admin\\Events\\EventsTable' => __DIR__ . '/../..' . '/src/php/Admin/Events/EventsTable.php',
    4343        'HCaptcha\\Admin\\Events\\FormsTable' => __DIR__ . '/../..' . '/src/php/Admin/Events/FormsTable.php',
     44        'HCaptcha\\Admin\\Events\\TableBase' => __DIR__ . '/../..' . '/src/php/Admin/Events/TableBase.php',
    4445        'HCaptcha\\Admin\\Notifications' => __DIR__ . '/../..' . '/src/php/Admin/Notifications.php',
    4546        'HCaptcha\\Admin\\PluginStats' => __DIR__ . '/../..' . '/src/php/Admin/PluginStats.php',
     
    6465        'HCaptcha\\BuddyPress\\CreateGroup' => __DIR__ . '/../..' . '/src/php/BuddyPress/CreateGroup.php',
    6566        'HCaptcha\\BuddyPress\\Register' => __DIR__ . '/../..' . '/src/php/BuddyPress/Register.php',
     67        'HCaptcha\\CACSP\\Compatibility' => __DIR__ . '/../..' . '/src/php/CACSP/Compatibility.php',
    6668        'HCaptcha\\CF7\\Admin' => __DIR__ . '/../..' . '/src/php/CF7/Admin.php',
    6769        'HCaptcha\\CF7\\Base' => __DIR__ . '/../..' . '/src/php/CF7/Base.php',
     
    103105        'HCaptcha\\GravityForms\\Form' => __DIR__ . '/../..' . '/src/php/GravityForms/Form.php',
    104106        'HCaptcha\\HTMLForms\\Form' => __DIR__ . '/../..' . '/src/php/HTMLForms/Form.php',
     107        'HCaptcha\\Helpers\\DB' => __DIR__ . '/../..' . '/src/php/Helpers/DB.php',
    105108        'HCaptcha\\Helpers\\HCaptcha' => __DIR__ . '/../..' . '/src/php/Helpers/HCaptcha.php',
    106109        'HCaptcha\\Helpers\\Minify\\CSS' => __DIR__ . '/../..' . '/src/php/Helpers/Minify/CSS.php',
     
    201204        'HCaptcha\\WP\\Comment' => __DIR__ . '/../..' . '/src/php/WP/Comment.php',
    202205        'HCaptcha\\WP\\Login' => __DIR__ . '/../..' . '/src/php/WP/Login.php',
     206        'HCaptcha\\WP\\LoginOut' => __DIR__ . '/../..' . '/src/php/WP/LoginOut.php',
    203207        'HCaptcha\\WP\\LostPassword' => __DIR__ . '/../..' . '/src/php/WP/LostPassword.php',
    204208        'HCaptcha\\WP\\PasswordProtected' => __DIR__ . '/../..' . '/src/php/WP/PasswordProtected.php',
     
    212216    {
    213217        return \Closure::bind(function () use ($loader) {
    214             $loader->prefixLengthsPsr4 = ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::$prefixLengthsPsr4;
    215             $loader->prefixDirsPsr4 = ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::$prefixDirsPsr4;
    216             $loader->classMap = ComposerStaticInit0c3f450f81223af0ef151675e6b814b7::$classMap;
     218            $loader->prefixLengthsPsr4 = ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::$prefixLengthsPsr4;
     219            $loader->prefixDirsPsr4 = ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::$prefixDirsPsr4;
     220            $loader->classMap = ComposerStaticInit5b9e71c5ecc4233f8a6f35918bdc1f18::$classMap;
    217221
    218222        }, null, ClassLoader::class);
  • hcaptcha-for-forms-and-more/trunk/vendor/composer/installed.php

    r3215681 r3233179  
    22    'root' => array(
    33        'name' => 'hcaptcha/hcaptcha-wordpress-plugin',
    4         'pretty_version' => '4.9.0',
    5         'version' => '4.9.0.0',
    6         'reference' => 'bcf1d7e3058f194fdf32b0c257caf651ab195121',
     4        'pretty_version' => '4.10.0',
     5        'version' => '4.10.0.0',
     6        'reference' => '3f3d675e6a0c12404a0a7aa20b4472b5d37ea88d',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
     
    1212    'versions' => array(
    1313        'hcaptcha/hcaptcha-wordpress-plugin' => array(
    14             'pretty_version' => '4.9.0',
    15             'version' => '4.9.0.0',
    16             'reference' => 'bcf1d7e3058f194fdf32b0c257caf651ab195121',
     14            'pretty_version' => '4.10.0',
     15            'version' => '4.10.0.0',
     16            'reference' => '3f3d675e6a0c12404a0a7aa20b4472b5d37ea88d',
    1717            'type' => 'wordpress-plugin',
    1818            'install_path' => __DIR__ . '/../../',
Note: See TracChangeset for help on using the changeset viewer.