@things-factory/auth-ui 10.1.16 → 10.1.18

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 (98) hide show
  1. package/dist-client/components/app-binding-detail.d.ts +46 -0
  2. package/dist-client/components/app-binding-detail.js +384 -0
  3. package/dist-client/components/app-binding-detail.js.map +1 -0
  4. package/dist-client/components/appliance-editor.d.ts +37 -0
  5. package/dist-client/components/appliance-editor.js +489 -0
  6. package/dist-client/components/appliance-editor.js.map +1 -0
  7. package/dist-client/components/application-editor.d.ts +31 -0
  8. package/dist-client/components/application-editor.js +491 -0
  9. package/dist-client/components/application-editor.js.map +1 -0
  10. package/dist-client/components/profile-component.js +28 -11
  11. package/dist-client/components/profile-component.js.map +1 -1
  12. package/dist-client/components/secret-field.d.ts +35 -0
  13. package/dist-client/components/secret-field.js +149 -0
  14. package/dist-client/components/secret-field.js.map +1 -0
  15. package/dist-client/constants/application-type-parity.test.js +62 -0
  16. package/dist-client/constants/application-type-parity.test.js.map +1 -0
  17. package/dist-client/constants/application.d.ts +17 -7
  18. package/dist-client/constants/application.js +18 -8
  19. package/dist-client/constants/application.js.map +1 -1
  20. package/dist-client/pages/app-binding/app-binding-list-query.test.js +46 -0
  21. package/dist-client/pages/app-binding/app-binding-list-query.test.js.map +1 -0
  22. package/dist-client/pages/app-binding/app-bindings.d.ts +65 -2
  23. package/dist-client/pages/app-binding/app-bindings.js +217 -117
  24. package/dist-client/pages/app-binding/app-bindings.js.map +1 -1
  25. package/dist-client/pages/appliance/appliance-list-query.test.d.ts +1 -0
  26. package/dist-client/pages/appliance/appliance-list-query.test.js +58 -0
  27. package/dist-client/pages/appliance/appliance-list-query.test.js.map +1 -0
  28. package/dist-client/pages/appliance/home.d.ts +63 -2
  29. package/dist-client/pages/appliance/home.js +219 -123
  30. package/dist-client/pages/appliance/home.js.map +1 -1
  31. package/dist-client/pages/application/applications.d.ts +63 -2
  32. package/dist-client/pages/application/applications.js +212 -129
  33. package/dist-client/pages/application/applications.js.map +1 -1
  34. package/dist-client/pages/auth-provider/auth-provider-management.d.ts +4 -2
  35. package/dist-client/pages/auth-provider/auth-provider-management.js +35 -6
  36. package/dist-client/pages/auth-provider/auth-provider-management.js.map +1 -1
  37. package/dist-client/pages/domain-owner/domain-owner-management.d.ts +2 -0
  38. package/dist-client/pages/domain-owner/domain-owner-management.js +34 -7
  39. package/dist-client/pages/domain-owner/domain-owner-management.js.map +1 -1
  40. package/dist-client/pages/secrets-are-not-printed.test.d.ts +1 -0
  41. package/dist-client/pages/secrets-are-not-printed.test.js +88 -0
  42. package/dist-client/pages/secrets-are-not-printed.test.js.map +1 -0
  43. package/dist-client/route.js +0 -15
  44. package/dist-client/route.js.map +1 -1
  45. package/dist-client/tsconfig.tsbuildinfo +1 -1
  46. package/dist-client/utils/application-status.d.ts +32 -0
  47. package/dist-client/utils/application-status.js +45 -0
  48. package/dist-client/utils/application-status.js.map +1 -0
  49. package/dist-client/utils/application-status.test.d.ts +1 -0
  50. package/dist-client/utils/application-status.test.js +45 -0
  51. package/dist-client/utils/application-status.test.js.map +1 -0
  52. package/dist-client/utils/form-values.d.ts +71 -0
  53. package/dist-client/utils/form-values.js +102 -0
  54. package/dist-client/utils/form-values.js.map +1 -0
  55. package/dist-client/utils/form-values.test.d.ts +1 -0
  56. package/dist-client/utils/form-values.test.js +120 -0
  57. package/dist-client/utils/form-values.test.js.map +1 -0
  58. package/dist-client/utils/list-result.d.ts +62 -0
  59. package/dist-client/utils/list-result.js +92 -0
  60. package/dist-client/utils/list-result.js.map +1 -0
  61. package/dist-client/utils/list-result.test.d.ts +1 -0
  62. package/dist-client/utils/list-result.test.js +160 -0
  63. package/dist-client/utils/list-result.test.js.map +1 -0
  64. package/dist-client/utils/secret-display.d.ts +51 -0
  65. package/dist-client/utils/secret-display.js +61 -0
  66. package/dist-client/utils/secret-display.js.map +1 -0
  67. package/dist-client/utils/secret-display.test.d.ts +1 -0
  68. package/dist-client/utils/secret-display.test.js +59 -0
  69. package/dist-client/utils/secret-display.test.js.map +1 -0
  70. package/dist-client/utils/webauthn-verification.d.ts +56 -0
  71. package/dist-client/utils/webauthn-verification.js +79 -0
  72. package/dist-client/utils/webauthn-verification.js.map +1 -0
  73. package/dist-client/utils/webauthn-verification.test.d.ts +1 -0
  74. package/dist-client/utils/webauthn-verification.test.js +79 -0
  75. package/dist-client/utils/webauthn-verification.test.js.map +1 -0
  76. package/dist-server/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +3 -3
  78. package/things-factory.config.js +0 -5
  79. package/translations/en.json +56 -0
  80. package/translations/ja.json +57 -0
  81. package/translations/ko.json +56 -0
  82. package/translations/ms.json +57 -0
  83. package/translations/zh.json +57 -0
  84. package/dist-client/pages/app-binding/app-binding.d.ts +0 -1
  85. package/dist-client/pages/app-binding/app-binding.js +0 -371
  86. package/dist-client/pages/app-binding/app-binding.js.map +0 -1
  87. package/dist-client/pages/appliance/appliance.d.ts +0 -1
  88. package/dist-client/pages/appliance/appliance.js +0 -392
  89. package/dist-client/pages/appliance/appliance.js.map +0 -1
  90. package/dist-client/pages/appliance/register.js +0 -166
  91. package/dist-client/pages/appliance/register.js.map +0 -1
  92. package/dist-client/pages/application/application.d.ts +0 -1
  93. package/dist-client/pages/application/application.js +0 -377
  94. package/dist-client/pages/application/application.js.map +0 -1
  95. package/dist-client/pages/application/register.js +0 -192
  96. package/dist-client/pages/application/register.js.map +0 -1
  97. /package/dist-client/{pages/appliance/register.d.ts → constants/application-type-parity.test.d.ts} +0 -0
  98. /package/dist-client/pages/{application/register.d.ts → app-binding/app-binding-list-query.test.d.ts} +0 -0
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "button.activate": "激活",
3
3
  "button.cancel": "取消",
