Jump to content

ICT:FinalConfig - ORGANISATION: Difference between revisions

From Costa Sano MediaWiki
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 4: Line 4:


The aim is to create an interface without MediaWiki clutter and well protected to avoid confusing users with unnecessary elements on the page.  
The aim is to create an interface without MediaWiki clutter and well protected to avoid confusing users with unnecessary elements on the page.  
The Cargo template follows what has been decided in the DBML. It is the third implementation of an entity in order to finetune a final dashboard layout.
The Cargo template follows what has been decided in the DBML and is fully aligned with the reference entity Place.
 
= Cargo Table: =
Template:Organisation
 
<pre>
<noinclude>
Organisation data template
 
{{#cargo_declare:= Final Configuration for the Organisation Entity =
 
Document revision: {{#time:Y-m-d|{{REVISIONTIMESTAMP}}}} by {{REVISIONUSER}}
 
The aim is to create an interface without MediaWiki clutter and well protected to avoid confusing users with unnecessary elements on the page.
The Cargo template follows what has been decided in the DBML and aligns fully with the reference entity Place.


The Organisation entity is the first entity combining:
The Organisation entity is the first entity combining:
Line 24: Line 10:
- a foreign key to another entity (Place)
- a foreign key to another entity (Place)


This entity is used to validate that recursion and foreign keys work correctly together.
This configuration validates that recursion and foreign keys can safely coexist within the same entity model.
 
This configuration deliberately favors explicit behavior and robustness over visual polish or implicit framework behavior, in order to ensure long-term maintainability.


= Cargo Table: =
= Cargo Table: =
Line 69: Line 57:
</pre>
</pre>


Once the template is created, do not forget to manually force the creation of the Cargo table.
Once the template is created, the Cargo table must be created manually.
If modifications are done to the table, one needs to manually update the table and then go to the Cargo interface to swap the temporary table to become the official one.
If modifications are made to the table structure, the table must be recreated and the temporary table swapped via the Cargo administration interface.
 
The field Code stores the full page name (including namespace) to ensure unambiguous identification and safe use as a foreign key across entities.


Important conventions:
Important conventions:
- Field names start with a capital letter
- Field names start with a capital letter
- Page name is used as the technical identifier (Code)
- Code is the page name and acts as the technical identifier
- Label is the mandatory human-readable name for all entities
- Label is the human-readable name and is mandatory for all entities
- Relationships (Parent, Place) are stored as Page fields
- Parent and Place are stored as Page fields
- The field name Label must not be renamed, as it is relied upon by shared JavaScript validation logic
 
Special lines at the bottom of the template:
<pre>
== {{{Label|}}} ==
{{DISPLAYTITLE:{{{Label}}}}}
 
{{#if:{{{Parent|}}}|
'''Parent organisation:''' [[{{{Parent}}}]]
}}
 
{{#if:{{{Place|}}}|
'''Located in:''' [[{{{Place}}}]]
}}
 
'''Notes:'''
{{{Notes|}}}
</pre>
 
These lines ensure that the human-readable name (Label) is consistently used as the visible page title, while the actual page name remains the stable technical identifier (Code).
 
This decoupling allows renaming the label without breaking Cargo relations, dashboards, or foreign keys.


= Page Form: =
= Page Form: =
Line 92: Line 104:
|no footer
|no footer
}}}
}}}
''Fields marked with (*) are required.''
''Fields marked with (*) are required.''


Line 141: Line 152:
</pre>
</pre>


