Skip to content

Commit ef321a1

Browse files
author
Rob Tjalma
committed
Added User Info functionality
Signed-off-by: Rob Tjalma <[email protected]>
1 parent eadf9d7 commit ef321a1

File tree

7 files changed

+73
-2
lines changed

7 files changed

+73
-2
lines changed

__snapshots__/open-scd.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,11 @@
394394
slot="title"
395395
>
396396
</div>
397+
<span
398+
id="userField"
399+
slot="actionItems"
400+
>
401+
</span>
397402
<mwc-icon-button
398403
disabled=""
399404
icon="undo"

src/Hosting.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ import {
99
TemplateResult,
1010
} from 'lit-element';
1111
import { until } from 'lit-html/directives/until';
12-
import { translate } from 'lit-translate';
12+
import { get, translate } from 'lit-translate';
1313
import { Mixin, newPendingStateEvent, ValidateEvent } from './foundation.js';
1414
import { LoggingElement } from './Logging.js';
1515
import { Plugin, PluggingElement, pluginIcons } from './Plugging.js';
1616
import { SettingElement } from './Setting.js';
1717

18+
import { UserInfoEvent } from './foundation.js';
19+
import { TextFieldBase } from '@material/mwc-textfield/mwc-textfield-base';
20+
1821
interface MenuItem {
1922
icon: string;
2023
name: string;
@@ -200,6 +203,14 @@ export function Hosting<
200203
];
201204
}
202205

206+
getNameField() : TextFieldBase {
207+
return <TextFieldBase>this.shadowRoot!.querySelector('span[id="userField"]');
208+
}
209+
210+
private onUserInfo(event: UserInfoEvent) {
211+
this.getNameField().textContent = get('userinfo.loggedInAs', {name: event.detail.name});
212+
}
213+
203214
constructor(...args: any[]) {
204215
super(...args);
205216

@@ -216,6 +227,8 @@ export function Hosting<
216227
})
217228
);
218229
});
230+
231+
this.addEventListener('userinfo', this.onUserInfo);
219232
}
220233

221234
renderMenuItem(me: MenuItem | 'divider'): TemplateResult {
@@ -288,6 +301,7 @@ export function Hosting<
288301
@click=${() => (this.menuUI.open = true)}
289302
></mwc-icon-button>
290303
<div slot="title" id="title">${this.docName}</div>
304+
<span id="userField" slot="actionItems"></span>
291305
${this.menu.map(this.renderActionItem)}
292306
${this.doc
293307
? html`<mwc-tab-bar
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import {CompasSettings} from "../compas/CompasSettingsElement.js";
2+
3+
export function CompasUserInfoService() {
4+
5+
function getCompasSettings() {
6+
return CompasSettings().compasSettings;
7+
}
8+
9+
return {
10+
getCompasUserInfo(): Promise<Document> {
11+
const userInfoUrl = getCompasSettings().sclDataServiceUrl + '/common/v1/userinfo';
12+
return fetch(userInfoUrl)
13+
.then(response => response.text())
14+
.then(str => new DOMParser().parseFromString(str, 'application/xml'));
15+
}
16+
}
17+
}

src/compas/foundation.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {get} from "lit-translate";
2-
import {newOpenDocEvent} from "../foundation.js";
2+
import { CompasUserInfoService } from "../compas-services/CompasUserInfoService.js";
3+
import {newOpenDocEvent, newUserInfoEvent} from "../foundation.js";
34
import {OpenSCD} from "../open-scd.js";
45

56
const FILE_EXTENSION_LENGTH = 3;
@@ -38,3 +39,13 @@ export function updateDocumentInOpenSCD(doc: Document): void {
3839

3940
getOpenScdElement().dispatchEvent(newOpenDocEvent(doc, docName, {detail: {docId: id}}));
4041
}
42+
43+
export async function showOptionalUserInfo(): Promise<void> {
44+
await CompasUserInfoService().getCompasUserInfo()
45+
.then(response => {
46+
const name = response.querySelectorAll("Name").item(0)?.textContent;
47+
if (name != null)
48+
getOpenScdElement().dispatchEvent(newUserInfoEvent(name));
49+
});
50+
}
51+
showOptionalUserInfo();

src/foundation.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,23 @@ export function newOpenDocEvent(
345345
});
346346
}
347347

348+
/** Represents user information from a backend. */
349+
export interface UserInfoDetail {
350+
name: string;
351+
}
352+
export type UserInfoEvent = CustomEvent<UserInfoDetail>;
353+
export function newUserInfoEvent(
354+
name: string,
355+
eventInitDict?: CustomEventInit<Partial<ValidateDetail>>
356+
): UserInfoEvent {
357+
return new CustomEvent<UserInfoDetail>('userinfo', {
358+
bubbles: true,
359+
composed: true,
360+
...eventInitDict,
361+
detail: { name, ...eventInitDict?.detail },
362+
});
363+
}
364+
348365
/** @returns a reference to `element` with segments delimited by '/'. */
349366
// TODO(c-dinkel): replace with identity (FIXME)
350367
export function referencePath(element: Element): string {
@@ -2547,6 +2564,7 @@ declare global {
25472564
['pending-state']: PendingStateEvent;
25482565
['editor-action']: EditorActionEvent<EditorAction>;
25492566
['open-doc']: OpenDocEvent;
2567+
['userinfo']: UserInfoEvent;
25502568
['wizard']: WizardEvent;
25512569
['validate']: ValidateEvent;
25522570
['log']: LogEvent;

src/translations/de.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,9 @@ export const de: Translations = {
360360
code: {
361361
log: 'Element im XML Editor angepasst: {{id}}',
362362
},
363+
userinfo: {
364+
loggedInAs: '???'
365+
},
363366
add: 'Hinzufügen',
364367
new: 'Neu',
365368
remove: 'Entfernen',

src/translations/en.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,9 @@ export const en = {
357357
code: {
358358
log: 'Changed element in XML editor: {{id}}',
359359
},
360+
userinfo: {
361+
loggedInAs: 'Logged in as {{name}}'
362+
},
360363
add: 'Add',
361364
new: 'New',
362365
remove: 'Remove',

0 commit comments

Comments
 (0)