@things-factory/auth-ui 7.0.1-alpha.88 → 7.0.1-alpha.90
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/client/auth-style-sign.ts +29 -18
- package/client/components/abstract-auth-page.ts +41 -22
- package/client/components/abstract-password-reset.ts +11 -9
- package/client/components/abstract-sign.ts +138 -0
- package/client/components/change-password.ts +2 -2
- package/client/components/contact-us.ts +18 -16
- package/client/components/create-domain-popup.ts +11 -7
- package/client/components/create-role.ts +8 -20
- package/client/components/create-user.ts +8 -16
- package/client/components/credential-manager.ts +64 -0
- package/client/components/invite-customer.ts +7 -12
- package/client/components/invite-user.ts +2 -7
- package/client/components/ownership-transfer-popup.ts +3 -3
- package/client/components/partner-role-editor.ts +9 -15
- package/client/components/profile-component.ts +124 -7
- package/client/components/role-privilege-editor.ts +10 -17
- package/client/components/user-role-editor.ts +27 -38
- package/client/entries/auth/activate.ts +17 -17
- package/client/entries/auth/checkin.ts +15 -19
- package/client/entries/auth/forgot-password.ts +8 -6
- package/client/entries/auth/result.ts +13 -12
- package/client/entries/auth/signup.ts +20 -24
- package/client/entries/oauth2/oauth2-decision-error-page.ts +2 -2
- package/client/entries/oauth2/oauth2-decision-page.ts +60 -55
- package/client/entries/public/home.ts +40 -18
- package/client/pages/app-binding/app-binding.ts +5 -9
- package/client/pages/app-binding/app-bindings.ts +2 -2
- package/client/pages/appliance/appliance.ts +6 -9
- package/client/pages/appliance/home.ts +3 -3
- package/client/pages/appliance/register.ts +1 -1
- package/client/pages/application/application.ts +30 -14
- package/client/pages/application/applications.ts +4 -12
- package/client/pages/application/register.ts +1 -1
- package/client/pages/attribute/attribute-set-management.ts +2 -0
- package/client/pages/auth-provider/auth-provider-management.ts +2 -0
- package/client/pages/domain/domain-management.ts +2 -0
- package/client/pages/user/user-management.ts +5 -5
- package/dist-client/auth-style-sign.js +29 -18
- package/dist-client/auth-style-sign.js.map +1 -1
- package/dist-client/components/abstract-auth-page.d.ts +4 -4
- package/dist-client/components/abstract-auth-page.js +40 -22
- package/dist-client/components/abstract-auth-page.js.map +1 -1
- package/dist-client/components/abstract-password-reset.d.ts +3 -2
- package/dist-client/components/abstract-password-reset.js +10 -9
- package/dist-client/components/abstract-password-reset.js.map +1 -1
- package/dist-client/components/abstract-sign.d.ts +3 -0
- package/dist-client/components/abstract-sign.js +110 -0
- package/dist-client/components/abstract-sign.js.map +1 -1
- package/dist-client/components/change-password.js +2 -2
- package/dist-client/components/change-password.js.map +1 -1
- package/dist-client/components/contact-us.d.ts +4 -4
- package/dist-client/components/contact-us.js +17 -16
- package/dist-client/components/contact-us.js.map +1 -1
- package/dist-client/components/create-domain-popup.d.ts +1 -1
- package/dist-client/components/create-domain-popup.js +11 -7
- package/dist-client/components/create-domain-popup.js.map +1 -1
- package/dist-client/components/create-role.d.ts +1 -1
- package/dist-client/components/create-role.js +7 -19
- package/dist-client/components/create-role.js.map +1 -1
- package/dist-client/components/create-user.js +6 -14
- package/dist-client/components/create-user.js.map +1 -1
- package/dist-client/components/credential-manager.d.ts +11 -0
- package/dist-client/components/credential-manager.js +64 -0
- package/dist-client/components/credential-manager.js.map +1 -0
- package/dist-client/components/invite-customer.js +5 -7
- package/dist-client/components/invite-customer.js.map +1 -1
- package/dist-client/components/invite-user.js +2 -7
- package/dist-client/components/invite-user.js.map +1 -1
- package/dist-client/components/ownership-transfer-popup.d.ts +1 -1
- package/dist-client/components/ownership-transfer-popup.js +3 -3
- package/dist-client/components/ownership-transfer-popup.js.map +1 -1
- package/dist-client/components/partner-role-editor.js +9 -15
- package/dist-client/components/partner-role-editor.js.map +1 -1
- package/dist-client/components/profile-component.d.ts +6 -0
- package/dist-client/components/profile-component.js +111 -7
- package/dist-client/components/profile-component.js.map +1 -1
- package/dist-client/components/role-privilege-editor.js +10 -17
- package/dist-client/components/role-privilege-editor.js.map +1 -1
- package/dist-client/components/user-role-editor.d.ts +2 -0
- package/dist-client/components/user-role-editor.js +26 -37
- package/dist-client/components/user-role-editor.js.map +1 -1
- package/dist-client/entries/auth/activate.d.ts +2 -1
- package/dist-client/entries/auth/activate.js +16 -17
- package/dist-client/entries/auth/activate.js.map +1 -1
- package/dist-client/entries/auth/checkin.d.ts +2 -2
- package/dist-client/entries/auth/checkin.js +13 -16
- package/dist-client/entries/auth/checkin.js.map +1 -1
- package/dist-client/entries/auth/forgot-password.d.ts +2 -1
- package/dist-client/entries/auth/forgot-password.js +7 -6
- package/dist-client/entries/auth/forgot-password.js.map +1 -1
- package/dist-client/entries/auth/result.d.ts +2 -2
- package/dist-client/entries/auth/result.js +12 -12
- package/dist-client/entries/auth/result.js.map +1 -1
- package/dist-client/entries/auth/signup.js +19 -24
- package/dist-client/entries/auth/signup.js.map +1 -1
- package/dist-client/entries/oauth2/oauth2-decision-error-page.d.ts +1 -1
- package/dist-client/entries/oauth2/oauth2-decision-error-page.js +2 -2
- package/dist-client/entries/oauth2/oauth2-decision-error-page.js.map +1 -1
- package/dist-client/entries/oauth2/oauth2-decision-page.d.ts +1 -1
- package/dist-client/entries/oauth2/oauth2-decision-page.js +59 -54
- package/dist-client/entries/oauth2/oauth2-decision-page.js.map +1 -1
- package/dist-client/entries/public/home.d.ts +3 -2
- package/dist-client/entries/public/home.js +40 -18
- package/dist-client/entries/public/home.js.map +1 -1
- package/dist-client/pages/app-binding/app-binding.d.ts +1 -1
- package/dist-client/pages/app-binding/app-binding.js +4 -9
- package/dist-client/pages/app-binding/app-binding.js.map +1 -1
- package/dist-client/pages/app-binding/app-bindings.js +2 -2
- package/dist-client/pages/app-binding/app-bindings.js.map +1 -1
- package/dist-client/pages/appliance/appliance.d.ts +1 -1
- package/dist-client/pages/appliance/appliance.js +5 -9
- package/dist-client/pages/appliance/appliance.js.map +1 -1
- package/dist-client/pages/appliance/home.js +3 -3
- package/dist-client/pages/appliance/home.js.map +1 -1
- package/dist-client/pages/appliance/register.js +1 -1
- package/dist-client/pages/appliance/register.js.map +1 -1
- package/dist-client/pages/application/application.js +26 -13
- package/dist-client/pages/application/application.js.map +1 -1
- package/dist-client/pages/application/applications.js +4 -12
- package/dist-client/pages/application/applications.js.map +1 -1
- package/dist-client/pages/application/register.js +1 -1
- package/dist-client/pages/application/register.js.map +1 -1
- package/dist-client/pages/attribute/attribute-set-management.d.ts +1 -0
- package/dist-client/pages/attribute/attribute-set-management.js +1 -0
- package/dist-client/pages/attribute/attribute-set-management.js.map +1 -1
- package/dist-client/pages/auth-provider/auth-provider-management.d.ts +1 -0
- package/dist-client/pages/auth-provider/auth-provider-management.js +1 -0
- package/dist-client/pages/auth-provider/auth-provider-management.js.map +1 -1
- package/dist-client/pages/domain/domain-management.d.ts +1 -0
- package/dist-client/pages/domain/domain-management.js +1 -0
- package/dist-client/pages/domain/domain-management.js.map +1 -1
- package/dist-client/pages/user/user-management.d.ts +1 -0
- package/dist-client/pages/user/user-management.js +4 -5
- package/dist-client/pages/user/user-management.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -10
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
- package/views/auth-page.html +2 -2
- package/views/oauth2-page.html +3 -3
|
@@ -5,19 +5,11 @@ import { i18next } from '@operato/i18n';
|
|
|
5
5
|
let CreateUser = class CreateUser extends LitElement {
|
|
6
6
|
render() {
|
|
7
7
|
return html `
|
|
8
|
-
<
|
|
9
|
-
type="text"
|
|
10
|
-
name="name"
|
|
11
|
-
label=${String(i18next.t('label.x name', { x: i18next.t('label.user') }))}
|
|
12
|
-
></mwc-textfield>
|
|
8
|
+
<md-outlined-text-field type="text" name="name" label=${String(i18next.t('label.x name', { x: i18next.t('label.user') }))}></md-outlined-text-field>
|
|
13
9
|
|
|
14
|
-
<
|
|
10
|
+
<md-outlined-text-field type="email" name="email" label=${String(i18next.t('field.email'))}></md-outlined-text-field>
|
|
15
11
|
|
|
16
|
-
<
|
|
17
|
-
@click=${this.onCreateUser.bind(this)}
|
|
18
|
-
outlined
|
|
19
|
-
label=${String(i18next.t('button.create'))}
|
|
20
|
-
></mwc-button>
|
|
12
|
+
<md-outlined-button @click=${this.onCreateUser.bind(this)}>${String(i18next.t('button.create'))}</md-outlined-button>
|
|
21
13
|
`;
|
|
22
14
|
}
|
|
23
15
|
async onCreateUser() {
|
|
@@ -48,7 +40,7 @@ let CreateUser = class CreateUser extends LitElement {
|
|
|
48
40
|
};
|
|
49
41
|
CreateUser.styles = css `
|
|
50
42
|
:host {
|
|
51
|
-
--
|
|
43
|
+
--md-text-field-fill-color: var(--theme-white-color);
|
|
52
44
|
background-color: var(--theme-white-color);
|
|
53
45
|
margin: var(--margin-wide) 0;
|
|
54
46
|
padding: var(--padding-wide);
|
|
@@ -64,7 +56,7 @@ CreateUser.styles = css `
|
|
|
64
56
|
align-items: center;
|
|
65
57
|
}
|
|
66
58
|
|
|
67
|
-
|
|
59
|
+
md-outlined-button {
|
|
68
60
|
margin: var(--input-margin);
|
|
69
61
|
}
|
|
70
62
|
|
|
@@ -73,7 +65,7 @@ CreateUser.styles = css `
|
|
|
73
65
|
grid-template-columns: 1fr 1fr;
|
|
74
66
|
}
|
|
75
67
|
|
|
76
|
-
|
|
68
|
+
md-outlined-button {
|
|
77
69
|
grid-column: span 2;
|
|
78
70
|
|
|
79
71
|
margin: var(--input-margin);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-user.js","sourceRoot":"","sources":["../../client/components/create-user.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAGvC,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IAuCjC,MAAM;QACJ,OAAO,IAAI,CAAA
|
|
1
|
+
{"version":3,"file":"create-user.js","sourceRoot":"","sources":["../../client/components/create-user.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAGvC,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IAuCjC,MAAM;QACJ,OAAO,IAAI,CAAA;8DAC+C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;;gEAE/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;;mCAE7D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;KAChG,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE;gBACpC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;aAClF;YAED,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;gBACzB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;aACtE;YAED,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE;gBACjC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;aACpC,CAAA;YAED,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAE1E,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAA;YACzB,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAA;SAC3B;QAAC,OAAO,CAAM,EAAE;YACf,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACxB,MAAM,EAAE;oBACN,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACxC;aACF,CAAC,CACH,CAAA;SACF;IACH,CAAC;;AA7EM,iBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiClB,CAAA;AAED;IAAC,KAAK,CAAC,aAAa,CAAC;8BAAa,gBAAgB;6CAAA;AAClD;IAAC,KAAK,CAAC,cAAc,CAAC;8BAAc,gBAAgB;8CAAA;AArChD,UAAU;IADf,aAAa,CAAC,aAAa,CAAC;GACvB,UAAU,CA+Ef","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, query } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\n\n@customElement('create-user')\nclass CreateUser extends LitElement {\n static styles = css`\n :host {\n --md-text-field-fill-color: var(--theme-white-color);\n background-color: var(--theme-white-color);\n margin: var(--margin-wide) 0;\n padding: var(--padding-wide);\n border-radius: var(--border-radius);\n box-shadow: var(--box-shadow);\n\n display: grid;\n grid-template-columns: 1fr 2fr auto;\n gap: 5px 15px;\n clear: both;\n max-width: var(--input-container-max-width);\n\n align-items: center;\n }\n\n md-outlined-button {\n margin: var(--input-margin);\n }\n\n @media screen and (max-width: 480px) {\n :host {\n grid-template-columns: 1fr 1fr;\n }\n\n md-outlined-button {\n grid-column: span 2;\n\n margin: var(--input-margin);\n }\n }\n `\n\n @query('[name=name]') nameInput!: HTMLInputElement\n @query('[name=email]') emailInput!: HTMLInputElement\n\n render() {\n return html`\n <md-outlined-text-field type=\"text\" name=\"name\" label=${String(i18next.t('label.x name', { x: i18next.t('label.user') }))}></md-outlined-text-field>\n\n <md-outlined-text-field type=\"email\" name=\"email\" label=${String(i18next.t('field.email'))}></md-outlined-text-field>\n\n <md-outlined-button @click=${this.onCreateUser.bind(this)}>${String(i18next.t('button.create'))}</md-outlined-button>\n `\n }\n\n async onCreateUser() {\n try {\n if (!this.emailInput.checkValidity()) {\n throw new Error(i18next.t('error.not valid pattern of type', { type: 'e-mail' }))\n }\n\n if (!this.nameInput.value) {\n throw new Error(i18next.t('error.value is empty', { value: 'name' }))\n }\n\n const user = {\n name: this.nameInput.value.trim(),\n email: this.emailInput.value.trim()\n }\n\n await this.dispatchEvent(new CustomEvent('create-user', { detail: user }))\n\n this.nameInput.value = ''\n this.emailInput.value = ''\n } catch (e: any) {\n document.dispatchEvent(\n new CustomEvent('notify', {\n detail: {\n level: 'error',\n message: 'message' in e ? e.message : e\n }\n })\n )\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class CredentialManager extends LitElement {
|
|
3
|
+
credentials: {
|
|
4
|
+
credentialId: string;
|
|
5
|
+
}[];
|
|
6
|
+
static styles: import("lit").CSSResult;
|
|
7
|
+
connectedCallback(): void;
|
|
8
|
+
fetchCredentials(): Promise<void>;
|
|
9
|
+
deleteCredential(credentialId: string): Promise<void>;
|
|
10
|
+
render(): import("lit").TemplateResult<1>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { LitElement, html, css } from 'lit';
|
|
3
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
4
|
+
let CredentialManager = class CredentialManager extends LitElement {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.credentials = [];
|
|
8
|
+
}
|
|
9
|
+
connectedCallback() {
|
|
10
|
+
super.connectedCallback();
|
|
11
|
+
this.fetchCredentials();
|
|
12
|
+
}
|
|
13
|
+
async fetchCredentials() {
|
|
14
|
+
const response = await fetch('/auth/credentials', {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
credentials: 'include'
|
|
17
|
+
});
|
|
18
|
+
this.credentials = await response.json();
|
|
19
|
+
}
|
|
20
|
+
async deleteCredential(credentialId) {
|
|
21
|
+
const response = await fetch(`/credentials/${credentialId}`, {
|
|
22
|
+
method: 'DELETE',
|
|
23
|
+
credentials: 'include'
|
|
24
|
+
});
|
|
25
|
+
if (response.ok) {
|
|
26
|
+
this.fetchCredentials();
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.error('Failed to delete credential');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
render() {
|
|
33
|
+
return html `
|
|
34
|
+
<div>
|
|
35
|
+
<h2>Manage Your WebAuthn Credentials</h2>
|
|
36
|
+
<ul>
|
|
37
|
+
${this.credentials.map(credential => html `
|
|
38
|
+
<li>
|
|
39
|
+
${credential.credentialId}
|
|
40
|
+
<button @click=${() => this.deleteCredential(credential.credentialId)}>Delete</button>
|
|
41
|
+
</li>
|
|
42
|
+
`)}
|
|
43
|
+
</ul>
|
|
44
|
+
</div>
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
CredentialManager.styles = css `
|
|
49
|
+
div {
|
|
50
|
+
margin: 20px;
|
|
51
|
+
}
|
|
52
|
+
button {
|
|
53
|
+
margin: 5px;
|
|
54
|
+
}
|
|
55
|
+
`;
|
|
56
|
+
__decorate([
|
|
57
|
+
property({ type: Array }),
|
|
58
|
+
__metadata("design:type", Array)
|
|
59
|
+
], CredentialManager.prototype, "credentials", void 0);
|
|
60
|
+
CredentialManager = __decorate([
|
|
61
|
+
customElement('credential-manager')
|
|
62
|
+
], CredentialManager);
|
|
63
|
+
export { CredentialManager };
|
|
64
|
+
//# sourceMappingURL=credential-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../client/components/credential-manager.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAKpD,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAAU;IAA1C;;QACsB,gBAAW,GAEhC,EAAE,CAAA;IAqDV,CAAC;IA1CC,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mBAAmB,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,SAAS;SACvB,CAAC,CAAA;QACF,IAAI,CAAC,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,YAAY,EAAE,EAAE;YAC3D,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,SAAS;SACvB,CAAC,CAAA;QACF,IAAI,QAAQ,CAAC,EAAE,EAAE;YACf,IAAI,CAAC,gBAAgB,EAAE,CAAA;SACxB;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;SAC7C;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;YAIH,IAAI,CAAC,WAAW,CAAC,GAAG,CACpB,UAAU,CAAC,EAAE,CAAC,IAAI,CAAA;;kBAEZ,UAAU,CAAC,YAAY;iCACR,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,YAAY,CAAC;;aAExE,CACF;;;KAGN,CAAA;IACH,CAAC;;AAlDM,wBAAM,GAAG,GAAG,CAAA;;;;;;;GAOlB,CAAA;AAXD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;sDAElB;AAHG,iBAAiB;IAD7B,aAAa,CAAC,oBAAoB,CAAC;GACvB,iBAAiB,CAwD7B;SAxDY,iBAAiB","sourcesContent":["import gql from 'graphql-tag'\nimport { LitElement, html, css } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\n\n@customElement('credential-manager')\nexport class CredentialManager extends LitElement {\n @property({ type: Array }) credentials: {\n credentialId: string\n }[] = []\n\n static styles = css`\n div {\n margin: 20px;\n }\n button {\n margin: 5px;\n }\n `\n\n connectedCallback() {\n super.connectedCallback()\n this.fetchCredentials()\n }\n\n async fetchCredentials() {\n const response = await fetch('/auth/credentials', {\n method: 'GET',\n credentials: 'include'\n })\n this.credentials = await response.json()\n }\n\n async deleteCredential(credentialId: string) {\n const response = await fetch(`/credentials/${credentialId}`, {\n method: 'DELETE',\n credentials: 'include'\n })\n if (response.ok) {\n this.fetchCredentials()\n } else {\n console.error('Failed to delete credential')\n }\n }\n\n render() {\n return html`\n <div>\n <h2>Manage Your WebAuthn Credentials</h2>\n <ul>\n ${this.credentials.map(\n credential => html`\n <li>\n ${credential.credentialId}\n <button @click=${() => this.deleteCredential(credential.credentialId)}>Delete</button>\n </li>\n `\n )}\n </ul>\n </div>\n `\n }\n}\n"]}
|
|
@@ -14,12 +14,10 @@ let InviteCustomer = class InviteCustomer extends localize(i18next)(LitElement)
|
|
|
14
14
|
return html `
|
|
15
15
|
<div>
|
|
16
16
|
<input id="customer-name" required />
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
label=${String(i18next.t('label.invite customer'))}
|
|
22
|
-
></mwc-button>
|
|
17
|
+
<md-outlined-button @click=${this.invite.bind(this)}>
|
|
18
|
+
<md-icon slot="icon">group_add</md-icon>
|
|
19
|
+
${String(i18next.t('label.invite customer'))}
|
|
20
|
+
</md-outlined-button>
|
|
23
21
|
</div>
|
|
24
22
|
`;
|
|
25
23
|
}
|
|
@@ -79,7 +77,7 @@ InviteCustomer.styles = [
|
|
|
79
77
|
min-width: 250px;
|
|
80
78
|
font: var(--input-font);
|
|
81
79
|
}
|
|
82
|
-
|
|
80
|
+
md-outlined-button {
|
|
83
81
|
margin: var(--input-margin);
|
|
84
82
|
}
|
|
85
83
|
@media screen and (max-width: 480px) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite-customer.js","sourceRoot":"","sources":["../../client/components/invite-customer.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAGtD,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAA1D;;QAsB6B,cAAS,GAAU,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"invite-customer.js","sourceRoot":"","sources":["../../client/components/invite-customer.ts"],"names":[],"mappings":"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","sourcesContent":["import gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { client, gqlContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\n\n@customElement('invite-customer')\nclass InviteCustomer extends localize(i18next)(LitElement) {\n static styles = [\n css`\n input {\n border: var(--border-dark-color);\n border-radius: var(--border-radius);\n margin: var(--input-margin);\n padding: var(--input-padding);\n min-width: 250px;\n font: var(--input-font);\n }\n md-outlined-button {\n margin: var(--input-margin);\n }\n @media screen and (max-width: 480px) {\n div {\n display: grid;\n }\n }\n `\n ]\n\n @property({ type: Array }) customers: any[] = []\n\n @query('input#customer-name') customerNameInput!: HTMLInputElement\n\n render() {\n return html`\n <div>\n <input id=\"customer-name\" required />\n <md-outlined-button @click=${this.invite.bind(this)}>\n <md-icon slot=\"icon\">group_add</md-icon>\n ${String(i18next.t('label.invite customer'))}\n </md-outlined-button>\n </div>\n `\n }\n\n async invite() {\n try {\n if (!this.customerNameInput.value) throw new Error(i18next.t('error.value is empty', { value: i18next.t('field.name') }))\n\n if (this.customers.find(c => c.name?.toLowerCase() === this.customerNameInput.value.toLowerCase())) {\n throw new Error(i18next.t('error.x already exists in y', { x: this.customerNameInput.value, y: i18next.t('field.customer') }))\n }\n\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.do_you_want_to_invite_x', { x: i18next.t(`label.partner`) }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n const customerDomainName = this.customerNameInput.value\n\n const response = await client.mutate({\n mutation: gql`\n mutation inviteCustomer($customerDomainName: String!) {\n inviteCustomer(customerDomainName: $customerDomainName)\n }\n `,\n variables: { customerDomainName },\n context: gqlContext()\n })\n\n if (!response.errors) {\n const answer = this.dispatchEvent(new CustomEvent('invitationCompleted'))\n\n if (answer) {\n await OxPrompt.open({\n type: 'success',\n title: i18next.t('text.completed'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n }\n\n this.customerNameInput.value = ''\n }\n }\n } catch (e: any) {\n document.dispatchEvent(\n new CustomEvent('notify', {\n detail: {\n level: 'error',\n message: 'message' in e ? e.message : e\n }\n })\n )\n }\n }\n}\n"]}
|
|
@@ -10,12 +10,7 @@ let InviteUser = class InviteUser extends localize(i18next)(LitElement) {
|
|
|
10
10
|
render() {
|
|
11
11
|
return html `
|
|
12
12
|
<input name="email" type="email" required name="invite-email" autocapitalize="off" />
|
|
13
|
-
<
|
|
14
|
-
@click=${this.invite.bind(this)}
|
|
15
|
-
outlined
|
|
16
|
-
icon="group_add"
|
|
17
|
-
label=${String(i18next.t('label.invite user'))}
|
|
18
|
-
></mwc-button>
|
|
13
|
+
<md-outlined-button @click=${this.invite.bind(this)}> <md-icon slot="icon">group_add</md-icon>${String(i18next.t('label.invite user'))} </md-outlined-button>
|
|
19
14
|
`;
|
|
20
15
|
}
|
|
21
16
|
async invite() {
|
|
@@ -77,7 +72,7 @@ InviteUser.styles = css `
|
|
|
77
72
|
font: var(--input-font);
|
|
78
73
|
}
|
|
79
74
|
|
|
80
|
-
|
|
75
|
+
md-outlined-button {
|
|
81
76
|
margin: var(--input-margin);
|
|
82
77
|
}
|
|
83
78
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite-user.js","sourceRoot":"","sources":["../../client/components/invite-user.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAE3B,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAGtD,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAwBpD,MAAM;QACJ,OAAO,IAAI,CAAA
|
|
1
|
+
{"version":3,"file":"invite-user.js","sourceRoot":"","sources":["../../client/components/invite-user.ts"],"names":[],"mappings":"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","sourcesContent":["import './user-role-editor'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, query } from 'lit/decorators.js'\n\nimport { client, gqlContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\n\n@customElement('invite-user')\nclass InviteUser extends localize(i18next)(LitElement) {\n static styles = css`\n :host {\n display: grid;\n }\n\n input {\n flex: 1;\n\n border: var(--border-dark-color);\n border-radius: var(--border-radius);\n margin: var(--input-margin);\n padding: var(--input-padding);\n min-width: 250px;\n font: var(--input-font);\n }\n\n md-outlined-button {\n margin: var(--input-margin);\n }\n `\n\n @query('input[name=email]') emailInput!: HTMLInputElement\n\n render() {\n return html`\n <input name=\"email\" type=\"email\" required name=\"invite-email\" autocapitalize=\"off\" />\n <md-outlined-button @click=${this.invite.bind(this)}> <md-icon slot=\"icon\">group_add</md-icon>${String(i18next.t('label.invite user'))} </md-outlined-button>\n `\n }\n\n async invite() {\n try {\n if (!this.emailInput.checkValidity()) {\n throw new Error(i18next.t('error.not valid pattern of type', { type: 'e-mail' }))\n }\n\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.do_you_want_to_invite_x', { x: i18next.t(`label.user`) }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n await this.inviteUser(this.emailInput.value)\n\n this.dispatchEvent(new CustomEvent('invitationCompleted'))\n }\n } catch (e: any) {\n document.dispatchEvent(\n new CustomEvent('notify', {\n detail: {\n level: 'error',\n message: 'message' in e ? e.message : e\n }\n })\n )\n }\n }\n\n async inviteUser(email) {\n const response = await client.mutate({\n mutation: gql`\n mutation inviteUser($email: EmailAddress!) {\n inviteUser(email: $email)\n }\n `,\n variables: { email },\n context: gqlContext()\n })\n\n if (!response.errors) {\n await OxPrompt.open({\n title: i18next.t('text.completed'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n this.emailInput.value = ''\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import '@material/
|
|
1
|
+
import '@material/web/button/elevated-button.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import '@material/
|
|
2
|
+
import '@material/web/button/elevated-button.js';
|
|
3
3
|
import gql from 'graphql-tag';
|
|
4
4
|
import { css, html, LitElement } from 'lit';
|
|
5
5
|
import { customElement, property, query } from 'lit/decorators.js';
|
|
@@ -13,7 +13,7 @@ let OwnershipTransferPopup = class OwnershipTransferPopup extends localize(i18ne
|
|
|
13
13
|
<div>${i18next.t('text.please enter the email of the user you want to transfer owner')}</div>
|
|
14
14
|
<div class="input-container">
|
|
15
15
|
<input name="email" />
|
|
16
|
-
<
|
|
16
|
+
<md-elevated-button @click=${this.transferOwnership}>${i18next.t('button.confirm')}</md-elevated-button>
|
|
17
17
|
</div>
|
|
18
18
|
</div>
|
|
19
19
|
`;
|
|
@@ -87,7 +87,7 @@ OwnershipTransferPopup.styles = [
|
|
|
87
87
|
margin: auto;
|
|
88
88
|
display: flex;
|
|
89
89
|
}
|
|
90
|
-
.input-container
|
|
90
|
+
.input-container md-elevated-button {
|
|
91
91
|
margin: auto 0px auto var(--padding-wide);
|
|
92
92
|
}
|
|
93
93
|
`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ownership-transfer-popup.js","sourceRoot":"","sources":["../../client/components/ownership-transfer-popup.ts"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ownership-transfer-popup.js","sourceRoot":"","sources":["../../client/components/ownership-transfer-popup.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/elevated-button.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { client, gqlContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\n\n@customElement('ownership-transfer-popup')\nclass OwnershipTransferPopup extends localize(i18next)(LitElement) {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: var(--main-section-background-color);\n padding: var(--padding-wide);\n overflow: auto;\n }\n .container {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n input {\n border: var(--border-dark-color);\n border-radius: var(--border-radius);\n margin: var(--input-margin);\n padding: var(--input-padding);\n min-width: 250px;\n font: var(--input-font);\n }\n .input-container {\n margin: auto;\n display: flex;\n }\n .input-container md-elevated-button {\n margin: auto 0px auto var(--padding-wide);\n }\n `\n ]\n\n @property({ type: Object }) user: any\n\n @query('input[name=email]') emailInput!: HTMLInputElement\n\n render() {\n return html`\n <div class=\"container\">\n <div>${i18next.t('text.please enter the email of the user you want to transfer owner')}</div>\n <div class=\"input-container\">\n <input name=\"email\" />\n <md-elevated-button @click=${this.transferOwnership}>${i18next.t('button.confirm')}</md-elevated-button>\n </div>\n </div>\n `\n }\n\n async transferOwnership() {\n if (!this.doubleCheckEmail()) {\n this.showToast(i18next.t('text.email is not matched'))\n\n return\n }\n\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.are_you_sure_to_transfer_owner'),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n const response = await client.mutate({\n mutation: gql`\n mutation transferOwner($email: EmailAddress!) {\n transferOwner(email: $email)\n }\n `,\n variables: { email: this.user.email },\n context: gqlContext()\n })\n\n if (!response.errors?.length) {\n await OxPrompt.open({\n type: 'success',\n title: i18next.t('text.completed'),\n text: i18next.t('text.owner_transfer_completed'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n history.back()\n\n this.dispatchEvent(new CustomEvent('ownershipTransferred', { bubbles: true, composed: true }))\n }\n } else {\n history.back()\n }\n }\n\n doubleCheckEmail() {\n return this.emailInput.value === this.user.email\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message, option: { timer: 1000 } } }))\n }\n}\n"]}
|
|
@@ -7,6 +7,7 @@ import { customElement, property, query } from 'lit/decorators.js';
|
|
|
7
7
|
import { client, gqlContext } from '@operato/graphql';
|
|
8
8
|
import { i18next, localize } from '@operato/i18n';
|
|
9
9
|
import { OxPrompt } from '@operato/popup/ox-prompt.js';
|
|
10
|
+
import { ButtonContainerStyles } from '@operato/styles';
|
|
10
11
|
import { RoleSelector } from './role-selector';
|
|
11
12
|
let PartnerRoleEditor = class PartnerRoleEditor extends localize(i18next)(LitElement) {
|
|
12
13
|
constructor() {
|
|
@@ -20,14 +21,9 @@ let PartnerRoleEditor = class PartnerRoleEditor extends localize(i18next)(LitEle
|
|
|
20
21
|
return html `
|
|
21
22
|
<role-selector .roles="${roles}" .userRoles="${grantingRoles}"></role-selector>
|
|
22
23
|
|
|
23
|
-
<div
|
|
24
|
-
<
|
|
25
|
-
<
|
|
26
|
-
@click=${this.onTerminateContract}
|
|
27
|
-
raised
|
|
28
|
-
danger
|
|
29
|
-
label="${i18next.t('button.terminate contract')}"
|
|
30
|
-
></mwc-button>
|
|
24
|
+
<div class="button-container">
|
|
25
|
+
<md-elevated-button @click=${this.onSave}>${i18next.t('button.save')}</md-elevated-button>
|
|
26
|
+
<md-elevated-button @click=${this.onTerminateContract} danger>${i18next.t('button.terminate contract')}</md-elevated-button>
|
|
31
27
|
</div>
|
|
32
28
|
`;
|
|
33
29
|
}
|
|
@@ -121,6 +117,7 @@ let PartnerRoleEditor = class PartnerRoleEditor extends localize(i18next)(LitEle
|
|
|
121
117
|
}
|
|
122
118
|
};
|
|
123
119
|
PartnerRoleEditor.styles = [
|
|
120
|
+
ButtonContainerStyles,
|
|
124
121
|
css `
|
|
125
122
|
:host {
|
|
126
123
|
display: flex;
|
|
@@ -131,16 +128,13 @@ PartnerRoleEditor.styles = [
|
|
|
131
128
|
font: normal 15px var(--theme-font);
|
|
132
129
|
color: var(--secondary-color);
|
|
133
130
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
padding: var(--padding-default);
|
|
137
|
-
background-color: rgba(var(--primary-color-rgb), 0.2);
|
|
138
|
-
}
|
|
139
|
-
mwc-button {
|
|
131
|
+
|
|
132
|
+
md-elevated-button {
|
|
140
133
|
margin-right: var(--padding-narrow);
|
|
141
134
|
}
|
|
135
|
+
|
|
142
136
|
[danger] {
|
|
143
|
-
--
|
|
137
|
+
--md-theme-primary: var(--md-danger-button-primary-color);
|
|
144
138
|
}
|
|
145
139
|
`
|
|
146
140
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partner-role-editor.js","sourceRoot":"","sources":["../../client/components/partner-role-editor.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,oBAAoB,CAAA;AAE3B,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"partner-role-editor.js","sourceRoot":"","sources":["../../client/components/partner-role-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/mwc-icon'\nimport './role-selector.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { client, gqlContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { ButtonContainerStyles } from '@operato/styles'\n\nimport { RoleSelector } from './role-selector'\n\n@customElement('partner-role-editor')\nclass PartnerRoleEditor extends localize(i18next)(LitElement) {\n static styles = [\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n border: 1px solid var(--primary-color);\n padding: var(--padding-default);\n font: normal 15px var(--theme-font);\n color: var(--secondary-color);\n }\n\n md-elevated-button {\n margin-right: var(--padding-narrow);\n }\n\n [danger] {\n --md-theme-primary: var(--md-danger-button-primary-color);\n }\n `\n ]\n\n @property({ type: Object }) customer: any\n @property({ type: Array }) roles: any[] = []\n @property({ type: Array }) grantingRoles: any[] = []\n\n @query('role-selector') roleSelector!: RoleSelector\n\n render() {\n const roles = this.roles || []\n const grantingRoles = this.grantingRoles || []\n\n return html`\n <role-selector .roles=\"${roles}\" .userRoles=\"${grantingRoles}\"></role-selector>\n\n <div class=\"button-container\">\n <md-elevated-button @click=${this.onSave}>${i18next.t('button.save')}</md-elevated-button>\n <md-elevated-button @click=${this.onTerminateContract} danger>${i18next.t('button.terminate contract')}</md-elevated-button>\n </div>\n `\n }\n\n updated(changes) {\n if (changes.has('customer')) {\n this.refreshRoles()\n }\n }\n\n async refreshRoles() {\n const response = await client.query({\n query: gql`\n query roles($customerId: String!) {\n roles {\n items {\n id\n name\n description\n }\n total\n }\n grantingRoles(customerId: $customerId) {\n id\n role {\n id\n name\n description\n }\n }\n }\n `,\n variables: { customerId: this.customer.id },\n context: gqlContext()\n })\n\n if (!response.errors?.length) {\n this.roles = response.data.roles.items\n this.grantingRoles = response.data.grantingRoles.map(grantingRole => grantingRole.role)\n } else {\n this.roles = []\n this.grantingRoles = []\n }\n }\n\n async onSave() {\n const roles = this.roleSelector.selectedRoles()\n\n const response = await client.mutate({\n mutation: gql`\n mutation grantRoles($customerId: String!, $roles: [RolePatch!]!) {\n grantRoles(customerId: $customerId, roles: $roles)\n }\n `,\n variables: { customerId: this.customer.id, roles },\n context: gqlContext()\n })\n\n if (!response.errors?.length) {\n this.showToast(i18next.t('text.data_updated_successfully'))\n }\n }\n\n async onTerminateContract() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.are_you_sure_to_terminate_contract'),\n confirmButton: { text: i18next.t('button.terminate contract') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n const response = await client.mutate({\n mutation: gql`\n mutation terminateContract($partnerName: String!) {\n terminateContract(partnerName: $partnerName)\n }\n `,\n variables: { partnerName: this.customer.name },\n context: gqlContext()\n })\n\n if (!response.errors?.length) {\n const answer = this.dispatchEvent(new CustomEvent('contractTerminated'))\n\n if (answer) {\n await OxPrompt.open({\n type: 'success',\n title: i18next.t('text.completed'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n }\n }\n }\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message, option: { timer: 1000 } } }))\n }\n}\n"]}
|
|
@@ -22,5 +22,11 @@ export declare class ProfileComponent extends ProfileComponent_base {
|
|
|
22
22
|
onLocaleChanged(value: any): Promise<void>;
|
|
23
23
|
openLoginHistory(): void;
|
|
24
24
|
deleteUser(): void;
|
|
25
|
+
registerWebAuthn(): Promise<void>;
|
|
26
|
+
get applicationMeta(): {
|
|
27
|
+
icon: string;
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
};
|
|
25
31
|
}
|
|
26
32
|
export {};
|
|
@@ -4,11 +4,13 @@ import '@operato/i18n/ox-i18n-selector.js';
|
|
|
4
4
|
import './change-password';
|
|
5
5
|
import './delete-user-popup';
|
|
6
6
|
import './my-login-history';
|
|
7
|
-
import
|
|
7
|
+
import base64url from 'base64url';
|
|
8
|
+
import { css, html, LitElement, nothing } from 'lit';
|
|
8
9
|
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
9
10
|
import { i18next, localize } from '@operato/i18n';
|
|
10
11
|
import { notify, openPopup } from '@operato/layout';
|
|
11
12
|
import { auth, getLanguages } from '@things-factory/auth-base/dist-client';
|
|
13
|
+
const isAvailableWebauthn = 'PublicKeyCredential' in window;
|
|
12
14
|
let ProfileComponent = class ProfileComponent extends localize(i18next)(LitElement) {
|
|
13
15
|
constructor() {
|
|
14
16
|
super(...arguments);
|
|
@@ -57,6 +59,14 @@ let ProfileComponent = class ProfileComponent extends localize(i18next)(LitEleme
|
|
|
57
59
|
|
|
58
60
|
<change-password id="change-password"></change-password>
|
|
59
61
|
|
|
62
|
+
${isAvailableWebauthn
|
|
63
|
+
? html `
|
|
64
|
+
<md-text-button @click=${() => this.registerWebAuthn()}
|
|
65
|
+
>${i18next.t('button.security-key registration')}</md-text-button
|
|
66
|
+
>
|
|
67
|
+
`
|
|
68
|
+
: nothing}
|
|
69
|
+
|
|
60
70
|
<footer>
|
|
61
71
|
<p>
|
|
62
72
|
${i18next.t('text.click login history')}
|
|
@@ -121,6 +131,100 @@ let ProfileComponent = class ProfileComponent extends localize(i18next)(LitEleme
|
|
|
121
131
|
title: i18next.t('label.delete account')
|
|
122
132
|
});
|
|
123
133
|
}
|
|
134
|
+
async registerWebAuthn() {
|
|
135
|
+
const challenge = await fetch('/auth/register-webauthn/challenge', {
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: {
|
|
138
|
+
'Content-Type': 'application/json',
|
|
139
|
+
Accept: 'application/json'
|
|
140
|
+
},
|
|
141
|
+
body: JSON.stringify({ email: this.email }),
|
|
142
|
+
credentials: 'include'
|
|
143
|
+
});
|
|
144
|
+
if (!challenge.ok) {
|
|
145
|
+
notify({
|
|
146
|
+
level: 'error',
|
|
147
|
+
message: await challenge.text()
|
|
148
|
+
});
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const options = await challenge.json();
|
|
152
|
+
const credential = (await navigator.credentials.create({
|
|
153
|
+
publicKey: {
|
|
154
|
+
rp: {
|
|
155
|
+
name: this.applicationMeta.title
|
|
156
|
+
},
|
|
157
|
+
user: {
|
|
158
|
+
/* options.user.id must be the user's email */
|
|
159
|
+
id: Uint8Array.from(base64url.toBuffer(options.user.id)).buffer,
|
|
160
|
+
name: options.user.name,
|
|
161
|
+
displayName: options.user.displayName
|
|
162
|
+
},
|
|
163
|
+
challenge: Uint8Array.from(atob(options.challenge), c => c.charCodeAt(0)),
|
|
164
|
+
pubKeyCredParams: [
|
|
165
|
+
{
|
|
166
|
+
type: 'public-key',
|
|
167
|
+
alg: -7 // ES256
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'public-key',
|
|
171
|
+
alg: -257 // RS256
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
authenticatorSelection: {
|
|
175
|
+
userVerification: 'preferred'
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}));
|
|
179
|
+
if (!credential) {
|
|
180
|
+
notify({
|
|
181
|
+
level: 'error',
|
|
182
|
+
message: 'can not get user credential'
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const response = credential.response;
|
|
187
|
+
var body = {
|
|
188
|
+
response: {
|
|
189
|
+
clientDataJSON: Buffer.from(response.clientDataJSON).toString('base64'),
|
|
190
|
+
attestationObject: Buffer.from(response.attestationObject).toString('base64')
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
if (response.getTransports) {
|
|
194
|
+
body.response.transports = response.getTransports();
|
|
195
|
+
}
|
|
196
|
+
const signinResponse = await fetch('/auth/signin-webauthn', {
|
|
197
|
+
method: 'POST',
|
|
198
|
+
headers: {
|
|
199
|
+
'Content-Type': 'application/json',
|
|
200
|
+
Accept: 'application/json'
|
|
201
|
+
},
|
|
202
|
+
body: JSON.stringify(body),
|
|
203
|
+
credentials: 'include'
|
|
204
|
+
});
|
|
205
|
+
if (!signinResponse.ok) {
|
|
206
|
+
notify({
|
|
207
|
+
level: 'error',
|
|
208
|
+
message: await signinResponse.text()
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
notify({
|
|
213
|
+
level: 'info',
|
|
214
|
+
message: i18next.t('text.user credential registered successfully')
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
get applicationMeta() {
|
|
219
|
+
var iconLink = document.querySelector('link[rel="application-icon"]');
|
|
220
|
+
var titleMeta = document.querySelector('meta[name="application-name"]');
|
|
221
|
+
var descriptionMeta = document.querySelector('meta[name="application-description"]');
|
|
222
|
+
return {
|
|
223
|
+
icon: (iconLink === null || iconLink === void 0 ? void 0 : iconLink.href) || '',
|
|
224
|
+
title: (titleMeta === null || titleMeta === void 0 ? void 0 : titleMeta.content) || 'Things Factory',
|
|
225
|
+
description: (descriptionMeta === null || descriptionMeta === void 0 ? void 0 : descriptionMeta.content) || 'Reimagining Software'
|
|
226
|
+
};
|
|
227
|
+
}
|
|
124
228
|
};
|
|
125
229
|
ProfileComponent.styles = [
|
|
126
230
|
css `
|
|
@@ -145,12 +249,12 @@ ProfileComponent.styles = [
|
|
|
145
249
|
}
|
|
146
250
|
|
|
147
251
|
input {
|
|
148
|
-
margin: var(--
|
|
149
|
-
border:
|
|
150
|
-
padding:
|
|
252
|
+
margin: var(--margin-narrow) 0;
|
|
253
|
+
border: 1px solid rgba(0, 0, 0, 0.2);
|
|
254
|
+
padding: 9px;
|
|
151
255
|
border-radius: var(--border-radius);
|
|
152
|
-
font: var(--input-font);
|
|
153
|
-
width: var(--
|
|
256
|
+
font: var(--auth-input-field-font);
|
|
257
|
+
width: var(--auth-input-field-width);
|
|
154
258
|
}
|
|
155
259
|
input:focus {
|
|
156
260
|
border: 1px solid var(--focus-background-color);
|
|
@@ -194,7 +298,7 @@ ProfileComponent.styles = [
|
|
|
194
298
|
}
|
|
195
299
|
|
|
196
300
|
[danger] {
|
|
197
|
-
--
|
|
301
|
+
--md-theme-primary: var(--md-danger-button-primary-color);
|
|
198
302
|
}
|
|
199
303
|
|
|
200
304
|
footer {
|