User:BZPN/MassRollback2.js: Difference between revisions

From Test Wiki
Content deleted Content added
BZPN (talk | contribs)
No edit summary
BZPN (talk | contribs)
No edit summary
Line 15: Line 15:
createUI: function() {
createUI: function() {
const $container = $(`
const $container = $(`
<div id="mass-rollback-container" style="border: 1px solid #ccc; padding: 15px; margin-bottom: 20px; border-radius: 4px; background: #f9f9f9; display: none;">
<div id="mass-rollback-container" class="mw-portlet" style="display:none;">
<h3 style="margin-top: 0;">Mass Rollback Tool</h3>
<h3 class="mw-headline" style="margin-top:0;">Mass rollback tool</h3>

<div id="stats-section" style="margin-bottom: 15px;">
<div id="stats-section" class="mw-message-box mw-message-box-notice" style="margin-bottom:1em;">
<h4>User statistics</h4>
<h4 class="oo-ui-labelElement-label" style="margin:0 0 .5em 0;">User statistics</h4>
<p>Total edits: <strong id="total-edits">-</strong></p>
<p>Edits: <strong id="total-edits">-</strong></p>
<p>First edit: <span id="first-edit">-</span></p>
<p>First edit: <span id="first-edit">-</span></p>
<p>Latest edit: <span id="last-edit">-</span> <button id="refresh-stats" style="padding: 3px 8px; background-color: #aaa; color: #fff; border: none; border-radius: 3px; cursor: pointer;">Refresh</button></p>
<p>Recent edit: <span id="last-edit">-</span> <button id="refresh-stats" class="oo-ui-buttonElement-button oo-ui-buttonElement-framed oo-ui-flaggedElement-progressive">Refresh</button></p>
</div>
</div>

<hr style="margin: 15px 0;">
<div id="filters-section" class="mw-portlet-body" style="margin-bottom:1em;">
<h4 class="oo-ui-labelElement-label">Filter edits</h4>
<div id="filters-section" style="margin-bottom: 15px;">
<div class="mw-input" style="margin-bottom:.5em;">
<h4>Filter Edits</h4>
<label class="mw-label" style="margin-right:.5em;">Date from:</label>
<div style="margin-bottom: 10px;">
<input type="date" id="start-date" class="oo-ui-inputWidget-input">
<label style="margin-right: 5px;">Date From:</label>
<label class="mw-label" style="margin:0 .5em;">to:</label>
<input type="date" id="start-date" style="padding: 4px;">
<input type="date" id="end-date" class="oo-ui-inputWidget-input">
<label style="margin: 0 5px;">To:</label>
<input type="date" id="end-date" style="padding: 4px;">
</div>
</div>
<div style="margin-bottom: 10px;">
<div class="mw-input" style="margin-bottom:.5em;">
<label style="margin-right: 5px;">Namespace:</label>
<label class="mw-label" style="margin-right:.5em;">Namespace:</label>
<select id="namespace-filter" multiple style="padding: 4px; min-width: 150px;">
<select id="namespace-filter" multiple class="oo-ui-inputWidget-input" style="min-width:150px;">
<option value="all">All</option>
<option value="all">All</option>
<option value="0">Main</option>
<option value="0">Main</option>
Line 59: Line 57:
</select>
</select>
</div>
</div>
<div style="margin-bottom: 10px;">
<div class="mw-input" style="margin-bottom:.5em;">
<label style="margin-right: 5px;">Edit Size:</label>
<label class="mw-label" style="margin-right:.5em;">Edit size:</label>
<select id="size-filter" style="padding: 4px;">
<select id="size-filter" class="oo-ui-inputWidget-input">
<option value="">Any</option>
<option value="">Any</option>
<option value="small">Small (&lt; 50 bytes)</option>
<option value="small">Small (&lt; 50 bytes)</option>
Line 68: Line 66:
</select>
</select>
</div>
</div>
<div style="margin-bottom: 10px;">
<div class="mw-input" style="margin-bottom:.5em;">
<label style="margin-right: 5px;">Sort Order:</label>
<label class="mw-label" style="margin-right:.5em;">Sort order:</label>
<select id="sort-order" style="padding: 4px;">
<select id="sort-order" class="oo-ui-inputWidget-input">
<option value="desc">Latest first</option>
<option value="desc">Latest first</option>
<option value="asc">Oldest first</option>
<option value="asc">Oldest first</option>
</select>
</select>
</div>
</div>
<div style="margin-bottom: 10px;">
<div class="mw-input" style="margin-bottom:.5em;">
<button id="clear-filters" style="padding: 5px 10px; background-color: #aaa; color: #fff; border: none; border-radius: 3px; cursor: pointer;">Clear filters</button>
<button id="clear-filters" class="oo-ui-buttonElement-button oo-ui-buttonElement-framed">Clear filters</button>
<button id="show-filtered" style="padding: 5px 10px; background-color: #007bff; color: #fff; border: none; border-radius: 3px; cursor: pointer; margin-left: 5px;">Show filtered edits</button>
<button id="show-filtered" class="oo-ui-buttonElement-button oo-ui-buttonElement-framed oo-ui-flaggedElement-progressive" style="margin-left:.5em;">Show filtered edits</button>
</div>
</div>
</div>
</div>

<hr style="margin: 15px 0;">
<div id="reason-section" class="mw-portlet-body" style="margin-bottom:1em;">
<h4 class="oo-ui-labelElement-label">Rollback reason</h4>
<div id="reason-section" style="margin-bottom: 15px;">
<select id="rollback-reason" class="oo-ui-inputWidget-input">
<h4>Rollback reason</h4>
<select id="rollback-reason" style="padding: 4px;">
<option value=""></option>
<option value=""></option>
<option value="vandalism">Vandalism</option>
<option value="vandalism">Vandalism</option>
Line 94: Line 90:
<option value="other">Other</option>
<option value="other">Other</option>
</select>
</select>
<input type="text" id="custom-reason" placeholder="Enter custom reason" style="display:none; padding: 4px; margin-top: 10px; width: 100%;">
<input type="text" id="custom-reason" placeholder="Enter custom reason" class="oo-ui-inputWidget-input" style="display:none; margin-top:.5em; width:100%;">
</div>
</div>

<div id="actions-section" style="text-align: center;">
<div id="actions-section" class="mw-portlet-body" style="text-align:center;">
<button id="rollback-selected" style="padding: 5px 10px; background-color: #007bff; color: #fff; border: none; border-radius: 3px; cursor: pointer; margin-right: 5px;">Rollback selected</button>
<button id="rollback-selected" class="oo-ui-buttonElement-button oo-ui-buttonElement-framed oo-ui-flaggedElement-progressive" style="margin-right:.5em;">Rollback selected</button>
<button id="rollback-all" style="padding: 5px 10px; background-color: #ff4136; color: #fff; border: none; border-radius: 3px; cursor: pointer;">Rollback all</button>
<button id="rollback-all" class="oo-ui-buttonElement-button oo-ui-buttonElement-framed oo-ui-flaggedElement-destructive">Rollback all</button>
</div>
</div>
</div>
</div>

<div id="filtered-edits-container" style="display:none; border: 1px solid #ccc; padding: 15px; margin-bottom:20px; border-radius: 4px; background: #f9f9f9;">
<div id="filtered-edits-container" class="mw-portlet" style="display:none;">
<h4>Filtered edits</h4>
<h4 class="oo-ui-labelElement-label">Filtered edits</h4>
<div style="margin-bottom: 10px;">
<div class="mw-input" style="margin-bottom:.5em;">
<input type="checkbox" id="select-all"> <label for="select-all">Select All</label>
<input type="checkbox" id="select-all"> <label for="select-all">Select all</label>
</div>
</div>
<table id="filtered-edits-table" style="width: 100%; border-collapse: collapse;">
<table id="filtered-edits-table" class="wikitable" style="width:100%;">
<thead>
<thead>
<tr style="background: #e9e9e9;">
<tr>
<th style="padding: 5px; border: 1px solid #ccc;">Revid</th>
<th>Revid</th>
<th style="padding: 5px; border: 1px solid #ccc;">Title</th>
<th>Title</th>
<th style="padding: 5px; border: 1px solid #ccc;">Timestamp</th>
<th>Timestamp</th>
<th style="padding: 5px; border: 1px solid #ccc;">Namespace</th>
<th>Namespace</th>
<th style="padding: 5px; border: 1px solid #ccc;">Size</th>
<th>Size</th>
<th style="padding: 5px; border: 1px solid #ccc;">Select</th>
<th>Select</th>
</tr>
</tr>
</thead>
</thead>
Line 123: Line 119:
</tbody>
</tbody>
</table>
</table>
<div style="text-align: center; margin-top: 10px;">
<div style="text-align:center; margin-top:.5em;">
<button id="rollback-selected-filtered" style="padding: 5px 10px; background-color: #007bff; color: #fff; border: none; border-radius: 3px; cursor: pointer;">Rollback selected filtered edits</button>
<button id="rollback-selected-filtered" class="oo-ui-buttonElement-button oo-ui-buttonElement-framed oo-ui-flaggedElement-progressive">Rollback selected filtered edits</button>
</div>
</div>
</div>
</div>
`);
`);

const $toggleButton = $(`
const $toggleButton = $(`
<button id="mass-rollback-toggle" style="padding: 5px 10px; margin-bottom: 10px; background-color: #007bff; color: #fff; border: none; border-radius: 3px; cursor: pointer;">
<button id="mass-rollback-toggle" class="oo-ui-buttonElement-button oo-ui-buttonElement-framed oo-ui-flaggedElement-progressive" style="margin-bottom:.75em;">
Show/Hide MassRollback
Show/hide MassRollback
</button>
</button>
`);
`);
Line 187: Line 183:
const userName = mw.config.get('wgRelevantUserName');
const userName = mw.config.get('wgRelevantUserName');
const api = new mw.Api();
const api = new mw.Api();

api.get({
// Poprawne pobieranie liczby edycji i pierwszej/ostatniej edycji
const editCountReq = api.get({
action: 'query',
list: 'users',
ususers: userName,
usprop: 'editcount'
});
const firstEditReq = api.get({
action: 'query',
action: 'query',
list: 'usercontribs',
list: 'usercontribs',
ucuser: userName,
ucuser: userName,
uclimit: 'max',
uclimit: 1,
ucdir: 'newer',
ucprop: 'timestamp'
ucprop: 'timestamp'
}).done(function(data) {
});
const contributions = data.query.usercontribs;
const lastEditReq = api.get({
$('#total-edits').text(contributions.length);
action: 'query',
if (contributions.length > 0) {
list: 'usercontribs',
ucuser: userName,
const timestamps = contributions.map(c => new Date(c.timestamp)).sort((a, b) => a - b);
uclimit: 1,
$('#first-edit').text(timestamps[0].toLocaleDateString());
ucdir: 'older',
$('#last-edit').text(timestamps[timestamps.length - 1].toLocaleDateString());
ucprop: 'timestamp'
});

$.when(editCountReq, firstEditReq, lastEditReq).done(function(editCountData, firstData, lastData) {
try {
const editcount = editCountData[0].query.users[0].editcount;
$('#total-edits').text(editcount != null ? editcount : '-');
} catch (e) {
$('#total-edits').text('-');
}
try {
const firstList = firstData[0].query.usercontribs || [];
$('#first-edit').text(firstList.length ? new Date(firstList[0].timestamp).toLocaleDateString() : '-');
} catch (e) {
$('#first-edit').text('-');
}
try {
const lastList = lastData[0].query.usercontribs || [];
$('#last-edit').text(lastList.length ? new Date(lastList[0].timestamp).toLocaleDateString() : '-');
} catch (e) {
$('#last-edit').text('-');
}
}
}).fail(function() {
$('#total-edits').text('-');
$('#first-edit').text('-');
$('#last-edit').text('-');
});
});
},
},
Line 462: Line 492:
};
};


mw.loader.using([
$(document).ready(function() {
MassRollback.init();
'oojs-ui-core',
'oojs-ui-widgets',
'oojs-ui-core.styles',
'oojs-ui.styles.icons-interactions',
'mediawiki.api',
'mediawiki.util',
'mediawiki.notify'
]).then(function () {
$(function () {
MassRollback.init();
});
});
});
})(jQuery, mediaWiki);
})(jQuery, mediaWiki);