@things-factory/auth-ui 7.0.1-alpha.9 → 7.0.1-alpha.92

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 (166) hide show
  1. package/client/auth-style-sign.ts +29 -18
  2. package/client/bootstrap.ts +6 -10
  3. package/client/components/abstract-auth-page.ts +41 -22
  4. package/client/components/abstract-password-reset.ts +11 -9
  5. package/client/components/abstract-sign.ts +138 -0
  6. package/client/components/change-password.ts +3 -3
  7. package/client/components/contact-us.ts +19 -23
  8. package/client/components/create-domain-popup.ts +11 -7
  9. package/client/components/create-role.ts +8 -20
  10. package/client/components/create-user.ts +8 -16
  11. package/client/components/credential-manager.ts +64 -0
  12. package/client/components/delete-user-popup.ts +1 -1
  13. package/client/components/domain-switch.ts +7 -4
  14. package/client/components/invite-customer.ts +7 -14
  15. package/client/components/invite-user.ts +2 -7
  16. package/client/components/ownership-transfer-popup.ts +3 -3
  17. package/client/components/partner-role-editor.ts +11 -17
  18. package/client/components/profile-component.ts +124 -7
  19. package/client/components/role-privilege-editor.ts +10 -17
  20. package/client/components/user-role-editor.ts +27 -38
  21. package/client/entries/auth/activate.ts +17 -17
  22. package/client/entries/auth/checkin.ts +15 -19
  23. package/client/entries/auth/forgot-password.ts +8 -6
  24. package/client/entries/auth/result.ts +13 -12
  25. package/client/entries/auth/signup.ts +20 -24
  26. package/client/entries/oauth2/oauth2-decision-error-page.ts +2 -2
  27. package/client/entries/oauth2/oauth2-decision-page.ts +60 -55
  28. package/client/entries/public/home.ts +40 -18
  29. package/client/index.ts +93 -66
  30. package/client/pages/app-binding/app-binding.ts +5 -9
  31. package/client/pages/app-binding/app-bindings.ts +2 -2
  32. package/client/pages/appliance/appliance.ts +6 -9
  33. package/client/pages/appliance/home.ts +3 -3
  34. package/client/pages/appliance/register.ts +1 -1
  35. package/client/pages/application/application.ts +29 -50
  36. package/client/pages/application/applications.ts +4 -12
  37. package/client/pages/application/register.ts +1 -1
  38. package/client/pages/attribute/attribute-set-item-list.ts +8 -22
  39. package/client/pages/attribute/attribute-set-management.ts +14 -20
  40. package/client/pages/auth-provider/auth-provider-management.ts +10 -16
  41. package/client/pages/domain/domain-management.ts +4 -9
  42. package/client/pages/user/user-management.ts +5 -5
  43. package/dist-client/auth-style-sign.js +29 -18
  44. package/dist-client/auth-style-sign.js.map +1 -1
  45. package/dist-client/bootstrap.d.ts +1 -1
  46. package/dist-client/bootstrap.js +5 -5
  47. package/dist-client/bootstrap.js.map +1 -1
  48. package/dist-client/components/abstract-auth-page.d.ts +4 -4
  49. package/dist-client/components/abstract-auth-page.js +40 -22
  50. package/dist-client/components/abstract-auth-page.js.map +1 -1
  51. package/dist-client/components/abstract-password-reset.d.ts +3 -2
  52. package/dist-client/components/abstract-password-reset.js +10 -9
  53. package/dist-client/components/abstract-password-reset.js.map +1 -1
  54. package/dist-client/components/abstract-sign.d.ts +3 -0
  55. package/dist-client/components/abstract-sign.js +110 -0
  56. package/dist-client/components/abstract-sign.js.map +1 -1
  57. package/dist-client/components/change-password.js +3 -3
  58. package/dist-client/components/change-password.js.map +1 -1
  59. package/dist-client/components/contact-us.d.ts +4 -4
  60. package/dist-client/components/contact-us.js +18 -23
  61. package/dist-client/components/contact-us.js.map +1 -1
  62. package/dist-client/components/create-domain-popup.d.ts +1 -1
  63. package/dist-client/components/create-domain-popup.js +11 -7
  64. package/dist-client/components/create-domain-popup.js.map +1 -1
  65. package/dist-client/components/create-role.d.ts +1 -1
  66. package/dist-client/components/create-role.js +7 -19
  67. package/dist-client/components/create-role.js.map +1 -1
  68. package/dist-client/components/create-user.js +6 -14
  69. package/dist-client/components/create-user.js.map +1 -1
  70. package/dist-client/components/credential-manager.d.ts +11 -0
  71. package/dist-client/components/credential-manager.js +64 -0
  72. package/dist-client/components/credential-manager.js.map +1 -0
  73. package/dist-client/components/delete-user-popup.js +1 -1
  74. package/dist-client/components/delete-user-popup.js.map +1 -1
  75. package/dist-client/components/domain-switch.d.ts +2 -0
  76. package/dist-client/components/domain-switch.js +9 -4
  77. package/dist-client/components/domain-switch.js.map +1 -1
  78. package/dist-client/components/invite-customer.d.ts +1 -1
  79. package/dist-client/components/invite-customer.js +5 -8
  80. package/dist-client/components/invite-customer.js.map +1 -1
  81. package/dist-client/components/invite-user.js +2 -7
  82. package/dist-client/components/invite-user.js.map +1 -1
  83. package/dist-client/components/ownership-transfer-popup.d.ts +1 -1
  84. package/dist-client/components/ownership-transfer-popup.js +3 -3
  85. package/dist-client/components/ownership-transfer-popup.js.map +1 -1
  86. package/dist-client/components/partner-role-editor.d.ts +2 -2
  87. package/dist-client/components/partner-role-editor.js +11 -17
  88. package/dist-client/components/partner-role-editor.js.map +1 -1
  89. package/dist-client/components/profile-component.d.ts +6 -0
  90. package/dist-client/components/profile-component.js +111 -7
  91. package/dist-client/components/profile-component.js.map +1 -1
  92. package/dist-client/components/role-privilege-editor.js +10 -17
  93. package/dist-client/components/role-privilege-editor.js.map +1 -1
  94. package/dist-client/components/user-role-editor.d.ts +2 -0
  95. package/dist-client/components/user-role-editor.js +26 -37
  96. package/dist-client/components/user-role-editor.js.map +1 -1
  97. package/dist-client/entries/auth/activate.d.ts +2 -1
  98. package/dist-client/entries/auth/activate.js +16 -17
  99. package/dist-client/entries/auth/activate.js.map +1 -1
  100. package/dist-client/entries/auth/checkin.d.ts +2 -2
  101. package/dist-client/entries/auth/checkin.js +13 -16
  102. package/dist-client/entries/auth/checkin.js.map +1 -1
  103. package/dist-client/entries/auth/forgot-password.d.ts +2 -1
  104. package/dist-client/entries/auth/forgot-password.js +7 -6
  105. package/dist-client/entries/auth/forgot-password.js.map +1 -1
  106. package/dist-client/entries/auth/result.d.ts +2 -2
  107. package/dist-client/entries/auth/result.js +12 -12
  108. package/dist-client/entries/auth/result.js.map +1 -1
  109. package/dist-client/entries/auth/signup.js +19 -24
  110. package/dist-client/entries/auth/signup.js.map +1 -1
  111. package/dist-client/entries/oauth2/oauth2-decision-error-page.d.ts +1 -1
  112. package/dist-client/entries/oauth2/oauth2-decision-error-page.js +2 -2
  113. package/dist-client/entries/oauth2/oauth2-decision-error-page.js.map +1 -1
  114. package/dist-client/entries/oauth2/oauth2-decision-page.d.ts +1 -1
  115. package/dist-client/entries/oauth2/oauth2-decision-page.js +59 -54
  116. package/dist-client/entries/oauth2/oauth2-decision-page.js.map +1 -1
  117. package/dist-client/entries/public/home.d.ts +3 -2
  118. package/dist-client/entries/public/home.js +40 -18
  119. package/dist-client/entries/public/home.js.map +1 -1
  120. package/dist-client/index.d.ts +11 -2
  121. package/dist-client/index.js +74 -66
  122. package/dist-client/index.js.map +1 -1
  123. package/dist-client/pages/app-binding/app-binding.d.ts +1 -1
  124. package/dist-client/pages/app-binding/app-binding.js +4 -9
  125. package/dist-client/pages/app-binding/app-binding.js.map +1 -1
  126. package/dist-client/pages/app-binding/app-bindings.js +2 -2
  127. package/dist-client/pages/app-binding/app-bindings.js.map +1 -1
  128. package/dist-client/pages/appliance/appliance.d.ts +1 -1
  129. package/dist-client/pages/appliance/appliance.js +5 -9
  130. package/dist-client/pages/appliance/appliance.js.map +1 -1
  131. package/dist-client/pages/appliance/home.js +3 -3
  132. package/dist-client/pages/appliance/home.js.map +1 -1
  133. package/dist-client/pages/appliance/register.js +1 -1
  134. package/dist-client/pages/appliance/register.js.map +1 -1
  135. package/dist-client/pages/application/application.d.ts +1 -1
  136. package/dist-client/pages/application/application.js +28 -50
  137. package/dist-client/pages/application/application.js.map +1 -1
  138. package/dist-client/pages/application/applications.js +4 -12
  139. package/dist-client/pages/application/applications.js.map +1 -1
  140. package/dist-client/pages/application/register.js +1 -1
  141. package/dist-client/pages/application/register.js.map +1 -1
  142. package/dist-client/pages/attribute/attribute-set-item-list.d.ts +1 -1
  143. package/dist-client/pages/attribute/attribute-set-item-list.js +6 -22
  144. package/dist-client/pages/attribute/attribute-set-item-list.js.map +1 -1
  145. package/dist-client/pages/attribute/attribute-set-management.d.ts +11 -2
  146. package/dist-client/pages/attribute/attribute-set-management.js +7 -11
  147. package/dist-client/pages/attribute/attribute-set-management.js.map +1 -1
  148. package/dist-client/pages/auth-provider/auth-provider-management.d.ts +11 -2
  149. package/dist-client/pages/auth-provider/auth-provider-management.js +8 -11
  150. package/dist-client/pages/auth-provider/auth-provider-management.js.map +1 -1
  151. package/dist-client/pages/domain/domain-management.d.ts +1 -0
  152. package/dist-client/pages/domain/domain-management.js +3 -7
  153. package/dist-client/pages/domain/domain-management.js.map +1 -1
  154. package/dist-client/pages/user/user-management.d.ts +1 -0
  155. package/dist-client/pages/user/user-management.js +4 -5
  156. package/dist-client/pages/user/user-management.js.map +1 -1
  157. package/dist-client/tsconfig.tsbuildinfo +1 -1
  158. package/dist-server/tsconfig.tsbuildinfo +1 -1
  159. package/package.json +8 -12
  160. package/translations/en.json +1 -0
  161. package/translations/ja.json +1 -0
  162. package/translations/ko.json +1 -0
  163. package/translations/ms.json +1 -0
  164. package/translations/zh.json +1 -0
  165. package/views/auth-page.html +3 -2
  166. package/views/oauth2-page.html +3 -2
