Narodowe Centrum NaukiProjekt sfinansowany przez Narodowe Centrum Nauki
OPUS 2025/57/B/HS3/02198
Instytut Historii PAN

MediaWiki:Common.js: Różnice pomiędzy wersjami

Z LawRus
auto-sync z repo
 
auto-sync z repo
Linia 2: Linia 2:
   1. Przenoszenie sekcji uczestników pod właściwe sekcje Umów w formularzu.
   1. Przenoszenie sekcji uczestników pod właściwe sekcje Umów w formularzu.
   2. Walidacja formularza WpisKroniki przed zapisem (status ≥ 4).
   2. Walidacja formularza WpisKroniki przed zapisem (status ≥ 4).
  3. Skracanie streszczenia w tabelach Cargo do 100 znaków + rozwiń.
   ───────────────────────────────────────────────────────────────────────────── */
   ───────────────────────────────────────────────────────────────────────────── */


/* Potwierdza że plik jest parsowany przez przeglądarkę */
/* ── Skracanie streszczenia ───────────────────────────────────────────────────
console.log( '[LawRus] Common.js: plik załadowany (poza document.ready)' );
  Kolumna streszczenie = zawsze td:nth-child(2) w każdym LawRus cargo query.
  Przypisanie do window.lawrusTruncateAll pozwala wywołać ją z konsoli. */


