diff options
author | kushalpandya <kushal@gitlab.com> | 2017-04-21 15:45:57 +0300 |
---|---|---|
committer | kushalpandya <kushal@gitlab.com> | 2017-05-09 12:00:30 +0300 |
commit | b36adc8df093f66f6216466dbe5f4151e61d75c4 (patch) | |
tree | d10c12f23d9e78f3a2d3eeb44d43f3d288f55b53 | |
parent | 46dd6f3d9eca8a42d7d3ed9f159bcc7274571685 (diff) |
Shared ProtectedRefDropdown class
-rw-r--r-- | app/assets/javascripts/protected_refs/protected_ref_dropdown.js | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/app/assets/javascripts/protected_refs/protected_ref_dropdown.js b/app/assets/javascripts/protected_refs/protected_ref_dropdown.js new file mode 100644 index 00000000000..f6ea4b0ae67 --- /dev/null +++ b/app/assets/javascripts/protected_refs/protected_ref_dropdown.js @@ -0,0 +1,97 @@ +export default class ProtectedRefDropdown { + /** + * @param {Object} options containing + * `$dropdown` target element + * `onSelect` event callback + * $dropdown must be an element created using `dropdown_tag()` rails helper + * + * @param {Object} config containing + * `$dropdownFooter` element + * `$createNewProtectedRef` element + * `protectedRefFieldName` string + * `dropdownLabel` string + * `protectedRefsList` array + */ + constructor(options, config) { + this.onSelect = options.onSelect; + this.$dropdown = options.$dropdown; + this.$dropdownContainer = this.$dropdown.parent(); + + this.$dropdownFooter = config.$dropdownFooter; + this.$createNewProtectedRef = config.$createNewProtectedRef; + this.protectedRefsList = config.protectedRefsList; + + this.buildDropdown(config); + this.bindEvents(); + + // Hide footer + this.toggleFooter(true); + } + + buildDropdown(config) { + const { dropdownLabel, protectedRefFieldName } = config; + + this.$dropdown.glDropdown({ + data: this.getProtectedRefs.bind(this), + filterable: true, + remote: false, + search: { + fields: ['title'], + }, + selectable: true, + fieldName: protectedRefFieldName, + onFilter: this.toggleCreateNewButton.bind(this), + toggleLabel(selected) { + return (selected && 'id' in selected) ? selected.title : dropdownLabel; + }, + text(protectedRef) { + return _.escape(protectedRef.title); + }, + id(protectedRef) { + return _.escape(protectedRef.id); + }, + clicked: (item, $el, e) => { + e.preventDefault(); + this.onSelect(); + }, + }); + } + + bindEvents() { + this.$createNewProtectedRef.on('click', this.onClickCreateWildcard.bind(this)); + } + + onClickCreateWildcard(e) { + e.preventDefault(); + + // Refresh the dropdown's data, which ends up calling `getProtectedRefs` + this.$dropdown.data('glDropdown').remote.execute(); + this.$dropdown.data('glDropdown').selectRowAtIndex(); + } + + getProtectedRefs(term, callback) { + if (this.selectedRef) { + callback(this.protectedRefsList.concat(this.selectedRef)); + } else { + callback(this.protectedRefsList); + } + } + + toggleCreateNewButton(refName) { + if (refName) { + this.selectedRef = { + title: refName, + id: refName, + text: refName, + }; + + this.$createNewProtectedRef.find('code').text(refName); + } + + this.toggleFooter(!refName); + } + + toggleFooter(toggleState) { + this.$dropdownFooter.toggleClass('hidden', toggleState); + } +} |