User:Chlod/Scripts/Deputy.js: Difference between revisions

Content deleted Content added
also do z-index
[6260a672] v0.1.1, cci: fix session close when all sections closed
Line 955:
isContributionSurveyHeading(el) {
// All headings (h1, h2, h3, h4, h5, h6)
// TODO: l10n
const headlineElement = this.parsoid ? el : el.querySelector('.mw-headline');
return /^H\d$/.test(el.tagName) &&
Line 993 ⟶ 994:
else {
return Array.from(this.document.querySelectorAll(
// All headings (`h1, h2, h3, h4, h5, h6`)
[1, 2, 3, 4, 5, 6]
.map((i) => `.mw-parser-output h${i}`)
Line 1,348 ⟶ 1,349:
// The row has been found but the added text is no longer in the existing revision
ContributionSurveyRowStatus[ContributionSurveyRowStatus["Missing"] = 4] = "Missing";
// The row has been processed and text was presumptively removed ({{x}}),
ContributionSurveyRowStatus[ContributionSurveyRowStatus["PresumptiveRemoval"] = 5] = "PresumptiveRemoval";
})(ContributionSurveyRowStatus || (ContributionSurveyRowStatus = {}));
/**
Line 1,517 ⟶ 1,520:
[ContributionSurveyRowStatus.WithViolations]: /\{\{(aye|y)}}/gi,
[ContributionSurveyRowStatus.WithoutViolations]: /\{\{n(ay)?}}/gi,
[ContributionSurveyRowStatus.Missing]: /\{\{\?}}/gi,
[ContributionSurveyRowStatus.PresumptiveRemoval]: /\{\{x}}/gi
};
 
Line 1,530 ⟶ 1,534:
h_1("span", { class: "dp-loadingDots-2" }),
h_1("span", { class: "dp-loadingDots-3" }));
}
 
/**
* Gets the URL of a permanent link page.
*
* @param revid The revision ID to link to
* @param page The title of the page to compare to
* @param includeCurrentParams `true` if the current query parameters should be included
* @return The URL of the diff page
*/
function getRevisionURL (revid, page, includeCurrentParams = false) {
const url = new URL(window.___location.href);
url.pathname = mw.util.wikiScript('index');
const searchParams = url.searchParams;
if (!includeCurrentParams) {
for (const key of Array.from(searchParams.keys())) {
searchParams.delete(key);
}
}
searchParams.set('title', normalizeTitle(page).getPrefixedText());
searchParams.set('oldid', `${revid}`);
url.search = '?' + searchParams.toString();
url.hash = '';
return url.toString();
}
 
Line 1,576 ⟶ 1,604:
 
/**
* @param root0
* Gets the URL of a permanent link page.
* @param root0.revid
* @param revid The revision ID to link toroot0.parentid
* @return HTML element
* @param page The title of the page to compare to
* @param includeCurrentParams `true` if the current query parameters should be included
* @return The URL of the diff page
*/
function getRevisionURLChangesListLinks({ (revid, page, includeCurrentParams =parentid false}) {
return h_1("span", { class: "mw-changeslist-links" },
const url = new URL(window.___location.href);
h_1("span", null,
url.pathname = mw.util.wikiScript('index');
h_1("a", { rel: "noopener", href: getRevisionDiffURL(revid, 0), title: mw.msg('deputy.session.revision.cur.tooltip'), target: "_blank" }, mw.msg('deputy.session.revision.cur'))),
const searchParams = url.searchParams;
if h_1("span", null, !includeCurrentParams)parentid {?
for (const key of Arraymw.frommsg(searchParams'deputy.keys())session.revision.prev') {:
searchParams.deleteh_1(key);"a", { rel: "noopener", href: !parentid ?
} null :
getRevisionDiffURL(parentid, revid), title: mw.msg('deputy.session.revision.prev.tooltip'), target: "_blank" }, mw.msg('deputy.session.revision.prev'))));
}
/**
* @return HTML element
*/
function NewPageIndicator() {
return h_1("abbr", { class: "newpage", title: mw.msg('deputy.session.revision.new.tooltip') }, mw.msg('deputy.session.revision.new'));
}
/**
* @param root0
* @param root0.timestamp
* @return HTML element
*/
function ChangesListTime({ timestamp }) {
const time = new Date(timestamp);
const formattedTime = time.toLocaleTimeString(window.deputyLang, {
hourCycle: 'h24',
timeStyle: mw.user.options.get('date') === 'ISO 8601' ? 'long' : 'short'
});
return h_1("span", { class: "mw-changeslist-time" }, formattedTime);
}
/**
* @param root0
* @param root0.revision
* @return HTML element
*/
function ChangesListDate({ revision }) {
const time = new Date(revision.timestamp);
let now = window.moment(time);
if (window.deputy.config.cci.forceUtc.get()) {
now = now.utc();
}
const formattedTime = time.toLocaleTimeString(window.deputyLang, {
searchParams.set('title', normalizeTitle(page).getPrefixedText());
searchParams.set( hourCycle: 'oldidh24', `${revid}`);
timeStyle: mw.user.options.get('date') === 'ISO 8601' ? 'long' : 'short'
url.search = '?' + searchParams.toString();
url.hash = ''});
const formattedDate = now.locale(window.deputyLang).format({
return url.toString();
dmy: 'D MMMM YYYY',
mdy: 'MMMM D, Y',
ymd: 'YYYY MMMM D',
'ISO 8601': 'YYYY:MM:DD[T]HH:mm:SS'
}[mw.user.options.get('date')]);
const comma = mw.msg('comma-separator');
return h_1("a", { class: "mw-changeslist-date", href: getRevisionURL(revision.revid, revision.page.title) },
formattedTime,
comma,
formattedDate);
}
/**
* @param root0
* @param root0.user
* @return HTML element
*/
function ChangesListUser({ user }) {
const userPage = new mw.Title(user, nsId('user'));
const userTalkPage = new mw.Title(user, nsId('user_talk'));
const userContribsPage = new mw.Title('Special:Contributions/' + user);
return h_1("span", { class: "history-user" },
h_1("a", { class: "mw-userlink", target: "_blank", rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), userPage.getPrefixedDb()), title: userPage.getPrefixedText() }, userPage.getPrefixedText()),
" ",
h_1("span", { class: "mw-usertoollinks mw-changeslist-links" },
h_1("span", null,
h_1("a", { class: "mw-usertoollinks-talk", target: "_blank", rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), userTalkPage.getPrefixedDb()), title: userTalkPage.getPrefixedText() }, mw.msg('deputy.session.revision.talk'))),
" ",
h_1("span", null,
h_1("a", { class: "mw-usertoollinks-contribs", target: "_blank", rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), userContribsPage.getPrefixedDb()), title: userContribsPage.getPrefixedText() }, mw.msg('deputy.session.revision.contribs')))));
}
/**
* @param root0
* @param root0.size
* @return HTML element
*/
function ChangesListBytes({ size }) {
return h_1("span", { class: "history-size mw-diff-bytes", "data-mw-bytes": size }, mw.message('deputy.session.revision.bytes', size.toString()).text());
}
/**
* @param root0
* @param root0.diffsize
* @param root0.size
* @return HTML element
*/
function ChangesListDiff({ diffsize, size }) {
const DiffTag = (Math.abs(diffsize) > 500 ?
'strong' :
'span');
return h_1(DiffTag, { class: `mw-plusminus-${diffsize === 0 ? 'null' :
(diffsize > 0 ? 'pos' : 'neg')} mw-diff-bytes`, title: mw.message('deputy.session.revision.byteChange', size.toString()).text() }, mw.message(`deputy.${diffsize < 0 ? 'negative' : 'positive'}Diff`, diffsize.toString()).text());
}
/**
* @param root0
* @param root0.tags
* @return HTML element
*/
function ChangesListTags({ tags }) {
return h_1("span", { class: "mw-tag-markers" },
h_1("a", { rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), 'Special:Tags'), title: "Special:Tags", target: "_blank" }, mw.message('deputy.session.revision.tags', tags.length.toString()).text()),
tags.map((v) => {
// eslint-disable-next-line mediawiki/msg-doc
const tagMessage = mw.message(`tag-${v}`).parse();
return tagMessage !== '-' && h_1("span", { class: `mw-tag-marker mw-tag-marker-${v}`, dangerouslySetInnerHTML: tagMessage });
}));
}
 