The first section is important to avoid clutter.
The first section avoids MediaWiki edit clutter.
<pre>
<pre>
{{{info
{{{info
Line 152: Line 163:
</pre>
</pre>


Convention: The field Label (displayed as “Name”) is mandatory for all entities.
The field Label (displayed to the user as “Name”) is mandatory for all entities.
This requirement is not implemented using the Page Forms |mandatory option, as this generates unusable white error boxes in the dark Vector-2022 environment.
This requirement is not implemented using the Page Forms |mandatory option, as this produces unusable white error boxes in the dark Vector-2022 environment.
Instead, enforcement is done via JavaScript triggered on the Save button.
 
Instead:
- the requirement is communicated via text and (*)
- enforcement is handled via JavaScript at save time


= Dashboard page =
= Dashboard page =
Line 164: Line 178:


{| class="wikitable sortable"
{| class="wikitable sortable"
! Code !! Name !! Place
! Code !! Name !! Parent !! Place
{{#cargo_query:
{{#cargo_query:
  tables=Organisations
  tables=Organisations
  |fields=_pageName,_pageTitle,Label,Place
  |fields=_pageName,_pageTitle,Label,Parent,Place
  |where=_pageNamespace=3008
  |where=_pageNamespace=3008
  |order by=_pageTitle
  |order by=_pageTitle
Line 191: Line 205:
</pre>
</pre>


Different measures are taken to deal with caching data in MediaWiki, Cargo and the browser.
IMPORTANT:
<pre>
Dashboard tables are positional.
|cache=no
The number and order of:
</pre>
- table headers
This is needed on the Cargo side to avoid caching. The timestamp below forces the page to change, helping invalidate cached versions.
- Cargo query fields
<pre>
- row template cells
<div style="text-align:right; font-size:90%;">
MUST match exactly.
Last updated: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} – {{CURRENTTIME}} UTC
</div>
</pre>


The layout of the dashboard makes use of a Template:OrganisationRow as described below.
Only the first column (Code) is clickable and leads to the edit form.
It makes the first column of the table clickable to go back to the Form and edit the record.
All other columns are displayed as plain text to prevent navigation to record pages.


= Row transclusion Template =
= Row transclusion Template =
Line 217: Line 228:
  }}
  }}
| {{{Label}}}
| {{{Label}}}
| {{#if:{{{Place|}}}|[[{{{Place}}}]]|—}}
| {{#if:{{{Parent|}}}|{{#titleparts:{{{Parent}}}|1}}|—}}
| {{#if:{{{Place|}}}|{{#titleparts:{{{Place}}}|1}}|—}}
</includeonly>
</includeonly>
</pre>
</pre>


All this creates pages in the namespace Organisation with the page name being the code.
Parent and Place values are displayed as plain text (not links) to prevent users from navigating directly to record pages. All record editing is performed via forms accessed from the dashboard.
The page itself is a configuration page used by the Page Forms extension.


Below is an example of such a page.
= Javascript =
 
The Organisation entity reuses the same shared JavaScript infrastructure as Place:
- dashboard auto-purge
- save-time mandatory field enforcement (Label)
- no Page Forms |mandatory usage
 
No Organisation-specific JavaScript is required.
 
All Organisation pages are stored in the Organisation namespace with the page name acting as the Code.
 
Example:
<pre>
<pre>
{{Organisation
{{Organisation
Line 236: Line 258:
</pre>
</pre>


As you can see, the page as such is not intended to be read directly and should be accessed via the dashboard page.
Such pages are configuration pages and must be accessed via the dashboard, not directly.
 
== References: ==
 
* [[mediawikiwiki:Extension:Cargo/Storing_data|Cargo table explanation]]
* [[mediawikiwiki:Extension:Page_Forms|Page Forms explained]]
 
[[Category:FinalConfig]]
 
_table=Organisations
|name=String
|code=String
|description=Text
|place_id=Page
|contact_information=Text
|notes=Text
}}
 
{{#forminput:form=Organisation}}
</noinclude>
 
{{#cargo_store:
name={{{name|}}}
|code={{PAGENAME}}
|description={{{description|}}}
|place_id={{{place_id|}}}
|contact_information={{{contact_information|}}}
|notes={{{notes|}}}
}}
 
== {{{name|}}} ==
 
</pre>
 
Once the template is created don't forget to manually force the creation of the Cargo table.
If modifications are done to the table, one needs to manually update the table and then go to the Cargo interface to swap the temporary table to become the official one. Take care what is inside and outside
<pre>
<noinclude>
</pre>
 
= Page Form: =
Form:Organisation
<pre>
<noinclude>
Form for creating and editing Organisation pages.
</noinclude>
 
{{{info
|no summary
|no preview
|no minor edit
|no watch
|no footer
}}}
 
{{{for template|Organisation}}}
 
{| class="formtable"
 
! Name
| {{{field|name|mandatory}}}
|-
 
! Code
| {{PAGENAME}}
|-
 
! Description
| {{{field|description|input type=textarea}}}
|-
 
! Place
| {{{field|place_id
  |label=Located in
  |input type=combobox
  |values from namespace=Place
  |existing values only
  |placeholder=Select a place
}}}
|-
 
! Contact information
| {{{field|contact_information|input type=textarea}}}
|-
 
! Notes
| {{{field|notes|input type=textarea}}}
 
|}
 
{{{standard input|save}}}
 
{{{end template}}}
 
</pre>
 
The first section is important to avoid clutter.
<pre>
{{{info
|no summary
|no preview
|no minor edit
|no watch
|no footer
}}}
</pre>
 
= Dashboard page =
Dashboard:Organisation
<pre>
= 🏛️ Costa Sano Research ORGANISATION Dashboard =
 
📖 [[Dashboard:Organisation/Help|Need Help?]]
 
{| class="wikitable sortable"
! Code !! Name !! Place
{{#cargo_query:
tables=Organisations
|fields=_pageName,code,name,place_id
|where=_pageNamespace=3008
|order by=code
|format=template
|template=OrganisationRow
|named args=yes
|cache=no
}}
|}
 
Choose your organisation code corresponding to above table and respecting the naming conventions.
 
{{#forminput:
form=Organisation
|namespace=Organisation
|button text=➕ New organisation
|returnto=Dashboard:Organisation
}}
 
<div style="text-align:right; font-size:90%;">
Last updated: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} – {{CURRENTTIME}} UTC
</div>
 
</pre>
 
Different measures are taken to deal with caching data in MediaWiki, Cargo and what happens in a browser.
<pre>
|cache=no
</pre>
This is needed on the Cargo side to avoid caching and the following puts a new datetime on the page making it different from the previous version with the result that the page is renewed and the cached version is dropped.
<pre>
<div style="text-align:right; font-size:90%;">
Last updated: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} – {{CURRENTTIME}} UTC
</div>
</pre>
 
The layout of the dashboard makes use of a Template:OrganisationRow as described below.
It makes the first column of the table clickable to go back to the Form and edit the record.
 
= Row transclusion Template =
Template:OrganisationRow
<pre>
<includeonly>
|-
| {{#formlink:form=Organisation|target={{{_pageName}}}|link text={{{code}}}|returnto=Dashboard:Organisation}}
| {{{name}}}
| {{{place_id}}}
</includeonly>
 
</pre>
 
All this creates pages in the namespace Organisation with the name being the code. The page is a configuration to serve in Page Forms extension. Below is an example of such a page.
<pre>
{{Organisation
|name=Archives Départementales du Pas-de-Calais
|description=Regional archive authority for the Pas-de-Calais department.
|place_id=Place:ARRAS
|contact_information=Rue Ferdinand Buisson, 62000 Arras
|notes=Primary source repository for Costa Sano research.
}}
</pre>
 
As you can see the page as is cannot be used as such and should be read via the dashboard page.


== References: ==
== References: ==

Latest revision as of 11:11, 17 February 2026

Final Configuration for the Organisation Entity

Document revision: 2026-02-17 by Mngr

The aim is to create an interface without MediaWiki clutter and well protected to avoid confusing users with unnecessary elements on the page. The Cargo template follows what has been decided in the DBML and is fully aligned with the reference entity Place.

The Organisation entity is the first entity combining: - recursiveness (parent organisation) - a foreign key to another entity (Place)

This configuration validates that recursion and foreign keys can safely coexist within the same entity model.

This configuration deliberately favors explicit behavior and robustness over visual polish or implicit framework behavior, in order to ensure long-term maintainability.

Cargo Table:

Template:Organisation

<noinclude>
Organisation data template
</noinclude>

{{#cargo_declare:
 |_table=Organisations
 |Code=Page
 |Label=String
 |Parent=Page
 |Place=Page
 |Description=Text
 |Contact=Text
 |Notes=Text
}}

{{#cargo_store:
 |Code={{FULLPAGENAME}}
 |Label={{{Label|}}}
 |Parent={{{Parent|}}}
 |Place={{{Place|}}}
 |Description={{{Description|}}}
 |Contact={{{Contact|}}}
 |Notes={{{Notes|}}}
}}

== {{{Label|}}} ==
{{DISPLAYTITLE:{{{Label}}}}}

{{#if:{{{Parent|}}}|
'''Parent organisation:''' [[{{{Parent}}}]]
}}

{{#if:{{{Place|}}}|
'''Located in:''' [[{{{Place}}}]]
}}

'''Notes:'''
{{{Notes|}}}

Once the template is created, the Cargo table must be created manually. If modifications are made to the table structure, the table must be recreated and the temporary table swapped via the Cargo administration interface.

The field Code stores the full page name (including namespace) to ensure unambiguous identification and safe use as a foreign key across entities.

Important conventions: - Field names start with a capital letter - Code is the page name and acts as the technical identifier - Label is the human-readable name and is mandatory for all entities - Parent and Place are stored as Page fields - The field name Label must not be renamed, as it is relied upon by shared JavaScript validation logic

Special lines at the bottom of the template:

== {{{Label|}}} ==
{{DISPLAYTITLE:{{{Label}}}}}

{{#if:{{{Parent|}}}|
'''Parent organisation:''' [[{{{Parent}}}]]
}}

{{#if:{{{Place|}}}|
'''Located in:''' [[{{{Place}}}]]
}}

'''Notes:'''
{{{Notes|}}}

These lines ensure that the human-readable name (Label) is consistently used as the visible page title, while the actual page name remains the stable technical identifier (Code).

This decoupling allows renaming the label without breaking Cargo relations, dashboards, or foreign keys.

Page Form:

Form:Organisation

<noinclude>
Form for creating and editing Organisation pages.
</noinclude>

{{{info
|no summary
|no preview
|no minor edit
|no watch
|no footer
}}}
''Fields marked with (*) are required.''

{{{for template|Organisation}}}

{| class="formtable"

! Code
| {{PAGENAME}}
|-

! Name (*)
| {{{field|Label}}}
|-

! Parent organisation
| {{{field|Parent
 |input type=combobox
 |values from namespace=Organisation
 |placeholder=Top level (no parent)
}}}
|-

! Located in (Place)
| {{{field|Place
 |input type=combobox
 |values from namespace=Place
 |placeholder=Select a place
}}}
|-

! Description
| {{{field|Description|input type=textarea}}}
|-

! Contact information
| {{{field|Contact|input type=textarea}}}
|-

! Notes
| {{{field|Notes|input type=textarea}}}

|}

{{{standard input|save}}}

{{{end template}}}

The first section avoids MediaWiki edit clutter.

{{{info
|no summary
|no preview
|no minor edit
|no watch
|no footer
}}}

The field Label (displayed to the user as “Name”) is mandatory for all entities. This requirement is not implemented using the Page Forms |mandatory option, as this produces unusable white error boxes in the dark Vector-2022 environment.

Instead: - the requirement is communicated via text and (*) - enforcement is handled via JavaScript at save time

Dashboard page

Dashboard:Organisation

= 🏛️ Costa Sano Research ORGANISATION Dashboard =

📖 [[Dashboard:Organisation/Help|Need Help?]]

{| class="wikitable sortable"
! Code !! Name !! Parent !! Place
{{#cargo_query:
 tables=Organisations
 |fields=_pageName,_pageTitle,Label,Parent,Place
 |where=_pageNamespace=3008
 |order by=_pageTitle
 |format=template
 |template=OrganisationRow
 |named args=yes
 |cache=no
}}
|}

Choose your organisation code corresponding to above table and respecting the naming conventions.

{{#forminput:
 form=Organisation
 |namespace=Organisation
 |button text=➕ New organisation
 |returnto=Dashboard:Organisation
}}

<div style="text-align:right; font-size:90%;">
Last updated: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} – {{CURRENTTIME}} UTC
</div>

IMPORTANT: Dashboard tables are positional. The number and order of: - table headers - Cargo query fields - row template cells MUST match exactly.

Only the first column (Code) is clickable and leads to the edit form. All other columns are displayed as plain text to prevent navigation to record pages.

Row transclusion Template

Template:OrganisationRow

<includeonly>
|-
| {{#formlink:
   form=Organisation
   |target={{{_pageName}}}
   |link text={{{_pageTitle}}}
   |returnto=Dashboard:Organisation
 }}
| {{{Label}}}
| {{#if:{{{Parent|}}}|{{#titleparts:{{{Parent}}}|1}}|—}}
| {{#if:{{{Place|}}}|{{#titleparts:{{{Place}}}|1}}|—}}
</includeonly>

Parent and Place values are displayed as plain text (not links) to prevent users from navigating directly to record pages. All record editing is performed via forms accessed from the dashboard.

Javascript

The Organisation entity reuses the same shared JavaScript infrastructure as Place: - dashboard auto-purge - save-time mandatory field enforcement (Label) - no Page Forms |mandatory usage

No Organisation-specific JavaScript is required.

All Organisation pages are stored in the Organisation namespace with the page name acting as the Code.

Example:

{{Organisation
|Label=Archives Départementales du Pas-de-Calais
|Parent=
|Place=Place:ARRAS
|Description=Regional archive authority for the Pas-de-Calais department.
|Contact=Rue Ferdinand Buisson, 62000 Arras
|Notes=Primary source repository for Costa Sano research.
}}

Such pages are configuration pages and must be accessed via the dashboard, not directly.

References: