@things-factory/auth-ui 10.1.29 → 10.1.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist-client/components/accept-invitation.d.ts +48 -0
  2. package/dist-client/components/accept-invitation.js +265 -0
  3. package/dist-client/components/accept-invitation.js.map +1 -0
  4. package/dist-client/components/appliance-editor.d.ts +3 -0
  5. package/dist-client/components/appliance-editor.js +102 -1
  6. package/dist-client/components/appliance-editor.js.map +1 -1
  7. package/dist-client/components/role-selector.js +23 -1
  8. package/dist-client/components/role-selector.js.map +1 -1
  9. package/dist-client/components/user-invite.d.ts +8 -0
  10. package/dist-client/components/user-invite.js +53 -6
  11. package/dist-client/components/user-invite.js.map +1 -1
  12. package/dist-client/entries/auth/accept-invitation.d.ts +3 -0
  13. package/dist-client/entries/auth/accept-invitation.js +10 -0
  14. package/dist-client/entries/auth/accept-invitation.js.map +1 -0
  15. package/dist-client/pages/invitation/invitation-list-query.test.d.ts +1 -0
  16. package/dist-client/pages/invitation/invitation-list-query.test.js +69 -0
  17. package/dist-client/pages/invitation/invitation-list-query.test.js.map +1 -0
  18. package/dist-client/pages/invitation/invitations.d.ts +63 -0
  19. package/dist-client/pages/invitation/invitations.js +282 -0
  20. package/dist-client/pages/invitation/invitations.js.map +1 -0
  21. package/dist-client/pages/role/role-list-page.d.ts +3 -2
  22. package/dist-client/pages/role/role-list-page.js +39 -6
  23. package/dist-client/pages/role/role-list-page.js.map +1 -1
  24. package/dist-client/route.js +3 -0
  25. package/dist-client/route.js.map +1 -1
  26. package/dist-client/tsconfig.tsbuildinfo +1 -1
  27. package/dist-client/utils/credential-panel-state.d.ts +51 -0
  28. package/dist-client/utils/credential-panel-state.js +49 -0
  29. package/dist-client/utils/credential-panel-state.js.map +1 -0
  30. package/dist-client/utils/credential-panel-state.test.d.ts +1 -0
  31. package/dist-client/utils/credential-panel-state.test.js +88 -0
  32. package/dist-client/utils/credential-panel-state.test.js.map +1 -0
  33. package/dist-client/utils/inherited-name-refusal.d.ts +44 -0
  34. package/dist-client/utils/inherited-name-refusal.js +46 -0
  35. package/dist-client/utils/inherited-name-refusal.js.map +1 -0
  36. package/dist-client/utils/inherited-name-refusal.test.d.ts +1 -0
  37. package/dist-client/utils/inherited-name-refusal.test.js +60 -0
  38. package/dist-client/utils/inherited-name-refusal.test.js.map +1 -0
  39. package/dist-client/utils/invitation-token.d.ts +28 -0
  40. package/dist-client/utils/invitation-token.js +40 -0
  41. package/dist-client/utils/invitation-token.js.map +1 -0
  42. package/dist-client/utils/invitation-token.test.d.ts +1 -0
  43. package/dist-client/utils/invitation-token.test.js +60 -0
  44. package/dist-client/utils/invitation-token.test.js.map +1 -0
  45. package/dist-client/utils/role-origin.d.ts +44 -0
  46. package/dist-client/utils/role-origin.js +47 -0
  47. package/dist-client/utils/role-origin.js.map +1 -0
  48. package/dist-client/utils/role-origin.test.d.ts +1 -0
  49. package/dist-client/utils/role-origin.test.js +60 -0
  50. package/dist-client/utils/role-origin.test.js.map +1 -0
  51. package/package.json +5 -5
  52. package/things-factory.config.js +1 -0
  53. package/translations/en.json +28 -0
  54. package/translations/ja.json +28 -0
  55. package/translations/ko.json +28 -0
  56. package/translations/ms.json +28 -0
  57. package/translations/zh.json +28 -0
