Files
2025-10-12 13:42:02 +02:00

235 lines
8.7 KiB
JavaScript

// This file will be loaded on admin pages, regardless of theme.
import "packs/public-path";
import Rails from "@rails/ujs";
import ready from "../mastodon/ready";
const setAnnouncementEndsAttributes = (target) => {
const valid = target?.value && target?.validity?.valid;
const element = document.querySelector("input[type=\"datetime-local\"]#announcement_ends_at");
if (valid) {
element.classList.remove("optional");
element.required = true;
element.min = target.value;
} else {
element.classList.add("optional");
element.removeAttribute("required");
element.removeAttribute("min");
}
};
Rails.delegate(document, "input[type=\"datetime-local\"]#announcement_starts_at", "change", ({ target }) => {
setAnnouncementEndsAttributes(target);
});
const batchCheckboxClassName = ".batch-checkbox input[type=\"checkbox\"]";
const showSelectAll = () => {
const selectAllMatchingElement = document.querySelector(".batch-table__select-all");
selectAllMatchingElement.classList.add("active");
};
const hideSelectAll = () => {
const selectAllMatchingElement = document.querySelector(".batch-table__select-all");
const hiddenField = document.querySelector("#select_all_matching");
const selectedMsg = document.querySelector(".batch-table__select-all .selected");
const notSelectedMsg = document.querySelector(".batch-table__select-all .not-selected");
selectAllMatchingElement.classList.remove("active");
selectedMsg.classList.remove("active");
notSelectedMsg.classList.add("active");
hiddenField.value = "0";
};
Rails.delegate(document, "#batch_checkbox_all", "change", ({ target }) => {
const selectAllMatchingElement = document.querySelector(".batch-table__select-all");
[].forEach.call(document.querySelectorAll(batchCheckboxClassName), (content) => {
content.checked = target.checked;
});
if (selectAllMatchingElement) {
if (target.checked) {
showSelectAll();
} else {
hideSelectAll();
}
}
});
Rails.delegate(document, ".batch-table__select-all button", "click", () => {
const hiddenField = document.querySelector("#select_all_matching");
const active = hiddenField.value === "1";
const selectedMsg = document.querySelector(".batch-table__select-all .selected");
const notSelectedMsg = document.querySelector(".batch-table__select-all .not-selected");
if (active) {
hiddenField.value = "0";
selectedMsg.classList.remove("active");
notSelectedMsg.classList.add("active");
} else {
hiddenField.value = "1";
notSelectedMsg.classList.remove("active");
selectedMsg.classList.add("active");
}
});
Rails.delegate(document, batchCheckboxClassName, "change", () => {
const checkAllElement = document.querySelector("#batch_checkbox_all");
const selectAllMatchingElement = document.querySelector(".batch-table__select-all");
if (checkAllElement) {
checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
if (selectAllMatchingElement) {
if (checkAllElement.checked) {
showSelectAll();
} else {
hideSelectAll();
}
}
}
});
Rails.delegate(document, ".media-spoiler-show-button", "click", () => {
[].forEach.call(document.querySelectorAll("button.media-spoiler"), (element) => {
element.click();
});
});
Rails.delegate(document, ".media-spoiler-hide-button", "click", () => {
[].forEach.call(document.querySelectorAll(".spoiler-button.spoiler-button--visible button"), (element) => {
element.click();
});
});
Rails.delegate(document, ".filter-subset--with-select select", "change", ({ target }) => {
target.form.submit();
});
const onDomainBlockSeverityChange = (target) => {
const rejectMediaDiv = document.querySelector(".input.with_label.domain_block_reject_media");
const rejectReportsDiv = document.querySelector(".input.with_label.domain_block_reject_reports");
if (rejectMediaDiv) {
rejectMediaDiv.style.display = (target.value === "suspend") ? "none" : "block";
}
if (rejectReportsDiv) {
rejectReportsDiv.style.display = (target.value === "suspend") ? "none" : "block";
}
};
Rails.delegate(document, "#domain_block_severity", "change", ({ target }) => onDomainBlockSeverityChange(target));
const onEnableBootstrapTimelineAccountsChange = (target) => {
const bootstrapTimelineAccountsField = document.querySelector("#form_admin_settings_bootstrap_timeline_accounts");
if (bootstrapTimelineAccountsField) {
bootstrapTimelineAccountsField.disabled = !target.checked;
if (target.checked) {
bootstrapTimelineAccountsField.parentElement.classList.remove("disabled");
bootstrapTimelineAccountsField.parentElement.parentElement.classList.remove("disabled");
} else {
bootstrapTimelineAccountsField.parentElement.classList.add("disabled");
bootstrapTimelineAccountsField.parentElement.parentElement.classList.add("disabled");
}
}
};
Rails.delegate(document, "#form_admin_settings_enable_bootstrap_timeline_accounts", "change", ({ target }) => onEnableBootstrapTimelineAccountsChange(target));
const onChangeRegistrationMode = (target) => {
const enabled = target.value === "approved";
[].forEach.call(document.querySelectorAll("#form_admin_settings_require_invite_text"), (input) => {
input.disabled = !enabled;
if (enabled) {
let element = input;
do {
element.classList.remove("disabled");
element = element.parentElement;
} while (element && !element.classList.contains("fields-group"));
} else {
let element = input;
do {
element.classList.add("disabled");
element = element.parentElement;
} while (element && !element.classList.contains("fields-group"));
}
});
};
const convertUTCDateTimeToLocal = (value) => {
const date = new Date(value + "Z");
const twoChars = (x) => (x.toString().padStart(2, "0"));
return `${date.getFullYear()}-${twoChars(date.getMonth()+1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`;
};
const convertLocalDatetimeToUTC = (value) => {
const re = /^([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})/;
const match = re.exec(value);
const date = new Date(match[1], match[2] - 1, match[3], match[4], match[5]);
const fullISO8601 = date.toISOString();
return fullISO8601.slice(0, fullISO8601.indexOf("T") + 6);
};
Rails.delegate(document, "#form_admin_settings_registrations_mode", "change", ({ target }) => onChangeRegistrationMode(target));
ready(() => {
const domainBlockSeverityInput = document.getElementById("domain_block_severity");
if (domainBlockSeverityInput) {
onDomainBlockSeverityChange(domainBlockSeverityInput);
}
const enableBootstrapTimelineAccounts = document.getElementById("form_admin_settings_enable_bootstrap_timeline_accounts");
if (enableBootstrapTimelineAccounts) {
onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts);
}
const registrationMode = document.getElementById("form_admin_settings_registrations_mode");
if (registrationMode) {
onChangeRegistrationMode(registrationMode);
}
const checkAllElement = document.querySelector("#batch_checkbox_all");
if (checkAllElement) {
checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
}
document.querySelector("a#add-instance-button")?.addEventListener("click", (e) => {
const domain = document.querySelector("input[type=\"text\"]#by_domain")?.value;
if (domain) {
const url = new URL(event.target.href);
url.searchParams.set("_domain", domain);
e.target.href = url;
}
});
[].forEach.call(document.querySelectorAll("input[type=\"datetime-local\"]"), element => {
if (element.value) {
element.value = convertUTCDateTimeToLocal(element.value);
}
if (element.placeholder) {
element.placeholder = convertUTCDateTimeToLocal(element.placeholder);
}
});
Rails.delegate(document, "form", "submit", ({ target }) => {
[].forEach.call(target.querySelectorAll("input[type=\"datetime-local\"]"), element => {
if (element.value && element.validity.valid) {
element.value = convertLocalDatetimeToUTC(element.value);
}
});
});
const announcementStartsAt = document.querySelector("input[type=\"datetime-local\"]#announcement_starts_at");
if (announcementStartsAt) {
setAnnouncementEndsAttributes(announcementStartsAt);
}
});