4
+ "button.close": "关闭",
4
5
  "button.confirm": "确认",
6
+ "button.copy": "复制",
5
7
  "button.create": "创建",
6
8
  "button.create role": "create role",
7
9
  "button.deactivate": "停用",
@@ -9,10 +11,16 @@
9
11
  "button.delete role": "删除角色",
10
12
  "button.delete this appliance": "删除此设备",
11
13
  "button.delete user": "删除用户",
14
+ "button.detail": "详情",
12
15
  "button.generate new access token": "生成新的访问令牌",
16
+ "button.generate new secret": "重新生成密钥",
13
17
  "button.go to home": "首页",
18
+ "button.hide": "隐藏",
14
19
  "button.logout": "退出",
15
20
  "button.name it yourself": "name it yourself",
21
+ "button.register": "注册",
22
+ "button.renew access token": "更新访问令牌",
23
+ "button.reveal": "显示",
16
24
  "button.save": "保存",
17
25
  "button.security-key registration": "安全密钥注册",
18
26
  "button.show-all": "全部显示",
@@ -20,6 +28,7 @@
20
28
  "button.submit": "提交",
21
29
  "button.terminate contract": "终止合同",
22
30
  "button.transfer owner": "转让所有权",
31
+ "button.update": "更新",
23
32
  "error.cannot_modify_system_subdomain": "无法修改'system'子域。",
24
33
  "error.domain not allowed": "此域名对此用户不可用",
25
34
  "error.new-password-and-confirm-password-do-not-match": "新密码与认证密码不同",
@@ -31,15 +40,26 @@
31
40
  "error.user-locked": "用户帐户已锁定",
32
41
  "error.value is empty": "{value}为空",
33
42
  "error.x already exists in y": "{x}已存在于{y}",
43
+ "field.access token url": "access token url",
34
44
  "field.accessed-at": "访问于",
45
+ "field.app key": "app key",
46
+ "field.application icon": "图标地址",
47
+ "field.application url": "应用地址",
35
48
  "field.attributes": "属性",
49
+ "field.auth url": "auth url",
50
+ "field.available scopes": "可用范围",
51
+ "field.brand": "品牌",
36
52
  "field.client-id": "客户端ID",
37
53
  "field.client-secret": "客户端密钥",
38
54
  "field.confirm password": "确认密码",
55
+ "field.contact email": "联系邮箱",
56
+ "field.description": "说明",
39
57
  "field.email": "电子邮件",
40
58
  "field.forgot-password": "忘记密码",
41
59
  "field.hidden": "隐藏",
42
60
  "field.ip_address": "IP地址",
61
+ "field.model": "型号",
62
+ "field.name": "名称",
43
63
  "field.netmask": "子网掩码",
44
64
  "field.options": "选项",
