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

Content deleted Content added
(bot/CD)
(bot/CD)
Line 345:
}));
 
var version = "0.45.20";
var gitAbbrevHash = "07a010c876b533";
var gitBranch = "main";
var gitDate = "SunTue, 1012 Sep 2023 0013:5516:4617 +0800";
var gitVersion = "0.45.20+g07a010cg876b533";
 
/**
Line 2,122:
return Array.from(el.childNodes).map(v => v instanceof HTMLElement ? v :
(v instanceof Text ? v.textContent : undefined)).filter(v => v !== undefined);
}
 
/**
* Mixes values together into a string for the `class` attribute.
*
* @param {...any} classes
* @return string
*/
function classMix (...classes) {
const processedClasses = [];
for (const _class of classes) {
if (Array.isArray(_class)) {
processedClasses.push(..._class);
}
else {
processedClasses.push(_class);
}
}
return processedClasses.filter((v) => v != null && !!v).join(' ');
}
 
let InternalDeputyMessageWidget;
/**
* Initializes the process element.
*/
function initDeputyMessageWidget() {
InternalDeputyMessageWidget = class DeputyMessageWidget extends OO.ui.MessageWidget {
/**
* @param config Configuration to be passed to the element.
*/
constructor(config) {
var _a;
super(config);
this.$element.addClass('dp-messageWidget');
const elLabel = this.$label[0];
if (!config.label) {
if (config.title) {
elLabel.appendChild(h_1("b", { style: { display: 'block' } }, config.title));
}
if (config.message) {
elLabel.appendChild(h_1("p", { class: "dp-messageWidget-message" }, config.message));
}
}
if (config.actions || config.closable) {
const actionContainer = h_1("div", { class: "dp-messageWidget-actions" });
for (const action of ((_a = config.actions) !== null && _a !== void 0 ? _a : [])) {
if (action instanceof OO.ui.Element) {
actionContainer.appendChild(unwrapWidget(action));
}
else {
actionContainer.appendChild(action);
}
}
if (config.closable) {
const closeButton = new OO.ui.ButtonWidget({
label: mw.msg('deputy.dismiss')
});
closeButton.on('click', () => {
removeElement(unwrapWidget(this));
this.emit('close');
});
actionContainer.appendChild(unwrapWidget(closeButton));
}
elLabel.appendChild(actionContainer);
}
}
};
}
/**
* Creates a new DeputyMessageWidget. This is an extension of the default
* OOUI MessageWidget. It includes support for a title, a message, and button
* actions.
*
* @param config Configuration to be passed to the element.
* @return A DeputyMessageWidget object
*/
function DeputyMessageWidget (config) {
if (!InternalDeputyMessageWidget) {
initDeputyMessageWidget();
}
return new InternalDeputyMessageWidget(config);
}
 
/**
* Get the API error text from an API response.
*
* @param errorData
* @param n Get the `n`th error. Defaults to 0 (first error).
*/
function getApiErrorText(errorData, n = 0) {
var _a, _b, _c, _d, _e, _f, _g;
// errorformat=html
return ((_b = (_a = errorData.errors) === null || _a === void 0 ? void 0 : _a[n]) === null || _b === void 0 ? void 0 : _b.html) ?
h_1("span", { dangerouslySetInnerHTML: (_d = (_c = errorData.errors) === null || _c === void 0 ? void 0 : _c[n]) === null || _d === void 0 ? void 0 : _d.html }) :
(
// errorformat=plaintext/wikitext
(_g = (_f = (_e = errorData.errors) === null || _e === void 0 ? void 0 : _e[n]) === null || _f === void 0 ? void 0 : _f.text) !== null && _g !== void 0 ? _g :
// errorformat=bc
errorData.info);
}
 
