From 2654da8fc59292895cf1112d264442f2a69a7221 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Wed, 10 Jun 2015 17:34:09 +0200 Subject: [PATCH] unify actions dropdowns --- .../js/apps/coding-rules/rule-filter-view.js | 2 +- .../coding-rules-rule-filter-form.hbs | 52 ++++--- .../main/js/apps/issues/issue-filter-view.js | 10 +- .../templates/issues-issue-filter-form.hbs | 128 ++++++++++-------- .../views => common}/action-options-view.js | 20 +-- .../templates/issue-assign-form-option.hbs | 8 +- .../issue/templates/issue-assign-form.hbs | 10 +- .../issue/templates/issue-plan-form.hbs | 12 +- .../templates/issue-set-severity-form.hbs | 12 +- .../templates/issue-tags-form-option.hbs | 28 ++-- .../issue/templates/issue-tags-form.hbs | 10 +- .../templates/issue-transitions-form.hbs | 14 +- .../issue/views/assign-form-view.js | 29 ++-- .../components/issue/views/plan-form-view.js | 2 +- .../issue/views/set-severity-form-view.js | 2 +- .../components/issue/views/tags-form-view.js | 12 +- .../issue/views/transitions-form-view.js | 2 +- .../main/less/components/bubble-popup.less | 4 + .../src/main/less/components/dropdowns.less | 2 +- .../src/main/less/components/issues.less | 22 --- .../src/main/less/components/menu.less | 20 ++- .../src/main/less/components/search.less | 5 + .../sonar-web/src/main/less/init/icons.less | 8 ++ server/sonar-web/src/main/less/variables.less | 2 +- .../sonar-web/src/test/js/issues-page-spec.js | 14 +- 25 files changed, 244 insertions(+), 186 deletions(-) rename server/sonar-web/src/main/js/components/{issue/views => common}/action-options-view.js (80%) diff --git a/server/sonar-web/src/main/js/apps/coding-rules/rule-filter-view.js b/server/sonar-web/src/main/js/apps/coding-rules/rule-filter-view.js index cbe6434e225..c0071aadc49 100644 --- a/server/sonar-web/src/main/js/apps/coding-rules/rule-filter-view.js +++ b/server/sonar-web/src/main/js/apps/coding-rules/rule-filter-view.js @@ -18,7 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ define([ - 'components/issue/views/action-options-view', + 'components/common/action-options-view', './templates' ], function (ActionOptionsView) { var $ = jQuery; diff --git a/server/sonar-web/src/main/js/apps/coding-rules/templates/coding-rules-rule-filter-form.hbs b/server/sonar-web/src/main/js/apps/coding-rules/templates/coding-rules-rule-filter-form.hbs index 35f896c0264..e8876920f62 100644 --- a/server/sonar-web/src/main/js/apps/coding-rules/templates/coding-rules-rule-filter-form.hbs +++ b/server/sonar-web/src/main/js/apps/coding-rules/templates/coding-rules-rule-filter-form.hbs @@ -1,38 +1,50 @@ -
{{t 'coding_rules.filter_similar_rules'}}
+ -
- - {{langName}} - +
+
diff --git a/server/sonar-web/src/main/js/apps/issues/issue-filter-view.js b/server/sonar-web/src/main/js/apps/issues/issue-filter-view.js index 67f9a617d45..28a6a86e212 100644 --- a/server/sonar-web/src/main/js/apps/issues/issue-filter-view.js +++ b/server/sonar-web/src/main/js/apps/issues/issue-filter-view.js @@ -1,5 +1,5 @@ define([ - 'components/issue/views/action-options-view', + 'components/common/action-options-view', './templates' ], function (ActionOptionsView) { @@ -8,19 +8,15 @@ define([ return ActionOptionsView.extend({ template: Templates['issues-issue-filter-form'], - selectInitialOption: function () { - return this.makeActive(this.getOptions().first()); - }, - selectOption: function (e) { var property = $(e.currentTarget).data('property'), value = $(e.currentTarget).data('value'); this.trigger('select', property, value); - return ActionOptionsView.prototype.selectOption.apply(this, arguments); + this._super(e); }, serializeData: function () { - return _.extend(ActionOptionsView.prototype.serializeData.apply(this, arguments), { + return _.extend(this._super(), { s: this.model.get('severity') }); } diff --git a/server/sonar-web/src/main/js/apps/issues/templates/issues-issue-filter-form.hbs b/server/sonar-web/src/main/js/apps/issues/templates/issues-issue-filter-form.hbs index b0505212688..e9e1d0621b0 100644 --- a/server/sonar-web/src/main/js/apps/issues/templates/issues-issue-filter-form.hbs +++ b/server/sonar-web/src/main/js/apps/issues/templates/issues-issue-filter-form.hbs @@ -1,71 +1,93 @@ -
{{t "issue.filter_similar_issues"}}
+ -
- - {{severityIcon severity}} {{t "severity" severity}} - - - - {{statusIcon status}} {{t "issue.status" status}} - - - {{#if resolution}} - - {{t "issue.resolution" resolution}} +
+
  • + + {{qualifierIcon componentQualifier}} {{fileFromPath componentLongName}} + +
  • +
    diff --git a/server/sonar-web/src/main/js/components/issue/views/action-options-view.js b/server/sonar-web/src/main/js/components/common/action-options-view.js similarity index 80% rename from server/sonar-web/src/main/js/components/issue/views/action-options-view.js rename to server/sonar-web/src/main/js/components/common/action-options-view.js index 57b5c95d0a9..cf3a9b26d9e 100644 --- a/server/sonar-web/src/main/js/components/issue/views/action-options-view.js +++ b/server/sonar-web/src/main/js/components/common/action-options-view.js @@ -5,16 +5,17 @@ define([ var $ = jQuery; return PopupView.extend({ - keyScope: 'issue-action-options', + className: 'bubble-popup bubble-popup-menu', + keyScope: 'action-options', ui: { - options: '.issue-action-option' + options: '.menu > li > a' }, events: function () { return { - 'click .issue-action-option': 'selectOption', - 'mouseenter .issue-action-option': 'activateOptionByPointer' + 'click @ui.options': 'selectOption', + 'mouseenter @ui.options': 'activateOptionByPointer' }; }, @@ -25,11 +26,10 @@ define([ onRender: function () { PopupView.prototype.onRender.apply(this, arguments); this.selectInitialOption(); - this.$('[data-toggle="tooltip"]').tooltip({ container: 'body' }); }, getOptions: function () { - return this.$('.issue-action-option'); + return this.$('.menu > li > a'); }, getActiveOption: function () { @@ -38,8 +38,8 @@ define([ makeActive: function (option) { if (option.length > 0) { - this.getOptions().removeClass('active'); - option.addClass('active'); + this.getOptions().removeClass('active').tooltip('hide'); + option.addClass('active').tooltip('show'); } }, @@ -48,12 +48,12 @@ define([ }, selectNextOption: function () { - this.makeActive(this.getActiveOption().nextAll('.issue-action-option').first()); + this.makeActive(this.getActiveOption().parent().nextAll('li:not(.divider)').first().children('a')); return false; }, selectPreviousOption: function () { - this.makeActive(this.getActiveOption().prevAll('.issue-action-option').first()); + this.makeActive(this.getActiveOption().parent().prevAll('li:not(.divider)').first().children('a')); return false; }, diff --git a/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form-option.hbs b/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form-option.hbs index e35905f8c1d..29550cde4da 100644 --- a/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form-option.hbs +++ b/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form-option.hbs @@ -1,3 +1,5 @@ - - {{text}} - +
  • + + {{text}} + +
  • diff --git a/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form.hbs b/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form.hbs index 9d20be8d079..9509d787163 100644 --- a/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form.hbs +++ b/server/sonar-web/src/main/js/components/issue/templates/issue-assign-form.hbs @@ -1,6 +1,10 @@ -
    - - + + +
    diff --git a/server/sonar-web/src/main/js/components/issue/templates/issue-plan-form.hbs b/server/sonar-web/src/main/js/components/issue/templates/issue-plan-form.hbs index d4e693aa9d0..9184dd34b64 100644 --- a/server/sonar-web/src/main/js/components/issue/templates/issue-plan-form.hbs +++ b/server/sonar-web/src/main/js/components/issue/templates/issue-plan-form.hbs @@ -1,11 +1,13 @@ -
    +
    +
    diff --git a/server/sonar-web/src/main/js/components/issue/templates/issue-set-severity-form.hbs b/server/sonar-web/src/main/js/components/issue/templates/issue-set-severity-form.hbs index 7007fddf67e..ea6a3a92b15 100644 --- a/server/sonar-web/src/main/js/components/issue/templates/issue-set-severity-form.hbs +++ b/server/sonar-web/src/main/js/components/issue/templates/issue-set-severity-form.hbs @@ -1,9 +1,11 @@ - +
    diff --git a/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form-option.hbs b/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form-option.hbs index df054fe2466..90df7aa6e62 100644 --- a/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form-option.hbs +++ b/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form-option.hbs @@ -1,15 +1,17 @@ - +
  • + - {{#if selected}} - - {{else}} - - {{/if}} + {{#if selected}} + + {{else}} + + {{/if}} - {{#if custom}} - + {{tag}} - {{else}} - {{tag}} - {{/if}} - + {{#if custom}} + + {{tag}} + {{else}} + {{tag}} + {{/if}} + +
  • diff --git a/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form.hbs b/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form.hbs index 9d20be8d079..9509d787163 100644 --- a/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form.hbs +++ b/server/sonar-web/src/main/js/components/issue/templates/issue-tags-form.hbs @@ -1,6 +1,10 @@ -
    - - + + +
    diff --git a/server/sonar-web/src/main/js/components/issue/templates/issue-transitions-form.hbs b/server/sonar-web/src/main/js/components/issue/templates/issue-transitions-form.hbs index 2fa1f4cb7dd..ef8ae2f24af 100644 --- a/server/sonar-web/src/main/js/components/issue/templates/issue-transitions-form.hbs +++ b/server/sonar-web/src/main/js/components/issue/templates/issue-transitions-form.hbs @@ -1,10 +1,12 @@ - +
    diff --git a/server/sonar-web/src/main/js/components/issue/views/assign-form-view.js b/server/sonar-web/src/main/js/components/issue/views/assign-form-view.js index bca6a296365..34123ec1d6e 100644 --- a/server/sonar-web/src/main/js/components/issue/views/assign-form-view.js +++ b/server/sonar-web/src/main/js/components/issue/views/assign-form-view.js @@ -1,5 +1,5 @@ define([ - './action-options-view', + 'components/common/action-options-view', '../templates' ], function (ActionOptionsView) { @@ -18,8 +18,8 @@ define([ }, initialize: function () { - ActionOptionsView.prototype.initialize.apply(this, arguments); - this.assignees = []; + this._super(); + this.assignees = null; this.debouncedSearch = _.debounce(this.search, 250); }, @@ -33,7 +33,7 @@ define([ onRender: function () { var that = this; - ActionOptionsView.prototype.onRender.apply(this, arguments); + this._super(); this.renderTags(); setTimeout(function () { that.$('input').focus(); @@ -41,21 +41,22 @@ define([ }, renderTags: function () { - this.$('.issue-action-option').remove(); + this.$('.menu').empty(); this.getAssignees().forEach(this.renderAssignee, this); + this.bindUIElements(); this.selectInitialOption(); }, renderAssignee: function (assignee) { var html = this.optionTemplate(assignee); - this.$('.issue-action-options').append(html); + this.$('.menu').append(html); }, selectOption: function (e) { var assignee = $(e.currentTarget).data('value'), assigneeName = $(e.currentTarget).data('text'); this.submit(assignee, assigneeName); - return ActionOptionsView.prototype.selectOption.apply(this, arguments); + return this._super(e); }, submit: function (assignee, assigneeName) { @@ -123,19 +124,23 @@ define([ that.resetAssignees(data.users); }); } else { - this.resetAssignees([]); + this.resetAssignees(); } }, resetAssignees: function (users) { - this.assignees = users.map(function (user) { - return { id: user.login, text: user.name }; - }); + if (users) { + this.assignees = users.map(function (user) { + return { id: user.login, text: user.name }; + }); + } else { + this.assignees = null; + } this.renderTags(); }, getAssignees: function () { - if (this.assignees.length > 0) { + if (this.assignees) { return this.assignees; } var assignees = [{ id: '', text: t('unassigned') }], diff --git a/server/sonar-web/src/main/js/components/issue/views/plan-form-view.js b/server/sonar-web/src/main/js/components/issue/views/plan-form-view.js index 5bc566cf67d..72741a6501b 100644 --- a/server/sonar-web/src/main/js/components/issue/views/plan-form-view.js +++ b/server/sonar-web/src/main/js/components/issue/views/plan-form-view.js @@ -1,5 +1,5 @@ define([ - './action-options-view', + 'components/common/action-options-view', '../templates' ], function (ActionOptionsView) { diff --git a/server/sonar-web/src/main/js/components/issue/views/set-severity-form-view.js b/server/sonar-web/src/main/js/components/issue/views/set-severity-form-view.js index 87e0cd51996..5595660ef03 100644 --- a/server/sonar-web/src/main/js/components/issue/views/set-severity-form-view.js +++ b/server/sonar-web/src/main/js/components/issue/views/set-severity-form-view.js @@ -1,5 +1,5 @@ define([ - './action-options-view', + 'components/common/action-options-view', '../templates' ], function (ActionOptionsView) { diff --git a/server/sonar-web/src/main/js/components/issue/views/tags-form-view.js b/server/sonar-web/src/main/js/components/issue/views/tags-form-view.js index 868230ccd88..a5f4e5abc92 100644 --- a/server/sonar-web/src/main/js/components/issue/views/tags-form-view.js +++ b/server/sonar-web/src/main/js/components/issue/views/tags-form-view.js @@ -1,5 +1,5 @@ define([ - './action-options-view', + 'components/common/action-options-view', '../templates' ], function (ActionOptionsView) { @@ -32,7 +32,7 @@ define([ requestTags: function () { var that = this; - return $.get(baseUrl + '/api/issues/tags', { ps: 25 }).done(function (data) { + return $.get(baseUrl + '/api/issues/tags', { ps: 10 }).done(function (data) { that.tags = data.tags; that.renderTags(); }); @@ -60,7 +60,7 @@ define([ }, renderTags: function () { - this.$('.issue-action-option').remove(); + this.$('.menu').empty(); this.filterTags(this.getTags()).forEach(this.renderSelectedTag, this); this.filterTags(_.difference(this.tags, this.getTags())).forEach(this.renderTag, this); if (this.query.length > 0 && this.tags.indexOf(this.query) === -1 && this.getTags().indexOf(this.query) === -1) { @@ -75,7 +75,7 @@ define([ selected: true, custom: false }); - return this.$('.issue-action-options').append(html); + return this.$('.menu').append(html); }, renderTag: function (tag) { @@ -84,7 +84,7 @@ define([ selected: false, custom: false }); - return this.$('.issue-action-options').append(html); + return this.$('.menu').append(html); }, renderCustomTag: function (tag) { @@ -93,7 +93,7 @@ define([ selected: false, custom: true }); - return this.$('.issue-action-options').append(html); + return this.$('.menu').append(html); }, selectOption: function (e) { diff --git a/server/sonar-web/src/main/js/components/issue/views/transitions-form-view.js b/server/sonar-web/src/main/js/components/issue/views/transitions-form-view.js index 9d56b101591..3fb80bbe479 100644 --- a/server/sonar-web/src/main/js/components/issue/views/transitions-form-view.js +++ b/server/sonar-web/src/main/js/components/issue/views/transitions-form-view.js @@ -1,5 +1,5 @@ define([ - './action-options-view', + 'components/common/action-options-view', '../templates' ], function (ActionOptionsView) { diff --git a/server/sonar-web/src/main/less/components/bubble-popup.less b/server/sonar-web/src/main/less/components/bubble-popup.less index 947c7a84fdf..60ca63e2b47 100644 --- a/server/sonar-web/src/main/less/components/bubble-popup.less +++ b/server/sonar-web/src/main/less/components/bubble-popup.less @@ -35,6 +35,10 @@ box-shadow: @defaultShadow; } +.bubble-popup-menu { + padding: 0; +} + .bubble-popup-arrow, .bubble-popup-arrow:after { position: absolute; diff --git a/server/sonar-web/src/main/less/components/dropdowns.less b/server/sonar-web/src/main/less/components/dropdowns.less index e963838cd26..145443d0afb 100644 --- a/server/sonar-web/src/main/less/components/dropdowns.less +++ b/server/sonar-web/src/main/less/components/dropdowns.less @@ -45,7 +45,7 @@ text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) background-color: #fff; border: 1px solid @barBorderColor; - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: @defaultShadow; background-clip: padding-box; &.pull-right { diff --git a/server/sonar-web/src/main/less/components/issues.less b/server/sonar-web/src/main/less/components/issues.less index 5af36fb5f2a..e15e560b9cb 100644 --- a/server/sonar-web/src/main/less/components/issues.less +++ b/server/sonar-web/src/main/less/components/issues.less @@ -216,28 +216,6 @@ white-space: nowrap; } -.issue-action-options { - position: relative; - min-width: 120px; - margin: 0 -10px; - font-size: @smallFontSize; -} - -.issue-action-option { - display: block; - padding: 3px 10px; -} - -a.issue-action-option { - border-bottom: none; - color: @baseFontColor; - - &.active { - background-color: @barBackgroundColor; - color: @baseFontColor; - } -} - input.issue-action-options-search { padding: 0 10px 0 30px; border: none; diff --git a/server/sonar-web/src/main/less/components/menu.less b/server/sonar-web/src/main/less/components/menu.less index 37df30a50f5..b805869ec17 100644 --- a/server/sonar-web/src/main/less/components/menu.less +++ b/server/sonar-web/src/main/less/components/menu.less @@ -19,6 +19,8 @@ */ @import (reference) "../mixins"; @import (reference) "../variables"; +@import (reference) "../init/links"; +@import (reference) "../init/type"; @import (reference) "ui"; .menu { @@ -33,7 +35,7 @@ > li > a, > li > span { display: block; - padding: 4px 20px; + padding: 4px 16px; line-height: 16px; clear: both; font-weight: normal; @@ -42,6 +44,8 @@ > li > a { color: @baseFontColor; + .link-no-underline; + .trans(none); } .divider { @@ -57,16 +61,22 @@ &:hover, &:focus { text-decoration: none; color: @baseFontColor; - background-color: @lightBlue; + background-color: @barBackgroundColor; } } - -.menu > .active > a { +.menu > .active > a, +.menu > li > a.active { &, &:hover, &:focus { color: @baseFontColor; text-decoration: none; outline: 0; - background-color: @lightBlue; + background-color: @barBackgroundColor; } } + +.menu-search { + padding: 4px 16px 0; + + .search-box-input { font-size: @smallFontSize; } +} diff --git a/server/sonar-web/src/main/less/components/search.less b/server/sonar-web/src/main/less/components/search.less index 48be2ff2905..14bc3baf136 100644 --- a/server/sonar-web/src/main/less/components/search.less +++ b/server/sonar-web/src/main/less/components/search.less @@ -21,4 +21,9 @@ color: @secondFontColor; font-size: @iconSmallFontSize; } + + .icon-search-new { + position: relative; + top: 1px; + } } diff --git a/server/sonar-web/src/main/less/init/icons.less b/server/sonar-web/src/main/less/init/icons.less index 0d8a7d68c27..4165443ea14 100644 --- a/server/sonar-web/src/main/less/init/icons.less +++ b/server/sonar-web/src/main/less/init/icons.less @@ -474,6 +474,14 @@ a[class^="icon-"], a[class*=" icon-"] { content: "\f002"; font-size: @iconFontSize; } +.icon-search-new { + display: inline-block; + vertical-align: top; + .square(16px); + background-size: 13px 14px; + background: no-repeat center center; + background-image: url('data:image/svg+xml,%3Csvg%20width%3D%2213%22%20height%3D%2214%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20stroke-linejoin%3D%22round%22%20stroke-miterlimit%3D%221.414%22%3E%3Cpath%20d%3D%22M9%206.5c0-.964-.342-1.788-1.027-2.473C7.288%203.342%206.463%203%205.5%203c-.964%200-1.788.342-2.473%201.027C2.342%204.712%202%205.537%202%206.5c0%20.964.342%201.788%201.027%202.473C3.712%209.658%204.537%2010%205.5%2010c.964%200%201.788-.342%202.473-1.027C8.658%208.288%209%207.463%209%206.5zm4%206.5c0%20.27-.1.505-.297.703-.198.198-.432.297-.703.297-.28%200-.516-.1-.703-.297l-2.68-2.672c-.932.647-1.97.97-3.117.97-.745%200-1.457-.145-2.137-.434-.68-.29-1.265-.68-1.758-1.171-.492-.493-.882-1.08-1.17-1.758C.144%207.957%200%207.245%200%206.5c0-.745.145-1.457.434-2.137.29-.68.68-1.265%201.17-1.758.494-.492%201.08-.882%201.76-1.17C4.043%201.144%204.753%201%205.5%201c.745%200%201.457.145%202.137.434.68.29%201.265.68%201.758%201.17.492.494.882%201.08%201.17%201.76.29.68.435%201.39.435%202.136%200%201.146-.323%202.185-.97%203.117l2.68%202.68c.194.193.29.427.29.703z%22%20fill%3D%22%23777%22%20fill-rule%3D%22nonzero%22%2F%3E%3C%2Fsvg%3E'); +} .icon-edit:before { content: "\f040"; font-size: @iconFontSize; diff --git a/server/sonar-web/src/main/less/variables.less b/server/sonar-web/src/main/less/variables.less index 6deab8de02e..9ff6b6b28ef 100644 --- a/server/sonar-web/src/main/less/variables.less +++ b/server/sonar-web/src/main/less/variables.less @@ -156,7 +156,7 @@ * Shadows */ -@defaultShadow: 10px 10px 20px rgba(0, 0, 0, 0.5); +@defaultShadow: 0 6px 12px rgba(0, 0, 0, .175); diff --git a/server/sonar-web/src/test/js/issues-page-spec.js b/server/sonar-web/src/test/js/issues-page-spec.js index 9a3df230f40..dbbfe698475 100644 --- a/server/sonar-web/src/test/js/issues-page-spec.js +++ b/server/sonar-web/src/test/js/issues-page-spec.js @@ -237,16 +237,16 @@ casper.test.begin(testName('Issue Box', 'Tags'), function (test) { }) .then(function () { - casper.waitForSelector('.issue-action-option[data-value=design]'); + casper.waitForSelector('a[data-value=design]'); }) .then(function () { - casper.click('.issue-action-option[data-value=design]'); + casper.click('a[data-value=design]'); test.assertSelectorContains('.issue.selected .js-issue-tags', 'security, cwe, design'); }) .then(function () { - casper.click('.issue-action-option[data-value=cwe]'); + casper.click('a[data-value=cwe]'); test.assertSelectorContains('.issue.selected .js-issue-tags', 'security, design'); }) @@ -284,13 +284,13 @@ casper.test.begin(testName('Issue Box', 'Transitions'), function (test) { .then(function () { casper.click('.issue.selected .js-issue-transition'); - casper.waitForSelector('.issue-action-option'); + casper.waitForSelector('.menu > li > a'); }) .then(function () { - test.assertExists('.issue-action-option[data-value=unconfirm]'); - test.assertExists('.issue-action-option[data-value=resolve]'); - test.assertExists('.issue-action-option[data-value=falsepositive]'); + test.assertExists('a[data-value=unconfirm]'); + test.assertExists('a[data-value=resolve]'); + test.assertExists('a[data-value=falsepositive]'); }) .then(function () { -- 2.39.5