mirror of
https://github.com/status-im/consul.git
synced 2025-01-10 13:55:55 +00:00
4bf1daef0a
* ui: Logout button This commit adds an easier way to logout of the UI using a logout button Notes: - Added a Logout button to the main navigation when you are logged in, meaning you have easy access to a way to log out of the UI. - Changed all wording to use 'Log in/out' vocabulary instad of 'stop using'. - The logout button opens a panel to show you your current ACL token and a logout button in order to logout. - When using legacy ACLs we don't show the current ACL token as legacy ACLs tokens only have secret values, whereas the new ACLs use a non-secret ID plus a secret ID (that we don't show). - We also added a new `<EmptyState />` component to use for all our empty states. We currently only use this for the ACLs disabled screen to provide more outgoing links to more readind material/documentation to help you to understand and enable ACLs. - The `<DataSink />` component is the sibling to our `<DataSource />` component and whilst is much simpler (as it doesn't require polling support), its tries to use the same code patterns for consistencies sake. - We had a fun problem with ember-data's `store.unloadAll` here, and in the end went with `store.init` to empty the ember-data store instead due to timing issues. - We've tried to use already existing patterns in the Consul UI here such as our preexisting `feedback` service, although these are likely to change in the future. The thinking here is to add this feature with as little change as possible. Overall this is a precursor to a much larger piece of work centered on auth in the UI. We figured this was a feature complete piece of work as it is and thought it was worthwhile to PR as a feature on its own, which also means the larger piece of work will be a smaller scoped PR also.
175 lines
7.3 KiB
Handlebars
175 lines
7.3 KiB
Handlebars
{{#if isAuthorized }}
|
|
{{title 'Tokens'}}
|
|
{{else}}
|
|
{{title 'Access Controls'}}
|
|
{{/if}}
|
|
<AppView
|
|
@class="token list"
|
|
@loading={{isLoading}}
|
|
@authorized={{isAuthorized}}
|
|
@enabled={{isEnabled}}
|
|
>
|
|
<BlockSlot @name="notification" as |status type subject|>
|
|
{{partial 'dc/acls/tokens/notifications'}}
|
|
</BlockSlot>
|
|
<BlockSlot @name="header">
|
|
<h1>
|
|
Access Controls
|
|
</h1>
|
|
{{#if isAuthorized }}
|
|
{{partial 'dc/acls/nav'}}
|
|
{{/if}}
|
|
</BlockSlot>
|
|
<BlockSlot @name="disabled">
|
|
{{partial 'dc/acls/disabled'}}
|
|
</BlockSlot>
|
|
<BlockSlot @name="authorization">
|
|
{{partial 'dc/acls/authorization'}}
|
|
</BlockSlot>
|
|
<BlockSlot @name="actions">
|
|
<a data-test-create href="{{href-to 'dc.acls.tokens.create'}}" class="type-create">Create</a>
|
|
</BlockSlot>
|
|
<BlockSlot @name="content">
|
|
{{#if (gt items.length 0) }}
|
|
<form class="filter-bar">
|
|
<FreetextFilter @searchable={{searchable}} @value={{s}} @placeholder="Search" />
|
|
</form>
|
|
{{/if}}
|
|
{{#if (token/is-legacy items)}}
|
|
<p data-test-notification-update class="notice info"><strong>Update.</strong> We have upgraded our ACL System to allow the creation of reusable policies that can be applied to tokens. Read more about the changes and how to upgrade legacy tokens in our <a href="{{env 'CONSUL_DOCS_URL'}}/guides/acl-migrate-tokens.html" target="_blank" rel="noopener noreferrer">documentation</a>.</p>
|
|
{{/if}}
|
|
<ChangeableSet @dispatcher={{searchable}}>
|
|
<BlockSlot @name="set" as |filtered|>
|
|
<TabularCollection @items={{sort-by "CreateTime:desc" filtered}} as |item index|>
|
|
<BlockSlot @name="header">
|
|
<th>Accessor ID</th>
|
|
<th>Scope</th>
|
|
<th>Description</th>
|
|
<th>Roles & Policies</th>
|
|
<th> </th>
|
|
</BlockSlot>
|
|
<BlockSlot @name="row">
|
|
<td data-test-token="{{item.AccessorID}}" class={{if (eq item.AccessorID token.AccessorID) 'me' }}>
|
|
<a href={{href-to 'dc.acls.tokens.edit' item.AccessorID}}>{{substr item.AccessorID -8}}</a>
|
|
</td>
|
|
<td>
|
|
{{if item.Local 'local' 'global' }}
|
|
</td>
|
|
<td data-test-description>
|
|
<p>{{default item.Description item.Name}}</p>
|
|
</td>
|
|
<td colspan={{if (not-eq item.AccessorID token.AccessorID) '2' }}>
|
|
{{#if (token/is-legacy item) }}
|
|
<p>Legacy tokens have embedded rules.</p>
|
|
{{ else }}
|
|
{{#each (append item.Policies item.Roles) as |item|}}
|
|
<strong data-test-policy class={{policy/typeof item}}>{{item.Name}}</strong>
|
|
{{/each}}
|
|
{{/if}}
|
|
</td>
|
|
{{#if (eq item.AccessorID token.AccessorID)}}
|
|
<td>Your token</td>
|
|
{{/if}}
|
|
</BlockSlot>
|
|
<BlockSlot @name="actions" as |index change checked|>
|
|
<PopoverMenu @expanded={{if (eq checked index) true false}} @onchange={{action change index}} @keyboardAccess={{false}} @submenus={{array "logout" "use" "delete"}}>
|
|
<BlockSlot @name="trigger">
|
|
More
|
|
</BlockSlot>
|
|
<BlockSlot @name="menu" as |confirm send keypressClick|>
|
|
<li role="none">
|
|
<a data-test-edit role="menuitem" tabindex="-1" href={{href-to 'dc.acls.tokens.edit' item.AccessorID}}>Edit</a>
|
|
</li>
|
|
{{#if (not (token/is-legacy item))}}
|
|
<li role="none">
|
|
<button role="menuitem" tabindex="-1" type="button" data-test-clone {{action 'sendClone' item}}>Duplicate</button>
|
|
</li>
|
|
{{/if}}
|
|
{{#if (eq item.AccessorID token.AccessorID) }}
|
|
<li role="none" class="dangerous">
|
|
<label for={{concat confirm 'logout'}} role="menuitem" tabindex="-1" onkeypress={{keypressClick}} data-test-logout>Log out</label>
|
|
<div role="menu">
|
|
<div class="confirmation-alert warning">
|
|
<div>
|
|
<header>
|
|
Confirm logout
|
|
</header>
|
|
<p>
|
|
Are you sure you want to stop using this ACL token? This will log you out.
|
|
</p>
|
|
</div>
|
|
<ul>
|
|
<li class="dangerous">
|
|
<button tabindex="-1" type="button" onclick={{action send 'logout' item}}>Logout</button>
|
|
</li>
|
|
<li>
|
|
<label for={{concat confirm 'logout'}}>Cancel</label>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{else}}
|
|
<li role="none">
|
|
<label for={{concat confirm 'use'}} role="menuitem" tabindex="-1" onkeypress={{keypressClick}} data-test-use>Use</label>
|
|
<div role="menu">
|
|
<div class="confirmation-alert warning">
|
|
<div>
|
|
<header>
|
|
Confirm use
|
|
</header>
|
|
<p>
|
|
Are you sure you want to use this ACL token?
|
|
</p>
|
|
</div>
|
|
<ul>
|
|
<li class="dangerous">
|
|
<button data-test-confirm-use tabindex="-1" type="button" onclick={{action send 'use' item}}>Use</button>
|
|
</li>
|
|
<li>
|
|
<label for={{concat confirm 'use'}}>Cancel</label>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{/if}}
|
|
{{#unless (or (token/is-anonymous item) (eq item.AccessorID token.AccessorID)) }}
|
|
<li role="none" class="dangerous">
|
|
<label for={{concat confirm 'delete'}} role="menuitem" tabindex="-1" onkeypress={{keypressClick}} data-test-delete>Delete</label>
|
|
<div role="menu">
|
|
<div class="confirmation-alert warning">
|
|
<div>
|
|
<header>
|
|
Confirm Delete
|
|
</header>
|
|
<p>
|
|
Are you sure you want to delete this token?
|
|
</p>
|
|
</div>
|
|
<ul>
|
|
<li class="dangerous">
|
|
<button tabindex="-1" type="button" class="type-delete" onclick={{action send 'delete' item}}>Delete</button>
|
|
</li>
|
|
<li>
|
|
<label for={{concat confirm 'delete'}}>Cancel</label>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{/unless}}
|
|
</BlockSlot>
|
|
</PopoverMenu>
|
|
</BlockSlot>
|
|
</TabularCollection>
|
|
</BlockSlot>
|
|
<BlockSlot @name="empty">
|
|
<p>
|
|
There are no Tokens.
|
|
</p>
|
|
</BlockSlot>
|
|
</ChangeableSet>
|
|
</BlockSlot>
|
|
</AppView>
|