function lawrusReorderParticipants() {
window.lawrusTruncateAll = function () {
     var $h3kraj = $( 'span.mw-headline[id="Uczestnicy_umowy_krajowej"]' ).closest( 'h3' );
     $( 'table.cargoDynamicTable tbody tr' ).each( function () {
    var $h3miedz = $( 'span.mw-headline' ).filter( function () {
        var $td = $( this ).children( 'td' ).eq( 1 );
        return ( $( this ).attr( 'id' ) || '' ).indexOf( 'Uczestnicy_umowy_mi' ) === 0;
        if ( !$td.length )                         { return; }
    } ).closest( 'h3' );
        if ( $td.find( '.lawrus-short' ).length )  { return; }
        var text = $td.text().replace( /\s+/g, ' ' ).trim();
        if ( text.length <= 100 )                  { return; }
        var e = function ( s ) {
            return s.replace( /&/g, '&amp;' )
                    .replace( /</g,  '&lt;' )
                    .replace( />/g,  '&gt;' );
        };
        $td.html(
            '<span class="lawrus-short">' +
                e( text.substring( 0, 100 ) ) +
                '<a href="#" class="lawrus-more" style="color:#3366cc;cursor:pointer;margin-left:2px">&#x2026;</a>' +
            '</span>' +
            '<span class="lawrus-full-wrap" style="display:none">' +
                e( text ) +
                '&#160;<a href="#" class="lawrus-less" style="color:#3366cc;cursor:pointer">&#x2191;</a>' +
            '</span>'
        );
    } );
};


    console.log( '[LawRus] reorder: h3kraj=', $h3kraj.length, 'h3miedz=', $h3miedz.length );
/* draw.dt — każdy redraw DataTables (init, sort, filtr, paginacja) */
$( document ).on( 'draw.dt', window.lawrusTruncateAll );


     if ( !$h3kraj.length || !$h3miedz.length ) return;
/* Kliknięcia — delegowane, niezależne od DataTables */
$( document ).on( 'click', '.lawrus-more', function ( e ) {
    e.preventDefault();
     var $td = $( this ).closest( 'td' );
    $td.find( '.lawrus-short' ).hide();
    $td.find( '.lawrus-full-wrap' ).show();
} );
$( document ).on( 'click', '.lawrus-less', function ( e ) {
    e.preventDefault();
    var $td = $( this ).closest( 'td' );
    $td.find( '.lawrus-full-wrap' ).hide();
    $td.find( '.lawrus-short' ).show();
} );


    // Przenosi tylko h3 + jego multipleTemplateWrapper — bez dotykania sąsiednich elementów
/* window.load — odpala po załadowaniu WSZYSTKICH zasobów strony (DataTables
    var $wrapKraj = $h3kraj.nextAll( 'div.multipleTemplateWrapper' ).first();
  na pewno gotowe do tego momentu). */
     var $wrapMiedz = $h3miedz.nextAll( 'div.multipleTemplateWrapper' ).first();
$( window ).on( 'load', function () {
    window.lawrusTruncateAll();
     setTimeout( window.lawrusTruncateAll, 300 );
} );


     console.log( '[LawRus] reorder: wrapKraj=', $wrapKraj.length, 'wrapMiedz=', $wrapMiedz.length );
function lawrusInitLangSwitch() {
     var $entries = $( '.wpis-kroniki' );
    if ( !$entries.length ) return;


     var $h2miedz = $( 'span.mw-headline' ).filter( function () {
     var isEn = ( mw.config.get( 'wgUserLanguage' ) === 'en' );
        return ( $( this ).attr( 'id' ) || '' ).indexOf( 'Umowa_mi' ) === 0;
    } ).closest( 'h2' );


     var $h2tekst = $( 'span.mw-headline' ).filter( function () {
     $entries.each( function () {
         return ( $( this ).attr( 'id' ) || '' ).indexOf( 'Tekst_' ) === 0;
         var $entry = $( this );
    } ).closest( 'h2' );
        if ( !$entry.find( '.lawrus-lang-pl, .lawrus-lang-en' ).length ) return;


    console.log( '[LawRus] reorder: h2miedz=', $h2miedz.length, 'h2tekst=', $h2tekst.length );
        if ( isEn ) {
            $entry.addClass( 'lang-en' );
        }


    if ( $h2miedz.length && $wrapKraj.length ) {
        var $sw = $(
        $h3kraj.detach();
            '<div class="lawrus-lang-switch">' +
        $wrapKraj.detach();
            '<button data-lang="pl"' + ( !isEn ? ' class="active"' : '' ) + '>PL</button>' +
        $h2miedz.before( $h3kraj );
            '<button data-lang="en"' + ( isEn ? ' class="active"' : '' ) + '>EN</button>' +
        $h2miedz.before( $wrapKraj );
            '</div>'
     }
        );
     if ( $h2tekst.length && $wrapMiedz.length ) {
        $entry.prepend( $sw );
        $h3miedz.detach();
 
         $wrapMiedz.detach();
        $sw.on( 'click', 'button', function () {
         $h2tekst.before( $h3miedz );
            var lang = $( this ).data( 'lang' );
        $h2tekst.before( $wrapMiedz );
            var url = new URL( window.location.href );
    }
            if ( lang === 'en' ) {
                url.searchParams.set( 'uselang', 'en' );
            } else {
                url.searchParams.delete( 'uselang' );
            }
            window.location.href = url.toString();
        } );
     } );
}
 
function lawrusInitDrilldownLangSwitch() {
     if ( mw.config.get( 'wgCanonicalSpecialPageName' ) !== 'Drilldown' ) return;
 
    var isEn = ( mw.config.get( 'wgUserLanguage' ) === 'en' );
    var $sw = $(
        '<div class="lawrus-lang-switch" style="margin-bottom:1em;">' +
         '<button data-lang="pl"' + ( !isEn ? ' class="active"' : '' ) + '>PL</button>' +
         '<button data-lang="en"' + ( isEn ? ' class="active"' : '' ) + '>EN</button>' +
        '</div>'
    );
 
    $( '#mw-content-text' ).prepend( $sw );


     // Przesuń blok przycisków (Zapisz/Podgląd/Anuluj) na koniec ich kontenera
     $sw.on( 'click', 'button', function () {
    var $save = $( '#pfForm .oo-ui-buttonInputWidget' ).first();
        var lang = $( this ).data( 'lang' );
    if ( $save.length ) {
         var url = new URL( window.location.href );
         var $block = $save;
        if ( lang === 'en' ) {
        while (
             url.searchParams.set( 'uselang', 'en' );
            $block.parent().length &&
         } else {
            !$block.parent().is( '#pfForm' ) &&
             url.searchParams.delete( 'uselang' );
             !$block.parent().hasClass( 'mw-parser-output' )
         ) {
             $block = $block.parent();
         }
         }
         console.log( '[LawRus] btnBlock:', $block[0].tagName, $block[0].className );
         window.location.href = url.toString();
         $block.parent().append( $block );
    } );
}
 
function lawrusReorderParticipants() {
    /* PageForms wymaga, żeby bloki {{{for template|...|multiple}}} były poza
      głównym szablonem — przez to div#lawrus-uczestnicy-* ląduje na dole
      formularza. Przenosimy je bezpośrednio pod odpowiednie sekcje 3/4.
      Używamy detach()+insertAfter() żeby zachować event-handlery jQuery.
      v2 — wywołanie przez setTimeout(0) gwarantuje uruchomienie po PageForms. */
    var $sec3    = $( '#lawrus-sec3' );
    var $sec4    = $( '#lawrus-sec4' );
    var $krajowa = $( '#lawrus-uczestnicy-krajowa' );
    var $miedz  = $( '#lawrus-uczestnicy-miedz' );
 
    if ( $sec3.length && $krajowa.length ) {
        $krajowa.detach().insertAfter( $sec3 );
    }
    if ( $sec4.length && $miedz.length ) {
         $miedz.detach().insertAfter( $sec4 );
     }
     }
    console.log( '[LawRus] reorder: GOTOWE' );
}
}


