@oicl/openbridge-webcomponents 2.0.0-next.139 → 2.0.0-next.140
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/bundle/openbridge-webcomponents.bundle.js +55 -19
- package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
- package/custom-elements.json +31 -11
- package/dist/components/user-menu/user-menu.css.js +4 -0
- package/dist/components/user-menu/user-menu.css.js.map +1 -1
- package/dist/components/user-menu/user-menu.d.ts +23 -5
- package/dist/components/user-menu/user-menu.d.ts.map +1 -1
- package/dist/components/user-menu/user-menu.js +51 -19
- package/dist/components/user-menu/user-menu.js.map +1 -1
- package/package.json +1 -1
package/custom-elements.json
CHANGED
|
@@ -84849,7 +84849,7 @@
|
|
|
84849
84849
|
"declarations": [
|
|
84850
84850
|
{
|
|
84851
84851
|
"kind": "class",
|
|
84852
|
-
"description": "`<obc-user-menu>` – A user menu component with sign-in and signed-in layouts.\n\nProvides multiple layouts for authentication and account access states, including\nsign-in forms, user-specific sign-in, loading states, and signed-in navigation.\n\n### Features\n- **Multiple States:** Supports sign-in, user sign-in, loading, and signed-in layouts.\n- **Size Options:** Regular and small sizes for compact layouts.\n- **Recent Users:** Optional \"Recently signed in\" section for quick access.\n- **Navigation Actions:** Signed-in state lists the actions it is given.\n\n### Variants\n- `type`: `sign-in`, `user-sign-in`, `loading-sign-in`, `signed-in`\n- `size`: `regular`, `small`\n\n### Usage Guidelines\nUse `obc-user-menu` in authentication or account panels where quick access to\nsign-in, profile, or account actions is needed. The `user-sign-in` type is\nbest for fast re-auth flows; `loading-sign-in` is for pending auth states.\n\n### Properties and Configuration\n- `type` (`ObcUserMenuType`): Controls the layout state. Defaults to `sign-in`.\n- `size` (`ObcUserMenuSize`): Controls the overall size. Defaults to `regular`.\n- `hasRecentlySignedIn` (`boolean`): Toggles the recent users section.\n Defaults to `false`.\n- `username` (`string`): Current username value for sign-in layouts.\n- `password` (`string`): Current password value for sign-in layouts.\n- `usernameError` (`string`): Error message for the username field.\n- `passwordError` (`string`): Error message for the password field.\n- `userInitials` (`string`): Initials for the primary user profile.\n- `userLabel` (`string`): Label for the primary user profile.\n- `recentUsers` (`ObcUserMenuUser[]`): List of recent users shown in the\n \"Recently signed in\" section. Empty renders no section.\n- `signedInActions` (`ObcUserMenuSignedInAction[]`): Actions shown in the\n signed-in navigation list. Empty renders no actions.\n- `primaryActionId` (`string`): Id of the action promoted to a button in the\n small signed-in layout.\n\n### Events\n- `sign-in-click` – Fired when a sign-in button is clicked.\n- `sign-out-click` – Fired when the sign-out button is clicked.\n- `signed-in-action-click` – Fired when a signed-in action is clicked.\n- `recent-user-click` – Fired when a recent user button is clicked.\n\n### Slots\n- `signed-in-action-icon-{id}`: Optional icon for a signed-in action. The\n `{id}` is the normalized action id.\n\n### Example\n```html\n<obc-user-menu\n type=\"user-sign-in\"\n size=\"small\"\n hasRecentlySignedIn=\"false\"\n userInitials=\"JD\"\n userLabel=\"John Doe\"\n></obc-user-menu>\n```",
|
|
84852
|
+
"description": "`<obc-user-menu>` – A user menu component with sign-in and signed-in layouts.\n\nProvides multiple layouts for authentication and account access states, including\nsign-in forms, user-specific sign-in, loading states, and signed-in navigation.\n\n### Features\n- **Multiple States:** Supports sign-in, user sign-in, loading, and signed-in layouts.\n- **Size Options:** Regular and small sizes for compact layouts.\n- **Recent Users:** Optional \"Recently signed in\" section for quick access.\n- **Navigation Actions:** Signed-in state lists the actions it is given.\n\n### Variants\n- `type`: `sign-in`, `user-sign-in`, `loading-sign-in`, `signed-in`\n- `size`: `regular`, `small`\n\n### Usage Guidelines\nUse `obc-user-menu` in authentication or account panels where quick access to\nsign-in, profile, or account actions is needed. The `user-sign-in` type is\nbest for fast re-auth flows; `loading-sign-in` is for pending auth states.\n\n### Properties and Configuration\n- `type` (`ObcUserMenuType`): Controls the layout state. Defaults to `sign-in`.\n- `size` (`ObcUserMenuSize`): Controls the overall size. Defaults to `regular`.\n- `hasRecentlySignedIn` (`boolean`): Toggles the recent users section.\n Defaults to `false`.\n- `showUsername` (`boolean`): Toggles the username field. Defaults to `true`.\n- `showPassword` (`boolean`): Toggles the password field. Defaults to `true`.\n- `username` (`string`): Current username value for sign-in layouts.\n- `password` (`string`): Current password value for sign-in layouts.\n- `usernameError` (`string`): Error message for the username field.\n- `passwordError` (`string`): Error message for the password field.\n- `userInitials` (`string`): Initials for the primary user profile.\n- `userLabel` (`string`): Label for the primary user profile.\n- `recentUsers` (`ObcUserMenuUser[]`): List of recent users shown in the\n \"Recently signed in\" section. Empty renders no section.\n- `signedInActions` (`ObcUserMenuSignedInAction[]`): Actions shown in the\n signed-in navigation list. Empty renders no actions.\n- `primaryActionId` (`string`): Id of the action promoted to a button in the\n small signed-in layout.\n\n### Events\n- `sign-in-click` – Fired when a sign-in button is clicked.\n- `sign-out-click` – Fired when the sign-out button is clicked.\n- `signed-in-action-click` – Fired when a signed-in action is clicked.\n- `recent-user-click` – Fired when a recent user button is clicked.\n\n### Slots\n- `signed-in-action-icon-{id}`: Optional icon for a signed-in action. The\n `{id}` is the normalized action id.\n\n### Example\n```html\n<obc-user-menu\n type=\"user-sign-in\"\n size=\"small\"\n hasRecentlySignedIn=\"false\"\n userInitials=\"JD\"\n userLabel=\"John Doe\"\n></obc-user-menu>\n```",
|
|
84853
84853
|
"name": "ObcUserMenu",
|
|
84854
84854
|
"slots": [
|
|
84855
84855
|
{
|
|
@@ -84889,19 +84889,39 @@
|
|
|
84889
84889
|
},
|
|
84890
84890
|
{
|
|
84891
84891
|
"kind": "field",
|
|
84892
|
-
"name": "
|
|
84892
|
+
"name": "showUsername",
|
|
84893
84893
|
"type": {
|
|
84894
|
-
"text": "
|
|
84894
|
+
"text": "boolean"
|
|
84895
84895
|
},
|
|
84896
|
-
"default": "
|
|
84897
|
-
"description": "
|
|
84898
|
-
"attribute": "username",
|
|
84896
|
+
"default": "true",
|
|
84897
|
+
"description": "Controls the visibility of the username field.\n\nAvailable when `type==signIn`.",
|
|
84899
84898
|
"availableWhen": "type==signIn",
|
|
84900
84899
|
"availableWhenIf": {
|
|
84901
84900
|
"arg": "type",
|
|
84902
84901
|
"eq": "sign-in"
|
|
84903
84902
|
}
|
|
84904
84903
|
},
|
|
84904
|
+
{
|
|
84905
|
+
"kind": "field",
|
|
84906
|
+
"name": "username",
|
|
84907
|
+
"type": {
|
|
84908
|
+
"text": "string"
|
|
84909
|
+
},
|
|
84910
|
+
"default": "''",
|
|
84911
|
+
"description": "Current username value for sign-in layouts.\n\nAvailable when `showUsername==true && type==signIn`.",
|
|
84912
|
+
"attribute": "username",
|
|
84913
|
+
"availableWhen": "showUsername==true && type==signIn"
|
|
84914
|
+
},
|
|
84915
|
+
{
|
|
84916
|
+
"kind": "field",
|
|
84917
|
+
"name": "showPassword",
|
|
84918
|
+
"type": {
|
|
84919
|
+
"text": "boolean"
|
|
84920
|
+
},
|
|
84921
|
+
"default": "true",
|
|
84922
|
+
"description": "Controls the visibility of the password field.\n\nAvailable when `type in [signIn, userSignIn]`.",
|
|
84923
|
+
"availableWhen": "type in [signIn, userSignIn]"
|
|
84924
|
+
},
|
|
84905
84925
|
{
|
|
84906
84926
|
"kind": "field",
|
|
84907
84927
|
"name": "password",
|
|
@@ -84909,9 +84929,9 @@
|
|
|
84909
84929
|
"text": "string"
|
|
84910
84930
|
},
|
|
84911
84931
|
"default": "''",
|
|
84912
|
-
"description": "Current password value for sign-in layouts.\n\nAvailable when `type in [signIn, userSignIn]`.",
|
|
84932
|
+
"description": "Current password value for sign-in layouts.\n\nAvailable when `showPassword==true && type in [signIn, userSignIn]`.",
|
|
84913
84933
|
"attribute": "password",
|
|
84914
|
-
"availableWhen": "type in [signIn, userSignIn]"
|
|
84934
|
+
"availableWhen": "showPassword==true && type in [signIn, userSignIn]"
|
|
84915
84935
|
},
|
|
84916
84936
|
{
|
|
84917
84937
|
"kind": "field",
|
|
@@ -85231,7 +85251,7 @@
|
|
|
85231
85251
|
{
|
|
85232
85252
|
"name": "sign-in-click",
|
|
85233
85253
|
"type": {
|
|
85234
|
-
"text": "CustomEvent<{username
|
|
85254
|
+
"text": "CustomEvent<{username?: string, password?: string}>"
|
|
85235
85255
|
},
|
|
85236
85256
|
"description": "Fired when a sign-in button is clicked."
|
|
85237
85257
|
},
|
|
@@ -85275,7 +85295,7 @@
|
|
|
85275
85295
|
"text": "string"
|
|
85276
85296
|
},
|
|
85277
85297
|
"default": "''",
|
|
85278
|
-
"description": "Current username value for sign-in layouts.\n\nAvailable when `type==signIn`.",
|
|
85298
|
+
"description": "Current username value for sign-in layouts.\n\nAvailable when `showUsername==true && type==signIn`.",
|
|
85279
85299
|
"fieldName": "username"
|
|
85280
85300
|
},
|
|
85281
85301
|
{
|
|
@@ -85284,7 +85304,7 @@
|
|
|
85284
85304
|
"text": "string"
|
|
85285
85305
|
},
|
|
85286
85306
|
"default": "''",
|
|
85287
|
-
"description": "Current password value for sign-in layouts.\n\nAvailable when `type in [signIn, userSignIn]`.",
|
|
85307
|
+
"description": "Current password value for sign-in layouts.\n\nAvailable when `showPassword==true && type in [signIn, userSignIn]`.",
|
|
85288
85308
|
"fieldName": "password"
|
|
85289
85309
|
},
|
|
85290
85310
|
{
|
|
@@ -65,6 +65,10 @@ const componentStyle = css`* {
|
|
|
65
65
|
calc(var(--app-components-user-menu-padding-horizontal) * 2);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
.signin-only:is(.card .login-container) {
|
|
69
|
+
padding-bottom: var(--app-components-user-menu-padding-vertical);
|
|
70
|
+
}
|
|
71
|
+
|
|
68
72
|
.card.size-small.type-sign-in .login-container,.card.size-small.type-user-sign-in .login-container {
|
|
69
73
|
padding-bottom: var(--app-components-user-menu-padding-vertical);
|
|
70
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-menu.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user-menu.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -52,6 +52,8 @@ export type ObcUserMenuSignedInAction = {
|
|
|
52
52
|
* - `size` (`ObcUserMenuSize`): Controls the overall size. Defaults to `regular`.
|
|
53
53
|
* - `hasRecentlySignedIn` (`boolean`): Toggles the recent users section.
|
|
54
54
|
* Defaults to `false`.
|
|
55
|
+
* - `showUsername` (`boolean`): Toggles the username field. Defaults to `true`.
|
|
56
|
+
* - `showPassword` (`boolean`): Toggles the password field. Defaults to `true`.
|
|
55
57
|
* - `username` (`string`): Current username value for sign-in layouts.
|
|
56
58
|
* - `password` (`string`): Current password value for sign-in layouts.
|
|
57
59
|
* - `usernameError` (`string`): Error message for the username field.
|
|
@@ -91,9 +93,9 @@ export type ObcUserMenuSignedInAction = {
|
|
|
91
93
|
* @property hasRecentlySignedIn - Toggles the "Recently signed in" section visibility.
|
|
92
94
|
* @availableWhen hasRecentlySignedIn type in [signIn, userSignIn]
|
|
93
95
|
* @property username - Current username value for sign-in layouts.
|
|
94
|
-
* @availableWhen username type==signIn
|
|
96
|
+
* @availableWhen username showUsername==true && type==signIn
|
|
95
97
|
* @property password - Current password value for sign-in layouts.
|
|
96
|
-
* @availableWhen password type in [signIn, userSignIn]
|
|
98
|
+
* @availableWhen password showPassword==true && type in [signIn, userSignIn]
|
|
97
99
|
* @property usernameError - Error message for the username field.
|
|
98
100
|
* @availableWhen usernameError type==signIn
|
|
99
101
|
* @property passwordError - Error message for the password field.
|
|
@@ -105,10 +107,14 @@ export type ObcUserMenuSignedInAction = {
|
|
|
105
107
|
* @property recentUsers - Recent users for the "Recently signed in" section.
|
|
106
108
|
* @property signedInActions - Actions shown in the signed-in navigation list.
|
|
107
109
|
* @availableWhen signedInActions type==signedIn
|
|
110
|
+
* @property showUsername - Controls the visibility of the username field.
|
|
111
|
+
* @availableWhen showUsername type==signIn
|
|
112
|
+
* @property showPassword - Controls the visibility of the password field.
|
|
113
|
+
* @availableWhen showPassword type in [signIn, userSignIn]
|
|
108
114
|
* @property primaryActionId - Id of the action promoted to a button in the small signed-in layout.
|
|
109
115
|
* @availableWhen primaryActionId type==signedIn && size==small
|
|
110
116
|
* @slot signed-in-action-icon-<id> - Optional icon for a signed-in action, one per action; `<id>` is the normalized action id (shown in the `signed-in` type).
|
|
111
|
-
* @fires {CustomEvent<{username
|
|
117
|
+
* @fires {CustomEvent<{username?: string, password?: string}>} sign-in-click - Fired when a sign-in button is clicked.
|
|
112
118
|
* @fires {CustomEvent<void>} sign-out-click - Fired when the sign-out button is clicked.
|
|
113
119
|
* @fires {CustomEvent<{id: string, label: string}>} signed-in-action-click - Fired when a signed-in action is clicked.
|
|
114
120
|
* @fires {CustomEvent<{initials: string, label: string}>} recent-user-click - Fired when a recent user button is clicked.
|
|
@@ -126,16 +132,28 @@ export declare class ObcUserMenu extends LitElement {
|
|
|
126
132
|
*/
|
|
127
133
|
hasRecentlySignedIn: boolean;
|
|
128
134
|
/**
|
|
129
|
-
*
|
|
135
|
+
* Controls the visibility of the username field.
|
|
130
136
|
*
|
|
131
137
|
* Available when `type==signIn`.
|
|
132
138
|
*/
|
|
139
|
+
showUsername: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Current username value for sign-in layouts.
|
|
142
|
+
*
|
|
143
|
+
* Available when `showUsername==true && type==signIn`.
|
|
144
|
+
*/
|
|
133
145
|
username: string;
|
|
134
146
|
/**
|
|
135
|
-
*
|
|
147
|
+
* Controls the visibility of the password field.
|
|
136
148
|
*
|
|
137
149
|
* Available when `type in [signIn, userSignIn]`.
|
|
138
150
|
*/
|
|
151
|
+
showPassword: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Current password value for sign-in layouts.
|
|
154
|
+
*
|
|
155
|
+
* Available when `showPassword==true && type in [signIn, userSignIn]`.
|
|
156
|
+
*/
|
|
139
157
|
password: string;
|
|
140
158
|
/**
|
|
141
159
|
* Error message for the username field.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-menu.d.ts","sourceRoot":"","sources":["../../../src/components/user-menu/user-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,cAAc,EAA2B,MAAM,KAAK,CAAC;AAKzE,OAAO,yCAAyC,CAAC;AACjD,OAAO,qBAAqB,CAAC;AAC7B,OAAO,+BAA+B,CAAC;AACvC,OAAO,iCAAiC,CAAC;AACzC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,0BAA0B,CAAC;AAalC,oBAAY,eAAe;IACzB,MAAM,YAAY;IAClB,UAAU,iBAAiB;IAC3B,aAAa,oBAAoB;IACjC,QAAQ,cAAc;CACvB;AAED,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"user-menu.d.ts","sourceRoot":"","sources":["../../../src/components/user-menu/user-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,cAAc,EAA2B,MAAM,KAAK,CAAC;AAKzE,OAAO,yCAAyC,CAAC;AACjD,OAAO,qBAAqB,CAAC;AAC7B,OAAO,+BAA+B,CAAC;AACvC,OAAO,iCAAiC,CAAC;AACzC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,0BAA0B,CAAC;AAalC,oBAAY,eAAe;IACzB,MAAM,YAAY;IAClB,UAAU,iBAAiB;IAC3B,aAAa,oBAAoB;IACjC,QAAQ,cAAc;CACvB;AAED,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FG;AACH,qBAEa,WAAY,SAAQ,UAAU;IACf,IAAI,EAAE,eAAe,CAA0B;IAE/C,IAAI,EAAE,eAAe,CAA2B;IAG1E,mBAAmB,UAAS;IAG5B,YAAY,UAAQ;IAEM,QAAQ,SAAM;IAGxC,YAAY,UAAQ;IAEM,QAAQ,SAAM;IAEd,aAAa,SAAM;IAEnB,aAAa,SAAM;IAEnB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,EAAE,MAAM,CAAC;IAG7C,WAAW,EAAE,eAAe,EAAE,CAAM;IAGpC,eAAe,EAAE,yBAAyB,EAAE,CAAM;IAExB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEnD,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,YAAY;IAoDpB,OAAO,CAAC,iBAAiB;IAqDzB,OAAO,CAAC,gBAAgB;IAgDxB,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,wBAAwB;IAiBhC,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,mBAAmB;IAkClB,MAAM;IAwCf,OAAgB,MAAM,0BAA6B;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
|
|
@@ -41,7 +41,9 @@ let ObcUserMenu = class extends LitElement {
|
|
|
41
41
|
this.type = "sign-in";
|
|
42
42
|
this.size = "regular";
|
|
43
43
|
this.hasRecentlySignedIn = false;
|
|
44
|
+
this.showUsername = true;
|
|
44
45
|
this.username = "";
|
|
46
|
+
this.showPassword = true;
|
|
45
47
|
this.password = "";
|
|
46
48
|
this.usernameError = "";
|
|
47
49
|
this.passwordError = "";
|
|
@@ -167,12 +169,13 @@ let ObcUserMenu = class extends LitElement {
|
|
|
167
169
|
}
|
|
168
170
|
validateSignIn() {
|
|
169
171
|
let valid = true;
|
|
170
|
-
const needsUsername = this.type === "sign-in";
|
|
172
|
+
const needsUsername = this.type === "sign-in" && this.showUsername;
|
|
173
|
+
const needsPassword = this.showPassword;
|
|
171
174
|
if (needsUsername && !this.username) {
|
|
172
175
|
this.usernameError = msg("Username is required");
|
|
173
176
|
valid = false;
|
|
174
177
|
}
|
|
175
|
-
if (!this.password) {
|
|
178
|
+
if (needsPassword && !this.password) {
|
|
176
179
|
this.passwordError = msg("Password is required");
|
|
177
180
|
valid = false;
|
|
178
181
|
}
|
|
@@ -184,7 +187,10 @@ let ObcUserMenu = class extends LitElement {
|
|
|
184
187
|
}
|
|
185
188
|
this.dispatchEvent(
|
|
186
189
|
new CustomEvent("sign-in-click", {
|
|
187
|
-
detail: {
|
|
190
|
+
detail: {
|
|
191
|
+
username: this.showUsername ? this.username : void 0,
|
|
192
|
+
password: this.showPassword ? this.password : void 0
|
|
193
|
+
}
|
|
188
194
|
})
|
|
189
195
|
);
|
|
190
196
|
}
|
|
@@ -196,21 +202,26 @@ let ObcUserMenu = class extends LitElement {
|
|
|
196
202
|
<div class="title-container">
|
|
197
203
|
<h3 class="title">${msg("Sign in")}</h3>
|
|
198
204
|
</div>
|
|
199
|
-
<div
|
|
200
|
-
|
|
205
|
+
<div
|
|
206
|
+
class=${classMap({
|
|
207
|
+
"login-container": true,
|
|
208
|
+
"signin-only": !this.showRecentUsers
|
|
209
|
+
})}
|
|
210
|
+
>
|
|
211
|
+
${this.showUsername ? this.renderTextInput(
|
|
201
212
|
msg("Username"),
|
|
202
213
|
HTMLInputTypeAttribute.Text,
|
|
203
214
|
this.username,
|
|
204
215
|
this.handleUsernameInput.bind(this),
|
|
205
216
|
this.usernameError
|
|
206
|
-
)}
|
|
207
|
-
${this.renderTextInput(
|
|
217
|
+
) : nothing}
|
|
218
|
+
${this.showPassword ? this.renderTextInput(
|
|
208
219
|
msg("Password"),
|
|
209
220
|
HTMLInputTypeAttribute.Password,
|
|
210
221
|
this.password,
|
|
211
222
|
this.handlePasswordInput.bind(this),
|
|
212
223
|
this.passwordError
|
|
213
|
-
)}
|
|
224
|
+
) : nothing}
|
|
214
225
|
<obc-button
|
|
215
226
|
variant=${ButtonVariant.raised}
|
|
216
227
|
fullWidth
|
|
@@ -236,21 +247,26 @@ let ObcUserMenu = class extends LitElement {
|
|
|
236
247
|
<div class="title-container">
|
|
237
248
|
<h3 class="title">${msg("Sign in")}</h3>
|
|
238
249
|
</div>
|
|
239
|
-
<div
|
|
240
|
-
|
|
250
|
+
<div
|
|
251
|
+
class=${classMap({
|
|
252
|
+
"login-container": true,
|
|
253
|
+
"signin-only": !this.showRecentUsers
|
|
254
|
+
})}
|
|
255
|
+
>
|
|
256
|
+
${this.showUsername ? this.renderTextInput(
|
|
241
257
|
msg("Username"),
|
|
242
258
|
HTMLInputTypeAttribute.Text,
|
|
243
259
|
this.username,
|
|
244
260
|
this.handleUsernameInput.bind(this),
|
|
245
261
|
this.usernameError
|
|
246
|
-
)}
|
|
247
|
-
${this.renderTextInput(
|
|
262
|
+
) : nothing}
|
|
263
|
+
${this.showPassword ? this.renderTextInput(
|
|
248
264
|
msg("Password"),
|
|
249
265
|
HTMLInputTypeAttribute.Password,
|
|
250
266
|
this.password,
|
|
251
267
|
this.handlePasswordInput.bind(this),
|
|
252
268
|
this.passwordError
|
|
253
|
-
)}
|
|
269
|
+
) : nothing}
|
|
254
270
|
<obc-button
|
|
255
271
|
variant=${ButtonVariant.raised}
|
|
256
272
|
fullWidth
|
|
@@ -277,18 +293,23 @@ let ObcUserMenu = class extends LitElement {
|
|
|
277
293
|
<div class="title-container">
|
|
278
294
|
<h3 class="title">${msg("Sign in")}</h3>
|
|
279
295
|
</div>
|
|
280
|
-
<div
|
|
296
|
+
<div
|
|
297
|
+
class=${classMap({
|
|
298
|
+
"login-container": true,
|
|
299
|
+
"signin-only": !this.showRecentUsers
|
|
300
|
+
})}
|
|
301
|
+
>
|
|
281
302
|
<div class="user-primary">
|
|
282
303
|
${this.renderUserProfile("vertical", "large")}
|
|
283
304
|
</div>
|
|
284
305
|
<div class="fields">
|
|
285
|
-
${this.renderTextInput(
|
|
306
|
+
${this.showPassword ? this.renderTextInput(
|
|
286
307
|
msg("Password"),
|
|
287
308
|
HTMLInputTypeAttribute.Password,
|
|
288
309
|
this.password,
|
|
289
310
|
this.handlePasswordInput.bind(this),
|
|
290
311
|
this.passwordError
|
|
291
|
-
)}
|
|
312
|
+
) : nothing}
|
|
292
313
|
<obc-button
|
|
293
314
|
variant=${ButtonVariant.raised}
|
|
294
315
|
fullWidth
|
|
@@ -318,14 +339,19 @@ let ObcUserMenu = class extends LitElement {
|
|
|
318
339
|
<div class="user-container">
|
|
319
340
|
${this.renderUserProfile("horizontal", "regular")}
|
|
320
341
|
</div>
|
|
321
|
-
<div
|
|
322
|
-
|
|
342
|
+
<div
|
|
343
|
+
class=${classMap({
|
|
344
|
+
"login-container": true,
|
|
345
|
+
"signin-only": !this.showRecentUsers
|
|
346
|
+
})}
|
|
347
|
+
>
|
|
348
|
+
${this.showPassword ? this.renderTextInput(
|
|
323
349
|
msg("Password"),
|
|
324
350
|
HTMLInputTypeAttribute.Password,
|
|
325
351
|
this.password,
|
|
326
352
|
this.handlePasswordInput.bind(this),
|
|
327
353
|
this.passwordError
|
|
328
|
-
)}
|
|
354
|
+
) : nothing}
|
|
329
355
|
<obc-button
|
|
330
356
|
variant=${ButtonVariant.raised}
|
|
331
357
|
fullWidth
|
|
@@ -487,9 +513,15 @@ __decorateClass([
|
|
|
487
513
|
__decorateClass([
|
|
488
514
|
property({ type: Boolean })
|
|
489
515
|
], ObcUserMenu.prototype, "hasRecentlySignedIn", 2);
|
|
516
|
+
__decorateClass([
|
|
517
|
+
property({ type: Boolean, attribute: false })
|
|
518
|
+
], ObcUserMenu.prototype, "showUsername", 2);
|
|
490
519
|
__decorateClass([
|
|
491
520
|
property({ type: String })
|
|
492
521
|
], ObcUserMenu.prototype, "username", 2);
|
|
522
|
+
__decorateClass([
|
|
523
|
+
property({ type: Boolean, attribute: false })
|
|
524
|
+
], ObcUserMenu.prototype, "showPassword", 2);
|
|
493
525
|
__decorateClass([
|
|
494
526
|
property({ type: String })
|
|
495
527
|
], ObcUserMenu.prototype, "password", 2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-menu.js","sources":["../../../src/components/user-menu/user-menu.ts"],"sourcesContent":["import {LitElement, TemplateResult, html, nothing, unsafeCSS} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './user-menu.css?inline';\nimport '../text-input-field/text-input-field.js';\nimport '../button/button.js';\nimport '../user-button/user-button.js';\nimport '../progress-bar/progress-bar.js';\nimport '../navigation-item/navigation-item.js';\nimport '../../icons/icon-calendar-google.js';\nimport '../../icons/icon-log-open-google.js';\nimport '../../icons/icon-settings-iec.js';\nimport '../../icons/icon-user.js';\nimport {\n HTMLInputTypeAttribute,\n ObcTextInputFieldTextAlign,\n} from '../text-input-field/text-input-field.js';\nimport {ButtonVariant} from '../button/button.js';\nimport {\n ProgressBarMode,\n ProgressBarType,\n} from '../progress-bar/progress-bar.js';\nimport {Size, StyleType, Variant} from '../user-button/user-button.js';\nimport {localized, msg} from '@lit/localize';\n\nexport enum ObcUserMenuType {\n signIn = 'sign-in',\n userSignIn = 'user-sign-in',\n loadingSignIn = 'loading-sign-in',\n signedIn = 'signed-in',\n}\n\nexport enum ObcUserMenuSize {\n regular = 'regular',\n small = 'small',\n}\n\nexport type ObcUserMenuUser = {\n initials: string;\n label: string;\n};\n\nexport type ObcUserMenuSignedInAction = {\n id: string;\n label: string;\n};\n\n/**\n * `<obc-user-menu>` – A user menu component with sign-in and signed-in layouts.\n *\n * Provides multiple layouts for authentication and account access states, including\n * sign-in forms, user-specific sign-in, loading states, and signed-in navigation.\n *\n * ### Features\n * - **Multiple States:** Supports sign-in, user sign-in, loading, and signed-in layouts.\n * - **Size Options:** Regular and small sizes for compact layouts.\n * - **Recent Users:** Optional \"Recently signed in\" section for quick access.\n * - **Navigation Actions:** Signed-in state lists the actions it is given.\n *\n * ### Variants\n * - `type`: `sign-in`, `user-sign-in`, `loading-sign-in`, `signed-in`\n * - `size`: `regular`, `small`\n *\n * ### Usage Guidelines\n * Use `obc-user-menu` in authentication or account panels where quick access to\n * sign-in, profile, or account actions is needed. The `user-sign-in` type is\n * best for fast re-auth flows; `loading-sign-in` is for pending auth states.\n *\n * ### Properties and Configuration\n * - `type` (`ObcUserMenuType`): Controls the layout state. Defaults to `sign-in`.\n * - `size` (`ObcUserMenuSize`): Controls the overall size. Defaults to `regular`.\n * - `hasRecentlySignedIn` (`boolean`): Toggles the recent users section.\n * Defaults to `false`.\n * - `username` (`string`): Current username value for sign-in layouts.\n * - `password` (`string`): Current password value for sign-in layouts.\n * - `usernameError` (`string`): Error message for the username field.\n * - `passwordError` (`string`): Error message for the password field.\n * - `userInitials` (`string`): Initials for the primary user profile.\n * - `userLabel` (`string`): Label for the primary user profile.\n * - `recentUsers` (`ObcUserMenuUser[]`): List of recent users shown in the\n * \"Recently signed in\" section. Empty renders no section.\n * - `signedInActions` (`ObcUserMenuSignedInAction[]`): Actions shown in the\n * signed-in navigation list. Empty renders no actions.\n * - `primaryActionId` (`string`): Id of the action promoted to a button in the\n * small signed-in layout.\n *\n * ### Events\n * - `sign-in-click` – Fired when a sign-in button is clicked.\n * - `sign-out-click` – Fired when the sign-out button is clicked.\n * - `signed-in-action-click` – Fired when a signed-in action is clicked.\n * - `recent-user-click` – Fired when a recent user button is clicked.\n *\n * ### Slots\n * - `signed-in-action-icon-{id}`: Optional icon for a signed-in action. The\n * `{id}` is the normalized action id.\n *\n * ### Example\n * ```html\n * <obc-user-menu\n * type=\"user-sign-in\"\n * size=\"small\"\n * hasRecentlySignedIn=\"false\"\n * userInitials=\"JD\"\n * userLabel=\"John Doe\"\n * ></obc-user-menu>\n * ```\n *\n * @property type - Controls the visual layout of the user menu.\n * @property size - Controls the overall size of the user menu.\n * @property hasRecentlySignedIn - Toggles the \"Recently signed in\" section visibility.\n * @availableWhen hasRecentlySignedIn type in [signIn, userSignIn]\n * @property username - Current username value for sign-in layouts.\n * @availableWhen username type==signIn\n * @property password - Current password value for sign-in layouts.\n * @availableWhen password type in [signIn, userSignIn]\n * @property usernameError - Error message for the username field.\n * @availableWhen usernameError type==signIn\n * @property passwordError - Error message for the password field.\n * @availableWhen passwordError type in [signIn, userSignIn]\n * @property userInitials - Initials for the primary user profile.\n * @availableWhen userInitials type!=signIn\n * @property userLabel - Label for the primary user profile.\n * @availableWhen userLabel type!=signIn\n * @property recentUsers - Recent users for the \"Recently signed in\" section.\n * @property signedInActions - Actions shown in the signed-in navigation list.\n * @availableWhen signedInActions type==signedIn\n * @property primaryActionId - Id of the action promoted to a button in the small signed-in layout.\n * @availableWhen primaryActionId type==signedIn && size==small\n * @slot signed-in-action-icon-<id> - Optional icon for a signed-in action, one per action; `<id>` is the normalized action id (shown in the `signed-in` type).\n * @fires {CustomEvent<{username: string, password: string}>} sign-in-click - Fired when a sign-in button is clicked.\n * @fires {CustomEvent<void>} sign-out-click - Fired when the sign-out button is clicked.\n * @fires {CustomEvent<{id: string, label: string}>} signed-in-action-click - Fired when a signed-in action is clicked.\n * @fires {CustomEvent<{initials: string, label: string}>} recent-user-click - Fired when a recent user button is clicked.\n * @stable\n */\n@customElement('obc-user-menu')\n@localized()\nexport class ObcUserMenu extends LitElement {\n @property({type: String}) type: ObcUserMenuType = ObcUserMenuType.signIn;\n\n @property({type: String}) size: ObcUserMenuSize = ObcUserMenuSize.regular;\n\n @property({type: Boolean})\n hasRecentlySignedIn = false;\n\n @property({type: String}) username = '';\n\n @property({type: String}) password = '';\n\n @property({type: String}) usernameError = '';\n\n @property({type: String}) passwordError = '';\n\n @property({type: String}) userInitials?: string;\n\n @property({type: String}) userLabel?: string;\n\n @property({type: Array, attribute: false})\n recentUsers: ObcUserMenuUser[] = [];\n\n @property({type: Array, attribute: false})\n signedInActions: ObcUserMenuSignedInAction[] = [];\n\n @property({type: String}) primaryActionId?: string;\n\n private get showRecentUsers() {\n return this.hasRecentlySignedIn && this.recentUsers.length > 0;\n }\n\n private renderTextInput(\n placeholder: string,\n type: HTMLInputTypeAttribute = HTMLInputTypeAttribute.Text,\n value = '',\n onInput?: (event: Event) => void,\n errorText = ''\n ) {\n const isPassword = type === HTMLInputTypeAttribute.Password;\n return html`\n <obc-text-input-field\n .placeholder=${placeholder}\n .type=${type}\n .textAlign=${ObcTextInputFieldTextAlign.Left}\n .value=${value}\n .error=${Boolean(errorText)}\n .errorText=${errorText}\n .required=${true}\n .hasClearButton=${!isPassword}\n @input=${onInput}\n >\n </obc-text-input-field>\n `;\n }\n\n private renderUserButtons(count: number, isLarge: boolean) {\n const size = isLarge ? Size.large : Size.regular;\n const users = this.recentUsers.slice(0, count);\n return html`\n <div\n class=${classMap({\n users: true,\n large: isLarge,\n single: users.length === 1,\n })}\n >\n ${users.map(\n (user) => html`\n <obc-user-button\n .variant=${Variant.initials}\n .styleType=${StyleType.normal}\n .size=${size}\n .initials=${user.initials}\n .label=${user.label}\n @click=${() => this.handleRecentUserClick(user)}\n ></obc-user-button>\n `\n )}\n </div>\n `;\n }\n\n private renderUserProfile(\n layout: 'vertical' | 'horizontal',\n size: 'large' | 'regular'\n ) {\n if (!this.userInitials && !this.userLabel) {\n return nothing;\n }\n const userButtonSize = size === 'large' ? Size.large : Size.regular;\n return html`\n <div\n class=${classMap({\n 'user-profile': true,\n [layout]: true,\n })}\n >\n <obc-user-button\n class=${classMap({\n 'user-avatar': true,\n [`size-${size}`]: true,\n })}\n .variant=${Variant.initials}\n .styleType=${StyleType.normal}\n .size=${userButtonSize}\n .initials=${this.userInitials ?? ''}\n .label=${this.userLabel ?? ''}\n ></obc-user-button>\n </div>\n `;\n }\n\n private getSignedInActionIcon(actionId: string) {\n switch (actionId) {\n case 'calendar':\n return html`<obi-calendar-google></obi-calendar-google>`;\n case 'log':\n return html`<obi-log-open-google></obi-log-open-google>`;\n case 'preferences':\n return html`<obi-settings-iec></obi-settings-iec>`;\n case 'user-account':\n return html`<obi-user></obi-user>`;\n default:\n return nothing;\n }\n }\n\n private normalizeActionId(actionId: string) {\n return actionId\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-');\n }\n\n private handleSignedInActionClick(action: ObcUserMenuSignedInAction) {\n this.dispatchEvent(\n new CustomEvent('signed-in-action-click', {\n detail: {id: action.id, label: action.label},\n })\n );\n }\n\n private handleRecentUserClick(user: ObcUserMenuUser) {\n this.dispatchEvent(\n new CustomEvent('recent-user-click', {\n detail: {initials: user.initials, label: user.label},\n })\n );\n }\n\n private handleUsernameInput(event: Event) {\n const target = event.target as {value?: string};\n this.username = target.value ?? '';\n if (this.username) {\n this.usernameError = '';\n }\n }\n\n private handlePasswordInput(event: Event) {\n const target = event.target as {value?: string};\n this.password = target.value ?? '';\n if (this.password) {\n this.passwordError = '';\n }\n }\n\n private validateSignIn() {\n let valid = true;\n const needsUsername = this.type === ObcUserMenuType.signIn;\n\n if (needsUsername && !this.username) {\n this.usernameError = msg('Username is required');\n valid = false;\n }\n\n if (!this.password) {\n this.passwordError = msg('Password is required');\n valid = false;\n }\n\n return valid;\n }\n\n private handleSignInClick() {\n if (!this.validateSignIn()) {\n return;\n }\n this.dispatchEvent(\n new CustomEvent('sign-in-click', {\n detail: {username: this.username, password: this.password},\n })\n );\n }\n\n private handleSignOutClick() {\n this.dispatchEvent(new CustomEvent('sign-out-click'));\n }\n\n private renderSignIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"login-container\">\n ${this.renderTextInput(\n msg('Username'),\n HTMLInputTypeAttribute.Text,\n this.username,\n this.handleUsernameInput.bind(this),\n this.usernameError\n )}\n ${this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"recent-container\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recently signed in')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, true)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderSignInSmall() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"login-container\">\n ${this.renderTextInput(\n msg('Username'),\n HTMLInputTypeAttribute.Text,\n this.username,\n this.handleUsernameInput.bind(this),\n this.usernameError\n )}\n ${this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"divider\" aria-hidden=\"true\"></div>\n <div class=\"recent-container recent\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recent')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, false)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderUserSignIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"login-container\">\n <div class=\"user-primary\">\n ${this.renderUserProfile('vertical', 'large')}\n </div>\n <div class=\"fields\">\n ${this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"recent-container\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recently signed in')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, true)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderUserSignInSmall() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"user-container\">\n ${this.renderUserProfile('horizontal', 'regular')}\n </div>\n <div class=\"login-container\">\n ${this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"divider\" aria-hidden=\"true\"></div>\n <div class=\"recent-container recent\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recent')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, false)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderLoadingSignIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"user-primary loading\">\n ${this.renderUserProfile('vertical', 'large')}\n <obc-progress-bar\n class=\"progress\"\n type=${ProgressBarType.linear}\n mode=${ProgressBarMode.indeterminate}\n .showValue=${false}\n ></obc-progress-bar>\n </div>\n `;\n }\n\n private renderLoadingSignInSmall() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"user-primary loading\">\n ${this.renderUserProfile('horizontal', 'regular')}\n <obc-progress-bar\n class=\"progress\"\n type=${ProgressBarType.linear}\n mode=${ProgressBarMode.indeterminate}\n .showValue=${false}\n ></obc-progress-bar>\n </div>\n `;\n }\n\n private renderSignedIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('User')}</h3>\n </div>\n <div class=\"user-primary signed-in\">\n ${this.renderUserProfile('vertical', 'large')}\n </div>\n <div class=\"divider\" aria-hidden=\"true\"></div>\n ${this.signedInActions.length\n ? html`\n <div class=\"nav-container\">\n ${this.signedInActions.map((action) => {\n const normalizedId = this.normalizeActionId(action.id);\n return html`\n <obc-navigation-item\n .label=${action.label}\n hasIcon\n @click=${() => this.handleSignedInActionClick(action)}\n >\n <span slot=\"icon\">\n <slot name=\"signed-in-action-icon-${normalizedId}\">\n ${this.getSignedInActionIcon(normalizedId)}\n </slot>\n </span>\n </obc-navigation-item>\n `;\n })}\n </div>\n `\n : nothing}\n <div class=\"button-container\">\n <obc-button\n variant=${ButtonVariant.normal}\n fullWidth\n @click=${this.handleSignOutClick}\n >\n ${msg('Sign out')}\n </obc-button>\n </div>\n `;\n }\n\n private renderSignedInSmall() {\n const primaryAction = this.signedInActions.find(\n (action) => action.id === this.primaryActionId\n );\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('User')}</h3>\n </div>\n <div class=\"user-container\">\n ${this.renderUserProfile('horizontal', 'regular')}\n </div>\n <div class=\"button-container\">\n ${primaryAction\n ? html`\n <obc-button\n variant=${ButtonVariant.normal}\n fullWidth\n @click=${() => this.handleSignedInActionClick(primaryAction)}\n >\n ${primaryAction.label}\n </obc-button>\n `\n : nothing}\n <obc-button\n variant=${ButtonVariant.normal}\n fullWidth\n @click=${this.handleSignOutClick}\n >\n ${msg('Sign out')}\n </obc-button>\n </div>\n `;\n }\n\n override render() {\n let content: TemplateResult | symbol = nothing;\n if (this.type === ObcUserMenuType.signIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderSignInSmall()\n : this.renderSignIn();\n }\n if (this.type === ObcUserMenuType.userSignIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderUserSignInSmall()\n : this.renderUserSignIn();\n }\n if (this.type === ObcUserMenuType.loadingSignIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderLoadingSignInSmall()\n : this.renderLoadingSignIn();\n }\n if (this.type === ObcUserMenuType.signedIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderSignedInSmall()\n : this.renderSignedIn();\n }\n\n return html`\n <div\n class=${classMap({\n card: true,\n [`size-${this.size}`]: true,\n [`type-${this.type}`]: true,\n })}\n >\n ${content}\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-user-menu': ObcUserMenu;\n }\n}\n"],"names":["ObcUserMenuType","ObcUserMenuSize"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"user-menu.js","sources":["../../../src/components/user-menu/user-menu.ts"],"sourcesContent":["import {LitElement, TemplateResult, html, nothing, unsafeCSS} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './user-menu.css?inline';\nimport '../text-input-field/text-input-field.js';\nimport '../button/button.js';\nimport '../user-button/user-button.js';\nimport '../progress-bar/progress-bar.js';\nimport '../navigation-item/navigation-item.js';\nimport '../../icons/icon-calendar-google.js';\nimport '../../icons/icon-log-open-google.js';\nimport '../../icons/icon-settings-iec.js';\nimport '../../icons/icon-user.js';\nimport {\n HTMLInputTypeAttribute,\n ObcTextInputFieldTextAlign,\n} from '../text-input-field/text-input-field.js';\nimport {ButtonVariant} from '../button/button.js';\nimport {\n ProgressBarMode,\n ProgressBarType,\n} from '../progress-bar/progress-bar.js';\nimport {Size, StyleType, Variant} from '../user-button/user-button.js';\nimport {localized, msg} from '@lit/localize';\n\nexport enum ObcUserMenuType {\n signIn = 'sign-in',\n userSignIn = 'user-sign-in',\n loadingSignIn = 'loading-sign-in',\n signedIn = 'signed-in',\n}\n\nexport enum ObcUserMenuSize {\n regular = 'regular',\n small = 'small',\n}\n\nexport type ObcUserMenuUser = {\n initials: string;\n label: string;\n};\n\nexport type ObcUserMenuSignedInAction = {\n id: string;\n label: string;\n};\n\n/**\n * `<obc-user-menu>` – A user menu component with sign-in and signed-in layouts.\n *\n * Provides multiple layouts for authentication and account access states, including\n * sign-in forms, user-specific sign-in, loading states, and signed-in navigation.\n *\n * ### Features\n * - **Multiple States:** Supports sign-in, user sign-in, loading, and signed-in layouts.\n * - **Size Options:** Regular and small sizes for compact layouts.\n * - **Recent Users:** Optional \"Recently signed in\" section for quick access.\n * - **Navigation Actions:** Signed-in state lists the actions it is given.\n *\n * ### Variants\n * - `type`: `sign-in`, `user-sign-in`, `loading-sign-in`, `signed-in`\n * - `size`: `regular`, `small`\n *\n * ### Usage Guidelines\n * Use `obc-user-menu` in authentication or account panels where quick access to\n * sign-in, profile, or account actions is needed. The `user-sign-in` type is\n * best for fast re-auth flows; `loading-sign-in` is for pending auth states.\n *\n * ### Properties and Configuration\n * - `type` (`ObcUserMenuType`): Controls the layout state. Defaults to `sign-in`.\n * - `size` (`ObcUserMenuSize`): Controls the overall size. Defaults to `regular`.\n * - `hasRecentlySignedIn` (`boolean`): Toggles the recent users section.\n * Defaults to `false`.\n * - `showUsername` (`boolean`): Toggles the username field. Defaults to `true`.\n * - `showPassword` (`boolean`): Toggles the password field. Defaults to `true`.\n * - `username` (`string`): Current username value for sign-in layouts.\n * - `password` (`string`): Current password value for sign-in layouts.\n * - `usernameError` (`string`): Error message for the username field.\n * - `passwordError` (`string`): Error message for the password field.\n * - `userInitials` (`string`): Initials for the primary user profile.\n * - `userLabel` (`string`): Label for the primary user profile.\n * - `recentUsers` (`ObcUserMenuUser[]`): List of recent users shown in the\n * \"Recently signed in\" section. Empty renders no section.\n * - `signedInActions` (`ObcUserMenuSignedInAction[]`): Actions shown in the\n * signed-in navigation list. Empty renders no actions.\n * - `primaryActionId` (`string`): Id of the action promoted to a button in the\n * small signed-in layout.\n *\n * ### Events\n * - `sign-in-click` – Fired when a sign-in button is clicked.\n * - `sign-out-click` – Fired when the sign-out button is clicked.\n * - `signed-in-action-click` – Fired when a signed-in action is clicked.\n * - `recent-user-click` – Fired when a recent user button is clicked.\n *\n * ### Slots\n * - `signed-in-action-icon-{id}`: Optional icon for a signed-in action. The\n * `{id}` is the normalized action id.\n *\n * ### Example\n * ```html\n * <obc-user-menu\n * type=\"user-sign-in\"\n * size=\"small\"\n * hasRecentlySignedIn=\"false\"\n * userInitials=\"JD\"\n * userLabel=\"John Doe\"\n * ></obc-user-menu>\n * ```\n *\n * @property type - Controls the visual layout of the user menu.\n * @property size - Controls the overall size of the user menu.\n * @property hasRecentlySignedIn - Toggles the \"Recently signed in\" section visibility.\n * @availableWhen hasRecentlySignedIn type in [signIn, userSignIn]\n * @property username - Current username value for sign-in layouts.\n * @availableWhen username showUsername==true && type==signIn\n * @property password - Current password value for sign-in layouts.\n * @availableWhen password showPassword==true && type in [signIn, userSignIn]\n * @property usernameError - Error message for the username field.\n * @availableWhen usernameError type==signIn\n * @property passwordError - Error message for the password field.\n * @availableWhen passwordError type in [signIn, userSignIn]\n * @property userInitials - Initials for the primary user profile.\n * @availableWhen userInitials type!=signIn\n * @property userLabel - Label for the primary user profile.\n * @availableWhen userLabel type!=signIn\n * @property recentUsers - Recent users for the \"Recently signed in\" section.\n * @property signedInActions - Actions shown in the signed-in navigation list.\n * @availableWhen signedInActions type==signedIn\n * @property showUsername - Controls the visibility of the username field.\n * @availableWhen showUsername type==signIn\n * @property showPassword - Controls the visibility of the password field.\n * @availableWhen showPassword type in [signIn, userSignIn]\n * @property primaryActionId - Id of the action promoted to a button in the small signed-in layout.\n * @availableWhen primaryActionId type==signedIn && size==small\n * @slot signed-in-action-icon-<id> - Optional icon for a signed-in action, one per action; `<id>` is the normalized action id (shown in the `signed-in` type).\n * @fires {CustomEvent<{username?: string, password?: string}>} sign-in-click - Fired when a sign-in button is clicked.\n * @fires {CustomEvent<void>} sign-out-click - Fired when the sign-out button is clicked.\n * @fires {CustomEvent<{id: string, label: string}>} signed-in-action-click - Fired when a signed-in action is clicked.\n * @fires {CustomEvent<{initials: string, label: string}>} recent-user-click - Fired when a recent user button is clicked.\n * @stable\n */\n@customElement('obc-user-menu')\n@localized()\nexport class ObcUserMenu extends LitElement {\n @property({type: String}) type: ObcUserMenuType = ObcUserMenuType.signIn;\n\n @property({type: String}) size: ObcUserMenuSize = ObcUserMenuSize.regular;\n\n @property({type: Boolean})\n hasRecentlySignedIn = false;\n\n @property({type: Boolean, attribute: false})\n showUsername = true;\n\n @property({type: String}) username = '';\n\n @property({type: Boolean, attribute: false})\n showPassword = true;\n\n @property({type: String}) password = '';\n\n @property({type: String}) usernameError = '';\n\n @property({type: String}) passwordError = '';\n\n @property({type: String}) userInitials?: string;\n\n @property({type: String}) userLabel?: string;\n\n @property({type: Array, attribute: false})\n recentUsers: ObcUserMenuUser[] = [];\n\n @property({type: Array, attribute: false})\n signedInActions: ObcUserMenuSignedInAction[] = [];\n\n @property({type: String}) primaryActionId?: string;\n\n private get showRecentUsers() {\n return this.hasRecentlySignedIn && this.recentUsers.length > 0;\n }\n\n private renderTextInput(\n placeholder: string,\n type: HTMLInputTypeAttribute = HTMLInputTypeAttribute.Text,\n value = '',\n onInput?: (event: Event) => void,\n errorText = ''\n ) {\n const isPassword = type === HTMLInputTypeAttribute.Password;\n return html`\n <obc-text-input-field\n .placeholder=${placeholder}\n .type=${type}\n .textAlign=${ObcTextInputFieldTextAlign.Left}\n .value=${value}\n .error=${Boolean(errorText)}\n .errorText=${errorText}\n .required=${true}\n .hasClearButton=${!isPassword}\n @input=${onInput}\n >\n </obc-text-input-field>\n `;\n }\n\n private renderUserButtons(count: number, isLarge: boolean) {\n const size = isLarge ? Size.large : Size.regular;\n const users = this.recentUsers.slice(0, count);\n return html`\n <div\n class=${classMap({\n users: true,\n large: isLarge,\n single: users.length === 1,\n })}\n >\n ${users.map(\n (user) => html`\n <obc-user-button\n .variant=${Variant.initials}\n .styleType=${StyleType.normal}\n .size=${size}\n .initials=${user.initials}\n .label=${user.label}\n @click=${() => this.handleRecentUserClick(user)}\n ></obc-user-button>\n `\n )}\n </div>\n `;\n }\n\n private renderUserProfile(\n layout: 'vertical' | 'horizontal',\n size: 'large' | 'regular'\n ) {\n if (!this.userInitials && !this.userLabel) {\n return nothing;\n }\n const userButtonSize = size === 'large' ? Size.large : Size.regular;\n return html`\n <div\n class=${classMap({\n 'user-profile': true,\n [layout]: true,\n })}\n >\n <obc-user-button\n class=${classMap({\n 'user-avatar': true,\n [`size-${size}`]: true,\n })}\n .variant=${Variant.initials}\n .styleType=${StyleType.normal}\n .size=${userButtonSize}\n .initials=${this.userInitials ?? ''}\n .label=${this.userLabel ?? ''}\n ></obc-user-button>\n </div>\n `;\n }\n\n private getSignedInActionIcon(actionId: string) {\n switch (actionId) {\n case 'calendar':\n return html`<obi-calendar-google></obi-calendar-google>`;\n case 'log':\n return html`<obi-log-open-google></obi-log-open-google>`;\n case 'preferences':\n return html`<obi-settings-iec></obi-settings-iec>`;\n case 'user-account':\n return html`<obi-user></obi-user>`;\n default:\n return nothing;\n }\n }\n\n private normalizeActionId(actionId: string) {\n return actionId\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-');\n }\n\n private handleSignedInActionClick(action: ObcUserMenuSignedInAction) {\n this.dispatchEvent(\n new CustomEvent('signed-in-action-click', {\n detail: {id: action.id, label: action.label},\n })\n );\n }\n\n private handleRecentUserClick(user: ObcUserMenuUser) {\n this.dispatchEvent(\n new CustomEvent('recent-user-click', {\n detail: {initials: user.initials, label: user.label},\n })\n );\n }\n\n private handleUsernameInput(event: Event) {\n const target = event.target as {value?: string};\n this.username = target.value ?? '';\n if (this.username) {\n this.usernameError = '';\n }\n }\n\n private handlePasswordInput(event: Event) {\n const target = event.target as {value?: string};\n this.password = target.value ?? '';\n if (this.password) {\n this.passwordError = '';\n }\n }\n\n private validateSignIn() {\n let valid = true;\n const needsUsername =\n this.type === ObcUserMenuType.signIn && this.showUsername;\n const needsPassword = this.showPassword;\n\n if (needsUsername && !this.username) {\n this.usernameError = msg('Username is required');\n valid = false;\n }\n\n if (needsPassword && !this.password) {\n this.passwordError = msg('Password is required');\n valid = false;\n }\n\n return valid;\n }\n\n private handleSignInClick() {\n if (!this.validateSignIn()) {\n return;\n }\n this.dispatchEvent(\n new CustomEvent('sign-in-click', {\n detail: {\n username: this.showUsername ? this.username : undefined,\n password: this.showPassword ? this.password : undefined,\n },\n })\n );\n }\n\n private handleSignOutClick() {\n this.dispatchEvent(new CustomEvent('sign-out-click'));\n }\n\n private renderSignIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div\n class=${classMap({\n 'login-container': true,\n 'signin-only': !this.showRecentUsers,\n })}\n >\n ${this.showUsername\n ? this.renderTextInput(\n msg('Username'),\n HTMLInputTypeAttribute.Text,\n this.username,\n this.handleUsernameInput.bind(this),\n this.usernameError\n )\n : nothing}\n ${this.showPassword\n ? this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )\n : nothing}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"recent-container\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recently signed in')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, true)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderSignInSmall() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div\n class=${classMap({\n 'login-container': true,\n 'signin-only': !this.showRecentUsers,\n })}\n >\n ${this.showUsername\n ? this.renderTextInput(\n msg('Username'),\n HTMLInputTypeAttribute.Text,\n this.username,\n this.handleUsernameInput.bind(this),\n this.usernameError\n )\n : nothing}\n ${this.showPassword\n ? this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )\n : nothing}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"divider\" aria-hidden=\"true\"></div>\n <div class=\"recent-container recent\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recent')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, false)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderUserSignIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div\n class=${classMap({\n 'login-container': true,\n 'signin-only': !this.showRecentUsers,\n })}\n >\n <div class=\"user-primary\">\n ${this.renderUserProfile('vertical', 'large')}\n </div>\n <div class=\"fields\">\n ${this.showPassword\n ? this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )\n : nothing}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"recent-container\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recently signed in')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, true)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderUserSignInSmall() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"user-container\">\n ${this.renderUserProfile('horizontal', 'regular')}\n </div>\n <div\n class=${classMap({\n 'login-container': true,\n 'signin-only': !this.showRecentUsers,\n })}\n >\n ${this.showPassword\n ? this.renderTextInput(\n msg('Password'),\n HTMLInputTypeAttribute.Password,\n this.password,\n this.handlePasswordInput.bind(this),\n this.passwordError\n )\n : nothing}\n <obc-button\n variant=${ButtonVariant.raised}\n fullWidth\n @click=${this.handleSignInClick}\n >\n ${msg('Sign in')}\n </obc-button>\n </div>\n ${this.showRecentUsers\n ? html`\n <div class=\"divider\" aria-hidden=\"true\"></div>\n <div class=\"recent-container recent\">\n <div class=\"title-container\">\n <div class=\"subtitle\">${msg('Recent')}</div>\n </div>\n <div class=\"actions-container\">\n ${this.renderUserButtons(3, false)}\n </div>\n </div>\n `\n : nothing}\n `;\n }\n\n private renderLoadingSignIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"user-primary loading\">\n ${this.renderUserProfile('vertical', 'large')}\n <obc-progress-bar\n class=\"progress\"\n type=${ProgressBarType.linear}\n mode=${ProgressBarMode.indeterminate}\n .showValue=${false}\n ></obc-progress-bar>\n </div>\n `;\n }\n\n private renderLoadingSignInSmall() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('Sign in')}</h3>\n </div>\n <div class=\"user-primary loading\">\n ${this.renderUserProfile('horizontal', 'regular')}\n <obc-progress-bar\n class=\"progress\"\n type=${ProgressBarType.linear}\n mode=${ProgressBarMode.indeterminate}\n .showValue=${false}\n ></obc-progress-bar>\n </div>\n `;\n }\n\n private renderSignedIn() {\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('User')}</h3>\n </div>\n <div class=\"user-primary signed-in\">\n ${this.renderUserProfile('vertical', 'large')}\n </div>\n <div class=\"divider\" aria-hidden=\"true\"></div>\n ${this.signedInActions.length\n ? html`\n <div class=\"nav-container\">\n ${this.signedInActions.map((action) => {\n const normalizedId = this.normalizeActionId(action.id);\n return html`\n <obc-navigation-item\n .label=${action.label}\n hasIcon\n @click=${() => this.handleSignedInActionClick(action)}\n >\n <span slot=\"icon\">\n <slot name=\"signed-in-action-icon-${normalizedId}\">\n ${this.getSignedInActionIcon(normalizedId)}\n </slot>\n </span>\n </obc-navigation-item>\n `;\n })}\n </div>\n `\n : nothing}\n <div class=\"button-container\">\n <obc-button\n variant=${ButtonVariant.normal}\n fullWidth\n @click=${this.handleSignOutClick}\n >\n ${msg('Sign out')}\n </obc-button>\n </div>\n `;\n }\n\n private renderSignedInSmall() {\n const primaryAction = this.signedInActions.find(\n (action) => action.id === this.primaryActionId\n );\n return html`\n <div class=\"title-container\">\n <h3 class=\"title\">${msg('User')}</h3>\n </div>\n <div class=\"user-container\">\n ${this.renderUserProfile('horizontal', 'regular')}\n </div>\n <div class=\"button-container\">\n ${primaryAction\n ? html`\n <obc-button\n variant=${ButtonVariant.normal}\n fullWidth\n @click=${() => this.handleSignedInActionClick(primaryAction)}\n >\n ${primaryAction.label}\n </obc-button>\n `\n : nothing}\n <obc-button\n variant=${ButtonVariant.normal}\n fullWidth\n @click=${this.handleSignOutClick}\n >\n ${msg('Sign out')}\n </obc-button>\n </div>\n `;\n }\n\n override render() {\n let content: TemplateResult | symbol = nothing;\n if (this.type === ObcUserMenuType.signIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderSignInSmall()\n : this.renderSignIn();\n }\n if (this.type === ObcUserMenuType.userSignIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderUserSignInSmall()\n : this.renderUserSignIn();\n }\n if (this.type === ObcUserMenuType.loadingSignIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderLoadingSignInSmall()\n : this.renderLoadingSignIn();\n }\n if (this.type === ObcUserMenuType.signedIn) {\n content =\n this.size === ObcUserMenuSize.small\n ? this.renderSignedInSmall()\n : this.renderSignedIn();\n }\n\n return html`\n <div\n class=${classMap({\n card: true,\n [`size-${this.size}`]: true,\n [`type-${this.type}`]: true,\n })}\n >\n ${content}\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-user-menu': ObcUserMenu;\n }\n}\n"],"names":["ObcUserMenuType","ObcUserMenuSize"],"mappings":"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"}
|