From 790296fd0f5ba56f6803e720588ac0ad66133955 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Fri, 8 May 2026 13:53:08 +0300 Subject: [PATCH 01/11] Add capability filter to roles management interface - Introduced a search input for filtering capabilities in the roles management tab. - Implemented functionality to display the count of matching capabilities and handle empty states. - Enhanced JavaScript to cache capability text for efficient filtering and improve user experience. - Updated CSS for styling the new filter input and its associated elements. --- admin/class-cap-tabs.php | 12 ++++ admin/functions-admin.php | 5 ++ css/admin.css | 37 +++++++++++++ css/admin.min.css | 2 +- js/edit-role.js | 112 ++++++++++++++++++++++++++++++++++++++ js/edit-role.min.js | 2 +- js/import-export.min.js | 1 + js/settings.min.js | 2 +- 8 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 js/import-export.min.js diff --git a/admin/class-cap-tabs.php b/admin/class-cap-tabs.php index b441d01c..da9dee15 100644 --- a/admin/class-cap-tabs.php +++ b/admin/class-cap-tabs.php @@ -195,6 +195,18 @@ public function display() { ?>
+
+ + + +
+
tab_nav(); ?>
diff --git a/admin/functions-admin.php b/admin/functions-admin.php index 65067a36..7d849fbf 100644 --- a/admin/functions-admin.php +++ b/admin/functions-admin.php @@ -59,6 +59,11 @@ function members_admin_register_scripts() { 'label_grant_cap' => esc_html__( 'Grant %s capability', 'members' ), 'label_deny_cap' => esc_html__( 'Deny %s capability', 'members' ), 'ays_delete_role' => esc_html__( 'Are you sure you want to delete this role? This is a permanent action and cannot be undone.', 'members' ), + /* translators: %d: number of capabilities matching the filter. */ + 'filter_matches' => esc_html__( '%d match', 'members' ), + /* translators: %d: number of capabilities matching the filter. */ + 'filter_matches_plural' => esc_html__( '%d matches', 'members' ), + 'filter_no_matches' => esc_html__( 'No capabilities match your filter.', 'members' ), 'hidden_caps' => members_get_hidden_caps(), ); diff --git a/css/admin.css b/css/admin.css index d829714b..ae180f1a 100644 --- a/css/admin.css +++ b/css/admin.css @@ -1145,6 +1145,43 @@ body.admin_page_members-about #wpbody-content { padding: 0; } +/* Capability filter (search) input above the tabs. */ + +.members-cap-filter { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 12px; + background: #fff; + border-bottom: 1px solid #e5e5e5; +} + +.members-cap-filter .members-cap-filter-input { + flex: 1 1 auto; + width: 100%; + height: 32px; + line-height: 1; + padding: 0 10px; + box-sizing: border-box; +} + +.members-cap-filter .members-cap-filter-count { + color: #666; + font-size: 12px; + font-style: italic; +} + +.members-cap-filter-empty td { + padding: 16px 12px; + color: #666; + font-style: italic; + text-align: center; +} + +.members-cap-filter-empty:nth-child(even) { + background: transparent; +} + /* Tabs wrapper. */ .members-cap-tabs, diff --git a/css/admin.min.css b/css/admin.min.css index 5788c9f4..d16dfb49 100644 --- a/css/admin.min.css +++ b/css/admin.min.css @@ -1 +1 @@ -#members-cp h2.hndle,#members-cp-side h2.hndle{border-bottom:none !important;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}#members-cp h2.hndle:before,#members-cp-side h2.hndle:before{content:url("data:image/svg+xml,%3Csvg width='15px' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='users-cog' class='svg-inline--fa fa-users-cog fa-w-20' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z'%3E%3C/path%3E%3C/svg%3E");margin-right:5px}#members-cp-side .postbox-header{border-bottom:none !important}#members-cp-side .handle-actions .handle-order-higher,#members-cp-side .handle-actions .handle-order-lower{display:none}#members-cp-side .handle-actions .handlediv{position:absolute;right:5px}.members-upgrade-header{text-align:center;padding:5px}.members-upgrade-header a{color:#f59431}.memberpress-paid-memberships{background-color:#f5f5f5;padding:50px 10px;text-align:center}.memberpress-paid-memberships a{background-color:#0e4598;display:inline-block;padding:10px 20px;border-radius:300px;color:#fff;text-decoration:none;margin-top:20px}#members-cp-side .members-tabs{position:relative}#members-cp-side .members-tab-nav{background-color:transparent;margin-bottom:20px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title{width:33.333%;height:50px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title a{border:0}#members-cp-side .members-tab-content h3{font-weight:bold;font-size:15px;margin-top:0;color:#000;margin-bottom:10px}#members-cp-side .members-tab-content .memberpress-paid-memberships{text-align:left;padding:20px}#members-cp-side .members-tab-content .memberpress-paid-memberships a{display:block;text-align:center}#members-cp-side .members-tabs .members-tab-nav li a,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a i{color:#555}#members-cp-side .members-tabs .members-tab-nav li a svg,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a svg{fill:#555}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a{background-color:transparent;border-bottom:2px solid #3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a i{color:#3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a svg{fill:#3582ae}.members-tab-title svg,.members-tab-title[aria-selected="false"] svg{fill:#0073aa}.members-tab-title[aria-selected="true"] svg{fill:#555}#wpcontent #members-admin-header{margin-left:-20px;padding:0 28px 0 22px;background-color:#0b1220;background-image:radial-gradient(circle at 12% 35%,rgba(14,69,152,0.45),transparent 55%),radial-gradient(circle at 90% 85%,rgba(245,148,49,0.14),transparent 60%);background-repeat:no-repeat;min-height:56px;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#wpcontent #members-admin-header img.members-logo{height:42px;display:block}#wpcontent #members-admin-header .members-by-mp{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;margin-left:auto;text-decoration:none;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:opacity .15s ease;transition:opacity .15s ease}#wpcontent #members-admin-header .members-by-mp:hover,#wpcontent #members-admin-header .members-by-mp:focus{opacity:.75;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}#wpcontent #members-admin-header .members-by-label{color:#94a3b8;font-size:12px;font-weight:500}#wpcontent #members-admin-header img.members-mp-logo{height:18px;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:36px;height:36px;padding:0;margin:0 0 0 18px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);border-radius:8px;color:#fff;cursor:pointer;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .15s ease,border-color .15s ease;transition:background .15s ease,border-color .15s ease;line-height:1;vertical-align:middle;min-height:0;text-decoration:none}#wpcontent #members-admin-header #membersAdminHeaderNotifications:hover,#wpcontent #members-admin-header #membersAdminHeaderNotifications:focus{background:rgba(255,255,255,0.12);border-color:rgba(255,255,255,0.24);color:#fff;-webkit-box-shadow:none;box-shadow:none;outline:0}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg{width:16px;height:auto;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg path{fill:#e2e8f0}#wpcontent #members-admin-header #membersAdminHeaderNotifications .members-notifications-count{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;border-radius:999px;background:#f59431;color:#0b1220;font-size:10px;font-weight:700;line-height:16px;text-align:center;border:1.5px solid #0b1220;-webkit-box-sizing:content-box;box-sizing:content-box}.members-upgrade-header #close-members-upgrade-header{position:absolute;right:20px;top:3px}.members-upgrade-header #close-members-upgrade-header:hover{cursor:pointer}.memberpress-welcome-panel.welcome-panel{margin-top:20px;padding:20px 28px;background:#fff;border-radius:10px;min-height:0}.memberpress-welcome-panel.welcome-panel .welcome-panel-content{min-height:0;height:auto}.members-about{--ink:#0f172a;--ink-soft:#334155;--ink-muted:#64748b;--mp-blue:#0e4598;--mp-teal:#3582ae;--mp-orange:#f59431;--rule:#e5e7eb;--paper:#fbfaf7;--paper-soft:#f3efe6;--paper-line:#e8e3d5;--display-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--sans-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}body.members_page_members-about #wpbody-content,body.toplevel_page_members-about #wpbody-content,body.admin_page_members-about #wpbody-content{background:var(--paper)}.members-about.wrap{max-width:1120px;margin:0 auto;padding:48px 24px 80px;color:var(--ink);font-family:var(--sans-font)}.members-about__hero{display:grid;grid-template-columns:minmax(0,1fr) 200px;grid-template-areas:"head mark" "body mark";gap:32px 56px;-webkit-box-align:start;-ms-flex-align:start;align-items:start;padding-bottom:64px;border-bottom:1px solid var(--paper-line)}.members-about__hero-head{grid-area:head}.members-about__body{grid-area:body}.members-about__mark{grid-area:mark;align-self:start}.members-about__eyebrow{display:inline-block;font-family:var(--sans-font);font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-muted);padding-bottom:18px}.members-about__title{font-family:var(--display-font);font-weight:900;font-size:clamp(40px,5.5vw,64px);line-height:1;letter-spacing:-0.035em;color:var(--ink);margin:0}.members-about__title em{font-style:normal;font-weight:900;color:var(--mp-blue)}.members-about__title-dot{color:var(--mp-blue);font-style:normal;font-weight:900}.members-about__body{max-width:60ch;font-size:15.5px;line-height:1.62;color:var(--ink-soft)}.members-about__body p{margin:0 0 14px}.members-about__body p:last-child{margin-bottom:0}.members-about__lead{font-family:var(--sans-font);font-weight:500;font-size:17px;line-height:1.5;color:var(--ink);margin-bottom:24px !important;padding-left:18px;border-left:2px solid var(--mp-blue)}.members-about__body a,.members-about__lead a{color:var(--mp-blue);text-decoration:none;background-image:-webkit-gradient(linear,left top,left bottom,from(currentColor),to(currentColor));background-image:linear-gradient(currentColor,currentColor);background-size:100% 1px;background-position:0 100%;background-repeat:no-repeat;padding-bottom:1px;-webkit-transition:color .2s ease,background-size .2s ease;transition:color .2s ease,background-size .2s ease}.members-about__body a:hover,.members-about__lead a:hover{color:var(--mp-orange)}.members-about__body em,.members-about__lead em{font-style:normal;font-weight:700;color:var(--mp-blue)}.members-about__mark{padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(15,23,42,0.03);box-shadow:0 1px 2px rgba(15,23,42,0.03);-webkit-transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__mark:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px);-webkit-box-shadow:0 8px 20px rgba(15,23,42,0.08);box-shadow:0 8px 20px rgba(15,23,42,0.08)}.members-about__mark a{display:block;-webkit-box-shadow:none !important;box-shadow:none !important;text-decoration:none}.members-about__mark img{display:block;width:100%;height:auto;max-width:160px;margin:0 auto}.members-about__products{padding-top:56px}.members-about__products-head{margin-bottom:28px;text-align:center}.members-about__products-head h3{font-family:var(--display-font);font-weight:700;font-size:15px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-muted);margin:0}.members-about__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.members-about__card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:6px;-webkit-transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__card:hover{-webkit-transform:translateY(-3px);transform:translateY(-3px);-webkit-box-shadow:0 12px 28px rgba(15,23,42,0.08);box-shadow:0 12px 28px rgba(15,23,42,0.08);border-color:rgba(14,69,152,0.2)}.members-about__card-head{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:14px;margin-bottom:14px}.members-about__card-icon{-webkit-box-flex:0;-ms-flex:0 0 44px;flex:0 0 44px;width:44px;height:44px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:var(--paper-soft);border-radius:10px;overflow:hidden}.members-about__card-icon img{display:block;max-width:32px;max-height:32px;width:auto;height:auto}.members-about__card-title{margin:0;font-family:var(--display-font);font-weight:700;font-size:17px;line-height:1.2;letter-spacing:-0.01em;color:var(--ink)}.members-about__card-title a{color:inherit;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.members-about__card-title a:hover{color:var(--mp-blue)}.members-about__card-desc{-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 0 24px;font-size:14px;line-height:1.55;color:var(--ink-soft)}.members-about__card-foot{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;gap:16px;padding-top:16px;border-top:1px solid var(--paper-line)}.members-about__status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted)}.members-about__status::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}.members-about__status.is-active{color:#10b981}.members-about__status.is-inactive{color:var(--mp-orange)}.members-about__status.is-missing{color:var(--ink-muted)}.members-about__cta{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:8px 14px;font-size:13px;font-weight:600;letter-spacing:.01em;border-radius:4px;text-decoration:none;border:1px solid transparent;-webkit-transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease,-webkit-transform .15s ease;-webkit-box-shadow:none;box-shadow:none}.members-about__cta:focus,.members-about__cta:focus-visible{outline:2px solid var(--mp-blue);outline-offset:2px;-webkit-box-shadow:none;box-shadow:none}.members-about__cta.is-primary{background:var(--mp-blue);color:#fff}.members-about__cta.is-primary:hover{background:#093374;color:#fff;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.members-about__cta.is-secondary{background:transparent;color:var(--ink);border-color:var(--rule)}.members-about__cta.is-secondary:hover{border-color:var(--ink);background:#fff;color:var(--ink)}.members-about__cta svg{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.members-about__cta:hover svg{-webkit-transform:translate(1px,-1px);transform:translate(1px,-1px)}@media(max-width:900px){.members-about__hero{grid-template-columns:1fr;grid-template-areas:"head" "body" "mark";gap:24px}.members-about__mark{max-width:160px}.members-about__grid{grid-template-columns:1fr}}.memberpress-welcome-panel.welcome-panel:before{background:0}.memberpress-welcome-panel.welcome-panel .about-description{margin:20px 0}.memberpress-welcome-panel.welcome-panel-content{margin:0}.memberpress-welcome-panel.welcome-panel-content .mp-logo-wrap>a{display:block}@media screen and (min-width:870px){.members_page_members-settings .members-short-p{max-width:612px;margin-left:auto;margin-right:auto}.members_page_members-settings .welcome-panel-content{text-align:center}}.members_page_members-settings .welcome-panel .button.button-hero{margin-left:auto;margin-right:auto}.members_page_members-settings .members-svg-wrap{display:inline-block;margin:0 auto 20px}@media screen and (max-width:870px){.members_page_members-settings .welcome-panel{padding:20px}.members_page_members-settings .members-svg-wrap{float:left;margin-right:28px}.admin_page_members-settings.rtl .members-svg-wrap{float:right;margin-right:0;margin-left:28px}}.members_page_members-settings .members-svg-link{display:table-cell;text-align:center;width:128px;height:128px;background:#363b3f;color:#fff;padding:24px 16px 16px;border-radius:50%;-webkit-box-sizing:border-box;box-sizing:border-box;border:4px solid #fff;-webkit-box-shadow:0 0 0 4px #363b3f;box-shadow:0 0 0 4px #363b3f}.members_page_members-settings .members-svg-link svg{max-width:84px;max-height:64px;width:auto;height:auto}.members-addons{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:20px;grid-column-gap:20px}.members-addons .plugin-card{margin:0}.members-addons .plugin-card-top{width:100%}.members-addon{width:100%;position:relative;float:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-addon .desc{margin-bottom:80px}.addon-activate{text-align:center;border:1px solid #ddd;border-radius:3px;padding:5px 10px 10px;display:inline-block;width:100px;position:absolute;right:20px;bottom:20px}.activate-toggle:hover{cursor:pointer}.activate-toggle svg{max-width:20px;position:relative;top:5px}.activate-toggle svg{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.activate-toggle svg.active{-webkit-transform:rotate(0);transform:rotate(0)}.activate-toggle svg path{fill:#ccc}.activate-toggle svg.active path{fill:#8cbd5a}.activate-toggle.processing{cursor:not-allowed;pointer-events:none;opacity:.5}.activate-toggle .action-label{display:inline-block;width:50px;text-align:left}.mepr_dummy_txns{-webkit-filter:blur(3px);filter:blur(3px);position:absolute;top:0;left:0;width:100%;z-index:5;pointer-events:none}.mepr_dummy_txns::after{background-color:rgba(0,0,0,.2);position:absolute;top:0;left:0;width:100%;height:100%;z-index:6}.mepr-upgrade-table{position:relative}.mepr-upgrade-table .mepr-upgrade{position:relative;top:100px;z-index:10;background:rgba(0,0,0,.2);width:100%;height:100%;max-width:600px;margin:0 auto;-webkit-box-shadow:0 0 30px #ccc;box-shadow:0 0 30px #ccc}.mepr-upgrade-content{background-color:#fff;padding:20px;text-align:center}.mepr-upgrade-content h2{font-size:24px}.mepr-upgrade-content h4{font-size:18px}.mepr-upgrade-content .features{display:grid;grid-template-columns:1fr 1fr;grid-column-gap:30px;grid-row-gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:left;padding:10px}.features li:before{content:"\f147";font-family:dashicons;color:green;font-size:20px;position:relative;top:4px;margin-right:10px}.mepr-upgrade-cta{text-align:center;background-color:#f2f2f2;padding:20px}.mepr-upgrade-cta .mepr-cta-button{display:block;max-width:300px;margin:0 auto 20px;background-color:#fd9c27;color:#fff;padding:15px;font-size:18px;font-weight:bold;text-decoration:none;border-radius:300px}.members-plugin-card.plugin-card:nth-child(even){margin-right:inherit}.members-plugin-card.plugin-card:nth-child(odd){clear:none;margin-left:inherit}.members-plugin-card.plugin-card .plugin-card-top{min-height:0;padding:30px 20px}.members-plugin-card.plugin-card .plugin-icon{top:30px}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{font-weight:bold}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .active{color:#8cbd5a}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .inactive{color:red}.members-plugin-card.plugin-card .plugin-icon{width:64px;height:auto}.plugin-icon-small{width:32px;height:auto}.members-plugin-card.plugin-card .name,.members-plugin-card.plugin-card .desc{margin-right:0;margin-left:84px}.members-addons .plugin-card .name,.members-addons .plugin-card .desc p{margin-right:0}@media screen and (max-width:1100px){.members-addons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}@media screen and (max-width:600px){.members_page_members-settings .members-svg-link{width:64px;height:64px}.members_page_members-settings .members-svg-link svg{position:absolute;top:14px;left:15px;max-width:30px;max-height:30px}.members_page_members-settings .plugin-card-members-edd-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-acf-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-givewp-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-meta-box-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-woocommerce-integration .members-svg-link svg{top:10px;left:8px;max-width:40px;max-height:40px}.members_page_members-settings .plugin-card-members-block-permissions .members-svg-link svg,.members_page_members-settings .plugin-card-members-role-hierarchy .members-svg-link svg{left:14px}.members-addons .plugin-card .desc>p,.members-addons .plugin-card .name{margin-left:84px}}.memberpress-about .welcome-panel-column-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:40px;padding:0;margin:0}.memberpress-about .mp-desc p{font-size:13px;line-height:1.6;color:#334155;margin:0 0 12px}.memberpress-about .mp-desc p:first-child{font-size:15px;font-weight:600;color:#0f172a;margin-top:0;margin-bottom:14px}.memberpress-about .mp-desc p:last-child{margin-bottom:0}.memberpress-about .mp-logo-wrap{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.memberpress-about .mp-logo{display:block;max-width:220px;height:auto;margin:0}.members-about-addons{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-column-gap:20px}.members-about-addons .members-plugin-card{margin:0;width:100%}.members-about-addons .members-plugin-card .plugin-icon{position:static;width:auto;height:28px;max-width:40px;-o-object-fit:contain;object-fit:contain;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;display:block}.members-about-addons .members-plugin-card .name,.members-about-addons .members-plugin-card .desc{margin-left:0}.members-about-addons .members-plugin-card .plugin-card-top{padding:20px}.members-about-addons .members-plugin-card .name h3{margin:0 0 10px;min-height:0;height:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;line-height:1.2}.members-about-addons .members-plugin-card .name h3 a{text-decoration:none;line-height:1.2}.members-about-addons .members-plugin-card .plugin-card-bottom{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:1099px){.members-about-addons{grid-template-columns:1fr;grid-row-gap:20px}}@media screen and (min-width:1100px) and (max-width:1600px){.members-about-addons .members-plugin-card{float:none;width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.members-plugin-card.plugin-card .desc{margin-left:0;margin-top:50px}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{float:none}.members-plugin-card.plugin-card .plugin-card-bottom .column-updated{float:none;width:auto}}@media screen and (max-width:1200px){.welcome-panel .welcome-panel-column-container{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;gap:0;padding:0}.memberpress-about .mp-logo{margin:0 0 20px}}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}@media only screen and (min-width:783px){.members_page_roles .column-users,.members_page_roles .column-granted_caps,.members_page_roles .column-denied_caps{width:100px;text-align:center}}.members-title-div #titlewrap input{padding:0 8px;font-size:1.7em;line-height:normal;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}.members-title-div input[name="role"]{font-size:13px;height:22px;margin:0;width:16em}#tabcapsdiv{margin-top:1em}#tabcapsdiv>.hndle{padding:10px;border-bottom:1px solid #eee}#tabcapsdiv .inside,#members-cp .inside{margin:0;padding:0}.members-cap-tabs,.members-tabs{overflow:hidden;background:#fff;background:-webkit-gradient(linear,left top,right top,from(#fafafa),color-stop(20%,#fafafa),color-stop(20%,#fff),to(#fff));background:linear-gradient(90deg,#fafafa 0,#fafafa 20%,#fff 20%,#fff 100%)}@media only screen and (max-width:782px){.members-cap-tabs,.members-tabs{background:linear-gradient(90deg,#fafafa 0,#fafafa 48px,#fff 48px,#fff 100%)}}.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{position:relative;float:left;list-style:none;width:20%;line-height:1em;margin:0 0 -1px 0;padding:0;background-color:#fafafa;border-right:1px solid #eee;-webkit-box-sizing:border-box;box-sizing:border-box}.members-cap-tabs .members-tab-nav li,.members-tabs .members-tab-nav li{display:block;position:relative;margin:0;padding:0;line-height:20px}.members-cap-tabs .members-tab-nav li a,.members-tabs .members-tab-nav li a{display:block;margin:0;padding:10px;line-height:20px !important;text-decoration:none;border-bottom:1px solid #eee;-webkit-box-shadow:none;box-shadow:none}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{line-height:20px;margin-right:3px}.members-cap-tabs .members-tab-nav li[aria-selected="true"] a,.members-tabs .members-tab-nav li[aria-selected="true"] a{position:relative;font-weight:bold;color:#555;background-color:#e0e0e0}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{width:48px}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}.members-tab-nav li .dashicons::before,.members-tab-nav li .dashicons::before{width:24px;height:24px}.members-tab-nav li .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{float:left;width:80%;margin-left:-1px}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{width:calc(100% - 48px)}}#members-cp .members-tab-content{padding:10px;border-left:1px solid #e5e5e5}.members-roles-select th,.members-roles-select td{width:190px;overflow:hidden}.members-roles-select .check-all-th{text-align:center}.members-roles-select .check-all-th label{padding-left:5px}@media only screen and (min-width:850px){#side-sortables .members-tabs{background:#fff}#side-sortables .members-tabs .members-tab-wrap{width:100%}#side-sortables .members-tabs .members-tab-nav{display:table;width:100%}#side-sortables .members-tabs .members-tab-nav li{display:table-cell;text-align:center;border-right:1px solid #eee}#side-sortables .members-tabs .members-tab-nav li:last-of-type{border-right:0}#side-sortables .members-tabs .members-tab-nav li a{padding:10px 0}#side-sortables .members-tabs .members-tab-nav .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}#side-sortables .members-tabs .members-tab-nav .dashicons::before{width:24px;height:24px}#side-sortables .members-tabs .members-tab-nav .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-tabs .members-tabs-label{display:block !important;font-weight:bold;display:inline-block;margin-bottom:4px}.members-tabs .butterbean-control-checkbox .members-tabs-label{display:inline !important}.members-tabs .members-tabs-description{display:block;font-style:italic;margin-top:4px}.members-tabs .members-tabs-label+.members-tabs-description{margin-top:0;margin-bottom:4px}#tabcapsdiv table{border-right:0;border-top:0;border-bottom:0}#tabcapsdiv table td,#tabcapsdiv table th{padding:10px;padding-bottom:10px;border-bottom:1px solid #eee;font-size:13px;line-height:20px}#tabcapsdiv table td{padding:9px}#tabcapsdiv tbody tr:last-of-type td{border-bottom:0}#tabcapsdiv tfoot th{border-color:#eee}@media only screen and (max-width:782px){#tabcapsdiv table td,#tabcapsdiv table th{line-height:24px}}.members-roles-select .column-grant,.members-roles-select .column-deny{width:70px !important;text-align:left;display:table-cell !important;clear:none !important}.members-roles-select thead th,.members-roles-select tfoot th{padding:9px !important}.members-roles-select .column-grant input,.members-roles-select .column-deny input{margin:0 5px 0 0;vertical-align:middle}.members-roles-select tbody tr:nth-child(even){background:#f2f2f2}.members-cap-tabs button{display:inline;margin:-4px;line-height:inherit;padding:4px 8px;border:1px solid transparent;background:transparent;border-radius:0;outline:0;-webkit-transition:all .25s ease-out;transition:all .25s ease-out}.members-cap-tabs button:hover,.members-cap-tabs button:focus{border-color:#eee;background:#fafafa;cursor:pointer}.members-cap-tabs button:active{color:#0073aa;border-color:#0073aa}.members-cap-tabs button+.dashicons{display:none;margin-top:1px;margin-bottom:-1px;line-height:inherit}.members-cap-tabs button:hover+.dashicons,.members-cap-tabs button:focus+.dashicons{display:inline-block}.members-tab-content .members-highlight{background-color:rgba(0,115,170,0.05)}.members-tab-content tbody{-webkit-transition:all 2s ease-in-out;transition:all 2s ease-in-out}.members-cp-role-list-wrap{overflow:auto;min-height:42px;max-height:200px;padding:0 .9em;border:solid 1px #dfdfdf;background-color:#fdfdfd}#wpbody-content{padding-bottom:200px}.members-footer-promotion{text-align:center;font-weight:400;font-size:13px;line-height:16px;color:#787c82;padding:20px 0 30px 0;margin-bottom:20px}.members-footer-promotion p{font-weight:600}.members-footer-promotion-links,.members-footer-promotion-social{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-footer-promotion-links{margin:9px 0 0}.members-footer-promotion-links span{color:#c3c4c7;padding:0 7px}.members-footer-promotion-social{margin:10px 0 0 0;gap:10px}.members-footer-promotion-social li{margin-bottom:0}.members-footer-promotion-social a{display:block;height:16px}.members_page_members-settings.rtl{.addon-activate{left:20px;right:unset}.members-addons .plugin-card{.name,.desc p{margin-left:0;margin-right:148px}}}.button.button-warning{background:#dc3232;border-color:#dc3232;color:#fff}.button.button-warning:hover,.button.button-warning:focus{background:#c92424;border-color:#c92424;color:#fff}.members-reset-spinner{float:none;margin-top:0;vertical-align:middle} \ No newline at end of file +#members-cp h2.hndle,#members-cp-side h2.hndle{border-bottom:none !important;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}#members-cp h2.hndle:before,#members-cp-side h2.hndle:before{content:url("data:image/svg+xml,%3Csvg width='15px' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='users-cog' class='svg-inline--fa fa-users-cog fa-w-20' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z'%3E%3C/path%3E%3C/svg%3E");margin-right:5px}#members-cp-side .postbox-header{border-bottom:none !important}#members-cp-side .handle-actions .handle-order-higher,#members-cp-side .handle-actions .handle-order-lower{display:none}#members-cp-side .handle-actions .handlediv{position:absolute;right:5px}.members-upgrade-header{text-align:center;padding:5px}.members-upgrade-header a{color:#f59431}.memberpress-paid-memberships{background-color:#f5f5f5;padding:50px 10px;text-align:center}.memberpress-paid-memberships a{background-color:#0e4598;display:inline-block;padding:10px 20px;border-radius:300px;color:#fff;text-decoration:none;margin-top:20px}#members-cp-side .members-tabs{position:relative}#members-cp-side .members-tab-nav{background-color:transparent;margin-bottom:20px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title{width:33.333%;height:50px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title a{border:0}#members-cp-side .members-tab-content h3{font-weight:bold;font-size:15px;margin-top:0;color:#000;margin-bottom:10px}#members-cp-side .members-tab-content .memberpress-paid-memberships{text-align:left;padding:20px}#members-cp-side .members-tab-content .memberpress-paid-memberships a{display:block;text-align:center}#members-cp-side .members-tabs .members-tab-nav li a,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a i{color:#555}#members-cp-side .members-tabs .members-tab-nav li a svg,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a svg{fill:#555}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a{background-color:transparent;border-bottom:2px solid #3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a i{color:#3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a svg{fill:#3582ae}.members-tab-title svg,.members-tab-title[aria-selected="false"] svg{fill:#0073aa}.members-tab-title[aria-selected="true"] svg{fill:#555}#wpcontent #members-admin-header{margin-left:-20px;padding:0 28px 0 22px;background-color:#0b1220;background-image:radial-gradient(circle at 12% 35%,rgba(14,69,152,0.45),transparent 55%),radial-gradient(circle at 90% 85%,rgba(245,148,49,0.14),transparent 60%);background-repeat:no-repeat;min-height:56px;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#wpcontent #members-admin-header img.members-logo{height:42px;display:block}#wpcontent #members-admin-header .members-by-mp{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;margin-left:auto;text-decoration:none;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:opacity .15s ease;transition:opacity .15s ease}#wpcontent #members-admin-header .members-by-mp:hover,#wpcontent #members-admin-header .members-by-mp:focus{opacity:.75;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}#wpcontent #members-admin-header .members-by-label{color:#94a3b8;font-size:12px;font-weight:500}#wpcontent #members-admin-header img.members-mp-logo{height:18px;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:36px;height:36px;padding:0;margin:0 0 0 18px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);border-radius:8px;color:#fff;cursor:pointer;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .15s ease,border-color .15s ease;transition:background .15s ease,border-color .15s ease;line-height:1;vertical-align:middle;min-height:0;text-decoration:none}#wpcontent #members-admin-header #membersAdminHeaderNotifications:hover,#wpcontent #members-admin-header #membersAdminHeaderNotifications:focus{background:rgba(255,255,255,0.12);border-color:rgba(255,255,255,0.24);color:#fff;-webkit-box-shadow:none;box-shadow:none;outline:0}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg{width:16px;height:auto;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg path{fill:#e2e8f0}#wpcontent #members-admin-header #membersAdminHeaderNotifications .members-notifications-count{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;border-radius:999px;background:#f59431;color:#0b1220;font-size:10px;font-weight:700;line-height:16px;text-align:center;border:1.5px solid #0b1220;-webkit-box-sizing:content-box;box-sizing:content-box}.members-upgrade-header #close-members-upgrade-header{position:absolute;right:20px;top:3px}.members-upgrade-header #close-members-upgrade-header:hover{cursor:pointer}.memberpress-welcome-panel.welcome-panel{margin-top:20px;padding:20px 28px;background:#fff;border-radius:10px;min-height:0}.memberpress-welcome-panel.welcome-panel .welcome-panel-content{min-height:0;height:auto}.members-about{--ink:#0f172a;--ink-soft:#334155;--ink-muted:#64748b;--mp-blue:#0e4598;--mp-teal:#3582ae;--mp-orange:#f59431;--rule:#e5e7eb;--paper:#fbfaf7;--paper-soft:#f3efe6;--paper-line:#e8e3d5;--display-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--sans-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}body.members_page_members-about #wpbody-content,body.toplevel_page_members-about #wpbody-content,body.admin_page_members-about #wpbody-content{background:var(--paper)}.members-about.wrap{max-width:1120px;margin:0 auto;padding:48px 24px 80px;color:var(--ink);font-family:var(--sans-font)}.members-about__hero{display:grid;grid-template-columns:minmax(0,1fr) 200px;grid-template-areas:"head mark" "body mark";gap:32px 56px;-webkit-box-align:start;-ms-flex-align:start;align-items:start;padding-bottom:64px;border-bottom:1px solid var(--paper-line)}.members-about__hero-head{grid-area:head}.members-about__body{grid-area:body}.members-about__mark{grid-area:mark;align-self:start}.members-about__eyebrow{display:inline-block;font-family:var(--sans-font);font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-muted);padding-bottom:18px}.members-about__title{font-family:var(--display-font);font-weight:900;font-size:clamp(40px,5.5vw,64px);line-height:1;letter-spacing:-0.035em;color:var(--ink);margin:0}.members-about__title em{font-style:normal;font-weight:900;color:var(--mp-blue)}.members-about__title-dot{color:var(--mp-blue);font-style:normal;font-weight:900}.members-about__body{max-width:60ch;font-size:15.5px;line-height:1.62;color:var(--ink-soft)}.members-about__body p{margin:0 0 14px}.members-about__body p:last-child{margin-bottom:0}.members-about__lead{font-family:var(--sans-font);font-weight:500;font-size:17px;line-height:1.5;color:var(--ink);margin-bottom:24px !important;padding-left:18px;border-left:2px solid var(--mp-blue)}.members-about__body a,.members-about__lead a{color:var(--mp-blue);text-decoration:none;background-image:-webkit-gradient(linear,left top,left bottom,from(currentColor),to(currentColor));background-image:linear-gradient(currentColor,currentColor);background-size:100% 1px;background-position:0 100%;background-repeat:no-repeat;padding-bottom:1px;-webkit-transition:color .2s ease,background-size .2s ease;transition:color .2s ease,background-size .2s ease}.members-about__body a:hover,.members-about__lead a:hover{color:var(--mp-orange)}.members-about__body em,.members-about__lead em{font-style:normal;font-weight:700;color:var(--mp-blue)}.members-about__mark{padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(15,23,42,0.03);box-shadow:0 1px 2px rgba(15,23,42,0.03);-webkit-transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__mark:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px);-webkit-box-shadow:0 8px 20px rgba(15,23,42,0.08);box-shadow:0 8px 20px rgba(15,23,42,0.08)}.members-about__mark a{display:block;-webkit-box-shadow:none !important;box-shadow:none !important;text-decoration:none}.members-about__mark img{display:block;width:100%;height:auto;max-width:160px;margin:0 auto}.members-about__products{padding-top:56px}.members-about__products-head{margin-bottom:28px;text-align:center}.members-about__products-head h3{font-family:var(--display-font);font-weight:700;font-size:15px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-muted);margin:0}.members-about__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.members-about__card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:6px;-webkit-transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__card:hover{-webkit-transform:translateY(-3px);transform:translateY(-3px);-webkit-box-shadow:0 12px 28px rgba(15,23,42,0.08);box-shadow:0 12px 28px rgba(15,23,42,0.08);border-color:rgba(14,69,152,0.2)}.members-about__card-head{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:14px;margin-bottom:14px}.members-about__card-icon{-webkit-box-flex:0;-ms-flex:0 0 44px;flex:0 0 44px;width:44px;height:44px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:var(--paper-soft);border-radius:10px;overflow:hidden}.members-about__card-icon img{display:block;max-width:32px;max-height:32px;width:auto;height:auto}.members-about__card-title{margin:0;font-family:var(--display-font);font-weight:700;font-size:17px;line-height:1.2;letter-spacing:-0.01em;color:var(--ink)}.members-about__card-title a{color:inherit;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.members-about__card-title a:hover{color:var(--mp-blue)}.members-about__card-desc{-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 0 24px;font-size:14px;line-height:1.55;color:var(--ink-soft)}.members-about__card-foot{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;gap:16px;padding-top:16px;border-top:1px solid var(--paper-line)}.members-about__status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted)}.members-about__status::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}.members-about__status.is-active{color:#10b981}.members-about__status.is-inactive{color:var(--mp-orange)}.members-about__status.is-missing{color:var(--ink-muted)}.members-about__cta{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:8px 14px;font-size:13px;font-weight:600;letter-spacing:.01em;border-radius:4px;text-decoration:none;border:1px solid transparent;-webkit-transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease,-webkit-transform .15s ease;-webkit-box-shadow:none;box-shadow:none}.members-about__cta:focus,.members-about__cta:focus-visible{outline:2px solid var(--mp-blue);outline-offset:2px;-webkit-box-shadow:none;box-shadow:none}.members-about__cta.is-primary{background:var(--mp-blue);color:#fff}.members-about__cta.is-primary:hover{background:#093374;color:#fff;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.members-about__cta.is-secondary{background:transparent;color:var(--ink);border-color:var(--rule)}.members-about__cta.is-secondary:hover{border-color:var(--ink);background:#fff;color:var(--ink)}.members-about__cta svg{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.members-about__cta:hover svg{-webkit-transform:translate(1px,-1px);transform:translate(1px,-1px)}@media(max-width:900px){.members-about__hero{grid-template-columns:1fr;grid-template-areas:"head" "body" "mark";gap:24px}.members-about__mark{max-width:160px}.members-about__grid{grid-template-columns:1fr}}.memberpress-welcome-panel.welcome-panel:before{background:0}.memberpress-welcome-panel.welcome-panel .about-description{margin:20px 0}.memberpress-welcome-panel.welcome-panel-content{margin:0}.memberpress-welcome-panel.welcome-panel-content .mp-logo-wrap>a{display:block}@media screen and (min-width:870px){.members_page_members-settings .members-short-p{max-width:612px;margin-left:auto;margin-right:auto}.members_page_members-settings .welcome-panel-content{text-align:center}}.members_page_members-settings .welcome-panel .button.button-hero{margin-left:auto;margin-right:auto}.members_page_members-settings .members-svg-wrap{display:inline-block;margin:0 auto 20px}@media screen and (max-width:870px){.members_page_members-settings .welcome-panel{padding:20px}.members_page_members-settings .members-svg-wrap{float:left;margin-right:28px}.admin_page_members-settings.rtl .members-svg-wrap{float:right;margin-right:0;margin-left:28px}}.members_page_members-settings .members-svg-link{display:table-cell;text-align:center;width:128px;height:128px;background:#363b3f;color:#fff;padding:24px 16px 16px;border-radius:50%;-webkit-box-sizing:border-box;box-sizing:border-box;border:4px solid #fff;-webkit-box-shadow:0 0 0 4px #363b3f;box-shadow:0 0 0 4px #363b3f}.members_page_members-settings .members-svg-link svg{max-width:84px;max-height:64px;width:auto;height:auto}.members-addons{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:20px;grid-column-gap:20px}.members-addons .plugin-card{margin:0}.members-addons .plugin-card-top{width:100%}.members-addon{width:100%;position:relative;float:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-addon .desc{margin-bottom:80px}.addon-activate{text-align:center;border:1px solid #ddd;border-radius:3px;padding:5px 10px 10px;display:inline-block;width:100px;position:absolute;right:20px;bottom:20px}.activate-toggle:hover{cursor:pointer}.activate-toggle svg{max-width:20px;position:relative;top:5px}.activate-toggle svg{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.activate-toggle svg.active{-webkit-transform:rotate(0);transform:rotate(0)}.activate-toggle svg path{fill:#ccc}.activate-toggle svg.active path{fill:#8cbd5a}.activate-toggle.processing{cursor:not-allowed;pointer-events:none;opacity:.5}.activate-toggle .action-label{display:inline-block;width:50px;text-align:left}.mepr_dummy_txns{-webkit-filter:blur(3px);filter:blur(3px);position:absolute;top:0;left:0;width:100%;z-index:5;pointer-events:none}.mepr_dummy_txns::after{background-color:rgba(0,0,0,.2);position:absolute;top:0;left:0;width:100%;height:100%;z-index:6}.mepr-upgrade-table{position:relative}.mepr-upgrade-table .mepr-upgrade{position:relative;top:100px;z-index:10;background:rgba(0,0,0,.2);width:100%;height:100%;max-width:600px;margin:0 auto;-webkit-box-shadow:0 0 30px #ccc;box-shadow:0 0 30px #ccc}.mepr-upgrade-content{background-color:#fff;padding:20px;text-align:center}.mepr-upgrade-content h2{font-size:24px}.mepr-upgrade-content h4{font-size:18px}.mepr-upgrade-content .features{display:grid;grid-template-columns:1fr 1fr;grid-column-gap:30px;grid-row-gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:left;padding:10px}.features li:before{content:"\f147";font-family:dashicons;color:green;font-size:20px;position:relative;top:4px;margin-right:10px}.mepr-upgrade-cta{text-align:center;background-color:#f2f2f2;padding:20px}.mepr-upgrade-cta .mepr-cta-button{display:block;max-width:300px;margin:0 auto 20px;background-color:#fd9c27;color:#fff;padding:15px;font-size:18px;font-weight:bold;text-decoration:none;border-radius:300px}.members-plugin-card.plugin-card:nth-child(even){margin-right:inherit}.members-plugin-card.plugin-card:nth-child(odd){clear:none;margin-left:inherit}.members-plugin-card.plugin-card .plugin-card-top{min-height:0;padding:30px 20px}.members-plugin-card.plugin-card .plugin-icon{top:30px}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{font-weight:bold}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .active{color:#8cbd5a}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .inactive{color:red}.members-plugin-card.plugin-card .plugin-icon{width:64px;height:auto}.plugin-icon-small{width:32px;height:auto}.members-plugin-card.plugin-card .name,.members-plugin-card.plugin-card .desc{margin-right:0;margin-left:84px}.members-addons .plugin-card .name,.members-addons .plugin-card .desc p{margin-right:0}@media screen and (max-width:1100px){.members-addons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}@media screen and (max-width:600px){.members_page_members-settings .members-svg-link{width:64px;height:64px}.members_page_members-settings .members-svg-link svg{position:absolute;top:14px;left:15px;max-width:30px;max-height:30px}.members_page_members-settings .plugin-card-members-edd-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-acf-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-givewp-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-meta-box-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-woocommerce-integration .members-svg-link svg{top:10px;left:8px;max-width:40px;max-height:40px}.members_page_members-settings .plugin-card-members-block-permissions .members-svg-link svg,.members_page_members-settings .plugin-card-members-role-hierarchy .members-svg-link svg{left:14px}.members-addons .plugin-card .desc>p,.members-addons .plugin-card .name{margin-left:84px}}.memberpress-about .welcome-panel-column-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:40px;padding:0;margin:0}.memberpress-about .mp-desc p{font-size:13px;line-height:1.6;color:#334155;margin:0 0 12px}.memberpress-about .mp-desc p:first-child{font-size:15px;font-weight:600;color:#0f172a;margin-top:0;margin-bottom:14px}.memberpress-about .mp-desc p:last-child{margin-bottom:0}.memberpress-about .mp-logo-wrap{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.memberpress-about .mp-logo{display:block;max-width:220px;height:auto;margin:0}.members-about-addons{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-column-gap:20px}.members-about-addons .members-plugin-card{margin:0;width:100%}.members-about-addons .members-plugin-card .plugin-icon{position:static;width:auto;height:28px;max-width:40px;-o-object-fit:contain;object-fit:contain;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;display:block}.members-about-addons .members-plugin-card .name,.members-about-addons .members-plugin-card .desc{margin-left:0}.members-about-addons .members-plugin-card .plugin-card-top{padding:20px}.members-about-addons .members-plugin-card .name h3{margin:0 0 10px;min-height:0;height:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;line-height:1.2}.members-about-addons .members-plugin-card .name h3 a{text-decoration:none;line-height:1.2}.members-about-addons .members-plugin-card .plugin-card-bottom{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:1099px){.members-about-addons{grid-template-columns:1fr;grid-row-gap:20px}}@media screen and (min-width:1100px) and (max-width:1600px){.members-about-addons .members-plugin-card{float:none;width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.members-plugin-card.plugin-card .desc{margin-left:0;margin-top:50px}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{float:none}.members-plugin-card.plugin-card .plugin-card-bottom .column-updated{float:none;width:auto}}@media screen and (max-width:1200px){.welcome-panel .welcome-panel-column-container{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;gap:0;padding:0}.memberpress-about .mp-logo{margin:0 0 20px}}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}@media only screen and (min-width:783px){.members_page_roles .column-users,.members_page_roles .column-granted_caps,.members_page_roles .column-denied_caps{width:100px;text-align:center}}.members-title-div #titlewrap input{padding:0 8px;font-size:1.7em;line-height:normal;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}.members-title-div input[name="role"]{font-size:13px;height:22px;margin:0;width:16em}#tabcapsdiv{margin-top:1em}#tabcapsdiv>.hndle{padding:10px;border-bottom:1px solid #eee}#tabcapsdiv .inside,#members-cp .inside{margin:0;padding:0}.members-cap-filter{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:10px 12px;background:#fff;border-bottom:1px solid #e5e5e5}.members-cap-filter .members-cap-filter-input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:100%;height:32px;line-height:1;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.members-cap-filter .members-cap-filter-count{color:#666;font-size:12px;font-style:italic}.members-cap-filter-empty td{padding:16px 12px;color:#666;font-style:italic;text-align:center}.members-cap-filter-empty:nth-child(even){background:transparent}.members-cap-tabs,.members-tabs{overflow:hidden;background:#fff;background:-webkit-gradient(linear,left top,right top,from(#fafafa),color-stop(20%,#fafafa),color-stop(20%,#fff),to(#fff));background:linear-gradient(90deg,#fafafa 0,#fafafa 20%,#fff 20%,#fff 100%)}@media only screen and (max-width:782px){.members-cap-tabs,.members-tabs{background:linear-gradient(90deg,#fafafa 0,#fafafa 48px,#fff 48px,#fff 100%)}}.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{position:relative;float:left;list-style:none;width:20%;line-height:1em;margin:0 0 -1px 0;padding:0;background-color:#fafafa;border-right:1px solid #eee;-webkit-box-sizing:border-box;box-sizing:border-box}.members-cap-tabs .members-tab-nav li,.members-tabs .members-tab-nav li{display:block;position:relative;margin:0;padding:0;line-height:20px}.members-cap-tabs .members-tab-nav li a,.members-tabs .members-tab-nav li a{display:block;margin:0;padding:10px;line-height:20px !important;text-decoration:none;border-bottom:1px solid #eee;-webkit-box-shadow:none;box-shadow:none}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{line-height:20px;margin-right:3px}.members-cap-tabs .members-tab-nav li[aria-selected="true"] a,.members-tabs .members-tab-nav li[aria-selected="true"] a{position:relative;font-weight:bold;color:#555;background-color:#e0e0e0}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{width:48px}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}.members-tab-nav li .dashicons::before,.members-tab-nav li .dashicons::before{width:24px;height:24px}.members-tab-nav li .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{float:left;width:80%;margin-left:-1px}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{width:calc(100% - 48px)}}#members-cp .members-tab-content{padding:10px;border-left:1px solid #e5e5e5}.members-roles-select th,.members-roles-select td{width:190px;overflow:hidden}.members-roles-select .check-all-th{text-align:center}.members-roles-select .check-all-th label{padding-left:5px}@media only screen and (min-width:850px){#side-sortables .members-tabs{background:#fff}#side-sortables .members-tabs .members-tab-wrap{width:100%}#side-sortables .members-tabs .members-tab-nav{display:table;width:100%}#side-sortables .members-tabs .members-tab-nav li{display:table-cell;text-align:center;border-right:1px solid #eee}#side-sortables .members-tabs .members-tab-nav li:last-of-type{border-right:0}#side-sortables .members-tabs .members-tab-nav li a{padding:10px 0}#side-sortables .members-tabs .members-tab-nav .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}#side-sortables .members-tabs .members-tab-nav .dashicons::before{width:24px;height:24px}#side-sortables .members-tabs .members-tab-nav .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-tabs .members-tabs-label{display:block !important;font-weight:bold;display:inline-block;margin-bottom:4px}.members-tabs .butterbean-control-checkbox .members-tabs-label{display:inline !important}.members-tabs .members-tabs-description{display:block;font-style:italic;margin-top:4px}.members-tabs .members-tabs-label+.members-tabs-description{margin-top:0;margin-bottom:4px}#tabcapsdiv table{border-right:0;border-top:0;border-bottom:0}#tabcapsdiv table td,#tabcapsdiv table th{padding:10px;padding-bottom:10px;border-bottom:1px solid #eee;font-size:13px;line-height:20px}#tabcapsdiv table td{padding:9px}#tabcapsdiv tbody tr:last-of-type td{border-bottom:0}#tabcapsdiv tfoot th{border-color:#eee}@media only screen and (max-width:782px){#tabcapsdiv table td,#tabcapsdiv table th{line-height:24px}}.members-roles-select .column-grant,.members-roles-select .column-deny{width:70px !important;text-align:left;display:table-cell !important;clear:none !important}.members-roles-select thead th,.members-roles-select tfoot th{padding:9px !important}.members-roles-select .column-grant input,.members-roles-select .column-deny input{margin:0 5px 0 0;vertical-align:middle}.members-roles-select tbody tr:nth-child(even){background:#f2f2f2}.members-cap-tabs button{display:inline;margin:-4px;line-height:inherit;padding:4px 8px;border:1px solid transparent;background:transparent;border-radius:0;outline:0;-webkit-transition:all .25s ease-out;transition:all .25s ease-out}.members-cap-tabs button:hover,.members-cap-tabs button:focus{border-color:#eee;background:#fafafa;cursor:pointer}.members-cap-tabs button:active{color:#0073aa;border-color:#0073aa}.members-cap-tabs button+.dashicons{display:none;margin-top:1px;margin-bottom:-1px;line-height:inherit}.members-cap-tabs button:hover+.dashicons,.members-cap-tabs button:focus+.dashicons{display:inline-block}.members-tab-content .members-highlight{background-color:rgba(0,115,170,0.05)}.members-tab-content tbody{-webkit-transition:all 2s ease-in-out;transition:all 2s ease-in-out}.members-cp-role-list-wrap{overflow:auto;min-height:42px;max-height:200px;padding:0 .9em;border:solid 1px #dfdfdf;background-color:#fdfdfd}#wpbody-content{padding-bottom:200px}.members-footer-promotion{text-align:center;font-weight:400;font-size:13px;line-height:16px;color:#787c82;padding:20px 0 30px 0;margin-bottom:20px}.members-footer-promotion p{font-weight:600}.members-footer-promotion-links,.members-footer-promotion-social{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-footer-promotion-links{margin:9px 0 0}.members-footer-promotion-links span{color:#c3c4c7;padding:0 7px}.members-footer-promotion-social{margin:10px 0 0 0;gap:10px}.members-footer-promotion-social li{margin-bottom:0}.members-footer-promotion-social a{display:block;height:16px}.members_page_members-settings.rtl{.addon-activate{left:20px;right:unset}.members-addons .plugin-card{.name,.desc p{margin-left:0;margin-right:148px}}}.button.button-warning{background:#dc3232;border-color:#dc3232;color:#fff}.button.button-warning:hover,.button.button-warning:focus{background:#c92424;border-color:#c92424;color:#fff}.members-reset-spinner{float:none;margin-top:0;vertical-align:middle}.members-import-status{font-weight:600}.members-import-status--exists{color:#d63638}.members-import-status--new{color:#00a32a} \ No newline at end of file diff --git a/js/edit-role.js b/js/edit-role.js index 3d997e49..4b7555c5 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -139,6 +139,17 @@ jQuery( document ).ready( function() { _.each( members_controls, function( data ) { jQuery( '#members-tab-' + data.section + ' tbody' ).append( control_template( data ) ); } ); + + // Cache the cap text on each row so subsequent filters don't re-query the DOM. + jQuery( '.members-cap-checklist' ).each( function() { + + var $row = jQuery( this ); + var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) + || $row.find( 'input[data-deny-cap]' ).attr( 'data-deny-cap' ) + || ''; + + $row.attr( 'data-cap-search', ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase() ); + } ); } /* ====== Tabs ====== */ @@ -180,9 +191,107 @@ jQuery( document ).ready( function() { // Copy the current tab item title to the box header. jQuery( '.members-which-tab' ).text( jQuery( this ).text() ); + + // Re-apply the capability filter to the newly visible tab. + members_apply_cap_filter(); } ); // click() + /* ====== Capability Filter (search) ====== */ + + /** + * Filters the rows in the currently active capability tab to those matching + * the search input. The match is case-insensitive and runs against both the + * capability slug and the visible label. + * + * @since 3.x.0 + * @access public + * @return void + */ + function members_apply_cap_filter() { + + var $input = jQuery( '#members-cap-filter-input' ); + + if ( ! $input.length ) { + return; + } + + var query = ( $input.val() || '' ).toLowerCase().trim(); + var $activeTab = jQuery( '.members-cap-tabs .members-tab-content:visible' ).first(); + + if ( ! $activeTab.length ) { + return; + } + + var $rows = $activeTab.find( 'tbody > tr.members-cap-checklist' ); + var visible_count = 0; + + $rows.each( function() { + + var $row = jQuery( this ); + var haystack = $row.attr( 'data-cap-search' ); + + // Build the search haystack on the fly if it wasn't cached at render time + // (e.g. for a custom cap row added after initial template rendering). + if ( ! haystack ) { + + var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) + || $row.find( 'input[data-deny-cap]' ).attr( 'data-deny-cap' ) + || ''; + + haystack = ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase(); + $row.attr( 'data-cap-search', haystack ); + } + + if ( '' === query || -1 !== haystack.indexOf( query ) ) { + $row.show(); + visible_count++; + } else { + $row.hide(); + } + } ); + + // Toggle a "no matches" empty-state row inside the active tab's table. + var $tbody = $activeTab.find( 'tbody' ).first(); + var $empty = $tbody.find( 'tr.members-cap-filter-empty' ); + + if ( ! $empty.length ) { + $empty = jQuery( '' ); + $empty.find( 'td' ).text( members_i18n.filter_no_matches ); + $tbody.append( $empty ); + } + + if ( query && 0 === visible_count ) { + $empty.show(); + } else { + $empty.hide(); + } + + // Update the live match count next to the input. + var $count = jQuery( '.members-cap-filter-count' ); + + if ( '' === query ) { + $count.text( '' ); + } else { + var template = 1 === visible_count ? members_i18n.filter_matches : members_i18n.filter_matches_plural; + $count.text( template.replace( '%d', visible_count ) ); + } + } + + // Filter on every keystroke in the search input. + jQuery( document ).on( 'input search', '#members-cap-filter-input', function() { + members_apply_cap_filter(); + } ); + + // Don't let "Enter" in the filter input submit the form. + jQuery( document ).on( 'keydown', '#members-cap-filter-input', function( e ) { + + if ( 13 === e.keyCode ) { + e.preventDefault(); + return false; + } + } ); + /* ====== Capability Checkboxes (inside tab content) ====== */ /** @@ -419,6 +528,9 @@ jQuery( document ).ready( function() { return; } + // Clear any active filter so the new cap row is visible. + jQuery( '#members-cap-filter-input' ).val( '' ); + // Trigger a click event on the "custom" tab in the edit caps box. jQuery( 'a[href="#members-tab-custom"]' ).trigger( 'click' ); diff --git a/js/edit-role.min.js b/js/edit-role.min.js index 13d9b546..d638fef8 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function r(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||r(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();r(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var t=wp.template("members-cap-section"),a=wp.template("members-cap-control");function i(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,r=jQuery("#members-tab-all input[data-deny-cap]:checked").length,t=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+t),jQuery("#submitdiv .denied-count").text(r+a)}function p(e){var r="grant",t="deny";jQuery(e).attr("data-deny-cap")&&(r="deny",t="grant");var a=jQuery(e).attr("data-"+r+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+r+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+t+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+r+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(t(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var r=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(r).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text())}),i(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),i()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),r=e.is(":checked"),t=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),u=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");t?_.each(n,function(e){e.checked=r,p(e)}):_.each(c,function(e){e.checked=r,p(e)}),r?t?(s.prop("checked",!0),u.prop("checked",!1)):(u.prop("checked",!0),s.prop("checked",!1)):t?s.prop("checked",!1):u.prop("checked",!1),i()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),r=jQuery(e).find("input[data-grant-cap]"),t=jQuery(e).find("input[data-deny-cap]");jQuery(r).prop("checked")?(jQuery(r).prop("checked",!1),jQuery(t).prop("checked",!0).change()):jQuery(t).prop("checked")?(jQuery(r).prop("checked",!1),jQuery(t).prop("checked",!1).change()):jQuery(r).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var r={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(r));var t=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(t).addClass("members-highlight"),setTimeout(function(){jQuery(t).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase(),e.attr("data-cap-search",t));""===r||-1!==t.indexOf(r)?(e.show(),n++):e.hide()});var c=t.find("tbody").first(),i=c.find("tr.members-cap-filter-empty");i.length||((i=jQuery('')).find("td").text(members_i18n.filter_no_matches),c.append(i)),r&&0===n?i.show():i.hide();var s=jQuery(".members-cap-filter-count");if(""===r)s.text("");else{var u=1===n?members_i18n.filter_matches:members_i18n.filter_matches_plural;s.text(u.replace("%d",n))}}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this),t=e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"";e.attr("data-cap-search",(t+" "+e.find(".column-cap").text()).toLowerCase())})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(document).on("input search","#members-cap-filter-input",function(){n()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val(""),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file diff --git a/js/import-export.min.js b/js/import-export.min.js new file mode 100644 index 00000000..fb95aff0 --- /dev/null +++ b/js/import-export.min.js @@ -0,0 +1 @@ +jQuery(document).ready(function(i){i("#members-import-toggle").on("click",function(e){e.preventDefault();var t=i("#members-import-roles");t.slideToggle(300,function(){t.is(":visible")&&i("html, body").animate({scrollTop:t.offset().top-40},200)})}),i(document).on("change",".members-import-action-select",function(){var e=i(this).closest("td").find(".members-rename-field");"rename"===i(this).val()?e.slideDown():e.slideUp()}),i("#members-apply-bulk-conflict").on("click",function(){var e=i("#members-bulk-conflict-action").val();e&&i(".members-import-action-select").each(function(){i(this).val(e).trigger("change")})}),i(document).on("click",".members-toggle-caps",function(e){e.preventDefault();var t="true"===i(this).attr("aria-expanded");i(this).closest("td").find(".members-caps-detail").slideToggle(),i(this).attr("aria-expanded",String(!t))})}); \ No newline at end of file diff --git a/js/settings.min.js b/js/settings.min.js index 348dcf6f..1e684dc7 100644 --- a/js/settings.min.js +++ b/js/settings.min.js @@ -1 +1 @@ -jQuery(document).ready(function(n){!1===jQuery('[name="members_settings[content_permissions]"]').prop("checked")&&(jQuery('[name="members_settings[content_permissions]"]').parents("tr").next("tr").hide(),jQuery('[name="members_settings[private_feed]"]').parents("tr").next("tr").hide()),!1===jQuery('[name="members_settings[content_permissions]"]').prop("checked")&&jQuery('[name="members_settings[hide_posts_rest_api]"]').parents("tr").hide(),jQuery('[name="members_settings[content_permissions]"], [name="members_settings[private_feed]"], [name="members_settings[private_blog]"]').on("change",function(){jQuery(this).prop("checked")?jQuery(this).parents("tr").next("tr").show("slow"):jQuery(this).parents("tr").next("tr").hide("slow")}),n(".activate-addon").on("click",function(e){var t=n(this),s=t.data("addon");t.addClass("processing"),n.ajax({url:ajaxurl,type:"POST",data:{action:"mbrs_toggle_addon",nonce:membersAddons.nonce,addon:s}}).done(function(e){if(1==e.success){t.find(".action-label").html(e.data.action_label);var s=t.find("svg");s.removeClass(),s.addClass(e.data.status)}else alert(e.data.msg)}).fail(function(e){alert(e.data.msg)}).always(function(e){t.removeClass("processing")})}),n("#members-reset-roles").on("click",function(e){e.preventDefault();if(!confirm(membersResetRoles.confirmMessage))return;var t=n(this),r=t.next(".members-reset-spinner"),o=n("#members-reset-roles-message");t.prop("disabled",!0),r.addClass("is-active"),o.removeClass("notice notice-success notice-error").empty(),n.ajax({url:membersResetRoles.ajaxurl,type:"POST",data:{action:"members_reset_roles",nonce:membersResetRoles.nonce},success:function(e){e.success?(o.addClass("notice notice-success").html("

"+membersResetRoles.successMessage+"

"),setTimeout(function(){window.location.reload()},1000)):o.addClass("notice notice-error").html("

"+membersResetRoles.errorMessage+"

")},error:function(){o.addClass("notice notice-error").html("

"+membersResetRoles.errorMessage+"

")},complete:function(){t.prop("disabled",!1),r.removeClass("is-active")}})});}); \ No newline at end of file +jQuery(document).ready(function(r){!1===jQuery('[name="members_settings[content_permissions]"]').prop("checked")&&(jQuery('[name="members_settings[content_permissions]"]').parents("tr").next("tr").hide(),jQuery('[name="members_settings[private_feed]"]').parents("tr").next("tr").hide()),!1===jQuery('[name="members_settings[content_permissions]"]').prop("checked")&&jQuery('[name="members_settings[hide_posts_rest_api]"]').parents("tr").hide(),jQuery('[name="members_settings[content_permissions]"], [name="members_settings[private_feed]"], [name="members_settings[private_blog]"]').on("change",function(){jQuery(this).prop("checked")?jQuery(this).parents("tr").next("tr").show("slow"):jQuery(this).parents("tr").next("tr").hide("slow")}),r(".activate-addon").on("click",function(e){var t=r(this),s=t.data("addon");t.addClass("processing"),r.ajax({url:ajaxurl,type:"POST",data:{action:"mbrs_toggle_addon",nonce:membersAddons.nonce,addon:s}}).done(function(e){if(1==e.success){t.find(".action-label").html(e.data.action_label);var s=t.find("svg");s.removeClass(),s.addClass(e.data.status)}else alert(e.data.msg)}).fail(function(e){alert(e.data.msg)}).always(function(e){t.removeClass("processing")})}),jQuery("#members-reset-roles").on("click",function(e){if(e.preventDefault(),confirm(membersResetRoles.confirmMessage)){var s=jQuery(this),t=s.next(".members-reset-spinner"),r=jQuery("#members-reset-roles-message");s.prop("disabled",!0),t.addClass("is-active"),r.removeClass("notice notice-success notice-error").empty(),jQuery.ajax({url:membersResetRoles.ajaxurl,type:"POST",data:{action:"members_reset_roles",nonce:membersResetRoles.nonce},success:function(e){e.success?(r.addClass("notice notice-success").html("

"+membersResetRoles.successMessage+"

"),setTimeout(function(){window.location.reload()},1e3)):r.addClass("notice notice-error").html("

"+membersResetRoles.errorMessage+"

")},error:function(){r.addClass("notice notice-error").html("

"+membersResetRoles.errorMessage+"

")},complete:function(){s.prop("disabled",!1),t.removeClass("is-active")}})}})}); \ No newline at end of file From a2743b4b1157fec79c9f6591f2c7e28936265ed4 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Fri, 8 May 2026 14:25:06 +0300 Subject: [PATCH 02/11] Enhance capability filtering and localization in roles management --- admin/functions-admin.php | 14 ++++--- css/admin.css | 4 +- css/admin.min.css | 2 +- js/edit-role.js | 82 +++++++++++++++++++++++++++++++++++---- js/edit-role.min.js | 2 +- 5 files changed, 86 insertions(+), 18 deletions(-) diff --git a/admin/functions-admin.php b/admin/functions-admin.php index 7d849fbf..1607a799 100644 --- a/admin/functions-admin.php +++ b/admin/functions-admin.php @@ -50,7 +50,14 @@ function members_admin_register_scripts() { $edit_role_file = members_plugin()->dir . "js/edit-role{$min}.js"; $edit_role_ver = file_exists( $edit_role_file ) ? filemtime( $edit_role_file ) : false; - wp_register_script( 'members-edit-role', members_plugin()->uri . "js/edit-role{$min}.js", array( 'postbox', 'wp-util' ), $edit_role_ver, true ); + wp_register_script( 'members-edit-role', members_plugin()->uri . "js/edit-role{$min}.js", array( 'postbox', 'wp-util', 'wp-i18n' ), $edit_role_ver, true ); + + // Load JSON translations for `wp.i18n._n()` / `wp.i18n.__()` calls used by + // the capability filter. Strings still translated via PHP `__()` continue to + // flow through `wp_localize_script()` below for backward compatibility. + if ( function_exists( 'wp_set_script_translations' ) ) { + wp_set_script_translations( 'members-edit-role', 'members' ); + } // Localize our script with some text we want to pass in. $i18n = array( @@ -59,11 +66,6 @@ function members_admin_register_scripts() { 'label_grant_cap' => esc_html__( 'Grant %s capability', 'members' ), 'label_deny_cap' => esc_html__( 'Deny %s capability', 'members' ), 'ays_delete_role' => esc_html__( 'Are you sure you want to delete this role? This is a permanent action and cannot be undone.', 'members' ), - /* translators: %d: number of capabilities matching the filter. */ - 'filter_matches' => esc_html__( '%d match', 'members' ), - /* translators: %d: number of capabilities matching the filter. */ - 'filter_matches_plural' => esc_html__( '%d matches', 'members' ), - 'filter_no_matches' => esc_html__( 'No capabilities match your filter.', 'members' ), 'hidden_caps' => members_get_hidden_caps(), ); diff --git a/css/admin.css b/css/admin.css index ae180f1a..8022d08c 100644 --- a/css/admin.css +++ b/css/admin.css @@ -1178,7 +1178,7 @@ body.admin_page_members-about #wpbody-content { text-align: center; } -.members-cap-filter-empty:nth-child(even) { +.members-cap-filter-empty { background: transparent; } @@ -1452,7 +1452,7 @@ body.admin_page_members-about #wpbody-content { vertical-align: middle; } -.members-roles-select tbody tr:nth-child(even) { +.members-roles-select tbody tr.members-cap-row-alt { background: #f2f2f2; } diff --git a/css/admin.min.css b/css/admin.min.css index d16dfb49..c1389c4f 100644 --- a/css/admin.min.css +++ b/css/admin.min.css @@ -1 +1 @@ -#members-cp h2.hndle,#members-cp-side h2.hndle{border-bottom:none !important;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}#members-cp h2.hndle:before,#members-cp-side h2.hndle:before{content:url("data:image/svg+xml,%3Csvg width='15px' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='users-cog' class='svg-inline--fa fa-users-cog fa-w-20' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z'%3E%3C/path%3E%3C/svg%3E");margin-right:5px}#members-cp-side .postbox-header{border-bottom:none !important}#members-cp-side .handle-actions .handle-order-higher,#members-cp-side .handle-actions .handle-order-lower{display:none}#members-cp-side .handle-actions .handlediv{position:absolute;right:5px}.members-upgrade-header{text-align:center;padding:5px}.members-upgrade-header a{color:#f59431}.memberpress-paid-memberships{background-color:#f5f5f5;padding:50px 10px;text-align:center}.memberpress-paid-memberships a{background-color:#0e4598;display:inline-block;padding:10px 20px;border-radius:300px;color:#fff;text-decoration:none;margin-top:20px}#members-cp-side .members-tabs{position:relative}#members-cp-side .members-tab-nav{background-color:transparent;margin-bottom:20px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title{width:33.333%;height:50px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title a{border:0}#members-cp-side .members-tab-content h3{font-weight:bold;font-size:15px;margin-top:0;color:#000;margin-bottom:10px}#members-cp-side .members-tab-content .memberpress-paid-memberships{text-align:left;padding:20px}#members-cp-side .members-tab-content .memberpress-paid-memberships a{display:block;text-align:center}#members-cp-side .members-tabs .members-tab-nav li a,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a i{color:#555}#members-cp-side .members-tabs .members-tab-nav li a svg,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a svg{fill:#555}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a{background-color:transparent;border-bottom:2px solid #3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a i{color:#3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a svg{fill:#3582ae}.members-tab-title svg,.members-tab-title[aria-selected="false"] svg{fill:#0073aa}.members-tab-title[aria-selected="true"] svg{fill:#555}#wpcontent #members-admin-header{margin-left:-20px;padding:0 28px 0 22px;background-color:#0b1220;background-image:radial-gradient(circle at 12% 35%,rgba(14,69,152,0.45),transparent 55%),radial-gradient(circle at 90% 85%,rgba(245,148,49,0.14),transparent 60%);background-repeat:no-repeat;min-height:56px;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#wpcontent #members-admin-header img.members-logo{height:42px;display:block}#wpcontent #members-admin-header .members-by-mp{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;margin-left:auto;text-decoration:none;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:opacity .15s ease;transition:opacity .15s ease}#wpcontent #members-admin-header .members-by-mp:hover,#wpcontent #members-admin-header .members-by-mp:focus{opacity:.75;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}#wpcontent #members-admin-header .members-by-label{color:#94a3b8;font-size:12px;font-weight:500}#wpcontent #members-admin-header img.members-mp-logo{height:18px;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:36px;height:36px;padding:0;margin:0 0 0 18px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);border-radius:8px;color:#fff;cursor:pointer;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .15s ease,border-color .15s ease;transition:background .15s ease,border-color .15s ease;line-height:1;vertical-align:middle;min-height:0;text-decoration:none}#wpcontent #members-admin-header #membersAdminHeaderNotifications:hover,#wpcontent #members-admin-header #membersAdminHeaderNotifications:focus{background:rgba(255,255,255,0.12);border-color:rgba(255,255,255,0.24);color:#fff;-webkit-box-shadow:none;box-shadow:none;outline:0}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg{width:16px;height:auto;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg path{fill:#e2e8f0}#wpcontent #members-admin-header #membersAdminHeaderNotifications .members-notifications-count{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;border-radius:999px;background:#f59431;color:#0b1220;font-size:10px;font-weight:700;line-height:16px;text-align:center;border:1.5px solid #0b1220;-webkit-box-sizing:content-box;box-sizing:content-box}.members-upgrade-header #close-members-upgrade-header{position:absolute;right:20px;top:3px}.members-upgrade-header #close-members-upgrade-header:hover{cursor:pointer}.memberpress-welcome-panel.welcome-panel{margin-top:20px;padding:20px 28px;background:#fff;border-radius:10px;min-height:0}.memberpress-welcome-panel.welcome-panel .welcome-panel-content{min-height:0;height:auto}.members-about{--ink:#0f172a;--ink-soft:#334155;--ink-muted:#64748b;--mp-blue:#0e4598;--mp-teal:#3582ae;--mp-orange:#f59431;--rule:#e5e7eb;--paper:#fbfaf7;--paper-soft:#f3efe6;--paper-line:#e8e3d5;--display-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--sans-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}body.members_page_members-about #wpbody-content,body.toplevel_page_members-about #wpbody-content,body.admin_page_members-about #wpbody-content{background:var(--paper)}.members-about.wrap{max-width:1120px;margin:0 auto;padding:48px 24px 80px;color:var(--ink);font-family:var(--sans-font)}.members-about__hero{display:grid;grid-template-columns:minmax(0,1fr) 200px;grid-template-areas:"head mark" "body mark";gap:32px 56px;-webkit-box-align:start;-ms-flex-align:start;align-items:start;padding-bottom:64px;border-bottom:1px solid var(--paper-line)}.members-about__hero-head{grid-area:head}.members-about__body{grid-area:body}.members-about__mark{grid-area:mark;align-self:start}.members-about__eyebrow{display:inline-block;font-family:var(--sans-font);font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-muted);padding-bottom:18px}.members-about__title{font-family:var(--display-font);font-weight:900;font-size:clamp(40px,5.5vw,64px);line-height:1;letter-spacing:-0.035em;color:var(--ink);margin:0}.members-about__title em{font-style:normal;font-weight:900;color:var(--mp-blue)}.members-about__title-dot{color:var(--mp-blue);font-style:normal;font-weight:900}.members-about__body{max-width:60ch;font-size:15.5px;line-height:1.62;color:var(--ink-soft)}.members-about__body p{margin:0 0 14px}.members-about__body p:last-child{margin-bottom:0}.members-about__lead{font-family:var(--sans-font);font-weight:500;font-size:17px;line-height:1.5;color:var(--ink);margin-bottom:24px !important;padding-left:18px;border-left:2px solid var(--mp-blue)}.members-about__body a,.members-about__lead a{color:var(--mp-blue);text-decoration:none;background-image:-webkit-gradient(linear,left top,left bottom,from(currentColor),to(currentColor));background-image:linear-gradient(currentColor,currentColor);background-size:100% 1px;background-position:0 100%;background-repeat:no-repeat;padding-bottom:1px;-webkit-transition:color .2s ease,background-size .2s ease;transition:color .2s ease,background-size .2s ease}.members-about__body a:hover,.members-about__lead a:hover{color:var(--mp-orange)}.members-about__body em,.members-about__lead em{font-style:normal;font-weight:700;color:var(--mp-blue)}.members-about__mark{padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(15,23,42,0.03);box-shadow:0 1px 2px rgba(15,23,42,0.03);-webkit-transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__mark:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px);-webkit-box-shadow:0 8px 20px rgba(15,23,42,0.08);box-shadow:0 8px 20px rgba(15,23,42,0.08)}.members-about__mark a{display:block;-webkit-box-shadow:none !important;box-shadow:none !important;text-decoration:none}.members-about__mark img{display:block;width:100%;height:auto;max-width:160px;margin:0 auto}.members-about__products{padding-top:56px}.members-about__products-head{margin-bottom:28px;text-align:center}.members-about__products-head h3{font-family:var(--display-font);font-weight:700;font-size:15px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-muted);margin:0}.members-about__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.members-about__card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:6px;-webkit-transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__card:hover{-webkit-transform:translateY(-3px);transform:translateY(-3px);-webkit-box-shadow:0 12px 28px rgba(15,23,42,0.08);box-shadow:0 12px 28px rgba(15,23,42,0.08);border-color:rgba(14,69,152,0.2)}.members-about__card-head{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:14px;margin-bottom:14px}.members-about__card-icon{-webkit-box-flex:0;-ms-flex:0 0 44px;flex:0 0 44px;width:44px;height:44px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:var(--paper-soft);border-radius:10px;overflow:hidden}.members-about__card-icon img{display:block;max-width:32px;max-height:32px;width:auto;height:auto}.members-about__card-title{margin:0;font-family:var(--display-font);font-weight:700;font-size:17px;line-height:1.2;letter-spacing:-0.01em;color:var(--ink)}.members-about__card-title a{color:inherit;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.members-about__card-title a:hover{color:var(--mp-blue)}.members-about__card-desc{-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 0 24px;font-size:14px;line-height:1.55;color:var(--ink-soft)}.members-about__card-foot{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;gap:16px;padding-top:16px;border-top:1px solid var(--paper-line)}.members-about__status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted)}.members-about__status::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}.members-about__status.is-active{color:#10b981}.members-about__status.is-inactive{color:var(--mp-orange)}.members-about__status.is-missing{color:var(--ink-muted)}.members-about__cta{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:8px 14px;font-size:13px;font-weight:600;letter-spacing:.01em;border-radius:4px;text-decoration:none;border:1px solid transparent;-webkit-transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease,-webkit-transform .15s ease;-webkit-box-shadow:none;box-shadow:none}.members-about__cta:focus,.members-about__cta:focus-visible{outline:2px solid var(--mp-blue);outline-offset:2px;-webkit-box-shadow:none;box-shadow:none}.members-about__cta.is-primary{background:var(--mp-blue);color:#fff}.members-about__cta.is-primary:hover{background:#093374;color:#fff;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.members-about__cta.is-secondary{background:transparent;color:var(--ink);border-color:var(--rule)}.members-about__cta.is-secondary:hover{border-color:var(--ink);background:#fff;color:var(--ink)}.members-about__cta svg{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.members-about__cta:hover svg{-webkit-transform:translate(1px,-1px);transform:translate(1px,-1px)}@media(max-width:900px){.members-about__hero{grid-template-columns:1fr;grid-template-areas:"head" "body" "mark";gap:24px}.members-about__mark{max-width:160px}.members-about__grid{grid-template-columns:1fr}}.memberpress-welcome-panel.welcome-panel:before{background:0}.memberpress-welcome-panel.welcome-panel .about-description{margin:20px 0}.memberpress-welcome-panel.welcome-panel-content{margin:0}.memberpress-welcome-panel.welcome-panel-content .mp-logo-wrap>a{display:block}@media screen and (min-width:870px){.members_page_members-settings .members-short-p{max-width:612px;margin-left:auto;margin-right:auto}.members_page_members-settings .welcome-panel-content{text-align:center}}.members_page_members-settings .welcome-panel .button.button-hero{margin-left:auto;margin-right:auto}.members_page_members-settings .members-svg-wrap{display:inline-block;margin:0 auto 20px}@media screen and (max-width:870px){.members_page_members-settings .welcome-panel{padding:20px}.members_page_members-settings .members-svg-wrap{float:left;margin-right:28px}.admin_page_members-settings.rtl .members-svg-wrap{float:right;margin-right:0;margin-left:28px}}.members_page_members-settings .members-svg-link{display:table-cell;text-align:center;width:128px;height:128px;background:#363b3f;color:#fff;padding:24px 16px 16px;border-radius:50%;-webkit-box-sizing:border-box;box-sizing:border-box;border:4px solid #fff;-webkit-box-shadow:0 0 0 4px #363b3f;box-shadow:0 0 0 4px #363b3f}.members_page_members-settings .members-svg-link svg{max-width:84px;max-height:64px;width:auto;height:auto}.members-addons{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:20px;grid-column-gap:20px}.members-addons .plugin-card{margin:0}.members-addons .plugin-card-top{width:100%}.members-addon{width:100%;position:relative;float:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-addon .desc{margin-bottom:80px}.addon-activate{text-align:center;border:1px solid #ddd;border-radius:3px;padding:5px 10px 10px;display:inline-block;width:100px;position:absolute;right:20px;bottom:20px}.activate-toggle:hover{cursor:pointer}.activate-toggle svg{max-width:20px;position:relative;top:5px}.activate-toggle svg{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.activate-toggle svg.active{-webkit-transform:rotate(0);transform:rotate(0)}.activate-toggle svg path{fill:#ccc}.activate-toggle svg.active path{fill:#8cbd5a}.activate-toggle.processing{cursor:not-allowed;pointer-events:none;opacity:.5}.activate-toggle .action-label{display:inline-block;width:50px;text-align:left}.mepr_dummy_txns{-webkit-filter:blur(3px);filter:blur(3px);position:absolute;top:0;left:0;width:100%;z-index:5;pointer-events:none}.mepr_dummy_txns::after{background-color:rgba(0,0,0,.2);position:absolute;top:0;left:0;width:100%;height:100%;z-index:6}.mepr-upgrade-table{position:relative}.mepr-upgrade-table .mepr-upgrade{position:relative;top:100px;z-index:10;background:rgba(0,0,0,.2);width:100%;height:100%;max-width:600px;margin:0 auto;-webkit-box-shadow:0 0 30px #ccc;box-shadow:0 0 30px #ccc}.mepr-upgrade-content{background-color:#fff;padding:20px;text-align:center}.mepr-upgrade-content h2{font-size:24px}.mepr-upgrade-content h4{font-size:18px}.mepr-upgrade-content .features{display:grid;grid-template-columns:1fr 1fr;grid-column-gap:30px;grid-row-gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:left;padding:10px}.features li:before{content:"\f147";font-family:dashicons;color:green;font-size:20px;position:relative;top:4px;margin-right:10px}.mepr-upgrade-cta{text-align:center;background-color:#f2f2f2;padding:20px}.mepr-upgrade-cta .mepr-cta-button{display:block;max-width:300px;margin:0 auto 20px;background-color:#fd9c27;color:#fff;padding:15px;font-size:18px;font-weight:bold;text-decoration:none;border-radius:300px}.members-plugin-card.plugin-card:nth-child(even){margin-right:inherit}.members-plugin-card.plugin-card:nth-child(odd){clear:none;margin-left:inherit}.members-plugin-card.plugin-card .plugin-card-top{min-height:0;padding:30px 20px}.members-plugin-card.plugin-card .plugin-icon{top:30px}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{font-weight:bold}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .active{color:#8cbd5a}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .inactive{color:red}.members-plugin-card.plugin-card .plugin-icon{width:64px;height:auto}.plugin-icon-small{width:32px;height:auto}.members-plugin-card.plugin-card .name,.members-plugin-card.plugin-card .desc{margin-right:0;margin-left:84px}.members-addons .plugin-card .name,.members-addons .plugin-card .desc p{margin-right:0}@media screen and (max-width:1100px){.members-addons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}@media screen and (max-width:600px){.members_page_members-settings .members-svg-link{width:64px;height:64px}.members_page_members-settings .members-svg-link svg{position:absolute;top:14px;left:15px;max-width:30px;max-height:30px}.members_page_members-settings .plugin-card-members-edd-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-acf-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-givewp-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-meta-box-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-woocommerce-integration .members-svg-link svg{top:10px;left:8px;max-width:40px;max-height:40px}.members_page_members-settings .plugin-card-members-block-permissions .members-svg-link svg,.members_page_members-settings .plugin-card-members-role-hierarchy .members-svg-link svg{left:14px}.members-addons .plugin-card .desc>p,.members-addons .plugin-card .name{margin-left:84px}}.memberpress-about .welcome-panel-column-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:40px;padding:0;margin:0}.memberpress-about .mp-desc p{font-size:13px;line-height:1.6;color:#334155;margin:0 0 12px}.memberpress-about .mp-desc p:first-child{font-size:15px;font-weight:600;color:#0f172a;margin-top:0;margin-bottom:14px}.memberpress-about .mp-desc p:last-child{margin-bottom:0}.memberpress-about .mp-logo-wrap{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.memberpress-about .mp-logo{display:block;max-width:220px;height:auto;margin:0}.members-about-addons{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-column-gap:20px}.members-about-addons .members-plugin-card{margin:0;width:100%}.members-about-addons .members-plugin-card .plugin-icon{position:static;width:auto;height:28px;max-width:40px;-o-object-fit:contain;object-fit:contain;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;display:block}.members-about-addons .members-plugin-card .name,.members-about-addons .members-plugin-card .desc{margin-left:0}.members-about-addons .members-plugin-card .plugin-card-top{padding:20px}.members-about-addons .members-plugin-card .name h3{margin:0 0 10px;min-height:0;height:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;line-height:1.2}.members-about-addons .members-plugin-card .name h3 a{text-decoration:none;line-height:1.2}.members-about-addons .members-plugin-card .plugin-card-bottom{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:1099px){.members-about-addons{grid-template-columns:1fr;grid-row-gap:20px}}@media screen and (min-width:1100px) and (max-width:1600px){.members-about-addons .members-plugin-card{float:none;width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.members-plugin-card.plugin-card .desc{margin-left:0;margin-top:50px}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{float:none}.members-plugin-card.plugin-card .plugin-card-bottom .column-updated{float:none;width:auto}}@media screen and (max-width:1200px){.welcome-panel .welcome-panel-column-container{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;gap:0;padding:0}.memberpress-about .mp-logo{margin:0 0 20px}}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}@media only screen and (min-width:783px){.members_page_roles .column-users,.members_page_roles .column-granted_caps,.members_page_roles .column-denied_caps{width:100px;text-align:center}}.members-title-div #titlewrap input{padding:0 8px;font-size:1.7em;line-height:normal;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}.members-title-div input[name="role"]{font-size:13px;height:22px;margin:0;width:16em}#tabcapsdiv{margin-top:1em}#tabcapsdiv>.hndle{padding:10px;border-bottom:1px solid #eee}#tabcapsdiv .inside,#members-cp .inside{margin:0;padding:0}.members-cap-filter{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:10px 12px;background:#fff;border-bottom:1px solid #e5e5e5}.members-cap-filter .members-cap-filter-input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:100%;height:32px;line-height:1;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.members-cap-filter .members-cap-filter-count{color:#666;font-size:12px;font-style:italic}.members-cap-filter-empty td{padding:16px 12px;color:#666;font-style:italic;text-align:center}.members-cap-filter-empty:nth-child(even){background:transparent}.members-cap-tabs,.members-tabs{overflow:hidden;background:#fff;background:-webkit-gradient(linear,left top,right top,from(#fafafa),color-stop(20%,#fafafa),color-stop(20%,#fff),to(#fff));background:linear-gradient(90deg,#fafafa 0,#fafafa 20%,#fff 20%,#fff 100%)}@media only screen and (max-width:782px){.members-cap-tabs,.members-tabs{background:linear-gradient(90deg,#fafafa 0,#fafafa 48px,#fff 48px,#fff 100%)}}.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{position:relative;float:left;list-style:none;width:20%;line-height:1em;margin:0 0 -1px 0;padding:0;background-color:#fafafa;border-right:1px solid #eee;-webkit-box-sizing:border-box;box-sizing:border-box}.members-cap-tabs .members-tab-nav li,.members-tabs .members-tab-nav li{display:block;position:relative;margin:0;padding:0;line-height:20px}.members-cap-tabs .members-tab-nav li a,.members-tabs .members-tab-nav li a{display:block;margin:0;padding:10px;line-height:20px !important;text-decoration:none;border-bottom:1px solid #eee;-webkit-box-shadow:none;box-shadow:none}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{line-height:20px;margin-right:3px}.members-cap-tabs .members-tab-nav li[aria-selected="true"] a,.members-tabs .members-tab-nav li[aria-selected="true"] a{position:relative;font-weight:bold;color:#555;background-color:#e0e0e0}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{width:48px}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}.members-tab-nav li .dashicons::before,.members-tab-nav li .dashicons::before{width:24px;height:24px}.members-tab-nav li .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{float:left;width:80%;margin-left:-1px}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{width:calc(100% - 48px)}}#members-cp .members-tab-content{padding:10px;border-left:1px solid #e5e5e5}.members-roles-select th,.members-roles-select td{width:190px;overflow:hidden}.members-roles-select .check-all-th{text-align:center}.members-roles-select .check-all-th label{padding-left:5px}@media only screen and (min-width:850px){#side-sortables .members-tabs{background:#fff}#side-sortables .members-tabs .members-tab-wrap{width:100%}#side-sortables .members-tabs .members-tab-nav{display:table;width:100%}#side-sortables .members-tabs .members-tab-nav li{display:table-cell;text-align:center;border-right:1px solid #eee}#side-sortables .members-tabs .members-tab-nav li:last-of-type{border-right:0}#side-sortables .members-tabs .members-tab-nav li a{padding:10px 0}#side-sortables .members-tabs .members-tab-nav .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}#side-sortables .members-tabs .members-tab-nav .dashicons::before{width:24px;height:24px}#side-sortables .members-tabs .members-tab-nav .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-tabs .members-tabs-label{display:block !important;font-weight:bold;display:inline-block;margin-bottom:4px}.members-tabs .butterbean-control-checkbox .members-tabs-label{display:inline !important}.members-tabs .members-tabs-description{display:block;font-style:italic;margin-top:4px}.members-tabs .members-tabs-label+.members-tabs-description{margin-top:0;margin-bottom:4px}#tabcapsdiv table{border-right:0;border-top:0;border-bottom:0}#tabcapsdiv table td,#tabcapsdiv table th{padding:10px;padding-bottom:10px;border-bottom:1px solid #eee;font-size:13px;line-height:20px}#tabcapsdiv table td{padding:9px}#tabcapsdiv tbody tr:last-of-type td{border-bottom:0}#tabcapsdiv tfoot th{border-color:#eee}@media only screen and (max-width:782px){#tabcapsdiv table td,#tabcapsdiv table th{line-height:24px}}.members-roles-select .column-grant,.members-roles-select .column-deny{width:70px !important;text-align:left;display:table-cell !important;clear:none !important}.members-roles-select thead th,.members-roles-select tfoot th{padding:9px !important}.members-roles-select .column-grant input,.members-roles-select .column-deny input{margin:0 5px 0 0;vertical-align:middle}.members-roles-select tbody tr:nth-child(even){background:#f2f2f2}.members-cap-tabs button{display:inline;margin:-4px;line-height:inherit;padding:4px 8px;border:1px solid transparent;background:transparent;border-radius:0;outline:0;-webkit-transition:all .25s ease-out;transition:all .25s ease-out}.members-cap-tabs button:hover,.members-cap-tabs button:focus{border-color:#eee;background:#fafafa;cursor:pointer}.members-cap-tabs button:active{color:#0073aa;border-color:#0073aa}.members-cap-tabs button+.dashicons{display:none;margin-top:1px;margin-bottom:-1px;line-height:inherit}.members-cap-tabs button:hover+.dashicons,.members-cap-tabs button:focus+.dashicons{display:inline-block}.members-tab-content .members-highlight{background-color:rgba(0,115,170,0.05)}.members-tab-content tbody{-webkit-transition:all 2s ease-in-out;transition:all 2s ease-in-out}.members-cp-role-list-wrap{overflow:auto;min-height:42px;max-height:200px;padding:0 .9em;border:solid 1px #dfdfdf;background-color:#fdfdfd}#wpbody-content{padding-bottom:200px}.members-footer-promotion{text-align:center;font-weight:400;font-size:13px;line-height:16px;color:#787c82;padding:20px 0 30px 0;margin-bottom:20px}.members-footer-promotion p{font-weight:600}.members-footer-promotion-links,.members-footer-promotion-social{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-footer-promotion-links{margin:9px 0 0}.members-footer-promotion-links span{color:#c3c4c7;padding:0 7px}.members-footer-promotion-social{margin:10px 0 0 0;gap:10px}.members-footer-promotion-social li{margin-bottom:0}.members-footer-promotion-social a{display:block;height:16px}.members_page_members-settings.rtl{.addon-activate{left:20px;right:unset}.members-addons .plugin-card{.name,.desc p{margin-left:0;margin-right:148px}}}.button.button-warning{background:#dc3232;border-color:#dc3232;color:#fff}.button.button-warning:hover,.button.button-warning:focus{background:#c92424;border-color:#c92424;color:#fff}.members-reset-spinner{float:none;margin-top:0;vertical-align:middle}.members-import-status{font-weight:600}.members-import-status--exists{color:#d63638}.members-import-status--new{color:#00a32a} \ No newline at end of file +#members-cp h2.hndle,#members-cp-side h2.hndle{border-bottom:none !important;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}#members-cp h2.hndle:before,#members-cp-side h2.hndle:before{content:url("data:image/svg+xml,%3Csvg width='15px' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='users-cog' class='svg-inline--fa fa-users-cog fa-w-20' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z'%3E%3C/path%3E%3C/svg%3E");margin-right:5px}#members-cp-side .postbox-header{border-bottom:none !important}#members-cp-side .handle-actions .handle-order-higher,#members-cp-side .handle-actions .handle-order-lower{display:none}#members-cp-side .handle-actions .handlediv{position:absolute;right:5px}.members-upgrade-header{text-align:center;padding:5px}.members-upgrade-header a{color:#f59431}.memberpress-paid-memberships{background-color:#f5f5f5;padding:50px 10px;text-align:center}.memberpress-paid-memberships a{background-color:#0e4598;display:inline-block;padding:10px 20px;border-radius:300px;color:#fff;text-decoration:none;margin-top:20px}#members-cp-side .members-tabs{position:relative}#members-cp-side .members-tab-nav{background-color:transparent;margin-bottom:20px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title{width:33.333%;height:50px;border-right:none !important}#members-cp-side .members-tab-nav .members-tab-title a{border:0}#members-cp-side .members-tab-content h3{font-weight:bold;font-size:15px;margin-top:0;color:#000;margin-bottom:10px}#members-cp-side .members-tab-content .memberpress-paid-memberships{text-align:left;padding:20px}#members-cp-side .members-tab-content .memberpress-paid-memberships a{display:block;text-align:center}#members-cp-side .members-tabs .members-tab-nav li a,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a i{color:#555}#members-cp-side .members-tabs .members-tab-nav li a svg,#members-cp-side .members-tabs .members-tab-nav li[aria-selected="false"] a svg{fill:#555}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a{background-color:transparent;border-bottom:2px solid #3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a i{color:#3582ae}#members-cp-side .members-tabs .members-tab-nav li[aria-selected="true"] a svg{fill:#3582ae}.members-tab-title svg,.members-tab-title[aria-selected="false"] svg{fill:#0073aa}.members-tab-title[aria-selected="true"] svg{fill:#555}#wpcontent #members-admin-header{margin-left:-20px;padding:0 28px 0 22px;background-color:#0b1220;background-image:radial-gradient(circle at 12% 35%,rgba(14,69,152,0.45),transparent 55%),radial-gradient(circle at 90% 85%,rgba(245,148,49,0.14),transparent 60%);background-repeat:no-repeat;min-height:56px;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#wpcontent #members-admin-header img.members-logo{height:42px;display:block}#wpcontent #members-admin-header .members-by-mp{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;margin-left:auto;text-decoration:none;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:opacity .15s ease;transition:opacity .15s ease}#wpcontent #members-admin-header .members-by-mp:hover,#wpcontent #members-admin-header .members-by-mp:focus{opacity:.75;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}#wpcontent #members-admin-header .members-by-label{color:#94a3b8;font-size:12px;font-weight:500}#wpcontent #members-admin-header img.members-mp-logo{height:18px;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:36px;height:36px;padding:0;margin:0 0 0 18px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);border-radius:8px;color:#fff;cursor:pointer;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .15s ease,border-color .15s ease;transition:background .15s ease,border-color .15s ease;line-height:1;vertical-align:middle;min-height:0;text-decoration:none}#wpcontent #members-admin-header #membersAdminHeaderNotifications:hover,#wpcontent #members-admin-header #membersAdminHeaderNotifications:focus{background:rgba(255,255,255,0.12);border-color:rgba(255,255,255,0.24);color:#fff;-webkit-box-shadow:none;box-shadow:none;outline:0}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg{width:16px;height:auto;display:block}#wpcontent #members-admin-header #membersAdminHeaderNotifications svg path{fill:#e2e8f0}#wpcontent #members-admin-header #membersAdminHeaderNotifications .members-notifications-count{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;border-radius:999px;background:#f59431;color:#0b1220;font-size:10px;font-weight:700;line-height:16px;text-align:center;border:1.5px solid #0b1220;-webkit-box-sizing:content-box;box-sizing:content-box}.members-upgrade-header #close-members-upgrade-header{position:absolute;right:20px;top:3px}.members-upgrade-header #close-members-upgrade-header:hover{cursor:pointer}.memberpress-welcome-panel.welcome-panel{margin-top:20px;padding:20px 28px;background:#fff;border-radius:10px;min-height:0}.memberpress-welcome-panel.welcome-panel .welcome-panel-content{min-height:0;height:auto}.members-about{--ink:#0f172a;--ink-soft:#334155;--ink-muted:#64748b;--mp-blue:#0e4598;--mp-teal:#3582ae;--mp-orange:#f59431;--rule:#e5e7eb;--paper:#fbfaf7;--paper-soft:#f3efe6;--paper-line:#e8e3d5;--display-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--sans-font:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}body.members_page_members-about #wpbody-content,body.toplevel_page_members-about #wpbody-content,body.admin_page_members-about #wpbody-content{background:var(--paper)}.members-about.wrap{max-width:1120px;margin:0 auto;padding:48px 24px 80px;color:var(--ink);font-family:var(--sans-font)}.members-about__hero{display:grid;grid-template-columns:minmax(0,1fr) 200px;grid-template-areas:"head mark" "body mark";gap:32px 56px;-webkit-box-align:start;-ms-flex-align:start;align-items:start;padding-bottom:64px;border-bottom:1px solid var(--paper-line)}.members-about__hero-head{grid-area:head}.members-about__body{grid-area:body}.members-about__mark{grid-area:mark;align-self:start}.members-about__eyebrow{display:inline-block;font-family:var(--sans-font);font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-muted);padding-bottom:18px}.members-about__title{font-family:var(--display-font);font-weight:900;font-size:clamp(40px,5.5vw,64px);line-height:1;letter-spacing:-0.035em;color:var(--ink);margin:0}.members-about__title em{font-style:normal;font-weight:900;color:var(--mp-blue)}.members-about__title-dot{color:var(--mp-blue);font-style:normal;font-weight:900}.members-about__body{max-width:60ch;font-size:15.5px;line-height:1.62;color:var(--ink-soft)}.members-about__body p{margin:0 0 14px}.members-about__body p:last-child{margin-bottom:0}.members-about__lead{font-family:var(--sans-font);font-weight:500;font-size:17px;line-height:1.5;color:var(--ink);margin-bottom:24px !important;padding-left:18px;border-left:2px solid var(--mp-blue)}.members-about__body a,.members-about__lead a{color:var(--mp-blue);text-decoration:none;background-image:-webkit-gradient(linear,left top,left bottom,from(currentColor),to(currentColor));background-image:linear-gradient(currentColor,currentColor);background-size:100% 1px;background-position:0 100%;background-repeat:no-repeat;padding-bottom:1px;-webkit-transition:color .2s ease,background-size .2s ease;transition:color .2s ease,background-size .2s ease}.members-about__body a:hover,.members-about__lead a:hover{color:var(--mp-orange)}.members-about__body em,.members-about__lead em{font-style:normal;font-weight:700;color:var(--mp-blue)}.members-about__mark{padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(15,23,42,0.03);box-shadow:0 1px 2px rgba(15,23,42,0.03);-webkit-transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__mark:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px);-webkit-box-shadow:0 8px 20px rgba(15,23,42,0.08);box-shadow:0 8px 20px rgba(15,23,42,0.08)}.members-about__mark a{display:block;-webkit-box-shadow:none !important;box-shadow:none !important;text-decoration:none}.members-about__mark img{display:block;width:100%;height:auto;max-width:160px;margin:0 auto}.members-about__products{padding-top:56px}.members-about__products-head{margin-bottom:28px;text-align:center}.members-about__products-head h3{font-family:var(--display-font);font-weight:700;font-size:15px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-muted);margin:0}.members-about__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.members-about__card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:24px;background:#fff;border:1px solid var(--paper-line);border-radius:6px;-webkit-transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease,-webkit-transform .25s ease,-webkit-box-shadow .25s ease}.members-about__card:hover{-webkit-transform:translateY(-3px);transform:translateY(-3px);-webkit-box-shadow:0 12px 28px rgba(15,23,42,0.08);box-shadow:0 12px 28px rgba(15,23,42,0.08);border-color:rgba(14,69,152,0.2)}.members-about__card-head{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:14px;margin-bottom:14px}.members-about__card-icon{-webkit-box-flex:0;-ms-flex:0 0 44px;flex:0 0 44px;width:44px;height:44px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:var(--paper-soft);border-radius:10px;overflow:hidden}.members-about__card-icon img{display:block;max-width:32px;max-height:32px;width:auto;height:auto}.members-about__card-title{margin:0;font-family:var(--display-font);font-weight:700;font-size:17px;line-height:1.2;letter-spacing:-0.01em;color:var(--ink)}.members-about__card-title a{color:inherit;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.members-about__card-title a:hover{color:var(--mp-blue)}.members-about__card-desc{-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 0 24px;font-size:14px;line-height:1.55;color:var(--ink-soft)}.members-about__card-foot{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;gap:16px;padding-top:16px;border-top:1px solid var(--paper-line)}.members-about__status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted)}.members-about__status::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}.members-about__status.is-active{color:#10b981}.members-about__status.is-inactive{color:var(--mp-orange)}.members-about__status.is-missing{color:var(--ink-muted)}.members-about__cta{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:8px 14px;font-size:13px;font-weight:600;letter-spacing:.01em;border-radius:4px;text-decoration:none;border:1px solid transparent;-webkit-transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,-webkit-transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease;transition:background .2s ease,border-color .2s ease,color .2s ease,transform .15s ease,-webkit-transform .15s ease;-webkit-box-shadow:none;box-shadow:none}.members-about__cta:focus,.members-about__cta:focus-visible{outline:2px solid var(--mp-blue);outline-offset:2px;-webkit-box-shadow:none;box-shadow:none}.members-about__cta.is-primary{background:var(--mp-blue);color:#fff}.members-about__cta.is-primary:hover{background:#093374;color:#fff;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.members-about__cta.is-secondary{background:transparent;color:var(--ink);border-color:var(--rule)}.members-about__cta.is-secondary:hover{border-color:var(--ink);background:#fff;color:var(--ink)}.members-about__cta svg{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.members-about__cta:hover svg{-webkit-transform:translate(1px,-1px);transform:translate(1px,-1px)}@media(max-width:900px){.members-about__hero{grid-template-columns:1fr;grid-template-areas:"head" "body" "mark";gap:24px}.members-about__mark{max-width:160px}.members-about__grid{grid-template-columns:1fr}}.memberpress-welcome-panel.welcome-panel:before{background:0}.memberpress-welcome-panel.welcome-panel .about-description{margin:20px 0}.memberpress-welcome-panel.welcome-panel-content{margin:0}.memberpress-welcome-panel.welcome-panel-content .mp-logo-wrap>a{display:block}@media screen and (min-width:870px){.members_page_members-settings .members-short-p{max-width:612px;margin-left:auto;margin-right:auto}.members_page_members-settings .welcome-panel-content{text-align:center}}.members_page_members-settings .welcome-panel .button.button-hero{margin-left:auto;margin-right:auto}.members_page_members-settings .members-svg-wrap{display:inline-block;margin:0 auto 20px}@media screen and (max-width:870px){.members_page_members-settings .welcome-panel{padding:20px}.members_page_members-settings .members-svg-wrap{float:left;margin-right:28px}.admin_page_members-settings.rtl .members-svg-wrap{float:right;margin-right:0;margin-left:28px}}.members_page_members-settings .members-svg-link{display:table-cell;text-align:center;width:128px;height:128px;background:#363b3f;color:#fff;padding:24px 16px 16px;border-radius:50%;-webkit-box-sizing:border-box;box-sizing:border-box;border:4px solid #fff;-webkit-box-shadow:0 0 0 4px #363b3f;box-shadow:0 0 0 4px #363b3f}.members_page_members-settings .members-svg-link svg{max-width:84px;max-height:64px;width:auto;height:auto}.members-addons{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:20px;grid-column-gap:20px}.members-addons .plugin-card{margin:0}.members-addons .plugin-card-top{width:100%}.members-addon{width:100%;position:relative;float:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-addon .desc{margin-bottom:80px}.addon-activate{text-align:center;border:1px solid #ddd;border-radius:3px;padding:5px 10px 10px;display:inline-block;width:100px;position:absolute;right:20px;bottom:20px}.activate-toggle:hover{cursor:pointer}.activate-toggle svg{max-width:20px;position:relative;top:5px}.activate-toggle svg{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.activate-toggle svg.active{-webkit-transform:rotate(0);transform:rotate(0)}.activate-toggle svg path{fill:#ccc}.activate-toggle svg.active path{fill:#8cbd5a}.activate-toggle.processing{cursor:not-allowed;pointer-events:none;opacity:.5}.activate-toggle .action-label{display:inline-block;width:50px;text-align:left}.mepr_dummy_txns{-webkit-filter:blur(3px);filter:blur(3px);position:absolute;top:0;left:0;width:100%;z-index:5;pointer-events:none}.mepr_dummy_txns::after{background-color:rgba(0,0,0,.2);position:absolute;top:0;left:0;width:100%;height:100%;z-index:6}.mepr-upgrade-table{position:relative}.mepr-upgrade-table .mepr-upgrade{position:relative;top:100px;z-index:10;background:rgba(0,0,0,.2);width:100%;height:100%;max-width:600px;margin:0 auto;-webkit-box-shadow:0 0 30px #ccc;box-shadow:0 0 30px #ccc}.mepr-upgrade-content{background-color:#fff;padding:20px;text-align:center}.mepr-upgrade-content h2{font-size:24px}.mepr-upgrade-content h4{font-size:18px}.mepr-upgrade-content .features{display:grid;grid-template-columns:1fr 1fr;grid-column-gap:30px;grid-row-gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:left;padding:10px}.features li:before{content:"\f147";font-family:dashicons;color:green;font-size:20px;position:relative;top:4px;margin-right:10px}.mepr-upgrade-cta{text-align:center;background-color:#f2f2f2;padding:20px}.mepr-upgrade-cta .mepr-cta-button{display:block;max-width:300px;margin:0 auto 20px;background-color:#fd9c27;color:#fff;padding:15px;font-size:18px;font-weight:bold;text-decoration:none;border-radius:300px}.members-plugin-card.plugin-card:nth-child(even){margin-right:inherit}.members-plugin-card.plugin-card:nth-child(odd){clear:none;margin-left:inherit}.members-plugin-card.plugin-card .plugin-card-top{min-height:0;padding:30px 20px}.members-plugin-card.plugin-card .plugin-icon{top:30px}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{font-weight:bold}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .active{color:#8cbd5a}.members-plugin-card.plugin-card .plugin-card-bottom .column-status .inactive{color:red}.members-plugin-card.plugin-card .plugin-icon{width:64px;height:auto}.plugin-icon-small{width:32px;height:auto}.members-plugin-card.plugin-card .name,.members-plugin-card.plugin-card .desc{margin-right:0;margin-left:84px}.members-addons .plugin-card .name,.members-addons .plugin-card .desc p{margin-right:0}@media screen and (max-width:1100px){.members-addons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}@media screen and (max-width:600px){.members_page_members-settings .members-svg-link{width:64px;height:64px}.members_page_members-settings .members-svg-link svg{position:absolute;top:14px;left:15px;max-width:30px;max-height:30px}.members_page_members-settings .plugin-card-members-edd-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-acf-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-givewp-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-meta-box-integration .members-svg-link svg,.members_page_members-settings .plugin-card-members-woocommerce-integration .members-svg-link svg{top:10px;left:8px;max-width:40px;max-height:40px}.members_page_members-settings .plugin-card-members-block-permissions .members-svg-link svg,.members_page_members-settings .plugin-card-members-role-hierarchy .members-svg-link svg{left:14px}.members-addons .plugin-card .desc>p,.members-addons .plugin-card .name{margin-left:84px}}.memberpress-about .welcome-panel-column-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:40px;padding:0;margin:0}.memberpress-about .mp-desc p{font-size:13px;line-height:1.6;color:#334155;margin:0 0 12px}.memberpress-about .mp-desc p:first-child{font-size:15px;font-weight:600;color:#0f172a;margin-top:0;margin-bottom:14px}.memberpress-about .mp-desc p:last-child{margin-bottom:0}.memberpress-about .mp-logo-wrap{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.memberpress-about .mp-logo{display:block;max-width:220px;height:auto;margin:0}.members-about-addons{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-column-gap:20px}.members-about-addons .members-plugin-card{margin:0;width:100%}.members-about-addons .members-plugin-card .plugin-icon{position:static;width:auto;height:28px;max-width:40px;-o-object-fit:contain;object-fit:contain;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;display:block}.members-about-addons .members-plugin-card .name,.members-about-addons .members-plugin-card .desc{margin-left:0}.members-about-addons .members-plugin-card .plugin-card-top{padding:20px}.members-about-addons .members-plugin-card .name h3{margin:0 0 10px;min-height:0;height:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;line-height:1.2}.members-about-addons .members-plugin-card .name h3 a{text-decoration:none;line-height:1.2}.members-about-addons .members-plugin-card .plugin-card-bottom{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:1099px){.members-about-addons{grid-template-columns:1fr;grid-row-gap:20px}}@media screen and (min-width:1100px) and (max-width:1600px){.members-about-addons .members-plugin-card{float:none;width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.members-plugin-card.plugin-card .desc{margin-left:0;margin-top:50px}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}.members-plugin-card.plugin-card .plugin-card-bottom .column-status{float:none}.members-plugin-card.plugin-card .plugin-card-bottom .column-updated{float:none;width:auto}}@media screen and (max-width:1200px){.welcome-panel .welcome-panel-column-container{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;gap:0;padding:0}.memberpress-about .mp-logo{margin:0 0 20px}}.members-plugin-card.plugin-card .desc p{margin-left:0;margin-right:0}@media only screen and (min-width:783px){.members_page_roles .column-users,.members_page_roles .column-granted_caps,.members_page_roles .column-denied_caps{width:100px;text-align:center}}.members-title-div #titlewrap input{padding:0 8px;font-size:1.7em;line-height:normal;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}.members-title-div input[name="role"]{font-size:13px;height:22px;margin:0;width:16em}#tabcapsdiv{margin-top:1em}#tabcapsdiv>.hndle{padding:10px;border-bottom:1px solid #eee}#tabcapsdiv .inside,#members-cp .inside{margin:0;padding:0}.members-cap-filter{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:10px 12px;background:#fff;border-bottom:1px solid #e5e5e5}.members-cap-filter .members-cap-filter-input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:100%;height:32px;line-height:1;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.members-cap-filter .members-cap-filter-count{color:#666;font-size:12px;font-style:italic}.members-cap-filter-empty td{padding:16px 12px;color:#666;font-style:italic;text-align:center}.members-cap-filter-empty{background:transparent}.members-cap-tabs,.members-tabs{overflow:hidden;background:#fff;background:-webkit-gradient(linear,left top,right top,from(#fafafa),color-stop(20%,#fafafa),color-stop(20%,#fff),to(#fff));background:linear-gradient(90deg,#fafafa 0,#fafafa 20%,#fff 20%,#fff 100%)}@media only screen and (max-width:782px){.members-cap-tabs,.members-tabs{background:linear-gradient(90deg,#fafafa 0,#fafafa 48px,#fff 48px,#fff 100%)}}.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{position:relative;float:left;list-style:none;width:20%;line-height:1em;margin:0 0 -1px 0;padding:0;background-color:#fafafa;border-right:1px solid #eee;-webkit-box-sizing:border-box;box-sizing:border-box}.members-cap-tabs .members-tab-nav li,.members-tabs .members-tab-nav li{display:block;position:relative;margin:0;padding:0;line-height:20px}.members-cap-tabs .members-tab-nav li a,.members-tabs .members-tab-nav li a{display:block;margin:0;padding:10px;line-height:20px !important;text-decoration:none;border-bottom:1px solid #eee;-webkit-box-shadow:none;box-shadow:none}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{line-height:20px;margin-right:3px}.members-cap-tabs .members-tab-nav li[aria-selected="true"] a,.members-tabs .members-tab-nav li[aria-selected="true"] a{position:relative;font-weight:bold;color:#555;background-color:#e0e0e0}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-nav,.members-tabs .members-tab-nav{width:48px}.members-cap-tabs .members-tab-nav li a .dashicons,.members-tabs .members-tab-nav li a .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}.members-tab-nav li .dashicons::before,.members-tab-nav li .dashicons::before{width:24px;height:24px}.members-tab-nav li .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{float:left;width:80%;margin-left:-1px}@media only screen and (max-width:782px){.members-cap-tabs .members-tab-wrap,.members-tabs .members-tab-wrap{width:calc(100% - 48px)}}#members-cp .members-tab-content{padding:10px;border-left:1px solid #e5e5e5}.members-roles-select th,.members-roles-select td{width:190px;overflow:hidden}.members-roles-select .check-all-th{text-align:center}.members-roles-select .check-all-th label{padding-left:5px}@media only screen and (min-width:850px){#side-sortables .members-tabs{background:#fff}#side-sortables .members-tabs .members-tab-wrap{width:100%}#side-sortables .members-tabs .members-tab-nav{display:table;width:100%}#side-sortables .members-tabs .members-tab-nav li{display:table-cell;text-align:center;border-right:1px solid #eee}#side-sortables .members-tabs .members-tab-nav li:last-of-type{border-right:0}#side-sortables .members-tabs .members-tab-nav li a{padding:10px 0}#side-sortables .members-tabs .members-tab-nav .dashicons{width:24px;height:24px;font-size:24px;line-height:24px}#side-sortables .members-tabs .members-tab-nav .dashicons::before{width:24px;height:24px}#side-sortables .members-tabs .members-tab-nav .label{overflow:hidden;position:absolute;top:-1000em;left:-1000em;width:1px;height:1px}}.members-tabs .members-tabs-label{display:block !important;font-weight:bold;display:inline-block;margin-bottom:4px}.members-tabs .butterbean-control-checkbox .members-tabs-label{display:inline !important}.members-tabs .members-tabs-description{display:block;font-style:italic;margin-top:4px}.members-tabs .members-tabs-label+.members-tabs-description{margin-top:0;margin-bottom:4px}#tabcapsdiv table{border-right:0;border-top:0;border-bottom:0}#tabcapsdiv table td,#tabcapsdiv table th{padding:10px;padding-bottom:10px;border-bottom:1px solid #eee;font-size:13px;line-height:20px}#tabcapsdiv table td{padding:9px}#tabcapsdiv tbody tr:last-of-type td{border-bottom:0}#tabcapsdiv tfoot th{border-color:#eee}@media only screen and (max-width:782px){#tabcapsdiv table td,#tabcapsdiv table th{line-height:24px}}.members-roles-select .column-grant,.members-roles-select .column-deny{width:70px !important;text-align:left;display:table-cell !important;clear:none !important}.members-roles-select thead th,.members-roles-select tfoot th{padding:9px !important}.members-roles-select .column-grant input,.members-roles-select .column-deny input{margin:0 5px 0 0;vertical-align:middle}.members-roles-select tbody tr.members-cap-row-alt{background:#f2f2f2}.members-cap-tabs button{display:inline;margin:-4px;line-height:inherit;padding:4px 8px;border:1px solid transparent;background:transparent;border-radius:0;outline:0;-webkit-transition:all .25s ease-out;transition:all .25s ease-out}.members-cap-tabs button:hover,.members-cap-tabs button:focus{border-color:#eee;background:#fafafa;cursor:pointer}.members-cap-tabs button:active{color:#0073aa;border-color:#0073aa}.members-cap-tabs button+.dashicons{display:none;margin-top:1px;margin-bottom:-1px;line-height:inherit}.members-cap-tabs button:hover+.dashicons,.members-cap-tabs button:focus+.dashicons{display:inline-block}.members-tab-content .members-highlight{background-color:rgba(0,115,170,0.05)}.members-tab-content tbody{-webkit-transition:all 2s ease-in-out;transition:all 2s ease-in-out}.members-cp-role-list-wrap{overflow:auto;min-height:42px;max-height:200px;padding:0 .9em;border:solid 1px #dfdfdf;background-color:#fdfdfd}#wpbody-content{padding-bottom:200px}.members-footer-promotion{text-align:center;font-weight:400;font-size:13px;line-height:16px;color:#787c82;padding:20px 0 30px 0;margin-bottom:20px}.members-footer-promotion p{font-weight:600}.members-footer-promotion-links,.members-footer-promotion-social{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.members-footer-promotion-links{margin:9px 0 0}.members-footer-promotion-links span{color:#c3c4c7;padding:0 7px}.members-footer-promotion-social{margin:10px 0 0 0;gap:10px}.members-footer-promotion-social li{margin-bottom:0}.members-footer-promotion-social a{display:block;height:16px}.members_page_members-settings.rtl{.addon-activate{left:20px;right:unset}.members-addons .plugin-card{.name,.desc p{margin-left:0;margin-right:148px}}}.button.button-warning{background:#dc3232;border-color:#dc3232;color:#fff}.button.button-warning:hover,.button.button-warning:focus{background:#c92424;border-color:#c92424;color:#fff}.members-reset-spinner{float:none;margin-top:0;vertical-align:middle}.members-import-status{font-weight:600}.members-import-status--exists{color:#d63638}.members-import-status--new{color:#00a32a} \ No newline at end of file diff --git a/js/edit-role.js b/js/edit-role.js index 4b7555c5..a8e7f4f5 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -199,6 +199,55 @@ jQuery( document ).ready( function() { /* ====== Capability Filter (search) ====== */ + // Translation helpers. Resolve text via `wp.i18n` when available so that + // pluralization respects the active locale's plural formula; otherwise fall + // back to English defaults so the script stays functional even if `wp-i18n` + // failed to load. + var members_i18n_translate = function( text ) { + return ( window.wp && wp.i18n && wp.i18n.__ ) ? wp.i18n.__( text, 'members' ) : text; + }; + + var members_i18n_n = function( single, plural, n ) { + + var template; + + if ( window.wp && wp.i18n && wp.i18n._n && wp.i18n.sprintf ) { + template = wp.i18n._n( single, plural, n, 'members' ); + return wp.i18n.sprintf( template, n ); + } + + template = ( 1 === n ? single : plural ); + return template.replace( '%d', n ); + }; + + /** + * Re-applies alternating-row striping to the visible capability rows in a + * given table body. Replaces the previous CSS `:nth-child(even)` rule, which + * counted hidden rows and produced inconsistent striping when filtering. + * + * @since 3.x.0 + * @access public + * @param jQuery $tbody + * @return void + */ + function members_stripe_rows( $tbody ) { + + var i = 0; + + $tbody.find( 'tr.members-cap-checklist' ).each( function() { + + var $row = jQuery( this ); + + if ( 'none' === $row.css( 'display' ) ) { + $row.removeClass( 'members-cap-row-alt' ); + return; + } + + $row.toggleClass( 'members-cap-row-alt', 1 === ( i % 2 ) ); + i++; + } ); + } + /** * Filters the rows in the currently active capability tab to those matching * the search input. The match is case-insensitive and runs against both the @@ -252,13 +301,17 @@ jQuery( document ).ready( function() { } ); // Toggle a "no matches" empty-state row inside the active tab's table. - var $tbody = $activeTab.find( 'tbody' ).first(); - var $empty = $tbody.find( 'tr.members-cap-filter-empty' ); + var $table = $activeTab.find( 'table' ).first(); + var $tbody = $table.find( 'tbody' ).first(); + var $empty = $tbody.find( 'tr.members-cap-filter-empty' ); + var col_cnt = $table.find( 'thead th' ).length || 3; if ( ! $empty.length ) { - $empty = jQuery( '' ); - $empty.find( 'td' ).text( members_i18n.filter_no_matches ); + $empty = jQuery( '' ); + $empty.find( 'td' ).attr( 'colspan', col_cnt ).text( members_i18n_translate( 'No capabilities match your filter.' ) ); $tbody.append( $empty ); + } else { + $empty.find( 'td' ).attr( 'colspan', col_cnt ); } if ( query && 0 === visible_count ) { @@ -267,17 +320,24 @@ jQuery( document ).ready( function() { $empty.hide(); } + // Re-stripe the now-visible rows so alternating backgrounds stay consistent. + members_stripe_rows( $tbody ); + // Update the live match count next to the input. var $count = jQuery( '.members-cap-filter-count' ); if ( '' === query ) { $count.text( '' ); } else { - var template = 1 === visible_count ? members_i18n.filter_matches : members_i18n.filter_matches_plural; - $count.text( template.replace( '%d', visible_count ) ); + $count.text( members_i18n_n( '%d match', '%d matches', visible_count ) ); } } + // Apply initial striping to every cap section table after templates render. + jQuery( '.members-tab-content table.members-roles-select tbody' ).each( function() { + members_stripe_rows( jQuery( this ) ); + } ); + // Filter on every keystroke in the search input. jQuery( document ).on( 'input search', '#members-cap-filter-input', function() { members_apply_cap_filter(); @@ -528,8 +588,10 @@ jQuery( document ).ready( function() { return; } - // Clear any active filter so the new cap row is visible. - jQuery( '#members-cap-filter-input' ).val( '' ); + // Clear any active filter so the new cap row is visible. Trigger + // `input` so the count text and empty-state row reset explicitly + // rather than relying on the tab-click handler. + jQuery( '#members-cap-filter-input' ).val( '' ).trigger( 'input' ); // Trigger a click event on the "custom" tab in the edit caps box. jQuery( 'a[href="#members-tab-custom"]' ).trigger( 'click' ); @@ -551,6 +613,10 @@ jQuery( document ).ready( function() { // Prepend our template to the "custom" edit caps tab content. jQuery( '#members-tab-custom tbody' ).prepend( control_template( data ) ); + // Re-stripe the custom tab body so the new row aligns with the + // alternating-row pattern. + members_stripe_rows( jQuery( '#members-tab-custom tbody' ) ); + // Get the new cap table row. var parent = jQuery( '[data-grant-cap="' + new_cap + '"]' ).parents( '.members-cap-checklist' ); diff --git a/js/edit-role.min.js b/js/edit-role.min.js index d638fef8..9a7da55e 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase(),e.attr("data-cap-search",t));""===r||-1!==t.indexOf(r)?(e.show(),n++):e.hide()});var c=t.find("tbody").first(),i=c.find("tr.members-cap-filter-empty");i.length||((i=jQuery('')).find("td").text(members_i18n.filter_no_matches),c.append(i)),r&&0===n?i.show():i.hide();var s=jQuery(".members-cap-filter-count");if(""===r)s.text("");else{var u=1===n?members_i18n.filter_matches:members_i18n.filter_matches_plural;s.text(u.replace("%d",n))}}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this),t=e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"";e.attr("data-cap-search",(t+" "+e.find(".column-cap").text()).toLowerCase())})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(document).on("input search","#members-cap-filter-input",function(){n()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val(""),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this),t=e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"";e.attr("data-cap-search",(t+" "+e.find(".column-cap").text()).toLowerCase())})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()});var o=function(e){return window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__(e,"members"):e},m=function(e,t,r){var a;return window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?(a=wp.i18n._n(e,t,r,"members"),wp.i18n.sprintf(a,r)):(a=1===r?e:t).replace("%d",r)};function d(e){var t=0;e.find("tr.members-cap-checklist").each(function(){var e=jQuery(this);"none"!==e.css("display")?(e.toggleClass("members-cap-row-alt",1==t%2),t++):e.removeClass("members-cap-row-alt")})}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase(),e.attr("data-cap-search",t));""===r||-1!==t.indexOf(r)?(e.show(),n++):e.hide()});var c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(o("No capabilities match your filter.")),i.append(s)),r&&0===n?s.show():s.hide(),d(i);var p=jQuery(".members-cap-filter-count");""===r?p.text(""):p.text(m("%d match","%d matches",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}jQuery(".members-tab-content table.members-roles-select tbody").each(function(){d(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){n()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),d(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From 1ae297f69c78e0f17b282bd3447db53128fad4f4 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Fri, 8 May 2026 19:04:52 +0300 Subject: [PATCH 03/11] Refactor capability search logic in roles management --- js/edit-role.js | 52 +++++++++++++++++++++------------------------ js/edit-role.min.js | 2 +- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/js/edit-role.js b/js/edit-role.js index a8e7f4f5..f89107d0 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -144,11 +144,8 @@ jQuery( document ).ready( function() { jQuery( '.members-cap-checklist' ).each( function() { var $row = jQuery( this ); - var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) - || $row.find( 'input[data-deny-cap]' ).attr( 'data-deny-cap' ) - || ''; - $row.attr( 'data-cap-search', ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase() ); + $row.attr( 'data-cap-search', members_get_cap_search_haystack( $row ) ); } ); } @@ -220,6 +217,23 @@ jQuery( document ).ready( function() { return template.replace( '%d', n ); }; + /** + * Builds the lowercase search string for a capability row (slug + label text). + * + * @since 3.x.0 + * @access public + * @param jQuery $row `.members-cap-checklist` row. + * @return string + */ + function members_get_cap_search_haystack( $row ) { + + var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) + || $row.find( 'input[data-deny-cap]' ).attr( 'data-deny-cap' ) + || ''; + + return ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase(); + } + /** * Re-applies alternating-row striping to the visible capability rows in a * given table body. Replaces the previous CSS `:nth-child(even)` rule, which @@ -232,20 +246,8 @@ jQuery( document ).ready( function() { */ function members_stripe_rows( $tbody ) { - var i = 0; - - $tbody.find( 'tr.members-cap-checklist' ).each( function() { - - var $row = jQuery( this ); - - if ( 'none' === $row.css( 'display' ) ) { - $row.removeClass( 'members-cap-row-alt' ); - return; - } - - $row.toggleClass( 'members-cap-row-alt', 1 === ( i % 2 ) ); - i++; - } ); + $tbody.find( 'tr.members-cap-checklist' ).removeClass( 'members-cap-row-alt' ); + $tbody.find( 'tr.members-cap-checklist:visible:odd' ).addClass( 'members-cap-row-alt' ); } /** @@ -277,26 +279,23 @@ jQuery( document ).ready( function() { $rows.each( function() { - var $row = jQuery( this ); + var $row = jQuery( this ); var haystack = $row.attr( 'data-cap-search' ); // Build the search haystack on the fly if it wasn't cached at render time // (e.g. for a custom cap row added after initial template rendering). if ( ! haystack ) { - - var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) - || $row.find( 'input[data-deny-cap]' ).attr( 'data-deny-cap' ) - || ''; - - haystack = ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase(); + haystack = members_get_cap_search_haystack( $row ); $row.attr( 'data-cap-search', haystack ); } if ( '' === query || -1 !== haystack.indexOf( query ) ) { $row.show(); + $row.toggleClass( 'members-cap-row-alt', 1 === ( visible_count % 2 ) ); visible_count++; } else { $row.hide(); + $row.removeClass( 'members-cap-row-alt' ); } } ); @@ -320,9 +319,6 @@ jQuery( document ).ready( function() { $empty.hide(); } - // Re-stripe the now-visible rows so alternating backgrounds stay consistent. - members_stripe_rows( $tbody ); - // Update the live match count next to the input. var $count = jQuery( '.members-cap-filter-count' ); diff --git a/js/edit-role.min.js b/js/edit-role.min.js index 9a7da55e..4649092d 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this),t=e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"";e.attr("data-cap-search",(t+" "+e.find(".column-cap").text()).toLowerCase())})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()});var o=function(e){return window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__(e,"members"):e},m=function(e,t,r){var a;return window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?(a=wp.i18n._n(e,t,r,"members"),wp.i18n.sprintf(a,r)):(a=1===r?e:t).replace("%d",r)};function d(e){var t=0;e.find("tr.members-cap-checklist").each(function(){var e=jQuery(this);"none"!==e.css("display")?(e.toggleClass("members-cap-row-alt",1==t%2),t++):e.removeClass("members-cap-row-alt")})}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase(),e.attr("data-cap-search",t));""===r||-1!==t.indexOf(r)?(e.show(),n++):e.hide()});var c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(o("No capabilities match your filter.")),i.append(s)),r&&0===n?s.show():s.hide(),d(i);var p=jQuery(".members-cap-filter-count");""===r?p.text(""):p.text(m("%d match","%d matches",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}jQuery(".members-tab-content table.members-roles-select tbody").each(function(){d(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){n()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),d(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",d(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),c()});var m=function(e){return window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__(e,"members"):e},o=function(e,t,r){var a;return window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?(a=wp.i18n._n(e,t,r,"members"),wp.i18n.sprintf(a,r)):(a=1===r?e:t).replace("%d",r)};function d(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function n(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function c(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=d(e),e.attr("data-cap-search",t)),""===r||-1!==t.indexOf(r)?(e.show(),e.toggleClass("members-cap-row-alt",1==n%2),n++):(e.hide(),e.removeClass("members-cap-row-alt"))});var c=t.find("table").first(),s=c.find("tbody").first(),i=s.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;i.length?i.find("td").attr("colspan",u):((i=jQuery('')).find("td").attr("colspan",u).text(m("No capabilities match your filter.")),s.append(i)),r&&0===n?i.show():i.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):p.text(o("%d match","%d matches",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}jQuery(".members-tab-content table.members-roles-select tbody").each(function(){n(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){c()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),s=a.find("input.check-all-deny"),i=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(i.prop("checked",!0),s.prop("checked",!1)):(s.prop("checked",!0),i.prop("checked",!1)):r?i.prop("checked",!1):s.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),n(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From a49b2a239f92435ed050117d59a60fd16a1631c1 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Fri, 8 May 2026 19:46:05 +0300 Subject: [PATCH 04/11] Refactor localization handling in capability filter for roles management --- admin/functions-admin.php | 15 +++++++++------ js/edit-role.js | 38 +++++++++++++++----------------------- js/edit-role.min.js | 2 +- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/admin/functions-admin.php b/admin/functions-admin.php index 1607a799..bf4d5bcc 100644 --- a/admin/functions-admin.php +++ b/admin/functions-admin.php @@ -61,12 +61,15 @@ function members_admin_register_scripts() { // Localize our script with some text we want to pass in. $i18n = array( - 'button_role_edit' => esc_html__( 'Edit', 'members' ), - 'button_role_ok' => esc_html__( 'OK', 'members' ), - 'label_grant_cap' => esc_html__( 'Grant %s capability', 'members' ), - 'label_deny_cap' => esc_html__( 'Deny %s capability', 'members' ), - 'ays_delete_role' => esc_html__( 'Are you sure you want to delete this role? This is a permanent action and cannot be undone.', 'members' ), - 'hidden_caps' => members_get_hidden_caps(), + 'button_role_edit' => esc_html__( 'Edit', 'members' ), + 'button_role_ok' => esc_html__( 'OK', 'members' ), + 'label_grant_cap' => esc_html__( 'Grant %s capability', 'members' ), + 'label_deny_cap' => esc_html__( 'Deny %s capability', 'members' ), + 'ays_delete_role' => esc_html__( 'Are you sure you want to delete this role? This is a permanent action and cannot be undone.', 'members' ), + 'hidden_caps' => members_get_hidden_caps(), + 'cap_filter_no_results' => esc_html__( 'No capabilities match your filter.', 'members' ), + 'cap_filter_match' => esc_html__( '%d match', 'members' ), + 'cap_filter_matches' => esc_html__( '%d matches', 'members' ), ); wp_localize_script( 'members-edit-role', 'members_i18n', $i18n ); diff --git a/js/edit-role.js b/js/edit-role.js index f89107d0..7cfbc6eb 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -196,27 +196,6 @@ jQuery( document ).ready( function() { /* ====== Capability Filter (search) ====== */ - // Translation helpers. Resolve text via `wp.i18n` when available so that - // pluralization respects the active locale's plural formula; otherwise fall - // back to English defaults so the script stays functional even if `wp-i18n` - // failed to load. - var members_i18n_translate = function( text ) { - return ( window.wp && wp.i18n && wp.i18n.__ ) ? wp.i18n.__( text, 'members' ) : text; - }; - - var members_i18n_n = function( single, plural, n ) { - - var template; - - if ( window.wp && wp.i18n && wp.i18n._n && wp.i18n.sprintf ) { - template = wp.i18n._n( single, plural, n, 'members' ); - return wp.i18n.sprintf( template, n ); - } - - template = ( 1 === n ? single : plural ); - return template.replace( '%d', n ); - }; - /** * Builds the lowercase search string for a capability row (slug + label text). * @@ -307,7 +286,11 @@ jQuery( document ).ready( function() { if ( ! $empty.length ) { $empty = jQuery( '' ); - $empty.find( 'td' ).attr( 'colspan', col_cnt ).text( members_i18n_translate( 'No capabilities match your filter.' ) ); + $empty.find( 'td' ).attr( 'colspan', col_cnt ).text( + window.wp && wp.i18n && wp.i18n.__ + ? wp.i18n.__( 'No capabilities match your filter.', 'members' ) + : members_i18n.cap_filter_no_results + ); $tbody.append( $empty ); } else { $empty.find( 'td' ).attr( 'colspan', col_cnt ); @@ -324,8 +307,17 @@ jQuery( document ).ready( function() { if ( '' === query ) { $count.text( '' ); + } else if ( window.wp && wp.i18n && wp.i18n._n && wp.i18n.sprintf ) { + $count.text( + wp.i18n.sprintf( + wp.i18n._n( '%d match', '%d matches', visible_count, 'members' ), + visible_count + ) + ); } else { - $count.text( members_i18n_n( '%d match', '%d matches', visible_count ) ); + $count.text( + ( 1 === visible_count ? members_i18n.cap_filter_match : members_i18n.cap_filter_matches ).replace( '%d', visible_count ) + ); } } diff --git a/js/edit-role.min.js b/js/edit-role.min.js index 4649092d..ba157d2e 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",d(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),c()});var m=function(e){return window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__(e,"members"):e},o=function(e,t,r){var a;return window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?(a=wp.i18n._n(e,t,r,"members"),wp.i18n.sprintf(a,r)):(a=1===r?e:t).replace("%d",r)};function d(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function n(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function c(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=d(e),e.attr("data-cap-search",t)),""===r||-1!==t.indexOf(r)?(e.show(),e.toggleClass("members-cap-row-alt",1==n%2),n++):(e.hide(),e.removeClass("members-cap-row-alt"))});var c=t.find("table").first(),s=c.find("tbody").first(),i=s.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;i.length?i.find("td").attr("colspan",u):((i=jQuery('')).find("td").attr("colspan",u).text(m("No capabilities match your filter.")),s.append(i)),r&&0===n?i.show():i.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):p.text(o("%d match","%d matches",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}jQuery(".members-tab-content table.members-roles-select tbody").each(function(){n(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){c()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),s=a.find("input.check-all-deny"),i=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(i.prop("checked",!0),s.prop("checked",!1)):(s.prop("checked",!0),i.prop("checked",!1)):r?i.prop("checked",!1):s.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),n(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function n(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function c(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),""===r||-1!==t.indexOf(r)?(e.show(),e.toggleClass("members-cap-row-alt",1==n%2),n++):(e.hide(),e.removeClass("members-cap-row-alt"))});var c=t.find("table").first(),s=c.find("tbody").first(),i=s.find("tr.members-cap-filter-empty"),p=c.find("thead th").length||3;i.length?i.find("td").attr("colspan",p):((i=jQuery('')).find("td").attr("colspan",p).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),s.append(i)),r&&0===n?i.show():i.hide();var u=jQuery(".members-cap-filter-count");""===r?u.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?u.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):u.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function p(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function u(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),c()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){n(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){c()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),p(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){u(this),p()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),s=a.find("input.check-all-deny"),i=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,u(e)}):_.each(c,function(e){e.checked=t,u(e)}),t?r?(i.prop("checked",!0),s.prop("checked",!1)):(s.prop("checked",!0),i.prop("checked",!1)):r?i.prop("checked",!1):s.prop("checked",!1),p()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),n(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From aa0b88fe75c667f075f1375ad2687e6d20c57113 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Mon, 11 May 2026 15:13:19 +0300 Subject: [PATCH 05/11] Refactor capability filtering logic in roles management --- js/edit-role.js | 15 +++++---------- js/edit-role.min.js | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/js/edit-role.js b/js/edit-role.js index 7cfbc6eb..269e4d99 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -253,8 +253,7 @@ jQuery( document ).ready( function() { return; } - var $rows = $activeTab.find( 'tbody > tr.members-cap-checklist' ); - var visible_count = 0; + var $rows = $activeTab.find( 'tbody > tr.members-cap-checklist' ); $rows.each( function() { @@ -268,16 +267,12 @@ jQuery( document ).ready( function() { $row.attr( 'data-cap-search', haystack ); } - if ( '' === query || -1 !== haystack.indexOf( query ) ) { - $row.show(); - $row.toggleClass( 'members-cap-row-alt', 1 === ( visible_count % 2 ) ); - visible_count++; - } else { - $row.hide(); - $row.removeClass( 'members-cap-row-alt' ); - } + $row.toggle( '' === query || -1 !== haystack.indexOf( query ) ); } ); + members_stripe_rows( $activeTab.find( 'tbody' ).first() ); + var visible_count = $rows.filter( ':visible' ).length; + // Toggle a "no matches" empty-state row inside the active tab's table. var $table = $activeTab.find( 'table' ).first(); var $tbody = $table.find( 'tbody' ).first(); diff --git a/js/edit-role.min.js b/js/edit-role.min.js index ba157d2e..1b77ce45 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function n(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function c(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist"),n=0;a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),""===r||-1!==t.indexOf(r)?(e.show(),e.toggleClass("members-cap-row-alt",1==n%2),n++):(e.hide(),e.removeClass("members-cap-row-alt"))});var c=t.find("table").first(),s=c.find("tbody").first(),i=s.find("tr.members-cap-filter-empty"),p=c.find("thead th").length||3;i.length?i.find("td").attr("colspan",p):((i=jQuery('')).find("td").attr("colspan",p).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),s.append(i)),r&&0===n?i.show():i.hide();var u=jQuery(".members-cap-filter-count");""===r?u.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?u.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):u.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function p(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function u(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),c()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){n(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){c()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),p(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){u(this),p()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),s=a.find("input.check-all-deny"),i=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,u(e)}):_.each(c,function(e){e.checked=t,u(e)}),t?r?(i.prop("checked",!0),s.prop("checked",!1)):(s.prop("checked",!0),i.prop("checked",!1)):r?i.prop("checked",!1):s.prop("checked",!1),p()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),n(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function o(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),o(t.find("tbody").first());var n=a.filter(":visible").length,c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),i.append(s)),r&&0===n?s.show():s.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?p.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):p.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){o(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){n()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),o(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From 663a363d067140638fd7a38499cd925e59773699 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Mon, 11 May 2026 15:29:53 +0300 Subject: [PATCH 06/11] Refactor event handling for role editing and capability filtering --- js/edit-role.js | 17 ++++++----------- js/edit-role.min.js | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/js/edit-role.js b/js/edit-role.js index 269e4d99..e5b87304 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -89,13 +89,11 @@ jQuery( document ).ready( function() { jQuery( 'input[name="role"]' ).keypress( function( e ) { - // 13 is the key code for "Enter". - if ( 13 === e.keyCode ) { + if ( 'Enter' === e.key ) { // Click the edit role button and trigger a focus. jQuery( '.role-edit-button' ).click().trigger( 'focus' ); - // Prevent default behavior and return false. e.preventDefault(); return false; } @@ -206,9 +204,7 @@ jQuery( document ).ready( function() { */ function members_get_cap_search_haystack( $row ) { - var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) - || $row.find( 'input[data-deny-cap]' ).attr( 'data-deny-cap' ) - || ''; + var cap = $row.find( 'input[data-grant-cap]' ).data( 'grant-cap' ) || ''; return ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase(); } @@ -322,14 +318,14 @@ jQuery( document ).ready( function() { } ); // Filter on every keystroke in the search input. - jQuery( document ).on( 'input search', '#members-cap-filter-input', function() { + jQuery( document ).on( 'input search', '#members-cap-filter-input', _.debounce( function() { members_apply_cap_filter(); - } ); + }, 250 ) ); // Don't let "Enter" in the filter input submit the form. jQuery( document ).on( 'keydown', '#members-cap-filter-input', function( e ) { - if ( 13 === e.keyCode ) { + if ( 'Enter' === e.key ) { e.preventDefault(); return false; } @@ -541,8 +537,7 @@ jQuery( document ).ready( function() { jQuery( '#members-new-cap-field' ).keypress( function( e ) { - // 13 is the key code for "Enter". - if ( 13 === e.keyCode ) { + if ( 'Enter' === e.key ) { jQuery( '#members-add-new-cap' ).click(); e.preventDefault(); return false; diff --git a/js/edit-role.min.js b/js/edit-role.min.js index 1b77ce45..fb396164 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if(13===e.keyCode)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||e.find("input[data-deny-cap]").attr("data-deny-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function o(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),o(t.find("tbody").first());var n=a.filter(":visible").length,c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),i.append(s)),r&&0===n?s.show():s.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?p.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):p.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){o(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",function(){n()}),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if(13===e.keyCode)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if(13===e.keyCode)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),o(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").data("grant-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function o(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),o(t.find("tbody").first());var n=a.filter(":visible").length,c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),i.append(s)),r&&0===n?s.show():s.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?p.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):p.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){o(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),o(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From 602584d912f94a9cb9e1463e81adef9ec4c88cc6 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Tue, 12 May 2026 16:07:48 +0300 Subject: [PATCH 07/11] Refactor capability handling in role editing to improve clarity and maintainability --- js/edit-role.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/js/edit-role.js b/js/edit-role.js index e5b87304..6e5c0a54 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -204,7 +204,7 @@ jQuery( document ).ready( function() { */ function members_get_cap_search_haystack( $row ) { - var cap = $row.find( 'input[data-grant-cap]' ).data( 'grant-cap' ) || ''; + var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) || ''; return ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase(); } @@ -562,7 +562,7 @@ jQuery( document ).ready( function() { // Don't allow the 'do_not_allow' cap. //if ( 'do_not_allow' === new_cap ) { - if ( -1 !== jQuery.inArray( jQuery( this ).val(), members_i18n.hidden_caps ) ) { + if ( -1 !== jQuery.inArray( new_cap, members_i18n.hidden_caps ) ) { return; } @@ -574,19 +574,17 @@ jQuery( document ).ready( function() { // Trigger a click event on the "custom" tab in the edit caps box. jQuery( 'a[href="#members-tab-custom"]' ).trigger( 'click' ); - // Replace text placeholder with cap. - members_i18n.label_grant_cap = members_i18n.label_grant_cap.replace( /%s/g, '' + new_cap + '' ); - members_i18n.label_deny_cap = members_i18n.label_deny_cap.replace( /%s/g, '' + new_cap + '' ); - - // Set up some data to pass to our Underscore template. - var data = { - cap : new_cap, - readonly : '', - name : { grant : 'grant-new-caps[]', deny : 'deny-new-caps[]' }, - is_granted_cap : true, - is_denied_cap : false, - label : { cap : new_cap, grant : members_i18n.label_grant_cap, deny : members_i18n.label_deny_cap } - }; + var label_grant = members_i18n.label_grant_cap.replace( /%s/g, '' + new_cap + '' ); + var label_deny = members_i18n.label_deny_cap.replace( /%s/g, '' + new_cap + '' ); + + var data = { + cap : new_cap, + readonly : '', + name : { grant : 'grant-new-caps[]', deny : 'deny-new-caps[]' }, + is_granted_cap : true, + is_denied_cap : false, + label : { cap : new_cap, grant : label_grant, deny : label_deny } + }; // Prepend our template to the "custom" edit caps tab content. jQuery( '#members-tab-custom tbody' ).prepend( control_template( data ) ); From 580616e0c155c68327d6c22233d232989e33ed90 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Thu, 14 May 2026 11:53:10 +0300 Subject: [PATCH 08/11] Refactor role editing JavaScript for improved clarity and maintainability --- js/edit-role.js | 22 +++++++++++----------- js/edit-role.min.js | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/js/edit-role.js b/js/edit-role.js index 6e5c0a54..3063931e 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -574,17 +574,17 @@ jQuery( document ).ready( function() { // Trigger a click event on the "custom" tab in the edit caps box. jQuery( 'a[href="#members-tab-custom"]' ).trigger( 'click' ); - var label_grant = members_i18n.label_grant_cap.replace( /%s/g, '' + new_cap + '' ); - var label_deny = members_i18n.label_deny_cap.replace( /%s/g, '' + new_cap + '' ); - - var data = { - cap : new_cap, - readonly : '', - name : { grant : 'grant-new-caps[]', deny : 'deny-new-caps[]' }, - is_granted_cap : true, - is_denied_cap : false, - label : { cap : new_cap, grant : label_grant, deny : label_deny } - }; + var label_grant = members_i18n.label_grant_cap.replace( /%s/g, '' + new_cap + '' ); + var label_deny = members_i18n.label_deny_cap.replace( /%s/g, '' + new_cap + '' ); + + var data = { + cap : new_cap, + readonly : '', + name : { grant : 'grant-new-caps[]', deny : 'deny-new-caps[]' }, + is_granted_cap : true, + is_denied_cap : false, + label : { cap : new_cap, grant : label_grant, deny : label_deny } + }; // Prepend our template to the "custom" edit caps tab content. jQuery( '#members-tab-custom tbody' ).prepend( control_template( data ) ); diff --git a/js/edit-role.min.js b/js/edit-role.min.js index fb396164..9fa9f890 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").data("grant-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function o(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),o(t.find("tbody").first());var n=a.filter(":visible").length,c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),i.append(s)),r&&0===n?s.show():s.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?p.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):p.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){o(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click"),members_i18n.label_grant_cap=members_i18n.label_grant_cap.replace(/%s/g,""+e+""),members_i18n.label_deny_cap=members_i18n.label_deny_cap.replace(/%s/g,""+e+"");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap,deny:members_i18n.label_deny_cap}};jQuery("#members-tab-custom tbody").prepend(a(t)),o(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function o(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),o(t.find("tbody").first());var n=a.filter(":visible").length,c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),i.append(s)),r&&0===n?s.show():s.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?p.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):p.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){o(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(e,members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap.replace(/%s/g,""+e+""),deny:members_i18n.label_deny_cap.replace(/%s/g,""+e+"")}};jQuery("#members-tab-custom tbody").prepend(a(t)),o(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From 9985e0f00ec999e551b8b22cb8113ea271a54343 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Thu, 14 May 2026 12:25:35 +0300 Subject: [PATCH 09/11] Enhance capability filtering logic in roles management --- admin/functions-admin.php | 9 ++-- js/edit-role.js | 111 +++++++++++++++++++++++++++++++++++--- js/edit-role.min.js | 2 +- 3 files changed, 111 insertions(+), 11 deletions(-) diff --git a/admin/functions-admin.php b/admin/functions-admin.php index bf4d5bcc..dcf5229b 100644 --- a/admin/functions-admin.php +++ b/admin/functions-admin.php @@ -67,9 +67,12 @@ function members_admin_register_scripts() { 'label_deny_cap' => esc_html__( 'Deny %s capability', 'members' ), 'ays_delete_role' => esc_html__( 'Are you sure you want to delete this role? This is a permanent action and cannot be undone.', 'members' ), 'hidden_caps' => members_get_hidden_caps(), - 'cap_filter_no_results' => esc_html__( 'No capabilities match your filter.', 'members' ), - 'cap_filter_match' => esc_html__( '%d match', 'members' ), - 'cap_filter_matches' => esc_html__( '%d matches', 'members' ), + 'cap_filter_no_results' => esc_html__( 'No capabilities match your filter.', 'members' ), + 'cap_filter_no_results_on_tab' => esc_html__( 'No capabilities match your filter on this tab.', 'members' ), + 'cap_filter_elsewhere_one' => esc_html__( '%d capability matches on other tabs.', 'members' ), + 'cap_filter_elsewhere_other' => esc_html__( '%d capabilities match on other tabs.', 'members' ), + 'cap_filter_match' => esc_html__( '%d match', 'members' ), + 'cap_filter_matches' => esc_html__( '%d matches', 'members' ), ); wp_localize_script( 'members-edit-role', 'members_i18n', $i18n ); diff --git a/js/edit-role.js b/js/edit-role.js index 3063931e..03b59ab9 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -225,6 +225,102 @@ jQuery( document ).ready( function() { $tbody.find( 'tr.members-cap-checklist:visible:odd' ).addClass( 'members-cap-row-alt' ); } + /** + * Counts distinct capabilities matching the filter outside the active tab. + * Dedupes by capability slug so the same cap (e.g. on a group tab and the + * "All" tab) counts once. + * + * @since 3.x.0 + * @access public + * @param string query + * @param jQuery $activeTab + * @return number + */ + function members_count_elsewhere_matching_caps( query, $activeTab ) { + + if ( ! query ) { + return 0; + } + + var caps = {}; + var hayOnly = {}; + + jQuery( '.members-cap-tabs .members-tab-content' ).not( $activeTab ).each( function() { + + jQuery( this ).find( 'tbody > tr.members-cap-checklist' ).each( function() { + + var $row = jQuery( this ); + var haystack = $row.attr( 'data-cap-search' ); + + if ( ! haystack ) { + haystack = members_get_cap_search_haystack( $row ); + $row.attr( 'data-cap-search', haystack ); + } + + if ( -1 === haystack.indexOf( query ) ) { + return; + } + + var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) || ''; + + if ( cap ) { + caps[ cap ] = true; + } else { + hayOnly[ haystack ] = true; + } + } ); + } ); + + return Object.keys( caps ).length + Object.keys( hayOnly ).length; + } + + /** + * Message for the empty-state row when the filter matches nothing on the + * active tab (used only when the row is shown). + * + * @since 3.x.0 + * @access public + * @param string query + * @param number elsewhere_count Distinct matches on other tabs. + * @return string + */ + function members_cap_filter_empty_message( query, elsewhere_count ) { + + if ( ! query ) { + return ''; + } + + if ( window.wp && wp.i18n && wp.i18n.__ && wp.i18n._n && wp.i18n.sprintf ) { + + if ( 0 === elsewhere_count ) { + return wp.i18n.__( 'No capabilities match your filter.', 'members' ); + } + + return wp.i18n.__( 'No capabilities match your filter on this tab.', 'members' ) + + ' ' + + wp.i18n.sprintf( + wp.i18n._n( + '%d capability matches on other tabs.', + '%d capabilities match on other tabs.', + elsewhere_count, + 'members' + ), + elsewhere_count + ); + } + + if ( 0 === elsewhere_count ) { + return members_i18n.cap_filter_no_results; + } + + return members_i18n.cap_filter_no_results_on_tab + + ' ' + + ( 1 === elsewhere_count + ? members_i18n.cap_filter_elsewhere_one.replace( '%d', elsewhere_count ) + : members_i18n.cap_filter_elsewhere_other.replace( '%d', elsewhere_count ) + ); + } + /** * Filters the rows in the currently active capability tab to those matching * the search input. The match is case-insensitive and runs against both the @@ -269,6 +365,10 @@ jQuery( document ).ready( function() { members_stripe_rows( $activeTab.find( 'tbody' ).first() ); var visible_count = $rows.filter( ':visible' ).length; + var elsewhere_count = ( query && 0 === visible_count ) + ? members_count_elsewhere_matching_caps( query, $activeTab ) + : 0; + // Toggle a "no matches" empty-state row inside the active tab's table. var $table = $activeTab.find( 'table' ).first(); var $tbody = $table.find( 'tbody' ).first(); @@ -277,16 +377,13 @@ jQuery( document ).ready( function() { if ( ! $empty.length ) { $empty = jQuery( '' ); - $empty.find( 'td' ).attr( 'colspan', col_cnt ).text( - window.wp && wp.i18n && wp.i18n.__ - ? wp.i18n.__( 'No capabilities match your filter.', 'members' ) - : members_i18n.cap_filter_no_results - ); $tbody.append( $empty ); - } else { - $empty.find( 'td' ).attr( 'colspan', col_cnt ); } + $empty.find( 'td' ).attr( 'colspan', col_cnt ).text( + members_cap_filter_empty_message( query, elsewhere_count ) + ); + if ( query && 0 === visible_count ) { $empty.show(); } else { diff --git a/js/edit-role.min.js b/js/edit-role.min.js index 9fa9f890..93e8b6b0 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function m(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function o(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=m(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),o(t.find("tbody").first());var n=a.filter(":visible").length,c=t.find("table").first(),i=c.find("tbody").first(),s=i.find("tr.members-cap-filter-empty"),u=c.find("thead th").length||3;s.length?s.find("td").attr("colspan",u):((s=jQuery('')).find("td").attr("colspan",u).text(window.wp&&wp.i18n&&wp.i18n.__?wp.i18n.__("No capabilities match your filter.","members"):members_i18n.cap_filter_no_results),i.append(s)),r&&0===n?s.show():s.hide();var p=jQuery(".members-cap-filter-count");""===r?p.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?p.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",n,"members"),n)):p.text((1===n?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",n))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",m(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){o(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(e,members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap.replace(/%s/g,""+e+""),deny:members_i18n.label_deny_cap.replace(/%s/g,""+e+"")}};jQuery("#members-tab-custom tbody").prepend(a(t)),o(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function d(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function l(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=d(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),l(t.find("tbody").first());var n,c=a.filter(":visible").length,i=r&&0===c?function(a,e){if(!a)return 0;var n={},c={};return jQuery(".members-cap-tabs .members-tab-content").not(e).each(function(){jQuery(this).find("tbody > tr.members-cap-checklist").each(function(){var e=jQuery(this),t=e.attr("data-cap-search");if(t||(t=d(e),e.attr("data-cap-search",t)),-1!==t.indexOf(a)){var r=e.find("input[data-grant-cap]").attr("data-grant-cap")||"";r?n[r]=!0:c[t]=!0}})}),Object.keys(n).length+Object.keys(c).length}(r,t):0,s=t.find("table").first(),p=s.find("tbody").first(),u=p.find("tr.members-cap-filter-empty"),m=s.find("thead th").length||3;u.length||(u=jQuery(''),p.append(u)),u.find("td").attr("colspan",m).text((n=i,r?window.wp&&wp.i18n&&wp.i18n.__&&wp.i18n._n&&wp.i18n.sprintf?0===n?wp.i18n.__("No capabilities match your filter.","members"):wp.i18n.__("No capabilities match your filter on this tab.","members")+" "+wp.i18n.sprintf(wp.i18n._n("%d capability matches on other tabs.","%d capabilities match on other tabs.",n,"members"),n):0===n?members_i18n.cap_filter_no_results:members_i18n.cap_filter_no_results_on_tab+" "+(1===n?members_i18n.cap_filter_elsewhere_one.replace("%d",n):members_i18n.cap_filter_elsewhere_other.replace("%d",n)):"")),r&&0===c?u.show():u.hide();var o=jQuery(".members-cap-filter-count");""===r?o.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?o.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",c,"members"),c)):o.text((1===c?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",c))}}}function p(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function u(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",d(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){l(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),p(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){u(this),p()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,u(e)}):_.each(c,function(e){e.checked=t,u(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),p()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(e,members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap.replace(/%s/g,""+e+""),deny:members_i18n.label_deny_cap.replace(/%s/g,""+e+"")}};jQuery("#members-tab-custom tbody").prepend(a(t)),l(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From 82d490446aa0de3b1ffe2efced8e3900f9d8ba5c Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Thu, 14 May 2026 15:34:48 +0300 Subject: [PATCH 10/11] Refactor role editing JavaScript to improve capability filtering and tab handling --- js/edit-role.js | 30 ++++++++++++++++++++++-------- js/edit-role.min.js | 2 +- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/js/edit-role.js b/js/edit-role.js index 03b59ab9..4f10a188 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -170,16 +170,17 @@ jQuery( document ).ready( function() { j.preventDefault(); // Get the `href` attribute of the item. - var href = jQuery( this ).attr( 'href' ); + var href = jQuery( this ).attr( 'href' ); + var $capTabs = jQuery( this ).parents( '.members-cap-tabs' ); // Hide all tab content. - jQuery( this ).parents( '.members-cap-tabs' ).find( '.members-tab-content' ).hide(); + $capTabs.find( '.members-tab-content' ).hide(); // Find the tab content that matches the tab nav item and show it. - jQuery( this ).parents( '.members-cap-tabs' ).find( href ).show(); + var $activePanel = $capTabs.find( href ).show(); // Set the `aria-selected` attribute to false for all tab nav items. - jQuery( this ).parents( '.members-cap-tabs' ).find( '.members-tab-title' ).attr( 'aria-selected', 'false' ); + $capTabs.find( '.members-tab-title' ).attr( 'aria-selected', 'false' ); // Set the `aria-selected` attribute to true for this tab nav item. jQuery( this ).parent().attr( 'aria-selected', 'true' ); @@ -188,7 +189,7 @@ jQuery( document ).ready( function() { jQuery( '.members-which-tab' ).text( jQuery( this ).text() ); // Re-apply the capability filter to the newly visible tab. - members_apply_cap_filter(); + members_apply_cap_filter( $activePanel ); } ); // click() @@ -206,7 +207,7 @@ jQuery( document ).ready( function() { var cap = $row.find( 'input[data-grant-cap]' ).attr( 'data-grant-cap' ) || ''; - return ( cap + ' ' + $row.find( '.column-cap' ).text() ).toLowerCase(); + return ( cap + ' ' + $row.find( '.column-cap button' ).text() ).toLowerCase(); } /** @@ -328,9 +329,13 @@ jQuery( document ).ready( function() { * * @since 3.x.0 * @access public + * @param jQuery|undefined $passedActiveTab Tab panel to filter (e.g. from tab + * click). When omitted, the active + * panel is resolved from `aria-selected` + * on the tab nav. * @return void */ - function members_apply_cap_filter() { + function members_apply_cap_filter( $passedActiveTab ) { var $input = jQuery( '#members-cap-filter-input' ); @@ -339,7 +344,16 @@ jQuery( document ).ready( function() { } var query = ( $input.val() || '' ).toLowerCase().trim(); - var $activeTab = jQuery( '.members-cap-tabs .members-tab-content:visible' ).first(); + var $activeTab; + + if ( $passedActiveTab && $passedActiveTab.length ) { + $activeTab = $passedActiveTab; + } else { + var $capTabs = jQuery( '.members-cap-tabs' ); + var $activeLink = $capTabs.find( '.members-tab-nav li[aria-selected="true"] a' ).first(); + var tabHref = $activeLink.attr( 'href' ); + $activeTab = tabHref ? $capTabs.find( tabHref ) : jQuery(); + } if ( ! $activeTab.length ) { return; diff --git a/js/edit-role.min.js b/js/edit-role.min.js index 93e8b6b0..339993af 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function d(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||"")+" "+e.find(".column-cap").text()).toLowerCase()}function l(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(){var e=jQuery("#members-cap-filter-input");if(e.length){var r=(e.val()||"").toLowerCase().trim(),t=jQuery(".members-cap-tabs .members-tab-content:visible").first();if(t.length){var a=t.find("tbody > tr.members-cap-checklist");a.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=d(e),e.attr("data-cap-search",t)),e.toggle(""===r||-1!==t.indexOf(r))}),l(t.find("tbody").first());var n,c=a.filter(":visible").length,i=r&&0===c?function(a,e){if(!a)return 0;var n={},c={};return jQuery(".members-cap-tabs .members-tab-content").not(e).each(function(){jQuery(this).find("tbody > tr.members-cap-checklist").each(function(){var e=jQuery(this),t=e.attr("data-cap-search");if(t||(t=d(e),e.attr("data-cap-search",t)),-1!==t.indexOf(a)){var r=e.find("input[data-grant-cap]").attr("data-grant-cap")||"";r?n[r]=!0:c[t]=!0}})}),Object.keys(n).length+Object.keys(c).length}(r,t):0,s=t.find("table").first(),p=s.find("tbody").first(),u=p.find("tr.members-cap-filter-empty"),m=s.find("thead th").length||3;u.length||(u=jQuery(''),p.append(u)),u.find("td").attr("colspan",m).text((n=i,r?window.wp&&wp.i18n&&wp.i18n.__&&wp.i18n._n&&wp.i18n.sprintf?0===n?wp.i18n.__("No capabilities match your filter.","members"):wp.i18n.__("No capabilities match your filter on this tab.","members")+" "+wp.i18n.sprintf(wp.i18n._n("%d capability matches on other tabs.","%d capabilities match on other tabs.",n,"members"),n):0===n?members_i18n.cap_filter_no_results:members_i18n.cap_filter_no_results_on_tab+" "+(1===n?members_i18n.cap_filter_elsewhere_one.replace("%d",n):members_i18n.cap_filter_elsewhere_other.replace("%d",n)):"")),r&&0===c?u.show():u.hide();var o=jQuery(".members-cap-filter-count");""===r?o.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?o.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",c,"members"),c)):o.text((1===c?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",c))}}}function p(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function u(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",d(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href");jQuery(this).parents(".members-cap-tabs").find(".members-tab-content").hide(),jQuery(this).parents(".members-cap-tabs").find(t).show(),jQuery(this).parents(".members-cap-tabs").find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n()}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){l(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),p(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){u(this),p()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,u(e)}):_.each(c,function(e){e.checked=t,u(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),p()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(e,members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap.replace(/%s/g,""+e+""),deny:members_i18n.label_deny_cap.replace(/%s/g,""+e+"")}};jQuery("#members-tab-custom tbody").prepend(a(t)),l(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function y(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||"")+" "+e.find(".column-cap button").text()).toLowerCase()}function h(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(e){var t=jQuery("#members-cap-filter-input");if(t.length){var r,a=(t.val()||"").toLowerCase().trim();if(e&&e.length)r=e;else{var o=jQuery(".members-cap-tabs"),c=o.find('.members-tab-nav li[aria-selected="true"] a').first().attr("href");r=c?o.find(c):jQuery()}if(r.length){var i=r.find("tbody > tr.members-cap-checklist");i.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=y(e),e.attr("data-cap-search",t)),e.toggle(""===a||-1!==t.indexOf(a))}),h(r.find("tbody").first());var s,u=i.filter(":visible").length,p=a&&0===u?function(a,e){if(!a)return 0;var n={},c={};return jQuery(".members-cap-tabs .members-tab-content").not(e).each(function(){jQuery(this).find("tbody > tr.members-cap-checklist").each(function(){var e=jQuery(this),t=e.attr("data-cap-search");if(t||(t=y(e),e.attr("data-cap-search",t)),-1!==t.indexOf(a)){var r=e.find("input[data-grant-cap]").attr("data-grant-cap")||"";r?n[r]=!0:c[t]=!0}})}),Object.keys(n).length+Object.keys(c).length}(a,r):0,m=r.find("table").first(),o=m.find("tbody").first(),d=o.find("tr.members-cap-filter-empty"),l=m.find("thead th").length||3;d.length||(d=jQuery(''),o.append(d)),d.find("td").attr("colspan",l).text((s=p,a?window.wp&&wp.i18n&&wp.i18n.__&&wp.i18n._n&&wp.i18n.sprintf?0===s?wp.i18n.__("No capabilities match your filter.","members"):wp.i18n.__("No capabilities match your filter on this tab.","members")+" "+wp.i18n.sprintf(wp.i18n._n("%d capability matches on other tabs.","%d capabilities match on other tabs.",s,"members"),s):0===s?members_i18n.cap_filter_no_results:members_i18n.cap_filter_no_results_on_tab+" "+(1===s?members_i18n.cap_filter_elsewhere_one.replace("%d",s):members_i18n.cap_filter_elsewhere_other.replace("%d",s)):"")),a&&0===u?d.show():d.hide();var b=jQuery(".members-cap-filter-count");""===a?b.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?b.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",u,"members"),u)):b.text((1===u?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",u))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",y(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href"),r=jQuery(this).parents(".members-cap-tabs");r.find(".members-tab-content").hide();var a=r.find(t).show();r.find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n(a)}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){h(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(e,members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap.replace(/%s/g,""+e+""),deny:members_i18n.label_deny_cap.replace(/%s/g,""+e+"")}};jQuery("#members-tab-custom tbody").prepend(a(t)),h(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file From 676dbe93796db27b40bfd73022c9e8a9c2c0f6a2 Mon Sep 17 00:00:00 2001 From: Omar ElHawary Date: Thu, 14 May 2026 16:26:56 +0300 Subject: [PATCH 11/11] Refactor role editing JavaScript to enhance tab navigation and capability filtering --- js/edit-role.js | 41 ++++++++++++++++++++++++++--------------- js/edit-role.min.js | 2 +- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/js/edit-role.js b/js/edit-role.js index 4f10a188..4b606a79 100644 --- a/js/edit-role.js +++ b/js/edit-role.js @@ -128,9 +128,11 @@ jQuery( document ).ready( function() { // passed in via `wp_localize_script()`. if ( typeof members_sections !== 'undefined' && typeof members_controls !== 'undefined' ) { + var $tabcaps = jQuery( '#tabcapsdiv' ); + // Loop through the sections and append the template for each. _.each( members_sections, function( data ) { - jQuery( '.members-tab-wrap' ).append( section_template( data ) ); + $tabcaps.find( '.members-tab-wrap' ).append( section_template( data ) ); } ); // Loop through the controls and append the template for each. @@ -139,7 +141,7 @@ jQuery( document ).ready( function() { } ); // Cache the cap text on each row so subsequent filters don't re-query the DOM. - jQuery( '.members-cap-checklist' ).each( function() { + $tabcaps.find( '.members-cap-checklist' ).each( function() { var $row = jQuery( this ); @@ -149,20 +151,22 @@ jQuery( document ).ready( function() { /* ====== Tabs ====== */ + var $tabcapsdiv = jQuery( '#tabcapsdiv' ); + // Hides the tab content. - jQuery( '.members-cap-tabs .members-tab-content' ).hide(); + $tabcapsdiv.find( '.members-cap-tabs .members-tab-content' ).hide(); // Shows the first tab's content. - jQuery( '.members-cap-tabs .members-tab-content:first-child' ).show(); + $tabcapsdiv.find( '.members-cap-tabs .members-tab-content:first-child' ).show(); // Makes the 'aria-selected' attribute true for the first tab nav item. - jQuery( '.members-tab-nav :first-child' ).attr( 'aria-selected', 'true' ); + $tabcapsdiv.find( '.members-tab-nav :first-child' ).attr( 'aria-selected', 'true' ); // Copies the current tab item title to the box header. - jQuery( '.members-which-tab' ).text( jQuery( '.members-tab-nav :first-child a' ).text() ); + $tabcapsdiv.find( '.members-which-tab' ).text( $tabcapsdiv.find( '.members-tab-nav :first-child a' ).text() ); // When a tab nav item is clicked. - jQuery( '.members-tab-nav li a' ).on( + $tabcapsdiv.find( '.members-tab-nav li a' ).on( 'click', function( j ) { @@ -186,7 +190,7 @@ jQuery( document ).ready( function() { jQuery( this ).parent().attr( 'aria-selected', 'true' ); // Copy the current tab item title to the box header. - jQuery( '.members-which-tab' ).text( jQuery( this ).text() ); + $capTabs.closest( '#tabcapsdiv' ).find( '.members-which-tab' ).text( jQuery( this ).text() ); // Re-apply the capability filter to the newly visible tab. members_apply_cap_filter( $activePanel ); @@ -246,7 +250,7 @@ jQuery( document ).ready( function() { var caps = {}; var hayOnly = {}; - jQuery( '.members-cap-tabs .members-tab-content' ).not( $activeTab ).each( function() { + $activeTab.closest( '.members-cap-tabs' ).find( '.members-tab-content' ).not( $activeTab ).each( function() { jQuery( this ).find( 'tbody > tr.members-cap-checklist' ).each( function() { @@ -345,11 +349,12 @@ jQuery( document ).ready( function() { var query = ( $input.val() || '' ).toLowerCase().trim(); var $activeTab; + var $capRoot = $input.closest( '#tabcapsdiv' ); + var $capTabs = $capRoot.length ? $capRoot.find( '.members-cap-tabs' ) : jQuery( '.members-cap-tabs' ); if ( $passedActiveTab && $passedActiveTab.length ) { $activeTab = $passedActiveTab; } else { - var $capTabs = jQuery( '.members-cap-tabs' ); var $activeLink = $capTabs.find( '.members-tab-nav li[aria-selected="true"] a' ).first(); var tabHref = $activeLink.attr( 'href' ); $activeTab = tabHref ? $capTabs.find( tabHref ) : jQuery(); @@ -360,6 +365,7 @@ jQuery( document ).ready( function() { } var $rows = $activeTab.find( 'tbody > tr.members-cap-checklist' ); + var visible_count = 0; $rows.each( function() { @@ -373,11 +379,16 @@ jQuery( document ).ready( function() { $row.attr( 'data-cap-search', haystack ); } - $row.toggle( '' === query || -1 !== haystack.indexOf( query ) ); + var is_match = '' === query || -1 !== haystack.indexOf( query ); + + $row.toggle( is_match ); + + if ( is_match ) { + visible_count++; + } } ); members_stripe_rows( $activeTab.find( 'tbody' ).first() ); - var visible_count = $rows.filter( ':visible' ).length; var elsewhere_count = ( query && 0 === visible_count ) ? members_count_elsewhere_matching_caps( query, $activeTab ) @@ -405,7 +416,7 @@ jQuery( document ).ready( function() { } // Update the live match count next to the input. - var $count = jQuery( '.members-cap-filter-count' ); + var $count = $input.siblings( '.members-cap-filter-count' ); if ( '' === query ) { $count.text( '' ); @@ -424,7 +435,7 @@ jQuery( document ).ready( function() { } // Apply initial striping to every cap section table after templates render. - jQuery( '.members-tab-content table.members-roles-select tbody' ).each( function() { + jQuery( '#tabcapsdiv' ).find( '.members-tab-content table.members-roles-select tbody' ).each( function() { members_stripe_rows( jQuery( this ) ); } ); @@ -683,7 +694,7 @@ jQuery( document ).ready( function() { jQuery( '#members-cap-filter-input' ).val( '' ).trigger( 'input' ); // Trigger a click event on the "custom" tab in the edit caps box. - jQuery( 'a[href="#members-tab-custom"]' ).trigger( 'click' ); + jQuery( '#tabcapsdiv a[href="#members-tab-custom"]' ).trigger( 'click' ); var label_grant = members_i18n.label_grant_cap.replace( /%s/g, '' + new_cap + '' ); var label_deny = members_i18n.label_deny_cap.replace( /%s/g, '' + new_cap + '' ); diff --git a/js/edit-role.min.js b/js/edit-role.min.js index 339993af..9883a847 100644 --- a/js/edit-role.min.js +++ b/js/edit-role.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");function y(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||"")+" "+e.find(".column-cap button").text()).toLowerCase()}function h(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function n(e){var t=jQuery("#members-cap-filter-input");if(t.length){var r,a=(t.val()||"").toLowerCase().trim();if(e&&e.length)r=e;else{var o=jQuery(".members-cap-tabs"),c=o.find('.members-tab-nav li[aria-selected="true"] a').first().attr("href");r=c?o.find(c):jQuery()}if(r.length){var i=r.find("tbody > tr.members-cap-checklist");i.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=y(e),e.attr("data-cap-search",t)),e.toggle(""===a||-1!==t.indexOf(a))}),h(r.find("tbody").first());var s,u=i.filter(":visible").length,p=a&&0===u?function(a,e){if(!a)return 0;var n={},c={};return jQuery(".members-cap-tabs .members-tab-content").not(e).each(function(){jQuery(this).find("tbody > tr.members-cap-checklist").each(function(){var e=jQuery(this),t=e.attr("data-cap-search");if(t||(t=y(e),e.attr("data-cap-search",t)),-1!==t.indexOf(a)){var r=e.find("input[data-grant-cap]").attr("data-grant-cap")||"";r?n[r]=!0:c[t]=!0}})}),Object.keys(n).length+Object.keys(c).length}(a,r):0,m=r.find("table").first(),o=m.find("tbody").first(),d=o.find("tr.members-cap-filter-empty"),l=m.find("thead th").length||3;d.length||(d=jQuery(''),o.append(d)),d.find("td").attr("colspan",l).text((s=p,a?window.wp&&wp.i18n&&wp.i18n.__&&wp.i18n._n&&wp.i18n.sprintf?0===s?wp.i18n.__("No capabilities match your filter.","members"):wp.i18n.__("No capabilities match your filter on this tab.","members")+" "+wp.i18n.sprintf(wp.i18n._n("%d capability matches on other tabs.","%d capabilities match on other tabs.",s,"members"),s):0===s?members_i18n.cap_filter_no_results:members_i18n.cap_filter_no_results_on_tab+" "+(1===s?members_i18n.cap_filter_elsewhere_one.replace("%d",s):members_i18n.cap_filter_elsewhere_other.replace("%d",s)):"")),a&&0===u?d.show():d.hide();var b=jQuery(".members-cap-filter-count");""===a?b.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?b.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",u,"members"),u)):b.text((1===u?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",u))}}}function u(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function p(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}"undefined"!=typeof members_sections&&"undefined"!=typeof members_controls&&(_.each(members_sections,function(e){jQuery(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),jQuery(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",y(e))})),jQuery(".members-cap-tabs .members-tab-content").hide(),jQuery(".members-cap-tabs .members-tab-content:first-child").show(),jQuery(".members-tab-nav :first-child").attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(".members-tab-nav :first-child a").text()),jQuery(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href"),r=jQuery(this).parents(".members-cap-tabs");r.find(".members-tab-content").hide();var a=r.find(t).show();r.find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),jQuery(".members-which-tab").text(jQuery(this).text()),n(a)}),jQuery(".members-tab-content table.members-roles-select tbody").each(function(){h(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){n()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),u(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){p(this),u()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,p(e)}):_.each(c,function(e){e.checked=t,p(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),u()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(e,members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('a[href="#members-tab-custom"]').trigger("click");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap.replace(/%s/g,""+e+""),deny:members_i18n.label_deny_cap.replace(/%s/g,""+e+"")}};jQuery("#members-tab-custom tbody").prepend(a(t)),h(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file +jQuery(document).ready(function(){function t(e){e=e.toLowerCase().trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,""),jQuery(".role-slug").text(e)}jQuery(".members-delete-role-link").on("click",function(){return window.confirm(members_i18n.ays_delete_role)}),jQuery('input[name="role_name"]').keyup(function(){jQuery('input[name="role"]').val()||t(this.value)}),jQuery('input[name="role"], .role-ok-button').hide(),jQuery(document).on("click",".role-edit-button.closed",function(){jQuery(this).removeClass("closed").addClass("open").text(members_i18n.button_role_ok),jQuery('input[name="role"]').show(),jQuery('input[name="role"]').trigger("focus"),jQuery('input[name="role"]').attr("value",jQuery(".role-slug").text())}),jQuery(document).on("click",".role-edit-button.open",function(){jQuery(this).removeClass("open").addClass("closed").text(members_i18n.button_role_edit),jQuery('input[name="role"]').hide();var e=jQuery('input[name="role"]').val();t(e||jQuery('input[name="role_name"]').val())}),jQuery('input[name="role"]').keypress(function(e){if("Enter"===e.key)return jQuery(".role-edit-button").click().trigger("focus"),e.preventDefault(),!1}),jQuery('.users_page_role-new input[name="role_name"]').val()||jQuery(".users_page_role-new #publish").prop("disabled",!0),jQuery('.users_page_role-new input[name="role_name"]').on("input",function(){jQuery(this).val()?jQuery(".users_page_role-new #publish").prop("disabled",!1):jQuery(".users_page_role-new #publish").prop("disabled",!0)});var r=wp.template("members-cap-section"),a=wp.template("members-cap-control");if("undefined"!=typeof members_sections&&"undefined"!=typeof members_controls){var n=jQuery("#tabcapsdiv");_.each(members_sections,function(e){n.find(".members-tab-wrap").append(r(e))}),_.each(members_controls,function(e){jQuery("#members-tab-"+e.section+" tbody").append(a(e))}),n.find(".members-cap-checklist").each(function(){var e=jQuery(this);e.attr("data-cap-search",y(e))})}var e=jQuery("#tabcapsdiv");function y(e){return((e.find("input[data-grant-cap]").attr("data-grant-cap")||"")+" "+e.find(".column-cap button").text()).toLowerCase()}function f(e){e.find("tr.members-cap-checklist").removeClass("members-cap-row-alt"),e.find("tr.members-cap-checklist:visible:odd").addClass("members-cap-row-alt")}function c(e){var t=jQuery("#members-cap-filter-input");if(t.length){var r,a=(t.val()||"").toLowerCase().trim(),n=t.closest("#tabcapsdiv"),c=n.length?n.find(".members-cap-tabs"):jQuery(".members-cap-tabs");if(e&&e.length)r=e;else{var i=c.find('.members-tab-nav li[aria-selected="true"] a').first().attr("href");r=i?c.find(i):jQuery()}if(r.length){var s=r.find("tbody > tr.members-cap-checklist"),p=0;s.each(function(){var e=jQuery(this),t=e.attr("data-cap-search");t||(t=y(e),e.attr("data-cap-search",t));var r=""===a||-1!==t.indexOf(a);e.toggle(r),r&&p++}),f(r.find("tbody").first());var u,m=a&&0===p?function(a,e){if(!a)return 0;var n={},c={};return e.closest(".members-cap-tabs").find(".members-tab-content").not(e).each(function(){jQuery(this).find("tbody > tr.members-cap-checklist").each(function(){var e=jQuery(this),t=e.attr("data-cap-search");if(t||(t=y(e),e.attr("data-cap-search",t)),-1!==t.indexOf(a)){var r=e.find("input[data-grant-cap]").attr("data-grant-cap")||"";r?n[r]=!0:c[t]=!0}})}),Object.keys(n).length+Object.keys(c).length}(a,r):0,d=r.find("table").first(),o=d.find("tbody").first(),l=o.find("tr.members-cap-filter-empty"),b=d.find("thead th").length||3;l.length||(l=jQuery(''),o.append(l)),l.find("td").attr("colspan",b).text((u=m,a?window.wp&&wp.i18n&&wp.i18n.__&&wp.i18n._n&&wp.i18n.sprintf?0===u?wp.i18n.__("No capabilities match your filter.","members"):wp.i18n.__("No capabilities match your filter on this tab.","members")+" "+wp.i18n.sprintf(wp.i18n._n("%d capability matches on other tabs.","%d capabilities match on other tabs.",u,"members"),u):0===u?members_i18n.cap_filter_no_results:members_i18n.cap_filter_no_results_on_tab+" "+(1===u?members_i18n.cap_filter_elsewhere_one.replace("%d",u):members_i18n.cap_filter_elsewhere_other.replace("%d",u)):"")),a&&0===p?l.show():l.hide();var h=t.siblings(".members-cap-filter-count");""===a?h.text(""):window.wp&&wp.i18n&&wp.i18n._n&&wp.i18n.sprintf?h.text(wp.i18n.sprintf(wp.i18n._n("%d match","%d matches",p,"members"),p)):h.text((1===p?members_i18n.cap_filter_match:members_i18n.cap_filter_matches).replace("%d",p))}}}function p(){var e=jQuery("#members-tab-all input[data-grant-cap]:checked").length,t=jQuery("#members-tab-all input[data-deny-cap]:checked").length,r=jQuery('#members-tab-custom input[name="grant-new-caps[]"]:checked').length,a=jQuery('#members-tab-custom input[name="deny-new-caps[]"]:checked').length;jQuery("#submitdiv .granted-count").text(e+r),jQuery("#submitdiv .denied-count").text(t+a)}function u(e){var t="grant",r="deny";jQuery(e).attr("data-deny-cap")&&(t="deny",r="grant");var a=jQuery(e).attr("data-"+t+"-cap");jQuery(e).prop("checked")?(jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!0),jQuery("input[data-"+r+'-cap="'+a+'"]').prop("checked",!1)):jQuery("input[data-"+t+'-cap="'+a+'"]').not(e).prop("checked",!1)}e.find(".members-cap-tabs .members-tab-content").hide(),e.find(".members-cap-tabs .members-tab-content:first-child").show(),e.find(".members-tab-nav :first-child").attr("aria-selected","true"),e.find(".members-which-tab").text(e.find(".members-tab-nav :first-child a").text()),e.find(".members-tab-nav li a").on("click",function(e){e.preventDefault();var t=jQuery(this).attr("href"),r=jQuery(this).parents(".members-cap-tabs");r.find(".members-tab-content").hide();var a=r.find(t).show();r.find(".members-tab-title").attr("aria-selected","false"),jQuery(this).parent().attr("aria-selected","true"),r.closest("#tabcapsdiv").find(".members-which-tab").text(jQuery(this).text()),c(a)}),jQuery("#tabcapsdiv").find(".members-tab-content table.members-roles-select tbody").each(function(){f(jQuery(this))}),jQuery(document).on("input search","#members-cap-filter-input",_.debounce(function(){c()},250)),jQuery(document).on("keydown","#members-cap-filter-input",function(e){if("Enter"===e.key)return e.preventDefault(),!1}),p(),jQuery(document).on("change",".members-cap-checklist input[data-grant-cap], .members-cap-checklist input[data-deny-cap]",function(){u(this),p()}),jQuery(document).on("change",".members-roles-select input.check-all-grant, .members-roles-select input.check-all-deny",function(){var e=jQuery(this),t=e.is(":checked"),r=e.hasClass("check-all-grant"),a=e.closest(".members-roles-select"),n=a.find("tbody input[data-grant-cap]"),c=a.find("tbody input[data-deny-cap]"),i=a.find("input.check-all-deny"),s=a.find("input.check-all-grant");r?_.each(n,function(e){e.checked=t,u(e)}):_.each(c,function(e){e.checked=t,u(e)}),t?r?(s.prop("checked",!0),i.prop("checked",!1)):(i.prop("checked",!0),s.prop("checked",!1)):r?s.prop("checked",!1):i.prop("checked",!1),p()}),jQuery(document).on("click",".editable-role .members-cap-checklist button",function(){var e=jQuery(this).closest(".members-cap-checklist"),t=jQuery(e).find("input[data-grant-cap]"),r=jQuery(e).find("input[data-deny-cap]");jQuery(t).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!0).change()):jQuery(r).prop("checked")?(jQuery(t).prop("checked",!1),jQuery(r).prop("checked",!1).change()):jQuery(t).prop("checked",!0).change()}),jQuery(document).on("mouseenter",".editable-role .members-cap-checklist button",function(){jQuery(".members-cap-checklist button:focus").not(this).blur()}),postboxes.add_postbox_toggles(pagenow),jQuery("#newcapdiv button.handlediv").attr("type","button"),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery("#members-new-cap-field").on("input",function(){-1===jQuery.inArray(jQuery(this).val(),members_i18n.hidden_caps)?jQuery("#members-add-new-cap").prop("disabled",!1):jQuery("#members-add-new-cap").prop("disabled",!0)}),jQuery("#members-new-cap-field").keypress(function(e){if("Enter"===e.key)return jQuery("#members-add-new-cap").click(),e.preventDefault(),!1}),jQuery("#members-add-new-cap").on("click",function(){var e=jQuery("#members-new-cap-field").val();if(e=e.trim().replace(/<.*?>/g,"").replace(/\s/g,"_").replace(/[^a-zA-Z0-9_]/g,"")){if(-1!==jQuery.inArray(e,members_i18n.hidden_caps))return;jQuery("#members-cap-filter-input").val("").trigger("input"),jQuery('#tabcapsdiv a[href="#members-tab-custom"]').trigger("click");var t={cap:e,readonly:"",name:{grant:"grant-new-caps[]",deny:"deny-new-caps[]"},is_granted_cap:!0,is_denied_cap:!1,label:{cap:e,grant:members_i18n.label_grant_cap.replace(/%s/g,""+e+""),deny:members_i18n.label_deny_cap.replace(/%s/g,""+e+"")}};jQuery("#members-tab-custom tbody").prepend(a(t)),f(jQuery("#members-tab-custom tbody"));var r=jQuery('[data-grant-cap="'+e+'"]').parents(".members-cap-checklist");jQuery(r).addClass("members-highlight"),setTimeout(function(){jQuery(r).removeClass("members-highlight")},500),jQuery("#members-new-cap-field").val(""),jQuery("#members-add-new-cap").prop("disabled",!0),jQuery('.members-cap-checklist input[data-grant-cap="'+e+'"]').trigger("change")}})}); \ No newline at end of file