45
65
  "field.owner": "所有人",
@@ -47,8 +67,10 @@
47
67
  "field.parent-domain": "父域名",
48
68
  "field.password": "密码",
49
69
  "field.private-key": "私钥",
70
+ "field.redirect url": "跳转地址",
50
71
  "field.required privilege": "必需权限",
51
72
  "field.required role": "所需角色",
73
+ "field.scope": "范围",
52
74
  "field.seat": "seat",
53
75
  "field.serial-no": "序列号",
54
76
  "field.sign in": "登录",
@@ -60,11 +82,15 @@
60
82
  "field.target-domain": "目标域",
61
83
  "field.tenant-id": "租户ID",
62
84
  "field.token": "代币",
85
+ "field.type": "类型",
86
+ "field.updated at": "更新时间",
63
87
  "field.usage": "使用位置",
64
88
  "field.user-id or email": "用户名或电子邮件",
65
89
  "field.user-type": "用户类型",
66
90
  "field.username": "用户名",
91
+ "field.webhook": "webhook",
67
92
  "label.access token": "访问令牌",
93
+ "label.activated": "已启用",
68
94
  "label.activated-user": "用户已激活",
69
95
  "label.admin-user": "管理用户",
70
96
  "label.application": "应用程序",
@@ -82,6 +108,7 @@
82
108
  "label.description": "描述",
83
109
  "label.domain": "域",
84
110
  "label.domain-owner": "域名所有者",
111
+ "label.draft": "草稿",
85
112
  "label.email": "电子邮件",
86
113
  "label.inactive-user": "非活动用户",
87
114
  "label.invite customer": "邀请客户或合作伙伴",
@@ -95,6 +122,7 @@
95
122
  "label.protected-request-ip": "安全请求 IP",
96
123
  "label.protectedlist": "受保护的 IP 列表",
97
124
  "label.redirect_uri": "重定向URI",
125
+ "label.refresh token": "刷新令牌",
98
126
  "label.resend": "发过验证邮件",
99
127
  "label.role": "角色",
100
128
  "label.search_domain": "搜索域",
@@ -113,9 +141,14 @@
113
141
  "text.a blank seat opens nothing until you give it privileges": "A blank seat opens nothing until you give it privileges.",
114
142
  "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.",
115
143
  "text.already in this domain": "already here",
144
+ "text.an application signs in on its own behalf": "应用程序以自己的密钥和权限登录",
116
145
  "text.appliance": "终端设备",
117
146
  "text.appliance credential": "终端设备凭证",
147
+ "text.appliances": "终端设备",
148
+ "text.application": "应用程序",
118
149
  "text.application management": "应用管理",
150
+ "text.applications": "应用程序",
151
+ "text.are you sure you want to delete x": "删除 {x}?此操作无法撤销。",
119
152
  "text.are_you_sure_to_delete_x": "您确定是否删除{x}?",
120
153
  "text.are_you_sure_to_terminate_contract": "您确定要终止合同吗?",
121
154
  "text.are_you_sure_to_transfer_owner": "您确定要转移业主权限?",
@@ -124,12 +157,21 @@
124
157
  "text.attribute management": "属性管理",
125
158
  "text.auth profile": "账号管理",
126
159
  "text.auth-provider management": "身份验证提供者管理",
160
+ "text.binding": "绑定",
161
+ "text.binding credential": "绑定凭据",
162
+ "text.bound application": "已绑定的应用程序",
163
+ "text.bound applications": "已绑定应用程序",
127
164
  "text.cannot_delete": "无法删除",
128
165
  "text.change password": "修改密码",
129
166
  "text.click login history": "如果您想查看最近的登录记录,请点击这里。",
130
167
  "text.completed": "已完成",
131
168
  "text.confirm password": "认证密码",
169
+ "text.copied": "已复制",
170
+ "text.copying needs a secure connection": "复制需要安全连接 — 请手动选择并复制该值",
171
+ "text.could not be saved": "保存失败 — 原因请看上方提示",
172
+ "text.could not register": "注册失败 — 原因见上方提示",
132
173
  "text.create role": "创建角色",
174
+ "text.credentials": "凭据",
133
175
  "text.current password": "当前密码",
134
176
  "text.delete account warning message": "这步骤将完全删除您的账号。\n\n请输入您的电子邮件和密码,确认删除步骤。",
135
177
  "text.deleted_successfully": "删除成功",
@@ -139,10 +181,14 @@
139
181
  "text.domain management": "域管理",
140
182
  "text.domain_name_change_warning": "确定要更改域名吗?(子域名将保持不变。)",
141
183
  "text.email is not matched": "电子邮件不匹配",
184
+ "text.endpoints": "端点",
142
185
  "text.env-var-list-page": "环境变量列表",
186
+ "text.expired": "已过期",
187
+ "text.expires at x": "{x} 过期",
143
188
  "text.inherited from x": "继承自 {x}",
144
189
  "text.new password": "新密码",