Linia 67: Linia 140:


     console.log( '[LawRus] Common.js: document.ready, ns=' + mw.config.get( 'wgNamespaceNumber' ) );
     console.log( '[LawRus] Common.js: document.ready, ns=' + mw.config.get( 'wgNamespaceNumber' ) );
    lawrusInitLangSwitch();
    lawrusInitDrilldownLangSwitch();


     if ( mw.config.get( 'wgUserName' ) ) {
     if ( mw.config.get( 'wgUserName' ) ) {
Linia 72: Linia 148:
     }
     }


     if ( $( 'span.mw-headline[id="Uczestnicy_umowy_krajowej"]' ).length ) {
     if ( $( '#lawrus-uczestnicy-krajowa' ).length ) {
         lawrusReorderParticipants();
         setTimeout( lawrusReorderParticipants, 0 );
     }
     }
    /* Timeouty — pokrywają różne scenariusze async ładowania Cargo/DataTables */
    window.lawrusTruncateAll();
    setTimeout( window.lawrusTruncateAll, 300 );
    setTimeout( window.lawrusTruncateAll, 800 );
    setTimeout( window.lawrusTruncateAll, 2000 );


     /* ── Walidacja przed zapisem (tylko formularz WpisKroniki) ── */
     /* ── Walidacja przed zapisem (tylko formularz WpisKroniki) ── */
Linia 101: Linia 183:
         } );
         } );


         if ( $( '[id^=”input_typ_wpisu_”]:checked' ).length === 0 ) {
         if ( $( '[id^="input_typ_wpisu_"]:checked' ).length === 0 ) {
             missing.push( { id: null, label: 'Typ wpisu' } );
             missing.push( { id: null, label: 'Typ wpisu' } );
         }
         }