Line 1,716 ⟶ 1,837:
render() {
var _a, _b, _c;
const time = new Date(this.revision.timestamp);
let now = window.moment(time);
if (window.deputy.config.cci.forceUtc.get()) {
now = now.utc();
}
const formattedTime = time.toLocaleTimeString(window.deputyLang, {
hourCycle: 'h24',
timeStyle: mw.user.options.get('date') === 'ISO 8601' ? 'long' : 'short'
});
const formattedDate = now.locale(window.deputyLang).format({
dmy: 'D MMMM YYYY',
mdy: 'MMMM D, Y',
ymd: 'YYYY MMMM D',
'ISO 8601': 'YYYY:MM:DD[T]HH:mm:SS'
}[mw.user.options.get('date')]);
const userPage = new mw.Title(this.revision.user, nsId('user'));
const userTalkPage = new mw.Title(this.revision.user, nsId('user_talk'));
const userContribsPage = new mw.Title('Special:Contributions/' + this.revision.user);
const DiffTag = (Math.abs(this.revision.diffsize) > 500 ?
'strong' :
'span');
const commentElement = h_1("span", { class: "comment comment--without-parentheses",
/** Stranger danger! Yes. */
dangerouslySetInnerHTML: this.revision.parsedcomment });
window.deputy.comms.addEventListener('revisionStatusUpdate', this.revisionStatusUpdateListener);
const// commaBe =wary mwof the spaces between tags.msg('comma-separator');
return h_1("div", { class: ((_a = this.revision.tags) !== null && _a !== void 0 ? _a : []).map((v) => 'mw-tag-' + v).join(' ') },
unwrapWidget(this.completedCheckbox),
h_1("span"ChangesListLinks, { classrevid: "mw-changeslist-links"this.revision.revid, parentid: this.revision.parentid }),
" h_1("span", null,
!this.revision.parentid && h_1(NewPageIndicator, null),
h_1("a", { rel: "noopener", href: getRevisionDiffURL(this.revision.revid, 0), title: "Difference with latest revision", target: "_blank" }, mw.msg('deputy.session.revision.cur'))),
h_1("span"ChangesListTime, null,{ timestamp: !this.revision.parentidtimestamp ?}),
h_1(ChangesListDate, { revision: mw.msg('deputy.sessionthis.revision.prev' }) :,
h_1("a", { rel: "noopener", href: !this.revision.parentid ?
h_1(ChangesListUser, { user: this.revision.user null :}),
getRevisionDiffURL(this.revision.parentid, this.revision.revid), title: "Difference with preceding revision", target: "_blank" }, mw.msg('deputy.session.revision.prev')))),
h_1("span", { class: "mw-changeslist-time" }, formattedTime),
h_1("a", { class: "mw-changeslist-date", href: getRevisionURL(this.revision.revid, this.revision.page.title) },
formattedTime,
comma,
formattedDate),
h_1("span", { class: "history-user" },
h_1("a", { class: "mw-userlink", target: "_blank", rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), userPage.getPrefixedDb()), title: userPage.getPrefixedText() }, userPage.getPrefixedText()),
" ",
h_1("span", { class: "mw-usertoollinks mw-changeslist-links" },
h_1("span", null,
h_1("a", { class: "mw-usertoollinks-talk", target: "_blank", rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), userTalkPage.getPrefixedDb()), title: userTalkPage.getPrefixedText() }, mw.msg('deputy.session.revision.talk'))),
h_1("span", null,
h_1("a", { class: "mw-usertoollinks-contribs", target: "_blank", rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), userContribsPage.getPrefixedDb()), title: userContribsPage.getPrefixedText() }, mw.msg('deputy.session.revision.contribs'))))),
" ",
h_1("span", { class: "mw-changeslist-separator" }),
" ",
h_1("span"ChangesListBytes, { class: "history-size mw-diff-bytes", "data-mw-bytes": this.revision.size }, mw.message('deputy.session.revision.bytes', this.revision.size.toString()).text()),
" ",
h_1(DiffTagChangesListDiff, { classsize: `mw-plusminus-${this.revision.size, diffsize: ===this.revision.diffsize 0 ? 'null' :}),
(this.revision.diffsize > 0 ? 'pos' : 'neg')} mw-diff-bytes`, title: mw.message('deputy.session.revision.byteChange', this.revision.size.toString()).text() }, mw.message(`deputy.${this.revision.diffsize < 0 ? 'negative' : 'positive'}Diff`, this.revision.diffsize.toString()).text()),
" ",
h_1("span", { class: "mw-changeslist-separator" }),
Line 1,777 ⟶ 1,862:
commentElement,
" ",
((_c = (_b = this.revision.tags) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : -1) > 0 && h_1("span", { class: "mw-tag-markers" },
h_1(ChangesListTags, { tags: this.revision.tags }));
h_1("a", { rel: "noopener", href: mw.format(mw.config.get('wgArticlePath'), 'Special:Tags'), title: "Special:Tags", target: "_blank" }, mw.message('deputy.session.revision.tags', this.revision.tags.length.toString()).text()),
this.revision.tags.map((v) => {
// eslint-disable-next-line mediawiki/msg-doc
const tagMessage = mw.message(`tag-${v}`).parse();
return tagMessage !== '-' && h_1("span", { class: `mw-tag-marker mw-tag-marker-${v}`, dangerouslySetInnerHTML: tagMessage });
})));
}
/**
Line 1,812 ⟶ 1,892:
}
return matches.length === 0 ? null : matches[matches.length - 1];
}
 
/**
* Used for detecting Deputy traces.
*/
const traceRegex = /<!--\s*(?:User:)?(.+?)\s*\|\s*(.+?)\s*-->\s*$/g;
/**
* Generates the Deputy trace, used to determine who assessed a row.
*
* @return the Deputy trace
*/
function generateTrace() {
return `<!-- User:${mw.user.getName()}|${new Date().toISOString()} -->`;
}
/**
* Attempts to extract the Deputy trace from wikitext.
*
* @param wikitext
* @return The trace author and timestamp (if available), or null if a trace was not found.
*/
function guessTrace(wikitext) {
const traceExec = cloneRegex$1(traceRegex).exec(wikitext);
if (traceExec) {
return {
author: traceExec[1],
timestamp: new Date(traceExec[2])
};
}
else {
return null;
}
}
 
