Skip to content

Commit d53640d

Browse files
committed
Settings::ApiTokens: Improve empty state
1 parent 4304a28 commit d53640d

File tree

2 files changed

+87
-47
lines changed

2 files changed

+87
-47
lines changed

app/components/settings/api-tokens.hbs

Lines changed: 65 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -57,58 +57,76 @@
5757
</form>
5858
{{/if}}
5959

60-
<ul role="list" local-class="token-list">
61-
{{#each this.sortedTokens as |token|}}
62-
<li local-class="row" data-test-api-token={{or token.id true}}>
63-
<h3 local-class="name" data-test-name>
64-
{{token.name}}
65-
</h3>
60+
{{#if this.sortedTokens}}
61+
<ul role="list" local-class="token-list">
62+
{{#each this.sortedTokens as |token|}}
63+
<li local-class="row" data-test-api-token={{or token.id true}}>
64+
<h3 local-class="name" data-test-name>
65+
{{token.name}}
66+
</h3>
6667

67-
<div title={{token.last_used_at}} local-class="last-used-at" data-test-last-used-at>
68-
{{#if token.last_used_at}}
69-
Last used {{date-format-distance-to-now token.last_used_at addSuffix=true}}
70-
{{else}}
71-
Never used
72-
{{/if}}
73-
</div>
68+
<div title={{token.last_used_at}} local-class="last-used-at" data-test-last-used-at>
69+
{{#if token.last_used_at}}
70+
Last used {{date-format-distance-to-now token.last_used_at addSuffix=true}}
71+
{{else}}
72+
Never used
73+
{{/if}}
74+
</div>
7475

75-
<div title={{token.created_at}} local-class="created-at" data-test-created-at>
76-
Created {{date-format-distance-to-now token.created_at addSuffix=true}}
77-
</div>
76+
<div title={{token.created_at}} local-class="created-at" data-test-created-at>
77+
Created {{date-format-distance-to-now token.created_at addSuffix=true}}
78+
</div>
7879

79-
{{#if token.token}}
80-
<div local-class="new-token">
81-
<div local-class="new-token-explainer">
82-
Make sure to copy your API token now. You won’t be able to see it again!
83-
</div>
80+
{{#if token.token}}
81+
<div local-class="new-token">
82+
<div local-class="new-token-explainer">
83+
Make sure to copy your API token now. You won’t be able to see it again!
84+
</div>
8485

85-
<div local-class="token-display">
86-
<span local-class="token-value" data-test-token>{{token.token}}</span>
86+
<div local-class="token-display">
87+
<span local-class="token-value" data-test-token>{{token.token}}</span>
8788

88-
{{#if (is-clipboard-supported)}}
89-
<CopyButton @copyText={{token.token}} local-class="copy-button">
90-
<span local-class="copy-button-label">Copy</span>
91-
{{svg-jar "copy" aria-hidden="true" local-class="copy-button-icon"}}
92-
</CopyButton>
93-
{{/if}}
89+
{{#if (is-clipboard-supported)}}
90+
<CopyButton @copyText={{token.token}} local-class="copy-button">
91+
<span local-class="copy-button-label">Copy</span>
92+
{{svg-jar "copy" aria-hidden="true" local-class="copy-button-icon"}}
93+
</CopyButton>
94+
{{/if}}
95+
</div>
9496
</div>
97+
{{/if}}
98+
99+
<div local-class="actions">
100+
<button
101+
type="button"
102+
local-class="revoke-button"
103+
disabled={{token.isSaving}}
104+
data-test-revoke-token-button
105+
{{on "click" (perform this.revokeTokenTask token)}}
106+
>
107+
Revoke
108+
</button>
109+
{{#if token.isSaving}}
110+
<LoadingSpinner local-class="spinner" data-test-saving-spinner />
111+
{{/if}}
95112
</div>
96-
{{/if}}
113+
</li>
114+
{{/each}}
115+
</ul>
116+
{{else}}
117+
<div local-class="empty-state">
118+
<div local-class="empty-state-label">
119+
You have not generated any API tokens yet.
120+
</div>
97121

98-
<div local-class="actions">
99-
<button
100-
type="button"
101-
local-class="revoke-button"
102-
disabled={{token.isSaving}}
103-
data-test-revoke-token-button
104-
{{on "click" (perform this.revokeTokenTask token)}}
105-
>
106-
Revoke
107-
</button>
108-
{{#if token.isSaving}}
109-
<LoadingSpinner local-class="spinner" data-test-saving-spinner />
110-
{{/if}}
111-
</div>
112-
</li>
113-
{{/each}}
114-
</ul>
122+
<button
123+
type="button"
124+
local-class="empty-state-button"
125+
disabled={{this.newToken}}
126+
data-test-empty-state-button
127+
{{on "click" this.startNewToken}}
128+
>
129+
New Token
130+
</button>
131+
</div>
132+
{{/if}}

app/components/settings/api-tokens.module.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,28 @@
125125
height: 24px;
126126
}
127127

128+
.empty-state {
129+
display: grid;
130+
place-items: center;
131+
align-content: center;
132+
margin: 0 0 24px;
133+
padding: 64px;
134+
border: 2px black dashed;
135+
border-radius: 5px;
136+
background-color: white;
137+
box-shadow: 0 2px 3px hsla(51, 50%, 44%, .35);
138+
}
139+
140+
.empty-state-label {
141+
font-size: 20px;
142+
}
143+
144+
.empty-state-button {
145+
composes: yellow-button small from '../../styles/shared/buttons.module.css';
146+
margin-top: 20px;
147+
border-radius: 4px;
148+
}
149+
128150
@media (min-width: 640px) {
129151
.new-token-form {
130152
display: grid;

0 commit comments

Comments
 (0)