@@ -0,0 +1,47 @@
1
+ /**
2
+ * When a list of roles has to say where each one came from. (Pure rule.)
3
+ *
4
+ * ## The situation it is for
5
+ *
6
+ * Roles are visible one level up: a domain sees its own and its parent's. Nothing stops a
7
+ * domain having a role with the same name as one it inherits — the duplicate checks on the
8
+ * server ask only about the domain itself — so a picker can offer two rows reading `approver`
9
+ * with no way to tell them apart. Whichever gets ticked decides who a gate lets through, and
10
+ * an approval line can end up pointing at the one nobody looks at (ADR-0062 decision 3).
11
+ *
12
+ * ## Why the rule is about the list and not about one role
13
+ *
14
+ * A role does not know whether it is inherited — that depends on which domain is being looked
15
+ * at, and a list of roles from one domain is the ordinary case. So the question is asked of the
16
+ * list: **does this set span more than one domain?** If it does, every row says which, and the
17
+ * rows that shared a name stop being identical. If it does not, nothing is added and the
18
+ * ordinary case stays quiet.
19
+ *
20
+ * That also answers correctly for a role whose name happens to be unique but which still comes
21
+ * from somewhere else — granting one of those is a different act from granting your own, and
22
+ * the operator should be able to see which they are doing.
23
+ */
24
+ /**
25
+ * Should this list show where each role comes from?
26
+ *
27
+ * False when every role names the same domain, when none of them names one at all, and for an
28
+ * empty list. A list that is only partly labelled counts as spanning — one row that cannot say
29
+ * where it came from, beside rows that can, is the ambiguity this exists to remove.
30
+ */
31
+ export function showsRoleOrigin(roles) {
32
+ if (!roles || roles.length < 2) {
33
+ return false;
34
+ }
35
+ const origins = new Set(roles.map(role => role?.domain?.name || ''));
36
+ return origins.size > 1;
37
+ }
38
+ /**
39
+ * What to print beside a role, or an empty string.
40
+ *
41
+ * A role with no domain on it prints nothing rather than a placeholder: the list is already
42
+ * labelled, so an unlabelled row reads as "not said" instead of as a domain called something.
43
+ */
44
+ export function roleOrigin(role) {
45
+ return role?.domain?.name || '';
46
+ }
47
+ //# sourceMappingURL=role-origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-origin.js","sourceRoot":"","sources":["../../client/utils/role-origin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAA0C;IACxE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;IAEpE,OAAO,OAAO,CAAC,IAAI,GAAG,CAAC,CAAA;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAoB;IAC7C,OAAO,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAA;AACjC,CAAC","sourcesContent":["/**\n * When a list of roles has to say where each one came from. (Pure rule.)\n *\n * ## The situation it is for\n *\n * Roles are visible one level up: a domain sees its own and its parent's. Nothing stops a\n * domain having a role with the same name as one it inherits — the duplicate checks on the\n * server ask only about the domain itself — so a picker can offer two rows reading `approver`\n * with no way to tell them apart. Whichever gets ticked decides who a gate lets through, and\n * an approval line can end up pointing at the one nobody looks at (ADR-0062 decision 3).\n *\n * ## Why the rule is about the list and not about one role\n *\n * A role does not know whether it is inherited — that depends on which domain is being looked\n * at, and a list of roles from one domain is the ordinary case. So the question is asked of the\n * list: **does this set span more than one domain?** If it does, every row says which, and the\n * rows that shared a name stop being identical. If it does not, nothing is added and the\n * ordinary case stays quiet.\n *\n * That also answers correctly for a role whose name happens to be unique but which still comes\n * from somewhere else — granting one of those is a different act from granting your own, and\n * the operator should be able to see which they are doing.\n */\n\n/** The part of a role this rule reads. `domain` is absent on lists that never asked for it. */\nexport type RoleWithOrigin = {\n domain?: { name?: string | null } | null\n} | null | undefined\n\n/**\n * Should this list show where each role comes from?\n *\n * False when every role names the same domain, when none of them names one at all, and for an\n * empty list. A list that is only partly labelled counts as spanning — one row that cannot say\n * where it came from, beside rows that can, is the ambiguity this exists to remove.\n */\nexport function showsRoleOrigin(roles: RoleWithOrigin[] | null | undefined): boolean {\n if (!roles || roles.length < 2) {\n return false\n }\n\n const origins = new Set(roles.map(role => role?.domain?.name || ''))\n\n return origins.size > 1\n}\n\n/**\n * What to print beside a role, or an empty string.\n *\n * A role with no domain on it prints nothing rather than a placeholder: the list is already\n * labelled, so an unlabelled row reads as \"not said\" instead of as a domain called something.\n */\nexport function roleOrigin(role: RoleWithOrigin): string {\n return role?.domain?.name || ''\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ import { roleOrigin, showsRoleOrigin } from './role-origin';
2
+ /**
3
+ * Whether a role picker has to say where each role came from.
4
+ *
5
+ * The cost of being wrong is not symmetric. Saying nothing when the list spans two domains
6
+ * leaves two identical checkboxes, and ticking the wrong one points a gate — or an approval
7
+ * line — at a role nobody looks at. Saying it when there is nothing to disambiguate only adds
8
+ * a word.
9
+ */
10
+ const OURS = { domain: { name: 'acme' } };
11
+ const THEIRS = { domain: { name: 'system' } };
12
+ describe('a list that needs to say', () => {
13
+ it('spans two domains', () => {
14
+ /* ⚠ The case. Two rows can read the same name and only this separates them. */
15
+ expect(showsRoleOrigin([OURS, THEIRS])).toBe(true);
16
+ });
17
+ it('says so even when the names do not collide', () => {
18
+ /*
19
+ * Granting an inherited role is a different act from granting your own, whether or not
20
+ * some other row happens to share its name.
21
+ */
22
+ expect(showsRoleOrigin([{ domain: { name: 'acme' } }, { domain: { name: 'system' } }])).toBe(true);
23
+ });
24
+ it('counts a row that cannot say where it came from as a difference', () => {
25
+ /*
26
+ * ⚠ A half-labelled list is the ambiguity, not the cure. One blank row beside labelled ones
27
+ * is exactly what the reader cannot resolve.
28
+ */
29
+ expect(showsRoleOrigin([OURS, {}])).toBe(true);
30
+ expect(showsRoleOrigin([OURS, { domain: null }])).toBe(true);
31
+ });
32
+ });
33
+ describe('a list that does not', () => {
34
+ it('is all one domain', () => {
35
+ expect(showsRoleOrigin([OURS, OURS, OURS])).toBe(false);
36
+ });
37
+ it('never asked for the domain at all', () => {
38
+ /* Nothing to say. Labelling every row with nothing would be noise, not information. */
39
+ expect(showsRoleOrigin([{}, {}])).toBe(false);
40
+ });
41
+ it('has one role, or none', () => {
42
+ expect(showsRoleOrigin([OURS])).toBe(false);
43
+ expect(showsRoleOrigin([])).toBe(false);
44
+ expect(showsRoleOrigin(null)).toBe(false);
45
+ expect(showsRoleOrigin(undefined)).toBe(false);
46
+ });
47
+ });
48
+ describe('what is printed beside a role', () => {
49
+ it('is the domain it came from', () => {
50
+ expect(roleOrigin(OURS)).toEqual('acme');
51
+ });
52
+ it('is nothing when the role does not carry one', () => {
53
+ /* Not a placeholder. An unlabelled row reads as "not said", not as a domain named that. */
54
+ expect(roleOrigin({})).toEqual('');
55
+ expect(roleOrigin({ domain: null })).toEqual('');
56
+ expect(roleOrigin(null)).toEqual('');
57
+ expect(roleOrigin({ domain: { name: null } })).toEqual('');
58
+ });
59
+ });
60
+ //# sourceMappingURL=role-origin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-origin.test.js","sourceRoot":"","sources":["../../client/utils/role-origin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { roleOrigin, showsRoleOrigin } from './role-origin'\n\n/**\n * Whether a role picker has to say where each role came from.\n *\n * The cost of being wrong is not symmetric. Saying nothing when the list spans two domains\n * leaves two identical checkboxes, and ticking the wrong one points a gate — or an approval\n * line — at a role nobody looks at. Saying it when there is nothing to disambiguate only adds\n * a word.\n */\n\nconst OURS = { domain: { name: 'acme' } }\nconst THEIRS = { domain: { name: 'system' } }\n\ndescribe('a list that needs to say', () => {\n it('spans two domains', () => {\n /* ⚠ The case. Two rows can read the same name and only this separates them. */\n expect(showsRoleOrigin([OURS, THEIRS])).toBe(true)\n })\n\n it('says so even when the names do not collide', () => {\n /*\n * Granting an inherited role is a different act from granting your own, whether or not\n * some other row happens to share its name.\n */\n expect(showsRoleOrigin([{ domain: { name: 'acme' } }, { domain: { name: 'system' } }])).toBe(true)\n })\n\n it('counts a row that cannot say where it came from as a difference', () => {\n /*\n * ⚠ A half-labelled list is the ambiguity, not the cure. One blank row beside labelled ones\n * is exactly what the reader cannot resolve.\n */\n expect(showsRoleOrigin([OURS, {}])).toBe(true)\n expect(showsRoleOrigin([OURS, { domain: null }])).toBe(true)\n })\n})\n\ndescribe('a list that does not', () => {\n it('is all one domain', () => {\n expect(showsRoleOrigin([OURS, OURS, OURS])).toBe(false)\n })\n\n it('never asked for the domain at all', () => {\n /* Nothing to say. Labelling every row with nothing would be noise, not information. */\n expect(showsRoleOrigin([{}, {}])).toBe(false)\n })\n\n it('has one role, or none', () => {\n expect(showsRoleOrigin([OURS])).toBe(false)\n expect(showsRoleOrigin([])).toBe(false)\n expect(showsRoleOrigin(null)).toBe(false)\n expect(showsRoleOrigin(undefined)).toBe(false)\n })\n})\n\ndescribe('what is printed beside a role', () => {\n it('is the domain it came from', () => {\n expect(roleOrigin(OURS)).toEqual('acme')\n })\n\n it('is nothing when the role does not carry one', () => {\n /* Not a placeholder. An unlabelled row reads as \"not said\", not as a domain named that. */\n expect(roleOrigin({})).toEqual('')\n expect(roleOrigin({ domain: null })).toEqual('')\n expect(roleOrigin(null)).toEqual('')\n expect(roleOrigin({ domain: { name: null } })).toEqual('')\n })\n})\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/auth-ui",
3
- "version": "10.1.29",
3
+ "version": "10.1.33",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -38,11 +38,11 @@
38
38
  "@operato/p13n": "^10.0.0",