Line 2,131 ⟶ 2,230:
* @param revision
* @param row
* @param options
* @param options.expanded
*/
constructor(revision, row, options = {}) {
var _a;
super();
this.revisionStatusUpdateListener = this.onRevisionStatusUpdate.bind(this);
/**
* The diff view of the given revision. May also be "loading" text, or
* null if the diff view has not yet been set.
* @private
*/
this.diff = null;
this.revision = revision;
this.uiRow = row;
this.autoExpanded = (_a = options.expanded) !== null && _a !== void 0 ? _a : false;
if (this.statusAutosaveFunction == null) {
// TODO: types-mediawiki limitation
Line 2,220 ⟶ 2,329:
this.completedCheckbox = new OO.ui.CheckboxInputWidget({
title: mw.msg('deputy.session.revision.assessed'),
selected: yield this.getSavedStatus(),
classes: ['dp-cs-rev-checkbox']
});
this.completedCheckbox.on('change', (checked) => {
Line 2,241 ⟶ 2,351:
this.statusAutosaveFunction();
});
this.diffToggle = new OO.ui.ToggleButtonWidget({
label: mw.msg('deputy.session.revision.diff.toggle'),
invisibleLabel: true,
indicator: 'down',
framed: false,
classes: ['dp-cs-rev-toggleDiff'],
value: this.autoExpanded
});
this.diff = h_1("div", { class: "dp-cs-rev-diff" });
let loaded = false;
const handleDiffToggle = (active) => {
this.diffToggle.setIndicator(active ? 'up' : 'down');
if (active && this.diff.classList.contains('dp-cs-rev-diff--errored')) {
// Remake diff panel
this.diff = swapElements(this.diff, h_1("div", { class: "dp-cs-rev-diff" }));
}
else if (loaded) {
this.diff.classList.toggle('dp-cs-rev-diff--hidden', !active);
}
if (active && !loaded) {
// Going active, clear the element out
Array.from(this.diff.children).forEach((child) => this.diff.removeChild(child));
this.diff.setAttribute('class', 'dp-cs-rev-diff');
this.diff.appendChild(h_1(DeputyLoadingDots, null));
const comparePromise = MwApi.action.get({
action: 'compare',
fromrev: this.revision.revid,
torelative: 'prev',
prop: 'diff'
});
const stylePromise = mw.loader.using('mediawiki.diff.styles');
// Promise.all not used here since we need to use JQuery.Promise#then
// if we want to access the underlying error response.
$.when([comparePromise, stylePromise])
.then((results) => results[0])
.then((data) => {
unwrapWidget(this.diffToggle).classList.add('dp-cs-rev-toggleDiff--loaded');
// Clear element out again
Array.from(this.diff.children).forEach((child) => this.diff.removeChild(child));
// https://youtrack.jetbrains.com/issue/WEB-61047
// noinspection JSXDomNesting
const diffTable = h_1("table", { class: classMix('diff', `diff-editfont-${mw.user.options.get('editfont')}`) },
h_1("colgroup", null,
h_1("col", { class: "diff-marker" }),
h_1("col", { class: "diff-content" }),
h_1("col", { class: "diff-marker" }),
h_1("col", { class: "diff-content" })));
// Trusted .innerHTML (data always comes from MediaWiki Action API)
diffTable.innerHTML += data.compare.body;
diffTable.querySelectorAll('tr').forEach((tr) => {
// Delete all header rows
if (tr.querySelector('.diff-lineno')) {
removeElement(tr);
return;
}
// Delete all no-change rows (gray rows)
// !(.diff-markers with a marker) = no change for row
if (!tr.querySelector('td.diff-marker[data-marker]')) {
removeElement(tr);
}
});
this.diff.classList.toggle('dp-cs-rev-diff--loaded', true);
this.diff.classList.toggle('dp-cs-rev-diff--errored', false);
this.diff.appendChild(diffTable);
loaded = true;
}, (_error, errorData) => {
// Clear element out again
Array.from(this.diff.children).map((child) => this.diff.removeChild(child));
this.diff.classList.toggle('dp-cs-rev-diff--loaded', true);
this.diff.classList.toggle('dp-cs-rev-diff--errored', true);
this.diff.appendChild(unwrapWidget(DeputyMessageWidget({
type: 'error',
message: mw.msg('deputy.session.revision.diff.error', errorData ?
getApiErrorText(errorData) :
_error.message)
})));
});
}
};
this.diffToggle.on('change', (checked) => {
handleDiffToggle(checked);
});
if (this.autoExpanded) {
handleDiffToggle(true);
}
});
}
Line 2,257 ⟶ 2,452:
h_1(ChangesListDate, { revision: this.revision }),
" ",
window.deputy.config.cci.showUsername.get() && h_1(ChangesListUser, { user: this.revision.user }),
" ",
h_1("span", { class: "mw-changeslist-separator" }),
Line 2,287 ⟶ 2,482:
window.deputy.comms.addEventListener('revisionStatusUpdate', this.revisionStatusUpdateListener);
// Be wary of the spaces between tags.
return this.element = h_1("div", { class: ((_a = this.revision.tags) !== null && _a !== void 0 ? _a : []).map((v) => 'mw-tag-' + v).join(' ') },
.replace(/[^A-Z0-9-]/gi, '')
.replace(/\s/g, '_')).join(' ') },
unwrapWidget(this.completedCheckbox),
unwrapWidget(this.diffToggle),
h_1(ChangesListLinks, { revid: this.revision.revid, parentid: this.revision.parentid, missing: this.revision.missing }),
unwrapElement(this.revision.missing ?
this.renderMissingRevisionInfo() :
this.renderRevisionInfo()));,
this.diff);
}
/**
Line 2,438 ⟶ 2,637:
}
}
}
 
/**
* Mixes values together into a string for the `class` attribute.
*
* @param {...any} classes
* @return string
*/
function classMix (...classes) {
const processedClasses = [];
for (const _class of classes) {
if (Array.isArray(_class)) {
processedClasses.push(..._class);
}
else {
processedClasses.push(_class);
}
}
return processedClasses.filter((v) => v != null && !!v).join(' ');
}
 