Line 1,848 ⟶ 1,959:
const parsedComment = (_b = (_a = parser.parse(props.originalElement)) === null || _a === void 0 ? void 0 : _a.commentItems) === null || _b === void 0 ? void 0 : _b[0];
if (!parsedComment) {
// FallSee back to guessingif the author based on anDeputy in-housetrace parserexists.
this.authorconst fromTrace = guessAuthorguessTrace(props.row.commentwikitext);
//if Don't(fromTrace) even try to guess the timestamp.{
this.author = fromTrace.author;
this.timestamp = fromTrace.timestamp && !isNaN(fromTrace.timestamp.getTime()) ?
window.moment(fromTrace.timestamp) :
undefined;
}
else {
// Fall back to guessing the author based on an in-house parser.
this.author = guessAuthor(props.row.comment);
// Don't even try to guess the timestamp.
}
}
else {
Line 1,866 ⟶ 1,987:
h_1("span", { class: "mw-usertoollinks mw-changeslist-links" },
h_1("span", null,
h_1("a", { class: "mw-usertoollinks-talk", target: "_blank", rel: "noopener", href: mw.util.getUrl(talkPage.getPrefixedDb()), title: talkPage.getPrefixedText() }, "mw.msg('deputy.session.revision.talk"'))),
h_1("span", null,
h_1("a", { class: "mw-usertoollinks-contribs", target: "_blank", rel: "noopener", href: mw.util.getUrl(contribsPage.getPrefixedDb()), title: contribsPage.getPrefixedText() }, "mw.msg('deputy.session.revision.contribs"')))))).outerHTML
];
if (this.timestamp) {
params.push(new Datethis.timestamp.toDate()
.toLocaleString('en-US', { dateStyle: 'long', timeStyle: 'short' }), this.timestamp.toNow(true));
}
return h_1("i", { dangerouslySetInnerHTML: mw.message(this.timestamp ?
Line 1,877 ⟶ 1,999:
'deputy.session.row.checked', ...params).text() });
}
returnelse this.author && h_1("i", null,{
"Checkedreturn by ",null;
this.author,}
" ",
this.timestamp && [' at ', this.timestamp.toLocaleString()]);
}
}
Line 2,149 ⟶ 2,269:
* - WithoutViolations: _usually not disabled, kept as is_
* - Missing: _usually not disabled, kept as is_
* - PresumptiveRemoval: _usually not disabled, kept as is_
*
* @param status The status that was <b>changed into</b>
Line 2,166 ⟶ 2,287:
[ContributionSurveyRowStatus.WithViolations]: 'check',
[ContributionSurveyRowStatus.WithoutViolations]: 'close',
[ContributionSurveyRowStatus.Missing]: 'help',
[ContributionSurveyRowStatus.PresumptiveRemoval]: 'trash'
};
 
Line 2,328 ⟶ 2,450:
let addComments = false;
switch (this.status) {
// TODO: l10n
case ContributionSurveyRowStatus.Unfinished:
// This state should not exist. Just add signature (done outside of switch).
Line 2,347 ⟶ 2,470:
case ContributionSurveyRowStatus.Missing:
result += '{{?}}';
addComments = true;
break;
case ContributionSurveyRowStatus.PresumptiveRemoval:
result += '{{x}}';
addComments = true;
break;
Line 2,792 ⟶ 2,919:
[ContributionSurveyRowStatus.WithViolations]: 'check',
[ContributionSurveyRowStatus.WithoutViolations]: 'close',
[ContributionSurveyRowStatus.Missing]: 'help',
[ContributionSurveyRowStatus.PresumptiveRemoval]: 'trash'
};
 
Line 3,020 ⟶ 3,148:
* modifying it manually.
*/
var deputyVersion = /* v */ '0.1.01' /* v */;
 
/**
Line 3,045 ⟶ 3,173:
return new mw.Message(m, 'msg', parameters);
}
 
var ContributionSurveyRowSigningBehavior;
(function (ContributionSurveyRowSigningBehavior) {
ContributionSurveyRowSigningBehavior["Always"] = "always";
ContributionSurveyRowSigningBehavior["AlwaysTrace"] = "alwaysTrace";
ContributionSurveyRowSigningBehavior["AlwaysTraceLastOnly"] = "alwaysTraceLastOnly";
ContributionSurveyRowSigningBehavior["LastOnly"] = "last";
ContributionSurveyRowSigningBehavior["Never"] = "never";
})(ContributionSurveyRowSigningBehavior || (ContributionSurveyRowSigningBehavior = {}));
 
/**
Line 3,110 ⟶ 3,247:
get wikitext() {
var _a;
constlet final = [];
for (const obj of this.wikitextLines) {
if (typeof obj === 'string') {
Line 3,117 ⟶ 3,254:
else {
final.push(obj.wikitext);
}
}
let lastModifiedRowIndex;
for (const i in final) {
const wikitext = final[+i];
if (wikitext.indexOf(' ~~~~') !== -1) {
lastModifiedRowIndex = +i;
}
}
const trace = ` ${generateTrace()}`;
if (lastModifiedRowIndex != null) {
// If `lastModifiedRowIndex` exists, we can assume that a modified row exists.
// This prevents the following from running on unmodified rows, which is
// wasteful.
switch (window.deputy.config.cci.signingBehavior.get()) {
case ContributionSurveyRowSigningBehavior.AlwaysTrace:
final = final.map((line) => {
return line.replace(/ ~~~~$/, trace);
});
break;
case ContributionSurveyRowSigningBehavior.AlwaysTraceLastOnly:
final = final.map((line, i) => {
if (i !== lastModifiedRowIndex) {
return line.replace(/ ~~~~$/, trace);
}
else {
return line;
}
});
break;
case ContributionSurveyRowSigningBehavior.LastOnly:
final = final.map((line, i) => {
if (i !== lastModifiedRowIndex) {
return line.replace(/ ~~~~$/, '');
}
else {
return line;
}
});
break;
case ContributionSurveyRowSigningBehavior.Never:
final = final.map((line) => {
return line.replace(/ ~~~~$/, '');
});
break;
}
}
Line 3,732 ⟶ 3,914:
// TODO: Do interface functions
this.sections = [];
const foundSectionsactiveSectionPromises = [];
for (const heading of this.casePage.findContributionSurveyHeadings()) {
const headingName = sectionHeadingName(heading);
if (this.session.caseSections.indexOf(headingName) !== -1) {
foundSectionsactiveSectionPromises.push(headingNamethis.activateSection(this.casePage, heading);
.then(()v => {v ? headingName : null));
// Placed in self-executing function for asynchronicity.
this.activateSection(this.casePage, heading);
})();
}
else {
Line 3,747 ⟶ 3,926:
}
// Strip missing sections from caseSections.
this.session.caseSections = foundSections;(yield Promise.all(activeSectionPromises))
.filter(v => !!v);
yield DeputyRootSession.setSession(this.session);
if (this.session.caseSections.length === 0) {
// No sections re-opened. All of them might have been removed or closed already.
// Close this entire session.
yield this.closeSession();
}
res();
}));
Line 3,832 ⟶ 4,017:
* @param casePage
* @param heading
* @return `true` if the section was activated successfully
*/
activateSection(casePage, heading) {
Line 3,837 ⟶ 4,023:
const el = new DeputyContributionSurveySection(casePage, heading);
if (!(yield el.prepare())) {
return false;
}
const sectionName = sectionHeadingName(heading);
Line 3,848 ⟶ 4,034:
yield casePage.addActiveSection(sectionName);
heading.insertAdjacentElement('afterend', el.render());
return true;
});
}
Line 10,866 ⟶ 11,053:
type: 'checkbox'
}
}),
signingBehavior: new Setting(generateEnumConfigurationProperties(ContributionSurveyRowSigningBehavior, ContributionSurveyRowSigningBehavior.Always))
};
this.ante = {
Line 11,303 ⟶ 11,491:
"deputy.setting.user.cci.forceUtc.name": "Force UTC time",
"deputy.setting.user.cci.forceUtc.description": "Forces Deputy to use UTC time whenever displaying dates and times, irregardless of your system's timezone or your MediaWiki time settings.",
"deputy.setting.user.cci.signingBehavior.name": "Row signing behavior",
"deputy.setting.user.cci.signingBehavior.description": "Choose how Deputy should behave when signing rows. By default, all rows are always signed with your signature (~~~~). You may configure Deputy to only sign the last row or never sign. You can also configure Deputy to leave a hidden trace behind (<!-- User:Example|2016-05-28T14:32:12Z -->), which helps Deputy (for other users) determine who assessed a row.",
"deputy.setting.user.cci.signingBehavior.always": "Always sign rows",
"deputy.setting.user.cci.signingBehavior.alwaysTrace": "Always leave a trace",
"deputy.setting.user.cci.signingBehavior.alwaysTraceLastOnly": "Always leave a trace, but sign the last row modified",
"deputy.setting.user.cci.signingBehavior.lastOnly": "Only sign the last row modified (prevents assessor recognition)",
"deputy.setting.user.cci.signingBehavior.never": "Never sign rows (prevents assessor recognition)",
"deputy.setting.user.ante": "ANTE",
"deputy.setting.user.ante.enableAutoMerge.name": "Merge automatically on run",
Line 12,358 ⟶ 12,553:
];
 