Linia 111: Linia 193:
         mw.loader.using( 'mediawiki.notification' ).then( function () {
         mw.loader.using( 'mediawiki.notification' ).then( function () {
             mw.notify(
             mw.notify(
                 'Przy statusie „' + status + 'wymagane są: ' + names + '. Uzupełnij przed zapisem.',
                 'Przy statusie „' + status + '" wymagane są: ' + names + '. Uzupełnij przed zapisem.',
                 { type: 'error', autoHide: false, tag: 'lawrus-validation' }
                 { type: 'error', autoHide: false, tag: 'lawrus-validation' }
             );
             );

Wersja z 13:38, 26 maj 2026

/* ─── LawRus — Common.js ────────────────────────────────────────────────────
   1. Przenoszenie sekcji uczestników pod właściwe sekcje Umów w formularzu.
   2. Walidacja formularza WpisKroniki przed zapisem (status ≥ 4).
   3. Skracanie streszczenia w tabelach Cargo do 100 znaków + rozwiń.
   ───────────────────────────────────────────────────────────────────────────── */

/* ── Skracanie streszczenia ───────────────────────────────────────────────────
   Kolumna streszczenie = zawsze td:nth-child(2) w każdym LawRus cargo query.
   Przypisanie do window.lawrusTruncateAll pozwala wywołać ją z konsoli. */

window.lawrusTruncateAll = function () {
    $( 'table.cargoDynamicTable tbody tr' ).each( function () {
        var $td = $( this ).children( 'td' ).eq( 1 );
        if ( !$td.length )                          { return; }
        if ( $td.find( '.lawrus-short' ).length )   { return; }
        var text = $td.text().replace( /\s+/g, ' ' ).trim();
        if ( text.length <= 100 )                   { return; }
        var e = function ( s ) {
            return s.replace( /&/g, '&amp;' )
                    .replace( /</g,  '&lt;'  )
                    .replace( />/g,  '&gt;'  );
        };
        $td.html(
            '<span class="lawrus-short">' +
                e( text.substring( 0, 100 ) ) +
                '<a href="#" class="lawrus-more" style="color:#3366cc;cursor:pointer;margin-left:2px">&#x2026;</a>' +
            '</span>' +
            '<span class="lawrus-full-wrap" style="display:none">' +
                e( text ) +
                '&#160;<a href="#" class="lawrus-less" style="color:#3366cc;cursor:pointer">&#x2191;</a>' +
            '</span>'
        );
    } );
};

/* draw.dt — każdy redraw DataTables (init, sort, filtr, paginacja) */
$( document ).on( 'draw.dt', window.lawrusTruncateAll );

/* Kliknięcia — delegowane, niezależne od DataTables */
$( document ).on( 'click', '.lawrus-more', function ( e ) {
    e.preventDefault();
    var $td = $( this ).closest( 'td' );
    $td.find( '.lawrus-short' ).hide();
    $td.find( '.lawrus-full-wrap' ).show();
} );
$( document ).on( 'click', '.lawrus-less', function ( e ) {
    e.preventDefault();
    var $td = $( this ).closest( 'td' );
    $td.find( '.lawrus-full-wrap' ).hide();
    $td.find( '.lawrus-short' ).show();
} );

/* window.load — odpala po załadowaniu WSZYSTKICH zasobów strony (DataTables
   na pewno gotowe do tego momentu). */
$( window ).on( 'load', function () {
    window.lawrusTruncateAll();
    setTimeout( window.lawrusTruncateAll, 300 );
} );

function lawrusInitLangSwitch() {
    var $entries = $( '.wpis-kroniki' );
    if ( !$entries.length ) return;

    var isEn = ( mw.config.get( 'wgUserLanguage' ) === 'en' );

    $entries.each( function () {
        var $entry = $( this );
        if ( !$entry.find( '.lawrus-lang-pl, .lawrus-lang-en' ).length ) return;

        if ( isEn ) {
            $entry.addClass( 'lang-en' );
        }

        var $sw = $(
            '<div class="lawrus-lang-switch">' +
            '<button data-lang="pl"' + ( !isEn ? ' class="active"' : '' ) + '>PL</button>' +
            '<button data-lang="en"' + ( isEn ? ' class="active"' : '' ) + '>EN</button>' +
            '</div>'
        );
        $entry.prepend( $sw );

        $sw.on( 'click', 'button', function () {
            var lang = $( this ).data( 'lang' );
            var url = new URL( window.location.href );
            if ( lang === 'en' ) {
                url.searchParams.set( 'uselang', 'en' );
            } else {
                url.searchParams.delete( 'uselang' );
            }
            window.location.href = url.toString();
        } );
    } );
}

function lawrusInitDrilldownLangSwitch() {
    if ( mw.config.get( 'wgCanonicalSpecialPageName' ) !== 'Drilldown' ) return;

    var isEn = ( mw.config.get( 'wgUserLanguage' ) === 'en' );
    var $sw = $(
        '<div class="lawrus-lang-switch" style="margin-bottom:1em;">' +
        '<button data-lang="pl"' + ( !isEn ? ' class="active"' : '' ) + '>PL</button>' +
        '<button data-lang="en"' + ( isEn ? ' class="active"' : '' ) + '>EN</button>' +
        '</div>'
    );

    $( '#mw-content-text' ).prepend( $sw );

    $sw.on( 'click', 'button', function () {
        var lang = $( this ).data( 'lang' );
        var url = new URL( window.location.href );
        if ( lang === 'en' ) {
            url.searchParams.set( 'uselang', 'en' );
        } else {
            url.searchParams.delete( 'uselang' );
        }
        window.location.href = url.toString();
    } );
}

function lawrusReorderParticipants() {
    /* PageForms wymaga, żeby bloki {{{for template|...|multiple}}} były poza
       głównym szablonem — przez to div#lawrus-uczestnicy-* ląduje na dole
       formularza. Przenosimy je bezpośrednio pod odpowiednie sekcje 3/4.
       Używamy detach()+insertAfter() żeby zachować event-handlery jQuery.
       v2 — wywołanie przez setTimeout(0) gwarantuje uruchomienie po PageForms. */
    var $sec3    = $( '#lawrus-sec3' );
    var $sec4    = $( '#lawrus-sec4' );
    var $krajowa = $( '#lawrus-uczestnicy-krajowa' );
    var $miedz   = $( '#lawrus-uczestnicy-miedz' );

    if ( $sec3.length && $krajowa.length ) {
        $krajowa.detach().insertAfter( $sec3 );
    }
    if ( $sec4.length && $miedz.length ) {
        $miedz.detach().insertAfter( $sec4 );
    }
}

$( function () {

    console.log( '[LawRus] Common.js: document.ready, ns=' + mw.config.get( 'wgNamespaceNumber' ) );

    lawrusInitLangSwitch();
    lawrusInitDrilldownLangSwitch();

    if ( mw.config.get( 'wgUserName' ) ) {
        $( 'body' ).addClass( 'lawrus-zalogowany' );
    }

    if ( $( '#lawrus-uczestnicy-krajowa' ).length ) {
        setTimeout( lawrusReorderParticipants, 0 );
    }

    /* Timeouty — pokrywają różne scenariusze async ładowania Cargo/DataTables */
    window.lawrusTruncateAll();
    setTimeout( window.lawrusTruncateAll, 300 );
    setTimeout( window.lawrusTruncateAll, 800 );
    setTimeout( window.lawrusTruncateAll, 2000 );

    /* ── Walidacja przed zapisem (tylko formularz WpisKroniki) ── */
    var $form = $( '#pfForm' );
    if ( !$form.length ) return;

    var REQUIRED_AT_4 = [
        { id: 'input_datacja_rok_lacinski', label: 'Rok AD'          },
        { id: 'input_jezyk_oryginalu',      label: 'Język oryginału'  },
        { id: 'input_kraj',                 label: 'Kraj'             },
        { id: 'input_tekst_zrodlowy',       label: 'Tekst źródłowy'  },
        { id: 'input_bibliografia',         label: 'Bibliografia'     },
        { id: 'input_streszczenie_pl',      label: 'Streszczenie PL'  },
        { id: 'input_streszczenie_en',      label: 'Streszczenie EN'  },
        { id: 'input_tlumaczenie_pl',       label: 'Tłumaczenie PL'  },
        { id: 'input_tlumaczenie_en',       label: 'Tłumaczenie EN'  }
    ];
    var HIGH_STATUS = [ '4-do-publikacji', '5-opublikowane' ];

    $form.on( 'submit', function ( e ) {
        var status = $( '#input_status_wpisu' ).val() || '';
        if ( HIGH_STATUS.indexOf( status ) === -1 ) return;

        var missing = REQUIRED_AT_4.filter( function ( f ) {
            return ( $( '#' + f.id ).val() || '' ).trim() === '';
        } );

        if ( $( '[id^="input_typ_wpisu_"]:checked' ).length === 0 ) {
            missing.push( { id: null, label: 'Typ wpisu' } );
        }

        if ( missing.length === 0 ) return;

        e.preventDefault();
        var names = missing.map( function ( f ) { return f.label; } ).join( ', ' );
        mw.loader.using( 'mediawiki.notification' ).then( function () {
            mw.notify(
                'Przy statusie „' + status + '" wymagane są: ' + names + '. Uzupełnij przed zapisem.',
                { type: 'error', autoHide: false, tag: 'lawrus-validation' }
            );
        } );
        missing.forEach( function ( f ) {
            if ( f.id ) { $( '#' + f.id ).css( 'border-color', '#d33' ); }
        } );
        missing.forEach( function ( f ) {
            if ( f.id ) {
                $( '#' + f.id ).one( 'input', function () {
                    $( this ).css( 'border-color', '' );
                } );
            }
        } );
    } );

} );