Line 3,176 ⟶ 3,356:
revisionList.appendChild(unwrapWidget(this.unfinishedMessageBox));
revisionList.appendChild(unwrapWidget(this.renderCommentsTextInput(this.row.comment)));
const maxSize = window.deputy.config.cci.maxSizeToAutoShowDiff.get();
for (const revision of diffs.values()) {
const revisionUIEl = new DeputyContributionSurveyRevision(revision, this);, {
expanded: window.deputy.config.cci.autoShowDiff.get() &&
diffs.size < window.deputy.config.cci.maxRevisionsToAutoShowDiff.get() &&
(maxSize === -1 || Math.abs(revision.diffsize) < maxSize)
});
revisionUIEl.addEventListener('update', () => {
// Recheck options first to avoid "Unfinished" being selected when done.
Line 3,734 ⟶ 3,919:
ContributionSurveyRowSigningBehavior["Never"] = "never";
})(ContributionSurveyRowSigningBehavior || (ContributionSurveyRowSigningBehavior = {}));
 
let InternalDeputyMessageWidget;
/**
* Initializes the process element.
*/
function initDeputyMessageWidget() {
InternalDeputyMessageWidget = class DeputyMessageWidget extends OO.ui.MessageWidget {
/**
* @param config Configuration to be passed to the element.
*/
constructor(config) {
var _a;
super(config);
this.$element.addClass('dp-messageWidget');
const elLabel = this.$label[0];
if (!config.label) {
if (config.title) {
elLabel.appendChild(h_1("b", { style: { display: 'block' } }, config.title));
}
if (config.message) {
elLabel.appendChild(h_1("p", { class: "dp-messageWidget-message" }, config.message));
}
}
if (config.actions || config.closable) {
const actionContainer = h_1("div", { class: "dp-messageWidget-actions" });
for (const action of ((_a = config.actions) !== null && _a !== void 0 ? _a : [])) {
if (action instanceof OO.ui.Element) {
actionContainer.appendChild(unwrapWidget(action));
}
else {
actionContainer.appendChild(action);
}
}
if (config.closable) {
const closeButton = new OO.ui.ButtonWidget({
label: mw.msg('deputy.dismiss')
});
closeButton.on('click', () => {
removeElement(unwrapWidget(this));
this.emit('close');
});
actionContainer.appendChild(unwrapWidget(closeButton));
}
elLabel.appendChild(actionContainer);
}
}
};
}
/**
* Creates a new DeputyMessageWidget. This is an extension of the default
* OOUI MessageWidget. It includes support for a title, a message, and button
* actions.
*
* @param config Configuration to be passed to the element.
* @return A DeputyMessageWidget object
*/
function DeputyMessageWidget (config) {
if (!InternalDeputyMessageWidget) {
initDeputyMessageWidget();
}
return new InternalDeputyMessageWidget(config);
}
 