145
190
  "text.no domain available": "抱歉,没有域名",
191
+ "text.not issued": "未签发",
146
192
  "text.opens nothing, receives approvals": "opens nothing — this seat receives approvals",
147
193
  "text.owner_transfer_completed": "所有权转让成功。",
148
194
  "text.password rule": "输入的密码必须15个字符或8字符包括号码和小写字符",
@@ -151,6 +197,8 @@
151
197
  "text.please enter the email of the user you want to transfer owner": "请录入所有权接收人的邮件。",
152
198
  "text.please_fill_all_required_fields": "请填写所有必填字段",
153
199
  "text.privilege no longer declared": "已没有代码需要此权限",
200
+ "text.register new appliance": "注册终端设备",
201
+ "text.register new application": "注册新应用程序",
154
202
  "text.registered roles": "角色登记成功",
155
203
  "text.remaining time": "剩余{days}天{hours}小时{mins}分钟{secs}秒",
156
204
  "text.role_management": "角色管理",
@@ -163,12 +211,21 @@
163
211
  "text.struck through are not installed here": "Struck through are privileges this installation does not have.",
164
212
  "text.subdomain_change_critical_warning": "警告: 更改子域将更改完整的访问URL(/{type}/{subdomain}/...),并可能使现有的外部链接、书签和活动用户会话失效。请谨慎操作。",
165
213
  "text.synchronize": "同步",
214
+ "text.the appliance could not be loaded": "无法读取终端设备",
215
+ "text.the application could not be loaded": "无法读取应用程序",
216
+ "text.the binding could not be loaded": "无法读取绑定",
217
+ "text.the current access token stops working immediately": "当前访问令牌将立即失效,使用它的地方需要换成新的令牌。",
218
+ "text.the current secret stops working immediately": "当前密钥将立即失效,使用它的地方需要换成新的密钥。",
219
+ "text.the list could not be loaded": "无法加载列表",
166
220
  "text.this domain is top level and inherits from nowhere": "顶级域 — 没有可继承的来源",
221
+ "text.this field is required": "此项为必填",
167
222
  "text.this plant may call the seat what it likes": "Call the seat whatever this plant calls it.",
168
223
  "text.token expiry time": "令牌过期时间",
169
224
  "text.updated_successfully": "更新成功",
170
225
  "text.user invitation prompt": "请输入您希望邀请的用户的用户名或电子邮件地址。",
171
226
  "text.user management": "用户管理",
227
+ "text.where an integration asks for an authorization code": "集成方申请授权码的地址",
228
+ "text.where that code is exchanged for an access token": "用该授权码换取访问令牌的地址",
172
229
  "text.x modules y privileges": "{x} modules · {y} privileges",
173
230
  "text.x not here": "{x} not installed here",
174
231
  "text.x_cannot_delete": "{x}无法删除",
