ICT:FinalConfig-Clutter and protection: Difference between revisions
No edit summary |
mNo edit summary |
||
| Line 1: | Line 1: | ||
= Final | = MediaWiki Interface & Permissions Architecture (Final Version) = | ||
''A stable, senior‑friendly, successor‑ready configuration for MW 1.43 + Vector‑2022'' | |||
== Purpose | == 1. Purpose of This Document == | ||
This document describes the final, working configuration of the MediaWiki interface, permissions, and layout model used for the club’s digital archive. It reflects the validated behavior after the February 2026 refinements. | |||
It is written for future administrators who may inherit the system. | |||
== 2. Design Philosophy == | |||
=== 2.1 Senior‑friendly === | |||
* Minimal clutter | |||
* Predictable navigation | |||
* Clean, distraction‑free layout | |||
=== 2.2 Role‑based clarity === | |||
* Anonymous visitors: clean public view | |||
* Users: simplified workspace | |||
* Sysops: full interface | |||
=== 2.3 Stability over cleverness === | |||
* Avoid deep Vector‑2022 overrides | |||
* Avoid fragile JavaScript | |||
* Prefer CSS and PHP hooks that are easy to maintain | |||
== | === 2.4 Successor‑friendly === | ||
* Clear separation of responsibilities | |||
* Minimal magic | |||
* Everything documented | |||
=== | == 3. Final Behavior Overview == | ||
* | === 3.1 Anonymous visitors === | ||
* No top toolbar | |||
* No right column | |||
* Full‑width content | |||
* Minimal sidebar (“Home”) | |||
* Clean, public‑facing layout | |||
* | === 3.2 Registered users (non‑sysop) === | ||
* No top toolbar in Dashboard/Main | |||
* Classical toolbar in Research | |||
* No right column except in Research | |||
* Full‑width content | |||
* Simplified sidebar (Dashboard + Research + Logout) | |||
* PageForms buttons always visible | |||
=== | === 3.3 Sysops === | ||
* Full toolbar restored | |||
* Right column restored | |||
* Full‑width content | |||
* Classical Vector‑2022 behavior (except for full‑width layout) | |||
* Slight left‑alignment quirk in toolbar (Vector‑2022 internal behavior) | |||
== 4. Final LocalSettings.php Configuration == | |||
== | |||
=== 4.1 Skin & Interface === | |||
<pre> | <pre> | ||
wfLoadSkin( 'Vector' ); | wfLoadSkin( 'Vector' ); | ||
$wgDefaultSkin = "vector-2022"; | $wgDefaultSkin = "vector-2022"; | ||
$wgVectorNightMode = [ | $wgVectorNightMode = [ | ||
'beta' => true, | 'beta' => true, | ||
| Line 68: | Line 66: | ||
]; | ]; | ||
$wgDefaultUserOptions['vector-theme'] = 'night'; | $wgDefaultUserOptions['vector-theme'] = 'night'; | ||
</pre> | </pre> | ||
== | === 4.2 Global Permissions === | ||
<pre> | <pre> | ||
# Anonymous | # Anonymous | ||
| Line 95: | Line 80: | ||
$wgGroupPermissions['user']['edit'] = true; | $wgGroupPermissions['user']['edit'] = true; | ||
$wgGroupPermissions['user']['upload'] = false; | $wgGroupPermissions['user']['upload'] = false; | ||
$wgGroupPermissions['user']['reupload'] = false; | |||
$wgGroupPermissions['user']['reupload-own'] = false; | |||
# | # Sysops | ||
$wgGroupPermissions['sysop']['editinterface'] = true; | $wgGroupPermissions['sysop']['editinterface'] = true; | ||
$wgGroupPermissions['sysop']['upload'] = true; | $wgGroupPermissions['sysop']['upload'] = true; | ||
$wgGroupPermissions['sysop']['reupload'] = true; | |||
$wgGroupPermissions['sysop']['reupload-own'] = true; | |||
</pre> | </pre> | ||
=== Namespace Protection | === 4.3 Namespace Protection === | ||
<pre> | <pre> | ||
$wgNamespaceProtection[NS_MAIN] = [ 'protect' ]; | $wgNamespaceProtection[NS_MAIN] = [ 'protect' ]; | ||
$wgNamespaceProtection[NS_ICT] = [ 'editinterface' ]; | $wgNamespaceProtection[NS_ICT] = [ 'editinterface' ]; | ||
$wgNamespaceProtection[NS_DASHBOARD] = [ 'editinterface' ]; | $wgNamespaceProtection[NS_DASHBOARD] = [ 'editinterface' ]; | ||
</pre> | </pre> | ||
=== Content Namespaces === | === 4.4 Content Namespaces === | ||
<pre> | <pre> | ||
$wgContentNamespaces = [ | $wgContentNamespaces = [ | ||
| Line 121: | Line 108: | ||
</pre> | </pre> | ||
=== Sidebar | === 4.5 Sidebar Model (Final Working Version) === | ||
<pre> | <pre> | ||
$wgHooks['SidebarBeforeOutput'][] = function ( $skin, &$sidebar ) { | $wgHooks['SidebarBeforeOutput'][] = function ( $skin, &$sidebar ) { | ||
$user = $skin->getUser(); | $user = $skin->getUser(); | ||
# Anonymous: minimal sidebar | |||
if ( $user->isAnon() ) { | |||
$sidebar = [ | |||
'Navigation' => [ | |||
[ 'text' => 'Home', 'href' => '/Hoofdpagina' ] | |||
] | |||
]; | |||
return true; | |||
} | |||
# Users (non-sysop): simplified sidebar | |||
if ( !$user->isAllowed( 'editinterface' ) ) { | if ( !$user->isAllowed( 'editinterface' ) ) { | ||
$sidebar = [ | $sidebar = [ | ||
'Project Navigation' => [ | 'Project Navigation' => [ | ||
[ 'text' => 'Dashboard', | [ 'text' => 'Dashboard', 'href' => '/Dashboard:Main' ], | ||
[ 'text' => 'Research Area', | [ 'text' => 'Research Area', 'href' => '/Research:Main' ], | ||
], | ], | ||
'Account' => [ | 'Account' => [ | ||
| Line 143: | Line 134: | ||
] | ] | ||
]; | ]; | ||
return true; | |||
} | } | ||
# Sysop: default sidebar | |||
return true; | return true; | ||
}; | }; | ||
</pre> | </pre> | ||
=== Cargo Hardening === | === 4.6 Cargo Hardening === | ||
<pre> | <pre> | ||
$wgGroupPermissions['user']['runcargoqueries'] = false; | $wgGroupPermissions['user']['runcargoqueries'] = false; | ||
$wgGroupPermissions['user']['recreatecargodata'] = false; | $wgGroupPermissions['user']['recreatecargodata'] = false; | ||
</pre> | </pre> | ||
=== | === 4.7 Optional Hardening === | ||
<pre> | <pre> | ||
$wgNonincludableNamespaces[] = NS_ICT; | $wgNonincludableNamespaces[] = NS_ICT; | ||
$wgRedirectOnLogin = "Hoofdpagina"; | $wgRedirectOnLogin = "Hoofdpagina"; | ||
</pre> | </pre> | ||
== | == 5. Final CSS Configuration == | ||
=== 5.1 MediaWiki:Common.css (Anonymous users) === | |||
<pre> | <pre> | ||
/* Hide | /* Hide toolbar and right column for anonymous users */ | ||
.ns-0 .vector-page-toolbar, | .ns-0 .vector-page-toolbar, | ||
.ns-0 .vector-column-end { | .ns-0 .vector-column-end { | ||
display: none !important; | display: none !important; | ||
} | } | ||
/* | /* Full-width layout */ | ||
.ns-0 .mw-content-container { | .ns-0 .mw-content-container { | ||
max-width: none !important; | |||
} | |||
</pre> | |||
=== 5.2 MediaWiki:Group-user.css (Registered users) === | |||
<pre> | |||
/* Hide toolbar & right column in Dashboard and Main */ | |||
.ns-3020 .vector-page-toolbar, | |||
.ns-0 .vector-page-toolbar, | |||
.ns-3020 .vector-column-end, | |||
.ns-0 .vector-column-end { | |||
display: none !important; | |||
} | |||
/* Full-width layout */ | |||
.ns-3020 .mw-content-container, | |||
.ns-0 .mw-content-container { | |||
max-width: none !important; | max-width: none !important; | ||
} | } | ||
/* Ensure | /* Ensure PageForms buttons are always visible */ | ||
.mw-body-content .mw-ui-button, | .mw-body-content .mw-ui-button, | ||
.mw-body-content .pfForm { | .mw-body-content .pfForm { | ||
display: inline-block !important; | display: inline-block !important; | ||
| Line 203: | Line 194: | ||
</pre> | </pre> | ||
=== | === 5.3 MediaWiki:Group-sysop.css (Sysops) === | ||
<pre> | <pre> | ||
/* Restore | /* Restore toolbar */ | ||
html body.skin-vector-2022 .vector-page-toolbar { | html body.skin-vector-2022 .vector-page-toolbar { | ||
display: flex !important; | display: flex !important; | ||
visibility: visible !important; | |||
} | } | ||
/* Restore | /* Restore right column in normal flow */ | ||
html body.skin-vector-2022 .vector-column-end { | html body.skin-vector-2022 .vector-column-end { | ||
display: block !important; | display: block !important; | ||
visibility: visible !important; | |||
position: static !important; | |||
} | } | ||
/* Full-width content | /* Full-width content */ | ||
html body.skin-vector-2022 .mw-content-container { | html body.skin-vector-2022 .mw-content-container { | ||
max-width: none !important; | max-width: none !important; | ||
} | } | ||
</pre> | </pre> | ||
== | == 6. Known Limitations == | ||
=== 6.1 Sysop toolbar alignment === | |||
Vector‑2022 aligns the sysop toolbar slightly differently due to internal flexbox logic. | |||
This is harmless and not worth overriding. | |||
=== 6.2 Vector‑2022 sidebar dependency === | |||
Vector‑2022 cannot render with an empty sidebar. | |||
Anonymous users must always receive at least one menu item. | |||
=== 6.3 PageForms visibility === | |||
PageForms buttons must be explicitly forced visible for non‑sysops. | |||
== 7. Future Extensions == | |||
=== 7.1 Public navigation === | |||
When more public pages exist, extend the anonymous sidebar: | |||
<pre> | |||
'Navigation' => [ | |||
[ 'text' => 'Home', 'href' => '/Hoofdpagina' ], | |||
[ 'text' => 'About', 'href' => '/Main:About' ], | |||
[ 'text' => 'Archive', 'href' => '/Main:Archive' ] | |||
] | |||
</pre> | |||
* | === 7.2 Role‑based dashboards === | ||
* | Dashboard namespace can later host: | ||
* | * User dashboards | ||
* Research dashboards | |||
* Admin dashboards | |||
=== | === 7.3 Omeka‑S style modular archive === | ||
* | The current structure is ready for: | ||
* | * Entities | ||
* | * Assets | ||
* | * Relations | ||
* Cargo tables | |||
== | == 8. Final Notes for Successors == | ||
* | * All interface behavior is controlled by three CSS files and one PHP hook. | ||
* | * Avoid modifying Vector‑2022 templates unless absolutely necessary. | ||
* | * Keep the anonymous sidebar non‑empty. | ||
* | * Maintain full‑width layout for consistency. | ||
* Document every change in ICT namespace. | |||
Revision as of 17:22, 13 February 2026
MediaWiki Interface & Permissions Architecture (Final Version)
A stable, senior‑friendly, successor‑ready configuration for MW 1.43 + Vector‑2022
1. Purpose of This Document
This document describes the final, working configuration of the MediaWiki interface, permissions, and layout model used for the club’s digital archive. It reflects the validated behavior after the February 2026 refinements.
It is written for future administrators who may inherit the system.
2. Design Philosophy
2.1 Senior‑friendly
- Minimal clutter
- Predictable navigation
- Clean, distraction‑free layout
2.2 Role‑based clarity
- Anonymous visitors: clean public view
- Users: simplified workspace
- Sysops: full interface
2.3 Stability over cleverness
- Avoid deep Vector‑2022 overrides
- Avoid fragile JavaScript
- Prefer CSS and PHP hooks that are easy to maintain
2.4 Successor‑friendly
- Clear separation of responsibilities
- Minimal magic
- Everything documented
3. Final Behavior Overview
3.1 Anonymous visitors
- No top toolbar
- No right column
- Full‑width content
- Minimal sidebar (“Home”)
- Clean, public‑facing layout
3.2 Registered users (non‑sysop)
- No top toolbar in Dashboard/Main
- Classical toolbar in Research
- No right column except in Research
- Full‑width content
- Simplified sidebar (Dashboard + Research + Logout)
- PageForms buttons always visible
3.3 Sysops
- Full toolbar restored
- Right column restored
- Full‑width content
- Classical Vector‑2022 behavior (except for full‑width layout)
- Slight left‑alignment quirk in toolbar (Vector‑2022 internal behavior)
4. Final LocalSettings.php Configuration
4.1 Skin & Interface
wfLoadSkin( 'Vector' );
$wgDefaultSkin = "vector-2022";
$wgVectorNightMode = [
'beta' => true,
'logged_in' => true,
'logged_out' => true,
];
$wgDefaultUserOptions['vector-theme'] = 'night';
4.2 Global Permissions
# Anonymous $wgGroupPermissions['*']['read'] = true; $wgGroupPermissions['*']['edit'] = false; $wgGroupPermissions['*']['createaccount'] = false; # Users $wgGroupPermissions['user']['read'] = true; $wgGroupPermissions['user']['edit'] = true; $wgGroupPermissions['user']['upload'] = false; $wgGroupPermissions['user']['reupload'] = false; $wgGroupPermissions['user']['reupload-own'] = false; # Sysops $wgGroupPermissions['sysop']['editinterface'] = true; $wgGroupPermissions['sysop']['upload'] = true; $wgGroupPermissions['sysop']['reupload'] = true; $wgGroupPermissions['sysop']['reupload-own'] = true;
4.3 Namespace Protection
$wgNamespaceProtection[NS_MAIN] = [ 'protect' ]; $wgNamespaceProtection[NS_ICT] = [ 'editinterface' ]; $wgNamespaceProtection[NS_DASHBOARD] = [ 'editinterface' ];
4.4 Content Namespaces
$wgContentNamespaces = [
NS_MAIN, NS_RESEARCH, NS_ICT, NS_DASHBOARD,
NS_CHAPTER, NS_PLACE, NS_ORGANISATION,
NS_PERSON, NS_HERITAGE, NS_ASSET
];
$wgNamespacesWithSubpages[NS_DASHBOARD] = true;
4.5 Sidebar Model (Final Working Version)
$wgHooks['SidebarBeforeOutput'][] = function ( $skin, &$sidebar ) {
$user = $skin->getUser();
# Anonymous: minimal sidebar
if ( $user->isAnon() ) {
$sidebar = [
'Navigation' => [
[ 'text' => 'Home', 'href' => '/Hoofdpagina' ]
]
];
return true;
}
# Users (non-sysop): simplified sidebar
if ( !$user->isAllowed( 'editinterface' ) ) {
$sidebar = [
'Project Navigation' => [
[ 'text' => 'Dashboard', 'href' => '/Dashboard:Main' ],
[ 'text' => 'Research Area', 'href' => '/Research:Main' ],
],
'Account' => [
[ 'text' => 'Logout', 'href' => '/Special:UserLogout' ]
]
];
return true;
}
# Sysop: default sidebar
return true;
};
4.6 Cargo Hardening
$wgGroupPermissions['user']['runcargoqueries'] = false; $wgGroupPermissions['user']['recreatecargodata'] = false;
4.7 Optional Hardening
$wgNonincludableNamespaces[] = NS_ICT; $wgRedirectOnLogin = "Hoofdpagina";
5. Final CSS Configuration
5.1 MediaWiki:Common.css (Anonymous users)
/* Hide toolbar and right column for anonymous users */
.ns-0 .vector-page-toolbar,
.ns-0 .vector-column-end {
display: none !important;
}
/* Full-width layout */
.ns-0 .mw-content-container {
max-width: none !important;
}
5.2 MediaWiki:Group-user.css (Registered users)
/* Hide toolbar & right column in Dashboard and Main */
.ns-3020 .vector-page-toolbar,
.ns-0 .vector-page-toolbar,
.ns-3020 .vector-column-end,
.ns-0 .vector-column-end {
display: none !important;
}
/* Full-width layout */
.ns-3020 .mw-content-container,
.ns-0 .mw-content-container {
max-width: none !important;
}
/* Ensure PageForms buttons are always visible */
.mw-body-content .mw-ui-button,
.mw-body-content .pfForm {
display: inline-block !important;
visibility: visible !important;
}
5.3 MediaWiki:Group-sysop.css (Sysops)
/* Restore toolbar */
html body.skin-vector-2022 .vector-page-toolbar {
display: flex !important;
visibility: visible !important;
}
/* Restore right column in normal flow */
html body.skin-vector-2022 .vector-column-end {
display: block !important;
visibility: visible !important;
position: static !important;
}
/* Full-width content */
html body.skin-vector-2022 .mw-content-container {
max-width: none !important;
}
6. Known Limitations
6.1 Sysop toolbar alignment
Vector‑2022 aligns the sysop toolbar slightly differently due to internal flexbox logic. This is harmless and not worth overriding.
6.2 Vector‑2022 sidebar dependency
Vector‑2022 cannot render with an empty sidebar. Anonymous users must always receive at least one menu item.
6.3 PageForms visibility
PageForms buttons must be explicitly forced visible for non‑sysops.
7. Future Extensions
7.1 Public navigation
When more public pages exist, extend the anonymous sidebar:
'Navigation' => [
[ 'text' => 'Home', 'href' => '/Hoofdpagina' ],
[ 'text' => 'About', 'href' => '/Main:About' ],
[ 'text' => 'Archive', 'href' => '/Main:Archive' ]
]
7.2 Role‑based dashboards
Dashboard namespace can later host:
- User dashboards
- Research dashboards
- Admin dashboards
7.3 Omeka‑S style modular archive
The current structure is ready for:
- Entities
- Assets
- Relations
- Cargo tables
8. Final Notes for Successors
- All interface behavior is controlled by three CSS files and one PHP hook.
- Avoid modifying Vector‑2022 templates unless absolutely necessary.
- Keep the anonymous sidebar non‑empty.
- Maintain full‑width layout for consistency.
- Document every change in ICT namespace.