@things-factory/auth-ui 8.0.5 → 9.0.0-beta.12

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 (146) hide show
  1. package/dist-client/components/abstract-auth-page.d.ts +1 -1
  2. package/dist-client/components/abstract-auth-page.js +12 -10
  3. package/dist-client/components/abstract-auth-page.js.map +1 -1
  4. package/dist-client/components/abstract-password-reset.d.ts +2 -3
  5. package/dist-client/components/abstract-password-reset.js +10 -17
  6. package/dist-client/components/abstract-password-reset.js.map +1 -1
  7. package/dist-client/components/abstract-sign.js +12 -11
  8. package/dist-client/components/abstract-sign.js.map +1 -1
  9. package/dist-client/components/change-password.js +1 -1
  10. package/dist-client/components/change-password.js.map +1 -1
  11. package/dist-client/components/contact-us.d.ts +1 -1
  12. package/dist-client/components/contact-us.js +10 -7
  13. package/dist-client/components/contact-us.js.map +1 -1
  14. package/dist-client/components/create-user.js +28 -5
  15. package/dist-client/components/create-user.js.map +1 -1
  16. package/dist-client/components/invite-user.d.ts +1 -1
  17. package/dist-client/components/invite-user.js +19 -12
  18. package/dist-client/components/invite-user.js.map +1 -1
  19. package/dist-client/components/ownership-transfer-popup.js +3 -3
  20. package/dist-client/components/ownership-transfer-popup.js.map +1 -1
  21. package/dist-client/components/partner-role-editor.js +1 -1
  22. package/dist-client/components/partner-role-editor.js.map +1 -1
  23. package/dist-client/components/profile-component.d.ts +8 -4
  24. package/dist-client/components/profile-component.js +67 -7
  25. package/dist-client/components/profile-component.js.map +1 -1
  26. package/dist-client/components/role-privilege-editor.js +2 -1
  27. package/dist-client/components/role-privilege-editor.js.map +1 -1
  28. package/dist-client/components/user-role-editor.d.ts +2 -2
  29. package/dist-client/components/user-role-editor.js +20 -20
  30. package/dist-client/components/user-role-editor.js.map +1 -1
  31. package/dist-client/constants/index.d.ts +1 -1
  32. package/dist-client/constants/index.js +1 -1
  33. package/dist-client/constants/index.js.map +1 -1
  34. package/dist-client/entries/auth/activate.d.ts +1 -1
  35. package/dist-client/entries/auth/activate.js +1 -1
  36. package/dist-client/entries/auth/activate.js.map +1 -1
  37. package/dist-client/entries/auth/checkin.js +2 -2
  38. package/dist-client/entries/auth/checkin.js.map +1 -1
  39. package/dist-client/entries/auth/forgot-password.d.ts +2 -2
  40. package/dist-client/entries/auth/forgot-password.js +13 -4
  41. package/dist-client/entries/auth/forgot-password.js.map +1 -1
  42. package/dist-client/entries/auth/reset-password.d.ts +1 -1
  43. package/dist-client/entries/auth/reset-password.js +1 -1
  44. package/dist-client/entries/auth/reset-password.js.map +1 -1
  45. package/dist-client/entries/auth/result.d.ts +1 -1
  46. package/dist-client/entries/auth/result.js +1 -1
  47. package/dist-client/entries/auth/result.js.map +1 -1
  48. package/dist-client/entries/auth/signin.d.ts +1 -1
  49. package/dist-client/entries/auth/signin.js +1 -1
  50. package/dist-client/entries/auth/signin.js.map +1 -1
  51. package/dist-client/entries/auth/signup.d.ts +3 -1
  52. package/dist-client/entries/auth/signup.js +45 -9
  53. package/dist-client/entries/auth/signup.js.map +1 -1
  54. package/dist-client/entries/auth/unlock-user.d.ts +1 -1
  55. package/dist-client/entries/auth/unlock-user.js +1 -1
  56. package/dist-client/entries/auth/unlock-user.js.map +1 -1
  57. package/dist-client/entries/oauth2/oauth2-decision-page.d.ts +1 -1
  58. package/dist-client/entries/oauth2/oauth2-decision-page.js +1 -1
  59. package/dist-client/entries/oauth2/oauth2-decision-page.js.map +1 -1
  60. package/dist-client/entries/public/home.js +2 -2
  61. package/dist-client/entries/public/home.js.map +1 -1
  62. package/dist-client/index.js +1 -1
  63. package/dist-client/index.js.map +1 -1
  64. package/dist-client/pages/application/application.js +1 -1
  65. package/dist-client/pages/application/application.js.map +1 -1
  66. package/dist-client/pages/domain/domain-management.d.ts +1 -1
  67. package/dist-client/pages/domain/domain-management.js +1 -1
  68. package/dist-client/pages/domain/domain-management.js.map +1 -1
  69. package/dist-client/pages/partner/partner-management.d.ts +3 -3
  70. package/dist-client/pages/partner/partner-management.js +3 -3
  71. package/dist-client/pages/partner/partner-management.js.map +1 -1
  72. package/dist-client/pages/profile.d.ts +1 -1
  73. package/dist-client/pages/profile.js +1 -1
  74. package/dist-client/pages/profile.js.map +1 -1
  75. package/dist-client/pages/role/role-management.d.ts +3 -3
  76. package/dist-client/pages/role/role-management.js +3 -3
  77. package/dist-client/pages/role/role-management.js.map +1 -1
  78. package/dist-client/pages/user/user-management.d.ts +9 -5
  79. package/dist-client/pages/user/user-management.js +10 -11
  80. package/dist-client/pages/user/user-management.js.map +1 -1
  81. package/dist-client/tsconfig.tsbuildinfo +1 -1
  82. package/dist-server/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +12 -12
  84. package/translations/en.json +6 -2
  85. package/translations/ja.json +6 -2
  86. package/translations/ko.json +6 -2
  87. package/translations/ms.json +6 -2
  88. package/translations/zh.json +6 -2
  89. package/client/auth-style-sign.ts +0 -194
  90. package/client/bootstrap.ts +0 -51
  91. package/client/components/abstract-auth-page.ts +0 -301
  92. package/client/components/abstract-password-reset.ts +0 -168
  93. package/client/components/abstract-sign.ts +0 -127
  94. package/client/components/change-password.ts +0 -153
  95. package/client/components/contact-us.ts +0 -113
  96. package/client/components/create-domain-popup.ts +0 -141
  97. package/client/components/create-role.ts +0 -123
  98. package/client/components/create-user.ts +0 -95
  99. package/client/components/credential-manager.ts +0 -64
  100. package/client/components/delete-user-popup.ts +0 -117
  101. package/client/components/domain-switch.ts +0 -127
  102. package/client/components/invite-customer.ts +0 -104
  103. package/client/components/invite-user.ts +0 -96
  104. package/client/components/my-login-history.ts +0 -101
  105. package/client/components/ownership-transfer-popup.ts +0 -110
  106. package/client/components/partner-info-card.ts +0 -89
  107. package/client/components/partner-role-editor.ts +0 -153
  108. package/client/components/profile-component.ts +0 -332
  109. package/client/components/role-edit-form.ts +0 -92
  110. package/client/components/role-privilege-editor.ts +0 -267
  111. package/client/components/role-selector.ts +0 -102
  112. package/client/components/user-role-editor.ts +0 -499
  113. package/client/constants/application.ts +0 -9
  114. package/client/constants/index.ts +0 -1
  115. package/client/entries/auth/activate.ts +0 -272
  116. package/client/entries/auth/checkin.ts +0 -190
  117. package/client/entries/auth/forgot-password.ts +0 -103
  118. package/client/entries/auth/reset-password.ts +0 -22
  119. package/client/entries/auth/result.ts +0 -193
  120. package/client/entries/auth/signin.ts +0 -18
  121. package/client/entries/auth/signup.ts +0 -109
  122. package/client/entries/auth/unlock-user.ts +0 -22
  123. package/client/entries/oauth2/oauth2-decision-error-page.ts +0 -50
  124. package/client/entries/oauth2/oauth2-decision-page.ts +0 -196
  125. package/client/entries/public/home.ts +0 -246
  126. package/client/index.ts +0 -124
  127. package/client/pages/app-binding/app-binding.ts +0 -423
  128. package/client/pages/app-binding/app-bindings.ts +0 -171
  129. package/client/pages/appliance/appliance.ts +0 -452
  130. package/client/pages/appliance/home.ts +0 -177
  131. package/client/pages/appliance/register.ts +0 -183
  132. package/client/pages/application/application.ts +0 -428
  133. package/client/pages/application/applications.ts +0 -182
  134. package/client/pages/application/register.ts +0 -211
  135. package/client/pages/attribute/attribute-set-item-list.ts +0 -237
  136. package/client/pages/attribute/attribute-set-management.ts +0 -282
  137. package/client/pages/auth-provider/auth-provider-management.ts +0 -381
  138. package/client/pages/domain/domain-management.ts +0 -410
  139. package/client/pages/partner/partner-management.ts +0 -112
  140. package/client/pages/profile.ts +0 -32
  141. package/client/pages/role/role-management.ts +0 -134
  142. package/client/pages/user/user-management.ts +0 -224
  143. package/client/route.ts +0 -67
  144. package/client/themes/auth-theme.css +0 -65
  145. package/client/utils/password-rule.ts +0 -37
  146. package/server/index.ts +0 -0
