diff --git a/ui-v2/app/components/consul-nspace-list/index.hbs b/ui-v2/app/components/consul-nspace-list/index.hbs index 8c1a9c9de5..f5a35d2dfe 100644 --- a/ui-v2/app/components/consul-nspace-list/index.hbs +++ b/ui-v2/app/components/consul-nspace-list/index.hbs @@ -6,7 +6,7 @@ Deleting {{item.Name}}...

{{else}} - {{item.Name}} + {{item.Name}} {{/if}} @@ -48,7 +48,7 @@ - {{/if}} + {{/if}} diff --git a/ui-v2/app/components/consul-nspace-list/pageobject.js b/ui-v2/app/components/consul-nspace-list/pageobject.js index ef33cf4fc9..752dc6809b 100644 --- a/ui-v2/app/components/consul-nspace-list/pageobject.js +++ b/ui-v2/app/components/consul-nspace-list/pageobject.js @@ -1,6 +1,7 @@ export default (collection, clickable, attribute, text, actions) => () => { - return collection('.consul-nspace-list li:not(:first-child)', { + return collection('.consul-nspace-list [data-test-list-row]', { nspace: clickable('a'), + name: attribute('data-test-nspace', '[data-test-nspace]'), description: text('[data-test-description]'), ...actions(['edit', 'delete']), }); diff --git a/ui-v2/app/controllers/dc/nspaces/index.js b/ui-v2/app/controllers/dc/nspaces/index.js index 0584aee0a2..422233d168 100644 --- a/ui-v2/app/controllers/dc/nspaces/index.js +++ b/ui-v2/app/controllers/dc/nspaces/index.js @@ -2,6 +2,7 @@ import Controller from '@ember/controller'; export default Controller.extend({ queryParams: { + sortBy: 'sort', search: { as: 'filter', }, diff --git a/ui-v2/app/initializers/sort.js b/ui-v2/app/initializers/sort.js index 1809a505bf..9826e89679 100644 --- a/ui-v2/app/initializers/sort.js +++ b/ui-v2/app/initializers/sort.js @@ -4,6 +4,7 @@ import intention from 'consul-ui/sort/comparators/intention'; import token from 'consul-ui/sort/comparators/token'; import role from 'consul-ui/sort/comparators/role'; import policy from 'consul-ui/sort/comparators/policy'; +import nspace from 'consul-ui/sort/comparators/nspace'; export function initialize(container) { // Service-less injection using private properties at a per-project level @@ -15,6 +16,7 @@ export function initialize(container) { token: token(), role: role(), policy: policy(), + nspace: nspace(), }; Sort.reopen({ comparator: function(type) { diff --git a/ui-v2/app/routes/dc/nspaces/index.js b/ui-v2/app/routes/dc/nspaces/index.js index e6df448e3c..0b115b8eed 100644 --- a/ui-v2/app/routes/dc/nspaces/index.js +++ b/ui-v2/app/routes/dc/nspaces/index.js @@ -7,6 +7,7 @@ export default Route.extend(WithNspaceActions, { data: service('data-source/service'), repo: service('repository/nspace'), queryParams: { + sortBy: 'sort', search: { as: 'filter', replace: true, diff --git a/ui-v2/app/sort/comparators/nspace.js b/ui-v2/app/sort/comparators/nspace.js new file mode 100644 index 0000000000..62e718f7a1 --- /dev/null +++ b/ui-v2/app/sort/comparators/nspace.js @@ -0,0 +1,3 @@ +export default () => key => { + return key; +}; diff --git a/ui-v2/app/templates/dc/nspaces/index.hbs b/ui-v2/app/templates/dc/nspaces/index.hbs index 81862b1f28..ee95c08610 100644 --- a/ui-v2/app/templates/dc/nspaces/index.hbs +++ b/ui-v2/app/templates/dc/nspaces/index.hbs @@ -1,4 +1,11 @@ {{title 'Namespaces'}} +{{#let (selectable-key-values + (array "Name:asc" "A to Z") + (array "Name:desc" "Z to A") + selected=sortBy + ) + as |sort| +}} @@ -12,16 +19,22 @@ Create - -{{#if (gt items.length 0) }} + + {{#if (gt items.length 0)}} -{{/if}} - - + {{/if}} + + + {{#let (sort-by (comparator 'nspace' sort.selected.key) items) as |sorted|}} + + + {{/let}} +{{/let}} \ No newline at end of file diff --git a/ui-v2/tests/acceptance/dc/nspaces/index.feature b/ui-v2/tests/acceptance/dc/nspaces/index.feature index 567bbc9cea..adf725c589 100644 --- a/ui-v2/tests/acceptance/dc/nspaces/index.feature +++ b/ui-v2/tests/acceptance/dc/nspaces/index.feature @@ -10,7 +10,15 @@ Feature: dc / nspaces / index: Nspaces List Namespace: default --- And 1 datacenter model with the value "dc-1" - And 3 nspace models + And 3 nspace models from yaml + --- + - Name: a-namespace + Description: a namespace + - Name: default + Description: The default namespace + - Name: z-namespace + Description: z namespace + --- When I visit the nspaces page for yaml --- dc: dc-1 @@ -29,5 +37,5 @@ Feature: dc / nspaces / index: Nspaces List And I see 1 nspace model with the description "The default namespace" Scenario: The default namespace can't be deleted Then I see 3 nspace models - And I click actions on the nspaces - Then I don't see delete on the nspaces + And I click nspaces.1.actions + Then I don't see nspaces.1.delete diff --git a/ui-v2/tests/acceptance/dc/nspaces/sorting.feature b/ui-v2/tests/acceptance/dc/nspaces/sorting.feature new file mode 100644 index 0000000000..588bb76b35 --- /dev/null +++ b/ui-v2/tests/acceptance/dc/nspaces/sorting.feature @@ -0,0 +1,49 @@ +@setupApplicationTest +@onlyNamespaceable +Feature: dc / nspaces / sorting + Scenario: Sorting Namespaces + Given settings from yaml + --- + consul:token: + SecretID: secret + AccessorID: accessor + Namespace: default + --- + Given 1 datacenter model with the value "dc-1" + And 6 nspace models from yaml + --- + - Name: "nspace-5" + - Name: "nspace-3" + - Name: "nspace-1" + - Name: "nspace-4" + - Name: "nspace-2" + - Name: "nspace-6" + --- + When I visit the nspaces page for yaml + --- + dc: dc-1 + --- + Then the url should be /dc-1/namespaces + Then I see 6 nspace models + When I click selected on the sort + When I click options.1.button on the sort + Then I see name on the nspaces vertically like yaml + --- + - "nspace-6" + - "nspace-5" + - "nspace-4" + - "nspace-3" + - "nspace-2" + - "nspace-1" + --- + When I click selected on the sort + When I click options.0.button on the sort + Then I see name on the nspaces vertically like yaml + --- + - "nspace-1" + - "nspace-2" + - "nspace-3" + - "nspace-4" + - "nspace-5" + - "nspace-6" + --- \ No newline at end of file diff --git a/ui-v2/tests/acceptance/steps/dc/nspaces/sorting-steps.js b/ui-v2/tests/acceptance/steps/dc/nspaces/sorting-steps.js new file mode 100644 index 0000000000..ba1093295f --- /dev/null +++ b/ui-v2/tests/acceptance/steps/dc/nspaces/sorting-steps.js @@ -0,0 +1,10 @@ +import steps from '../../steps'; + +// step definitions that are shared between features should be moved to the +// tests/acceptance/steps/steps.js file + +export default function(assert) { + return steps(assert).then('I should find a file', function() { + assert.ok(true, this.step); + }); +} diff --git a/ui-v2/tests/pages.js b/ui-v2/tests/pages.js index d78068e838..244f8e74ef 100644 --- a/ui-v2/tests/pages.js +++ b/ui-v2/tests/pages.js @@ -181,7 +181,7 @@ export default { intentions(visitable, creatable, clickable, consulIntentionList, popoverSelect) ), intention: create(intention(visitable, submitable, deletable, cancelable)), - nspaces: create(nspaces(visitable, creatable, consulNspaceList, freetextFilter)), + nspaces: create(nspaces(visitable, creatable, consulNspaceList, popoverSelect)), nspace: create( nspace(visitable, submitable, deletable, cancelable, policySelector, roleSelector) ), diff --git a/ui-v2/tests/pages/dc/nspaces/index.js b/ui-v2/tests/pages/dc/nspaces/index.js index e7836e7b82..96b1a6b7cf 100644 --- a/ui-v2/tests/pages/dc/nspaces/index.js +++ b/ui-v2/tests/pages/dc/nspaces/index.js @@ -1,7 +1,7 @@ -export default function(visitable, creatable, nspaces, filter) { +export default function(visitable, creatable, nspaces, popoverSelect) { return creatable({ visit: visitable('/:dc/namespaces'), nspaces: nspaces(), - filter: filter(), + sort: popoverSelect(), }); }