/**
Line 4,685 ⟶ 4,808:
'oojs-ui-core',
'oojs-ui-windows',
'oojs-ui-widgets',
'oojs-ui.styles.icons-alerts',
'oojs-ui.styles.icons-content',
Line 6,136 ⟶ 6,260:
function equalTitle(title1, title2) {
return normalizeTitle(title1).getPrefixedDb() === normalizeTitle(title2).getPrefixedDb();
}
 
/**
* Get the API error text from an API response.
*
* @param errorData
* @param n Get the `n`th error. Defaults to 0 (first error).
*/
function getApiErrorText(errorData, n = 0) {
var _a, _b, _c, _d, _e, _f, _g;
// errorformat=html
return ((_b = (_a = errorData.errors) === null || _a === void 0 ? void 0 : _a[n]) === null || _b === void 0 ? void 0 : _b.html) ?
h_1("span", { dangerouslySetInnerHTML: (_d = (_c = errorData.errors) === null || _c === void 0 ? void 0 : _c[n]) === null || _d === void 0 ? void 0 : _d.html }) :
(
// errorformat=plaintext/wikitext
(_g = (_f = (_e = errorData.errors) === null || _e === void 0 ? void 0 : _e[n]) === null || _f === void 0 ? void 0 : _f.text) !== null && _g !== void 0 ? _g :
// errorformat=bc
errorData.info);
}
 
