diff --git a/ui/app/adapters/config-ui/message.js b/ui/app/adapters/config-ui/message.js
index 6aa3afbed2..33eb9a05d7 100644
--- a/ui/app/adapters/config-ui/message.js
+++ b/ui/app/adapters/config-ui/message.js
@@ -11,8 +11,11 @@ export default class MessageAdapter extends ApplicationAdapter {
}
query(store, type, query) {
- const { authenticated } = query;
- return super.query(store, type, { authenticated, list: true });
+ const { authenticated, type: messageType, active } = query;
+ const params = { authenticated, list: true };
+ if (messageType) params.type = messageType;
+ if (typeof active === 'boolean') params.active = active;
+ return super.query(store, type, params);
}
queryRecord(store, type, id) {
diff --git a/ui/lib/config-ui/addon/components/messages/page/list.hbs b/ui/lib/config-ui/addon/components/messages/page/list.hbs
index 851bd4ab9b..f54576829a 100644
--- a/ui/lib/config-ui/addon/components/messages/page/list.hbs
+++ b/ui/lib/config-ui/addon/components/messages/page/list.hbs
@@ -9,16 +9,40 @@
@breadcrumbs={{this.breadcrumbs}}
>
<:toolbarFilters>
- {{#if @messages.meta.total}}
-
+
+
- {{/if}}
+
+
<:toolbarActions>
{{/if}}
{{#if message.canDeleteCustomMessages}}
-
+
{{/if}}
{{/if}}
diff --git a/ui/lib/config-ui/addon/components/messages/page/list.js b/ui/lib/config-ui/addon/components/messages/page/list.js
index edd3a6dfb6..2261e8847b 100644
--- a/ui/lib/config-ui/addon/components/messages/page/list.js
+++ b/ui/lib/config-ui/addon/components/messages/page/list.js
@@ -91,6 +91,20 @@ export default class MessagesList extends Component {
return [{ label: 'Messages' }, { label }];
}
+ get statusFilterOptions() {
+ return [
+ { id: 'active', name: 'active' },
+ { id: 'inactive', name: 'inactive' },
+ ];
+ }
+
+ get typeFilterOptions() {
+ return [
+ { id: 'modal', name: 'modal' },
+ { id: 'banner', name: 'banner' },
+ ];
+ }
+
// callback from HDS pagination to set the queryParams page
get paginationQueryParams() {
return (page) => {
@@ -100,6 +114,12 @@ export default class MessagesList extends Component {
};
}
+ transitionToMessagesWithParams(queryParams) {
+ this.router.transitionTo('vault.cluster.config-ui.messages', {
+ queryParams,
+ });
+ }
+
@task
*deleteMessage(message) {
try {
@@ -117,10 +137,16 @@ export default class MessagesList extends Component {
}
@action
- onFilterChange(pageFilter) {
- this.router.transitionTo('vault.cluster.config-ui.messages', {
- queryParams: { pageFilter },
- });
+ onFilterInputChange(pageFilter) {
+ this.transitionToMessagesWithParams({ pageFilter });
+ }
+
+ @action
+ onFilterChange(filterType, [filterOption]) {
+ const param = {};
+ param[filterType] = filterOption;
+ param.page = 1;
+ this.transitionToMessagesWithParams(param);
}
@action
diff --git a/ui/lib/config-ui/addon/controllers/messages/index.js b/ui/lib/config-ui/addon/controllers/messages/index.js
index 586afcb863..afd38fcf26 100644
--- a/ui/lib/config-ui/addon/controllers/messages/index.js
+++ b/ui/lib/config-ui/addon/controllers/messages/index.js
@@ -5,9 +5,11 @@
import Controller from '@ember/controller';
export default class MessagesController extends Controller {
- queryParams = ['authenticated', 'page', 'pageFilter'];
+ queryParams = ['authenticated', 'page', 'pageFilter', 'status', 'type'];
authenticated = true;
page = 1;
pageFilter = '';
+ type = null;
+ status = null;
}
diff --git a/ui/lib/config-ui/addon/routes/messages/index.js b/ui/lib/config-ui/addon/routes/messages/index.js
index f8b5c1f68a..ee882b6c3d 100644
--- a/ui/lib/config-ui/addon/routes/messages/index.js
+++ b/ui/lib/config-ui/addon/routes/messages/index.js
@@ -20,17 +20,30 @@ export default class MessagesRoute extends Route {
pageFilter: {
refreshModel: true,
},
+ status: {
+ refreshModel: true,
+ },
+ type: {
+ refreshModel: true,
+ },
};
model(params) {
- const { authenticated, page, pageFilter } = params;
+ const { authenticated, page, pageFilter, status, type } = params;
const filter = pageFilter
? (dataset) => dataset.filter((item) => item?.title.toLowerCase().includes(pageFilter.toLowerCase()))
: null;
+ let active;
+
+ if (status === 'active') active = true;
+ if (status === 'inactive') active = false;
+
const messages = this.store
.lazyPaginatedQuery('config-ui/message', {
authenticated,
pageFilter: filter,
+ active,
+ type,
responsePath: 'data.keys',
page: page || 1,
size: 10,
@@ -42,7 +55,7 @@ export default class MessagesRoute extends Route {
throw e;
});
return hash({
- pageFilter,
+ params,
messages,
});
}
@@ -56,6 +69,9 @@ export default class MessagesRoute extends Route {
resetController(controller, isExiting) {
if (isExiting) {
controller.set('pageFilter', null);
+ controller.set('page', 1);
+ controller.set('status', null);
+ controller.set('type', null);
}
}
}
diff --git a/ui/lib/config-ui/addon/templates/messages/index.hbs b/ui/lib/config-ui/addon/templates/messages/index.hbs
index d28fe8c862..24837025c5 100644
--- a/ui/lib/config-ui/addon/templates/messages/index.hbs
+++ b/ui/lib/config-ui/addon/templates/messages/index.hbs
@@ -6,5 +6,5 @@
\ No newline at end of file
diff --git a/ui/lib/core/addon/components/search-select.hbs b/ui/lib/core/addon/components/search-select.hbs
index 6ec61e8e22..e21441aa8b 100644
--- a/ui/lib/core/addon/components/search-select.hbs
+++ b/ui/lib/core/addon/components/search-select.hbs
@@ -38,7 +38,7 @@
{
diff --git a/ui/tests/acceptance/config-ui/messages/messages-test.js b/ui/tests/acceptance/config-ui/messages/messages-test.js
index b65f9f2c04..61d470cbe5 100644
--- a/ui/tests/acceptance/config-ui/messages/messages-test.js
+++ b/ui/tests/acceptance/config-ui/messages/messages-test.js
@@ -12,6 +12,7 @@ import logout from 'vault/tests/pages/logout';
import { format, addDays, startOfDay } from 'date-fns';
import { datetimeLocalStringFormat } from 'core/utils/date-formatters';
import { PAGE } from 'vault/tests/helpers/config-ui/message-selectors';
+import { clickTrigger } from 'ember-power-select/test-support/helpers';
module('Acceptance | config-ui', function (hooks) {
setupApplicationTest(hooks);
@@ -93,6 +94,44 @@ module('Acceptance | config-ui', function (hooks) {
await click(PAGE.confirmButton);
assert.dom('[data-test-component="empty-state"]').exists('Message was deleted');
});
+ test('it should filter by type and status', async function (assert) {
+ assert.expect(6);
+ await this.createMessage('banner', null);
+ await this.createMessage('banner');
+ await visit('vault/config-ui/messages');
+
+ // check number of messages with status filters
+ await clickTrigger('#filter-by-message-status');
+ await click('.ember-power-select-options [data-option-index="0"]');
+ assert.dom('.linked-block').exists({ count: 1 }, 'filtered by active');
+ await click('[data-test-selected-list-button="delete"]');
+ await clickTrigger('#filter-by-message-status');
+ await click('.ember-power-select-options [data-option-index="1"]');
+ assert.dom('.linked-block').exists({ count: 1 }, 'filtered by inactive');
+ await click('[data-test-selected-list-button="delete"]');
+
+ // check number of messages with type filters
+ await clickTrigger('#filter-by-message-type');
+ await click('.ember-power-select-options [data-option-index="0"]');
+ assert.dom('.linked-block').exists({ count: 0 }, 'filtered by modal');
+ await click('[data-test-selected-list-button="delete"]');
+ await clickTrigger('#filter-by-message-type');
+ await click('.ember-power-select-options [data-option-index="1"]');
+ assert.dom('.linked-block').exists({ count: 2 }, 'filtered by banner');
+ await click('[data-test-selected-list-button="delete"]');
+
+ // check number of messages with no filters
+ assert.dom('.linked-block').exists({ count: 2 }, 'no filters selected');
+
+ // clean up custom messages
+ await click(PAGE.listItem('Awesome custom message title'));
+ await click(PAGE.confirmActionButton('Delete message'));
+ await click(PAGE.confirmButton);
+ await click(PAGE.listItem('Awesome custom message title'));
+ await click(PAGE.confirmActionButton('Delete message'));
+ await click(PAGE.confirmButton);
+ assert.dom('[data-test-component="empty-state"]').exists('Message was deleted');
+ });
test('it should display preview a message when all required fields are filled out', async function (assert) {
assert.expect(2);
await visit(`vault/config-ui/messages`);