Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History
134 lines (97 loc) · 3.44 KB

File metadata and controls

134 lines (97 loc) · 3.44 KB

Access handler

Sometimes you want to show or hide menu items, form fields, etc. for certain users, with this component you can do it without the need of conditionals or boilerplate code.

This package include a BasicAccessHandler class but you can build your own AccessHandler implementation.

BasicAccessHandler

Just pass one of the following options as a field attribute or menu item value:

  1. callback: should return true if you want to grant access, false otherwise.
  2. logged: true: requires authenticated user, false: requires guest user.
  3. roles: true if the user has any of the required roles.
  4. allows: uses the Gate::allows method
  5. check: uses the Gate::check method (alias of allow)
  6. denies: uses the Gate::denies method
  7. If no option is passed, this will return true (the item will be rendered)

WARNING: note this package will only prevents the elements from appearing in the front end, you still need to protect the backend access using middleware, etc.

Usage

Form fields

{!! Field::select('user_id', null, ['role'=>'admin']);

Menu items

// config/menu.phpreturn [
'items' => [
'account' => [
'logged' => true
],
'login' => [
'logged' => false
],
'settings' => [
'roles' => 'admin'
]
]
];
{!! Menu::make('menu.items') !!}

Gate authorization

The allows, check and denies options accept a string or an array as a value.

If it is an string, it will be the name of the ability with no arguments.

If it is an array, the first position of the array will be the name of the ability, and the others will be the arguments

Examples:

{!! Field::text('change-password', ['allows'=>'change-password']) !!}
{!! Field::select('category', $options, ['allows'=> ['change-post-category', $category]]) !!}

If you are building menus, you can use dynamic parameters to pass values to the gate.

In the following example we will define a dynamic 'post' parameter, and pass it using setParam when building the menu:

// config/menu.phpreturn [
'items' => [
'view-post' => [],
'edit-post' => [
'allows' => ['update-post', ':post']
]
]
];
{!! Menu::make('menu.items')->setParam('post', $post)->render() !!}

Customization

If you are working on a complex project with lots of different access rules, etc. You may need to implement your own AccessHandler, in order to do this, create a new class that implements the Styde\Html\Access\AccessHandler interface, then extend the HtmlServiceProvider and override the registerAccessHandler method.

Standalone

If you want to use the access handler class as a standalone component, please add this global alias in config/app.php

'aliases' => [
// ...'Access' => Styde\Html\Facades\Access,
// ...
],

Then you can use the facade wherever you want:

@if (Access:check(['roles'=> ['admin', 'editor']]))
<p>
<ahref='{{url('admin/posts', [$post->id]) }}'>
Edit this page
</a>
</p>
@endif

Deactivate the access handler

You can deactivate this component in the configuration:

//config/html.phpreturn [
//..'control_access' => true,
//..
];

By doing this, the callback, logged and roles attributes will simply be ignored and all users will be able to see all items.