Skip to content

Commit

Permalink
feat(editor/subscriber): Added plugin for Subscriber Logical Nodes (G…
Browse files Browse the repository at this point in the history
…OOSE/SMV) (#1036)

* Added plugin and show FCDA Elements including edit button
* Added plugin and show FCDA Elements including edit button
* Added plugin and show FCDA Elements including edit button + renaming other subscriber plugins
* Fixed plugin test
* Show connected and available LN + small fixes
* Processed review comments.
  • Loading branch information
Dennis Labordus committed Oct 13, 2022
1 parent a8e7859 commit 971f0c1
Show file tree
Hide file tree
Showing 39 changed files with 3,383 additions and 508 deletions.
24 changes: 19 additions & 5 deletions public/js/plugins.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,15 @@ export const officialPlugins = [
kind: 'editor',
},
{
name: 'Subscriber (GOOSE)',
src: '/src/editors/GooseControlSubscription.js',
name: 'Subscriber Message Binding (GOOSE)',
src: '/src/editors/GooseSubscriberMessageBinding.js',
icon: 'link',
default: true,
kind: 'editor',
},
{
name: 'Subscriber Data Binding (GOOSE)',
src: '/src/editors/GooseSubscriberDataBinding.js',
icon: 'link',
default: true,
kind: 'editor',
Expand All @@ -31,12 +38,19 @@ export const officialPlugins = [
name: 'Subscriber Later Binding (GOOSE)',
src: '/src/editors/GooseSubscriberLaterBinding.js',
icon: 'link',
default: false,
default: true,
kind: 'editor',
},
{
name: 'Subscriber Message Binding (SMV)',
src: '/src/editors/SMVSubscriberMessageBinding.js',
icon: 'link',
default: true,
kind: 'editor',
},
{
name: 'Subscriber (SMV)',
src: '/src/editors/SampledValuesSubscription.js',
name: 'Subscriber Data Binding (SMV)',
src: '/src/editors/SMVSubscriberDataBinding.js',
icon: 'link',
default: true,
kind: 'editor',
Expand Down
5 changes: 3 additions & 2 deletions snowpack.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ export default ({
"**/.eslintrc.cjs",
"**/.git/**/*",
"**/.gitignore",
"**/.idea/**/*",
"**/.travis.yml",
"**/package*",
"**/tsconfig.json",
"**/web-test-runner.config.mjs",
"**/node_modules/**/*"
],
});
],
});
54 changes: 54 additions & 0 deletions src/editors/GooseSubscriberDataBinding.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { css, html, LitElement, property, TemplateResult } from 'lit-element';

import { Nsdoc } from '../foundation/nsdoc.js';

import './subscription/fcda-binding-list.js';
import './subscription/later-binding/ext-ref-ln-binding-list.js';

/** An editor [[`plugin`]] for Subscribe Data Binding (GOOSE). */
export default class GooseSubscribeDataBindingPlugin extends LitElement {
@property({ attribute: false })
doc!: XMLDocument;
@property()
nsdoc!: Nsdoc;

render(): TemplateResult {
return html`<div>
<div class="container">
<fcda-binding-list
class="column"
controlTag="GSEControl"
.doc=${this.doc}
>
</fcda-binding-list>
<extref-ln-binding-list
class="column"
controlTag="GSEControl"
.doc="${this.doc}"
.nsdoc="${this.nsdoc}"
>
</extref-ln-binding-list>
</div>
</div>`;
}

static styles = css`
:host {
width: 100vw;
}
.container {
display: flex;
padding: 8px 6px 16px;
height: calc(100vh - 136px);
}
.column {
flex: 50%;
margin: 0px 6px 0px;
min-width: 300px;
height: 100%;
overflow-y: auto;
}
`;
}
9 changes: 5 additions & 4 deletions src/editors/GooseSubscriberLaterBinding.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
import { LitElement, property, html, TemplateResult, css } from 'lit-element';
import { css, html, LitElement, property, TemplateResult } from 'lit-element';

import './subscription/later-binding/fcda-later-binding-list.js';
import './subscription/fcda-binding-list.js';
import './subscription/later-binding/ext-ref-later-binding-list.js';