39
39
  "@operato/popup": "^10.0.0",
40
40
  "@operato/styles": "^10.0.0",
41
- "@things-factory/auth-base": "^10.1.29",
42
- "@things-factory/component-ui": "^10.1.29",
43
- "@things-factory/more-base": "^10.1.29",
41
+ "@things-factory/auth-base": "^10.1.33",
42
+ "@things-factory/component-ui": "^10.1.33",
43
+ "@things-factory/more-base": "^10.1.33",
44
44
  "base64url": "^3.0.1",
45
45
  "clipboard": "^2.0.6"
46
46
  },
47
- "gitHead": "e6bf9dec003fe5e794746aaeb5852b3b50478232"
47
+ "gitHead": "7fb7b6587846b5ff6ee7a4983652d9561b4d6b2c"
48
48
  }
@@ -11,6 +11,7 @@ export default {
11
11
  { tagname: 'role-list-page', page: 'roles' },
12
12
  { tagname: 'role-privilege-page', page: 'role-privileges' },
13
13
  { tagname: 'user-list-page', page: 'users' },
14
+ { tagname: 'invitations-page', page: 'invitations' },
14
15
  { tagname: 'partner-management', page: 'partners' },
15
16
  { tagname: 'domain-management', page: 'domains' },
16
17
  { tagname: 'domain-owner-management', page: 'domain-owners' },
@@ -1,4 +1,5 @@
1
1
  {
2
+ "button.accept invitation": "accept invitation",
2
3
  "button.activate": "activate",
3
4
  "button.add what it can do": "Add what it can do",
4
5
  "button.cancel": "cancel",
@@ -25,17 +26,22 @@
25
26
  "button.remove from domain": "Remove from domain",
26
27
  "button.remove owner": "remove owner",
27
28
  "button.renew access token": "renew access token",
29
+ "button.resend": "send again",
28
30
  "button.reveal": "reveal",
31
+ "button.revoke credential": "revoke credential",
29
32
  "button.save": "save",
30
33
  "button.security-key registration": "security key registration",
31
34
  "button.show-all": "Show all",
32
35
  "button.show-orphans-only": "Show orphans only",
36
+ "button.sign in": "sign in",
33
37
  "button.sign_in": "sign in",
38
+ "button.stand it here": "stand it here",
34
39
  "button.submit": "submit",
35
40
  "button.terminate contract": "terminate",
36
41
  "button.transfer owner": "transfer owner",
37
42
  "button.unlock": "unlock",
38
43
  "button.update": "update",
44
+ "button.withdraw": "withdraw",
39
45
  "error.cannot_modify_system_subdomain": "the 'system' subdomain cannot be modified.",
40
46
  "error.domain not allowed": "the '{subdomain}' domain is not allowed for this user.",
41
47
  "error.new-password-and-confirm-password-do-not-match": "new password and confirm password do not match",
@@ -48,6 +54,7 @@
48
54
  "error.value is empty": "{value} is empty",
49
55
  "error.x already exists in y": "{x} already exists in {y}",
50
56
  "error: domain name should consist only of letters or dashes": "a domain name can use letters and dashes only",
57
+ "field.accepted at": "accepted at",
51
58
  "field.access token url": "access token url",
52
59
  "field.accessed-at": "accessed at",
53
60
  "field.app key": "app key",
@@ -61,14 +68,17 @@
61
68
  "field.client-secret": "client secret",
62
69
  "field.confirm password": "confirm password",
63
70
  "field.contact email": "contact email",
71
+ "field.created at": "created at",
64
72
  "field.description": "description",
65
73
  "field.email": "email address",
66
74
  "field.entity": "entity",
75
+ "field.expires at": "expires at",
67
76
  "field.forgot-password": "forgot password",
68
77
  "field.granted at": "granted at",
69
78
  "field.granted by": "granted by",
70
79
  "field.granted privileges": "What it can do",
71
80
  "field.hidden": "hidden",
81
+ "field.invited": "invited",
72
82
  "field.ip_address": "IP address",
73
83
  "field.model": "model",
74
84
  "field.module": "Module",
@@ -94,6 +104,7 @@
94
104
  "field.sign up": "sign up",
95
105
  "field.source": "Source",
96
106
  "field.source-domain": "source domain",
107
+ "field.state": "state",
97
108
  "field.status": "status",
98
109
  "field.tag": "tag",
99
110
  "field.target-domain": "target domain",
@@ -136,6 +147,8 @@
136
147
  "label.execute": "Execute",
137
148
  "label.inactive-user": "inactive",
138
149
  "label.inherited": "Inherited",
150
+ "label.invitation code": "invitation code",
151
+ "label.invitations": "invitations",
139
152
  "label.invite customer": "invite customer",
140
153
  "label.invite user": "invite user",
141
154
  "label.language": "language",
@@ -155,6 +168,7 @@
155
168
  "label.search_domain": "search domain",
156
169
  "label.select_domain": "select domain",
157
170
  "label.send activation email": "send activation email",
171
+ "label.send invitation": "send invitation",
158
172
  "label.signin with": "signin with {title}",
159
173
  "label.state": "state",
160
174
  "label.subject": "subject",
@@ -168,6 +182,7 @@
168
182
  "label.x name": "{x} name",
169
183
  "text.a blank seat opens nothing until you give it privileges": "A blank seat opens nothing until you give it privileges.",
170
184
  "text.a role of this name exists and will be added to": "A role of this name already exists. It will be used as it stands and these privileges added to it.",
185
+ "text.a role of this name is already visible": "a role of this name is already visible",
171
186
  "text.account exists so joins immediately": "This account already exists. Adding it lets them in right away.",
172
187
  "text.account will be created with the default password": "No account uses this address yet. One is created with the default password, which you have to tell them yourself.",
173
188
  "text.add_domain_owner_description": "grant another domain member owner permission.",
@@ -197,9 +212,11 @@
197
212
  "text.cannot be undone": "Cannot be undone",
198
213
  "text.cannot_delete": "cannot be deleted",
199
214
  "text.change password": "change password",
215
+ "text.choose a password to finish joining": "choose a password to finish joining.",
200
216
  "text.click login history": "If you want to see your recent login history, click",
201
217
  "text.completed": "completed",
202
218
  "text.confirm password": "confirm password",
219
+ "text.confirm the address this invitation was sent to": "enter the address this invitation was sent to.",
203
220
  "text.copied": "copied",
204
221
  "text.copying needs a secure connection": "copying needs a secure connection — select the value and copy it by hand",
205
222
  "text.could not be saved": "could not be saved — see the message above for the reason",
@@ -225,13 +242,16 @@
225
242
  "text.failed": "failed",
226
243
  "text.failed to fetch": "could not read the list",
227
244
  "text.filter by module name": "Filter by module name",
245
+ "text.from x": "from {x}",
228
246
  "text.inherited from x": "inherited from {x}",
229
247
  "text.inherited roles are edited in their own domain": "These roles are defined in a parent domain and can only be changed there.",
230
248
  "text.invalid-email": "that is not an email address",
231
249
  "text.invalid-username": "use an id or an email address",
250
+ "text.invitation resent": "invitation sent again.",
232
251
  "text.loading": "loading…",
233
252
  "text.new password": "new password",
234
253
  "text.no account and no default password": "No account uses this address, and this system has no default password. They have to sign up first.",
254
+ "text.no account so an invitation will be mailed": "no account yet, so an invitation will be mailed. they choose their own password.",
235
255
  "text.no description for this privilege": "No description has been written for this privilege yet.",
236
256
  "text.no description for this role": "No description yet — write one in the role list.",
237
257
  "text.no domain available": "no domain available",
@@ -266,6 +286,7 @@
266
286
  "text.registered roles": "registered roles",
267
287
  "text.remaining time": "{days} days {hours} hours {mins} mins {secs} seconds remain",
268
288
  "text.remove the role from x people first": "To delete this role, first take it away from the {x} people who hold it.",
289
+ "text.revoking stops every token this appliance holds": "this appliance stops being able to reach the system from the next request. nothing it holds keeps working, and issuing a new access token is the only way back.",
269
290
  "text.role belongs to x domain and is edited there": "This role is defined in {x} and can only be edited there. It is shown here because it can be granted here.",
270
291
  "text.role_management": "role management",
271
292
  "text.roles in use are kept": "Roles that someone still holds are kept. Only the unused ones are deleted.",
@@ -274,6 +295,7 @@
274
295
  "text.signed in": "signed in",
275
296
  "text.signed out": "signed out",
276
297
  "text.source_and_target_domain_cannot_be_same": "source and target domain cannot be same",
298
+ "text.stand this domain own role of the same name": "{name} is defined in {domain} and is already visible here. stand this domain's own role of the same name only if you mean to replace what it inherits — the name stays the same.",
277
299
  "text.start from a blank seat": "start from a blank seat",
278
300
  "text.struck through are not installed here": "Struck through are privileges this installation does not have.",
279
301
  "text.subdomain_change_critical_warning": "warning: changing the subdomain will alter the full access URL (/{type}/{subdomain}/...) and may invalidate existing external links, bookmarks, and active user sessions. please proceed with caution.",
@@ -281,12 +303,15 @@
281
303
  "text.the appliance could not be loaded": "the appliance could not be loaded",
282
304
  "text.the application could not be loaded": "the application could not be loaded",
283
305
  "text.the binding could not be loaded": "the binding could not be loaded",
306
+ "text.the code is printed in the invitation email": "the code is printed in the invitation email.",
284
307
  "text.the current access token stops working immediately": "the current access token stops working immediately, and anything using it has to be given the new one.",
285
308
  "text.the current secret stops working immediately": "the current secret stops working immediately, and anything using it has to be given the new one.",
286
309
  "text.the list could not be loaded": "the list could not be loaded",
287
310
  "text.they lose access to this domain but keep the account": "They lose access to this domain. The account itself remains, so you can add them again later.",
311
+ "text.this credential has been revoked": "this credential was revoked. the appliance cannot reach the system until a new access token is issued.",
288
312
  "text.this domain is top level and inherits from nowhere": "top level — nothing is inherited here",
289
313
  "text.this field is required": "this field is required",
314
+ "text.this invitation cannot be used": "this invitation cannot be used.",
290
315
  "text.this plant may call the seat what it likes": "Call the seat whatever this plant calls it.",
291
316
  "text.this role no longer exists": "this role no longer exists",
292
317
  "text.token expiry time": "token expiry time",
@@ -294,6 +319,7 @@
294
319
  "text.updated_successfully": "updated successfully",
295
320
  "text.user invitation prompt": "Please enter the username or email address of the user you wish to invite.",
296
321
  "text.user management": "user management",
322
+ "text.users": "users",
297
323
  "text.view only": "Inherited role — view only",
298
324
  "text.where an integration asks for an authorization code": "where an integration asks for an authorization code",
299
325
  "text.where that code is exchanged for an access token": "where that code is exchanged for an access token",
@@ -307,8 +333,10 @@
307
333
  "text.x_cannot_delete": "{x} cannot be deleted",
308
334
  "text.x_created_successfully": "{x} created successfully",
309
335
  "text.x_deleted_successfully": "{x} deleted successfully",
336
+ "text.you have joined. sign in to continue": "you have joined. sign in to continue.",
310
337
  "text.your account is not activated": "your account is not activated.",
311
338
  "text.your email address": "your email address",
339
+ "title.accept invitation": "accept invitation",
312
340
  "title.add domain owner": "add domain owner",
313
341
  "title.attribute model": "attribute model",
314
342
  "title.attribute-item list": "attribute-item list",
@@ -1,4 +1,5 @@
1
1
  {
2
+ "button.accept invitation": "招待を受ける",
2
3
  "button.activate": "アクティブ化",
3
4
  "button.cancel": "キャンセル",
4
5
  "button.close": "閉じる",
@@ -20,16 +21,21 @@
20
21
  "button.name it yourself": "name it yourself",
21
22
  "button.register": "登録",
22
23
  "button.renew access token": "アクセストークンを更新",
24
+ "button.resend": "再送する",
23
25
  "button.reveal": "表示",
26
+ "button.revoke credential": "資格情報を取り消す",
24
27
  "button.save": "保存",
25
28
  "button.security-key registration": "セキュリティキー登録",
26
29
  "button.show-all": "すべて表示",
27
30
  "button.show-orphans-only": "Orphanのみ表示",
31
+ "button.sign in": "ログイン",
28
32
  "button.sign_in": "ログイン",
33
+ "button.stand it here": "ここに作る",
29
34
  "button.submit": "送信",
30
35
  "button.terminate contract": "契約解除",
31
36
  "button.transfer owner": "管理者付与",
32
37
  "button.update": "更新",
38
+ "button.withdraw": "招待を取り消す",
33
39
  "error.cannot_modify_system_subdomain": "'system'サブドメインは変更できません。",
34
40
  "error.domain not allowed": "このドメインは許可されていません.",
35
41
  "error.new-password-and-confirm-password-do-not-match": "新しいパスワードと確認パスワードが一致しません.",
@@ -42,6 +48,7 @@
42
48
  "error.value is empty": "{value}の値が存在しません.",
43
49
  "error.x already exists in y": "{x}が既に{y}に存在します.",
44
50
  "error: domain name should consist only of letters or dashes": "ドメイン名には英字とハイフンのみ使えます",
51
+ "field.accepted at": "承諾日時",
45
52
  "field.access token url": "access token url",
46
53
  "field.accessed-at": "ログイン日時",
47
54
  "field.app key": "app key",
@@ -55,11 +62,14 @@
55
62
  "field.client-secret": "クライアントシークレット",
56
63
  "field.confirm password": "パスワード確認",
57
64
  "field.contact email": "連絡先メール",
65
+ "field.created at": "送信日時",
58
66
  "field.description": "説明",
59
67
  "field.email": "メール",
60
68
  "field.entity": "エンティティ",
69
+ "field.expires at": "有効期限",
61
70
  "field.forgot-password": "パスワードを忘れましたか?",
62
71
  "field.hidden": "隠し",
72
+ "field.invited": "招待",
63
73
  "field.ip_address": "IPアドレス",
64
74
  "field.model": "モデル",
65
75
  "field.name": "名前",
@@ -80,6 +90,7 @@
80
90
  "field.sign out": "ログアウト",
81
91
  "field.sign up": "ユーザー登録",
82
92
  "field.source-domain": "ソースドメイン",
93
+ "field.state": "状態",
83
94
  "field.status": "状態",
84
95
  "field.tag": "タグ",
85
96
  "field.target-domain": "ターゲットドメイン",
@@ -114,6 +125,8 @@
114
125
  "label.draft": "下書き",
115
126
  "label.email": "メール",
116
127
  "label.inactive-user": "非アクティブ",
128
+ "label.invitation code": "招待コード",
129
+ "label.invitations": "招待",
117
130
  "label.invite customer": "顧客社パートナー招待",
118
131
  "label.invite user": "ユーザー招待",
119
132
  "label.language": "言語",
@@ -131,6 +144,7 @@
131
144
  "label.search_domain": "ドメイン検索",
132
145
  "label.select_domain": "ドメイン選択",
133
146
  "label.send activation email": "アクティブ化要求メール送信",
147
+ "label.send invitation": "招待メールを送る",
134
148
  "label.signin with": "{title} でサインイン",
135
149
  "label.state": "状態",
136
150
  "label.subject": "タイトル",
@@ -143,6 +157,7 @@
143
157
  "label.x name": "{x}名前",
144
158
  "text.a blank seat opens nothing until you give it privileges": "A blank seat opens nothing until you give it privileges.",
145
159
  "text.a role of this name exists and will be added to": "A role of this name already exists. It will be used as it stands and these privileges added to it.",
160
+ "text.a role of this name is already visible": "同じ名前のロールが既に見えています",
146
161
  "text.already in this domain": "already here",
147
162
  "text.an application signs in on its own behalf": "アプリケーションは自身のキーと権限でログインします",
148
163
  "text.appliance": "端末装置",
@@ -166,9 +181,11 @@
166
181
  "text.bound applications": "連携アプリケーション",
167
182
  "text.cannot_delete": "削除できません.",
168
183
  "text.change password": "パスワード変更",
184
+ "text.choose a password to finish joining": "パスワードを決めると参加できます。",
169
185
  "text.click login history": "最近のログイン履歴を確認したい場合は、こちらをクリックしてください。",
170
186
  "text.completed": "完了しました.",
171
187
  "text.confirm password": "パスワード確認",
188
+ "text.confirm the address this invitation was sent to": "招待を受け取ったアドレスを入力してください。",
172
189
  "text.copied": "コピーしました",
173
190
  "text.copying needs a secure connection": "コピーは安全な接続でのみ可能です — 値を選択して手動でコピーしてください",
174
191
  "text.could not be saved": "保存できませんでした — 理由は上の通知をご覧ください",
@@ -187,10 +204,13 @@
187
204
  "text.env-var-list-page": "環境変数リスト",
188
205
  "text.expired": "期限切れ",
189
206
  "text.expires at x": "{x} 失効",
207
+ "text.from x": "{x} のロール",
190
208
  "text.inherited from x": "{x} から継承しています",
191
209
  "text.invalid-email": "メールアドレスの形式が違います",
192
210
  "text.invalid-username": "IDまたはメールアドレスを入力してください",
211
+ "text.invitation resent": "招待メールを再送しました。",
193
212
  "text.new password": "新しいパスワード",
213
+ "text.no account so an invitation will be mailed": "アカウントがないため招待メールを送ります。パスワードは本人が決めます。",
194
214
  "text.no domain available": "使用できるドメインがありません.",
195
215
  "text.no role to show": "ロールが指定されずに開かれた画面です",
196
216
  "text.not issued": "未発行",
@@ -206,12 +226,14 @@
206
226
  "text.register new application": "アプリケーションの登録",
207
227
  "text.registered roles": "登録されたロールリスト",
208
228
  "text.remaining time": "{days}日 {hours}時間 {mins}分 {secs}秒 残っています",
229
+ "text.revoking stops every token this appliance holds": "この機器は次のリクエストからシステムに接続できなくなります。保持しているトークンはすべて無効になり、新しいアクセストークンを発行するまで戻りません。",
209
230
  "text.role_management": "ロール管理",
210
231
  "text.select domain": "ドメイン選択",
211
232
  "text.should select at least one of x": "少なくとも1つ以上{x}を選択してください.",
212
233
  "text.signed in": "ログイン",
213
234
  "text.signed out": "ログアウト",
214
235
  "text.source_and_target_domain_cannot_be_same": "ソースドメインとターゲットドメインは同じにできません",
236
+ "text.stand this domain own role of the same name": "{name} は {domain} に定義されており、ここからも見えています。継承しているものを置き換えるつもりの場合のみ、このドメインに同じ名前で作成します。名前はそのままです。",
215
237
  "text.start from a blank seat": "start from a blank seat",
216
238
  "text.struck through are not installed here": "Struck through are privileges this installation does not have.",
217
239
  "text.subdomain_change_critical_warning": "警告: サブドメインを変更すると、フルアクセスURL(/{type}/{subdomain}/...)が変更され、既存のブックマークや外部リンク、アクティブなセッションが無効化される可能性があります。慎重に確認して進めてください。",
@@ -219,17 +241,21 @@
219
241
  "text.the appliance could not be loaded": "端末装置を読み込めませんでした",
220
242
  "text.the application could not be loaded": "アプリケーションを読み込めませんでした",
221
243
  "text.the binding could not be loaded": "連携を読み込めませんでした",
244
+ "text.the code is printed in the invitation email": "招待メールにコードが記載されています。",
222
245
  "text.the current access token stops working immediately": "現在のアクセストークンは直ちに無効になります。利用中の箇所に新しいトークンを渡す必要があります。",
223
246
  "text.the current secret stops working immediately": "現在のシークレットは直ちに無効になります。利用中の箇所に新しいシークレットを渡す必要があります。",
224
247
  "text.the list could not be loaded": "リストを読み込めませんでした",
248
+ "text.this credential has been revoked": "取り消された資格情報です。新しいアクセストークンを発行するまで、この機器はシステムに接続できません。",
225
249
  "text.this domain is top level and inherits from nowhere": "最上位ドメイン — 継承元がありません",
226
250
  "text.this field is required": "必須項目です",
251
+ "text.this invitation cannot be used": "この招待は使用できません。",
227
252
  "text.this plant may call the seat what it likes": "Call the seat whatever this plant calls it.",
228
253
  "text.this role no longer exists": "このロールは存在しません",
229
254
  "text.token expiry time": "トークン有効期限",
230
255
  "text.updated_successfully": "正常にアップデートしました.",
231
256
  "text.user invitation prompt": "招待したいユーザーのユーザー名またはメールアドレスを入力してください。",
232
257
  "text.user management": "ユーザー管理",
258
+ "text.users": "ユーザー",
233
259
  "text.where an integration asks for an authorization code": "連携側が認可コードを要求するアドレス",
234
260
  "text.where that code is exchanged for an access token": "そのコードをアクセストークンに交換するアドレス",
235
261
  "text.x modules y privileges": "{x} modules · {y} privileges",
@@ -237,8 +263,10 @@
237
263
  "text.x_cannot_delete": "{x}は削除できません.",
238
264
  "text.x_created_successfully": "{x}が成功的に作成されました.",
239
265
  "text.x_deleted_successfully": "{x}が成功的に削除されました.",
266
+ "text.you have joined. sign in to continue": "参加しました。ログインしてください。",
240
267
  "text.your account is not activated": "アカウントがアクティブ化されていません.",
241
268
  "text.your email address": "ユーザー メール",
269
+ "title.accept invitation": "招待を受ける",
242
270
  "title.attribute model": "属性モデル",
243
271
  "title.attribute-item list": "属性アイテム リスト",
244
272
  "title.attributes": "属性",