/* eslint-disable class-methods-use-this */ const SELECT_ITEM_MSG = 'Select'; class TargetBranchDropDown { constructor(dropdown) { this.dropdown = dropdown; this.$dropdown = $(dropdown); this.fieldName = this.dropdown.getAttribute('data-field-name'); this.form = this.dropdown.closest('form'); this.createDropdown(); } static bootstrap() { const dropdowns = document.querySelectorAll('.js-project-branches-dropdown'); [].forEach.call(dropdowns, dropdown => new TargetBranchDropDown(dropdown)); } createDropdown() { const self = this; this.$dropdown.glDropdown({ selectable: true, filterable: true, search: { fields: ['title'], }, data: (term, callback) => $.ajax({ url: self.dropdown.getAttribute('data-refs-url'), data: { ref: self.dropdown.getAttribute('data-ref'), show_all: true, }, dataType: 'json', }).done(refs => callback(self.dropdownData(refs))), toggleLabel(item, el) { if (el.is('.is-active')) { return item.text; } return SELECT_ITEM_MSG; }, clicked(item, el, e) { e.preventDefault(); self.onClick.call(self); }, fieldName: self.fieldName, }); return new gl.CreateBranchDropdown(this.form.querySelector('.dropdown-new-branch'), this); } onClick() { this.enableSubmit(); this.$dropdown.trigger('change.branch'); } enableSubmit() { const submitBtn = this.form.querySelector('[type="submit"]'); if (this.branchInput && this.branchInput.value) { submitBtn.removeAttribute('disabled'); } else { submitBtn.setAttribute('disabled', ''); } } dropdownData(refs) { const branchList = this.dropdownItems(refs); this.cachedRefs = refs; this.addDefaultBranch(branchList); this.addNewBranch(branchList); return { Branches: branchList }; } dropdownItems(refs) { return refs.map(this.dropdownItem); } dropdownItem(ref) { return { id: ref, text: ref, title: ref }; } addDefaultBranch(branchList) { // when no branch is selected do nothing if (!this.branchInput) { return; } const branchInputVal = this.branchInput.value; const currentBranchIndex = this.searchBranch(branchList, branchInputVal); if (currentBranchIndex === -1) { this.unshiftBranch(branchList, this.dropdownItem(branchInputVal)); } } addNewBranch(branchList) { if (this.newBranch) { this.unshiftBranch(branchList, this.newBranch); } } searchBranch(branchList, branchName) { return _.findIndex(branchList, el => branchName === el.id); } unshiftBranch(branchList, branch) { const branchIndex = this.searchBranch(branchList, branch.id); if (branchIndex === -1) { branchList.unshift(branch); } } setNewBranch(newBranchName) { this.newBranch = this.dropdownItem(newBranchName); this.refreshData(); this.selectBranch(this.searchBranch(this.glDropdown.fullData.Branches, newBranchName)); } refreshData() { this.glDropdown.fullData = this.dropdownData(this.cachedRefs); this.clearFilter(); } clearFilter() { // apply an empty filter in order to refresh the data this.glDropdown.filter.filter(''); this.dropdown.closest('.dropdown').querySelector('.dropdown-page-one .dropdown-input-field').value = ''; } selectBranch(index) { const branch = this.dropdown.closest('.dropdown').querySelectorAll('li a')[index]; if (!branch.classList.contains('is-active')) { branch.click(); } else { this.closeDropdown(); } } closeDropdown() { this.dropdown.closest('.dropdown').querySelector('.dropdown-menu-close').click(); } get branchInput() { return this.form.querySelector(`input[name="${this.fieldName}"]`); } get glDropdown() { return this.$dropdown.data('glDropdown'); } } window.gl = window.gl || {}; gl.TargetBranchDropDown = TargetBranchDropDown;