/** An editor [[`plugin`]] for Subscribe Later Binding (GOOSE). */
export default class GooseSubscribeLaterBindingPlugin extends LitElement {
@property({ attribute: false })
doc!: XMLDocument;

render(): TemplateResult {
return html`<div>
<div class="container">
<fcda-later-binding-list
<fcda-binding-list
class="column"
.doc=${this.doc}
controlTag="GSEControl"
>
</fcda-later-binding-list>
</fcda-binding-list>
<extref-later-binding-list
class="column"
controlTag="GSEControl"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {
LitElement,
css,
html,
TemplateResult,
LitElement,
property,
css,
query,
TemplateResult,
} from 'lit-element';
import { translate } from 'lit-translate';

Expand All @@ -21,7 +21,7 @@ import { newViewEvent, View, ViewEvent } from './subscription/foundation.js';
let view: View = View.PUBLISHER;

/** An editor [[`plugin`]] for subscribing IEDs to GOOSE messages. */
export default class GooseControlSubscriptionPlugin extends LitElement {
export default class GooseSubscriberMessageBindingPlugin extends LitElement {
/** The document being edited as provided to plugins by [[`OpenSCD`]]. */
@property()
doc!: XMLDocument;
Expand Down Expand Up @@ -76,7 +76,11 @@ export default class GooseControlSubscriptionPlugin extends LitElement {
<div class="container">
${view == View.PUBLISHER
? html`<goose-list class="row" .doc=${this.doc}></goose-list>`
: html`<ied-list class="row" .doc=${this.doc} serviceType="goose"></ied-list>`}
: html`<ied-list
class="row"
.doc=${this.doc}
serviceType="goose"
></ied-list>`}
<subscriber-list-goose
class="row"
.doc=${this.doc}
Expand Down
54 changes: 54 additions & 0 deletions src/editors/SMVSubscriberDataBinding.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { css, html, LitElement, property, TemplateResult } from 'lit-element';

import { Nsdoc } from '../foundation/nsdoc.js';

import './subscription/fcda-binding-list.js';
import './subscription/later-binding/ext-ref-ln-binding-list.js';

/** An editor [[`plugin`]] for Subscribe Data Binding (SMV). */
export default class SMVSubscribeDataBindingPlugin extends LitElement {
@property({ attribute: false })
doc!: XMLDocument;
@property()
nsdoc!: Nsdoc;

render(): TemplateResult {
return html`<div>
<div class="container">
<fcda-binding-list
class="column"
controlTag="SampledValueControl"
.doc=${this.doc}
>
</fcda-binding-list>
<extref-ln-binding-list
class="column"
controlTag="SampledValueControl"
.doc="${this.doc}"
.nsdoc="${this.nsdoc}"
>
</extref-ln-binding-list>
</div>
</div>`;
}

static styles = css`
:host {
width: 100vw;
}
.container {
display: flex;
padding: 8px 6px 16px;
height: calc(100vh - 136px);
}
.column {
flex: 50%;
margin: 0px 6px 0px;
min-width: 300px;
height: 100%;
overflow-y: auto;
}
`;
}
6 changes: 3 additions & 3 deletions src/editors/SMVSubscriberLaterBinding.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { css, html, LitElement, property, TemplateResult } from 'lit-element';

import './subscription/later-binding/fcda-later-binding-list.js';
import './subscription/fcda-binding-list.js';
import './subscription/later-binding/ext-ref-later-binding-list.js';

/** An editor [[`plugin`]] for Subscribe Later Binding (SMV). */
Expand All @@ -11,12 +11,12 @@ export default class SMVSubscribeLaterBindingPlugin extends LitElement {
render(): TemplateResult {
return html`<div>
<div class="container">
<fcda-later-binding-list
<fcda-binding-list
class="column"
.doc=${this.doc}
controlTag="SampledValueControl"
>
</fcda-later-binding-list>
</fcda-binding-list>
<extref-later-binding-list
class="column"
.doc=${this.doc}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {
LitElement,
css,
html,
TemplateResult,
LitElement,
property,
css,
query,
TemplateResult,
} from 'lit-element';
import { translate } from 'lit-translate';

Expand All @@ -19,7 +19,7 @@ import { newViewEvent, View, ViewEvent } from './subscription/foundation.js';
let view: View = View.PUBLISHER;

/** An editor [[`plugin`]] for subscribing IEDs to Sampled Values. */
export default class SampledValuesSubscriberPlugin extends LitElement {
export default class SMVSubscriberMessageBindingPlugin extends LitElement {
/** The document being edited as provided to plugins by [[`OpenSCD`]]. */
@property()
doc!: XMLDocument;
Expand Down Expand Up @@ -74,7 +74,11 @@ export default class SampledValuesSubscriberPlugin extends LitElement {
<div class="container">
${view == View.PUBLISHER
? html`<smv-list class="row" .doc=${this.doc}></smv-list>`
: html`<ied-list class="row" .doc=${this.doc} serviceType="smv"></ied-list>`}
: html`<ied-list
class="row"
.doc=${this.doc}
serviceType="smv"
></ied-list>`}
<subscriber-list-smv class="row" .doc=${this.doc}></subscriber-list-smv>
</div>
</div>`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,11 @@ import {
getNameAttribute,
identity,
newWizardEvent,
} from '../../../foundation.js';
import { gooseIcon, smvIcon } from '../../../icons/icons.js';
import { wizards } from '../../../wizards/wizard-library.js';
} from '../../foundation.js';
import { gooseIcon, smvIcon } from '../../icons/icons.js';
import { wizards } from '../../wizards/wizard-library.js';

import { styles } from '../foundation.js';

import { getFcdaTitleValue, newFcdaSelectEvent } from './foundation.js';
import { getFcdaTitleValue, newFcdaSelectEvent, styles } from './foundation.js';

type controlTag = 'SampledValueControl' | 'GSEControl';

Expand All @@ -38,8 +36,8 @@ type iconLookup = Record<controlTag, SVGTemplateResult>;
* A control can be edited using the standard wizard.
* And when selecting a FCDA Element a custom event is fired, so other list can be updated.
*/
@customElement('fcda-later-binding-list')
export class FCDALaterBindingList extends LitElement {
@customElement('fcda-binding-list')
export class FcdaBindingList extends LitElement {
@property({ attribute: false })
doc!: XMLDocument;
@property()
Expand All @@ -51,16 +49,14 @@ export class FCDALaterBindingList extends LitElement {
@state()
selectedFcdaElement: Element | undefined;

@property({ attribute: false })
iconControlLookup: iconLookup;
iconControlLookup: iconLookup = {
SampledValueControl: smvIcon,
GSEControl: gooseIcon,
};

constructor() {
super();

this.iconControlLookup = {
SampledValueControl: smvIcon,
GSEControl: gooseIcon,
};
this.resetSelection = this.resetSelection.bind(this);
parent.addEventListener('open-doc', this.resetSelection);
}
Expand Down Expand Up @@ -151,7 +147,7 @@ export class FCDALaterBindingList extends LitElement {
${controlElements.length > 0
? html`<h1>
${translate(
`subscription.laterBinding.${this.controlTag}.controlBlockList.title`
`subscription.${this.controlTag}.controlBlockList.title`
)}
</h1>
<filtered-list activatable>
Expand Down Expand Up @@ -193,7 +189,7 @@ export class FCDALaterBindingList extends LitElement {
</filtered-list>`
: html`<h1>
${translate(
`subscription.laterBinding.${this.controlTag}.controlBlockList.noControlBlockFound`
`subscription.${this.controlTag}.controlBlockList.noControlBlockFound`
)}
</h1>`}
</section>`;
Expand Down
27 changes: 27 additions & 0 deletions src/editors/subscription/foundation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,32 @@ export function newIEDSelectEvent(
});
}

export interface FcdaSelectDetail {
controlElement: Element | undefined;
fcda: Element | undefined;
}
export type FcdaSelectEvent = CustomEvent<FcdaSelectDetail>;
export function newFcdaSelectEvent(
controlElement: Element | undefined,
fcda: Element | undefined,
eventInitDict?: CustomEventInit<FcdaSelectDetail>
): FcdaSelectEvent {
return new CustomEvent<FcdaSelectDetail>('fcda-select', {
bubbles: true,
composed: true,
...eventInitDict,
detail: { controlElement, fcda, ...eventInitDict?.detail },
});
}

export function getFcdaTitleValue(fcdaElement: Element): string {
return `${fcdaElement.getAttribute('doName')}${
fcdaElement.hasAttribute('doName') && fcdaElement.hasAttribute('daName')
? `.`
: ``
}${fcdaElement.getAttribute('daName')}`;
}

export function existExtRef(parentInputs: Element, fcda: Element): boolean {
const iedName = fcda.closest('IED')?.getAttribute('name');
if (!iedName) return false;
Expand Down Expand Up @@ -381,5 +407,6 @@ declare global {
interface ElementEventMap {
['view']: ViewEvent;
['ied-select']: IEDSelectEvent;
['fcda-select']: FcdaSelectEvent;
}
}
Loading

0 comments on commit 971f0c1

Please sign in to comment.