@@ -1 +0,0 @@
1
- import '@material/web/icon/icon.js';
@@ -1,371 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import '@material/web/icon/icon.js';
3
- import Clipboard from 'clipboard';
4
- import gql from 'graphql-tag';
5
- import { css, html } from 'lit';
6
- import { customElement, property, state } from 'lit/decorators.js';
7
- import { asyncReplace } from 'lit/directives/async-replace.js';
8
- import { client } from '@operato/graphql';
9
- import { navigate, PageView } from '@operato/shell';
10
- import { parseJwt, sleep } from '@operato/utils';
11
- let AppBinding = class AppBinding extends PageView {
12
- static { this.styles = [
13
- css `
14
- :host { display: flex;
15
- flex-direction: column;
16
- overflow-y: auto;
17
-
18
- position: relative;
19
-
20
- background-color: var(--md-sys-color-background);
21
- padding: var(--spacing-large);
22
- }
23
-
24
- h2 { margin: var(--title-margin);
25
- font: var(--title-font);
26
- color: var(--title-text-color);
27
- }
28
-
29
- [page-description] { margin: var(--page-description-margin);
30
- font: var(--page-description-font);
31
- color: var(--page-description-color);
32
- }
33
-
34
- [icon] { position: absolute;
35
- top: 10px;
36
- right: 10px;
37
-
38
- max-width: 80px;
39
- }
40
-
41
- [icon] img { max-width: 100%;
42
- max-height: 100%;
43
- }
44
-
45
- [fieldset-container] { background-color: var(--md-sys-color-surface);
46
- margin: var(--spacing-large) 0 var(--spacing-medium) 0;
47
- padding: var(--spacing-medium);
48
- border-radius: var(--border-radius);
49
- box-shadow: var(--box-shadow);
50
-
51
- label { font: var(--label-font);
52
- color: var(--label-color, var(--md-sys-color-on-surface));
53
- text-transform: var(--label-text-transform);
54
- }
55
- input {
56
- background-color: var(--input-field-background, var(--md-sys-color-surface-container-highest));
57
- color: var(--input-field-color, var(--md-sys-color-on-surface));
58
- border: var(--border-dim-color);
59
- border-radius: var(--border-radius);
60
- margin: var(--input-margin);
61
- padding: var(--input-padding);
62
- font: var(--input-font);
63
-
64
- flex: 1;
65
- }
66
- select:focus,
67
- input:focus,
68
- button { outline: none;
69
- }
70
- form { max-width: var(--content-container-max-width);
71
- }
72
- }
73
-
74
- [fieldset-container] fieldset { margin: 0;
75
- margin-top: -15px;
76
- }
77
-
78
- fieldset { border-radius: var(--border-radius);
79
- border: var(--border-dim-color);
80
- margin: var(--fieldset-margin);
81
- padding: var(--fieldset-padding);
82
- }
83
-
84
- legend { padding: var(--legend-padding);
85
- font-weight: bold;
86
- color: var(--legend-color);
87
- }
88
-
89
- [field-2column] { display: grid;
90
- grid-template-columns: 1fr 1fr;
91
- grid-gap: 15px;
92
- }
93
-
94
- [field] { display: flex;
95
- flex-direction: column;
96
- position: relative;
97
- }
98
-
99
- [grid-span] { grid-column: span 2;
100
- }
101
-
102
- button,
103
- [button-in-field] { background-color: var(--button-background-color);
104
- border: var(--button-border);
105
- border-radius: var(--button-border-radius);
106
- padding: var(--button-padding);
107
- color: var(--button-color);
108
- font: var(--button-font);
109
- text-transform: var(--button-text-transform);
110
-
111
- margin: var(--spacing-medium) 0 var(--spacing-medium) var(--spacing-medium);
112
- float: right;
113
- text-decoration: none;
114
- }
115
-
116
- button:hover { border: var(--button-activ-border);
117
- box-shadow: var(--button-active-box-shadow);
118
- }
119
-
120
- [button-in-field] { border-radius: 0 var(--button-border-radius) var(--button-border-radius) 0;
121
- position: absolute;
122
- top: 12px;
123
- right: 0;
124
- max-height: 36px;
125
- }
126
-
127
- [input-hint] { font: var(--input-hint-font);
128
- color: var(--input-hint-color);
129
- }
130
-
131
- @media screen and (max-width: 480px) { [field] { grid-column: span 2;
132
- }
133
- }
134
- `
135
- ]; }
136
- get context() {
137
- return { title: { icon: 'link',
138
- text: this.appbinding.name
139
- }
140
- };
141
- }
142
- render() {
143
- var binding = this.appbinding || {};
144
- var app = this.appbinding?.application || {};
145
- var refreshTokenExp = this._refreshTokenInfo?.exp;
146
- var accessTokenExp = this._accessTokenInfo?.exp;
147
- return html `
148
- <div>
149
- <h2><md-icon>link</md-icon>&nbsp;${app.name}</h2>
150
- <p page-description>${app.description}</p>
151
- </div>
152
-
153
- ${app.icon
154
- ? html `
155
- <div icon>
156
- <img src=${app.icon} />
157
- </div>
158
- `
159
- : html ``}
160
-
161
- <form>
162
- <div fieldset-container>
163
- <fieldset>
164
- <legend>application</legend>
165
- <div field-2column>
166
- <div field grid-span>
167
- <label for="app-name">app name</label>
168
- <input id="app-name" type="text" .value=${app.name} readonly />
169
- </div>
170
-
171
- <div field grid-span>
172
- <label for="app-description">description</label>
173
- <input id="app-description" type="text" .value=${app.description} readonly />
174
- </div>
175
-
176
- <div field>
177
- <label for="contact-email">contact email</label>
178
- <input id="contact-email" type="text" .value=${app.email} readonly />
179
- </div>
180
- </div>
181
- </fieldset>
182
- </div>
183
-
184
- <div fieldset-container>
185
- <fieldset>
186
- <legend>binding</legend>
187
- <div field-2column>
188
- <div field grid-span>
189
- <label for="id">id</label>
190
- <input id="id" type="text" .value=${binding.id} readonly />
191
- </div>
192
-
193
- <div field grid-span>
194
- <label for="name">name</label>
195
- <input id="name" type="text" .value=${binding.email} readonly />
196
- </div>
197
-
198
- <div field>
199
- <label for="status">status</label>
200
- <input id="status" type="text" .value=${binding.status} readonly />
201
- </div>
202
-
203
- <div field>
204
- <label for="scope">scope</label>
205
- <input id="scope" type="text" .value=${binding.scope} readonly />
206
- </div>
207
- </div>
208
- </fieldset>
209
- </div>
210
-
211
- <div fieldset-container>
212
- <fieldset>
213
- <legend>binding credential</legend>
214
- <div field-2column>
215
- <div field grid-span>
216
- <label for="access-token">access token</label>
217
- <input id="access-token" type="text" .value=${this.accessToken || ''} readonly />
218
- <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>
219
- ${accessTokenExp
220
- ? html `<div input-hint>
221
- expired in ${new Date(accessTokenExp).toLocaleString()} :
222
- ${asyncReplace(this.expTimer(accessTokenExp))}
223
- </div>`
224
- : html ``}
225
- </div>
226
-
227
- <div field grid-span>
228
- <label for="refresh-token">refresh token</label>
229
- <input id="refresh-token" type="text" .value=${binding.refreshToken || ''} readonly />
230
- <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>
231
- ${refreshTokenExp
232
- ? html `<div input-hint>
233
- expired in ${new Date(refreshTokenExp).toLocaleString()} :
234
- ${asyncReplace(this.expTimer(refreshTokenExp))}
235
- </div>`
236
- : html ``}
237
- </div>
238
- </div>
239
- </fieldset>
240
- </div>
241
-
242
- <button @click=${this.deleteAppBinding.bind(this)}>delete this application binding</button>
243
- <button @click=${this.renewApplicationAccessToken.bind(this)}>renew access token</button>
244
- </form>
245
- `;
246
- }
247
- async *expTimer(exp) {
248
- const DAY = 24 * 60 * 60;
249
- const HOUR = 60 * 60;
250
- const MIN = 60;
251
- while (this.active) {
252
- var remain = Math.floor(Number(exp) - Date.now() / 1000);
253
- const days = Math.floor(remain / DAY);
254
- remain -= days * DAY;
255
- const hours = Math.floor(remain / HOUR);
256
- remain -= hours * HOUR;
257
- const mins = Math.floor(remain / MIN);
258
- const secs = remain - mins * MIN;
259
- yield `${days} days ${hours} hours ${mins} mins ${secs} seconds remain`;
260
- await sleep(1000);
261
- }
262
- }
263
- firstUpdated() {
264
- const copybuttons = this.renderRoot.querySelectorAll('[clipboard-copy]');
265
- this.clipboard = new Clipboard(copybuttons, { target: (trigger => trigger.parentElement.querySelector('input'))
266
- });
267
- }
268
- updated(changes) {
269
- if (changes.has('appbinding')) {
270
- const { refreshToken } = this.appbinding || {};
271
- this._refreshTokenInfo = refreshToken ? parseJwt(refreshToken) : {};
272
- }
273
- if (changes.has('accessToken')) {
274
- this._accessTokenInfo = this.accessToken ? parseJwt(this.accessToken) : {};
275
- }
276
- }
277
- async pageUpdated(changes, lifecycle, before) {
278
- if (this.active) { /*
279
- * this page is activated
280
- */
281
- await this.fetchAppBinding();
282
- }
283
- else { /* this page is deactivated */
284
- }
285
- }
286
- async fetchAppBinding() {
287
- const response = await client.query({ query: gql `
288
- query ($id: String!) { appBinding(id: $id) { id
289
- name
290
- description
291
- email
292
- scope
293
- status
294
- application { id
295
- name
296
- description
297
- email
298
- icon
299
- }
300
- refreshToken
301
- }
302
- }
303
- `,
304
- variables: { id: this.lifecycle.resourceId
305
- }
306
- });
307
- this.appbinding = response.data.appBinding;
308
- }
309
- async deleteAppBinding(e) {
310
- e.preventDefault();
311
- const id = this.lifecycle.resourceId;
312
- const response = await client.mutate({ mutation: gql `
313
- mutation ($id: String!) { deleteAppBinding(id: $id)
314
- }
315
- `,
316
- variables: { id
317
- }
318
- });
319
- const result = response.data.deleteAppBinding;
320
- if (result) {
321
- console.log('delete sucess');
322
- navigate(`app-bindings`);
323
- }
324
- else {
325
- console.error('delete fail');
326
- }
327
- }
328
- async renewApplicationAccessToken(e) {
329
- e.preventDefault();
330
- const id = this.lifecycle.resourceId;
331
- const response = await client.mutate({ mutation: gql `
332
- mutation ($id: String!) { renewApplicationAccessToken(id: $id) { accessToken
333
- refreshToken
334
- }
335
- }
336
- `,
337
- variables: { id
338
- }
339
- });
340
- if (response.errors) {
341
- console.error('renew application access token fail');
342
- }
343
- else {
344
- const { accessToken, refreshToken } = response.data.renewApplicationAccessToken;
345
- this.accessToken = accessToken;
346
- this.appbinding = { ...this.appbinding,
347
- refreshToken
348
- };
349
- }
350
- }
351
- };
352
- __decorate([
353
- property({ type: Object }),
354
- __metadata("design:type", Object)
355
- ], AppBinding.prototype, "appbinding", void 0);
356
- __decorate([
357
- property({ type: String }),
358
- __metadata("design:type", String)
359
- ], AppBinding.prototype, "accessToken", void 0);
360
- __decorate([
361
- state(),
362
- __metadata("design:type", Object)
363
- ], AppBinding.prototype, "_refreshTokenInfo", void 0);
364
- __decorate([
365
- state(),
366
- __metadata("design:type", Object)
367
- ], AppBinding.prototype, "_accessTokenInfo", void 0);
368
- AppBinding = __decorate([
369
- customElement('app-binding-page')
370
- ], AppBinding);
371
- //# sourceMappingURL=app-binding.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-binding.js","sourceRoot":"","sources":["../../../client/pages/app-binding/app-binding.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport Clipboard from 'clipboard'\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { asyncReplace } from 'lit/directives/async-replace.js'\nimport { client } from '@operato/graphql'\nimport { navigate, PageView } from '@operato/shell'\nimport { parseJwt, sleep } from '@operato/utils'\n\n@customElement('app-binding-page')\nclass AppBinding extends PageView { static styles = [\n css`\n :host { display: flex;\n flex-direction: column;\n overflow-y: auto;\n\n position: relative;\n\n background-color: var(--md-sys-color-background);\n padding: var(--spacing-large);\n }\n\n h2 { margin: var(--title-margin);\n font: var(--title-font);\n color: var(--title-text-color);\n }\n\n [page-description] { margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n }\n\n [icon] { position: absolute;\n top: 10px;\n right: 10px;\n\n max-width: 80px;\n }\n\n [icon] img { max-width: 100%;\n max-height: 100%;\n }\n\n [fieldset-container] { background-color: var(--md-sys-color-surface);\n margin: var(--spacing-large) 0 var(--spacing-medium) 0;\n padding: var(--spacing-medium);\n border-radius: var(--border-radius);\n box-shadow: var(--box-shadow);\n\n label { font: var(--label-font);\n color: var(--label-color, var(--md-sys-color-on-surface));\n text-transform: var(--label-text-transform);\n }\n input {\n background-color: var(--input-field-background, var(--md-sys-color-surface-container-highest));\n color: var(--input-field-color, var(--md-sys-color-on-surface));\n border: var(--border-dim-color);\n border-radius: var(--border-radius);\n margin: var(--input-margin);\n padding: var(--input-padding);\n font: var(--input-font);\n\n flex: 1;\n }\n select:focus,\n input:focus,\n button { outline: none;\n }\n form { max-width: var(--content-container-max-width);\n }\n }\n\n [fieldset-container] fieldset { margin: 0;\n margin-top: -15px;\n }\n\n fieldset { border-radius: var(--border-radius);\n border: var(--border-dim-color);\n margin: var(--fieldset-margin);\n padding: var(--fieldset-padding);\n }\n\n legend { padding: var(--legend-padding);\n font-weight: bold;\n color: var(--legend-color);\n }\n\n [field-2column] { display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: 15px;\n }\n\n [field] { display: flex;\n flex-direction: column;\n position: relative;\n }\n\n [grid-span] { grid-column: span 2;\n }\n\n button,\n [button-in-field] { background-color: var(--button-background-color);\n border: var(--button-border);\n border-radius: var(--button-border-radius);\n padding: var(--button-padding);\n color: var(--button-color);\n font: var(--button-font);\n text-transform: var(--button-text-transform);\n\n margin: var(--spacing-medium) 0 var(--spacing-medium) var(--spacing-medium);\n float: right;\n text-decoration: none;\n }\n\n button:hover { border: var(--button-activ-border);\n box-shadow: var(--button-active-box-shadow);\n }\n\n [button-in-field] { border-radius: 0 var(--button-border-radius) var(--button-border-radius) 0;\n position: absolute;\n top: 12px;\n right: 0;\n max-height: 36px;\n }\n\n [input-hint] { font: var(--input-hint-font);\n color: var(--input-hint-color);\n }\n\n @media screen and (max-width: 480px) { [field] { grid-column: span 2;\n }\n }\n `\n ]\n\n @property({ type: Object }) appbinding: any\n @property({ type: String }) accessToken?: string\n\n @state() _refreshTokenInfo: any\n @state() _accessTokenInfo: any\n\n private clipboard?: Clipboard\n\n get context() { return { title: { icon: 'link',\n text: this.appbinding.name\n }\n }\n }\n\n render() { var binding = this.appbinding || {}\n var app = this.appbinding?.application || {}\n var refreshTokenExp = this._refreshTokenInfo?.exp\n var accessTokenExp = this._accessTokenInfo?.exp\n\n return html`\n <div>\n <h2><md-icon>link</md-icon>&nbsp;${app.name}</h2>\n <p page-description>${app.description}</p>\n </div>\n\n ${app.icon\n ? html`\n <div icon>\n <img src=${app.icon} />\n </div>\n `\n : html``}\n\n <form>\n <div fieldset-container>\n <fieldset>\n <legend>application</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"app-name\">app name</label>\n <input id=\"app-name\" type=\"text\" .value=${app.name} readonly />\n </div>\n\n <div field grid-span>\n <label for=\"app-description\">description</label>\n <input id=\"app-description\" type=\"text\" .value=${app.description} readonly />\n </div>\n\n <div field>\n <label for=\"contact-email\">contact email</label>\n <input id=\"contact-email\" type=\"text\" .value=${app.email} readonly />\n </div>\n </div>\n </fieldset>\n </div>\n\n <div fieldset-container>\n <fieldset>\n <legend>binding</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"id\">id</label>\n <input id=\"id\" type=\"text\" .value=${binding.id} readonly />\n </div>\n\n <div field grid-span>\n <label for=\"name\">name</label>\n <input id=\"name\" type=\"text\" .value=${binding.email} readonly />\n </div>\n\n <div field>\n <label for=\"status\">status</label>\n <input id=\"status\" type=\"text\" .value=${binding.status} readonly />\n </div>\n\n <div field>\n <label for=\"scope\">scope</label>\n <input id=\"scope\" type=\"text\" .value=${binding.scope} readonly />\n </div>\n </div>\n </fieldset>\n </div>\n\n <div fieldset-container>\n <fieldset>\n <legend>binding credential</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"access-token\">access token</label>\n <input id=\"access-token\" type=\"text\" .value=${this.accessToken || ''} readonly />\n <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n ${accessTokenExp\n ? html`<div input-hint>\n expired in ${new Date(accessTokenExp).toLocaleString()} :\n ${asyncReplace(this.expTimer(accessTokenExp))}\n </div>`\n : html``}\n </div>\n\n <div field grid-span>\n <label for=\"refresh-token\">refresh token</label>\n <input id=\"refresh-token\" type=\"text\" .value=${binding.refreshToken || ''} readonly />\n <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n ${refreshTokenExp\n ? html`<div input-hint>\n expired in ${new Date(refreshTokenExp).toLocaleString()} :\n ${asyncReplace(this.expTimer(refreshTokenExp))}\n </div>`\n : html``}\n </div>\n </div>\n </fieldset>\n </div>\n\n <button @click=${this.deleteAppBinding.bind(this)}>delete this application binding</button>\n <button @click=${this.renewApplicationAccessToken.bind(this)}>renew access token</button>\n </form>\n `\n }\n\n async *expTimer(exp) { const DAY = 24 * 60 * 60\n const HOUR = 60 * 60\n const MIN = 60\n\n while (this.active) { var remain = Math.floor(Number(exp) - Date.now() / 1000)\n const days = Math.floor(remain / DAY)\n remain -= days * DAY\n const hours = Math.floor(remain / HOUR)\n remain -= hours * HOUR\n const mins = Math.floor(remain / MIN)\n const secs = remain - mins * MIN\n\n yield `${days} days ${hours} hours ${mins} mins ${secs} seconds remain`\n\n await sleep(1000)\n }\n }\n\n firstUpdated() { const copybuttons = this.renderRoot.querySelectorAll('[clipboard-copy]')\n\n this.clipboard = new Clipboard(copybuttons, { target: (trigger => trigger.parentElement.querySelector('input')) as any\n })\n }\n\n updated(changes) { /*\n * If this page properties are changed, this callback will be invoked.\n * This callback will be called back only when this page is activated.\n */\n if (changes.has('appbinding')) { const { refreshToken } = this.appbinding || {}\n this._refreshTokenInfo = refreshToken ? parseJwt(refreshToken) : {}\n }\n\n if (changes.has('accessToken')) { this._accessTokenInfo = this.accessToken ? parseJwt(this.accessToken) : {}\n }\n }\n\n async pageUpdated(changes, lifecycle, before) { if (this.active) { /*\n * this page is activated\n */\n await this.fetchAppBinding()\n } else { /* this page is deactivated */\n }\n }\n\n async fetchAppBinding() { const response = await client.query({ query: gql`\n query ($id: String!) { appBinding(id: $id) { id\n name\n description\n email\n scope\n status\n application { id\n name\n description\n email\n icon\n }\n refreshToken\n }\n }\n `,\n variables: { id: this.lifecycle.resourceId\n }\n })\n\n this.appbinding = response.data.appBinding\n }\n\n async deleteAppBinding(e) { e.preventDefault()\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!) { deleteAppBinding(id: $id)\n }\n `,\n variables: { id\n }\n })\n\n const result = response.data.deleteAppBinding\n if (result) { console.log('delete sucess')\n navigate(`app-bindings`)\n } else { console.error('delete fail')\n }\n }\n\n async renewApplicationAccessToken(e) { e.preventDefault()\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!) { renewApplicationAccessToken(id: $id) { accessToken\n refreshToken\n }\n }\n `,\n variables: { id\n }\n })\n\n if (response.errors) { console.error('renew application access token fail')\n } else { const { accessToken, refreshToken } = response.data.renewApplicationAccessToken\n this.accessToken = accessToken\n this.appbinding = { ...this.appbinding,\n refreshToken\n }\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- import '@material/web/icon/icon.js';