From e166a8022a3f239938a1449a0a8ce3485f309766 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Fri, 29 Apr 2016 16:25:03 +0200 Subject: Backend for a gitignores dropdown --- app/helpers/blob_helper.rb | 4 ++++ app/models/repository.rb | 20 ++++++++++++++------ app/views/projects/blob/_editor.html.haml | 3 +++ app/views/projects/empty.html.haml | 10 +++++++--- 4 files changed, 28 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 93241b3afb7..fb1b7649465 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -184,4 +184,8 @@ module BlobHelper Other: licenses.reject(&:featured).map { |license| [license.name, license.key] } } end + + def gitignores_for_select + @gitignores_for_select ||= Gitlab::Gitignore.all + end end diff --git a/app/models/repository.rb b/app/models/repository.rb index 47a7223c723..f26278cc3af 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -472,9 +472,7 @@ class Repository def changelog cache.fetch(:changelog) do - tree(:head).blobs.find do |file| - file.name =~ /\A(changelog|history|changes|news)/i - end + file_on_head(/\A(changelog|history|changes|news)/i) end end @@ -482,9 +480,7 @@ class Repository return nil unless head_exists? cache.fetch(:license_blob) do - tree(:head).blobs.find do |file| - file.name =~ /\A(licen[sc]e|copying)(\..+|\z)/i - end + file_on_head(/\A(licen[sc]e|copying)(\..+|\z)/i) end end @@ -496,6 +492,14 @@ class Repository end end + def gitignore + return nil if !exists? || empty? + + cache.fetch(:gitignore) do + file_on_head(/\A\.gitignore\z/) + end + end + def gitlab_ci_yml return nil unless head_exists? @@ -989,4 +993,8 @@ class Repository def head_exists? exists? && !empty? && !rugged.head_unborn? end + + def file_on_head(regex) + tree(:head).blobs.find { |file| file.name =~ regex } + end end diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index fefa652a3da..eac5014b7c9 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -16,6 +16,9 @@ .license-selector.js-license-selector.hide = select_tag :license_type, grouped_options_for_select(licenses_for_select, @project.repository.license_key), include_blank: true, class: 'select2 license-select', data: {placeholder: 'Choose a license template', project: @project.name, fullname: @project.namespace.human_name} + .gitignore-selector.js-gitignore-selector.hide + = select_tag :gitignore_template, options_for_select(Gitlab::Gitignore.all), include_blank: true, class: 'select2 gitignore-select', data: {placeholder: 'Choose a .gitignore template'} + .encoding-selector = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'select2' diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 1a2e59752fe..636beb73ec2 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -15,10 +15,14 @@ If you already have files you can push them using command line instructions below. %p Otherwise you can start with adding a - = link_to "README", new_readme_path, class: 'underlined-link' + = succeed ',' do + = link_to "README", new_readme_path, class: 'underlined-link' + a + = succeed ',' do + = link_to "LICENSE", add_special_file_path(@project, file_name: 'LICENSE'), class: 'underlined-link' or a - = link_to "LICENSE", add_special_file_path(@project, file_name: 'LICENSE'), class: 'underlined-link' - file to this project. + = link_to '.gitignore', add_special_file_path(@project, file_name: '.gitignore'), class: 'underlined-link' + to this project. - if can?(current_user, :push_code, @project) %div{ class: container_class } -- cgit v1.2.1 From fab9dbb3eba55151c34fc8bc171e3670e6c7c422 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Fri, 6 May 2016 17:13:16 +0200 Subject: First import of gitignores Add .gitignore dropdown when creating a new .gitignore file Signed-off-by: Alfredo Sumaran --- app/assets/javascripts/api.js.coffee | 7 +++ .../blob/blob_gitignore_selector.js.coffee | 62 ++++++++++++++++++++++ app/assets/javascripts/blob/edit_blob.js.coffee | 1 + app/assets/stylesheets/pages/editor.scss | 21 ++++++-- app/views/projects/blob/_editor.html.haml | 6 ++- 5 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 app/assets/javascripts/blob/blob_gitignore_selector.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee index dd1bbb37551..c654f8de208 100644 --- a/app/assets/javascripts/api.js.coffee +++ b/app/assets/javascripts/api.js.coffee @@ -6,6 +6,7 @@ projects_path: "/api/:version/projects.json" labels_path: "/api/:version/projects/:id/labels" license_path: "/api/:version/licenses/:key" + gitignoretext_path: "/api/:version/gitignores/:key" group: (group_id, callback) -> url = Api.buildUrl(Api.group_path) @@ -103,6 +104,12 @@ ).done (license) -> callback(license) + gitIgnoreText: (key, callback) -> + url = Api.buildUrl(Api.gitignoretext_path).replace(':key', key) + + $.get url, (gitignore) -> + callback(gitignore) + buildUrl: (url) -> url = gon.relative_url_root + url if gon.relative_url_root? return url.replace(':version', gon.api_version) diff --git a/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee new file mode 100644 index 00000000000..b413f31da00 --- /dev/null +++ b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee @@ -0,0 +1,62 @@ +class @BlobGitIgnoreSelector + constructor: (opts) -> + { + @dropdown + @editor + @wrapper = @dropdown.parents('.gitignore-selector') + @fileNameInput = $('#file_name') + @data = @dropdown.data('filenames') + } = opts + + @dropdown.glDropdown( + data: @data, + filterable: true, + selectable: true, + search: + fields: ['text'] + clicked: @onClick.bind(@) + ) + + @toggleGitIgnoreSelector() + @bindEvents() + + bindEvents: -> + @fileNameInput + .on 'keyup blur', (e) => + @toggleGitIgnoreSelector() + + toggleGitIgnoreSelector: -> + filename = @fileNameInput.val() or $('.editor-file-name').text().trim() + @wrapper.toggleClass 'hidden', filename isnt '.gitignore' + + onClick: (item) -> + @requestIgnoreFile(item.text) + + requestIgnoreFile: (name) -> + Api.gitIgnoreText name, @requestIgnoreFileSuccess.bind(@) + + requestIgnoreFileSuccess: (gitignore) -> + @editor.setValue(gitignore.content, -1) + + # Move cursor position to end of file + row = @editor.session.getLength() - 1 + column = @editor.session.getLine(row).length + @editor.gotoLine(row + 1, column) + @editor.focus() + +class @BlobGitIgnoreSelectors + constructor: (opts) -> + _this = @ + + { + @dropdowns = $('.js-gitignore-selector') + @editor + } = opts + + @dropdowns.each -> + $dropdown = $(@) + + new BlobGitIgnoreSelector( + dropdown: $dropdown, + editor: _this.editor + ) diff --git a/app/assets/javascripts/blob/edit_blob.js.coffee b/app/assets/javascripts/blob/edit_blob.js.coffee index eea9aa972ee..f2efeb3960a 100644 --- a/app/assets/javascripts/blob/edit_blob.js.coffee +++ b/app/assets/javascripts/blob/edit_blob.js.coffee @@ -13,6 +13,7 @@ class @EditBlob @initModePanesAndLinks() new BlobLicenseSelector(@editor) + new BlobGitIgnoreSelectors(editor: @editor) initModePanesAndLinks: -> @$editModePanes = $(".js-edit-mode-pane") diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss index 8981f070a20..3030da4e6b2 100644 --- a/app/assets/stylesheets/pages/editor.scss +++ b/app/assets/stylesheets/pages/editor.scss @@ -23,7 +23,7 @@ .file-title { @extend .monospace; - line-height: 42px; + line-height: 35px; padding-top: 7px; padding-bottom: 7px; @@ -43,7 +43,7 @@ .editor-file-name { @extend .monospace; - + float: left; margin-right: 10px; } @@ -59,7 +59,22 @@ } .encoding-selector, - .license-selector { + .license-selector, + .gitignore-selector { display: inline-block; + vertical-align: top; + font-family: $regular_font; + } + + .gitignore-selector { + + .dropdown { + line-height: 21px; + } + + .dropdown-menu-toggle{ + vertical-align: top; + width: 220px; + } } } diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index eac5014b7c9..5efec92cf6b 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -16,8 +16,10 @@ .license-selector.js-license-selector.hide = select_tag :license_type, grouped_options_for_select(licenses_for_select, @project.repository.license_key), include_blank: true, class: 'select2 license-select', data: {placeholder: 'Choose a license template', project: @project.name, fullname: @project.namespace.human_name} - .gitignore-selector.js-gitignore-selector.hide - = select_tag :gitignore_template, options_for_select(Gitlab::Gitignore.all), include_blank: true, class: 'select2 gitignore-select', data: {placeholder: 'Choose a .gitignore template'} + .gitignore-selector.hidden + = dropdown_tag("Choose a .gitignore template", options: { toggle_class: 'js-gitignore-selector', title: "Choose a template", filter: true, placeholder: "Filter projects", data: { filenames: Gitlab::Gitignore.all.map.with_index{ |v| {text: v.name} } } } ) + + -# = select_tag :gitignore_template, options_for_select(Gitlab::Gitignore.all.map(&:name)), include_blank: true, class: 'select2 gitignore-select', data: {placeholder: 'Choose a .gitignore template'} .encoding-selector = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'select2' -- cgit v1.2.1 From 1f5fcb638d6b432d76a639ccc35acc94d8ae6ac7 Mon Sep 17 00:00:00 2001 From: Alfredo Sumaran Date: Wed, 11 May 2016 19:38:43 -0500 Subject: Dropdown implementation --- .../blob/blob_gitignore_selector.js.coffee | 3 +- app/assets/javascripts/gl_dropdown.js.coffee | 67 +++++++++++++++++----- app/assets/stylesheets/pages/editor.scss | 2 +- app/helpers/blob_helper.rb | 8 ++- app/views/projects/blob/_editor.html.haml | 4 +- 5 files changed, 64 insertions(+), 20 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee index b413f31da00..2112f5c855a 100644 --- a/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee +++ b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee @@ -29,7 +29,8 @@ class @BlobGitIgnoreSelector filename = @fileNameInput.val() or $('.editor-file-name').text().trim() @wrapper.toggleClass 'hidden', filename isnt '.gitignore' - onClick: (item) -> + onClick: (item, el, e) -> + e.preventDefault() @requestIgnoreFile(item.text) requestIgnoreFile: (name) -> diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee index 1d1bfeb2e77..0f2ac664ac8 100644 --- a/app/assets/javascripts/gl_dropdown.js.coffee +++ b/app/assets/javascripts/gl_dropdown.js.coffee @@ -60,9 +60,23 @@ class GitLabDropdownFilter results = data if search_text isnt '' - results = fuzzaldrinPlus.filter(data, search_text, - key: @options.keys - ) + # handle groups + if _.isArray(data) + results = fuzzaldrinPlus.filter(data, search_text, + key: @options.keys + ) + else if _.isObject(data) + results = {} + for key, group of data + tmp = fuzzaldrinPlus.filter(group, search_text, + key: @options.keys + ) + + if tmp.length + results[key] = [] + + tmp.map (item) -> + results[key].push item @options.callback results else @@ -141,8 +155,9 @@ class GitLabDropdown searchFields = if @options.search then @options.search.fields else []; if @options.data - # If data is an array - if _.isArray @options.data + # If we provided data + # data could be an array of objects or a group of arrays + if _.isObject(@options.data) and not _.isFunction(@options.data) @fullData = @options.data @parseData @options.data else @@ -230,19 +245,33 @@ class GitLabDropdown parseData: (data) -> @renderedData = data - # Render each row - html = $.map data, (obj) => - return @renderItem(obj) - if @options.filterable and data.length is 0 # render no matching results html = [@noResults()] + else + # Handle array groups + if String(data) is "[object Object]" + html = [] + for name, groupData of data + # Add header for each group + html.push(@renderItem(header: name, name)) + + @renderData(groupData, name) + .map (item) -> + html.push item + else + # Render each row + html = @renderData(data) # Render the full menu full_html = @renderMenu(html.join("")) @appendMenu(full_html) + renderData: (data, group = false) -> + $.map data, (obj, index) => + return @renderItem(obj, group, index) + shouldPropagate: (e) => if @options.multiSelect $target = $(e.target) @@ -299,11 +328,10 @@ class GitLabDropdown selector = '.dropdown-content' if @dropdown.find(".dropdown-toggle-page").length selector = ".dropdown-page-one .dropdown-content" - $(selector, @dropdown).html html # Render the row - renderItem: (data) -> + renderItem: (data, group = false, index = false) -> html = "" # Divider @@ -346,8 +374,13 @@ class GitLabDropdown if @highlight text = @highlightTextMatches(text, @filterInput.val()) + if group + groupAttrs = "data-group='#{group}' data-index='#{index}'" + else + groupAttrs = '' + html = "
  • - + #{text}
  • " @@ -377,9 +410,15 @@ class GitLabDropdown rowClicked: (el) -> fieldName = @options.fieldName - selectedIndex = el.parent().index() if @renderedData - selectedObject = @renderedData[selectedIndex] + groupName = el.data('group') + if groupName + selectedIndex = el.data('index') + selectedObject = @renderedData[groupName][selectedIndex] + else + selectedIndex = el.parent().index() + selectedObject = @renderedData[selectedIndex] + value = if @options.id then @options.id(selectedObject, el) else selectedObject.id field = @dropdown.parent().find("input[name='#{fieldName}'][value='#{value}']") if el.hasClass(ACTIVE_CLASS) diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss index 3030da4e6b2..22679c764dc 100644 --- a/app/assets/stylesheets/pages/editor.scss +++ b/app/assets/stylesheets/pages/editor.scss @@ -72,7 +72,7 @@ line-height: 21px; } - .dropdown-menu-toggle{ + .dropdown-menu-toggle { vertical-align: top; width: 220px; } diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index fb1b7649465..a3723d2c349 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -186,6 +186,12 @@ module BlobHelper end def gitignores_for_select - @gitignores_for_select ||= Gitlab::Gitignore.all + return @gitignores_for_select if defined?(@gitignores_for_select) + + @gitignores_for_select = { + Global: Gitlab::Gitignore.global.map{ |v| { text: v.name } }, + # Note that the key here doesn't cover it really + Languages: Gitlab::Gitignore.languages_frameworks.map{ |v| { text: v.name } } + } end end diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index 5efec92cf6b..678eadafe15 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -17,9 +17,7 @@ = select_tag :license_type, grouped_options_for_select(licenses_for_select, @project.repository.license_key), include_blank: true, class: 'select2 license-select', data: {placeholder: 'Choose a license template', project: @project.name, fullname: @project.namespace.human_name} .gitignore-selector.hidden - = dropdown_tag("Choose a .gitignore template", options: { toggle_class: 'js-gitignore-selector', title: "Choose a template", filter: true, placeholder: "Filter projects", data: { filenames: Gitlab::Gitignore.all.map.with_index{ |v| {text: v.name} } } } ) - - -# = select_tag :gitignore_template, options_for_select(Gitlab::Gitignore.all.map(&:name)), include_blank: true, class: 'select2 gitignore-select', data: {placeholder: 'Choose a .gitignore template'} + = dropdown_tag("Choose a .gitignore template", options: { toggle_class: 'js-gitignore-selector', title: "Choose a template", filter: true, placeholder: "Filter", data: { filenames: gitignores_for_select } } ) .encoding-selector = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'select2' -- cgit v1.2.1 From ab96ca2bf1ae72817ff5cedf1792c8f7563ebdef Mon Sep 17 00:00:00 2001 From: Alfredo Sumaran Date: Fri, 13 May 2016 10:57:03 -0500 Subject: Dropdown implementation --- app/assets/javascripts/api.js.coffee | 34 +++++++-------- .../blob/blob_gitignore_selector.js.coffee | 51 ++++++++++------------ app/assets/javascripts/blob/edit_blob.js.coffee | 2 +- app/assets/javascripts/gl_dropdown.js.coffee | 45 ++++++++++++------- app/assets/javascripts/lib/type_utility.js.coffee | 9 ++++ app/helpers/blob_helper.rb | 10 ++--- app/models/repository.rb | 6 ++- app/views/projects/blob/_editor.html.haml | 2 +- 8 files changed, 90 insertions(+), 69 deletions(-) create mode 100644 app/assets/javascripts/lib/type_utility.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee index c654f8de208..3f61ea1eaf4 100644 --- a/app/assets/javascripts/api.js.coffee +++ b/app/assets/javascripts/api.js.coffee @@ -1,15 +1,15 @@ @Api = - groups_path: "/api/:version/groups.json" - group_path: "/api/:version/groups/:id.json" - namespaces_path: "/api/:version/namespaces.json" - group_projects_path: "/api/:version/groups/:id/projects.json" - projects_path: "/api/:version/projects.json" - labels_path: "/api/:version/projects/:id/labels" - license_path: "/api/:version/licenses/:key" - gitignoretext_path: "/api/:version/gitignores/:key" + groupsPath: "/api/:version/groups.json" + groupPath: "/api/:version/groups/:id.json" + namespacesPath: "/api/:version/namespaces.json" + groupProjectsPath: "/api/:version/groups/:id/projects.json" + projectsPath: "/api/:version/projects.json" + labelsPath: "/api/:version/projects/:id/labels" + licensePath: "/api/:version/licenses/:key" + gitignorePath: "/api/:version/gitignores/:key" group: (group_id, callback) -> - url = Api.buildUrl(Api.group_path) + url = Api.buildUrl(Api.groupPath) url = url.replace(':id', group_id) $.ajax( @@ -23,7 +23,7 @@ # Return groups list. Filtered by query # Only active groups retrieved groups: (query, skip_ldap, callback) -> - url = Api.buildUrl(Api.groups_path) + url = Api.buildUrl(Api.groupsPath) $.ajax( url: url @@ -37,7 +37,7 @@ # Return namespaces list. Filtered by query namespaces: (query, callback) -> - url = Api.buildUrl(Api.namespaces_path) + url = Api.buildUrl(Api.namespacesPath) $.ajax( url: url @@ -51,7 +51,7 @@ # Return projects list. Filtered by query projects: (query, order, callback) -> - url = Api.buildUrl(Api.projects_path) + url = Api.buildUrl(Api.projectsPath) $.ajax( url: url @@ -65,7 +65,7 @@ callback(projects) newLabel: (project_id, data, callback) -> - url = Api.buildUrl(Api.labels_path) + url = Api.buildUrl(Api.labelsPath) url = url.replace(':id', project_id) data.private_token = gon.api_token @@ -81,7 +81,7 @@ # Return group projects list. Filtered by query groupProjects: (group_id, query, callback) -> - url = Api.buildUrl(Api.group_projects_path) + url = Api.buildUrl(Api.groupProjectsPath) url = url.replace(':id', group_id) $.ajax( @@ -96,7 +96,7 @@ # Return text for a specific license licenseText: (key, data, callback) -> - url = Api.buildUrl(Api.license_path).replace(':key', key) + url = Api.buildUrl(Api.licensePath).replace(':key', key) $.ajax( url: url @@ -104,8 +104,8 @@ ).done (license) -> callback(license) - gitIgnoreText: (key, callback) -> - url = Api.buildUrl(Api.gitignoretext_path).replace(':key', key) + gitignoreText: (key, callback) -> + url = Api.buildUrl(Api.gitignorePath).replace(':key', key) $.get url, (gitignore) -> callback(gitignore) diff --git a/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee index 2112f5c855a..cc8a497d081 100644 --- a/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee +++ b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee @@ -1,10 +1,10 @@ -class @BlobGitIgnoreSelector +class @BlobGitignoreSelector constructor: (opts) -> { @dropdown @editor - @wrapper = @dropdown.parents('.gitignore-selector') - @fileNameInput = $('#file_name') + @$wrapper = @dropdown.closest('.gitignore-selector') + @$filenameInput = $('#file_name') @data = @dropdown.data('filenames') } = opts @@ -13,51 +13,46 @@ class @BlobGitIgnoreSelector filterable: true, selectable: true, search: - fields: ['text'] - clicked: @onClick.bind(@) + fields: ['name'] + clicked: @onClick + text: (gitignore) -> + gitignore.name ) - @toggleGitIgnoreSelector() + @toggleGitignoreSelector() @bindEvents() bindEvents: -> - @fileNameInput + @$filenameInput .on 'keyup blur', (e) => - @toggleGitIgnoreSelector() + @toggleGitignoreSelector() - toggleGitIgnoreSelector: -> - filename = @fileNameInput.val() or $('.editor-file-name').text().trim() - @wrapper.toggleClass 'hidden', filename isnt '.gitignore' + toggleGitignoreSelector: -> + filename = @$filenameInput.val() or $('.editor-file-name').text().trim() + @$wrapper.toggleClass 'hidden', filename isnt '.gitignore' - onClick: (item, el, e) -> + onClick: (item, el, e) => e.preventDefault() - @requestIgnoreFile(item.text) + @requestIgnoreFile(item.name) requestIgnoreFile: (name) -> - Api.gitIgnoreText name, @requestIgnoreFileSuccess.bind(@) + Api.gitignoreText name, @requestIgnoreFileSuccess.bind(@) requestIgnoreFileSuccess: (gitignore) -> - @editor.setValue(gitignore.content, -1) - - # Move cursor position to end of file - row = @editor.session.getLength() - 1 - column = @editor.session.getLine(row).length - @editor.gotoLine(row + 1, column) + @editor.setValue(gitignore.content, 1) @editor.focus() -class @BlobGitIgnoreSelectors +class @BlobGitignoreSelectors constructor: (opts) -> - _this = @ - { - @dropdowns = $('.js-gitignore-selector') + @$dropdowns = $('.js-gitignore-selector') @editor } = opts - @dropdowns.each -> - $dropdown = $(@) + @$dropdowns.each (i, dropdown) => + $dropdown = $(dropdown) - new BlobGitIgnoreSelector( + new BlobGitignoreSelector( dropdown: $dropdown, - editor: _this.editor + editor: @editor ) diff --git a/app/assets/javascripts/blob/edit_blob.js.coffee b/app/assets/javascripts/blob/edit_blob.js.coffee index f2efeb3960a..79141e768b8 100644 --- a/app/assets/javascripts/blob/edit_blob.js.coffee +++ b/app/assets/javascripts/blob/edit_blob.js.coffee @@ -13,7 +13,7 @@ class @EditBlob @initModePanesAndLinks() new BlobLicenseSelector(@editor) - new BlobGitIgnoreSelectors(editor: @editor) + new BlobGitignoreSelectors(editor: @editor) initModePanesAndLinks: -> @$editModePanes = $(".js-edit-mode-pane") diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee index 0f2ac664ac8..8cb31b2dbd7 100644 --- a/app/assets/javascripts/gl_dropdown.js.coffee +++ b/app/assets/javascripts/gl_dropdown.js.coffee @@ -60,23 +60,36 @@ class GitLabDropdownFilter results = data if search_text isnt '' - # handle groups + # When data is an array of objects therefore [object Array] e.g. + # [ + # { prop: 'foo' }, + # { prop: 'baz' } + # ] if _.isArray(data) results = fuzzaldrinPlus.filter(data, search_text, key: @options.keys ) - else if _.isObject(data) - results = {} - for key, group of data - tmp = fuzzaldrinPlus.filter(group, search_text, - key: @options.keys - ) - - if tmp.length - results[key] = [] - - tmp.map (item) -> - results[key].push item + else + # If data is grouped therefore an [object Object]. e.g. + # { + # groupName1: [ + # { prop: 'foo' }, + # { prop: 'baz' } + # ], + # groupName2: [ + # { prop: 'abc' }, + # { prop: 'def' } + # ] + # } + if gl.utils.isObject data + results = {} + for key, group of data + tmp = fuzzaldrinPlus.filter(group, search_text, + key: @options.keys + ) + + if tmp.length + results[key] = tmp.map (item) -> item @options.callback results else @@ -250,7 +263,7 @@ class GitLabDropdown html = [@noResults()] else # Handle array groups - if String(data) is "[object Object]" + if gl.utils.isObject data html = [] for name, groupData of data # Add header for each group @@ -269,7 +282,7 @@ class GitLabDropdown @appendMenu(full_html) renderData: (data, group = false) -> - $.map data, (obj, index) => + data.map (obj, index) => return @renderItem(obj, group, index) shouldPropagate: (e) => @@ -416,7 +429,7 @@ class GitLabDropdown selectedIndex = el.data('index') selectedObject = @renderedData[groupName][selectedIndex] else - selectedIndex = el.parent().index() + selectedIndex = el.closest('li').index() selectedObject = @renderedData[selectedIndex] value = if @options.id then @options.id(selectedObject, el) else selectedObject.id diff --git a/app/assets/javascripts/lib/type_utility.js.coffee b/app/assets/javascripts/lib/type_utility.js.coffee new file mode 100644 index 00000000000..957f0d86b36 --- /dev/null +++ b/app/assets/javascripts/lib/type_utility.js.coffee @@ -0,0 +1,9 @@ +((w) -> + + w.gl ?= {} + w.gl.utils ?= {} + + w.gl.utils.isObject = (obj) -> + obj? and (obj.constructor is Object) + +) window diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index a3723d2c349..cec2dc753fe 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -185,13 +185,13 @@ module BlobHelper } end - def gitignores_for_select - return @gitignores_for_select if defined?(@gitignores_for_select) + def gitignore_names + return @gitignore_names if defined?(@gitignore_names) - @gitignores_for_select = { - Global: Gitlab::Gitignore.global.map{ |v| { text: v.name } }, + @gitignore_names = { + Global: Gitlab::Gitignore.global.map { |gitignore| { name: gitignore.name } }, # Note that the key here doesn't cover it really - Languages: Gitlab::Gitignore.languages_frameworks.map{ |v| { text: v.name } } + Languages: Gitlab::Gitignore.languages_frameworks.map{ |gitignore| { name: gitignore.name } } } end end diff --git a/app/models/repository.rb b/app/models/repository.rb index f26278cc3af..ecc8795c954 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -245,7 +245,7 @@ class Repository def cache_keys %i(size branch_names tag_names commit_count readme version contribution_guide changelog - license_blob license_key) + license_blob license_key gitignore) end def build_cache @@ -256,6 +256,10 @@ class Repository end end + def expire_gitignore + cache.expire(:gitignore) + end + def expire_tags_cache cache.expire(:tag_names) @tags = nil diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index 678eadafe15..4071b59c003 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -17,7 +17,7 @@ = select_tag :license_type, grouped_options_for_select(licenses_for_select, @project.repository.license_key), include_blank: true, class: 'select2 license-select', data: {placeholder: 'Choose a license template', project: @project.name, fullname: @project.namespace.human_name} .gitignore-selector.hidden - = dropdown_tag("Choose a .gitignore template", options: { toggle_class: 'js-gitignore-selector', title: "Choose a template", filter: true, placeholder: "Filter", data: { filenames: gitignores_for_select } } ) + = dropdown_tag("Choose a .gitignore template", options: { toggle_class: 'js-gitignore-selector', title: "Choose a template", filter: true, placeholder: "Filter", data: { filenames: gitignore_names } } ) .encoding-selector = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'select2' -- cgit v1.2.1