diff --git a/addons/api/addon/services/resource-filter-store.js b/addons/api/addon/services/resource-filter-store.js index 9dbca0f5e..35582302b 100644 --- a/addons/api/addon/services/resource-filter-store.js +++ b/addons/api/addon/services/resource-filter-store.js @@ -33,7 +33,8 @@ export class ResourceFilter { this.or(valuesArray.map((value) => this.equals(key, value))) ); }) - .flat(); + .flat() + .filter((item) => item); return this.and(clauses); } diff --git a/ui/admin/app/routes/scopes/scope/sessions.js b/ui/admin/app/routes/scopes/scope/sessions.js index 402704e55..525cfdf1d 100644 --- a/ui/admin/app/routes/scopes/scope/sessions.js +++ b/ui/admin/app/routes/scopes/scope/sessions.js @@ -21,7 +21,7 @@ export default class ScopesScopeSessionsRoute extends Route { // =attributes - @resourceFilterParam(['active', 'pending', 'canceling', 'terminated']) status; + @resourceFilterParam(['active', 'pending', 'canceling', 'terminated'], ['active','pending', 'canceling']) status; /** * A simple Ember Concurrency-based polling task that refreshes the route diff --git a/ui/admin/config/environment.js b/ui/admin/config/environment.js index 613c6a3e8..4792a3c17 100644 --- a/ui/admin/config/environment.js +++ b/ui/admin/config/environment.js @@ -94,10 +94,10 @@ module.exports = function (environment) { 'oidc-crud': true, 'oidc-account-crud': true, search: false, - filter: false, + filter: true, capabilities: true, 'credential-store': true, - 'managed-groups': false, + 'managed-groups': true, }, }; @@ -133,9 +133,6 @@ module.exports = function (environment) { if (API_HOST) ENV.contentSecurityPolicy['connect-src'].push(API_HOST); // Enable features in development - ENV.featureFlags['capabilities'] = true; - ENV.featureFlags['filter'] = true; - ENV.featureFlags['managed-groups'] = true; } if (environment === 'test') { @@ -160,9 +157,6 @@ module.exports = function (environment) { ENV.enableConfirmService = false; // Enable tests for development features - ENV.featureFlags['capabilities'] = true; - ENV.featureFlags['filter'] = true; - ENV.featureFlags['managed-groups'] = true; } if (environment === 'production') { diff --git a/ui/desktop/app/routes/scopes/scope/projects/sessions.js b/ui/desktop/app/routes/scopes/scope/projects/sessions.js index 799785f5b..f190e1b75 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/sessions.js +++ b/ui/desktop/app/routes/scopes/scope/projects/sessions.js @@ -4,6 +4,7 @@ import { task, timeout } from 'ember-concurrency'; import config from '../../../../config/environment'; import { action } from '@ember/object'; import { notifySuccess, notifyError } from 'core/decorators/notify'; +import { resourceFilterParam } from 'core/decorators/resource-filter-param'; const POLL_TIMEOUT_SECONDS = config.sessionPollingTimeoutSeconds; @@ -17,6 +18,8 @@ export default class ScopesScopeProjectsSessionsRoute extends Route { // =attributes + @resourceFilterParam(['active', 'pending', 'canceling', 'terminated'], ['active','pending', 'canceling']) status; + /** * A simple Ember Concurrency-based polling task that refreshes the route * every POLL_TIMEOUT_SECONDS seconds. This is necessary to display changes @@ -50,10 +53,11 @@ export default class ScopesScopeProjectsSessionsRoute extends Route { * @return {Promise{[{session: SessionModel, target: TargetModel}]}} */ async model() { + const { status } = this; const { id: scope_id } = this.modelFor('scopes.scope'); const { user_id } = this.session.data.authenticated; await this.store.query('target', { recursive: true, scope_id }); - return await this.resourceFilterStore.queryBy('session', { user_id }, { + return await this.resourceFilterStore.queryBy('session', { user_id , status }, { recursive: true, scope_id }); @@ -86,4 +90,22 @@ export default class ScopesScopeProjectsSessionsRoute extends Route { await session.cancelSession(); await this.ipc.invoke('stop', { session_id: session.id }); } + + /** + * Sets the specified resource filter field to the specified value. + * @param {string} field + * @param value + */ + @action + filterBy(field, value) { + this[field] = value; + } + + /** + * Clears and filter selections. + */ + @action + clearAllFilters() { + this.status = []; + } } diff --git a/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs b/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs index 49b3b5423..2ebe5491b 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs @@ -9,9 +9,64 @@ + {{#if (feature-flag 'filter')}} + {{#if + (or + @model + (has-resource-filter-param-selections + 'scopes.scope.projects.sessions' + ) + ) + }} + + + {{#with + (resource-filter-param 'scopes.scope.projects.sessions' 'status') + as |filter| + }} + + + + + + + + {{/with}} + + {{#if + (has-resource-filter-param-selections + 'scopes.scope.projects.sessions' + ) + }} + {{t 'actions.clear-all-filters'}} + + {{/if}} + + + {{/if}} + {{/if}} {{#if this.sorted}} - @@ -87,9 +142,17 @@ {{/each}} - + {{else if (has-resource-filter-param-selections + 'scopes.scope.projects.sessions' + )}} + + + + {{t 'descriptions.no-results'}} + + + {{else}} - - {{/if}} - \ No newline at end of file