diff --git a/app/components/settings/api-tokens.gjs b/app/components/settings/api-tokens.gjs
index 5d905f9bb18..9e9e676b256 100644
--- a/app/components/settings/api-tokens.gjs
+++ b/app/components/settings/api-tokens.gjs
@@ -14,11 +14,12 @@ import or from 'ember-truth-helpers/helpers/or';
import CopyButton from 'crates-io/components/copy-button';
import LoadingSpinner from 'crates-io/components/loading-spinner';
+import PatternDescription from 'crates-io/components/token-scopes/pattern-description';
import Tooltip from 'crates-io/components/tooltip';
import dateFormatDistanceToNow from 'crates-io/helpers/date-format-distance-to-now';
import isClipboardSupported from 'crates-io/helpers/is-clipboard-supported';
-import { patternDescription, scopeDescription } from '../../utils/token-scopes';
+import { scopeDescription } from '../../utils/token-scopes';
export default class ApiTokens extends Component {
@service store;
@@ -26,7 +27,6 @@ export default class ApiTokens extends Component {
@service router;
scopeDescription = scopeDescription;
- patternDescription = patternDescription;
get sortedTokens() {
return this.args.tokens
@@ -136,7 +136,7 @@ export default class ApiTokens extends Component {
{{#each (this.listToParts token.crate_scopes) as |part|~}}
{{#if (eq part.type 'element')}}
- {{part.value}}
+ {{part.value}}
{{~else~}}
{{part.value}}
{{/if}}
diff --git a/app/components/token-scopes/pattern-description.gjs b/app/components/token-scopes/pattern-description.gjs
new file mode 100644
index 00000000000..a7db0002b6c
--- /dev/null
+++ b/app/components/token-scopes/pattern-description.gjs
@@ -0,0 +1,24 @@
+import Component from '@glimmer/component';
+
+import { eq } from 'ember-truth-helpers';
+
+export default class PatternDescription extends Component {
+ get prefix() {
+ if (this.args.pattern.endsWith('*')) {
+ return this.args.pattern.slice(0, -1);
+ }
+ }
+
+
+ {{#if (eq @pattern '*')}}
+ Matches all crates on crates.io
+ {{else if this.prefix}}
+ Matches all crates starting with
+ {{this.prefix}}
+ {{else}}
+ Matches only the
+ {{@pattern}}
+ crate
+ {{/if}}
+
+}
diff --git a/app/controllers/settings/tokens/new.js b/app/controllers/settings/tokens/new.js
index dd05cb6932e..e41f7be8d9d 100644
--- a/app/controllers/settings/tokens/new.js
+++ b/app/controllers/settings/tokens/new.js
@@ -6,7 +6,7 @@ import { tracked } from '@glimmer/tracking';
import { task } from 'ember-concurrency';
import { TrackedArray } from 'tracked-built-ins';
-import { patternDescription, scopeDescription } from '../../../utils/token-scopes';
+import { scopeDescription } from '../../../utils/token-scopes';
export default class NewTokenController extends Controller {
@service notifications;
@@ -157,16 +157,6 @@ class CratePattern {
return this.pattern.endsWith('*');
}
- get description() {
- if (!this.pattern) {
- return 'Please enter a crate name pattern';
- } else if (this.isValid) {
- return patternDescription(this.pattern);
- } else {
- return 'Invalid crate name pattern';
- }
- }
-
@action resetValidation() {
this.showAsInvalid = false;
}
diff --git a/app/templates/settings/tokens/new.gjs b/app/templates/settings/tokens/new.gjs
index 0145530a4d1..8d16da9eb5a 100644
--- a/app/templates/settings/tokens/new.gjs
+++ b/app/templates/settings/tokens/new.gjs
@@ -7,9 +7,10 @@ import autoFocus from '@zestia/ember-auto-focus/modifiers/auto-focus';
import perform from 'ember-concurrency/helpers/perform';
import preventDefault from 'ember-event-helpers/helpers/prevent-default';
import svgJar from 'ember-svg-jar/helpers/svg-jar';
-import eq from 'ember-truth-helpers/helpers/eq';
+import { eq, not } from 'ember-truth-helpers';
import LoadingSpinner from 'crates-io/components/loading-spinner';
+import PatternDescription from 'crates-io/components/token-scopes/pattern-description';
New API Token
@@ -152,7 +153,13 @@ import LoadingSpinner from 'crates-io/components/loading-spinner';
/>
- {{pattern.description}}
+ {{#if (not pattern.pattern)}}
+ Please enter a crate name pattern
+ {{else if pattern.isValid}}
+
+ {{else}}
+ Invalid crate name pattern
+ {{/if}}
diff --git a/app/utils/token-scopes.js b/app/utils/token-scopes.js
index 68c37c3ec64..53de57e2129 100644
--- a/app/utils/token-scopes.js
+++ b/app/utils/token-scopes.js
@@ -1,5 +1,3 @@
-import { htmlSafe } from '@ember/template';
-
const DESCRIPTIONS = {
'change-owners': 'Invite new crate owners or remove existing ones',
'publish-new': 'Publish new crates',
@@ -10,13 +8,3 @@ const DESCRIPTIONS = {
export function scopeDescription(scope) {
return DESCRIPTIONS[scope];
}
-
-export function patternDescription(pattern) {
- if (pattern === '*') {
- return 'Matches all crates on crates.io';
- } else if (pattern.endsWith('*')) {
- return htmlSafe(`Matches all crates starting with ${pattern.slice(0, -1)}`);
- } else {
- return htmlSafe(`Matches only the ${pattern} crate`);
- }
-}