<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mwiki.costasano.club/index.php?action=history&amp;feed=atom&amp;title=ICT%3AFinalConfig_-_Javascripts</id>
	<title>ICT:FinalConfig - Javascripts - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mwiki.costasano.club/index.php?action=history&amp;feed=atom&amp;title=ICT%3AFinalConfig_-_Javascripts"/>
	<link rel="alternate" type="text/html" href="https://mwiki.costasano.club/index.php?title=ICT:FinalConfig_-_Javascripts&amp;action=history"/>
	<updated>2026-07-23T01:55:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://mwiki.costasano.club/index.php?title=ICT:FinalConfig_-_Javascripts&amp;diff=1007&amp;oldid=prev</id>
		<title>Mngr: Created page with &quot;= Actual verions of the Javascripts needed in the Dashboard environment =  &lt;pre&gt; /************************************************************  * 1. AUTO‑PURGE FOR ALL DASHBOARD:* PAGES  ************************************************************/ $(function () {      // Prevent purge logic from running on edit, history, diff, preview, etc.     if (mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;) return;      const title = mw.config.get(&#039;wgPageName&#039;);      if (title &amp;&amp; title.sta...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mwiki.costasano.club/index.php?title=ICT:FinalConfig_-_Javascripts&amp;diff=1007&amp;oldid=prev"/>
		<updated>2026-02-17T11:16:29Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;= Actual verions of the Javascripts needed in the Dashboard environment =  &amp;lt;pre&amp;gt; &lt;span class=&quot;autocomment&quot;&gt;***********************************************************  * 1. AUTO‑PURGE FOR ALL DASHBOARD:* PAGES  ***********************************************************: &lt;/span&gt; $(function () {      // Prevent purge logic from running on edit, history, diff, preview, etc.     if (mw.config.get(&amp;#039;wgAction&amp;#039;) !== &amp;#039;view&amp;#039;) return;      const title = mw.config.get(&amp;#039;wgPageName&amp;#039;);      if (title &amp;amp;&amp;amp; title.sta...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Actual verions of the Javascripts needed in the Dashboard environment =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/************************************************************&lt;br /&gt;
 * 1. AUTO‑PURGE FOR ALL DASHBOARD:* PAGES&lt;br /&gt;
 ************************************************************/&lt;br /&gt;
$(function () {&lt;br /&gt;
&lt;br /&gt;
    // Prevent purge logic from running on edit, history, diff, preview, etc.&lt;br /&gt;
    if (mw.config.get(&amp;#039;wgAction&amp;#039;) !== &amp;#039;view&amp;#039;) return;&lt;br /&gt;
&lt;br /&gt;
    const title = mw.config.get(&amp;#039;wgPageName&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (title &amp;amp;&amp;amp; title.startsWith(&amp;#039;Dashboard:&amp;#039;)) {&lt;br /&gt;
&lt;br /&gt;
        // Only purge once&lt;br /&gt;
        if (!location.search.includes(&amp;#039;mw_purged=1&amp;#039;)) {&lt;br /&gt;
&lt;br /&gt;
            new mw.Api().get({&lt;br /&gt;
                action: &amp;#039;query&amp;#039;,&lt;br /&gt;
                meta: &amp;#039;tokens&amp;#039;,&lt;br /&gt;
                type: &amp;#039;csrf&amp;#039;&lt;br /&gt;
            }).done(function (data) {&lt;br /&gt;
&lt;br /&gt;
                const token = data.query.tokens.csrftoken;&lt;br /&gt;
&lt;br /&gt;
                new mw.Api().post({&lt;br /&gt;
                    action: &amp;#039;purge&amp;#039;,&lt;br /&gt;
                    titles: title,&lt;br /&gt;
                    token: token&lt;br /&gt;
                }).always(function () {&lt;br /&gt;
&lt;br /&gt;
                    // Reload the dashboard normally, marked as purged&lt;br /&gt;
                    const url = mw.util.getUrl(title, { mw_purged: 1 });&lt;br /&gt;
                    location.replace(url);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/************************************************************&lt;br /&gt;
 * 2. PAGE FORMS GEOCODING (ON BLUR ONLY – STABLE)&lt;br /&gt;
 ************************************************************/&lt;br /&gt;
&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function () {&lt;br /&gt;
&lt;br /&gt;
    function setupGeocoding(addressField, latField, lonField) {&lt;br /&gt;
&lt;br /&gt;
        const addr = $(&amp;#039;input[name$=&amp;quot;[&amp;#039; + addressField + &amp;#039;]&amp;quot;]&amp;#039;);&lt;br /&gt;
        const lat  = $(&amp;#039;input[name$=&amp;quot;[&amp;#039; + latField + &amp;#039;]&amp;quot;]&amp;#039;);&lt;br /&gt;
        const lon  = $(&amp;#039;input[name$=&amp;quot;[&amp;#039; + lonField + &amp;#039;]&amp;quot;]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        if (!addr.length || !lat.length || !lon.length) return;&lt;br /&gt;
&lt;br /&gt;
        // Remove previous handlers to avoid duplicates&lt;br /&gt;
        addr.off(&amp;#039;.pfGeocode&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        addr.on(&amp;#039;blur.pfGeocode&amp;#039;, function () {&lt;br /&gt;
&lt;br /&gt;
            const q = addr.val().trim();&lt;br /&gt;
            if (!q) return;&lt;br /&gt;
&lt;br /&gt;
            console.log(&amp;#039;Geocoding on blur:&amp;#039;, q);&lt;br /&gt;
&lt;br /&gt;
            const url =&lt;br /&gt;
                &amp;#039;https://nominatim.openstreetmap.org/search&amp;#039; +&lt;br /&gt;
                &amp;#039;?format=json&amp;amp;limit=1&amp;amp;q=&amp;#039; + encodeURIComponent(q);&lt;br /&gt;
&lt;br /&gt;
            $.getJSON(url, function (data) {&lt;br /&gt;
                if (data &amp;amp;&amp;amp; data.length) {&lt;br /&gt;
                    lat.val(data[0].lat).trigger(&amp;#039;change&amp;#039;);&lt;br /&gt;
                    lon.val(data[0].lon).trigger(&amp;#039;change&amp;#039;);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // === ENABLE FOR PLACE ===&lt;br /&gt;
    setupGeocoding(&amp;#039;Address&amp;#039;, &amp;#039;Latitude&amp;#039;, &amp;#039;Longitude&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/************************************************************&lt;br /&gt;
 * 3. GENERIC OSM LINK HELPER (SAFE)&lt;br /&gt;
 ************************************************************/&lt;br /&gt;
&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function () {&lt;br /&gt;
&lt;br /&gt;
    function setupOSMLink(latField, lonField) {&lt;br /&gt;
&lt;br /&gt;
        const lat = $(&amp;#039;input[name$=&amp;quot;[&amp;#039; + latField + &amp;#039;]&amp;quot;]&amp;#039;);&lt;br /&gt;
        const lon = $(&amp;#039;input[name$=&amp;quot;[&amp;#039; + lonField + &amp;#039;]&amp;quot;]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        if (!lat.length || !lon.length) return;&lt;br /&gt;
&lt;br /&gt;
        const linkBox =&lt;br /&gt;
            $(&amp;#039;&amp;lt;div class=&amp;quot;pf-osm-link&amp;quot; style=&amp;quot;margin-top:4px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
        lon.closest(&amp;#039;td&amp;#039;).append(linkBox);&lt;br /&gt;
&lt;br /&gt;
        function update() {&lt;br /&gt;
&lt;br /&gt;
            const la = lat.val();&lt;br /&gt;
            const lo = lon.val();&lt;br /&gt;
&lt;br /&gt;
            if (la &amp;amp;&amp;amp; lo) {&lt;br /&gt;
                const url =&lt;br /&gt;
                    &amp;#039;https://www.openstreetmap.org/?mlat=&amp;#039; + la +&lt;br /&gt;
                    &amp;#039;&amp;amp;mlon=&amp;#039; + lo;&lt;br /&gt;
                linkBox.html(&lt;br /&gt;
                    &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + url +&lt;br /&gt;
                    &amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;View on OpenStreetMap&amp;lt;/a&amp;gt;&amp;#039;&lt;br /&gt;
                );&lt;br /&gt;
            } else {&lt;br /&gt;
                linkBox.empty();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        lat.on(&amp;#039;change keyup&amp;#039;, update);&lt;br /&gt;
        lon.on(&amp;#039;change keyup&amp;#039;, update);&lt;br /&gt;
        update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // === ENABLE FOR PLACE ===&lt;br /&gt;
    setupOSMLink(&amp;#039;Latitude&amp;#039;, &amp;#039;Longitude&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/************************************************************&lt;br /&gt;
 * 4. EMPTY MANDATORY FIELD CHECK (PAGE FORMS ONLY)&lt;br /&gt;
 ************************************************************/&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function () {&lt;br /&gt;
&lt;br /&gt;
    // Only run on Page Forms edit pages&lt;br /&gt;
    if (mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) !== &amp;#039;FormEdit&amp;#039;) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Save buttons used by Page Forms&lt;br /&gt;
    const saveButtons = $(&amp;#039;input[name=&amp;quot;wpSave&amp;quot;], button[name=&amp;quot;wpSave&amp;quot;]&amp;#039;);&lt;br /&gt;
    if (!saveButtons.length) return;&lt;br /&gt;
&lt;br /&gt;
    // Avoid duplicate bindings&lt;br /&gt;
    saveButtons.off(&amp;#039;.pfRequiredCheck&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    saveButtons.on(&amp;#039;click.pfRequiredCheck&amp;#039;, function (e) {&lt;br /&gt;
&lt;br /&gt;
        const requiredFields = [&lt;br /&gt;
            { name: &amp;#039;Label&amp;#039;, label: &amp;#039;Name&amp;#039; }&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
        let missing = [];&lt;br /&gt;
&lt;br /&gt;
        requiredFields.forEach(function (f) {&lt;br /&gt;
            const input = $(&lt;br /&gt;
                &amp;#039;input[name$=&amp;quot;[&amp;#039; + f.name + &amp;#039;]&amp;quot;], &amp;#039; +&lt;br /&gt;
                &amp;#039;textarea[name$=&amp;quot;[&amp;#039; + f.name + &amp;#039;]&amp;quot;], &amp;#039; +&lt;br /&gt;
                &amp;#039;select[name$=&amp;quot;[&amp;#039; + f.name + &amp;#039;]&amp;quot;]&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
            if (!input.length || !input.val().trim()) {&lt;br /&gt;
                missing.push(f.label);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        if (missing.length) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopImmediatePropagation();&lt;br /&gt;
&lt;br /&gt;
            alert(&lt;br /&gt;
                &amp;#039;Please fill in the following required field(s):\n\n&amp;#039; +&lt;br /&gt;
                missing.join(&amp;#039;\n&amp;#039;)&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mngr</name></author>
	</entry>
</feed>