MediaWiki:CustomItemTracker.js: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 6: | Line 6: | ||
if (!container) return; | if (!container) return; | ||
| 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) { | ||
const page = | |||
data.query.pages[0]; | |||
if(!page.revisions) | if (!page.revisions) | ||
return; | return; | ||
trackerData = | try { | ||
trackerData = | |||
) | JSON.parse( | ||
page.revisions[0].content | |||
); | |||
render(); | |||
} catch(e) { | |||
console.error( | |||
"Failed loading tracker JSON", | |||
e | |||
); | |||
} | |||
| Line 69: | Line 76: | ||
container.innerHTML=""; | // Render tracker | ||
function render() { | |||
container.innerHTML = ""; | |||
const completed = | |||
Object.keys( | |||
trackerData.completed | trackerData.completed | ||
).filter( | |||
key => trackerData.completed[key] | |||
).length; | |||
const total = | |||
trackerData.items.length; | |||
const progress = | |||
document.createElement("div"); | |||
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: | ||
const grid = | |||
document.createElement("div"); | |||
grid.className= | grid.className = | ||
"trackerGrid"; | |||
container.appendChild(grid); | container.appendChild(grid); | ||
trackerData.items.forEach( | trackerData.items.forEach( | ||
function(item,index){ | function(item,index) { | ||
const tile = | |||
document.createElement("div"); | |||
tile.className = | |||
"trackerTile"; | |||
if( | if( | ||
trackerData.completed[index] | |||
) | ) { | ||
tile.classList.add( | tile.classList.add( | ||
"completed" | "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( | if( | ||
!allowedUsers.includes( | |||
currentUser | |||
) | |||
{ | ) { | ||
return; | return; | ||
} | } | ||
trackerData.completed[index] | trackerData.completed[index] | ||
= | |||
!trackerData.completed[index]; | !trackerData.completed[index]; | ||
| Line 183: | Line 230: | ||
}); | |||
} | |||
// Get wiki item image | |||
function loadImage( | |||
itemName, | |||
target | |||
) { | |||
const template = | |||
"{{plinkp|" + | |||
itemName + | |||
"}}"; | |||
$.getJSON( | $.getJSON( | ||
"/api.php", | |||
{ | |||
action: "parse", | |||
text: template, | |||
format: "json" | |||
} | |||
.done(function(data){ | ).done(function(data) { | ||
if(!data.parse) | if( | ||
!data.parse | |||
) | |||
return; | 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); | |||
} | |||
}); | |||
} | } | ||
| Line 280: | Line 324: | ||
function saveData(){ | |||
// Save changes | |||
function saveData() { | |||
$.post( | $.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(); | 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();
});