var deputyStyles = "/*=============================================================================== GLOBAL DEPUTY CLASSES===============================================================================*/* > .deputy.dp-heading {position: absolute;opacity: 0;pointer-events: none;}*:hover > .deputy.dp-heading:not(.dp-heading--active) {opacity: 1;pointer-events: all;}.dp-loadingDots-1, .dp-loadingDots-2, .dp-loadingDots-3 {display: inline-block;margin: 0.1em 0.6em 0.1em 0.1em;width: 0.8em;height: 0.8em;background-color: rgba(0, 0, 0, 50%);animation: dp-loadingDots linear 3s infinite;border-radius: 50%;}@keyframes dp-loadingDots {0% {background-color: rgba(0, 0, 0, 10%);}16% {background-color: rgba(0, 0, 0, 40%);}32% {background-color: rgba(0, 0, 0, 10%);}100% {background-color: rgba(0, 0, 0, 10%);}}.dp-loadingDots-1 {animation-delay: -1s;}.dp-loadingDots-2 {animation-delay: -0.5s;}#mw-content-text.dp-reloading {opacity: 0.2;pointer-events: none;}/*=============================================================================== DEPUTY REVIEW DIALOG (DeputyReviewDialog)===============================================================================*/.dp-review-progress {flex: 1;width: 60%;min-width: 300px;}/*=============================================================================== DEPUTY ENTRY POINTS (DeputyCCISessionStartLink, etc.)===============================================================================*/.deputy.dp-sessionStarter {font-size: small;font-weight: normal;margin-left: 0.25em;vertical-align: baseline;line-height: 1em;}.deputy.dp-sessionStarter::before {content: '\\200B';}.mw-content-ltr .deputy.dp-sessionStarter .dp-sessionStarter-bracket:first-of-type,.mw-content-rtl .deputy.dp-sessionStarter .dp-sessionStarter-bracket:not(:first-of-type) {margin-right: 0.25em;color: #54595d;}.client-js .deputy.dp-sessionStarter .dp-sessionStarter-bracket:first-of-type,.client-js .deputy.dp-sessionStarter .dp-sessionStarter-bracket:not(:first-of-type) {margin-left: 0.25em;color: #54595d}.dp-cs-session-continue {margin-top: 8px;}.dp-cs-section-add {position: absolute;top: 0;/* -1.6em derived from MediaWiki list margins. */left: -1.6em;width: calc(100% + 1.6em);height: 100%;background-color: rgba(255, 255, 255, 75%);display: flex;justify-content: center;align-items: center;}.dp-cs-section-add .dp-cs-section-addButton {opacity: 0;transition: opacity 0.2s ease-in-out;}.dp-cs-section-add:hover .dp-cs-section-addButton {opacity: 1;}/*=============================================================================== DEPUTY CONTRIBUTION SURVEY SECTION===============================================================================*/.dp-cs-session-notice {margin-top: 8px;position: sticky;top: 8px;z-index: 50;}.skin-vector-2022.vector-sticky-header-visible .dp-cs-session-notice {top: calc(3.125rem + 8px);}.dp-cs-section-footer {position: relative;padding: 8px;}.dp-cs-section-progress {margin-top: 8px;max-height: 0;transition: max-height 0.2s ease-in-out;display: flex;justify-content: center;align-items: center;overflow: hidden;}.dp-cs-section-progress.active {max-height: 50px;}.dp-cs-section-progress .oo-ui-progressBarWidget {flex: 1}.dp-cs-section-closingCommentsField {margin-top: 8px;}.dp-cs-row {margin-bottom: 8px;}.dp-cs-row .dp--loadingDots {display: flex;align-items: center;justify-content: center;padding: 0.4em;}.dp-cs-row-status {max-width: 5.4em;}.dp-cs-row-status .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {width: 0;opacity: 0;}.dp-cs-row-status .dp-cs-row-status--unknown:not(.oo-ui-optionWidget-selected) {display: none;}.dp-cs-row-head > * {vertical-align: middle;}body.mediawiki.ltr .dp-cs-row-head > :not(:first-child):not(:last-child),body.mediawiki.ltr .dp-cs-row-head > :not(:first-child):not(:last-child) {margin-right: 16px;}body.mediawiki.rtl .dp-cs-row-head > :not(:first-child):not(:last-child),body.mediawiki.rtl .dp-cs-row-head > :not(:first-child):not(:last-child) {margin-left: 16px;}.dp-cs-row-links {margin-right: 0 !important;}.dp-cs-row-links > :not(:last-child) {margin-right: 8px !important;}.dp-cs-row-title {font-weight: bold;font-size: 1.2em;vertical-align: middle;}.dp-cs-row-details {color: #4a5054;font-weight: bold;}.dp-cs-row-toggle .oo-ui-iconElement-icon {background-size: 1em;}.dp-cs-row-toggle .oo-ui-buttonElement-button {border-radius: 50%;}.dp-cs-row .history-user,.dp-cs-row :not(.newpage) + .mw-changeslist-date {margin-left: 0.4em;margin-right: 0.2em;}.dp-cs-row .newpage {margin-left: 0.4em;}.dp-cs-row-content {padding: 16px;background-color: rgba(0, 0, 0, 4%);margin: 4px 0;}.dp-cs-row-content.dp-cs-row-content-empty {display: none !important;}.dp-cs-row-unfinishedWarning {margin-bottom: 8px;}.dp-cs-row-closeComments {font-family: monospace, monospace;font-size: small;}.dp-cs-row-closeComments:not(:last-child) {margin-bottom: 8px;}.dp-cs-row-finished .oo-ui-fieldLayout:first-child {margin-top: 0;}.dp-cs-row-finished .oo-ui-fieldLayout {margin-top: 8px;}.dp-cs-row-revisions .mw-tag-markers .mw-tag-marker:not(:first-child),.dp-cs-row-detail:not(:first-child) {margin-left: 0.2em;}/*=============================================================================== DEPUTY PAGE TOOLBAR===============================================================================*/.dp-pageToolbar {position: fixed;bottom: 8px;left: 8px;padding: 8px;background-color: #fff;border: 1px solid gray;font-size: 0.9rem;display: flex;align-items: center;z-index: 100;}@media only screen and (max-width: 768px) {.dp-pageToolbar {flex-wrap: wrap;bottom: 0;left: 0;border-left: 0;border-bottom: 0;border-right: 0;width: 100%;}}.dp-pt-section {display: inline-block;white-space: nowrap;}.dp-pt-section + .dp-pt-section {/* TODO: Recheck RTL compatibility */margin-left: 16px;padding-left: 16px;border-left: 1px solid gray;}.dp-pt-section:last-child {/* TODO: Recheck RTL compatibility */margin-right: 8px;}.dp-pt-section-label {font-weight: bold;font-size: 0.6rem;color: #4a5054;text-transform: uppercase;}.dp-pt-section-content .oo-ui-buttonElement:last-child {margin-right: 0;}.dp-pt-caseInfo {font-weight: bold;font-size: 1.3rem;pointer-events: none;}.dp-pt-missingRevision {white-space: normal;}.dp-pageToolbar .dp-cs-row-status {width: 5.4em;}.dp-pt-menu .oo-ui-menuSelectWidget {min-width: 300px;}.dp-pt-menu .oo-ui-menuOptionWidget {padding-top: 8px;padding-bottom: 8px;}";
 
