MediaWiki:CustomItemTracker.js: Difference between revisions

From Roat Pkz
Jump to navigation Jump to search
No edit summary
No edit summary
Line 6: Line 6:


     if (!container) return;
     if (!container) return;
    const infoBox =
        document.getElementById(
            "customItemTrackerInfo"
        );




Line 24: Line 18:


     let trackerData = {
     let trackerData = {
         items:[],
         items: [],
         completed:{}
         completed: {}
     };
     };




     function loadData(){
 
    // Load tracker JSON
     function loadData() {


         $.getJSON(
         $.getJSON(
             mw.util.wikiScript('api'),
             mw.util.wikiScript('api'),
             {
             {
                 action:'query',
                 action: 'query',
                 titles:'Module:CustomItemTracker/data.json',
                 titles: 'Module:CustomItemTracker/data.json',
                 prop:'revisions',
                 prop: 'revisions',
                 rvprop:'content',
                 rvprop: 'content',
                 format:'json',
                 format: 'json',
                 formatversion:2
                 formatversion: 2
 
             }
             }


         ).done(function(data){
         ).done(function(data) {




             let page =
             const page =
            data.query.pages[0];
                data.query.pages[0];




             if(!page.revisions)
             if (!page.revisions)
                 return;
                 return;




             trackerData =
             try {
            JSON.parse(
 
                page.revisions[0].content
                trackerData =
             );
                    JSON.parse(
                        page.revisions[0].content
                    );
 
 
                render();
 
 
             } catch(e) {


                console.error(
                    "Failed loading tracker JSON",
                    e
                );


             render();
             }




Line 69: Line 76:




    function render(){




         container.innerHTML="";
    // Render tracker
    function render() {
 
 
         container.innerHTML = "";
 




         let completed =
         const completed =
        Object.keys(
            Object.keys(
             trackerData.completed
                trackerData.completed
        ).length;
             ).filter(
                key => trackerData.completed[key]
            ).length;




        let total =
        trackerData.items.length;


        const total =
            trackerData.items.length;




        let progress =
        document.createElement("div");


        const progress =
            document.createElement("div");


        progress.className=
        "trackerProgress";


        progress.className =
            "trackerProgress";


         progress.innerHTML=
 
         progress.innerHTML =
         `
         `
         Completed:
         Completed:
         <strong>${completed}/${total}</strong>
         <strong>${completed}/${total}</strong>
         (${Math.floor((completed/total)*100)}%)
         (${total ? Math.floor((completed / total) * 100) : 0}%)
         `;
         `;


Line 106: Line 120:




         let grid =
         const grid =
        document.createElement("div");
            document.createElement("div");




         grid.className=
         grid.className =
        "trackerGrid";
            "trackerGrid";




         container.appendChild(grid);
         container.appendChild(grid);






         trackerData.items.forEach(
         trackerData.items.forEach(
         function(item,index){
         function(item,index) {




             let tile =
             const tile =
            document.createElement("div");
                document.createElement("div");
 


            tile.className =
                "trackerTile";


            tile.className=
            "trackerTile";




             if(
             if(
            trackerData.completed[index]
                trackerData.completed[index]
             )
             ) {
            {
 
                 tile.classList.add(
                 tile.classList.add(
                     "completed"
                     "completed"
                 );
                 );
             }
             }






             tile.innerHTML=
             const image =
             `
                document.createElement("div");
             <div class="itemImage">
 
             </div>
 
            image.className =
                "itemImage";
 
 
             tile.appendChild(image);
 
 
 
 
             const name =
                document.createElement("div");
 
 
            name.className =
                "itemName";
 
 
             name.textContent =
                item.name;
 
 
            tile.appendChild(name);
 
 
 


             <div class="itemName">
             loadImage(
            ${item.name}
                item.name,
            </div>
                image
             `;
             );






            tile.onclick=function(){




                showInfo(item);
            tile.onclick = function() {




                // View only for everyone else
                 if(
                 if(
                !allowedUsers.includes(
                    !allowedUsers.includes(
                    currentUser
                        currentUser
                ))
                    )
                 {
                 ) {
 
                     return;
                     return;
                 }
                 }




                 trackerData.completed[index]
                 trackerData.completed[index]
                =
                    =
                 !trackerData.completed[index];
                 !trackerData.completed[index];




Line 183: Line 230:




        });


            getImage(
                item.name,
                tile.querySelector(".itemImage")
            );


    }


        });




    }








    // Get wiki item image
    function loadImage(
        itemName,
        target
    ) {


    function getImage(name,target){


        const template =
            "{{plinkp|" +
            itemName +
            "}}";


        let text =
        "{{plinkp|" +
        name +
        "}}";




         $.getJSON(
         $.getJSON(
        "/api.php",
            "/api.php",
        {
            {
            action:"parse",
                action: "parse",
            text:text,
                text: template,
            format:"json"
                format: "json"
        })
            }


         .done(function(data){
         ).done(function(data) {




             if(!data.parse)
             if(
                !data.parse
            )
                 return;
                 return;




             let div =
 
            document.createElement("div");
             const wrapper =
                document.createElement("div");
 
 
            wrapper.innerHTML =
                data.parse.text["*"];
 




             div.innerHTML =
             const img =
            data.parse.text["*"];
                wrapper.querySelector("img");




            let img =
            div.querySelector("img");


            if(img) {


if(img)
{
    img.style.width = "50px";
    img.style.height = "50px";
    img.style.objectFit = "contain";
    img.style.display = "block";
    img.style.margin = "0 auto";


    target.appendChild(img);
                img.style.maxWidth =
}
                    "50px";




        });
                img.style.maxHeight =
                    "50px";




    }
                img.style.width =
                    "auto";




                img.style.height =
                    "auto";




                img.style.objectFit =
                    "contain";


    function showInfo(item){




        infoBox.innerHTML=
                target.appendChild(img);
        `
        <h3>${item.name}</h3>


        <b>Category:</b>
            }
        ${item.category}


        <br><br>


         ${item.info.replaceAll(
         });
            "%%",
            "<br>"
        )}


        `;


     }
     }
Line 280: Line 324:




     function saveData(){
 
 
 
    // Save changes
     function saveData() {




         $.post(
         $.post(
        mw.util.wikiScript('api'),
            mw.util.wikiScript('api'),
        {
            {
 
                action: 'edit',
 
                title:
                'Module:CustomItemTracker/data.json',
 


            action:'edit',
                token:
                mw.user.tokens.get(
                    'csrfToken'
                ),


            title:
            'Module:CustomItemTracker/data.json',


            token:
                format: 'json',
            mw.user.tokens.get(
                'csrfToken'
            ),


            format:'json',


            text:
                text:
            JSON.stringify(
                JSON.stringify(
                trackerData,
                    trackerData,
                null,
                    null,
                 4
                    4
             )
                 )
 
             }


         })
         ).done(function() {


        .done(function(){


             render();
             render();
            console.log(
                "Tracker updated"
            );


         });
         });
Line 316: Line 374:


     }
     }





Revision as of 15:48, 30 July 2026

mw.hook('wikipage.content').add(function () {

    const container = document.getElementById(
        "customItemTracker"
    );

    if (!container) return;


    const allowedUsers = [
        "Hefner"
    ];


    const currentUser =
        mw.config.get('wgUserName');


    let trackerData = {
        items: [],
        completed: {}
    };



    // Load tracker JSON
    function loadData() {

        $.getJSON(
            mw.util.wikiScript('api'),
            {
                action: 'query',
                titles: 'Module:CustomItemTracker/data.json',
                prop: 'revisions',
                rvprop: 'content',
                format: 'json',
                formatversion: 2
            }

        ).done(function(data) {


            const page =
                data.query.pages[0];


            if (!page.revisions)
                return;


            try {

                trackerData =
                    JSON.parse(
                        page.revisions[0].content
                    );


                render();


            } catch(e) {

                console.error(
                    "Failed loading tracker JSON",
                    e
                );

            }


        });

    }





    // Render tracker
    function render() {


        container.innerHTML = "";



        const completed =
            Object.keys(
                trackerData.completed
            ).filter(
                key => trackerData.completed[key]
            ).length;



        const total =
            trackerData.items.length;



        const progress =
            document.createElement("div");


        progress.className =
            "trackerProgress";


        progress.innerHTML =
        `
        Completed:
        <strong>${completed}/${total}</strong>
        (${total ? Math.floor((completed / total) * 100) : 0}%)
        `;


        container.appendChild(progress);



        const grid =
            document.createElement("div");


        grid.className =
            "trackerGrid";


        container.appendChild(grid);





        trackerData.items.forEach(
        function(item,index) {


            const tile =
                document.createElement("div");


            tile.className =
                "trackerTile";



            if(
                trackerData.completed[index]
            ) {

                tile.classList.add(
                    "completed"
                );

            }



            const image =
                document.createElement("div");


            image.className =
                "itemImage";


            tile.appendChild(image);




            const name =
                document.createElement("div");


            name.className =
                "itemName";


            name.textContent =
                item.name;


            tile.appendChild(name);




            loadImage(
                item.name,
                image
            );





            tile.onclick = function() {


                // View only for everyone else
                if(
                    !allowedUsers.includes(
                        currentUser
                    )
                ) {

                    return;

                }



                trackerData.completed[index]
                    =
                !trackerData.completed[index];



                saveData();


            };



            grid.appendChild(tile);


        });


    }







    // Get wiki item image
    function loadImage(
        itemName,
        target
    ) {


        const template =
            "{{plinkp|" +
            itemName +
            "}}";



        $.getJSON(
            "/api.php",
            {
                action: "parse",
                text: template,
                format: "json"
            }

        ).done(function(data) {


            if(
                !data.parse
            )
                return;



            const wrapper =
                document.createElement("div");


            wrapper.innerHTML =
                data.parse.text["*"];



            const img =
                wrapper.querySelector("img");



            if(img) {


                img.style.maxWidth =
                    "50px";


                img.style.maxHeight =
                    "50px";


                img.style.width =
                    "auto";


                img.style.height =
                    "auto";


                img.style.objectFit =
                    "contain";



                target.appendChild(img);

            }


        });


    }







    // Save changes
    function saveData() {


        $.post(
            mw.util.wikiScript('api'),
            {

                action: 'edit',

                title:
                'Module:CustomItemTracker/data.json',


                token:
                mw.user.tokens.get(
                    'csrfToken'
                ),


                format: 'json',


                text:
                JSON.stringify(
                    trackerData,
                    null,
                    4
                )

            }

        ).done(function() {


            render();


            console.log(
                "Tracker updated"
            );


        });


    }






    loadData();


});