@@ -1,3 +1,5 @@
1
+ import '@material/web/icon/icon.js'
2
+
1
3
  import gql from 'graphql-tag'
2
4
 
3
5
  import { css, html, LitElement } from 'lit'
@@ -7,6 +9,7 @@ import { client } from '@operato/graphql'
7
9
  import { i18next, localize } from '@operato/i18n'
8
10
  import { isMobileDevice } from '@operato/utils'
9
11
  import { ColumnConfig, DataGrist, FetchOption, SortersControl } from '@operato/data-grist'
12
+ import { ButtonContainerStyles } from '@operato/styles'
10
13
 
11
14
  @customElement('attribute-set-item-list')
12
15
  class AttributeSetItemList extends localize(i18next)(LitElement) {
@@ -16,6 +19,7 @@ class AttributeSetItemList extends localize(i18next)(LitElement) {
16
19
 
17
20
  static styles = [
18
21
  css`
22
+ ButtonContainerStyles,
19
23
  :host {
20
24
  display: flex;
21
25
  flex-direction: column;
@@ -26,19 +30,6 @@ class AttributeSetItemList extends localize(i18next)(LitElement) {
26
30
  ox-grist {
27
31
  flex: 1;
28
32
  }
29
-
30
- .button-container {
31
- display: flex;
32
- margin-left: auto;
33
- padding: var(--padding-default);
34
- }
35
-
36
- [danger] {
37
- --mdc-theme-primary: var(--mdc-danger-button-primary-color);
38
- }
39
- mwc-button {
40
- margin-left: var(--margin-default);
41
- }
42
33
  `
43
34
  ]
44
35
 
@@ -46,16 +37,11 @@ class AttributeSetItemList extends localize(i18next)(LitElement) {
46
37
 
47
38
  render() {
48
39
  return html`
49
- <ox-grist
50
- .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
51
- .config=${this.gristConfig}
52
- .fetchHandler=${this.fetchHandler.bind(this)}
53
- ></ox-grist>
40
+ <ox-grist .mode=${isMobileDevice() ? 'LIST' : 'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>
41
+
54
42
  <div class="button-container">
55
- <mwc-button raised danger @click=${this.deleteAttributeSetItems.bind(this)}
56
- >${i18next.t('button.delete')}</mwc-button
57
- >
58
- <mwc-button raised @click=${this.updateAttributeSetItems.bind(this)}>${i18next.t('button.save')}</mwc-button>
43
+ <button danger @click=${this.deleteAttributeSetItems.bind(this)}><md-icon>delete_forever</md-icon>${i18next.t('button.delete')}</button>
44
+ <button @click=${this.updateAttributeSetItems.bind(this)}><md-icon>save</md-icon>${i18next.t('button.save')}</button>
59
45
  </div>
60
46
  `
61
47
  }
@@ -1,3 +1,5 @@
1
+ import '@material/web/icon/icon.js'
2
+
1
3
  import '@operato/data-grist'
2
4
  import '@operato/context/ox-context-page-toolbar.js'
3
5
  import './attribute-set-item-list.js'
@@ -67,7 +69,10 @@ export class AttributeSetManagementPage extends connect(store)(localize(i18next)
67
69
  {
68
70
  title: i18next.t('button.delete'),
69
71
  action: this.deleteAttributeSet.bind(this),
70
- icon: 'delete'
72
+ icon: 'delete',
73
+ emphasis: {
74
+ danger: true
75
+ }
71
76
  }
72
77
  ],
73
78
  toolbar: false
@@ -78,17 +83,9 @@ export class AttributeSetManagementPage extends connect(store)(localize(i18next)
78
83
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
79
84
 
80
85
  return html`
81
- <ox-grist
82
- .mode=${mode}
83
- .config=${this.gristConfig}
84
- .fetchHandler=${this.fetchHandler.bind(this)}
85
- ?url-params-sensitive=${this.active}
86
- >
86
+ <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)} ?url-params-sensitive=${this.active}>
87
87
  <div slot="headroom" class="header">
88
- <div class="title">
89
- <mwc-icon>summarize</mwc-icon>
90
- ${i18next.t('title.attributes')}
91
- </div>
88
+ <div class="title">${i18next.t('title.attributes')}</div>
92
89
 
93
90
  <ox-context-page-toolbar class="actions" .context=${this.context}> </ox-context-page-toolbar>
94
91
  </div>
@@ -112,15 +109,12 @@ export class AttributeSetManagementPage extends connect(store)(localize(i18next)
112
109
  handlers: {
113
110
  click: (columns, data, column, record, rowIndex) => {
114
111
  if (!record.id) return
115
- const popup = openPopup(
116
- html` <attribute-set-item-list .attribute=${record}></attribute-set-item-list> `,
117
- {
118
- backdrop: true,
119
- help: 'attribute/ui/attribute-set-item-list',
120
- size: 'large',
121
- title: i18next.t('title.attribute-item list')
122
- }
123
- )
112
+ const popup = openPopup(html` <attribute-set-item-list .attribute=${record}></attribute-set-item-list> `, {
113
+ backdrop: true,
114
+ help: 'attribute/ui/attribute-set-item-list',
115
+ size: 'large',
116
+ title: i18next.t('title.attribute-item list')
117
+ })
124
118
  popup.onclosed = () => {
125
119
  this.grist.fetch()
126
120
  }
@@ -1,3 +1,5 @@
1
+ import '@material/web/icon/icon.js'
2
+
1
3
  import '@operato/data-grist'
2
4
  import '@operato/context/ox-context-page-toolbar.js'
3
5
 
@@ -68,7 +70,10 @@ export class AuthProviderManagementPage extends connect(store)(localize(i18next)
68
70
  {
69
71
  title: i18next.t('button.delete'),
70
72
  action: this.deleteAuthProvider.bind(this),
71
- icon: 'delete'
73
+ icon: 'delete',
74
+ emphasis: {
75
+ danger: true
76
+ }
72
77
  }
73
78
  ],
74
79
  toolbar: false
@@ -79,17 +84,9 @@ export class AuthProviderManagementPage extends connect(store)(localize(i18next)
79
84
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
80
85
 
81
86
  return html`
82
- <ox-grist
83
- .mode=${mode}
84
- .config=${this.gristConfig}
85
- .fetchHandler=${this.fetchHandler.bind(this)}
86
- ?url-params-sensitive=${this.active}
87
- >
87
+ <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)} ?url-params-sensitive=${this.active}>
88
88
  <div slot="headroom" class="header">
89
- <div class="title">
90
- <mwc-icon>summarize</mwc-icon>
91
- ${i18next.t('title.auth-provider')}
92
- </div>
89
+ <div class="title">${i18next.t('title.auth-provider')}</div>
93
90
 
94
91
  <ox-filters-form autofocus without-search class="filters"></ox-filters-form>
95
92
 
@@ -184,11 +181,7 @@ export class AuthProviderManagementPage extends connect(store)(localize(i18next)
184
181
  record: {
185
182
  editable: true,
186
183
  options: async (value, column, record, row, field) => {
187
- const {
188
- description,
189
- help,
190
- parameterSpec: spec
191
- } = record.type ? this.authProviderTypes[record.type] : ({} as any)
184
+ const { description, help, parameterSpec: spec } = record.type ? this.authProviderTypes[record.type] : ({} as any)
192
185
  const context = this.grist
193
186
 
194
187
  return { description, help, spec, context }
@@ -236,6 +229,7 @@ export class AuthProviderManagementPage extends connect(store)(localize(i18next)
236
229
  name
237
230
  placeholder
238
231
  property
232
+ styles
239
233
  }
240
234
  }
241
235
  total
@@ -1,3 +1,5 @@
1
+ import '@material/web/icon/icon.js'
2
+
1
3
  import '@operato/data-grist/ox-grist.js'
2
4
  import '@operato/data-grist/ox-filters-form.js'
3
5
  import '@operato/context/ox-context-page-toolbar.js'
@@ -7,7 +9,7 @@ import '../../components/create-domain-popup'
7
9
  import gql from 'graphql-tag'
8
10
  import { css, html } from 'lit'
9
11
  import { customElement, property, query } from 'lit/decorators.js'
10
- import moment from 'moment-timezone'
12
+ import moment from '@operato/moment-timezone-es'
11
13
  import { connect } from 'pwa-helpers/connect-mixin'
12
14
 
13
15
  import { DataGrist } from '@operato/data-grist/ox-grist.js'
@@ -81,10 +83,7 @@ export class DomainManagement extends connect(store)(localize(i18next)(PageView)
81
83
  return html`
82
84
  <ox-grist .mode=${this.mode} .config=${this.config} .fetchHandler=${this.fetchHandler.bind(this)}>
83
85
  <div slot="headroom" class="header">
84
- <div class="title">
85
- <mwc-icon>summarize</mwc-icon>
86
- ${i18next.t('text.domain management')}
87
- </div>
86
+ <div class="title">${i18next.t('text.domain management')}</div>
88
87
 
89
88
  <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
90
89
  </div>
@@ -256,10 +255,6 @@ export class DomainManagement extends connect(store)(localize(i18next)(PageView)
256
255
  }
257
256
  ]
258
257
  }
259
-
260
- await this.updateComplete
261
-
262
- this.grist.fetch()
263
258
  }
264
259
 
265
260
  async pageUpdated(changes, lifecycle) {
@@ -1,3 +1,5 @@
1
+ import '@material/web/icon/icon.js'
2
+
1
3
  import '@things-factory/component-ui'
2
4
  import '../../components/invite-user'
3
5
  import '../../components/ownership-transfer-popup'
@@ -99,10 +101,10 @@ class UserManagement extends PageView {
99
101
  return html`
100
102
  ${!user.activated
101
103
  ? html`
102
- <mwc-icon>do_disturb</mwc-icon>
104
+ <md-icon>do_disturb</md-icon>
103
105
  ${user.name}
104
106
  `
105
- : html` ${user.owner ? html` <mwc-icon>supervisor_account</mwc-icon> ` : ''} ${user.name} `}
107
+ : html` ${user.owner ? html` <md-icon>supervisor_account</md-icon> ` : ''} ${user.name} `}
106
108
  `
107
109
  }}
108
110
  .contentRenderer=${user =>
@@ -116,9 +118,7 @@ class UserManagement extends PageView {
116
118
  ></user-role-editor>`}
117
119
  ></quick-find-list>
118
120
 
119
- ${this.currentTab === USER_TYPES.USER
120
- ? html`<invite-user @invitationCompleted=${this.refreshUsers.bind(this)}></invite-user>`
121
- : ''}
121
+ ${this.currentTab === USER_TYPES.USER ? html`<invite-user @invitationCompleted=${this.refreshUsers.bind(this)}></invite-user>` : ''}
122
122
  `
123
123
  }
124
124
 
@@ -70,34 +70,45 @@ export const AUTH_STYLE_SIGN = css `
70
70
  text-align: left;
71
71
  }
72
72
 
73
- .field mwc-textfield {
73
+ .submit-buttons-container {
74
+ grid-column: 1 / -1;
75
+ text-align: center;
76
+
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 10px;
80
+ }
81
+
82
+ .fingerprint {
83
+ color: var(--md-sys-color-primary-container);
84
+ border: 1.5px solid var(--md-sys-color-primary-container);
85
+ border-radius: 20%;
86
+ width: 36px;
87
+ height: 36px;
88
+ }
89
+
90
+ .field md-filled-text-field {
91
+ grid-column: 1 / -1;
74
92
  width: 100%;
75
- --mdc-theme-primary: var(--auth-input-color);
76
- --mdc-theme-error: #fdd55f;
77
- --mdc-text-field-fill-color: transparent;
78
- --mdc-text-field-ink-color: var(--auth-input-color);
79
- --mdc-text-field-label-ink-color: var(--auth-input-color);
80
- --mdc-text-field-idle-line-color: var(--auth-input-color);
81
- --mdc-text-field-hover-line-color: var(--auth-input-color);
82
- font: var(--auth-input-font);
83
93
  }
84
94
 
85
- mwc-button {
86
- --mdc-theme-primary: var(--auth-button-background-color);
87
- --mdc-theme-on-primary: var(--primary-color);
88
- --mdc-button-horizontal-padding: var(--padding-default);
89
- --mdc-button-ink-color: var(--primary-color);
95
+ md-text-button,
96
+ md-elevated-button {
90
97
  grid-column: 1 / -1;
98
+ flex: 1;
91
99
  }
92
100
 
93
101
  .wrap .link {
94
102
  text-decoration: none;
95
103
  justify-self: flex-start;
96
- color: var(--auth-title-color);
97
104
  }
98
105
 
99
- .wrap .link > mwc-button {
100
- --mdc-theme-primary: var(--auth-title-color);
106
+ .wrap .link md-text-button {
107
+ --md-text-button-label-text-color: var(--md-sys-color-primary-container);
108
+ }
109
+
110
+ .wrap .link md-icon {
111
+ color: var(--md-sys-color-primary-container);
101
112
  }
102
113
 
103
114
  #locale-area {
@@ -110,7 +121,7 @@ export const AUTH_STYLE_SIGN = css `
110
121
  display: flex;
111
122
  align-items: center;
112
123
  color: var(--theme-white-color);
113
- --mdc-icon-size: 16px;
124
+ --md-icon-size: 16px;
114
125
  }
115
126
 
116
127
  #locale-selector {
@@ -1 +1 @@
1
- {"version":3,"file":"auth-style-sign.js","sourceRoot":"","sources":["../client/auth-style-sign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiLjC,CAAA","sourcesContent":["import { css } from 'lit'\n\nexport const AUTH_STYLE_SIGN = css`\n :host {\n display: flex;\n background-color: var(--auth-background);\n }\n\n :host *:focus {\n outline: none;\n }\n\n :host * {\n box-sizing: border-box;\n }\n\n ::placeholder {\n color: var(--opacity-light-color);\n font: var(--auth-input-font);\n }\n .wrap {\n display: block;\n width: 450px;\n min-width: 350px;\n margin: 0 auto;\n padding-bottom: 100px;\n text-align: center;\n }\n .auth-brand {\n color: #fff;\n }\n .auth-brand img {\n margin: 15% auto 5px auto;\n width: 100px;\n border: 3px solid var(--theme-white-color);\n border-radius: 25px;\n box-shadow: var(--box-shadow);\n }\n .name {\n display: block;\n font: var(--auth-brand-name);\n text-shadow: var(--auth-brand-name-shadow);\n }\n .auth-brand .welcome-msg {\n font: var(--auth-brand-welcome-msg);\n }\n .auth-form {\n display: grid;\n grid-gap: var(--margin-default);\n grid-template-columns: 1fr 1fr;\n }\n\n form {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: var(--margin-default);\n align-items: center;\n }\n\n h3 {\n grid-column: 1 / -1;\n margin: 50px 0 0 0;\n font: var(--auth-title-font);\n color: var(--auth-title-color);\n text-transform: uppercase;\n }\n\n .field {\n grid-column: 1 / -1;\n text-align: left;\n }\n\n .field mwc-textfield {\n width: 100%;\n --mdc-theme-primary: var(--auth-input-color);\n --mdc-theme-error: #fdd55f;\n --mdc-text-field-fill-color: transparent;\n --mdc-text-field-ink-color: var(--auth-input-color);\n --mdc-text-field-label-ink-color: var(--auth-input-color);\n --mdc-text-field-idle-line-color: var(--auth-input-color);\n --mdc-text-field-hover-line-color: var(--auth-input-color);\n font: var(--auth-input-font);\n }\n\n mwc-button {\n --mdc-theme-primary: var(--auth-button-background-color);\n --mdc-theme-on-primary: var(--primary-color);\n --mdc-button-horizontal-padding: var(--padding-default);\n --mdc-button-ink-color: var(--primary-color);\n grid-column: 1 / -1;\n }\n\n .wrap .link {\n text-decoration: none;\n justify-self: flex-start;\n color: var(--auth-title-color);\n }\n\n .wrap .link > mwc-button {\n --mdc-theme-primary: var(--auth-title-color);\n }\n\n #locale-area {\n display: flex;\n grid-column: 1 / -1;\n padding: 0 var(--padding-default);\n }\n\n #locale-area > label {\n display: flex;\n align-items: center;\n color: var(--theme-white-color);\n --mdc-icon-size: 16px;\n }\n\n #locale-selector {\n font-size: 16px;\n width: 100%;\n }\n\n #locale-selector {\n --i18n-selector-field-border: none;\n --i18n-selector-field-background-color: none;\n --i18n-selector-field-font-size: 14px;\n --i18n-selector-field-color: var(--theme-white-color);\n }\n\n .lottie-container {\n width: 100%;\n height: 300px;\n position: absolute;\n left: 0;\n bottom: 0;\n pointer-events: none;\n }\n .lottie-container lottie-player {\n position: absolute;\n bottom: -6%;\n width: 100%;\n height: auto;\n }\n\n @media (max-width: 450px) {\n .wrap {\n width: 85%;\n min-width: 320px;\n }\n .auth-form {\n grid-template-columns: 1fr;\n }\n .auth-brand img {\n margin: 12% auto 5px auto;\n width: 75px;\n }\n h3 {\n margin: 15px 0 0 0;\n }\n .lottie-container {\n overflow: hidden;\n height: 200px;\n pointer-events: none;\n }\n .lottie-container lottie-player {\n width: 1200px;\n left: -30%;\n }\n }\n\n @media screen and (min-width: 1400px) {\n .wrap {\n padding-bottom: 150px;\n }\n }\n @media screen and (min-width: 2500px) {\n .wrap {\n padding-bottom: 280px;\n }\n }\n`\n"]}
1
+ {"version":3,"file":"auth-style-sign.js","sourceRoot":"","sources":["../client/auth-style-sign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4LjC,CAAA","sourcesContent":["import { css } from 'lit'\n\nexport const AUTH_STYLE_SIGN = css`\n :host {\n display: flex;\n background-color: var(--auth-background);\n }\n\n :host *:focus {\n outline: none;\n }\n\n :host * {\n box-sizing: border-box;\n }\n\n ::placeholder {\n color: var(--opacity-light-color);\n font: var(--auth-input-font);\n }\n .wrap {\n display: block;\n width: 450px;\n min-width: 350px;\n margin: 0 auto;\n padding-bottom: 100px;\n text-align: center;\n }\n .auth-brand {\n color: #fff;\n }\n .auth-brand img {\n margin: 15% auto 5px auto;\n width: 100px;\n border: 3px solid var(--theme-white-color);\n border-radius: 25px;\n box-shadow: var(--box-shadow);\n }\n .name {\n display: block;\n font: var(--auth-brand-name);\n text-shadow: var(--auth-brand-name-shadow);\n }\n .auth-brand .welcome-msg {\n font: var(--auth-brand-welcome-msg);\n }\n .auth-form {\n display: grid;\n grid-gap: var(--margin-default);\n grid-template-columns: 1fr 1fr;\n }\n\n form {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: var(--margin-default);\n align-items: center;\n }\n\n h3 {\n grid-column: 1 / -1;\n margin: 50px 0 0 0;\n font: var(--auth-title-font);\n color: var(--auth-title-color);\n text-transform: uppercase;\n }\n\n .field {\n grid-column: 1 / -1;\n text-align: left;\n }\n\n .submit-buttons-container {\n grid-column: 1 / -1;\n text-align: center;\n\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .fingerprint {\n color: var(--md-sys-color-primary-container);\n border: 1.5px solid var(--md-sys-color-primary-container);\n border-radius: 20%;\n width: 36px;\n height: 36px;\n }\n\n .field md-filled-text-field {\n grid-column: 1 / -1;\n width: 100%;\n }\n\n md-text-button,\n md-elevated-button {\n grid-column: 1 / -1;\n flex: 1;\n }\n\n .wrap .link {\n text-decoration: none;\n justify-self: flex-start;\n }\n\n .wrap .link md-text-button {\n --md-text-button-label-text-color: var(--md-sys-color-primary-container);\n }\n\n .wrap .link md-icon {\n color: var(--md-sys-color-primary-container);\n }\n\n #locale-area {\n display: flex;\n grid-column: 1 / -1;\n padding: 0 var(--padding-default);\n }\n\n #locale-area > label {\n display: flex;\n align-items: center;\n color: var(--theme-white-color);\n --md-icon-size: 16px;\n }\n\n #locale-selector {\n font-size: 16px;\n width: 100%;\n }\n\n #locale-selector {\n --i18n-selector-field-border: none;\n --i18n-selector-field-background-color: none;\n --i18n-selector-field-font-size: 14px;\n --i18n-selector-field-color: var(--theme-white-color);\n }\n\n .lottie-container {\n width: 100%;\n height: 300px;\n position: absolute;\n left: 0;\n bottom: 0;\n pointer-events: none;\n }\n .lottie-container lottie-player {\n position: absolute;\n bottom: -6%;\n width: 100%;\n height: auto;\n }\n\n @media (max-width: 450px) {\n .wrap {\n width: 85%;\n min-width: 320px;\n }\n .auth-form {\n grid-template-columns: 1fr;\n }\n .auth-brand img {\n margin: 12% auto 5px auto;\n width: 75px;\n }\n h3 {\n margin: 15px 0 0 0;\n }\n .lottie-container {\n overflow: hidden;\n height: 200px;\n pointer-events: none;\n }\n .lottie-container lottie-player {\n width: 1200px;\n left: -30%;\n }\n }\n\n @media screen and (min-width: 1400px) {\n .wrap {\n padding-bottom: 150px;\n }\n }\n @media screen and (min-width: 2500px) {\n .wrap {\n padding-bottom: 280px;\n }\n }\n`\n"]}
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon';
1
+ import '@material/web/icon/icon.js';
2
2
  import '@operato/i18n/ox-i18n.js';
3
3
  import '@operato/attribute/grist-editor';
4
4
  export default function bootstrap(): void;
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon';
1
+ import '@material/web/icon/icon.js';
2
2
  import '@operato/i18n/ox-i18n.js';
3
3
  import '@operato/attribute/grist-editor'; /* for register data-grist editor type 'attributes' */
4
4
  import { html } from 'lit-html';
@@ -6,8 +6,8 @@ import { navigate, store } from '@operato/shell';
6
6
  import { TOOL_POSITION } from '@operato/layout';
7
7
  import { OxGristEditorPrivilege } from '@operato/app/grist-editor/ox-grist-editor-privilege.js';
8
8
  import { registerEditor as registerGristEditor, registerRenderer as registerGristRenderer, OxGristRendererJson5 } from '@operato/data-grist';
9
- import { auth } from '@things-factory/auth-base/dist-client';
10
- import { ADD_MORENDA } from '@things-factory/more-base';
9
+ import { auth } from '@things-factory/auth-base/dist-client/auth.js';
10
+ import { ADD_MORENDA } from '@things-factory/more-base/client';
11
11
  export default function bootstrap() {
12
12
  registerGristEditor('privilege', OxGristEditorPrivilege);
13
13
  registerGristRenderer('privilege', OxGristRendererJson5);
@@ -15,7 +15,7 @@ export default function bootstrap() {
15
15
  store.dispatch({
16
16
  type: ADD_MORENDA,
17
17
  morenda: {
18
- icon: html ` <mwc-icon>account_circle</mwc-icon> `,
18
+ icon: html ` <md-icon>account_circle</md-icon> `,
19
19
  name: html ` <ox-i18n msgid="text.auth profile"></ox-i18n> `,
20
20
  position: TOOL_POSITION.FRONT_END,
21
21
  action: () => {
@@ -27,7 +27,7 @@ export default function bootstrap() {
27
27
  store.dispatch({
28
28
  type: ADD_MORENDA,
29
29
  morenda: {
30
- icon: html ` <mwc-icon>exit_to_app</mwc-icon> `,
30
+ icon: html ` <md-icon>exit_to_app</md-icon> `,
31
31
  name: html ` <ox-i18n msgid="field.sign out"></ox-i18n> `,
32
32
  position: TOOL_POSITION.FRONT_END,
33
33
  action: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,0BAA0B,CAAA;AACjC,OAAO,iCAAiC,CAAA,CAAC,sDAAsD;AAE/F,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAA;AAE/F,OAAO,EACL,cAAc,IAAI,mBAAmB,EACrC,gBAAgB,IAAI,qBAAqB,EACzC,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,mBAAmB,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAA;IACxD,qBAAqB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAA;IAExD,8BAA8B;IAC9B,KAAK,CAAC,QAAQ,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,CAAA,uCAAuC;YACjD,IAAI,EAAE,IAAI,CAAA,iDAAiD;YAC3D,QAAQ,EAAE,aAAa,CAAC,SAAS;YACjC,MAAM,EAAE,GAAG,EAAE;gBACX,QAAQ,CAAC,SAAS,CAAC,CAAA;YACrB,CAAC;SACF;KACF,CAAC,CAAA;IAEF,0BAA0B;IAC1B,KAAK,CAAC,QAAQ,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,CAAA,oCAAoC;YAC9C,IAAI,EAAE,IAAI,CAAA,8CAA8C;YACxD,QAAQ,EAAE,aAAa,CAAC,SAAS;YACjC,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,CAAC,OAAO,EAAE,CAAA;YAChB,CAAC;SACF;KACF,CAAC,CAAA;IAEF;;;;MAIE;IACF,IAAI,CAAC,OAAO,EAAE,CAAA;AAChB,CAAC","sourcesContent":["import '@material/mwc-icon'\nimport '@operato/i18n/ox-i18n.js'\nimport '@operato/attribute/grist-editor' /* for register data-grist editor type 'attributes' */\n\nimport { html } from 'lit-html'\n\nimport { navigate, store } from '@operato/shell'\nimport { TOOL_POSITION } from '@operato/layout'\nimport { OxGristEditorPrivilege } from '@operato/app/grist-editor/ox-grist-editor-privilege.js'\n\nimport {\n registerEditor as registerGristEditor,\n registerRenderer as registerGristRenderer,\n OxGristRendererJson5\n} from '@operato/data-grist'\nimport { auth } from '@things-factory/auth-base/dist-client'\nimport { ADD_MORENDA } from '@things-factory/more-base'\n\nexport default function bootstrap() {\n registerGristEditor('privilege', OxGristEditorPrivilege)\n registerGristRenderer('privilege', OxGristRendererJson5)\n\n /* add user profile morenda */\n store.dispatch({\n type: ADD_MORENDA,\n morenda: {\n icon: html` <mwc-icon>account_circle</mwc-icon> `,\n name: html` <ox-i18n msgid=\"text.auth profile\"></ox-i18n> `,\n position: TOOL_POSITION.FRONT_END,\n action: () => {\n navigate('profile')\n }\n }\n })\n\n /* add sign-out morenda */\n store.dispatch({\n type: ADD_MORENDA,\n morenda: {\n icon: html` <mwc-icon>exit_to_app</mwc-icon> `,\n name: html` <ox-i18n msgid=\"field.sign out\"></ox-i18n> `,\n position: TOOL_POSITION.FRONT_END,\n action: () => {\n auth.signout()\n }\n }\n })\n\n /* \n Get user profile information from server. \n As soon as response received, auth.on('profile', ...) handlers start to work.\n It's very important point to build UI for the user.\n */\n auth.profile()\n}\n"]}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,0BAA0B,CAAA;AACjC,OAAO,iCAAiC,CAAA,CAAC,sDAAsD;AAE/F,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAA;AAC/F,OAAO,EAAE,cAAc,IAAI,mBAAmB,EAAE,gBAAgB,IAAI,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE5I,OAAO,EAAE,IAAI,EAAE,MAAM,+CAA+C,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,mBAAmB,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAA;IACxD,qBAAqB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAA;IAExD,8BAA8B;IAC9B,KAAK,CAAC,QAAQ,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,CAAA,qCAAqC;YAC/C,IAAI,EAAE,IAAI,CAAA,iDAAiD;YAC3D,QAAQ,EAAE,aAAa,CAAC,SAAS;YACjC,MAAM,EAAE,GAAG,EAAE;gBACX,QAAQ,CAAC,SAAS,CAAC,CAAA;YACrB,CAAC;SACF;KACF,CAAC,CAAA;IAEF,0BAA0B;IAC1B,KAAK,CAAC,QAAQ,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,CAAA,kCAAkC;YAC5C,IAAI,EAAE,IAAI,CAAA,8CAA8C;YACxD,QAAQ,EAAE,aAAa,CAAC,SAAS;YACjC,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,CAAC,OAAO,EAAE,CAAA;YAChB,CAAC;SACF;KACF,CAAC,CAAA;IAEF;;;;MAIE;IACF,IAAI,CAAC,OAAO,EAAE,CAAA;AAChB,CAAC","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/i18n/ox-i18n.js'\nimport '@operato/attribute/grist-editor' /* for register data-grist editor type 'attributes' */\n\nimport { html } from 'lit-html'\n\nimport { navigate, store } from '@operato/shell'\nimport { TOOL_POSITION } from '@operato/layout'\nimport { OxGristEditorPrivilege } from '@operato/app/grist-editor/ox-grist-editor-privilege.js'\nimport { registerEditor as registerGristEditor, registerRenderer as registerGristRenderer, OxGristRendererJson5 } from '@operato/data-grist'\n\nimport { auth } from '@things-factory/auth-base/dist-client/auth.js'\nimport { ADD_MORENDA } from '@things-factory/more-base/client'\n\nexport default function bootstrap() {\n registerGristEditor('privilege', OxGristEditorPrivilege)\n registerGristRenderer('privilege', OxGristRendererJson5)\n\n /* add user profile morenda */\n store.dispatch({\n type: ADD_MORENDA,\n morenda: {\n icon: html` <md-icon>account_circle</md-icon> `,\n name: html` <ox-i18n msgid=\"text.auth profile\"></ox-i18n> `,\n position: TOOL_POSITION.FRONT_END,\n action: () => {\n navigate('profile')\n }\n }\n })\n\n /* add sign-out morenda */\n store.dispatch({\n type: ADD_MORENDA,\n morenda: {\n icon: html` <md-icon>exit_to_app</md-icon> `,\n name: html` <ox-i18n msgid=\"field.sign out\"></ox-i18n> `,\n position: TOOL_POSITION.FRONT_END,\n action: () => {\n auth.signout()\n }\n }\n })\n\n /* \n Get user profile information from server. \n As soon as response received, auth.on('profile', ...) handlers start to work.\n It's very important point to build UI for the user.\n */\n auth.profile()\n}\n"]}
@@ -1,7 +1,7 @@
1
- import '@material/mwc-button';
2
- import '@material/mwc-icon';
3
- import '@material/mwc-icon-button';
4
- import '@material/mwc-textfield';
1
+ import '@material/web/icon/icon.js';
2
+ import '@material/web/button/elevated-button.js';
3
+ import '@material/web/button/text-button.js';
4
+ import '@material/web/textfield/filled-text-field.js';
5
5
  import '@operato/lottie-player';
6
6
  import '@operato/i18n/ox-i18n.js';
7
7
  import '@operato/i18n/ox-i18n-selector.js';
@@ -1,8 +1,8 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- import '@material/mwc-button';
3
- import '@material/mwc-icon';
4
- import '@material/mwc-icon-button';
5
- import '@material/mwc-textfield';
2
+ import '@material/web/icon/icon.js';
3
+ import '@material/web/button/elevated-button.js';
4
+ import '@material/web/button/text-button.js';
5
+ import '@material/web/textfield/filled-text-field.js';
6
6
  import '@operato/lottie-player';
7
7
  import '@operato/i18n/ox-i18n.js';
8
8
  import '@operato/i18n/ox-i18n-selector.js';
@@ -18,7 +18,7 @@ export class AbstractAuthPage extends localize(i18next)(LitElement) {
18
18
  const { disableUserFavoredLanguage, languages } = this.data || {};
19
19
  var { icon, title, description } = this.applicationMeta;
20
20
  return html `
21
- <div class="content">
21
+ <div class="content md-typescale-display-medium">
22
22
  <div class="wrap">
23
23
  <div class="auth-brand">
24
24
  <img src=${icon} />
@@ -43,7 +43,7 @@ export class AbstractAuthPage extends localize(i18next)(LitElement) {
43
43
  ${this.links}
44
44
  ${!disableUserFavoredLanguage
45
45
  ? html ` <div id="locale-area">
46
- <label for="locale-selector"><mwc-icon>language</mwc-icon></label>
46
+ <label for="locale-selector"><md-icon>language</md-icon></label>
47
47
  <ox-i18n-selector
48
48
  id="locale-selector"
49
49
  value=${i18next.language || 'en-US'}
@@ -60,7 +60,9 @@ export class AbstractAuthPage extends localize(i18next)(LitElement) {
60
60
  </div>
61
61
  </div>
62
62
 
63
- <mwc-icon-button home icon="home" @click=${e => (window.location.href = '/')}></mwc-icon-button>
63
+ <md-icon-button class="home" @click=${e => (window.location.href = '/')}
64
+ ><md-icon>home</md-icon></md-icon-button
65
+ >
64
66
  <ox-snack-bar id="snackbar" level="error" .message=${this.message}></ox-snack-bar>
65
67
 
66
68
  ${isSafari()
@@ -76,7 +78,7 @@ export class AbstractAuthPage extends localize(i18next)(LitElement) {
76
78
  firstUpdated() {
77
79
  setTimeout(() => {
78
80
  ;
79
- this.renderRoot.querySelector('mwc-textfield').focus();
81
+ this.renderRoot.querySelector('md-filled-text-field').focus();
80
82
  }, 100);
81
83
  this.formEl.reset = () => {
82
84
  this.formElements.filter(el => !(el.hidden || el.type == 'hidden')).forEach(el => (el.value = ''));
@@ -94,34 +96,36 @@ export class AbstractAuthPage extends localize(i18next)(LitElement) {
94
96
  get formfields() {
95
97
  var _a;
96
98
  const email = ((_a = this.data) === null || _a === void 0 ? void 0 : _a.email) || '';
99
+ // .validationMessage=${String(i18next.t('text.invalid-email'))}
97
100
  return html `
98
101
  <input id="redirectTo" type="hidden" name="redirectTo" .value=${this.redirectTo || '/'} />
99
102
 
100
103
  <div class="field">
101
- <mwc-textfield
104
+ <md-filled-text-field
102
105
  name="email"
103
106
  type="email"
104
107
  label=${String(i18next.t('field.email'))}
105
108
  required
106
109
  .value=${email}
107
- .validationMessage=${String(i18next.t('text.invalid-email'))}
108
110
  autocomplete="username"
109
111
  autocapitalize="off"
110
- ></mwc-textfield>
112
+ ><md-icon slot="leading-icon">mail</md-icon></md-filled-text-field
113
+ >
111
114
  </div>
112
115
  <div class="field">
113
- <mwc-textfield
116
+ <md-filled-text-field
114
117
  name="password"
115
118
  type="password"
116
119
  label=${String(i18next.t('field.password'))}
117
120
  autocomplete="current-password"
118
121
  required
119
- ></mwc-textfield>
122
+ ><md-icon slot="leading-icon">vpn_key</md-icon></md-filled-text-field
123
+ >
120
124
  </div>
121
125
 
122
- <mwc-button class="ui" type="submit" raised @click=${e => this._onSubmit(e)}>
126
+ <md-elevated-button class="ui" type="submit" raised @click=${e => this._onSubmit(e)}>
123
127
  <ox-i18n msgid="field.${this.pageName}"> </ox-i18n>
124
- </mwc-button>
128
+ </md-elevated-button>
125
129
  `;
126
130
  }
127
131
  get links() {
@@ -130,16 +134,25 @@ export class AbstractAuthPage extends localize(i18next)(LitElement) {
130
134
  ${!disableUserSignupProcess
131
135
  ? html `
132
136
  <a class="link" href="/auth/signup">
133
- <mwc-button icon="add_task"><ox-i18n msgid="field.sign up"></ox-i18n></mwc-button>
137
+ <md-text-button>
138
+ <md-icon slot="icon">add_task</md-icon>
139
+ <ox-i18n msgid="field.sign up"></ox-i18n>
140
+ </md-text-button>
134
141
  </a>
135
142
  <a class="link" href="/auth/forgot-password">
136
- <mwc-button icon="lock_open"><ox-i18n msgid="field.forgot-password"></ox-i18n></mwc-button>
143
+ <md-text-button>
144
+ <md-icon slot="icon">lock_open</md-icon>
145
+ <ox-i18n msgid="field.forgot-password"></ox-i18n>
146
+ </md-text-button>
137
147
  </a>
138
148
  `
139
149
  : nothing}
140
150
  ${ssoLinks.map(sso => html `
141
151
  <a class="link" href=${sso.link}>
142
- <mwc-button icon="badge">${i18next.t('label.signin with', { title: sso.title })}</mwc-button>
152
+ <md-text-button>
153
+ <md-icon slot="icon">badge</md-icon>
154
+ ${i18next.t('label.signin with', { title: sso.title })}
155
+ </md-text-button>
143
156
  </a>
144
157
  `)}
145
158
  `;
@@ -196,17 +209,22 @@ AbstractAuthPage.styles = [
196
209
  height: 100vh;
197
210
  height: 100dvh;
198
211
  }
212
+
199
213
  .content {
200
214
  flex: 1;
201
215
  overflow: auto;
202
216
  }
203
217
 
204
- [home] {
218
+ .home {
205
219
  position: absolute;
220
+ padding: var(--padding-dufault, 9px);
221
+ left: 20px;
206
222
  top: 10px;
207
- left: 10px;
208
- font-size: 2em;
209
- color: white;
223
+ color: var(--theme-white-color);
224
+ }
225
+
226
+ div.field {
227
+ margin-bottom: var(--margin-default);
210
228
  }
211
229
 
212
230
  [hidden] {
@@ -1 +1 @@
1
- {"version":3,"file":"abstract-auth-page.js","sourceRoot":"","sources":["../../client/components/abstract-auth-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/mwc-button'\nimport '@material/mwc-icon'\nimport '@material/mwc-icon-button'\nimport '@material/mwc-textfield'\nimport '@operato/lottie-player'\nimport '@operato/i18n/ox-i18n.js'\nimport '@operato/i18n/ox-i18n-selector.js'\nimport '@operato/layout/ox-snack-bar.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { isSafari } from '@operato/utils'\n\nimport { AUTH_STYLE_SIGN } from '../auth-style-sign.js'\n\nexport abstract class AbstractAuthPage extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n position: relative;\n overflow: hidden;\n\n display: flex;\n flex-direction: row;\n\n width: 100vw;\n height: 100vh;\n height: 100dvh;\n }\n .content {\n flex: 1;\n overflow: auto;\n }\n\n [home] {\n position: absolute;\n top: 10px;\n left: 10px;\n font-size: 2em;\n color: white;\n }\n\n [hidden] {\n display: none;\n }\n\n #snackbar {\n width: 100%;\n z-index: 10;\n }\n\n @media print {\n :host {\n width: 100%;\n height: 100%;\n min-height: 100vh;\n min-height: 100dvh;\n }\n }\n `,\n AUTH_STYLE_SIGN\n ]\n\n @property({ type: Object }) data: any\n @property({ type: String }) message?: string\n @property({ type: Object }) detail: any\n @property({ type: String }) redirectTo?: string\n\n @query('#form') formEl!: HTMLFormElement\n\n private _applicationMeta?: {\n icon: string\n title: string\n description: string\n }\n\n render() {\n const { disableUserFavoredLanguage, languages } = this.data || {}\n var { icon, title, description } = this.applicationMeta\n\n return html`\n <div class=\"content\">\n <div class=\"wrap\">\n <div class=\"auth-brand\">\n <img src=${icon} />\n <strong class=\"name\">${title}</strong>\n <span class=\"welcome-msg\">${description}</span>\n </div>\n\n <div class=\"auth-form\">\n <h3><ox-i18n msgid=\"title.${this.pageName}\"></ox-i18n></h3>\n\n <form\n id=\"form\"\n action=\"${this.actionUrl}\"\n method=\"post\"\n @keypress=${e => {\n if (e.key == 'Enter') this._onSubmit(e)\n }}\n >\n ${this.formfields}\n </form>\n ${this.links}\n ${!disableUserFavoredLanguage\n ? html` <div id=\"locale-area\">\n <label for=\"locale-selector\"><mwc-icon>language</mwc-icon></label>\n <ox-i18n-selector\n id=\"locale-selector\"\n value=${i18next.language || 'en-US'}\n .languages=${languages}\n @change=${e => {\n var locale = e.detail\n if (!locale) return\n\n i18next.changeLanguage(locale)\n }}\n ></ox-i18n-selector>\n </div>`\n : nothing}\n </div>\n </div>\n\n <mwc-icon-button home icon=\"home\" @click=${e => (window.location.href = '/')}></mwc-icon-button>\n <ox-snack-bar id=\"snackbar\" level=\"error\" .message=${this.message}></ox-snack-bar>\n\n ${isSafari()\n ? html``\n : html`\n <div class=\"lottie-container\">\n <lottie-player autoplay loop src=\"../../assets/images/background-animation.json\"></lottie-player>\n </div>\n `}\n </div>\n `\n }\n\n firstUpdated() {\n setTimeout(() => {\n ;(this.renderRoot.querySelector('mwc-textfield') as any).focus()\n }, 100)\n\n this.formEl.reset = () => {\n this.formElements.filter(el => !(el.hidden || el.type == 'hidden')).forEach(el => (el.value = ''))\n }\n }\n\n updated(changed) {\n if (changed.has('data') && this.data) {\n this.message = this.data.message\n this.redirectTo = this.data.redirectTo\n }\n }\n\n abstract get pageName(): string\n abstract get actionUrl(): string\n\n get formElements(): HTMLInputElement[] {\n return Array.from(this.formEl.querySelectorAll('[name]'))\n }\n\n get formfields() {\n const email = this.data?.email || ''\n\n return html`\n <input id=\"redirectTo\" type=\"hidden\" name=\"redirectTo\" .value=${this.redirectTo || '/'} />\n\n <div class=\"field\">\n <mwc-textfield\n name=\"email\"\n type=\"email\"\n label=${String(i18next.t('field.email'))}\n required\n .value=${email}\n .validationMessage=${String(i18next.t('text.invalid-email'))}\n autocomplete=\"username\"\n autocapitalize=\"off\"\n ></mwc-textfield>\n </div>\n <div class=\"field\">\n <mwc-textfield\n name=\"password\"\n type=\"password\"\n label=${String(i18next.t('field.password'))}\n autocomplete=\"current-password\"\n required\n ></mwc-textfield>\n </div>\n\n <mwc-button class=\"ui\" type=\"submit\" raised @click=${e => this._onSubmit(e)}>\n <ox-i18n msgid=\"field.${this.pageName}\"> </ox-i18n>\n </mwc-button>\n `\n }\n\n get links() {\n const { disableUserSignupProcess, ssoLinks = [] } = this.data || {}\n\n return html`\n ${!disableUserSignupProcess\n ? html`\n <a class=\"link\" href=\"/auth/signup\">\n <mwc-button icon=\"add_task\"><ox-i18n msgid=\"field.sign up\"></ox-i18n></mwc-button>\n </a>\n <a class=\"link\" href=\"/auth/forgot-password\">\n <mwc-button icon=\"lock_open\"><ox-i18n msgid=\"field.forgot-password\"></ox-i18n></mwc-button>\n </a>\n `\n : nothing}\n ${ssoLinks.map(\n sso => html`\n <a class=\"link\" href=${sso.link}>\n <mwc-button icon=\"badge\">${i18next.t('label.signin with', { title: sso.title })}</mwc-button>\n </a>\n `\n )}\n `\n }\n\n async _onSubmit(e) {\n if (this.checkValidity()) {\n this.submit()\n }\n }\n\n checkValidity() {\n return this.formElements.every(el => el.checkValidity())\n }\n\n abstract submit()\n\n showSnackbar({ level, message, timer = 3000 }: { level?: string; message?: string; timer?: number } = {}) {\n const snackbar = this.renderRoot.querySelector('#snackbar') as HTMLElement & {\n level: string\n message: string\n active: boolean\n }\n\n if (level) snackbar.level = level\n if (message) snackbar.message = message\n snackbar.active = true\n\n if (timer > -1)\n setTimeout(() => {\n this.hideSnackbar()\n }, timer)\n }\n\n hideSnackbar() {\n const snackbar = this.renderRoot.querySelector('#snackbar') as HTMLElement & {\n level: string\n message: string\n active: boolean\n }\n\n snackbar.active = false\n }\n\n get applicationMeta() {\n if (!this._applicationMeta) {\n var iconLink: HTMLLinkElement | null = document.querySelector('link[rel=\"application-icon\"]')\n var titleMeta: HTMLMetaElement | null = document.querySelector('meta[name=\"application-name\"]')\n var descriptionMeta: HTMLMetaElement | null = document.querySelector('meta[name=\"application-description\"]')\n\n this._applicationMeta = {\n icon: iconLink?.href || '',\n title: titleMeta?.content || 'Things Factory',\n description: descriptionMeta?.content || 'Reimagining Software'\n }\n }\n\n return this._applicationMeta\n }\n}\n"]}
1
+ {"version":3,"file":"abstract-auth-page.js","sourceRoot":"","sources":["../../client/components/abstract-auth-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/textfield/filled-text-field.js'\n\nimport '@operato/lottie-player'\nimport '@operato/i18n/ox-i18n.js'\nimport '@operato/i18n/ox-i18n-selector.js'\nimport '@operato/layout/ox-snack-bar.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { isSafari } from '@operato/utils'\n\nimport { AUTH_STYLE_SIGN } from '../auth-style-sign.js'\n\nexport abstract class AbstractAuthPage extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n position: relative;\n overflow: hidden;\n\n display: flex;\n flex-direction: row;\n\n width: 100vw;\n height: 100vh;\n height: 100dvh;\n }\n\n .content {\n flex: 1;\n overflow: auto;\n }\n\n .home {\n position: absolute;\n padding: var(--padding-dufault, 9px);\n left: 20px;\n top: 10px;\n color: var(--theme-white-color);\n }\n\n div.field {\n margin-bottom: var(--margin-default);\n }\n\n [hidden] {\n display: none;\n }\n\n #snackbar {\n width: 100%;\n z-index: 10;\n }\n\n @media print {\n :host {\n width: 100%;\n height: 100%;\n min-height: 100vh;\n min-height: 100dvh;\n }\n }\n `,\n AUTH_STYLE_SIGN\n ]\n\n @property({ type: Object }) data: any\n @property({ type: String }) message?: string\n @property({ type: Object }) detail: any\n @property({ type: String }) redirectTo?: string\n\n @query('#form') formEl!: HTMLFormElement\n\n private _applicationMeta?: {\n icon: string\n title: string\n description: string\n }\n\n render() {\n const { disableUserFavoredLanguage, languages } = this.data || {}\n var { icon, title, description } = this.applicationMeta\n\n return html`\n <div class=\"content md-typescale-display-medium\">\n <div class=\"wrap\">\n <div class=\"auth-brand\">\n <img src=${icon} />\n <strong class=\"name\">${title}</strong>\n <span class=\"welcome-msg\">${description}</span>\n </div>\n\n <div class=\"auth-form\">\n <h3><ox-i18n msgid=\"title.${this.pageName}\"></ox-i18n></h3>\n\n <form\n id=\"form\"\n action=\"${this.actionUrl}\"\n method=\"post\"\n @keypress=${e => {\n if (e.key == 'Enter') this._onSubmit(e)\n }}\n >\n ${this.formfields}\n </form>\n ${this.links}\n ${!disableUserFavoredLanguage\n ? html` <div id=\"locale-area\">\n <label for=\"locale-selector\"><md-icon>language</md-icon></label>\n <ox-i18n-selector\n id=\"locale-selector\"\n value=${i18next.language || 'en-US'}\n .languages=${languages}\n @change=${e => {\n var locale = e.detail\n if (!locale) return\n\n i18next.changeLanguage(locale)\n }}\n ></ox-i18n-selector>\n </div>`\n : nothing}\n </div>\n </div>\n\n <md-icon-button class=\"home\" @click=${e => (window.location.href = '/')}\n ><md-icon>home</md-icon></md-icon-button\n >\n <ox-snack-bar id=\"snackbar\" level=\"error\" .message=${this.message}></ox-snack-bar>\n\n ${isSafari()\n ? html``\n : html`\n <div class=\"lottie-container\">\n <lottie-player autoplay loop src=\"../../assets/images/background-animation.json\"></lottie-player>\n </div>\n `}\n </div>\n `\n }\n\n firstUpdated() {\n setTimeout(() => {\n ;(this.renderRoot.querySelector('md-filled-text-field') as any).focus()\n }, 100)\n\n this.formEl.reset = () => {\n this.formElements.filter(el => !(el.hidden || el.type == 'hidden')).forEach(el => (el.value = ''))\n }\n }\n\n updated(changed) {\n if (changed.has('data') && this.data) {\n this.message = this.data.message\n this.redirectTo = this.data.redirectTo\n }\n }\n\n abstract get pageName(): string\n abstract get actionUrl(): string\n\n get formElements(): HTMLInputElement[] {\n return Array.from(this.formEl.querySelectorAll('[name]'))\n }\n\n get formfields() {\n const email = this.data?.email || ''\n // .validationMessage=${String(i18next.t('text.invalid-email'))}\n\n return html`\n <input id=\"redirectTo\" type=\"hidden\" name=\"redirectTo\" .value=${this.redirectTo || '/'} />\n\n <div class=\"field\">\n <md-filled-text-field\n name=\"email\"\n type=\"email\"\n label=${String(i18next.t('field.email'))}\n required\n .value=${email}\n autocomplete=\"username\"\n autocapitalize=\"off\"\n ><md-icon slot=\"leading-icon\">mail</md-icon></md-filled-text-field\n >\n </div>\n <div class=\"field\">\n <md-filled-text-field\n name=\"password\"\n type=\"password\"\n label=${String(i18next.t('field.password'))}\n autocomplete=\"current-password\"\n required\n ><md-icon slot=\"leading-icon\">vpn_key</md-icon></md-filled-text-field\n >\n </div>\n\n <md-elevated-button class=\"ui\" type=\"submit\" raised @click=${e => this._onSubmit(e)}>\n <ox-i18n msgid=\"field.${this.pageName}\"> </ox-i18n>\n </md-elevated-button>\n `\n }\n\n get links() {\n const { disableUserSignupProcess, ssoLinks = [] } = this.data || {}\n\n return html`\n ${!disableUserSignupProcess\n ? html`\n <a class=\"link\" href=\"/auth/signup\">\n <md-text-button>\n <md-icon slot=\"icon\">add_task</md-icon>\n <ox-i18n msgid=\"field.sign up\"></ox-i18n>\n </md-text-button>\n </a>\n <a class=\"link\" href=\"/auth/forgot-password\">\n <md-text-button>\n <md-icon slot=\"icon\">lock_open</md-icon>\n <ox-i18n msgid=\"field.forgot-password\"></ox-i18n>\n </md-text-button>\n </a>\n `\n : nothing}\n ${ssoLinks.map(\n sso => html`\n <a class=\"link\" href=${sso.link}>\n <md-text-button>\n <md-icon slot=\"icon\">badge</md-icon>\n ${i18next.t('label.signin with', { title: sso.title })}\n </md-text-button>\n </a>\n `\n )}\n `\n }\n\n async _onSubmit(e) {\n if (this.checkValidity()) {\n this.submit()\n }\n }\n\n checkValidity() {\n return this.formElements.every(el => el.checkValidity())\n }\n\n abstract submit()\n\n showSnackbar({ level, message, timer = 3000 }: { level?: string; message?: string; timer?: number } = {}) {\n const snackbar = this.renderRoot.querySelector('#snackbar') as HTMLElement & {\n level: string\n message: string\n active: boolean\n }\n\n if (level) snackbar.level = level\n if (message) snackbar.message = message\n snackbar.active = true\n\n if (timer > -1)\n setTimeout(() => {\n this.hideSnackbar()\n }, timer)\n }\n\n hideSnackbar() {\n const snackbar = this.renderRoot.querySelector('#snackbar') as HTMLElement & {\n level: string\n message: string\n active: boolean\n }\n\n snackbar.active = false\n }\n\n get applicationMeta() {\n if (!this._applicationMeta) {\n var iconLink: HTMLLinkElement | null = document.querySelector('link[rel=\"application-icon\"]')\n var titleMeta: HTMLMetaElement | null = document.querySelector('meta[name=\"application-name\"]')\n var descriptionMeta: HTMLMetaElement | null = document.querySelector('meta[name=\"application-description\"]')\n\n this._applicationMeta = {\n icon: iconLink?.href || '',\n title: titleMeta?.content || 'Things Factory',\n description: descriptionMeta?.content || 'Reimagining Software'\n }\n }\n\n return this._applicationMeta\n }\n}\n"]}