@things-factory/auth-ui 9.1.13 → 10.0.0-beta.1
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.
- package/dist-client/bootstrap.js +24 -0
- package/dist-client/bootstrap.js.map +1 -1
- package/dist-client/components/domain-switch.d.ts +2 -12
- package/dist-client/components/domain-switch.js +5 -18
- package/dist-client/components/domain-switch.js.map +1 -1
- package/dist-client/components/user-role-editor.js +13 -4
- package/dist-client/components/user-role-editor.js.map +1 -1
- package/dist-client/pages/app-binding/app-binding.js +66 -111
- package/dist-client/pages/app-binding/app-binding.js.map +1 -1
- package/dist-client/pages/app-binding/app-bindings.js +38 -59
- package/dist-client/pages/app-binding/app-bindings.js.map +1 -1
- package/dist-client/pages/appliance/appliance.js +72 -120
- package/dist-client/pages/appliance/appliance.js.map +1 -1
- package/dist-client/pages/appliance/home.js +39 -61
- package/dist-client/pages/appliance/home.js.map +1 -1
- package/dist-client/pages/appliance/register.js +33 -52
- package/dist-client/pages/appliance/register.js.map +1 -1
- package/dist-client/pages/application/application.js +67 -107
- package/dist-client/pages/application/application.js.map +1 -1
- package/dist-client/pages/application/applications.js +38 -59
- package/dist-client/pages/application/applications.js.map +1 -1
- package/dist-client/pages/application/register.js +41 -64
- package/dist-client/pages/application/register.js.map +1 -1
- package/dist-client/pages/attribute/attribute-set-management.d.ts +0 -6
- package/dist-client/pages/attribute/attribute-set-management.js +46 -87
- package/dist-client/pages/attribute/attribute-set-management.js.map +1 -1
- package/dist-client/pages/auth-provider/auth-provider-management.d.ts +0 -6
- package/dist-client/pages/auth-provider/auth-provider-management.js +67 -127
- package/dist-client/pages/auth-provider/auth-provider-management.js.map +1 -1
- package/dist-client/pages/domain/domain-management.d.ts +0 -6
- package/dist-client/pages/domain/domain-management.js +64 -119
- package/dist-client/pages/domain/domain-management.js.map +1 -1
- package/dist-client/pages/domain-link/domain-link-management.d.ts +1 -7
- package/dist-client/pages/domain-link/domain-link-management.js +67 -125
- package/dist-client/pages/domain-link/domain-link-management.js.map +1 -1
- package/dist-client/pages/env-var/env-var-list-page.d.ts +0 -6
- package/dist-client/pages/env-var/env-var-list-page.js +44 -82
- package/dist-client/pages/env-var/env-var-list-page.js.map +1 -1
- package/dist-client/pages/partner/partner-management.js +17 -28
- package/dist-client/pages/partner/partner-management.js.map +1 -1
- package/dist-client/pages/role/role-management.js +20 -33
- package/dist-client/pages/role/role-management.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/views/auth-page.html +1 -1
- package/views/oauth2-page.html +1 -1
|
@@ -4,49 +4,42 @@ import Clipboard from 'clipboard';
|
|
|
4
4
|
import gql from 'graphql-tag';
|
|
5
5
|
import { css, html } from 'lit';
|
|
6
6
|
import { customElement, property, queryAll } from 'lit/decorators.js';
|
|
7
|
-
import { connect } from 'pwa-helpers/connect-mixin.js';
|
|
8
7
|
import { APPLICATION_TYPES } from '../../constants/application.js';
|
|
9
8
|
import { client } from '@operato/graphql';
|
|
10
|
-
import { navigate, PageView
|
|
11
|
-
let Application = class Application extends
|
|
9
|
+
import { navigate, PageView } from '@operato/shell';
|
|
10
|
+
let Application = class Application extends PageView {
|
|
12
11
|
static { this.styles = [
|
|
13
12
|
css `
|
|
14
|
-
:host {
|
|
15
|
-
display: flex;
|
|
13
|
+
:host { display: flex;
|
|
16
14
|
flex-direction: column;
|
|
17
15
|
overflow-y: auto;
|
|
18
16
|
position: relative;
|
|
19
17
|
|
|
20
18
|
background-color: var(--md-sys-color-background);
|
|
21
19
|
padding: var(--spacing-large);
|
|
22
|
-
|
|
20
|
+
}
|
|
23
21
|
|
|
24
|
-
h2 {
|
|
25
|
-
margin: var(--title-margin);
|
|
22
|
+
h2 { margin: var(--title-margin);
|
|
26
23
|
font: var(--title-font);
|
|
27
24
|
color: var(--title-text-color);
|
|
28
|
-
|
|
25
|
+
}
|
|
29
26
|
|
|
30
|
-
[page-description] {
|
|
31
|
-
margin: var(--page-description-margin);
|
|
27
|
+
[page-description] { margin: var(--page-description-margin);
|
|
32
28
|
font: var(--page-description-font);
|
|
33
29
|
color: var(--page-description-color);
|
|
34
|
-
|
|
30
|
+
}
|
|
35
31
|
|
|
36
|
-
[icon] {
|
|
37
|
-
position: absolute;
|
|
32
|
+
[icon] { position: absolute;
|
|
38
33
|
top: 10px;
|
|
39
34
|
right: 10px;
|
|
40
35
|
max-width: 80px;
|
|
41
|
-
|
|
36
|
+
}
|
|
42
37
|
|
|
43
|
-
[icon] img {
|
|
44
|
-
max-width: 100%;
|
|
38
|
+
[icon] img { max-width: 100%;
|
|
45
39
|
max-height: 100%;
|
|
46
|
-
|
|
40
|
+
}
|
|
47
41
|
|
|
48
|
-
[button-primary] {
|
|
49
|
-
background-color: var(--button-primary-background-color);
|
|
42
|
+
[button-primary] { background-color: var(--button-primary-background-color);
|
|
50
43
|
border: var(--button-border);
|
|
51
44
|
border-radius: var(--button-border-radius);
|
|
52
45
|
margin: var(--button-margin);
|
|
@@ -56,92 +49,78 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
56
49
|
text-transform: var(--button-text-transform);
|
|
57
50
|
|
|
58
51
|
text-decoration: none;
|
|
59
|
-
|
|
52
|
+
}
|
|
60
53
|
|
|
61
|
-
[button-primary]:hover {
|
|
62
|
-
background-color: var(--button-primary-active-background-color);
|
|
54
|
+
[button-primary]:hover { background-color: var(--button-primary-active-background-color);
|
|
63
55
|
box-shadow: var(--button-active-box-shadow);
|
|
64
|
-
|
|
56
|
+
}
|
|
65
57
|
|
|
66
|
-
[fieldset-container] {
|
|
67
|
-
background-color: var(--md-sys-color-surface);
|
|
58
|
+
[fieldset-container] { background-color: var(--md-sys-color-surface);
|
|
68
59
|
margin: var(--spacing-large) 0 var(--spacing-medium) 0;
|
|
69
60
|
padding: var(--spacing-medium);
|
|
70
61
|
border-radius: var(--border-radius);
|
|
71
62
|
box-shadow: var(--box-shadow);
|
|
72
63
|
|
|
73
|
-
label {
|
|
74
|
-
font: var(--label-font);
|
|
64
|
+
label { font: var(--label-font);
|
|
75
65
|
color: var(--label-color, var(--md-sys-color-on-surface));
|
|
76
66
|
text-transform: var(--label-text-transform);
|
|
77
|
-
|
|
67
|
+
}
|
|
78
68
|
|
|
79
69
|
input,
|
|
80
|
-
select {
|
|
81
|
-
border: var(--border-dim-color);
|
|
70
|
+
select { border: var(--border-dim-color);
|
|
82
71
|
border-radius: var(--border-radius);
|
|
83
72
|
margin: var(--input-margin);
|
|
84
73
|
padding: var(--input-padding);
|
|
85
74
|
font: var(--input-font);
|
|
86
75
|
|
|
87
76
|
flex: 1;
|
|
88
|
-
|
|
77
|
+
}
|
|
89
78
|
|
|
90
79
|
select:focus,
|
|
91
80
|
input:focus,
|
|
92
|
-
button {
|
|
93
|
-
|
|
94
|
-
}
|
|
81
|
+
button { outline: none;
|
|
82
|
+
}
|
|
95
83
|
|
|
96
|
-
form {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
84
|
+
form { max-width: var(--content-container-max-width);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
100
87
|
|
|
101
|
-
[fieldset-container] fieldset {
|
|
102
|
-
margin: 0;
|
|
88
|
+
[fieldset-container] fieldset { margin: 0;
|
|
103
89
|
margin-top: -15px;
|
|
104
|
-
|
|
90
|
+
}
|
|
105
91
|
|
|
106
|
-
fieldset {
|
|
107
|
-
border-radius: var(--border-radius);
|
|
92
|
+
fieldset { border-radius: var(--border-radius);
|
|
108
93
|
border: var(--border-dim-color);
|
|
109
94
|
margin: var(--fieldset-margin);
|
|
110
95
|
padding: var(--fieldset-padding);
|
|
111
|
-
|
|
96
|
+
}
|
|
112
97
|
|
|
113
|
-
legend {
|
|
114
|
-
padding: var(--legend-padding);
|
|
98
|
+
legend { padding: var(--legend-padding);
|
|
115
99
|
font-weight: bold;
|
|
116
100
|
color: var(--legend-color);
|
|
117
|
-
|
|
101
|
+
}
|
|
118
102
|
|
|
119
|
-
[field-2column] {
|
|
120
|
-
display: grid;
|
|
103
|
+
[field-2column] { display: grid;
|
|
121
104
|
grid-template-columns: 1fr 1fr;
|
|
122
105
|
grid-gap: 15px;
|
|
123
|
-
|
|
106
|
+
}
|
|
124
107
|
|
|
125
|
-
[field] {
|
|
126
|
-
display: flex;
|
|
108
|
+
[field] { display: flex;
|
|
127
109
|
flex-direction: column;
|
|
128
110
|
position: relative;
|
|
129
|
-
|
|
111
|
+
}
|
|
130
112
|
|
|
131
|
-
[grid-span] {
|
|
132
|
-
|
|
133
|
-
}
|
|
113
|
+
[grid-span] { grid-column: span 2;
|
|
114
|
+
}
|
|
134
115
|
|
|
135
|
-
button {
|
|
136
|
-
display: flex;
|
|
116
|
+
button { display: flex;
|
|
137
117
|
align-items: center;
|
|
138
118
|
gap: var(--spacing-small);
|
|
139
|
-
|
|
119
|
+
}
|
|
140
120
|
|
|
141
121
|
button,
|
|
142
122
|
input[type='submit'],
|
|
143
|
-
[button-in-field] {
|
|
144
|
-
background-color: var(--button-background-color);
|
|
123
|
+
[button-in-field] { background-color: var(--button-background-color);
|
|
145
124
|
border: var(--button-border);
|
|
146
125
|
border-radius: var(--button-border-radius);
|
|
147
126
|
padding: var(--button-padding);
|
|
@@ -152,38 +131,31 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
152
131
|
margin: var(--spacing-medium) 0 var(--spacing-medium) var(--spacing-medium);
|
|
153
132
|
float: right;
|
|
154
133
|
text-decoration: none;
|
|
155
|
-
|
|
134
|
+
}
|
|
156
135
|
|
|
157
136
|
button:hover,
|
|
158
|
-
input[type='submit']:hover {
|
|
159
|
-
border: var(--button-activ-border);
|
|
137
|
+
input[type='submit']:hover { border: var(--button-activ-border);
|
|
160
138
|
box-shadow: var(--button-active-box-shadow);
|
|
161
|
-
|
|
139
|
+
}
|
|
162
140
|
|
|
163
|
-
[button-in-field] {
|
|
164
|
-
border-radius: 0 var(--button-border-radius) var(--button-border-radius) 0;
|
|
141
|
+
[button-in-field] { border-radius: 0 var(--button-border-radius) var(--button-border-radius) 0;
|
|
165
142
|
position: absolute;
|
|
166
143
|
top: 12px;
|
|
167
144
|
right: 0;
|
|
168
145
|
max-height: 36px;
|
|
169
|
-
|
|
146
|
+
}
|
|
170
147
|
|
|
171
|
-
[input-hint] {
|
|
172
|
-
font: var(--input-hint-font);
|
|
148
|
+
[input-hint] { font: var(--input-hint-font);
|
|
173
149
|
color: var(--input-hint-color);
|
|
174
|
-
|
|
150
|
+
}
|
|
175
151
|
|
|
176
|
-
@media screen and (max-width: 480px) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
}
|
|
152
|
+
@media screen and (max-width: 480px) { [field] { grid-column: span 2;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
181
155
|
`
|
|
182
156
|
]; }
|
|
183
157
|
get context() {
|
|
184
|
-
return {
|
|
185
|
-
title: {
|
|
186
|
-
icon: 'apps',
|
|
158
|
+
return { title: { icon: 'apps',
|
|
187
159
|
text: this.application.name
|
|
188
160
|
}
|
|
189
161
|
};
|
|
@@ -300,8 +272,7 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
300
272
|
`;
|
|
301
273
|
}
|
|
302
274
|
firstUpdated() {
|
|
303
|
-
this.clipboard = new Clipboard(this.copybuttons, {
|
|
304
|
-
target: (trigger => trigger.parentElement.querySelector('input'))
|
|
275
|
+
this.clipboard = new Clipboard(this.copybuttons, { target: (trigger => trigger.parentElement.querySelector('input'))
|
|
305
276
|
});
|
|
306
277
|
}
|
|
307
278
|
async pageUpdated(changes, lifecycle, before) {
|
|
@@ -310,11 +281,8 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
310
281
|
}
|
|
311
282
|
}
|
|
312
283
|
async fetchApplication() {
|
|
313
|
-
const response = await client.query({
|
|
314
|
-
|
|
315
|
-
query ($id: String!) {
|
|
316
|
-
application(id: $id) {
|
|
317
|
-
id
|
|
284
|
+
const response = await client.query({ query: gql `
|
|
285
|
+
query ($id: String!) { application(id: $id) { id
|
|
318
286
|
name
|
|
319
287
|
description
|
|
320
288
|
email
|
|
@@ -328,11 +296,10 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
328
296
|
appKey
|
|
329
297
|
appSecret
|
|
330
298
|
type
|
|
331
|
-
|
|
332
|
-
|
|
299
|
+
}
|
|
300
|
+
}
|
|
333
301
|
`,
|
|
334
|
-
variables: {
|
|
335
|
-
id: this.lifecycle.resourceId
|
|
302
|
+
variables: { id: this.lifecycle.resourceId
|
|
336
303
|
}
|
|
337
304
|
});
|
|
338
305
|
this.application = response.data.application;
|
|
@@ -346,11 +313,8 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
346
313
|
return patch;
|
|
347
314
|
}, {});
|
|
348
315
|
const id = this.lifecycle.resourceId;
|
|
349
|
-
const response = await client.mutate({
|
|
350
|
-
|
|
351
|
-
mutation ($id: String!, $patch: ApplicationPatch!) {
|
|
352
|
-
updateApplication(id: $id, patch: $patch) {
|
|
353
|
-
id
|
|
316
|
+
const response = await client.mutate({ mutation: gql `
|
|
317
|
+
mutation ($id: String!, $patch: ApplicationPatch!) { updateApplication(id: $id, patch: $patch) { id
|
|
354
318
|
name
|
|
355
319
|
description
|
|
356
320
|
email
|
|
@@ -361,11 +325,10 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
361
325
|
appKey
|
|
362
326
|
appSecret
|
|
363
327
|
type
|
|
364
|
-
|
|
365
|
-
|
|
328
|
+
}
|
|
329
|
+
}
|
|
366
330
|
`,
|
|
367
|
-
variables: {
|
|
368
|
-
id,
|
|
331
|
+
variables: { id,
|
|
369
332
|
patch
|
|
370
333
|
}
|
|
371
334
|
});
|
|
@@ -380,14 +343,11 @@ let Application = class Application extends connect(store)(PageView) {
|
|
|
380
343
|
async deleteApplication(e) {
|
|
381
344
|
e.preventDefault();
|
|
382
345
|
const id = this.lifecycle.resourceId;
|
|
383
|
-
const response = await client.mutate({
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
deleteApplication(id: $id)
|
|
387
|
-
}
|
|
346
|
+
const response = await client.mutate({ mutation: gql `
|
|
347
|
+
mutation ($id: String!) { deleteApplication(id: $id)
|
|
348
|
+
}
|
|
388
349
|
`,
|
|
389
|
-
variables: {
|
|
390
|
-
id
|
|
350
|
+
variables: { id
|
|
391
351
|
}
|
|
392
352
|
});
|
|
393
353
|
const result = response.data.deleteApplication;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../../client/pages/application/application.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, queryAll } from 'lit/decorators.js'\nimport { connect } from 'pwa-helpers/connect-mixin.js'\n\nimport { APPLICATION_TYPES } from '../../constants/application.js'\n\nimport { client } from '@operato/graphql'\nimport { navigate, PageView, store } from '@operato/shell'\n\n@customElement('application-page')\nclass Application extends connect(store)(PageView) {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n position: relative;\n\n background-color: var(--md-sys-color-background);\n padding: var(--spacing-large);\n }\n\n h2 {\n margin: var(--title-margin);\n font: var(--title-font);\n color: var(--title-text-color);\n }\n\n [page-description] {\n margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n }\n\n [icon] {\n position: absolute;\n top: 10px;\n right: 10px;\n max-width: 80px;\n }\n\n [icon] img {\n max-width: 100%;\n max-height: 100%;\n }\n\n [button-primary] {\n background-color: var(--button-primary-background-color);\n border: var(--button-border);\n border-radius: var(--button-border-radius);\n margin: var(--button-margin);\n padding: var(--button-primary-padding);\n color: var(--button-primary-color);\n font: var(--button-primary-font);\n text-transform: var(--button-text-transform);\n\n text-decoration: none;\n }\n\n [button-primary]:hover {\n background-color: var(--button-primary-active-background-color);\n box-shadow: var(--button-active-box-shadow);\n }\n\n [fieldset-container] {\n 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 {\n font: var(--label-font);\n color: var(--label-color, var(--md-sys-color-on-surface));\n text-transform: var(--label-text-transform);\n }\n\n input,\n select {\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\n select:focus,\n input:focus,\n button {\n outline: none;\n }\n\n form {\n max-width: var(--content-container-max-width);\n }\n }\n\n [fieldset-container] fieldset {\n margin: 0;\n margin-top: -15px;\n }\n\n fieldset {\n 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 {\n padding: var(--legend-padding);\n font-weight: bold;\n color: var(--legend-color);\n }\n\n [field-2column] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: 15px;\n }\n\n [field] {\n display: flex;\n flex-direction: column;\n position: relative;\n }\n\n [grid-span] {\n grid-column: span 2;\n }\n\n button {\n display: flex;\n align-items: center;\n gap: var(--spacing-small);\n }\n\n button,\n input[type='submit'],\n [button-in-field] {\n 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,\n input[type='submit']:hover {\n border: var(--button-activ-border);\n box-shadow: var(--button-active-box-shadow);\n }\n\n [button-in-field] {\n 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] {\n font: var(--input-hint-font);\n color: var(--input-hint-color);\n }\n\n @media screen and (max-width: 480px) {\n [field] {\n grid-column: span 2;\n }\n }\n `\n ]\n\n @property({ type: Object }) application: any\n @queryAll('[clipboard-copy]') copybuttons\n private clipboard?: Clipboard\n\n get context() {\n return {\n title: {\n icon: 'apps',\n text: this.application.name\n }\n }\n }\n\n render() {\n var app = this.application || {}\n\n return html`\n <div>\n <h2><md-icon>apps</md-icon> ${app.name}</h2>\n <p page-description>${app.description}</p>\n </div>\n\n <div icon>\n <img src=${app.icon} />\n </div>\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=\"name\">app name</label>\n <input id=\"name\" type=\"text\" name=\"name\" .value=${app.name} />\n </div>\n\n <div field grid-span>\n <label for=\"description\">description</label>\n <input id=\"description\" type=\"text\" name=\"description\" .value=${app.description} />\n </div>\n\n <div field grid-span>\n <label for=\"email\">contact email</label>\n <input id=\"email\" type=\"text\" name=\"email\" .value=${app.email} />\n </div>\n\n <div field grid-span>\n <label for=\"type-selector\">type</label>\n <select id=\"type-selector\" name=\"type\">\n ${APPLICATION_TYPES.map(\n type =>\n html`<option value=\"${app.type}\" ?selected=\"${type === app.type ? true : false}\">${type}</option>`\n )}\n </select>\n </div>\n\n <div field grid-span>\n <label for=\"url\">application URL</label>\n <input id=\"url\" type=\"text\" name=\"url\" .value=${app.url} />\n </div>\n\n <div field grid-span>\n <label for=\"icon\">icon</label>\n <input id=\"icon\" type=\"text\" name=\"icon\" .value=${app.icon} />\n </div>\n\n <div field grid-span>\n <label for=\"redirect-url\">redirect URL</label>\n <input id=\"redirect-url\" type=\"text\" name=\"redirectUrl\" .value=${app.redirectUrl} />\n </div>\n\n <div field grid-span>\n <label for=\"webhook\">webhook</label>\n <input id=\"webhook\" type=\"text\" name=\"webhook\" .value=${app.webhook} />\n </div>\n\n <div field grid-span>\n <label for=\"available-scopes\">available-scopes</label>\n <input id=\"available-scopes\" type=\"text\" .value=${app.availableScopes} readonly />\n </div>\n\n <div field grid-span>\n <label for=\"auth-url\">auth URL</label>\n <input id=\"auth-url\" type=\"text\" .value=${app.authUrl} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n The endpoint for authorization server. This is used to get the authorization code.\n </div>\n\n <div field grid-span>\n <label for=\"access-token-url\">access token URL</label>\n <input id=\"access-token-url\" type=\"text\" .value=${app.accessTokenUrl} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n The endpoint for authentication server. This is used to exchange the authorization code for an access\n token.\n </div>\n </div>\n </fieldset>\n </div>\n\n <div fieldset-container>\n <fieldset>\n <legend>credentials</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"app-key\">appKey</label>\n <input id=\"app-key\" type=\"text\" .value=${app.appKey} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n </div>\n\n <div field grid-span>\n <label for=\"app-secret\">appSecret</label>\n <input id=\"app-secret\" type=\"text\" .value=${app.appSecret} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n </div>\n </div>\n </fieldset>\n </div>\n\n <div class=\"button-container\">\n <button danger @click=${this.deleteApplication.bind(this)}>\n <md-icon>delete_forever</md-icon>delete this app\n </button>\n <button @click=${this.updateApplication.bind(this)}><md-icon>save</md-icon>update</button>\n <button><md-icon>passkey</md-icon>generate new secret</button>\n </div>\n </form>\n `\n }\n\n firstUpdated() {\n this.clipboard = new Clipboard(this.copybuttons, {\n target: (trigger => trigger.parentElement.querySelector('input')) as any\n })\n }\n\n async pageUpdated(changes, lifecycle, before) {\n if (this.active) {\n await this.fetchApplication()\n }\n }\n\n async fetchApplication() {\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n application(id: $id) {\n id\n name\n description\n email\n url\n icon\n redirectUrl\n authUrl\n accessTokenUrl\n webhook\n availableScopes\n appKey\n appSecret\n type\n }\n }\n `,\n variables: {\n id: this.lifecycle.resourceId\n }\n })\n\n this.application = response.data.application\n }\n\n async updateApplication(e) {\n e.preventDefault()\n\n const form = this.renderRoot.querySelector('form') as HTMLFormElement\n const formData = new FormData(form)\n\n const patch = Array.from(formData.entries()).reduce((patch, [key, value]) => {\n patch[key] = value\n return patch\n }, {})\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: ApplicationPatch!) {\n updateApplication(id: $id, patch: $patch) {\n id\n name\n description\n email\n url\n icon\n redirectUrl\n webhook\n appKey\n appSecret\n type\n }\n }\n `,\n variables: {\n id,\n patch\n }\n })\n\n if (response.errors) {\n console.error('update fail')\n } else {\n this.application = { ...this.application, ...response.data.updateApplication }\n console.log('update sucess')\n }\n }\n\n async deleteApplication(e) {\n e.preventDefault()\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteApplication(id: $id)\n }\n `,\n variables: {\n id\n }\n })\n\n const result = response.data.deleteApplication\n if (result) {\n console.log('delete sucess')\n navigate('applications')\n } else {\n console.error('delete fail')\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../../client/pages/application/application.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, queryAll } from 'lit/decorators.js'\nimport { APPLICATION_TYPES } from '../../constants/application.js'\n\nimport { client } from '@operato/graphql'\nimport { navigate, PageView } from '@operato/shell'\n\n@customElement('application-page')\nclass Application extends PageView { static styles = [\n css`\n :host { display: flex;\n flex-direction: column;\n overflow-y: auto;\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 max-width: 80px;\n }\n\n [icon] img { max-width: 100%;\n max-height: 100%;\n }\n\n [button-primary] { background-color: var(--button-primary-background-color);\n border: var(--button-border);\n border-radius: var(--button-border-radius);\n margin: var(--button-margin);\n padding: var(--button-primary-padding);\n color: var(--button-primary-color);\n font: var(--button-primary-font);\n text-transform: var(--button-text-transform);\n\n text-decoration: none;\n }\n\n [button-primary]:hover { background-color: var(--button-primary-active-background-color);\n box-shadow: var(--button-active-box-shadow);\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\n input,\n select { 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\n select:focus,\n input:focus,\n button { outline: none;\n }\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 { display: flex;\n align-items: center;\n gap: var(--spacing-small);\n }\n\n button,\n input[type='submit'],\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,\n input[type='submit']: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 }) application: any\n @queryAll('[clipboard-copy]') copybuttons\n private clipboard?: Clipboard\n\n get context() { return { title: { icon: 'apps',\n text: this.application.name\n }\n }\n }\n\n render() { var app = this.application || {}\n\n return html`\n <div>\n <h2><md-icon>apps</md-icon> ${app.name}</h2>\n <p page-description>${app.description}</p>\n </div>\n\n <div icon>\n <img src=${app.icon} />\n </div>\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=\"name\">app name</label>\n <input id=\"name\" type=\"text\" name=\"name\" .value=${app.name} />\n </div>\n\n <div field grid-span>\n <label for=\"description\">description</label>\n <input id=\"description\" type=\"text\" name=\"description\" .value=${app.description} />\n </div>\n\n <div field grid-span>\n <label for=\"email\">contact email</label>\n <input id=\"email\" type=\"text\" name=\"email\" .value=${app.email} />\n </div>\n\n <div field grid-span>\n <label for=\"type-selector\">type</label>\n <select id=\"type-selector\" name=\"type\">\n ${APPLICATION_TYPES.map(\n type =>\n html`<option value=\"${app.type}\" ?selected=\"${type === app.type ? true : false}\">${type}</option>`\n )}\n </select>\n </div>\n\n <div field grid-span>\n <label for=\"url\">application URL</label>\n <input id=\"url\" type=\"text\" name=\"url\" .value=${app.url} />\n </div>\n\n <div field grid-span>\n <label for=\"icon\">icon</label>\n <input id=\"icon\" type=\"text\" name=\"icon\" .value=${app.icon} />\n </div>\n\n <div field grid-span>\n <label for=\"redirect-url\">redirect URL</label>\n <input id=\"redirect-url\" type=\"text\" name=\"redirectUrl\" .value=${app.redirectUrl} />\n </div>\n\n <div field grid-span>\n <label for=\"webhook\">webhook</label>\n <input id=\"webhook\" type=\"text\" name=\"webhook\" .value=${app.webhook} />\n </div>\n\n <div field grid-span>\n <label for=\"available-scopes\">available-scopes</label>\n <input id=\"available-scopes\" type=\"text\" .value=${app.availableScopes} readonly />\n </div>\n\n <div field grid-span>\n <label for=\"auth-url\">auth URL</label>\n <input id=\"auth-url\" type=\"text\" .value=${app.authUrl} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n The endpoint for authorization server. This is used to get the authorization code.\n </div>\n\n <div field grid-span>\n <label for=\"access-token-url\">access token URL</label>\n <input id=\"access-token-url\" type=\"text\" .value=${app.accessTokenUrl} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n The endpoint for authentication server. This is used to exchange the authorization code for an access\n token.\n </div>\n </div>\n </fieldset>\n </div>\n\n <div fieldset-container>\n <fieldset>\n <legend>credentials</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"app-key\">appKey</label>\n <input id=\"app-key\" type=\"text\" .value=${app.appKey} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n </div>\n\n <div field grid-span>\n <label for=\"app-secret\">appSecret</label>\n <input id=\"app-secret\" type=\"text\" .value=${app.appSecret} readonly />\n <button dense button-in-field clipboard-copy @click=${e => e.preventDefault()}>copy</button>\n </div>\n </div>\n </fieldset>\n </div>\n\n <div class=\"button-container\">\n <button danger @click=${this.deleteApplication.bind(this)}>\n <md-icon>delete_forever</md-icon>delete this app\n </button>\n <button @click=${this.updateApplication.bind(this)}><md-icon>save</md-icon>update</button>\n <button><md-icon>passkey</md-icon>generate new secret</button>\n </div>\n </form>\n `\n }\n\n firstUpdated() { this.clipboard = new Clipboard(this.copybuttons, { target: (trigger => trigger.parentElement.querySelector('input')) as any\n })\n }\n\n async pageUpdated(changes, lifecycle, before) { if (this.active) { await this.fetchApplication()\n }\n }\n\n async fetchApplication() { const response = await client.query({ query: gql`\n query ($id: String!) { application(id: $id) { id\n name\n description\n email\n url\n icon\n redirectUrl\n authUrl\n accessTokenUrl\n webhook\n availableScopes\n appKey\n appSecret\n type\n }\n }\n `,\n variables: { id: this.lifecycle.resourceId\n }\n })\n\n this.application = response.data.application\n }\n\n async updateApplication(e) { e.preventDefault()\n\n const form = this.renderRoot.querySelector('form') as HTMLFormElement\n const formData = new FormData(form)\n\n const patch = Array.from(formData.entries()).reduce((patch, [key, value]) => { patch[key] = value\n return patch\n }, {})\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: ApplicationPatch!) { updateApplication(id: $id, patch: $patch) { id\n name\n description\n email\n url\n icon\n redirectUrl\n webhook\n appKey\n appSecret\n type\n }\n }\n `,\n variables: { id,\n patch\n }\n })\n\n if (response.errors) { console.error('update fail')\n } else { this.application = { ...this.application, ...response.data.updateApplication }\n console.log('update sucess')\n }\n }\n\n async deleteApplication(e) { e.preventDefault()\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!) { deleteApplication(id: $id)\n }\n `,\n variables: { id\n }\n })\n\n const result = response.data.deleteApplication\n if (result) { console.log('delete sucess')\n navigate('applications')\n } else { console.error('delete fail')\n }\n }\n}\n"]}
|
|
@@ -4,65 +4,54 @@ import '@material/web/button/outlined-button.js';
|
|
|
4
4
|
import gql from 'graphql-tag';
|
|
5
5
|
import { css, html } from 'lit';
|
|
6
6
|
import { customElement, property } from 'lit/decorators.js';
|
|
7
|
-
import { connect } from 'pwa-helpers/connect-mixin.js';
|
|
8
7
|
import { client } from '@operato/graphql';
|
|
9
|
-
import { navigate, PageView
|
|
10
|
-
let Applications = class Applications extends
|
|
8
|
+
import { navigate, PageView } from '@operato/shell';
|
|
9
|
+
let Applications = class Applications extends PageView {
|
|
11
10
|
constructor() {
|
|
12
11
|
super(...arguments);
|
|
13
12
|
this.applications = [];
|
|
14
13
|
}
|
|
15
14
|
static { this.styles = [
|
|
16
15
|
css `
|
|
17
|
-
:host {
|
|
18
|
-
background-color: var(--md-sys-color-background);
|
|
16
|
+
:host { background-color: var(--md-sys-color-background);
|
|
19
17
|
padding: var(--spacing-large);
|
|
20
18
|
|
|
21
19
|
overflow: auto;
|
|
22
|
-
|
|
20
|
+
}
|
|
23
21
|
|
|
24
|
-
md-elevated-button {
|
|
25
|
-
|
|
26
|
-
}
|
|
22
|
+
md-elevated-button { text-transform: capitalize;
|
|
23
|
+
}
|
|
27
24
|
|
|
28
|
-
md-outlined-button {
|
|
29
|
-
float: right;
|
|
25
|
+
md-outlined-button { float: right;
|
|
30
26
|
margin-top: var(--spacing-medium);
|
|
31
27
|
text-transform: capitalize;
|
|
32
|
-
|
|
28
|
+
}
|
|
33
29
|
|
|
34
|
-
h2 {
|
|
35
|
-
margin: var(--title-margin);
|
|
30
|
+
h2 { margin: var(--title-margin);
|
|
36
31
|
font: var(--title-font);
|
|
37
32
|
color: var(--title-text-color);
|
|
38
|
-
|
|
33
|
+
}
|
|
39
34
|
|
|
40
|
-
[page-description] {
|
|
41
|
-
margin: var(--page-description-margin);
|
|
35
|
+
[page-description] { margin: var(--page-description-margin);
|
|
42
36
|
font: var(--page-description-font);
|
|
43
37
|
color: var(--page-description-color);
|
|
44
|
-
|
|
38
|
+
}
|
|
45
39
|
|
|
46
|
-
table {
|
|
47
|
-
margin: var(--spacing-large) 0;
|
|
40
|
+
table { margin: var(--spacing-large) 0;
|
|
48
41
|
width: 100%;
|
|
49
42
|
border-collapse: collapse;
|
|
50
|
-
|
|
43
|
+
}
|
|
51
44
|
|
|
52
|
-
tr {
|
|
53
|
-
|
|
54
|
-
}
|
|
45
|
+
tr { background-color: var(--tr-background-color);
|
|
46
|
+
}
|
|
55
47
|
|
|
56
|
-
tr:nth-child(odd) {
|
|
57
|
-
|
|
58
|
-
}
|
|
48
|
+
tr:nth-child(odd) { background-color: var(--tr-background-odd-color);
|
|
49
|
+
}
|
|
59
50
|
|
|
60
|
-
tr:hover {
|
|
61
|
-
|
|
62
|
-
}
|
|
51
|
+
tr:hover { background-color: var(--tr-background-hover-color);
|
|
52
|
+
}
|
|
63
53
|
|
|
64
|
-
th {
|
|
65
|
-
border-top: var(--th-border-top);
|
|
54
|
+
th { border-top: var(--th-border-top);
|
|
66
55
|
border-bottom: var(--td-border-bottom);
|
|
67
56
|
padding: var(--th-padding);
|
|
68
57
|
|
|
@@ -70,40 +59,34 @@ let Applications = class Applications extends connect(store)(PageView) {
|
|
|
70
59
|
color: var(--th-color);
|
|
71
60
|
text-transform: var(--th-text-transform);
|
|
72
61
|
text-align: left;
|
|
73
|
-
|
|
62
|
+
}
|
|
74
63
|
|
|
75
|
-
td {
|
|
76
|
-
padding: var(--td-padding);
|
|
64
|
+
td { padding: var(--td-padding);
|
|
77
65
|
border-bottom: var(--td-border-bottom);
|
|
78
66
|
font: var(--td-font);
|
|
79
67
|
color: var(--td-color);
|
|
80
|
-
|
|
68
|
+
}
|
|
81
69
|
|
|
82
|
-
td a {
|
|
83
|
-
font: var(--td-font);
|
|
70
|
+
td a { font: var(--td-font);
|
|
84
71
|
text-decoration: none;
|
|
85
72
|
color: var(--md-sys-color-on-surface);
|
|
86
|
-
|
|
73
|
+
}
|
|
87
74
|
|
|
88
|
-
td a strong {
|
|
89
|
-
font: bold 16px var(--theme-font);
|
|
75
|
+
td a strong { font: bold 16px var(--theme-font);
|
|
90
76
|
|
|
91
77
|
display: block;
|
|
92
78
|
text-decoration: none;
|
|
93
|
-
|
|
79
|
+
}
|
|
94
80
|
|
|
95
|
-
.text-align-center {
|
|
96
|
-
|
|
97
|
-
}
|
|
81
|
+
.text-align-center { text-align: center;
|
|
82
|
+
}
|
|
98
83
|
|
|
99
|
-
.text-align-right {
|
|
100
|
-
|
|
101
|
-
}
|
|
84
|
+
.text-align-right { text-align: right;
|
|
85
|
+
}
|
|
102
86
|
`
|
|
103
87
|
]; }
|
|
104
88
|
get context() {
|
|
105
|
-
return {
|
|
106
|
-
title: `applications`,
|
|
89
|
+
return { title: `applications`,
|
|
107
90
|
help: 'auth/application'
|
|
108
91
|
};
|
|
109
92
|
}
|
|
@@ -152,18 +135,14 @@ let Applications = class Applications extends connect(store)(PageView) {
|
|
|
152
135
|
}
|
|
153
136
|
}
|
|
154
137
|
async fetchApplications() {
|
|
155
|
-
const response = await client.query({
|
|
156
|
-
|
|
157
|
-
query {
|
|
158
|
-
applications {
|
|
159
|
-
items {
|
|
160
|
-
id
|
|
138
|
+
const response = await client.query({ query: gql `
|
|
139
|
+
query { applications { items { id
|
|
161
140
|
name
|
|
162
141
|
description
|
|
163
|
-
|
|
142
|
+
}
|
|
164
143
|
total
|
|
165
|
-
|
|
166
|
-
|
|
144
|
+
}
|
|
145
|
+
}
|
|
167
146
|
`
|
|
168
147
|
});
|
|
169
148
|
if (!response.errors) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applications.js","sourceRoot":"","sources":["../../../client/pages/application/applications.ts"],"names":[],"mappings":";AAAA,OAAO,yCAAyC,CAAA;AAChD,OAAO,yCAAyC,CAAA;AAEhD,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"applications.js","sourceRoot":"","sources":["../../../client/pages/application/applications.ts"],"names":[],"mappings":";AAAA,OAAO,yCAAyC,CAAA;AAChD,OAAO,yCAAyC,CAAA;AAEhD,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGnD,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,QAAQ;IAAnC;;QA2E6B,iBAAY,GAAU,EAAE,CAAA;IAmErD,CAAC;aA9I8C,WAAM,GAAG;QACpD,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuEF;KACF,AAzEkD,CAyElD;IAID,IAAI,OAAO;QAAS,OAAO,EAAQ,KAAK,EAAE,cAAc;YACpD,IAAI,EAAE,kBAAkB;SAC5B,CAAA;IACD,CAAC;IAEA,MAAM;QAAS,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;QAE/C,OAAO,IAAI,CAAA;;;;;;;qCAOsB,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;;;;;;;;;;;;UAYhE,IAAI,CAAC,GAAG,CACR,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA;;;0BAGK,eAAe,GAAG,CAAC,EAAE,EAAE;4BACrB,GAAG,CAAC,IAAI;oBAChB,GAAG,CAAC,WAAW;;;;;;;WAOxB,CACF;;;mCAG0B,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;KAC3D,CAAA;IACJ,CAAC;IAEA,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM;QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAO,IAAI,CAAC,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAA;QACxI,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,iBAAiB;QAAS,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAQ,KAAK,EAAE,GAAG,CAAA;;;;;;;;OAQjF;SACL,CAAC,CAAA;QAEC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAAO,OAAO,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAA;QAClE,CAAC;IACD,CAAC;;AAlE2B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;kDAAyB;AA3E/C,YAAY;IADjB,aAAa,CAAC,mBAAmB,CAAC;GAC7B,YAAY,CA8IjB","sourcesContent":["import '@material/web/button/elevated-button.js'\nimport '@material/web/button/outlined-button.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { client } from '@operato/graphql'\nimport { navigate, PageView } from '@operato/shell'\n\n@customElement('applications-page')\nclass Applications extends PageView { static styles = [\n css`\n :host { background-color: var(--md-sys-color-background);\n padding: var(--spacing-large);\n\n overflow: auto;\n }\n\n md-elevated-button { text-transform: capitalize;\n }\n\n md-outlined-button { float: right;\n margin-top: var(--spacing-medium);\n text-transform: capitalize;\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 table { margin: var(--spacing-large) 0;\n width: 100%;\n border-collapse: collapse;\n }\n\n tr { background-color: var(--tr-background-color);\n }\n\n tr:nth-child(odd) { background-color: var(--tr-background-odd-color);\n }\n\n tr:hover { background-color: var(--tr-background-hover-color);\n }\n\n th { border-top: var(--th-border-top);\n border-bottom: var(--td-border-bottom);\n padding: var(--th-padding);\n\n font: var(--th-font);\n color: var(--th-color);\n text-transform: var(--th-text-transform);\n text-align: left;\n }\n\n td { padding: var(--td-padding);\n border-bottom: var(--td-border-bottom);\n font: var(--td-font);\n color: var(--td-color);\n }\n\n td a { font: var(--td-font);\n text-decoration: none;\n color: var(--md-sys-color-on-surface);\n }\n\n td a strong { font: bold 16px var(--theme-font);\n\n display: block;\n text-decoration: none;\n }\n\n .text-align-center { text-align: center;\n }\n\n .text-align-right { text-align: right;\n }\n `\n ]\n\n @property({ type: Array }) applications: any[] = []\n\n get context() { return { title: `applications`,\n help: 'auth/application'\n }\n }\n\n render() { var apps = this.applications || []\n\n return html`\n <div>\n <h2>Registered Applications</h2>\n <p page-description>\n What type of app are you building?<br />Choose the app type that best suits the audience you’re building for.\n </p>\n\n <md-elevated-button @click=${e => navigate('application-register')}\n >register new application</md-elevated-button\n >\n </div>\n\n <table>\n <tr>\n <th>app name</th>\n <th>API health</th>\n <th>Installs</th>\n <th>status</th>\n </tr>\n ${apps.map(\n app => html`\n <tr>\n <td>\n <a href=${`application/${app.id}`}>\n <strong>${app.name}</strong>\n ${app.description}\n </a>\n </td>\n <td>OK</td>\n <td class=\"text-align-center\">1</td>\n <td>draft</td>\n </tr>\n `\n )}\n </table>\n\n <md-outlined-button @click=${e => navigate('app-bindings')}>bound applications ..</md-outlined-button>\n `\n }\n\n async pageUpdated(changes, lifecycle, before) { if (this.active) { this.applications = (await this.fetchApplications()).items\n }\n }\n\n async fetchApplications() { const response = await client.query({ query: gql`\n query { applications { items { id\n name\n description\n }\n total\n }\n }\n `\n })\n\n if (!response.errors) { return response.data.applications\n }\n }\n}\n"]}
|