@@ -1,452 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
-
3
- import Clipboard from 'clipboard'
4
- import gql from 'graphql-tag'
5
- import { css, html } from 'lit'
6
- import { customElement, property, queryAll } from 'lit/decorators.js'
7
- import { asyncReplace } from 'lit/directives/async-replace.js'
8
- import { connect } from 'pwa-helpers/connect-mixin.js'
9
-
10
- import { client } from '@operato/graphql'
11
- import { navigate, PageView, store } from '@operato/shell'
12
- import { parseJwt, sleep } from '@operato/utils'
13
- import { i18next } from '@operato/i18n'
14
-
15
- @customElement('appliance-page')
16
- class Appliance extends connect(store)(PageView) {
17
- static styles = [
18
- css`
19
- :host {
20
- display: flex;
21
- flex-direction: column;
22
- overflow-y: auto;
23
- position: relative;
24
-
25
- background-color: var(--md-sys-color-background);
26
- padding: var(--spacing-large);
27
- }
28
-
29
- h2 {
30
- margin: var(--title-margin);
31
- font: var(--title-font);
32
- color: var(--title-text-color);
33
- }
34
-
35
- [page-description] {
36
- margin: var(--page-description-margin);
37
- font: var(--page-description-font);
38
- color: var(--page-description-color);
39
- }
40
-
41
- [icon] {
42
- position: absolute;
43
- top: 10px;
44
- right: 10px;
45
- max-width: 80px;
46
- }
47
-
48
- [icon] img {
49
- max-width: 100%;
50
- max-height: 100%;
51
- }
52
-
53
- [button-primary] {
54
- background-color: var(--button-primary-background-color);
55
- border: var(--button-border);
56
- border-radius: var(--button-border-radius);
57
- margin: var(--button-margin);
58
- padding: var(--button-primary-padding);
59
- color: var(--button-primary-color);
60
- font: var(--button-primary-font);
61
- text-transform: var(--button-text-transform);
62
-
63
- text-decoration: none;
64
- }
65
-
66
- [button-primary]:hover {
67
- background-color: var(--button-primary-active-background-color);
68
- box-shadow: var(--button-active-box-shadow);
69
- }
70
-
71
- [fieldset-container] {
72
- background-color: var(--md-sys-color-surface);
73
- margin: var(--spacing-large) 0 var(--spacing-medium) 0;
74
- padding: var(--spacing-medium);
75
- border-radius: var(--border-radius);
76
- box-shadow: var(--box-shadow);
77
-
78
- label {
79
- font: var(--label-font);
80
- color: var(--label-color, var(--md-sys-color-on-surface));
81
- text-transform: var(--label-text-transform);
82
- }
83
-
84
- input,
85
- select {
86
- border: var(--border-dim-color);
87
- border-radius: var(--border-radius);
88
- margin: var(--input-margin);
89
- padding: var(--input-padding);
90
- font: var(--input-font);
91
-
92
- flex: 1;
93
- }
94
-
95
- select:focus,
96
- input:focus,
97
- button {
98
- outline: none;
99
- }
100
-
101
- form {
102
- max-width: var(--content-container-max-width);
103
- }
104
- }
105
-
106
- [fieldset-container] fieldset {
107
- margin: 0;
108
- margin-top: -15px;
109
- }
110
-
111
- fieldset {
112
- border-radius: var(--border-radius);
113
- border: var(--border-dim-color);
114
- margin: var(--fieldset-margin);
115
- padding: var(--fieldset-padding);
116
- }
117
-
118
- legend {
119
- padding: var(--legend-padding);
120
- font-weight: bold;
121
- color: var(--legend-color);
122
- }
123
-
124
- [field-2column] {
125
- display: grid;
126
- grid-template-columns: 1fr 1fr;
127
- grid-gap: 15px;
128
- }
129
-
130
- [field] {
131
- display: flex;
132
- flex-direction: column;
133
- position: relative;
134
- }
135
-
136
- [grid-span] {
137
- grid-column: span 2;
138
- }
139
-
140
- button {
141
- display: flex;
142
- align-items: center;
143
- gap: var(--spacing-small);
144
- }
145
-
146
- button,
147
- input[type='submit'],
148
- [button-in-field] {
149
- background-color: var(--button-background-color);
150
- border: var(--button-border);
151
- border-radius: var(--button-border-radius);
152
- padding: var(--button-padding);
153
- color: var(--button-color);
154
- font: var(--button-font);
155
- text-transform: var(--button-text-transform);
156
-
157
- margin: var(--spacing-medium) 0 var(--spacing-medium) var(--spacing-medium);
158
- float: right;
159
- text-decoration: none;
160
- }
161
-
162
- button:hover,
163
- input[type='submit']:hover {
164
- border: var(--button-activ-border);
165
- box-shadow: var(--button-active-box-shadow);
166
- }
167
-
168
- [button-in-field] {
169
- border-radius: 0 var(--button-border-radius) var(--button-border-radius) 0;
170
- position: absolute;
171
- top: 12px;
172
- right: 0;
173
- max-height: 36px;
174
- }
175
-
176
- [input-hint] {
177
- font: var(--input-hint-font);
178
- color: var(--input-hint-color);
179
- }
180
-
181
- @media screen and (max-width: 480px) {
182
- [field] {
183
- grid-column: span 2;
184
- }
185
- }
186
- `
187
- ]
188
-
189
- @property({ type: Object }) appliance: any
190
- @property({ type: String }) accessToken?: string
191
- @property({ type: Object }) _accessTokenInfo: any
192
-
193
- @queryAll('[clipboard-copy]') copybuttons
194
-
195
- private clipboard?: Clipboard
196
-
197
- get context() {
198
- return {
199
- title: {
200
- icon: 'devices',
201
- text: this.appliance.name
202
- }
203
- }
204
- }
205
-
206
- render() {
207
- var appliance = this.appliance || {}
208
- var accessTokenExp = this._accessTokenInfo?.exp
209
-
210
- return html`
211
- <div>
212
- <h2><md-icon>devices</md-icon>&nbsp;${appliance.name}</h2>
213
- <p page-description>${appliance.description}</p>
214
- </div>
215
-
216
- <form>
217
- <div fieldset-container>
218
- <fieldset>
219
- <legend>${i18next.t('text.appliance')}</legend>
220
- <div field-2column>
221
- <div field grid-span>
222
- <label for="name">${i18next.t('field.name')}</label>
223
- <input id="name" type="text" name="name" .value=${appliance.name} />
224
- </div>
225
-
226
- <div field grid-span>
227
- <label for="description">${i18next.t('field.description')}</label>
228
- <input id="description" type="text" name="description" .value=${appliance.description} />
229
- </div>
230
-
231
- <div field>
232
- <label for="brand">${i18next.t('field.brand')}</label>
233
- <input id="brand" type="text" name="brand" .value=${appliance.brand} />
234
- </div>
235
-
236
- <div field>
237
- <label for="serial-no">${i18next.t('field.serial-no')}</label>
238
- <input id="serial-no" type="text" name="serialNo" .value=${appliance.serialNo} />
239
- </div>
240
-
241
- <div field>
242
- <label for="model">${i18next.t('field.model')}</label>
243
- <input id="model" type="text" name="model" .value=${appliance.model} />
244
- </div>
245
-
246
- <div field>
247
- <label for="netmask">${i18next.t('field.netmask')}</label>
248
- <input id="netmask" type="text" name="netmask" .value=${appliance.netmask} />
249
- </div>
250
- </div>
251
- </fieldset>
252
- </div>
253
-
254
- <div fieldset-container>
255
- <fieldset>
256
- <legend>${i18next.t('text.appliance credential')}</legend>
257
- <div field-2column>
258
- <div field grid-span>
259
- <label for="access-token">${i18next.t('label.access token')}</label>
260
- <input id="access-token" type="text" .value=${appliance.accessToken} readonly />
261
- <button button-in-field clipboard-copy @click=${e => e.preventDefault()}>
262
- ${i18next.t('button.copy')}
263
- </button>
264
- ${accessTokenExp
265
- ? html`<div input-hint>
266
- ${i18next.t('text.token expiry time')} ${new Date(accessTokenExp * 1000).toLocaleString()} :
267
- ${asyncReplace(this.expTimer(accessTokenExp))}
268
- </div>`
269
- : html``}
270
- </div>
271
- </div>
272
- </fieldset>
273
- </div>
274
-
275
- <button @click=${this.deleteAppliance.bind(this)}>${i18next.t('button.delete this appliance')}</button>
276
- <button @click=${this.generateApplianceSecret.bind(this)}>
277
- ${i18next.t('button.generate new access token')}
278
- </button>
279
- <button @click=${this.updateAppliance.bind(this)}>${i18next.t('button.update')}</button>
280
- </form>
281
- `
282
- }
283
-
284
- firstUpdated() {
285
- this.clipboard = new Clipboard(this.copybuttons, {
286
- target: (trigger => trigger.parentElement.querySelector('input')) as any
287
- })
288
- }
289
-
290
- updated(changes) {
291
- /*
292
- * If this page properties are changed, this callback will be invoked.
293
- * This callback will be called back only when this page is activated.
294
- */
295
- if (changes.has('appliance')) {
296
- const { accessToken } = this.appliance || {}
297
- this.accessToken = accessToken
298
- }
299
-
300
- if (changes.has('accessToken')) {
301
- this._accessTokenInfo = this.accessToken ? parseJwt(this.accessToken) : {}
302
- }
303
- }
304
-
305
- async pageUpdated(changes, lifecycle, before) {
306
- if (this.active) {
307
- await this.fetchAppliance()
308
- }
309
- }
310
-
311
- async fetchAppliance() {
312
- const response = await client.query({
313
- query: gql`
314
- query ($id: String!) {
315
- appliance(id: $id) {
316
- id
317
- name
318
- description
319
- serialNo
320
- brand
321
- model
322
- netmask
323
- accessToken
324
- }
325
- }
326
- `,
327
- variables: {
328
- id: this.lifecycle.resourceId
329
- }
330
- })
331
-
332
- this.appliance = response.data.appliance
333
- }
334
-
335
- async updateAppliance(e) {
336
- e.preventDefault()
337
-
338
- const form = this.renderRoot.querySelector('form') as HTMLFormElement
339
- const formData = new FormData(form)
340
-
341
- const patch = Array.from(formData.entries()).reduce((patch, [key, value]) => {
342
- patch[key] = value
343
- return patch
344
- }, {})
345
-
346
- const id = this.lifecycle.resourceId
347
-
348
- const response = await client.mutate({
349
- mutation: gql`
350
- mutation ($id: String!, $patch: AppliancePatch!) {
351
- updateAppliance(id: $id, patch: $patch) {
352
- id
353
- name
354
- description
355
- serialNo
356
- brand
357
- model
358
- netmask
359
- accessToken
360
- }
361
- }
362
- `,
363
- variables: {
364
- id,
365
- patch
366
- }
367
- })
368
-
369
- if (response.errors) {
370
- console.error('update fail')
371
- } else {
372
- this.appliance = response.data.updateAppliance
373
- console.log('update sucess')
374
- }
375
- }
376
-
377
- async deleteAppliance(e) {
378
- e.preventDefault()
379
-
380
- const id = this.lifecycle.resourceId
381
-
382
- const response = await client.mutate({
383
- mutation: gql`
384
- mutation ($id: String!) {
385
- deleteAppliance(id: $id)
386
- }
387
- `,
388
- variables: {
389
- id
390
- }
391
- })
392
-
393
- if (response.errors) {
394
- console.error('delete fail')
395
- } else {
396
- navigate('appliance-home')
397
- }
398
- }
399
-
400
- async generateApplianceSecret(e) {
401
- e.preventDefault()
402
-
403
- const id = this.lifecycle.resourceId
404
-
405
- const response = await client.mutate({
406
- mutation: gql`
407
- mutation ($id: String!) {
408
- generateApplianceSecret(id: $id) {
409
- id
410
- name
411
- description
412
- serialNo
413
- brand
414
- model
415
- netmask
416
- accessToken
417
- }
418
- }
419
- `,
420
- variables: {
421
- id
422
- }
423
- })
424
-
425
- if (response.errors) {
426
- console.error('generate-appliance-secret fail')
427
- } else {
428
- this.appliance = response.data.generateApplianceSecret
429
- console.log('generate-appliance-secret sucess')
430
- }
431
- }
432
-
433
- async *expTimer(exp) {
434
- const DAY = 24 * 60 * 60
435
- const HOUR = 60 * 60
436
- const MIN = 60
437
-
438
- while (this.active) {
439
- var remain = Math.floor(Number(exp) - Date.now() / 1000)
440
- const days = Math.floor(remain / DAY)
441
- remain -= days * DAY
442
- const hours = Math.floor(remain / HOUR)
443
- remain -= hours * HOUR
444
- const mins = Math.floor(remain / MIN)
445
- const secs = remain - mins * MIN
446
-
447
- yield i18next.t('text.remaining time', { days, hours, mins, secs })
448
-
449
- await sleep(1000)
450
- }
451
- }
452
- }
@@ -1,177 +0,0 @@
1
- import '@material/web/button/elevated-button.js'
2
- import '@material/web/button/outlined-button.js'
3
-
4
- import gql from 'graphql-tag'
5
- import { css, html } from 'lit'
6
- import { customElement, property } from 'lit/decorators.js'
7
- import { connect } from 'pwa-helpers/connect-mixin.js'
8
-
9
- import { client } from '@operato/graphql'
10
- import { navigate, PageView, store } from '@operato/shell'
11
-
12
- @customElement('appliance-home')
13
- class Appliances extends connect(store)(PageView) {
14
- static styles = [
15
- css`
16
- :host {
17
- background-color: var(--md-sys-color-background);
18
- padding: var(--spacing-large);
19
-
20
- overflow: auto;
21
- }
22
-
23
- md-elevated-button {
24
- text-transform: capitalize;
25
- }
26
-
27
- md-outlined-button {
28
- float: right;
29
- margin-top: var(--spacing-medium);
30
- text-transform: capitalize;
31
- }
32
-
33
- h2 {
34
- margin: var(--title-margin);
35
- font: var(--title-font);
36
- color: var(--title-text-color);
37
- }
38
-
39
- [page-description] {
40
- margin: var(--page-description-margin);
41
- font: var(--page-description-font);
42
- color: var(--page-description-color);
43
- }
44
-
45
- table {
46
- width: 100%;
47
- margin: var(--spacing-large) 0;
48
- border-collapse: collapse;
49
- }
50
-
51
- tr {
52
- background-color: var(--tr-background-color);
53
- }
54
-
55
- tr:nth-child(odd) {
56
- background-color: var(--tr-background-odd-color);
57
- }
58
-
59
- tr:hover {
60
- background-color: var(--tr-background-hover-color);
61
- }
62
-
63
- th {
64
- border-top: var(--th-border-top);
65
- border-bottom: var(--td-border-bottom);
66
- padding: var(--th-padding);
67
-
68
- font: var(--th-font);
69
- color: var(--th-color);
70
- text-transform: var(--th-text-transform);
71
- text-align: left;
72
- }
73
-
74
- td {
75
- padding: var(--td-padding);
76
- border-bottom: var(--td-border-bottom);
77
- font: var(--td-font);
78
- color: var(--td-color);
79
- }
80
-
81
- td a {
82
- color: var(--md-sys-color-primary);
83
- font: bold 16px var(--theme-font);
84
-
85
- display: block;
86
- text-decoration: none;
87
- }
88
-
89
- .text-align-center {
90
- text-align: center;
91
- }
92
-
93
- .text-align-right {
94
- text-align: right;
95
- }
96
-
97
- @media screen and (max-width: 480px) {
98
- :host {
99
- padding: var(--spacing-medium);
100
- }
101
- }
102
- `
103
- ]
104
-
105
- @property({ type: Array }) appliances: any[] = []
106
-
107
- get context() {
108
- return {
109
- title: `appliance home`,
110
- help: 'auth/appliance'
111
- }
112
- }
113
-
114
- render() {
115
- var appliances = this.appliances || []
116
-
117
- return html`
118
- <div>
119
- <h2>Registered Appliances</h2>
120
- <p page-description>
121
- What type of appliance are you building?<br />Choose the app type that best suits the audience you’re building
122
- for. The appliance type can’t be changed after it’s created.
123
- </p>
124
- <md-elevated-button @click=${e => navigate('appliance-register')}>register new appliance</md-elevated-button>
125
- </div>
126
-
127
- <table>
128
- <tr>
129
- <th>appliance name</th>
130
- <th>API health</th>
131
- <th>Installs</th>
132
- <th>status</th>
133
- </tr>
134
- ${appliances.map(
135
- appliance => html`
136
- <tr>
137
- <td>
138
- <a href=${`appliance/${appliance.id}`}>${appliance.name}</a>
139
- ${appliance.description}
140
- </td>
141
- <td>OK</td>
142
- <td class="text-align-center">1</td>
143
- <td>draft</td>
144
- </tr>
145
- `
146
- )}
147
- </table>
148
- `
149
- }
150
-
151
- async pageUpdated() {
152
- if (this.active) {
153
- this.appliances = (await this.fetchAppliances()).items
154
- }
155
- }
156
-
157
- async fetchAppliances() {
158
- const response = await client.query({
159
- query: gql`
160
- query {
161
- appliances {
162
- items {
163
- id
164
- name
165
- description
166
- }
167
- total
168
- }
169
- }
170
- `
171
- })
172
-
173
- if (!response.errors) {
174
- return response.data.appliances
175
- }
176
- }
177
- }