From dfadbe5e45c54a0e76cb712ba8851c72bc83851f Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Tue, 29 Mar 2016 10:52:25 -0400 Subject: Initial mutli label filter --- app/assets/javascripts/issues.js.coffee | 2 ++ app/assets/javascripts/labels_select.js.coffee | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index 0d9f2094c2a..084ae6e7efd 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -52,7 +52,9 @@ filterResults: (form) => $('.issues-holder, .merge-requests-holder').css("opacity", '0.5') formAction = form.attr('action') + console.log form.find("input[type='hidden'][name='label_names[]']") formData = form.serialize() + console.log 'formData', formData issuesUrl = formAction issuesUrl += ("#{if formAction.indexOf("?") < 0 then '?' else '&'}") issuesUrl += formData diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index bc80980acb7..f864f4fd468 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -234,11 +234,20 @@ class @LabelsSelect label.id hidden: -> + page = $('body').data 'page' + isIssueIndex = page is 'projects:issues:index' + isMRIndex = page is page is 'projects:merge_requests:index' + $selectbox.hide() # display:block overrides the hide-collapse rule $value.removeAttr('style') if $dropdown.hasClass 'js-multiselect' - saveLabelData() + if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) + Issues.filterResults $dropdown.closest('form') + else if $dropdown.hasClass('js-filter-submit') + $dropdown.closest('form').submit() + else + saveLabelData() multiSelect: $dropdown.hasClass 'js-multiselect' clicked: (label) -> -- cgit v1.2.1 From 19b9df2d4fe73bb30de1711a15664eedb2e46afa Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 7 Apr 2016 12:47:32 -0400 Subject: storing multiple values for comma seperation --- app/assets/javascripts/issues.js.coffee | 6 ++---- app/assets/javascripts/labels_select.js.coffee | 16 +++++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index 084ae6e7efd..dca5bc55eb2 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -49,16 +49,14 @@ Issues.filterResults $("#issue_search_form") , 500) - filterResults: (form) => + filterResults: (form, inputs) => + console.log('form', form) $('.issues-holder, .merge-requests-holder').css("opacity", '0.5') formAction = form.attr('action') - console.log form.find("input[type='hidden'][name='label_names[]']") formData = form.serialize() - console.log 'formData', formData issuesUrl = formAction issuesUrl += ("#{if formAction.indexOf("?") < 0 then '?' else '&'}") issuesUrl += formData - $.ajax type: "GET" url: formAction diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index f864f4fd468..9e66f8ae961 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -243,7 +243,10 @@ class @LabelsSelect $value.removeAttr('style') if $dropdown.hasClass 'js-multiselect' if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) - Issues.filterResults $dropdown.closest('form') + selectedLabels = $dropdown + .closest('form') + .find("input[type='hidden'][name='#{$dropdown.data('field-name')}']") + Issues.filterResults $dropdown.closest('form'), selectedLabels else if $dropdown.hasClass('js-filter-submit') $dropdown.closest('form').submit() else @@ -254,15 +257,18 @@ class @LabelsSelect page = $('body').data 'page' isIssueIndex = page is 'projects:issues:index' isMRIndex = page is page is 'projects:merge_requests:index' - + console.log 'clicked' if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) - selectedLabel = label.title - - Issues.filterResults $dropdown.closest('form') + if not $dropdown.hasClass 'js-multiselect' + selectedLabel = label.title + Issues.filterResults $dropdown.closest('form') else if $dropdown.hasClass 'js-filter-submit' + console.log 'clicked else if' $dropdown.closest('form').submit() else + console.log 'clicked else' if $dropdown.hasClass 'js-multiselect' + console.log 'clicked else --> if' return else saveLabelData() -- cgit v1.2.1 From e684480eebe803c21545b3a8ea5a972c54ba7ea4 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 7 Apr 2016 14:57:21 -0400 Subject: Proper selecting multiple labels. --- app/assets/javascripts/issues.js.coffee | 44 ++++++++++++++++++++++++-- app/assets/javascripts/labels_select.js.coffee | 13 ++++---- 2 files changed, 48 insertions(+), 9 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index dca5bc55eb2..40a89d8c2f4 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -49,11 +49,49 @@ Issues.filterResults $("#issue_search_form") , 500) - filterResults: (form, inputs) => - console.log('form', form) + filterResults: (form) => + # Assume for now there is only 1 multi select field + # Find the hidden inputs with square brackets + $multiInputs = form.find('input[name$="[]"]') + if $multiInputs.length + # get the name of one of them + multiInputName = $multiInputs + .first() + .attr('name') + + # get the singular name by + # removing the square brackets from the name + singularName = multiInputName.replace('[]','') + # clone the form so we can mess around with it. + $clonedForm = form.clone() + + # get those inputs from the cloned form + $inputs = $clonedForm + .find("input[name='#{multiInputName}']") + + # make a comma seperated list of labels + commaSeperated = $inputs + .map( -> $(this).val()) + .get() + .join(',') + # append on a hidden input with the comma + # seperated values in it + $clonedForm.append( + $('') + .attr('type','hidden') + .attr('name', singularName) + .val(commaSeperated) + ) + # remove the multi inputs from the + # cloned form so they don't get serialized + $inputs.remove() + # serialize the cloned form + formData = $clonedForm.serialize() + else + formData = form.serialize() + $('.issues-holder, .merge-requests-holder').css("opacity", '0.5') formAction = form.attr('action') - formData = form.serialize() issuesUrl = formAction issuesUrl += ("#{if formAction.indexOf("?") < 0 then '?' else '&'}") issuesUrl += formData diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index 9e66f8ae961..9cebc26e668 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -6,7 +6,7 @@ class @LabelsSelect labelUrl = $dropdown.data('labels') issueUpdateURL = $dropdown.data('issueUpdate') selectedLabel = $dropdown.data('selected') - if selectedLabel? + if selectedLabel? and not $dropdown.hasClass 'js-multiselect' selectedLabel = selectedLabel.split(',') newLabelField = $('#new_label_name') newColorField = $('#new_label_color') @@ -246,7 +246,12 @@ class @LabelsSelect selectedLabels = $dropdown .closest('form') .find("input[type='hidden'][name='#{$dropdown.data('field-name')}']") - Issues.filterResults $dropdown.closest('form'), selectedLabels + Issues.filterResults( + $dropdown.closest('form'), + selectedLabels, + $dropdown.data('singularFieldName'), + $dropdown.data('fieldName') + ) else if $dropdown.hasClass('js-filter-submit') $dropdown.closest('form').submit() else @@ -257,18 +262,14 @@ class @LabelsSelect page = $('body').data 'page' isIssueIndex = page is 'projects:issues:index' isMRIndex = page is page is 'projects:merge_requests:index' - console.log 'clicked' if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) if not $dropdown.hasClass 'js-multiselect' selectedLabel = label.title Issues.filterResults $dropdown.closest('form') else if $dropdown.hasClass 'js-filter-submit' - console.log 'clicked else if' $dropdown.closest('form').submit() else - console.log 'clicked else' if $dropdown.hasClass 'js-multiselect' - console.log 'clicked else --> if' return else saveLabelData() -- cgit v1.2.1 From 1617d1e0267f389e040772bfed0dd29e34b25c06 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Fri, 8 Apr 2016 14:23:51 -0400 Subject: Move functionality to label[] --- app/assets/javascripts/issues.js.coffee | 41 ++------------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index 40a89d8c2f4..fc9f6301bcc 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -50,45 +50,8 @@ , 500) filterResults: (form) => - # Assume for now there is only 1 multi select field - # Find the hidden inputs with square brackets - $multiInputs = form.find('input[name$="[]"]') - if $multiInputs.length - # get the name of one of them - multiInputName = $multiInputs - .first() - .attr('name') - - # get the singular name by - # removing the square brackets from the name - singularName = multiInputName.replace('[]','') - # clone the form so we can mess around with it. - $clonedForm = form.clone() - - # get those inputs from the cloned form - $inputs = $clonedForm - .find("input[name='#{multiInputName}']") - - # make a comma seperated list of labels - commaSeperated = $inputs - .map( -> $(this).val()) - .get() - .join(',') - # append on a hidden input with the comma - # seperated values in it - $clonedForm.append( - $('') - .attr('type','hidden') - .attr('name', singularName) - .val(commaSeperated) - ) - # remove the multi inputs from the - # cloned form so they don't get serialized - $inputs.remove() - # serialize the cloned form - formData = $clonedForm.serialize() - else - formData = form.serialize() + + formData = form.serialize() $('.issues-holder, .merge-requests-holder').css("opacity", '0.5') formAction = form.attr('action') -- cgit v1.2.1 From 42e0625dfb2a791affd592df1f879083702e6f86 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Sat, 9 Apr 2016 00:09:09 -0400 Subject: Filter by multiple labels with little animation. --- app/assets/javascripts/issues.js.coffee | 36 +++++++++++++++++++++++++- app/assets/javascripts/labels_select.js.coffee | 9 +++---- app/assets/javascripts/lib/animate.js.coffee | 32 ++++++++++++++++++++--- 3 files changed, 67 insertions(+), 10 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index fc9f6301bcc..320b92d2a60 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -1,5 +1,6 @@ @Issues = init: -> + Issues.initTemplates() Issues.initSearch() Issues.initChecks() @@ -15,6 +16,15 @@ else $(this).html totalIssues - 1 + initTemplates: -> + Issue.labelRow = _.template( + '<% _.each(labels, function(label){ %> + + <%= label.title %> + + <% }); %>' + ) + reload: -> Issues.initChecks() $('#filter_issue_search').val($('#issue_search').val()) @@ -50,7 +60,6 @@ , 500) filterResults: (form) => - formData = form.serialize() $('.issues-holder, .merge-requests-holder').css("opacity", '0.5') @@ -70,6 +79,31 @@ history.replaceState {page: issuesUrl}, document.title, issuesUrl Issues.reload() Issues.updateStateFilters() + $filteredLabels = $('.filtered-labels') + $filteredLabelsSpans = $filteredLabels.find('span') + gl.animate.animateEach( + $filteredLabelsSpans, + 'fadeOutDown', 20, { + cssStart: { + opacity: 1 + }, + cssEnd: { + opacity: 0 + } + }).then( -> + $filteredLabels.html(Issue.labelRow(data)) + $spans = $filteredLabels.find('span') + $spans.css('opacity',0) + return gl.animate.animateEach($spans, 'fadeInUp', 20, { + cssStart: { + opacity: 0 + }, + cssEnd: { + opacity: 1 + } + }) + ) + dataType: "json" checkChanged: -> diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index 9cebc26e668..97a813577ed 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -16,6 +16,7 @@ class @LabelsSelect abilityName = $dropdown.data('ability-name') $selectbox = $dropdown.closest('.selectbox') $block = $selectbox.closest('.block') + $form = $dropdown.closest('form') $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span') $value = $block.find('.value') $loading = $block.find('.block-loading').fadeOut() @@ -171,7 +172,7 @@ class @LabelsSelect .find('a') .each((i) -> setTimeout(=> - glAnimate($(@), 'pulse') + gl.animate.animate($(@), 'pulse') ,200 * i ) ) @@ -201,9 +202,9 @@ class @LabelsSelect renderRow: (label) -> selectedClass = '' - if $selectbox.find("input[type='hidden']\ + if $form.find("input[type='hidden']\ [name='#{$dropdown.data('field-name')}']\ - [value='#{label.id}']").length + [value='#{this.id(label)}']").length selectedClass = 'is-active' color = if label.color? then "" else "" @@ -248,8 +249,6 @@ class @LabelsSelect .find("input[type='hidden'][name='#{$dropdown.data('field-name')}']") Issues.filterResults( $dropdown.closest('form'), - selectedLabels, - $dropdown.data('singularFieldName'), $dropdown.data('fieldName') ) else if $dropdown.hasClass('js-filter-submit') diff --git a/app/assets/javascripts/lib/animate.js.coffee b/app/assets/javascripts/lib/animate.js.coffee index 8f892b5a2b9..64aef4c6d43 100644 --- a/app/assets/javascripts/lib/animate.js.coffee +++ b/app/assets/javascripts/lib/animate.js.coffee @@ -1,13 +1,37 @@ ((w) -> + if not w.gl? then w.gl = {} + if not gl.animate? then gl.animate = {} - w.glAnimate = ($el, animation, done) -> + gl.animate.animate = ($el, animation, options, done) -> + if options?.cssStart? + $el.css(options.cssStart) $el - .removeClass() + .removeClass(animation + ' animated') .addClass(animation + ' animated') .one 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', -> - $(this).removeClass() + $(this).removeClass(animation + ' animated') + if done? + done() + if options?.cssEnd? + $el.css(options.cssEnd) return return - return + gl.animate.animateEach = ($els, animation, time, options, done) -> + dfd = $.Deferred() + $els.each((i) -> + setTimeout(=> + $this = $(@) + gl.animate.animate($this, animation, options, => + if i is $els.length - 1 + dfd.resolve() + if done? + done() + ) + ,time * i + ) + return + ) + return dfd.promise() + return ) window \ No newline at end of file -- cgit v1.2.1 From 6745e58f8f809a6813ac42fcd2ac82729234df1e Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Wed, 13 Apr 2016 18:25:39 -0400 Subject: Fix issue with labels not showing initially. --- app/assets/javascripts/lib/animate.js.coffee | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app/assets') diff --git a/app/assets/javascripts/lib/animate.js.coffee b/app/assets/javascripts/lib/animate.js.coffee index 64aef4c6d43..ec3b44d6126 100644 --- a/app/assets/javascripts/lib/animate.js.coffee +++ b/app/assets/javascripts/lib/animate.js.coffee @@ -19,6 +19,8 @@ gl.animate.animateEach = ($els, animation, time, options, done) -> dfd = $.Deferred() + if not $els.length + dfd.resolve() $els.each((i) -> setTimeout(=> $this = $(@) -- cgit v1.2.1 From 6191037a248002c6324a2ec242c511050cf36632 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 14 Apr 2016 14:59:16 +0100 Subject: Increased z-index of right sidebar Fixes issue with active button overlapping it Closes #15243 --- app/assets/stylesheets/pages/issuable.scss | 1 + 1 file changed, 1 insertion(+) (limited to 'app/assets') diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index d9218e15095..68a26e42b64 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -128,6 +128,7 @@ top: 58px; bottom: 0; right: 0; + z-index: 10; transition: width .3s; background: $gray-light; padding: 10px 20px; -- cgit v1.2.1 From 0debd9c7d3db445efc89e72d7a1192e5a40d5044 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Thu, 14 Apr 2016 15:26:53 +0100 Subject: fix labels button dropdown not showing how many labels clicked --- app/assets/javascripts/labels_select.js.coffee | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index 97a813577ed..e70c3cdd190 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -220,9 +220,19 @@ class @LabelsSelect fields: ['title'] selectable: true - toggleLabel: (selected) -> + toggleLabel: (selected, el) -> + selected_labels = $('.js-label-select').siblings('.dropdown-menu-labels').find('.is-active') + if selected and selected.title? - selected.title + if selected_labels and selected_labels.length > 1 + "#{selected.title} +#{selected_labels.length - 1} more" + else + selected.title + else if not selected and selected_labels.length isnt 0 + if selected_labels.length > 1 + "#{$(selected_labels[0]).text()} +#{selected_labels.length - 1} more" + else if selected_labels.length is 1 + $(selected_labels).text() else defaultLabel fieldName: $dropdown.data('field-name') @@ -238,7 +248,7 @@ class @LabelsSelect page = $('body').data 'page' isIssueIndex = page is 'projects:issues:index' isMRIndex = page is page is 'projects:merge_requests:index' - + $selectbox.hide() # display:block overrides the hide-collapse rule $value.removeAttr('style') -- cgit v1.2.1 From c659c836f068b4cb1a7b48df0dad9d2fe5749ee4 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Fri, 15 Apr 2016 12:05:07 -0500 Subject: Discussion note icon shows up when you click on diff on touch screen --- app/assets/stylesheets/pages/diff.scss | 1 + app/assets/stylesheets/pages/notes.scss | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'app/assets') diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index 183f22a1b24..9dd87ba2066 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -34,6 +34,7 @@ background: #fff; color: #333; border-radius: 0 0 3px 3px; + -webkit-overflow-scrolling: auto; .unfold { cursor: pointer; diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index ce44f5aa13b..60559cce8a9 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -286,7 +286,7 @@ ul.notes { padding: 4px; font-size: 16px; color: $gl-link-color; - margin-left: -60px; + margin-left: -56px; position: absolute; z-index: 10; width: 32px; -- cgit v1.2.1 From a0a423fee76d8cbc50cdb2478b05ccb751bc2be8 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Fri, 15 Apr 2016 18:18:31 +0100 Subject: fix failing tests --- app/assets/javascripts/issues.js.coffee | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index 320b92d2a60..1148531c068 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -36,19 +36,37 @@ $(".selected_issue").bind "change", Issues.checkChanged + getLabelsQueryString: -> + pageURL = decodeURIComponent(window.location.search.substring(1)) + urlVariables = pageURL.split('&') + labelParams = ( + variables for variables in urlVariables when variables.indexOf('label_name[]') > -1 + ).join('&') + + removeLabelsQueryString: (url) -> + pageURL = decodeURIComponent(url) + urlVariables = pageURL.split('&') + Params = ( + variables for variables in urlVariables when variables.indexOf('label_name[]') is -1 + ).join('&') + # Update state filters if present in page updateStateFilters: -> stateFilters = $('.issues-state-filters') newParams = {} - paramKeys = ['author_id', 'label_name', 'milestone_title', 'assignee_id', 'issue_search'] + paramKeys = ['author_id', 'milestone_title', 'assignee_id', 'issue_search'] for paramKey in paramKeys newParams[paramKey] = gl.utils.getUrlParameter(paramKey) or '' if stateFilters.length stateFilters.find('a').each -> - initialUrl = $(this).attr 'href' - $(this).attr 'href', gl.utils.mergeUrlParams(newParams, initialUrl) + initialUrl = Issues.removeLabelsQueryString($(this).attr 'href') + if Issues.getLabelsQueryString() + newUrl = "#{gl.utils.mergeUrlParams(newParams, initialUrl)}&#{Issues.getLabelsQueryString()}" + else + newUrl = gl.utils.mergeUrlParams(newParams, initialUrl) + $(this).attr 'href', newUrl # Make sure we trigger ajax request only after user stop typing initSearch: -> @@ -91,7 +109,8 @@ opacity: 0 } }).then( -> - $filteredLabels.html(Issue.labelRow(data)) + if typeof Issue.labelRow is 'function' + $filteredLabels.html(Issue.labelRow(data)) $spans = $filteredLabels.find('span') $spans.css('opacity',0) return gl.animate.animateEach($spans, 'fadeInUp', 20, { -- cgit v1.2.1 From ef9f5579d29ac4b72f463fabc6e0ace10078c009 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Sat, 16 Apr 2016 15:56:19 -0400 Subject: Fix coding style issues. Dashes to camelCase --- app/assets/javascripts/labels_select.js.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index e70c3cdd190..83e3062d222 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -203,7 +203,7 @@ class @LabelsSelect renderRow: (label) -> selectedClass = '' if $form.find("input[type='hidden']\ - [name='#{$dropdown.data('field-name')}']\ + [name='#{$dropdown.data('fieldName')}']\ [value='#{this.id(label)}']").length selectedClass = 'is-active' @@ -256,7 +256,7 @@ class @LabelsSelect if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) selectedLabels = $dropdown .closest('form') - .find("input[type='hidden'][name='#{$dropdown.data('field-name')}']") + .find("input[type='hidden'][name='#{$dropdown.data('fieldName')}']") Issues.filterResults( $dropdown.closest('form'), $dropdown.data('fieldName') -- cgit v1.2.1 From 259970ca1b3118f3eb71751b33a3a53ff4a1fa59 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Sat, 16 Apr 2016 23:30:31 +0100 Subject: abstract code for removing or getting a param query string from url --- app/assets/javascripts/issues.js.coffee | 20 +++----------------- app/assets/javascripts/lib/url_utility.js.coffee | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 17 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index 1148531c068..a3d9ce03875 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -36,20 +36,6 @@ $(".selected_issue").bind "change", Issues.checkChanged - getLabelsQueryString: -> - pageURL = decodeURIComponent(window.location.search.substring(1)) - urlVariables = pageURL.split('&') - labelParams = ( - variables for variables in urlVariables when variables.indexOf('label_name[]') > -1 - ).join('&') - - removeLabelsQueryString: (url) -> - pageURL = decodeURIComponent(url) - urlVariables = pageURL.split('&') - Params = ( - variables for variables in urlVariables when variables.indexOf('label_name[]') is -1 - ).join('&') - # Update state filters if present in page updateStateFilters: -> stateFilters = $('.issues-state-filters') @@ -61,9 +47,9 @@ if stateFilters.length stateFilters.find('a').each -> - initialUrl = Issues.removeLabelsQueryString($(this).attr 'href') - if Issues.getLabelsQueryString() - newUrl = "#{gl.utils.mergeUrlParams(newParams, initialUrl)}&#{Issues.getLabelsQueryString()}" + initialUrl = gl.utils.removeParamQueryString($(this).attr('href'), 'label_name[]') + if gl.utils.getParamQueryString('label_name[]') + newUrl = "#{gl.utils.mergeUrlParams(newParams, initialUrl)}&#{gl.utils.getParamQueryString('label_name[]')}" else newUrl = gl.utils.mergeUrlParams(newParams, initialUrl) $(this).attr 'href', newUrl diff --git a/app/assets/javascripts/lib/url_utility.js.coffee b/app/assets/javascripts/lib/url_utility.js.coffee index abd556e0b4e..c2e3c807e5e 100644 --- a/app/assets/javascripts/lib/url_utility.js.coffee +++ b/app/assets/javascripts/lib/url_utility.js.coffee @@ -28,4 +28,20 @@ newUrl = "#{newUrl}#{(if newUrl.indexOf('?') > 0 then '&' else '?')}#{paramName}=#{paramValue}" newUrl + # get parameter query string from url. + w.gl.utils.getParamQueryString = (param) -> + pageURL = decodeURIComponent(window.location.search.substring(1)) + urlVariables = pageURL.split('&') + ( + variables for variables in urlVariables when variables.indexOf(param) > -1 + ).join('&') + + # removes parameter query string from url. returns the modified url + w.gl.utils.removeParamQueryString = (url, param) -> + url = decodeURIComponent(url) + urlVariables = url.split('&') + ( + variables for variables in urlVariables when variables.indexOf(param) is -1 + ).join('&') + ) window -- cgit v1.2.1 From 5f98fdcdc9bca5b33220a1bb2b6ded32606271ff Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Mon, 18 Apr 2016 12:26:32 -0400 Subject: Add sentry logger to GitLab --- app/assets/javascripts/application.js.coffee | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app/assets') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 6f435e4c542..ab2432e1389 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -295,3 +295,6 @@ $ -> checkInitialSidebarSize() new Aside() + + if gon.sentry_dsn? + Raven.config('your public dsn').install() \ No newline at end of file -- cgit v1.2.1 From 001fe515cfeb0e4853c1f053d97b579880bde90d Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Mon, 18 Apr 2016 12:37:50 -0400 Subject: Make unminified Raven available. Use the correct sentry dsn. --- app/assets/javascripts/application.js.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index ab2432e1389..a98721e56bd 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -55,6 +55,7 @@ #= require_tree . #= require fuzzaldrin-plus #= require cropper +#= require raven window.slugify = (text) -> text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase() @@ -295,6 +296,6 @@ $ -> checkInitialSidebarSize() new Aside() - + if gon.sentry_dsn? - Raven.config('your public dsn').install() \ No newline at end of file + Raven.config(gon.sentry_dsn).install() \ No newline at end of file -- cgit v1.2.1 From 3e62dc3be5c0f4874c100f6cde5c6762bae754c5 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Mon, 18 Apr 2016 18:56:38 +0100 Subject: add some configs --- app/assets/javascripts/application.js.coffee | 44 ++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index a98721e56bd..d4c399f7be2 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -296,6 +296,46 @@ $ -> checkInitialSidebarSize() new Aside() - + if gon.sentry_dsn? - Raven.config(gon.sentry_dsn).install() \ No newline at end of file + Raven.config(gon.sentry_dsn, { + ignoreErrors: [ + # Random plugins/extensions + 'top.GLOBALS', + # See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error. html + 'originalCreateNotification', + 'canvas.contentDocument', + 'MyApp_RemoveAllHighlights', + 'http://tt.epicplay.com', + 'Can\'t find variable: ZiteReader', + 'jigsaw is not defined', + 'ComboSearch is not defined', + 'http://loading.retry.widdit.com/', + 'atomicFindClose', + # ISP "optimizing" proxy - `Cache-Control: no-transform` seems to + # reduce this. (thanks @acdha) + # See http://stackoverflow.com/questions/4113268 + 'bmi_SafeAddOnload', + 'EBCallBackMessageReceived', + # See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx + 'conduitPage' + ], + ignoreUrls: [ + # Woopra flakiness + /eatdifferent\.com\.woopra-ns\.com/i, + /static\.woopra\.com\/js\/woopra\.js/i, + # Chrome extensions + /extensions\//i, + /^chrome:\/\//i, + # Other plugins + /127\.0\.0\.1:4001\/isrunning/i, # Cacaoweb + /webappstoolbarba\.texthelp\.com\//i, + /metrics\.itunes\.apple\.com\.edgesuite\.net\//i + ] + }).install() + + if gon.current_user_id + Raven.setUserContext({ + api_token: gon.api_token, + id: gon.current_user_id + }) \ No newline at end of file -- cgit v1.2.1 From 5661f47d3834edb81dbddf4c272bcd49f2195a14 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Tue, 19 Apr 2016 11:48:37 +0100 Subject: some changes and add item to changelog --- app/assets/javascripts/application.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index d4c399f7be2..83d52cabcda 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -299,6 +299,7 @@ $ -> if gon.sentry_dsn? Raven.config(gon.sentry_dsn, { + includePaths: [/gon.relative_url_root/] ignoreErrors: [ # Random plugins/extensions 'top.GLOBALS', @@ -336,6 +337,5 @@ $ -> if gon.current_user_id Raven.setUserContext({ - api_token: gon.api_token, id: gon.current_user_id }) \ No newline at end of file -- cgit v1.2.1 From 5cefd8ab7655ec6433b3048a7382720c5300dc4c Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Tue, 19 Apr 2016 17:22:55 +0100 Subject: some refactoring --- app/assets/javascripts/issues.js.coffee | 47 ++++++++++++++---------- app/assets/javascripts/labels_select.js.coffee | 13 +++---- app/assets/javascripts/lib/url_utility.js.coffee | 16 +++----- app/assets/javascripts/merge_requests.js.coffee | 1 + 4 files changed, 39 insertions(+), 38 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index a3d9ce03875..f26b4f723eb 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -3,6 +3,7 @@ Issues.initTemplates() Issues.initSearch() Issues.initChecks() + Issues.toggleLabelFilters() $("body").on "ajax:success", ".close_issue, .reopen_issue", -> t = $(this) @@ -20,11 +21,20 @@ Issue.labelRow = _.template( '<% _.each(labels, function(label){ %> - <%= label.title %> + <%= label.title %> <% }); %>' ) + toggleLabelFilters: ()-> + $filteredLabels = $('.filtered-labels') + if $filteredLabels.find('.label-row').length > 0 + #$filteredLabels.show() + $filteredLabels.slideDown().css({'overflow':'visible'}) + else + #$filteredLabels.hide() + $filteredLabels.slideUp().css({'overflow':'visible'}) + reload: -> Issues.initChecks() $('#filter_issue_search').val($('#issue_search').val()) @@ -43,13 +53,15 @@ paramKeys = ['author_id', 'milestone_title', 'assignee_id', 'issue_search'] for paramKey in paramKeys - newParams[paramKey] = gl.utils.getUrlParameter(paramKey) or '' + newParams[paramKey] = gl.utils.getParameterValues(paramKey)[0] or '' if stateFilters.length stateFilters.find('a').each -> initialUrl = gl.utils.removeParamQueryString($(this).attr('href'), 'label_name[]') - if gl.utils.getParamQueryString('label_name[]') - newUrl = "#{gl.utils.mergeUrlParams(newParams, initialUrl)}&#{gl.utils.getParamQueryString('label_name[]')}" + labelNameValues = gl.utils.getParameterValues('label_name[]') + if labelNameValues + labelNameQueryString = ("label_name[]=#{value}" for value in labelNameValues).join('&') + newUrl = "#{gl.utils.mergeUrlParams(newParams, initialUrl)}&#{labelNameQueryString}" else newUrl = gl.utils.mergeUrlParams(newParams, initialUrl) $(this).attr 'href', newUrl @@ -84,29 +96,24 @@ Issues.reload() Issues.updateStateFilters() $filteredLabels = $('.filtered-labels') - $filteredLabelsSpans = $filteredLabels.find('span') + $filteredLabelsSpans = $filteredLabels.find('.label-row') gl.animate.animateEach( - $filteredLabelsSpans, - 'fadeOutDown', 20, { - cssStart: { + $filteredLabelsSpans, 'fadeOutDown', 20, + cssStart: opacity: 1 - }, - cssEnd: { + cssEnd: opacity: 0 - } - }).then( -> + ).then( -> if typeof Issue.labelRow is 'function' $filteredLabels.html(Issue.labelRow(data)) - $spans = $filteredLabels.find('span') - $spans.css('opacity',0) - return gl.animate.animateEach($spans, 'fadeInUp', 20, { - cssStart: { + Issues.toggleLabelFilters() + $spans = $filteredLabels.find('.label-row') + $spans.css('opacity', 0) + return gl.animate.animateEach $spans, 'fadeInUp', 20, + cssStart: opacity: 0 - }, - cssEnd: { + cssEnd: opacity: 1 - } - }) ) dataType: "json" diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index 83e3062d222..6a89817e647 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -224,7 +224,7 @@ class @LabelsSelect selected_labels = $('.js-label-select').siblings('.dropdown-menu-labels').find('.is-active') if selected and selected.title? - if selected_labels and selected_labels.length > 1 + if selected_labels.length > 1 "#{selected.title} +#{selected_labels.length - 1} more" else selected.title @@ -247,7 +247,7 @@ class @LabelsSelect hidden: -> page = $('body').data 'page' isIssueIndex = page is 'projects:issues:index' - isMRIndex = page is page is 'projects:merge_requests:index' + isMRIndex = page is 'projects:merge_requests:index' $selectbox.hide() # display:block overrides the hide-collapse rule @@ -256,11 +256,8 @@ class @LabelsSelect if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) selectedLabels = $dropdown .closest('form') - .find("input[type='hidden'][name='#{$dropdown.data('fieldName')}']") - Issues.filterResults( - $dropdown.closest('form'), - $dropdown.data('fieldName') - ) + .find("input:hidden[name='#{$dropdown.data('fieldName')}']") + Issues.filterResults $dropdown.closest('form') else if $dropdown.hasClass('js-filter-submit') $dropdown.closest('form').submit() else @@ -270,7 +267,7 @@ class @LabelsSelect clicked: (label) -> page = $('body').data 'page' isIssueIndex = page is 'projects:issues:index' - isMRIndex = page is page is 'projects:merge_requests:index' + isMRIndex = page is 'projects:merge_requests:index' if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) if not $dropdown.hasClass 'js-multiselect' selectedLabel = label.title diff --git a/app/assets/javascripts/lib/url_utility.js.coffee b/app/assets/javascripts/lib/url_utility.js.coffee index c2e3c807e5e..6a00932c028 100644 --- a/app/assets/javascripts/lib/url_utility.js.coffee +++ b/app/assets/javascripts/lib/url_utility.js.coffee @@ -3,16 +3,20 @@ w.gl ?= {} w.gl.utils ?= {} - w.gl.utils.getUrlParameter = (sParam) -> + # Returns an array containing the value(s) of the + # of the key passed as an argument + w.gl.utils.getParameterValues = (sParam) -> sPageURL = decodeURIComponent(window.location.search.substring(1)) sURLVariables = sPageURL.split('&') sParameterName = undefined + values = [] i = 0 while i < sURLVariables.length sParameterName = sURLVariables[i].split('=') if sParameterName[0] is sParam - return if sParameterName[1] is undefined then true else sParameterName[1] + values.push(sParameterName[1]) i++ + values # # # @param {Object} params - url keys and value to merge @@ -28,14 +32,6 @@ newUrl = "#{newUrl}#{(if newUrl.indexOf('?') > 0 then '&' else '?')}#{paramName}=#{paramValue}" newUrl - # get parameter query string from url. - w.gl.utils.getParamQueryString = (param) -> - pageURL = decodeURIComponent(window.location.search.substring(1)) - urlVariables = pageURL.split('&') - ( - variables for variables in urlVariables when variables.indexOf(param) > -1 - ).join('&') - # removes parameter query string from url. returns the modified url w.gl.utils.removeParamQueryString = (url, param) -> url = decodeURIComponent(url) diff --git a/app/assets/javascripts/merge_requests.js.coffee b/app/assets/javascripts/merge_requests.js.coffee index b3c73ffce5d..203def58783 100644 --- a/app/assets/javascripts/merge_requests.js.coffee +++ b/app/assets/javascripts/merge_requests.js.coffee @@ -3,6 +3,7 @@ # @MergeRequests = init: -> + $('.filtered-labels').hide() MergeRequests.initSearch() # Make sure we trigger ajax request only after user stop typing -- cgit v1.2.1 From 3e7a8b0789745080e499f68862ff29e3bc178453 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Tue, 19 Apr 2016 22:04:52 +0100 Subject: place the sentry config into a new file, and some changes --- app/assets/javascripts/application.js.coffee | 43 -------------------------- app/assets/javascripts/raven_config.js.coffee | 44 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 43 deletions(-) create mode 100644 app/assets/javascripts/raven_config.js.coffee (limited to 'app/assets') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 83d52cabcda..ef7e7ece4af 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -296,46 +296,3 @@ $ -> checkInitialSidebarSize() new Aside() - - if gon.sentry_dsn? - Raven.config(gon.sentry_dsn, { - includePaths: [/gon.relative_url_root/] - ignoreErrors: [ - # Random plugins/extensions - 'top.GLOBALS', - # See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error. html - 'originalCreateNotification', - 'canvas.contentDocument', - 'MyApp_RemoveAllHighlights', - 'http://tt.epicplay.com', - 'Can\'t find variable: ZiteReader', - 'jigsaw is not defined', - 'ComboSearch is not defined', - 'http://loading.retry.widdit.com/', - 'atomicFindClose', - # ISP "optimizing" proxy - `Cache-Control: no-transform` seems to - # reduce this. (thanks @acdha) - # See http://stackoverflow.com/questions/4113268 - 'bmi_SafeAddOnload', - 'EBCallBackMessageReceived', - # See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx - 'conduitPage' - ], - ignoreUrls: [ - # Woopra flakiness - /eatdifferent\.com\.woopra-ns\.com/i, - /static\.woopra\.com\/js\/woopra\.js/i, - # Chrome extensions - /extensions\//i, - /^chrome:\/\//i, - # Other plugins - /127\.0\.0\.1:4001\/isrunning/i, # Cacaoweb - /webappstoolbarba\.texthelp\.com\//i, - /metrics\.itunes\.apple\.com\.edgesuite\.net\//i - ] - }).install() - - if gon.current_user_id - Raven.setUserContext({ - id: gon.current_user_id - }) \ No newline at end of file diff --git a/app/assets/javascripts/raven_config.js.coffee b/app/assets/javascripts/raven_config.js.coffee new file mode 100644 index 00000000000..d031a655abf --- /dev/null +++ b/app/assets/javascripts/raven_config.js.coffee @@ -0,0 +1,44 @@ +@raven = + init: -> + if gon.sentry_dsn? + Raven.config(gon.sentry_dsn, { + includePaths: [/gon.relative_url_root/] + ignoreErrors: [ + # Random plugins/extensions + 'top.GLOBALS', + # See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error. html + 'originalCreateNotification', + 'canvas.contentDocument', + 'MyApp_RemoveAllHighlights', + 'http://tt.epicplay.com', + 'Can\'t find variable: ZiteReader', + 'jigsaw is not defined', + 'ComboSearch is not defined', + 'http://loading.retry.widdit.com/', + 'atomicFindClose', + # ISP "optimizing" proxy - `Cache-Control: no-transform` seems to + # reduce this. (thanks @acdha) + # See http://stackoverflow.com/questions/4113268 + 'bmi_SafeAddOnload', + 'EBCallBackMessageReceived', + # See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx + 'conduitPage' + ], + ignoreUrls: [ + # Chrome extensions + /extensions\//i, + /^chrome:\/\//i, + # Other plugins + /127\.0\.0\.1:4001\/isrunning/i, # Cacaoweb + /webappstoolbarba\.texthelp\.com\//i, + /metrics\.itunes\.apple\.com\.edgesuite\.net\//i + ] + }).install() + + if gon.current_user_id + Raven.setUserContext({ + id: gon.current_user_id + }) + +$ -> + raven.init() -- cgit v1.2.1 From 1a7ccd0f0aacb33be3d8d3456bdedd8f08b7cc96 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 20 Apr 2016 11:47:35 +0100 Subject: Removed animation from labels filter --- app/assets/javascripts/issues.js.coffee | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index f26b4f723eb..8719d22a5bb 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -29,11 +29,9 @@ toggleLabelFilters: ()-> $filteredLabels = $('.filtered-labels') if $filteredLabels.find('.label-row').length > 0 - #$filteredLabels.show() - $filteredLabels.slideDown().css({'overflow':'visible'}) + $filteredLabels.removeClass('hidden') else - #$filteredLabels.hide() - $filteredLabels.slideUp().css({'overflow':'visible'}) + $filteredLabels.addClass('hidden') reload: -> Issues.initChecks() @@ -96,25 +94,11 @@ Issues.reload() Issues.updateStateFilters() $filteredLabels = $('.filtered-labels') - $filteredLabelsSpans = $filteredLabels.find('.label-row') - gl.animate.animateEach( - $filteredLabelsSpans, 'fadeOutDown', 20, - cssStart: - opacity: 1 - cssEnd: - opacity: 0 - ).then( -> - if typeof Issue.labelRow is 'function' - $filteredLabels.html(Issue.labelRow(data)) - Issues.toggleLabelFilters() - $spans = $filteredLabels.find('.label-row') - $spans.css('opacity', 0) - return gl.animate.animateEach $spans, 'fadeInUp', 20, - cssStart: - opacity: 0 - cssEnd: - opacity: 1 - ) + + if typeof Issue.labelRow is 'function' + $filteredLabels.html(Issue.labelRow(data)) + + Issues.toggleLabelFilters() dataType: "json" -- cgit v1.2.1 From a845252983e4a0346c17e1b058c388f4c23a547d Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Wed, 20 Apr 2016 13:55:19 +0100 Subject: get the multi filter labels feature to work on merge request, also escape characters in the templates to prevent xss attack --- app/assets/javascripts/dispatcher.js.coffee | 1 + app/assets/javascripts/issues.js.coffee | 2 +- app/assets/javascripts/merge_requests.js.coffee | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index 70fd6f50e9c..ffc5dc602e2 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -58,6 +58,7 @@ class Dispatcher when 'projects:merge_requests:index' shortcut_handler = new ShortcutsNavigation() MergeRequests.init() + Issues.init() when 'dashboard:activity' new Activities() when 'dashboard:projects:starred' diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index 8719d22a5bb..afd1ebd0a22 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -21,7 +21,7 @@ Issue.labelRow = _.template( '<% _.each(labels, function(label){ %> - <%= label.title %> + <%= _.escape(label.title) %> <% }); %>' ) diff --git a/app/assets/javascripts/merge_requests.js.coffee b/app/assets/javascripts/merge_requests.js.coffee index 203def58783..b3c73ffce5d 100644 --- a/app/assets/javascripts/merge_requests.js.coffee +++ b/app/assets/javascripts/merge_requests.js.coffee @@ -3,7 +3,6 @@ # @MergeRequests = init: -> - $('.filtered-labels').hide() MergeRequests.initSearch() # Make sure we trigger ajax request only after user stop typing -- cgit v1.2.1 From 75626d5f0134770065a18c73223bdd798866fa5b Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 20 Apr 2016 17:00:12 +0100 Subject: Label text color comes from JSON Created issuable singleton to house the filtering --- app/assets/javascripts/dispatcher.js.coffee | 4 +- app/assets/javascripts/issuable.js.coffee | 84 +++++++++++++++++++++++ app/assets/javascripts/issues.js.coffee | 82 +--------------------- app/assets/javascripts/labels_select.js.coffee | 4 +- app/assets/javascripts/merge_requests.js.coffee | 35 ---------- app/assets/javascripts/milestone_select.js.coffee | 2 +- app/assets/javascripts/users_select.js.coffee | 2 +- 7 files changed, 91 insertions(+), 122 deletions(-) create mode 100644 app/assets/javascripts/issuable.js.coffee delete mode 100644 app/assets/javascripts/merge_requests.js.coffee (limited to 'app/assets') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index ffc5dc602e2..f3ae146691b 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -17,6 +17,7 @@ class Dispatcher switch page when 'projects:issues:index' Issues.init() + Issuable.init() shortcut_handler = new ShortcutsNavigation() when 'projects:issues:show' new Issue() @@ -57,8 +58,7 @@ class Dispatcher new ZenMode() when 'projects:merge_requests:index' shortcut_handler = new ShortcutsNavigation() - MergeRequests.init() - Issues.init() + Issuable.init() when 'dashboard:activity' new Activities() when 'dashboard:projects:starred' diff --git a/app/assets/javascripts/issuable.js.coffee b/app/assets/javascripts/issuable.js.coffee new file mode 100644 index 00000000000..afffed63ac5 --- /dev/null +++ b/app/assets/javascripts/issuable.js.coffee @@ -0,0 +1,84 @@ +@Issuable = + init: -> + Issuable.initTemplates() + Issuable.initSearch() + + initTemplates: -> + Issuable.labelRow = _.template( + '<% _.each(labels, function(label){ %> + + <%= _.escape(label.title) %> + + <% }); %>' + ) + + initSearch: -> + @timer = null + $('#issue_search') + .off 'keyup' + .on 'keyup', -> + clearTimeout(@timer) + @timer = setTimeout( -> + Issuable.filterResults $('#issue_search_form') + , 500) + + toggleLabelFilters: -> + $filteredLabels = $('.filtered-labels') + if $filteredLabels.find('.label-row').length > 0 + $filteredLabels.removeClass('hidden') + else + $filteredLabels.addClass('hidden') + + filterResults: (form) => + formData = form.serialize() + + $('.issues-holder, .merge-requests-holder').css('opacity', '0.5') + formAction = form.attr('action') + issuesUrl = formAction + issuesUrl += ("#{if formAction.indexOf('?') < 0 then '?' else '&'}") + issuesUrl += formData + $.ajax + type: 'GET' + url: formAction + data: formData + complete: -> + $('.issues-holder, .merge-requests-holder').css('opacity', '1.0') + success: (data) -> + $('.issues-holder, .merge-requests-holder').html(data.html) + # Change url so if user reload a page - search results are saved + history.replaceState {page: issuesUrl}, document.title, issuesUrl + Issuable.reload() + Issuable.updateStateFilters() + $filteredLabels = $('.filtered-labels') + + if typeof Issuable.labelRow is 'function' + $filteredLabels.html(Issuable.labelRow(data)) + + Issuable.toggleLabelFilters() + + dataType: "json" + + reload: -> + if Issues.created + Issues.initChecks() + + $('#filter_issue_search').val($('#issue_search').val()) + + updateStateFilters: -> + stateFilters = $('.issues-state-filters') + newParams = {} + paramKeys = ['author_id', 'milestone_title', 'assignee_id', 'issue_search'] + + for paramKey in paramKeys + newParams[paramKey] = gl.utils.getParameterValues(paramKey)[0] or '' + + if stateFilters.length + stateFilters.find('a').each -> + initialUrl = gl.utils.removeParamQueryString($(this).attr('href'), 'label_name[]') + labelNameValues = gl.utils.getParameterValues('label_name[]') + if labelNameValues + labelNameQueryString = ("label_name[]=#{value}" for value in labelNameValues).join('&') + newUrl = "#{gl.utils.mergeUrlParams(newParams, initialUrl)}&#{labelNameQueryString}" + else + newUrl = gl.utils.mergeUrlParams(newParams, initialUrl) + $(this).attr 'href', newUrl diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index afd1ebd0a22..3330e6c68ad 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -1,9 +1,7 @@ @Issues = init: -> - Issues.initTemplates() - Issues.initSearch() + Issues.created = true Issues.initChecks() - Issues.toggleLabelFilters() $("body").on "ajax:success", ".close_issue, .reopen_issue", -> t = $(this) @@ -17,26 +15,6 @@ else $(this).html totalIssues - 1 - initTemplates: -> - Issue.labelRow = _.template( - '<% _.each(labels, function(label){ %> - - <%= _.escape(label.title) %> - - <% }); %>' - ) - - toggleLabelFilters: ()-> - $filteredLabels = $('.filtered-labels') - if $filteredLabels.find('.label-row').length > 0 - $filteredLabels.removeClass('hidden') - else - $filteredLabels.addClass('hidden') - - reload: -> - Issues.initChecks() - $('#filter_issue_search').val($('#issue_search').val()) - initChecks: -> $(".check_all_issues").click -> $(".selected_issue").prop("checked", @checked) @@ -44,64 +22,6 @@ $(".selected_issue").bind "change", Issues.checkChanged - # Update state filters if present in page - updateStateFilters: -> - stateFilters = $('.issues-state-filters') - newParams = {} - paramKeys = ['author_id', 'milestone_title', 'assignee_id', 'issue_search'] - - for paramKey in paramKeys - newParams[paramKey] = gl.utils.getParameterValues(paramKey)[0] or '' - - if stateFilters.length - stateFilters.find('a').each -> - initialUrl = gl.utils.removeParamQueryString($(this).attr('href'), 'label_name[]') - labelNameValues = gl.utils.getParameterValues('label_name[]') - if labelNameValues - labelNameQueryString = ("label_name[]=#{value}" for value in labelNameValues).join('&') - newUrl = "#{gl.utils.mergeUrlParams(newParams, initialUrl)}&#{labelNameQueryString}" - else - newUrl = gl.utils.mergeUrlParams(newParams, initialUrl) - $(this).attr 'href', newUrl - - # Make sure we trigger ajax request only after user stop typing - initSearch: -> - @timer = null - $("#issue_search").keyup -> - clearTimeout(@timer) - @timer = setTimeout( -> - Issues.filterResults $("#issue_search_form") - , 500) - - filterResults: (form) => - formData = form.serialize() - - $('.issues-holder, .merge-requests-holder').css("opacity", '0.5') - formAction = form.attr('action') - issuesUrl = formAction - issuesUrl += ("#{if formAction.indexOf("?") < 0 then '?' else '&'}") - issuesUrl += formData - $.ajax - type: "GET" - url: formAction - data: formData - complete: -> - $('.issues-holder, .merge-requests-holder').css("opacity", '1.0') - success: (data) -> - $('.issues-holder, .merge-requests-holder').html(data.html) - # Change url so if user reload a page - search results are saved - history.replaceState {page: issuesUrl}, document.title, issuesUrl - Issues.reload() - Issues.updateStateFilters() - $filteredLabels = $('.filtered-labels') - - if typeof Issue.labelRow is 'function' - $filteredLabels.html(Issue.labelRow(data)) - - Issues.toggleLabelFilters() - - dataType: "json" - checkChanged: -> checked_issues = $(".selected_issue:checked") if checked_issues.length > 0 diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index 6a89817e647..0b39efa8d78 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -257,7 +257,7 @@ class @LabelsSelect selectedLabels = $dropdown .closest('form') .find("input:hidden[name='#{$dropdown.data('fieldName')}']") - Issues.filterResults $dropdown.closest('form') + Issuable.filterResults $dropdown.closest('form') else if $dropdown.hasClass('js-filter-submit') $dropdown.closest('form').submit() else @@ -271,7 +271,7 @@ class @LabelsSelect if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) if not $dropdown.hasClass 'js-multiselect' selectedLabel = label.title - Issues.filterResults $dropdown.closest('form') + Issuable.filterResults $dropdown.closest('form') else if $dropdown.hasClass 'js-filter-submit' $dropdown.closest('form').submit() else diff --git a/app/assets/javascripts/merge_requests.js.coffee b/app/assets/javascripts/merge_requests.js.coffee deleted file mode 100644 index b3c73ffce5d..00000000000 --- a/app/assets/javascripts/merge_requests.js.coffee +++ /dev/null @@ -1,35 +0,0 @@ -# -# * Filter merge requests -# -@MergeRequests = - init: -> - MergeRequests.initSearch() - - # Make sure we trigger ajax request only after user stop typing - initSearch: -> - @timer = null - $("#issue_search").keyup -> - clearTimeout(@timer) - @timer = setTimeout(MergeRequests.filterResults, 500) - - filterResults: => - form = $("#issue_search_form") - search = $("#issue_search").val() - $('.merge-requests-holder').css("opacity", '0.5') - issues_url = form.attr('action') + '?' + form.serialize() - - $.ajax - type: "GET" - url: form.attr('action') - data: form.serialize() - complete: -> - $('.merge-requests-holder').css("opacity", '1.0') - success: (data) -> - $('.merge-requests-holder').html(data.html) - # Change url so if user reload a page - search results are saved - history.replaceState {page: issues_url}, document.title, issues_url - MergeRequests.reload() - dataType: "json" - - reload: -> - $('#filter_issue_search').val($('#issue_search').val()) diff --git a/app/assets/javascripts/milestone_select.js.coffee b/app/assets/javascripts/milestone_select.js.coffee index 6bd4e885a03..ee37c6eec4c 100644 --- a/app/assets/javascripts/milestone_select.js.coffee +++ b/app/assets/javascripts/milestone_select.js.coffee @@ -97,7 +97,7 @@ class @MilestoneSelect selectedMilestone = selected.name else selectedMilestone = '' - Issues.filterResults $dropdown.closest('form') + Issuable.filterResults $dropdown.closest('form') else if $dropdown.hasClass('js-filter-submit') $dropdown.closest('form').submit() else diff --git a/app/assets/javascripts/users_select.js.coffee b/app/assets/javascripts/users_select.js.coffee index eee9b6e690e..f55d8462ac4 100644 --- a/app/assets/javascripts/users_select.js.coffee +++ b/app/assets/javascripts/users_select.js.coffee @@ -157,7 +157,7 @@ class @UsersSelect if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex) selectedId = user.id - Issues.filterResults $dropdown.closest('form') + Issuable.filterResults $dropdown.closest('form') else if $dropdown.hasClass 'js-filter-submit' $dropdown.closest('form').submit() else -- cgit v1.2.1 From 439a72803b32be97253ce689659251530afbca21 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 20 Apr 2016 17:23:10 +0100 Subject: Any label & no label out weigh other labels - these two will clear previously selected labels Fixed issue with no label not working correctly --- app/assets/javascripts/gl_dropdown.js.coffee | 8 ++++---- app/assets/javascripts/labels_select.js.coffee | 15 +++++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee index 2dc37257e22..e37b3fb5707 100644 --- a/app/assets/javascripts/gl_dropdown.js.coffee +++ b/app/assets/javascripts/gl_dropdown.js.coffee @@ -389,13 +389,13 @@ class GitLabDropdown else selectedObject else - if !value? - field.remove() - - if not @options.multiSelect + if not @options.multiSelect or el.hasClass('dropdown-clear-active') @dropdown.find(".#{ACTIVE_CLASS}").removeClass ACTIVE_CLASS @dropdown.parent().find("input[name='#{fieldName}']").remove() + if !value? + field.remove() + # Toggle active class for the tick mark el.addClass ACTIVE_CLASS diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index 0b39efa8d78..ab1a57f7d30 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -201,16 +201,21 @@ class @LabelsSelect callback data renderRow: (label) -> - selectedClass = '' + removesAll = label.id is 0 or label.id is undefined + + selectedClass = [] if $form.find("input[type='hidden']\ [name='#{$dropdown.data('fieldName')}']\ [value='#{this.id(label)}']").length - selectedClass = 'is-active' + selectedClass.push 'is-active' + + if $dropdown.hasClass('js-multiselect') and removesAll + selectedClass.push 'dropdown-clear-active' color = if label.color? then "" else "" "
  • - + #{color} #{label.title} @@ -237,9 +242,7 @@ class @LabelsSelect defaultLabel fieldName: $dropdown.data('field-name') id: (label) -> - if label.isAny? - '' - else if $dropdown.hasClass "js-filter-submit" + if $dropdown.hasClass("js-filter-submit") and not label.isAny? label.title else label.id -- cgit v1.2.1 From 25f592cf9c2d126625404df140dc5d958e8822cc Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Wed, 20 Apr 2016 11:48:24 -0500 Subject: Wrap all code in diffs --- app/assets/stylesheets/framework/markdown_area.scss | 9 +++++++++ app/assets/stylesheets/pages/detail_page.scss | 6 ++++++ app/assets/stylesheets/pages/diff.scss | 4 ++-- app/assets/stylesheets/pages/note_form.scss | 12 ------------ app/assets/stylesheets/pages/notes.scss | 19 +++---------------- 5 files changed, 20 insertions(+), 30 deletions(-) (limited to 'app/assets') diff --git a/app/assets/stylesheets/framework/markdown_area.scss b/app/assets/stylesheets/framework/markdown_area.scss index 0f32d36d59c..704fa1ff800 100644 --- a/app/assets/stylesheets/framework/markdown_area.scss +++ b/app/assets/stylesheets/framework/markdown_area.scss @@ -90,3 +90,12 @@ box-shadow: none; width: 100%; } + +.md { + &.md-preview-holder { + code { + white-space: pre-wrap; + word-break: break-all; + } + } +} diff --git a/app/assets/stylesheets/pages/detail_page.scss b/app/assets/stylesheets/pages/detail_page.scss index 2c2ac903f29..751a5ab4d92 100644 --- a/app/assets/stylesheets/pages/detail_page.scss +++ b/app/assets/stylesheets/pages/detail_page.scss @@ -36,4 +36,10 @@ } } } + + .wiki { + code { + white-space: pre-wrap; + } + } } diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index 183f22a1b24..b84e2aac836 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -86,7 +86,7 @@ } span { - white-space: pre; + white-space: pre-wrap; } } } @@ -335,7 +335,7 @@ } .diff-file .line_content { - white-space: pre; + white-space: pre-wrap; } .diff-wrap-lines .line_content { diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss index 2f6d172568b..7fa13e66b43 100644 --- a/app/assets/stylesheets/pages/note_form.scss +++ b/app/assets/stylesheets/pages/note_form.scss @@ -84,18 +84,6 @@ border-color: $gl-success; } } - - p { - code { - white-space: normal; - } - - pre { - code { - white-space: pre; - } - } - } } } diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index ffcd89a3c9f..74437aa207c 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -81,16 +81,8 @@ ul.notes { @include md-typography; // On diffs code should wrap nicely and not overflow - p { - code { - white-space: normal; - } - - pre { - code { - white-space: pre; - } - } + code { + white-space: pre-wrap; } // Reset ul style types since we're nested inside a ul already @@ -137,7 +129,7 @@ ul.notes { margin-right: 10px; } .line_content { - white-space: pre; + white-space: pre-wrap; } } @@ -171,11 +163,6 @@ ul.notes { &.parallel { border-width: 1px; - - .code, - code { - white-space: pre-wrap; - } } .notes { -- cgit v1.2.1 From ab93ea04aa6b81d518033af7c042d2c70c1e9828 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 20 Apr 2016 17:52:55 +0100 Subject: Correctly checks for undefined in coffeescript :see_no_evil: --- app/assets/javascripts/labels_select.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index ab1a57f7d30..8e39b470257 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -201,7 +201,7 @@ class @LabelsSelect callback data renderRow: (label) -> - removesAll = label.id is 0 or label.id is undefined + removesAll = label.id is 0 or not label.id? selectedClass = [] if $form.find("input[type='hidden']\ -- cgit v1.2.1 From ef0c87f67f56564de8ae88d215e99146015cebdb Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Wed, 20 Apr 2016 13:42:27 -0500 Subject: Add margin to top of form actions --- app/assets/stylesheets/pages/help.scss | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app/assets') diff --git a/app/assets/stylesheets/pages/help.scss b/app/assets/stylesheets/pages/help.scss index 604f1700cf8..ee95bdf488e 100644 --- a/app/assets/stylesheets/pages/help.scss +++ b/app/assets/stylesheets/pages/help.scss @@ -59,8 +59,10 @@ position: relative; overflow-y: auto; padding: 15px; + .form-actions { margin: -$gl-padding+1; + margin-top: 15px; } } -- cgit v1.2.1 From aa22106b3097a34c3a490554c4239af6665ade8e Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 8 Apr 2016 13:04:20 +0100 Subject: Posts the due date through AJAX --- app/assets/javascripts/due_date_select.js.coffee | 48 +++++++++++++ app/assets/stylesheets/framework/dropdowns.scss | 87 ++++++++++++++++++++++++ app/assets/stylesheets/pages/issuable.scss | 4 +- 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/due_date_select.js.coffee (limited to 'app/assets') diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee new file mode 100644 index 00000000000..cc7ad5fb005 --- /dev/null +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -0,0 +1,48 @@ +class @DueDateSelect + constructor: -> + $('.js-due-date-select').each (i, dropdown) -> + $dropdown = $(dropdown) + $dropdownParent = $dropdown.closest('.dropdown') + $addBtn = $('.js-due-date-add', $dropdownParent) + $datePicker = $dropdownParent.find('.js-due-date-calendar') + $block = $dropdown.closest('.block') + $loading = $block.find('.block-loading').hide() + $selectbox = $dropdown.closest('.selectbox') + $value = $block.find('.value') + + fieldName = $dropdown.data('field-name') + abilityName = $dropdown.data('ability-name') + issueUpdateURL = $dropdown.data('issue-update') + + $addBtn.on 'click', (e) -> + e.preventDefault() + e.stopPropagation() + + # Create the post date + value = $("input[name='#{fieldName}']").val() + mediumDate = $.datepicker.formatDate("M d, yy", new Date(value)) + + data = {} + data[abilityName] = {} + data[abilityName].due_date = value + + $.ajax( + type: 'PUT' + url: issueUpdateURL + data: data + beforeSend: -> + $loading.fadeIn() + $dropdown.trigger('loading.gl.dropdown') + $selectbox.hide() + $value.removeAttr('style') + + $value.html(mediumDate) + ).done (data) -> + $dropdown.trigger('loaded.gl.dropdown') + $loading.fadeOut() + + $datePicker.datepicker( + dateFormat: "yy-mm-dd", + defaultDate: $("input[name='#{fieldName}']").val() + altField: "input[name='#{fieldName}']" + ) diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss index ba6c7930cdc..b57ecd1b37a 100644 --- a/app/assets/stylesheets/framework/dropdowns.scss +++ b/app/assets/stylesheets/framework/dropdowns.scss @@ -358,6 +358,13 @@ border-top: 1px solid $dropdown-divider-color; } +.dropdown-due-date-footer { + padding-top: 0; + margin-left: 10px; + margin-right: 10px; + border-top: 0; +} + .dropdown-footer-list { font-size: 14px; @@ -395,3 +402,83 @@ height: 15px; border-radius: $border-radius-base; } + +.dropdown-menu-due-date { + .ui-widget { + table { + margin: 0; + } + + &.ui-datepicker-inline { + padding: 0 10px; + border: 0; + width: 100%; + } + + .ui-datepicker-header { + padding: 8px; + border: 0; + } + + .ui-state-active, + .ui-state-hover { + color: $md-link-color; + background-color: #ecf3fe; + } + + .ui-datepicker-prev, + .ui-datepicker-next { + &:hover { + background-color: transparent; + border: 0; + } + } + + .ui-datepicker-prev { + left: 1px; + top: 1px; + } + + .ui-datepicker-next { + right: 1px; + top: 1px; + } + + td { + padding: 0; + border: 1px solid rgba(0, 0, 0, .1); + + &:first-child { + border-left: 0; + } + + &:last-child { + border-right: 0; + } + + a { + line-height: 17px; + border: 0; + border-radius: 0; + } + } + + .ui-datepicker-title { + color: #555; + font-size: 15px; + line-height: 1; + font-weight: normal; + } + } + + th { + padding: 5px 0; + color: #b8b8b8; + font-weight: normal; + text-transform: lowercase; + } + + .ui-datepicker-unselectable { + background-color: #faf9f9; + } +} diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index 9397e1a6626..1d6190c8f18 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -242,7 +242,7 @@ } } - .btn { + .issuable-pager { background: $gray-normal; border: 1px solid $border-gray-normal; &:hover { @@ -251,7 +251,7 @@ } } - a:not(.btn) { + a:not(.issuable-pager) { &:hover { color: $md-link-color; text-decoration: none; -- cgit v1.2.1 From 7617ae25658907556e3b4c270e1e6717b8711052 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 8 Apr 2016 16:23:59 +0100 Subject: Fixed issue with selectbox not hiding --- app/assets/javascripts/due_date_select.js.coffee | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee index cc7ad5fb005..edc28954aaf 100644 --- a/app/assets/javascripts/due_date_select.js.coffee +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -1,12 +1,13 @@ class @DueDateSelect constructor: -> + $loading = $('.js-issuable-update .due_date').find('.block-loading').hide() + $('.js-due-date-select').each (i, dropdown) -> $dropdown = $(dropdown) $dropdownParent = $dropdown.closest('.dropdown') $addBtn = $('.js-due-date-add', $dropdownParent) $datePicker = $dropdownParent.find('.js-due-date-calendar') $block = $dropdown.closest('.block') - $loading = $block.find('.block-loading').hide() $selectbox = $dropdown.closest('.selectbox') $value = $block.find('.value') @@ -14,6 +15,12 @@ class @DueDateSelect abilityName = $dropdown.data('ability-name') issueUpdateURL = $dropdown.data('issue-update') + $dropdown.glDropdown( + hidden: -> + $selectbox.hide() + $value.removeAttr('style') + ) + $addBtn.on 'click', (e) -> e.preventDefault() e.stopPropagation() -- cgit v1.2.1 From f56c62631525e45568231ad2be26f0e40f345c2b Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 11 Apr 2016 10:08:27 +0100 Subject: Fixed issue with bootstrap dropdown closing the calendar --- app/assets/javascripts/due_date_select.js.coffee | 5 +++++ app/assets/stylesheets/framework/dropdowns.scss | 4 ++++ 2 files changed, 9 insertions(+) (limited to 'app/assets') diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee index edc28954aaf..b6e96002dfd 100644 --- a/app/assets/javascripts/due_date_select.js.coffee +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -53,3 +53,8 @@ class @DueDateSelect defaultDate: $("input[name='#{fieldName}']").val() altField: "input[name='#{fieldName}']" ) + + $(document) + .off 'click', '.ui-datepicker-header a' + .on 'click', '.ui-datepicker-header a', (e) -> + e.stopImmediatePropagation() diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss index b57ecd1b37a..55c90b09e97 100644 --- a/app/assets/stylesheets/framework/dropdowns.scss +++ b/app/assets/stylesheets/framework/dropdowns.scss @@ -404,6 +404,10 @@ } .dropdown-menu-due-date { + .dropdown-content { + max-height: 230px; + } + .ui-widget { table { margin: 0; -- cgit v1.2.1 From 720da4196c80ea4d0e0a1a865d70fe04094e4472 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 11 Apr 2016 10:49:48 +0100 Subject: Updated based on designs --- app/assets/stylesheets/framework/dropdowns.scss | 53 ++++++++++++++++++++----- 1 file changed, 44 insertions(+), 9 deletions(-) (limited to 'app/assets') diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss index 55c90b09e97..9ec0db324c9 100644 --- a/app/assets/stylesheets/framework/dropdowns.scss +++ b/app/assets/stylesheets/framework/dropdowns.scss @@ -248,7 +248,7 @@ .dropdown-title { position: relative; - padding: 0 25px 15px; + padding: 0 25px 10px; margin: 0 10px 10px; font-weight: 600; line-height: 1; @@ -278,7 +278,7 @@ right: 5px; width: 20px; height: 20px; - top: -1px; + top: -3px; } .dropdown-menu-back { @@ -420,8 +420,26 @@ } .ui-datepicker-header { - padding: 8px; + padding: 0 8px 10px; border: 0; + + .ui-icon { + background: none; + font-size: 20px; + text-indent: 0; + + &:before { + display: block; + position: relative; + top: -2px; + color: #707070; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + } } .ui-state-active, @@ -432,25 +450,41 @@ .ui-datepicker-prev, .ui-datepicker-next { + top: 0; + height: 15px; + cursor: pointer; + &:hover { background-color: transparent; border: 0; + + .ui-icon:before { + color: $md-link-color; + } } } .ui-datepicker-prev { - left: 1px; - top: 1px; + left: 0; + + .ui-icon:before { + content: '\f104'; + text-align: left; + } } .ui-datepicker-next { - right: 1px; - top: 1px; + right: 0; + + .ui-icon:before { + content: '\f105'; + text-align: right; + } } td { padding: 0; - border: 1px solid rgba(0, 0, 0, .1); + border: 1px solid rgba(#000, .1); &:first-child { border-left: 0; @@ -476,10 +510,11 @@ } th { - padding: 5px 0; + padding: 2px 0; color: #b8b8b8; font-weight: normal; text-transform: lowercase; + border-top: 1px solid rgba(#000, .1); } .ui-datepicker-unselectable { -- cgit v1.2.1 From e219867cd031e313a8d3b553d34594f6b872ca42 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 11 Apr 2016 11:07:02 +0100 Subject: Updates sidebar value --- app/assets/javascripts/due_date_select.js.coffee | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app/assets') diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee index b6e96002dfd..58d4f79ed84 100644 --- a/app/assets/javascripts/due_date_select.js.coffee +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -10,6 +10,7 @@ class @DueDateSelect $block = $dropdown.closest('.block') $selectbox = $dropdown.closest('.selectbox') $value = $block.find('.value') + $sidebarValue = $('.js-due-date-sidebar-value', $block) fieldName = $dropdown.data('field-name') abilityName = $dropdown.data('ability-name') @@ -44,8 +45,10 @@ class @DueDateSelect $value.removeAttr('style') $value.html(mediumDate) + $sidebarValue.html(mediumDate) ).done (data) -> $dropdown.trigger('loaded.gl.dropdown') + $dropdown.trigger('hidden.gl.dropdown') $loading.fadeOut() $datePicker.datepicker( -- cgit v1.2.1 From 49628664eee0ca3e4a9c2dbd8ed27b30a033b21f Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 14 Apr 2016 09:53:03 +0100 Subject: Removed buttons instead clicking date sets it Fixed issue with dropdown not being toggleable again --- app/assets/javascripts/due_date_select.js.coffee | 18 +++++++++--------- app/assets/javascripts/issuable_context.js.coffee | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee index 58d4f79ed84..78bdb3c0e04 100644 --- a/app/assets/javascripts/due_date_select.js.coffee +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -1,11 +1,12 @@ class @DueDateSelect constructor: -> - $loading = $('.js-issuable-update .due_date').find('.block-loading').hide() + $loading = $('.js-issuable-update .due_date') + .find('.block-loading') + .hide() $('.js-due-date-select').each (i, dropdown) -> $dropdown = $(dropdown) $dropdownParent = $dropdown.closest('.dropdown') - $addBtn = $('.js-due-date-add', $dropdownParent) $datePicker = $dropdownParent.find('.js-due-date-calendar') $block = $dropdown.closest('.block') $selectbox = $dropdown.closest('.selectbox') @@ -22,13 +23,10 @@ class @DueDateSelect $value.removeAttr('style') ) - $addBtn.on 'click', (e) -> - e.preventDefault() - e.stopPropagation() - + addDueDate = -> # Create the post date value = $("input[name='#{fieldName}']").val() - mediumDate = $.datepicker.formatDate("M d, yy", new Date(value)) + mediumDate = $.datepicker.formatDate('M d, yy', new Date(value)) data = {} data[abilityName] = {} @@ -48,13 +46,15 @@ class @DueDateSelect $sidebarValue.html(mediumDate) ).done (data) -> $dropdown.trigger('loaded.gl.dropdown') - $dropdown.trigger('hidden.gl.dropdown') + $dropdown.dropdown('toggle') $loading.fadeOut() $datePicker.datepicker( - dateFormat: "yy-mm-dd", + dateFormat: 'yy-mm-dd', defaultDate: $("input[name='#{fieldName}']").val() altField: "input[name='#{fieldName}']" + onSelect: -> + addDueDate() ) $(document) diff --git a/app/assets/javascripts/issuable_context.js.coffee b/app/assets/javascripts/issuable_context.js.coffee index 9ae0cd06039..3a439b94c59 100644 --- a/app/assets/javascripts/issuable_context.js.coffee +++ b/app/assets/javascripts/issuable_context.js.coffee @@ -33,7 +33,6 @@ class @IssuableContext $block.find('.dropdown-menu-toggle').trigger 'click' , 0 - $(".right-sidebar").niceScroll() initParticipants: -> -- cgit v1.2.1 From 4eeef1982426323d5d6337054892a1ef38946076 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 14 Apr 2016 13:32:00 +0100 Subject: Fixed date issue with timezones --- app/assets/javascripts/due_date_select.js.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee index 78bdb3c0e04..f0a20fe5a1f 100644 --- a/app/assets/javascripts/due_date_select.js.coffee +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -26,7 +26,9 @@ class @DueDateSelect addDueDate = -> # Create the post date value = $("input[name='#{fieldName}']").val() - mediumDate = $.datepicker.formatDate('M d, yy', new Date(value)) + valueSplit = value.split '-' + date = new Date(valueSplit[0], parseInt(valueSplit[1]) - 1, valueSplit[2]) + mediumDate = $.datepicker.formatDate 'M d, yy', date data = {} data[abilityName] = {} -- cgit v1.2.1 From 461608e14c628c59eb724ba8674da7d496c666c2 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 14 Apr 2016 13:42:57 +0100 Subject: replace hyphens to commas when converting date --- app/assets/javascripts/due_date_select.js.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'app/assets') diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee index f0a20fe5a1f..a4304786cbb 100644 --- a/app/assets/javascripts/due_date_select.js.coffee +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -26,8 +26,7 @@ class @DueDateSelect addDueDate = -> # Create the post date value = $("input[name='#{fieldName}']").val() - valueSplit = value.split '-' - date = new Date(valueSplit[0], parseInt(valueSplit[1]) - 1, valueSplit[2]) + date = new Date value.replace(new RegExp('-', 'g'), ',') mediumDate = $.datepicker.formatDate 'M d, yy', date data = {} -- cgit v1.2.1 From 5c8959bbc15ec47d8be62e8e1362e441cdd91d69 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 15 Apr 2016 08:32:01 +0100 Subject: Added variables --- app/assets/stylesheets/framework/dropdowns.scss | 14 +++++++------- app/assets/stylesheets/framework/variables.scss | 5 +++++ 2 files changed, 12 insertions(+), 7 deletions(-) (limited to 'app/assets') diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss index 9ec0db324c9..fd395041c3d 100644 --- a/app/assets/stylesheets/framework/dropdowns.scss +++ b/app/assets/stylesheets/framework/dropdowns.scss @@ -432,7 +432,7 @@ display: block; position: relative; top: -2px; - color: #707070; + color: $dropdown-title-btn-color; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; @@ -445,7 +445,7 @@ .ui-state-active, .ui-state-hover { color: $md-link-color; - background-color: #ecf3fe; + background-color: $calendar-hover-bg; } .ui-datepicker-prev, @@ -484,7 +484,7 @@ td { padding: 0; - border: 1px solid rgba(#000, .1); + border: 1px solid $calendar-border-color; &:first-child { border-left: 0; @@ -502,7 +502,7 @@ } .ui-datepicker-title { - color: #555; + color: $gl-gray; font-size: 15px; line-height: 1; font-weight: normal; @@ -511,13 +511,13 @@ th { padding: 2px 0; - color: #b8b8b8; + color: $calendar-header-color; font-weight: normal; text-transform: lowercase; - border-top: 1px solid rgba(#000, .1); + border-top: 1px solid $calendar-border-color; } .ui-datepicker-unselectable { - background-color: #faf9f9; + background-color: $calendar-unselectable-bg; } } diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index f910cf61817..30ca27ab104 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -241,3 +241,8 @@ $note-form-border-color: #e5e5e5; $note-toolbar-color: #959494; $zen-control-hover-color: #111; + +$calendar-header-color: #b8b8b8; +$calendar-hover-bg: #ecf3fe; +$calendar-border-color: rgba(#000, .1); +$calendar-unselectable-bg: #faf9f9; -- cgit v1.2.1