diff --git a/addons/core/translations/errors/en-us.yaml b/addons/core/translations/errors/en-us.yaml index 0e2239e72..c814611d0 100644 --- a/addons/core/translations/errors/en-us.yaml +++ b/addons/core/translations/errors/en-us.yaml @@ -17,3 +17,5 @@ generic: title: Error authentication-failed: title: Authentication Failed +origin-verification-failed: + description: Unable to connect to the specified origin. Please check the URL and try again. diff --git a/ui/desktop/app/controllers/scopes/scope/projects/targets/target/sessions.js b/ui/desktop/app/controllers/scopes/scope/projects/targets/target/sessions.js new file mode 100644 index 000000000..dfab20739 --- /dev/null +++ b/ui/desktop/app/controllers/scopes/scope/projects/targets/target/sessions.js @@ -0,0 +1,36 @@ +import Controller from '@ember/controller'; +import { computed } from '@ember/object'; +import { inject as service } from '@ember/service'; +import { A } from '@ember/array'; + +export default class ScopesScopeProjectsTargetsTargetSessionsController extends Controller { + // =services + + @service session; + + /** + * Sort and filter to active sessions of current user + * @param {[SessionModel]} model + * @param {object} session + * @type {[SessionModel]} + */ + @computed('model.@each.{created_time,active}', 'session.data.authenticated.user_id') + get selfActiveSessions() { + const sessions = this.model; + const userId = this.session.data.authenticated.user_id; + const filteredSessions = + sessions.filter(session => + session.isCancelable && + session.user_id === userId + ); + + // Sort sessions + const sortedSessions = A(filteredSessions).sortBy('created_time').reverse(); + + // Move active sessions to top + return [ + ...sortedSessions.filter(session => session.isActive), + ...sortedSessions.filter(session => !session.isActive) + ] + } +} diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target.js index 0bcdbd2ec..3cf2343fe 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target.js @@ -1,36 +1,17 @@ import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; -import { A } from '@ember/array'; export default class ScopesScopeProjectsTargetsTargetRoute extends Route { - // =services - - @service session; - // =methods /** - * Load a target and it's active sessions + * Load a target * @param {object} params * @param {string} params.target_id - * @return {{TargetModel, [SessionModel]}} + * @return {TargetModel} */ - async model({ target_id }) { - const userId = this.session.data.authenticated.user_id; - const target = await this.store.findRecord('target', target_id, { reload: true }); - const sessions = await this.store.query('session', { scope_id: target.scopeID }); - - // Filter to current user, current target, and active state - const filteredSessions = sessions.filter( - session => session.user_id === userId && - session.target_id === target.id && - session.isCancelable - ) - // Sort sessions by time created - const sortedSessions = - A(filteredSessions).sortBy('session.created_time').reverse(); - return { target, sessions: sortedSessions }; + model({ target_id }) { + return this.store.findRecord('target', target_id, { reload: true }); } /** diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js index 0362726f5..ef2f5a8ab 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js @@ -18,7 +18,7 @@ export default class ScopesScopeProjectsTargetsTargetHostsRoute extends Route { * @return {Promise{[HostModel]}} */ async model() { - const { target } = this.modelFor('scopes.scope.projects.targets.target'); + const target = this.modelFor('scopes.scope.projects.targets.target'); // Load all host-sets const hostSets = await all( target.host_sets.map(({ host_set_id }) => diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js index 4f0281e2f..203b74d62 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js @@ -3,6 +3,16 @@ import { action } from '@ember/object'; import { notifySuccess, notifyError } from 'core/decorators/notify'; export default class ScopesScopeProjectsTargetsTargetSessionsRoute extends Route { + + // =methods + + /** + * @return {[SessionModel]} + */ + model() { + return this.modelFor('scopes.scope.projects.targets.target').sessions; + } + // =actions /** diff --git a/ui/desktop/app/templates/scopes/scope/authenticate.hbs b/ui/desktop/app/templates/scopes/scope/authenticate.hbs index b01ed3a31..3d7d834bd 100644 --- a/ui/desktop/app/templates/scopes/scope/authenticate.hbs +++ b/ui/desktop/app/templates/scopes/scope/authenticate.hbs @@ -1,65 +1,58 @@ {{page-title (t "actions.authenticate")}} -{{!-- - -Change --}} - +
+ - - - {{t "titles.global"}} - - {{#each this.sortedScopes as |scope|}} - - {{scope.displayName}} + + + {{t "titles.global"}} - {{/each}} - + {{#each this.sortedScopes as |scope|}} + + {{scope.displayName}} + + {{/each}} + - - {{#each @model.authMethods as |authMethod|}} - - {{t (concat "resources.auth-method.types." authMethod.type)}} - - {{/each}} - + + {{#each @model.authMethods as |authMethod|}} + + {{t (concat "resources.auth-method.types." authMethod.type)}} + + {{/each}} + - {{#if @model.authMethods}} - {{outlet}} + {{#if @model.authMethods}} + {{outlet}} -

- {{t "origin.connected-to"}}: - {{this.origin}} -
- - {{t "actions.change-origin"}} - -

+

+ {{t "origin.connected-to"}}: + {{this.origin}} +
+ + {{t "actions.change-origin"}} + +

- {{/if}} - {{#unless @model.authMethods}} - - - - {{t "resources.auth-method.messages.none.description"}} - - - - {{/unless}} + {{/if}} + {{#unless @model.authMethods}} + + + + {{t "resources.auth-method.messages.none.description"}} + + + + {{/unless}} -
+ +
diff --git a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs index e59af9f97..b82595c94 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs @@ -1,3 +1,3 @@ - + {{t "resources.session.actions.connect"}} diff --git a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs index 8677dadd4..938169518 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs @@ -1,18 +1,18 @@

- {{@model.target.displayName}} - {{#if @model.target.isActive}} + {{@model.displayName}} + {{#if @model.isActive}} {{t "states.active"}} {{/if}}

-

{{@model.target.description}}

+

{{@model.description}}

- {{@model.target.id}} + {{@model.id}}

diff --git a/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs b/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs index e273d7058..008e5dfb0 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs @@ -1,10 +1,6 @@ - {{!-- - TODO: sort these via the controller so that active and pending appear first - similar to the way the sessions routes are sorted. - --}} - {{#each @model.target.sessions as |session|}} + {{#each this.selfActiveSessions as |session|}}