summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js')
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js b/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js
new file mode 100644
index 00000000000..68ab7021cf3
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js
@@ -0,0 +1,82 @@
+/* eslint-disable func-names */
+
+import $ from 'jquery';
+import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
+import { deprecatedCreateFlash as flash } from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
+import { __ } from '~/locale';
+import { fixTitle } from '~/tooltips';
+
+export default function initCompareAutocomplete(limitTo = null, clickHandler = () => {}) {
+ $('.js-compare-dropdown').each(function () {
+ const $dropdown = $(this);
+ const selected = $dropdown.data('selected');
+ const $dropdownContainer = $dropdown.closest('.dropdown');
+ const $fieldInput = $(`input[name="${$dropdown.data('fieldName')}"]`, $dropdownContainer);
+ const $filterInput = $('input[type="search"]', $dropdownContainer);
+ initDeprecatedJQueryDropdown($dropdown, {
+ data(term, callback) {
+ const params = {
+ ref: $dropdown.data('ref'),
+ search: term,
+ };
+
+ if (limitTo) {
+ params.find = limitTo;
+ }
+
+ axios
+ .get($dropdown.data('refsUrl'), {
+ params,
+ })
+ .then(({ data }) => {
+ if (limitTo) {
+ callback(data[capitalizeFirstCharacter(limitTo)] || []);
+ } else {
+ callback(data);
+ }
+ })
+ .catch(() => flash(__('Error fetching refs')));
+ },
+ selectable: true,
+ filterable: true,
+ filterRemote: Boolean($dropdown.data('refsUrl')),
+ fieldName: $dropdown.data('fieldName'),
+ filterInput: 'input[type="search"]',
+ renderRow(ref) {
+ const link = $('<a />')
+ .attr('href', '#')
+ .addClass(ref === selected ? 'is-active' : '')
+ .text(ref)
+ .attr('data-ref', ref);
+ if (ref.header != null) {
+ return $('<li />').addClass('dropdown-header').text(ref.header);
+ }
+ return $('<li />').append(link);
+ },
+ id(obj, $el) {
+ return $el.attr('data-ref');
+ },
+ toggleLabel(obj, $el) {
+ return $el.text().trim();
+ },
+ clicked: () => clickHandler($dropdown),
+ });
+ $filterInput.on('keyup', (e) => {
+ const keyCode = e.keyCode || e.which;
+ if (keyCode !== 13) return;
+ const text = $filterInput.val();
+ $fieldInput.val(text);
+ $('.dropdown-toggle-text', $dropdown).text(text);
+ $dropdownContainer.removeClass('open');
+ });
+
+ $dropdownContainer.on('click', '.dropdown-content a', (e) => {
+ $dropdown.prop('title', e.target.text.replace(/_+?/g, '-'));
+ if ($dropdown.hasClass('has-tooltip')) {
+ fixTitle($dropdown);
+ }
+ });
+ });
+}