mirror of
https://codeberg.org/davrot/forgejo.git
synced 2025-06-28 06:00:06 +02:00
Merge branch 'forgejo' into upload_with_path_structure
This commit is contained in:
commit
c1e5e3c834
323 changed files with 5537 additions and 3728 deletions
|
@ -123,9 +123,9 @@ export function initAdminCommon() {
|
|||
// New authentication
|
||||
if (document.querySelector('.admin.new.authentication')) {
|
||||
document.getElementById('auth_type')?.addEventListener('change', function () {
|
||||
hideElem('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls, .search-page-size, .sspi');
|
||||
hideElem('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls, .search-page-size');
|
||||
|
||||
for (const input of document.querySelectorAll('.ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required], .sspi input[required]')) {
|
||||
for (const input of document.querySelectorAll('.ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required]')) {
|
||||
input.removeAttribute('required');
|
||||
}
|
||||
|
||||
|
@ -166,12 +166,6 @@ export function initAdminCommon() {
|
|||
}
|
||||
onOAuth2Change(true);
|
||||
break;
|
||||
case '7': // SSPI
|
||||
showElem('.sspi');
|
||||
for (const input of document.querySelectorAll('.sspi div.required input')) {
|
||||
input.setAttribute('required', 'required');
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (authType === '2' || authType === '5') {
|
||||
onSecurityProtocolChange();
|
||||
|
|
|
@ -464,6 +464,6 @@ export function checkAppUrl() {
|
|||
if (curUrl.startsWith(appUrl) || `${curUrl}/` === appUrl) {
|
||||
return;
|
||||
}
|
||||
showGlobalErrorMessage(`Your ROOT_URL in app.ini is "${appUrl}", it's unlikely matching the site you are visiting.
|
||||
Mismatched ROOT_URL config causes wrong URL links for web UI/mail content/webhook notification/OAuth2 sign-in.`);
|
||||
|
||||
showGlobalErrorMessage(i18n.incorrect_root_url);
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ class ComboMarkdownEditor {
|
|||
this.setupDropzone();
|
||||
this.setupTextarea();
|
||||
this.setupTableInserter();
|
||||
this.setupLinkInserter();
|
||||
|
||||
await this.switchToUserPreference();
|
||||
|
||||
|
@ -93,6 +94,7 @@ class ComboMarkdownEditor {
|
|||
this.indentSelection(true);
|
||||
});
|
||||
this.textareaMarkdownToolbar.querySelector('button[data-md-action="new-table"]')?.setAttribute('data-modal', `div[data-markdown-table-modal-id="${elementIdCounter}"]`);
|
||||
this.textareaMarkdownToolbar.querySelector('button[data-md-action="new-link"]')?.setAttribute('data-modal', `div[data-markdown-link-modal-id="${elementIdCounter}"]`);
|
||||
|
||||
this.textarea.addEventListener('keydown', (e) => {
|
||||
if (e.shiftKey) {
|
||||
|
@ -228,6 +230,58 @@ class ComboMarkdownEditor {
|
|||
button.addEventListener('click', this.addNewTable);
|
||||
}
|
||||
|
||||
addNewLink(event) {
|
||||
const elementId = event.target.getAttribute('data-element-id');
|
||||
const newLinkModal = document.querySelector(`div[data-markdown-link-modal-id="${elementId}"]`);
|
||||
const form = newLinkModal.querySelector('div[data-selector-name="form"]');
|
||||
|
||||
// Validate input fields
|
||||
for (const currentInput of form.querySelectorAll('input')) {
|
||||
if (!currentInput.checkValidity()) {
|
||||
currentInput.reportValidity();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const url = form.querySelector('input[name="link-url"]').value;
|
||||
const description = form.querySelector('input[name="link-description"]').value;
|
||||
|
||||
const code = `[${description}](${url})`;
|
||||
|
||||
replaceTextareaSelection(document.getElementById(`_combo_markdown_editor_${elementId}`), code);
|
||||
|
||||
// Close the modal then clear its fields in case the user wants to add another one.
|
||||
newLinkModal.querySelector('button[data-selector-name="cancel-button"]').click();
|
||||
form.querySelector('input[name="link-url"]').value = '';
|
||||
form.querySelector('input[name="link-description"]').value = '';
|
||||
}
|
||||
|
||||
setupLinkInserter() {
|
||||
const newLinkModal = this.container.querySelector('div[data-modal-name="new-markdown-link"]');
|
||||
newLinkModal.setAttribute('data-markdown-link-modal-id', elementIdCounter);
|
||||
const textarea = document.getElementById(`_combo_markdown_editor_${elementIdCounter}`);
|
||||
|
||||
$(newLinkModal).modal({
|
||||
// Pre-fill the description field from the selection to create behavior similar
|
||||
// to pasting an URL over selected text.
|
||||
onShow: () => {
|
||||
const start = textarea.selectionStart;
|
||||
const end = textarea.selectionEnd;
|
||||
|
||||
if (start !== end) {
|
||||
const selection = textarea.value.slice(start ?? undefined, end ?? undefined);
|
||||
newLinkModal.querySelector('input[name="link-description"]').value = selection;
|
||||
} else {
|
||||
newLinkModal.querySelector('input[name="link-description"]').value = '';
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const button = newLinkModal.querySelector('button[data-selector-name="ok-button"]');
|
||||
button.setAttribute('data-element-id', elementIdCounter);
|
||||
button.addEventListener('click', this.addNewLink);
|
||||
}
|
||||
|
||||
prepareEasyMDEToolbarActions() {
|
||||
this.easyMDEToolbarDefault = [
|
||||
'bold', 'italic', 'strikethrough', '|', 'heading-1', 'heading-2', 'heading-3',
|
||||
|
|
|
@ -5,8 +5,6 @@ export function initUserAuthOauth2() {
|
|||
if (!outer) return;
|
||||
const inner = document.getElementById('oauth2-login-navigator-inner');
|
||||
|
||||
checkAppUrl();
|
||||
|
||||
for (const link of outer.querySelectorAll('.oauth-login-link')) {
|
||||
link.addEventListener('click', () => {
|
||||
inner.classList.add('tw-invisible');
|
||||
|
@ -20,3 +18,8 @@ export function initUserAuthOauth2() {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function initUserAuth() {
|
||||
if (!document.querySelector('.user.signin')) return;
|
||||
checkAppUrl();
|
||||
}
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
import {hideElem, showElem} from '../utils/dom.js';
|
||||
|
||||
function onPronounsDropdownUpdate() {
|
||||
const pronounsCustom = document.getElementById('label-pronouns-custom');
|
||||
const pronounsCustomInput = pronounsCustom.querySelector('input');
|
||||
const pronounsDropdown = document.getElementById('pronouns-dropdown');
|
||||
const pronounsInput = pronounsDropdown.querySelector('input');
|
||||
// must be kept in sync with `routers/web/user/setting/profile.go`
|
||||
const isCustom = !(
|
||||
pronounsInput.value === '' ||
|
||||
pronounsInput.value === 'he/him' ||
|
||||
pronounsInput.value === 'she/her' ||
|
||||
pronounsInput.value === 'they/them' ||
|
||||
pronounsInput.value === 'it/its' ||
|
||||
pronounsInput.value === 'any pronouns'
|
||||
);
|
||||
if (isCustom) {
|
||||
if (pronounsInput.value === '!') {
|
||||
pronounsCustomInput.value = '';
|
||||
} else {
|
||||
pronounsCustomInput.value = pronounsInput.value;
|
||||
}
|
||||
showElem(pronounsCustom);
|
||||
} else {
|
||||
hideElem(pronounsCustom);
|
||||
}
|
||||
}
|
||||
function onPronounsCustomUpdate() {
|
||||
const pronounsCustomInput = document.querySelector('#label-pronouns-custom input');
|
||||
const pronounsInput = document.querySelector('#pronouns-dropdown input');
|
||||
pronounsInput.value = pronounsCustomInput.value;
|
||||
}
|
||||
|
||||
export function initUserSettings() {
|
||||
if (!document.querySelectorAll('.user.settings.profile').length) return;
|
||||
|
||||
const pronounsDropdown = document.getElementById('label-pronouns');
|
||||
const pronounsCustomInput = document.querySelector('#label-pronouns-custom input');
|
||||
const pronounsInput = pronounsDropdown.querySelector('input');
|
||||
|
||||
// If JS is disabled, the page will show the custom input, as the dropdown requires JS to work.
|
||||
// JS progressively enhances the input by adding a dropdown, but it works regardless.
|
||||
pronounsCustomInput.removeAttribute('name');
|
||||
pronounsInput.setAttribute('name', 'pronouns');
|
||||
showElem(pronounsDropdown);
|
||||
|
||||
onPronounsDropdownUpdate();
|
||||
pronounsInput.addEventListener('change', onPronounsDropdownUpdate);
|
||||
pronounsCustomInput.addEventListener('input', onPronounsCustomUpdate);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue