Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Eastwood <contact@ericeastwood.com>2018-01-12 10:32:41 +0300
committerEric Eastwood <contact@ericeastwood.com>2018-01-12 10:46:45 +0300
commitb63686ce6ae96a6fca915d82b918f38b23c4a399 (patch)
treea2191dd53cf63b74ddd0f18b4e9ccc3b16e5be31 /app/assets/javascripts/create_item_dropdown.js
parentab28ea071ba7f70e59e8aeba9da03031dd83b0f1 (diff)
Generalize protected branch/tag dropdowns
Remove duplicate ee code This was generalized for usage in the new variable table design, see https://gitlab.com/gitlab-org/gitlab-ce/issues/39118#note_53615249 Conflicts: app/assets/stylesheets/pages/projects.scss ee/app/assets/javascripts/protected_branches/protected_branch_create.js ee/app/assets/javascripts/protected_tags/protected_tag_create.js ee/app/views/projects/protected_branches/ee/_dropdown.html.haml
Diffstat (limited to 'app/assets/javascripts/create_item_dropdown.js')
-rw-r--r--app/assets/javascripts/create_item_dropdown.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/app/assets/javascripts/create_item_dropdown.js b/app/assets/javascripts/create_item_dropdown.js
new file mode 100644
index 00000000000..c3eceb285f5
--- /dev/null
+++ b/app/assets/javascripts/create_item_dropdown.js
@@ -0,0 +1,91 @@
+import _ from 'underscore';
+
+export default class CreateItemDropdown {
+ /**
+ * @param {Object} options containing
+ * `$dropdown` target element
+ * `onSelect` event callback
+ * $dropdown must be an element created using `dropdown_tag()` rails helper
+ */
+ constructor(options) {
+ this.defaultToggleLabel = options.defaultToggleLabel;
+ this.fieldName = options.fieldName;
+ this.onSelect = options.onSelect || (() => {});
+ this.getDataOption = options.getData;
+ this.$dropdown = options.$dropdown;
+ this.$dropdownContainer = this.$dropdown.parent();
+ this.$dropdownFooter = this.$dropdownContainer.find('.dropdown-footer');
+ this.$createButton = this.$dropdownContainer.find('.js-dropdown-create-new-item');
+
+ this.buildDropdown();
+ this.bindEvents();
+
+ // Hide footer
+ this.toggleFooter(true);
+ }
+
+ buildDropdown() {
+ this.$dropdown.glDropdown({
+ data: this.getData.bind(this),
+ filterable: true,
+ remote: false,
+ search: {
+ fields: ['title'],
+ },
+ selectable: true,
+ toggleLabel(selected) {
+ return (selected && 'id' in selected) ? selected.title : this.defaultToggleLabel;
+ },
+ fieldName: this.fieldName,
+ text(item) {
+ return _.escape(item.title);
+ },
+ id(item) {
+ return _.escape(item.id);
+ },
+ onFilter: this.toggleCreateNewButton.bind(this),
+ clicked: (options) => {
+ options.e.preventDefault();
+ this.onSelect();
+ },
+ });
+ }
+
+ bindEvents() {
+ this.$createButton.on('click', this.onClickCreateWildcard.bind(this));
+ }
+
+ onClickCreateWildcard(e) {
+ e.preventDefault();
+
+ // Refresh the dropdown's data, which ends up calling `getData`
+ this.$dropdown.data('glDropdown').remote.execute();
+ this.$dropdown.data('glDropdown').selectRowAtIndex();
+ }
+
+ getData(term, callback) {
+ this.getDataOption(term, (data = []) => {
+ callback(data.concat(this.selectedItem || []));
+ });
+ }
+
+ toggleCreateNewButton(item) {
+ if (item) {
+ this.selectedItem = {
+ title: item,
+ id: item,
+ text: item,
+ };
+
+ this.$dropdownContainer
+ .find('.js-dropdown-create-new-item code')
+ .text(item);
+ }
+
+ this.toggleFooter(!item);
+ }
+
+ toggleFooter(toggleState) {
+ this.$dropdownFooter.toggleClass('hidden', toggleState);
+ }
+}