var deputyCoreEnglish = {
Line 12,391 ⟶ 12,586:
"deputy.session.row.status.withoutViolations": "No violations found",
"deputy.session.row.status.missing": "Missing",
"deputy.session.row.status.presumptiveRemoval": "Presumptively removed",
"deputy.session.row.details.new": "created",
"deputy.session.row.details.edits": "{{PLURAL:$1|$1 edit|{{FORMATNUM:$1}} edits}}",
Line 12,409 ⟶ 12,605:
"deputy.session.row.checked.talk": "talk",
"deputy.session.row.checked.contribs": "contribs",
"deputy.session.revision.assessed": "Assessed",
"deputy.session.revision.cur": "cur",
"deputy.session.revision.prev": "prev",
"deputy.session.revision.cur.tooltip": "Difference with latest revision",
"deputy.session.revision.prev.tooltip": "Difference with preceding revision",
"deputy.session.revision.talk": "talk",
"deputy.session.revision.contribs": "contribs",
Line 12,417 ⟶ 12,614:
"deputy.session.revision.byteChange": "{{FORMATNUM:$1}} bytes after change of this size",
"deputy.session.revision.tags": "{{PLURAL:$1|Tag|Tags}}:",
"deputy.session.revision.new": "N",
"deputy.session.revision.new.tooltip": "This edit created a new page.",
"deputy.session.page.diff.next": "Navigate to the next unassessed revision",
"deputy.session.page.diff.loadFail": "Failed to load diff. Please check your internet connection and try again.",