aboutsummaryrefslogtreecommitdiffstats
path: root/web_src/js/features/comp/LabelEdit.ts
diff options
context:
space:
mode:
Diffstat (limited to 'web_src/js/features/comp/LabelEdit.ts')
-rw-r--r--web_src/js/features/comp/LabelEdit.ts96
1 files changed, 96 insertions, 0 deletions
diff --git a/web_src/js/features/comp/LabelEdit.ts b/web_src/js/features/comp/LabelEdit.ts
new file mode 100644
index 0000000000..2cc75cc6b0
--- /dev/null
+++ b/web_src/js/features/comp/LabelEdit.ts
@@ -0,0 +1,96 @@
+import $ from 'jquery';
+
+function isExclusiveScopeName(name) {
+ return /.*[^/]\/[^/].*/.test(name);
+}
+
+function updateExclusiveLabelEdit(form) {
+ const nameInput = document.querySelector(`${form} .label-name-input`);
+ const exclusiveField = document.querySelector(`${form} .label-exclusive-input-field`);
+ const exclusiveCheckbox = document.querySelector(`${form} .label-exclusive-input`);
+ const exclusiveWarning = document.querySelector(`${form} .label-exclusive-warning`);
+
+ if (isExclusiveScopeName(nameInput.value)) {
+ exclusiveField?.classList.remove('muted');
+ exclusiveField?.removeAttribute('aria-disabled');
+ if (exclusiveCheckbox.checked && exclusiveCheckbox.getAttribute('data-exclusive-warn')) {
+ exclusiveWarning?.classList.remove('tw-hidden');
+ } else {
+ exclusiveWarning?.classList.add('tw-hidden');
+ }
+ } else {
+ exclusiveField?.classList.add('muted');
+ exclusiveField?.setAttribute('aria-disabled', 'true');
+ exclusiveWarning?.classList.add('tw-hidden');
+ }
+}
+
+export function initCompLabelEdit(selector) {
+ if (!$(selector).length) return;
+
+ // 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');
+ return false;
+ });
+
+ // Edit label
+ $('.edit-label-button').on('click', function () {
+ $('#label-modal-id').val($(this).data('id'));
+
+ const $nameInput = $('.edit-label .label-name-input');
+ $nameInput.val($(this).data('title'));
+
+ const $isArchivedCheckbox = $('.edit-label .label-is-archived-input');
+ $isArchivedCheckbox[0].checked = this.hasAttribute('data-is-archived');
+
+ const $exclusiveCheckbox = $('.edit-label .label-exclusive-input');
+ $exclusiveCheckbox[0].checked = this.hasAttribute('data-exclusive');
+ // Warn when label was previously not exclusive and used in issues
+ $exclusiveCheckbox.data('exclusive-warn',
+ $(this).data('num-issues') > 0 &&
+ (!this.hasAttribute('data-exclusive') || !isExclusiveScopeName($nameInput.val())));
+ updateExclusiveLabelEdit('.edit-label');
+
+ $('.edit-label .label-desc-input').val(this.getAttribute('data-description'));
+
+ 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');
+ return false;
+ });
+
+ $('.new-label .label-name-input').on('input', () => {
+ updateExclusiveLabelEdit('.new-label');
+ });
+ $('.new-label .label-exclusive-input').on('change', () => {
+ updateExclusiveLabelEdit('.new-label');
+ });
+ $('.edit-label .label-name-input').on('input', () => {
+ updateExclusiveLabelEdit('.edit-label');
+ });
+ $('.edit-label .label-exclusive-input').on('change', () => {
+ updateExclusiveLabelEdit('.edit-label');
+ });
+}