Line 12,032 ⟶ 12,138:
*/
constructor(options) {
var _a, _b;
this.serialize = options.serialize;
this.deserialize = options.deserialize;
Line 12,038 ⟶ 12,145:
this.value = this.defaultValue = options.defaultValue;
this.alwaysSave = options.alwaysSave;
this.isDisabled = ((_a = options.displayOptions) === null || _a === void 0 ? void 0 : _a.disabled) != null ?
}
(typeof options.displayOptions.disabled === 'function' ?
/**
options.displayOptions.disabled.bind(this) :
* @return if this option is disabled or not.
() => options.displayOptions.disabled) : () => false;
*/
this.isHidden = ((_b = options.displayOptions) === null || _b === void 0 ? void 0 : _b.hidden) != null ?
get disabled() {
return (typeof thisoptions.displayOptions.disabledhidden !=== 'function' ?
this options.displayOptions.disabledhidden.bind(this) :
this () => options.displayOptions.disabled.callhidden) : (this) => false;
}
/**
* @return if this option is hidden or not.
*/
get hidden() {
return typeof this.displayOptions.hidden !== 'function' ?
this.displayOptions.hidden :
this.displayOptions.hidden.call(this);
}
/**
Line 12,309 ⟶ 12,408:
displayOptions: {
type: 'checkbox'
}
}),
showUsername: new Setting({
defaultValue: false,
displayOptions: {
type: 'checkbox'
}
}),
autoShowDiff: new Setting({
defaultValue: false,
displayOptions: {
type: 'checkbox'
}
}),
maxRevisionsToAutoShowDiff: new Setting({
defaultValue: 2,
displayOptions: {
type: 'number',
// Force any due to self-reference
disabled: (config) => !config.cci.autoShowDiff.get(),
extraOptions: {
min: 1
}
}
}),
maxSizeToAutoShowDiff: new Setting({
defaultValue: 500,
displayOptions: {
type: 'number',
// Force any due to self-reference
disabled: (config) => !config.cci.autoShowDiff.get(),
extraOptions: {
min: -1
}
}
}),
Line 12,439 ⟶ 12,572:
for (const settingKey of Object.keys(this.settings)) {
const setting = this.settings[settingKey];
if (setting.hiddenisHidden(this.config.config)) {
continue;
}
Line 12,453 ⟶ 12,586:
break;
case 'text':
this.$element.append(this.newStringField(settingKey, setting, setting.displayOptions.extraOptions));
break;
case 'number':
this.$element.append(this.newNumberField(settingKey, setting, setting.displayOptions.extraOptions));
break;
case 'page':
this.$element.append(this.newPageField(settingKey, setting, setting.displayOptions.extraOptions));
break;
case 'code':
this.$element.append(this.newCodeField(settingKey, setting, setting.displayOptions.extraOptions));
break;
default:
Line 12,544 ⟶ 12,680:
*/
newCheckboxField(settingKey, setting) {
const isDisabled = setting.disabledisDisabled(this.config.config);
const desc = mw.message(`deputy.setting.${this.mode}.${this.config.group}.${settingKey}.description`);
const field = new OO.ui.CheckboxInputWidget({
Line 12,564 ⟶ 12,700:
// Attach disabled re-checker
this.on('change', () => {
field.setDisabled(!!setting.disabledisDisabled(this.config.config));
});
return h_1("div", { class: "deputy-setting" }, unwrapWidget(layout));
Line 12,576 ⟶ 12,712:
*/
newCheckboxesField(settingKey, setting) {
const isDisabled = setting.disabledisDisabled(this.config.config);
const desc = mw.message(`deputy.setting.${this.mode}.${this.config.group}.${settingKey}.description`);
const field = new OO.ui.CheckboxMultiselectInputWidget({
Line 12,601 ⟶ 12,737:
});
// Attach disabled re-checker
this.on('selectchange', () => {
field.setDisabled(!!setting.disabledisDisabled(this.config.config));
});
return h_1("div", { class: "deputy-setting" }, unwrapWidget(layout));
Line 12,615 ⟶ 12,751:
newRadioField(settingKey, setting) {
var _a;
const isDisabled = setting.disabledisDisabled(this.config.config);
const desc = mw.message(`deputy.setting.${this.mode}.${this.config.group}.${settingKey}.description`);
const field = new OO.ui.RadioSelectWidget({
Line 12,646 ⟶ 12,782:
// Attach disabled re-checker
this.on('change', () => {
field.setDisabled(!!setting.disabledisDisabled(this.config.config));
});
return h_1("div", { class: "deputy-setting" }, unwrapWidget(layout));
Line 12,661 ⟶ 12,797:
newStringLikeField(FieldClass, settingKey, setting, extraFieldOptions = {}) {
var _a, _b, _c;
const isDisabled = setting.disabledisDisabled(this.config.config);
const desc = mw.message(`deputy.setting.${this.mode}.${this.config.group}.${settingKey}.description`);
const field = new FieldClass(Object.assign({ readOnly: (_a = setting.displayOptions.readOnly) !== null && _a !== void 0 ? _a : false, value: (_c = (_b = setting.serialize) === null || _b === void 0 ? void 0 : _b.call(setting, setting.get())) !== null && _c !== void 0 ? _c : setting.get(), disabled: isDisabled !== undefined && isDisabled !== false }, extraFieldOptions));
Line 12,672 ⟶ 12,808:
helpInline: true
});
field.on('change',if (value)FieldClass =>== OO.ui.NumberInputWidget) {
settingfield.seton('change', (value); => {
this setting.emitset('change'+value);
} this.emit('change');
});
}
else {
field.on('change', (value) => {
setting.set(value);
this.emit('change');
});
}
// Attach disabled re-checker
this.on('change', () => {
field.setDisabled(setting.disabledisDisabled(this.config.config));
});
return h_1("div", { class: "deputy-setting" }, unwrapWidget(layout));
Line 12,687 ⟶ 12,831:
* @param settingKey
* @param setting
* @param extraFieldOptions
* @return An HTMLElement of the given setting's field.
*/
newStringField(settingKey, setting, extraFieldOptions) {
return this.newStringLikeField(OO.ui.TextInputWidget, settingKey, setting, extraFieldOptions);
}
/**
* Creates a new number setting field.
*
* @param settingKey
* @param setting
* @param extraFieldOptions
* @return An HTMLElement of the given setting's field.
*/
newNumberField(settingKey, setting, extraFieldOptions) {
return this.newStringLikeField(OO.ui.NumberInputWidget, settingKey, setting, extraFieldOptions);
}
/**
Line 12,697 ⟶ 12,853:
* @param settingKey
* @param setting
* @param extraFieldOptions
* @return An HTMLElement of the given setting's field.
*/
newPageField(settingKey, setting, extraFieldOptions) {
return this.newStringLikeField(mw.widgets.TitleInputWidget, settingKey, setting, extraFieldOptions);
}
/**
Line 12,707 ⟶ 12,864:
* @param settingKey
* @param setting
* @param extraFieldOptions
* @return An HTMLElement of the given setting's field.
*/
newCodeField(settingKey, setting, extraFieldOptions) {
return this.newStringLikeField(OO.ui.MultilineTextInputWidget, settingKey, setting, extraFieldOptions);
}
};
Line 12,772 ⟶ 12,930:
"deputy.setting.user.cci.showCvLink.name": "Show \"cv\" (\"copyvios\") link for revisions",
"deputy.setting.user.cci.showCvLink.description": "Show a \"cv\" link next to \"cur\" and \"prev\" on revision rows. This link will only appear if this wiki is configured to use Earwig's Copyvio Detector.",
"deputy.setting.user.cci.showUsername.name": "Show username",
"deputy.setting.user.cci.showUsername.description": "Show the username of the user who made the edit on revision rows. This may be redundant for cases which only have one editor.",
"deputy.setting.user.cci.autoShowDiff.name": "Automatically show diffs",
"deputy.setting.user.cci.autoShowDiff.description": "Enabling automatic loading of diffs. Configurable with two additional options to avoid loading too much content.",
"deputy.setting.user.cci.maxRevisionsToAutoShowDiff.name": "Maximum revisions to automatically show diff",
"deputy.setting.user.cci.maxRevisionsToAutoShowDiff.description": "The maximum number of revisions for a given page to automatically show the diff for each revision in the main interface.",
"deputy.setting.user.cci.maxSizeToAutoShowDiff.name": "Maximum size to automatically show diff",
"deputy.setting.user.cci.maxSizeToAutoShowDiff.description": "The maximum size of a diff to be automatically shown, if the diff will be automatically shown (see \"Maximum revisions to automatically show diff\"). Prevents extremely large diffs from opening. Set to -1 to show regardless of size.",
"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.",
Line 13,933 ⟶ 14,099:
];
 
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;}p.dp-messageWidget-message {margin: 0 0 0.5em 0;}.dp-messageWidget-actions .oo-ui-buttonElement {margin-top: 0;}/*=============================================================================== 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;font-family: sans-serif;}.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-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;}.dp-cs-row-comments {padding: 16px;background-color: rgba(0, 159, 255, 10%);margin: 4px 0;}.dp-cs-row-comments > b {letter-spacing: 0.1em;font-weight: bold;text-transform: uppercase;color: rgba(0, 0, 0, 0.5);}.dp-cs-row-comments hr {border-color: rgb(0, 31, 51);}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, 6%);margin: 4px 0;}.dp-cs-row-content.dp-cs-row-content-empty {display: none !important;}.dp-cs-row-unfinishedWarning {margin-bottom: 8px;}.dp-cs-section-unfinishedWarning {margin-top: 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;}.dp-cs-rev-checkbox {margin-right: 4px;}.dp-cs-rev-toggleDiff {vertical-align: baseline;margin-right: 4px;}.dp-cs-rev-diff {background-color: white;position: relative;}.dp-cs-rev-diff--loaded {margin: 4px 0;padding: 8px 14px;}.dp-cs-rev-diff--hidden {display: none;}.dp-cs-rev-toggleDiff > .oo-ui-buttonElement-button {padding: 0;min-height: 1em;background-color: unset !important;}.dp-cs-rev-toggleDiff .oo-ui-indicatorElement-indicator {top: -1px;}/*=============================================================================== DEPUTY PAGE TOOLBAR===============================================================================*/.dp-pageToolbar {position: fixed;bottom: 8px;left: 8px;z-index: 100;padding: 8px;background-color: #fff;border: 1px solid gray;font-size: 0.9rem;display: flex;align-items: center;}@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 13,996 ⟶ 14,162:
"deputy.session.row.checked.contribs": "contribs",
"deputy.session.revision.assessed": "Mark as assessed",
"deputy.session.revision.diff.toggle": "Toggle comparison (diff) view",
"deputy.session.revision.diff.error": "Failed to load comparison: $1",
"deputy.session.revision.cur": "cur",
"deputy.session.revision.prev": "prev",