replace jquery-minicolors with coloris (#30055)
Get rid of one more jQuery dependant and have a nicer color picker as well. Now there is only a single global color picker init because that is all that's necessary because the elements are present on the page when the init code runs. The init is slightly weird because the module only takes a selector instead of DOM elements directly. The label modals now also perform form validation because previously it was possible to trigger a 500 error `Color cannot be empty.` by clearing out the color value on labels. <img width="867" alt="Screenshot 2024-03-25 at 00 21 05" src="71215c39
-abb1-4881-b5c1-9954b4a89adb"> <img width="860" alt="Screenshot 2024-03-25 at 00 20 48" src="a12cb68f
-c38b-4433-ba05-53bbb4b1023e"> (cherry picked from commit dd8dde2be89921b2b1497c6cc5eafdde213429cb)
This commit is contained in:
parent
16696a42f5
commit
2e542f17a3
18 changed files with 224 additions and 106 deletions
|
@ -1,12 +1,31 @@
|
|||
import $ from 'jquery';
|
||||
export async function initColorPickers(selector = '.js-color-picker-input input', opts = {}) {
|
||||
const inputEls = document.querySelectorAll(selector);
|
||||
if (!inputEls.length) return;
|
||||
|
||||
export async function createColorPicker(els) {
|
||||
if (!els.length) return;
|
||||
|
||||
await Promise.all([
|
||||
import(/* webpackChunkName: "minicolors" */'@claviska/jquery-minicolors'),
|
||||
import(/* webpackChunkName: "minicolors" */'@claviska/jquery-minicolors/jquery.minicolors.css'),
|
||||
const [{coloris, init}] = await Promise.all([
|
||||
import(/* webpackChunkName: "colorpicker" */'@melloware/coloris'),
|
||||
import(/* webpackChunkName: "colorpicker" */'../../css/features/colorpicker.css'),
|
||||
]);
|
||||
|
||||
return $(els).minicolors();
|
||||
init();
|
||||
coloris({
|
||||
el: selector,
|
||||
alpha: false,
|
||||
focusInput: true,
|
||||
selectInput: false,
|
||||
...opts,
|
||||
});
|
||||
|
||||
for (const inputEl of inputEls) {
|
||||
const parent = inputEl.closest('.js-color-picker-input');
|
||||
// prevent tabbing on the color preview `button` inside the input
|
||||
parent.querySelector('button').tabIndex = -1;
|
||||
// init precolors
|
||||
for (const el of parent.querySelectorAll('.precolors .color')) {
|
||||
el.addEventListener('click', (e) => {
|
||||
inputEl.value = e.target.getAttribute('data-color-hex');
|
||||
inputEl.dispatchEvent(new Event('input', {bubbles: true}));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ import $ from 'jquery';
|
|||
import '../vendor/jquery.are-you-sure.js';
|
||||
import {clippie} from 'clippie';
|
||||
import {createDropzone} from './dropzone.js';
|
||||
import {initCompColorPicker} from './comp/ColorPicker.js';
|
||||
import {showGlobalErrorMessage} from '../bootstrap.js';
|
||||
import {handleGlobalEnterQuickSubmit} from './comp/QuickSubmit.js';
|
||||
import {svg} from '../svg.js';
|
||||
|
@ -379,10 +378,7 @@ function initGlobalShowModal() {
|
|||
$attrTarget.text(attrib.value); // FIXME: it should be more strict here, only handle div/span/p
|
||||
}
|
||||
}
|
||||
const $colorPickers = $modal.find('.color-picker');
|
||||
if ($colorPickers.length > 0) {
|
||||
initCompColorPicker(); // FIXME: this might cause duplicate init
|
||||
}
|
||||
|
||||
$modal.modal('setting', {
|
||||
onApprove: () => {
|
||||
// "form-fetch-action" can handle network errors gracefully,
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
import $ from 'jquery';
|
||||
import {createColorPicker} from '../colorpicker.js';
|
||||
|
||||
export function initCompColorPicker() {
|
||||
(async () => {
|
||||
await createColorPicker(document.querySelectorAll('.color-picker'));
|
||||
|
||||
for (const el of document.querySelectorAll('.precolors .color')) {
|
||||
el.addEventListener('click', (e) => {
|
||||
const color = e.target.getAttribute('data-color-hex');
|
||||
const parent = e.target.closest('.color.picker');
|
||||
$(parent.querySelector('.color-picker')).minicolors('value', color);
|
||||
});
|
||||
}
|
||||
})();
|
||||
}
|
|
@ -1,5 +1,4 @@
|
|||
import $ from 'jquery';
|
||||
import {initCompColorPicker} from './ColorPicker.js';
|
||||
|
||||
function isExclusiveScopeName(name) {
|
||||
return /.*[^/]\/[^/].*/.test(name);
|
||||
|
@ -28,13 +27,17 @@ function updateExclusiveLabelEdit(form) {
|
|||
|
||||
export function initCompLabelEdit(selector) {
|
||||
if (!$(selector).length) return;
|
||||
initCompColorPicker();
|
||||
|
||||
// Create label
|
||||
$('.new-label.button').on('click', () => {
|
||||
updateExclusiveLabelEdit('.new-label');
|
||||
$('.new-label.modal').modal({
|
||||
onApprove() {
|
||||
const form = document.querySelector('.new-label.form');
|
||||
if (!form.checkValidity()) {
|
||||
form.reportValidity();
|
||||
return false;
|
||||
}
|
||||
$('.new-label.form').trigger('submit');
|
||||
},
|
||||
}).modal('show');
|
||||
|
@ -60,10 +63,18 @@ export function initCompLabelEdit(selector) {
|
|||
updateExclusiveLabelEdit('.edit-label');
|
||||
|
||||
$('.edit-label .label-desc-input').val(this.getAttribute('data-description'));
|
||||
$('.edit-label .color-picker').minicolors('value', this.getAttribute('data-color'));
|
||||
|
||||
const colorInput = document.querySelector('.edit-label .js-color-picker-input input');
|
||||
colorInput.value = this.getAttribute('data-color');
|
||||
colorInput.dispatchEvent(new Event('input', {bubbles: true}));
|
||||
|
||||
$('.edit-label.modal').modal({
|
||||
onApprove() {
|
||||
const form = document.querySelector('.edit-label.form');
|
||||
if (!form.checkValidity()) {
|
||||
form.reportValidity();
|
||||
return false;
|
||||
}
|
||||
$('.edit-label.form').trigger('submit');
|
||||
},
|
||||
}).modal('show');
|
||||
|
|
|
@ -86,6 +86,7 @@ import {initRepoRecentCommits} from './features/recent-commits.js';
|
|||
import {initRepoDiffCommitBranchesAndTags} from './features/repo-diff-commit.js';
|
||||
import {initDirAuto} from './modules/dirauto.js';
|
||||
import {initRepositorySearch} from './features/repo-search.js';
|
||||
import {initColorPickers} from './features/colorpicker.js';
|
||||
|
||||
// Init Gitea's Fomantic settings
|
||||
initGiteaFomantic();
|
||||
|
@ -188,4 +189,5 @@ onDomReady(() => {
|
|||
initRepoDiffView();
|
||||
initPdfViewer();
|
||||
initScopedAccessTokenCategories();
|
||||
initColorPickers();
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue