Skip to content

Commit

Permalink
feat(editors/Subscription): When undo / redo actions Subscription / S…
Browse files Browse the repository at this point in the history
…MV plugin, lists are not refreshed
  • Loading branch information
Flurb authored Apr 20, 2022
1 parent 33b590a commit 7889be9
Show file tree
Hide file tree
Showing 9 changed files with 193 additions and 246 deletions.
40 changes: 0 additions & 40 deletions src/editors/sampledvalues/elements/sampled-values-message.ts

This file was deleted.

8 changes: 4 additions & 4 deletions src/editors/sampledvalues/foundation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ export enum SubscribeStatus {
}

export interface SampledValuesSelectDetail {
sampledValuesControl: Element;
dataset: Element;
sampledValuesControl: Element | undefined;
dataset: Element | undefined;
}
export type SampledValuesSelectEvent = CustomEvent<SampledValuesSelectDetail>;
export function newSampledValuesSelectEvent(
sampledValuesControl: Element,
dataset: Element,
sampledValuesControl: Element | undefined,
dataset: Element | undefined,
eventInitDict?: CustomEventInit<SampledValuesSelectDetail>
): SampledValuesSelectEvent {
return new CustomEvent<SampledValuesSelectDetail>('sampled-values-select', {
Expand Down
49 changes: 45 additions & 4 deletions src/editors/sampledvalues/sampled-values-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,18 @@ import '@material/mwc-icon';
import '@material/mwc-list';
import '@material/mwc-list/mwc-list-item';

import './elements/sampled-values-message.js';
import { compareNames, getNameAttribute } from '../../foundation.js';
import { styles } from './foundation.js';
import { newSampledValuesSelectEvent, styles } from './foundation.js';
import { smvIcon } from '../../icons/icons.js';

let selectedSmvMsg: Element | undefined;
let selectedDataSet: Element | undefined | null;

function onOpenDocResetSelectedSmvMsg() {
selectedSmvMsg = undefined;
selectedDataSet = undefined;
}
addEventListener('open-doc', onOpenDocResetSelectedSmvMsg);

/** An sub element for showing all Sampled Values per IED. */
@customElement('sampled-values-list')
Expand Down Expand Up @@ -43,6 +52,39 @@ export class SampledValuesList extends LitElement {
);
}

private onSmvSelect(element: Element) {
const ln = element.parentElement;
const dataset = ln?.querySelector(
`DataSet[name=${element.getAttribute('datSet')}]`
);

selectedSmvMsg = element;
selectedDataSet = dataset;

this.dispatchEvent(
newSampledValuesSelectEvent(
selectedSmvMsg,
selectedDataSet!
)
);
}

renderSmv(element: Element): TemplateResult {
return html`<mwc-list-item @click=${() => this.onSmvSelect(element)} graphic="large">
<span>${element.getAttribute('name')}</span>
<mwc-icon slot="graphic">${smvIcon}</mwc-icon>
</mwc-list-item>`;
}

protected firstUpdated(): void {
this.dispatchEvent(
newSampledValuesSelectEvent(
selectedSmvMsg,
selectedDataSet ?? undefined
)
);
}

render(): TemplateResult {
return html` <section>
<h1>${translate('sampledvalues.sampledValuesList.title')}</h1>
Expand All @@ -56,8 +98,7 @@ export class SampledValuesList extends LitElement {
</mwc-list-item>
<li divider role="separator"></li>
${this.getSampledValuesControls(ied).map(
control =>
html`<sampled-values-message .element=${control}></sampled-values-message>`
control => this.renderSmv(control)
)}
`
: ``
Expand Down
101 changes: 35 additions & 66 deletions src/editors/sampledvalues/subscriber-ied-list-smv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import {
import {
SampledValuesSelectEvent,
IEDSampledValuesSubscriptionEvent,
newSampledValuesSelectEvent,
styles,
SubscribeStatus,
} from './foundation.js';
Expand Down Expand Up @@ -67,40 +66,26 @@ function getFcdaReferences(elementContainingFcdaReferences: Element): string {
.join('');
}

/**
* Internal persistent state, so it's not lost when
* subscribing / unsubscribing.
*/
interface State {
/** An sub element for subscribing and unsubscribing IEDs to Sampled Values messages. */
@customElement('subscriber-ied-list-smv')
export class SubscriberIEDListSmv extends LitElement {
@property({ attribute: false })
doc!: XMLDocument;

/** Current selected Sampled Values element */
currentSampledValuesControl: Element | undefined;

/** The current selected dataset */
currentDataset: Element | undefined;
currentDataset: Element | undefined | null;

/** The name of the IED belonging to the current selected Sampled Values */
currentSampledValuesIEDName: string | undefined | null;

/** List holding all current subscribed IEDs. */
subscribedIeds: IED[];
subscribedIeds: IED[] = [];

/** List holding all current avaialble IEDs which are not subscribed. */
availableIeds: IED[];
}

const localState: State = {
currentSampledValuesControl: undefined,
currentDataset: undefined,
currentSampledValuesIEDName: undefined,
subscribedIeds: [],
availableIeds: [],
};

/** An sub element for subscribing and unsubscribing IEDs to Sampled Values messages. */
@customElement('subscriber-ied-list-smv')
export class SubscriberIEDListSmv extends LitElement {
@property({ attribute: false })
doc!: XMLDocument;
availableIeds: IED[] = [];

@query('div') subscriberWrapper!: Element;

Expand Down Expand Up @@ -128,18 +113,17 @@ export class SubscriberIEDListSmv extends LitElement {
* @param event - Incoming event.
*/
private async onSampledValuesDataSetEvent(event: SampledValuesSelectEvent) {
console.log('onSMVSelect')
localState.currentSampledValuesControl = event.detail.sampledValuesControl;
localState.currentDataset = event.detail.dataset;
localState.currentSampledValuesIEDName = localState.currentSampledValuesControl
.closest('IED')
this.currentSampledValuesControl = event.detail.sampledValuesControl;
this.currentDataset = event.detail.dataset;
this.currentSampledValuesIEDName = this.currentSampledValuesControl
?.closest('IED')
?.getAttribute('name');

localState.subscribedIeds = [];
localState.availableIeds = [];
this.subscribedIeds = [];
this.availableIeds = [];

Array.from(this.doc.querySelectorAll(':root > IED'))
.filter(ied => ied.getAttribute('name') != localState.currentSampledValuesIEDName)
.filter(ied => ied.getAttribute('name') != this.currentSampledValuesIEDName)
.forEach(ied => {
const inputElements = ied.querySelectorAll(`LN0 > Inputs, LN > Inputs`);

Expand All @@ -149,18 +133,18 @@ export class SubscriberIEDListSmv extends LitElement {
* If no Inputs element is found, we can safely say it's not subscribed.
*/
if (!inputElements) {
localState.availableIeds.push({ element: ied });
this.availableIeds.push({ element: ied });
return;
}

/**
* Count all the linked ExtRefs.
*/
localState.currentDataset!.querySelectorAll('FCDA').forEach(fcda => {
this.currentDataset!.querySelectorAll('FCDA').forEach(fcda => {
inputElements.forEach(inputs => {
if (
inputs.querySelector(
`ExtRef[iedName=${localState.currentSampledValuesIEDName}]` +
`ExtRef[iedName=${this.currentSampledValuesIEDName}]` +
`${getFcdaReferences(fcda)}`
)
) {
Expand All @@ -174,17 +158,17 @@ export class SubscriberIEDListSmv extends LitElement {
* partially subscribed and fully subscribed.
*/
if (numberOfLinkedExtRefs == 0) {
localState.availableIeds.push({ element: ied });
this.availableIeds.push({ element: ied });
return;
}

if (
numberOfLinkedExtRefs >=
localState.currentDataset!.querySelectorAll('FCDA').length
this.currentDataset!.querySelectorAll('FCDA').length
) {
localState.subscribedIeds.push({ element: ied });
this.subscribedIeds.push({ element: ied });
} else {
localState.availableIeds.push({ element: ied, partial: true });
this.availableIeds.push({ element: ied, partial: true });
}
});

Expand All @@ -196,7 +180,6 @@ export class SubscriberIEDListSmv extends LitElement {
* @param event - Incoming event.
*/
private async onIEDSubscriptionEvent(event: IEDSampledValuesSubscriptionEvent) {
console.log('onSMVIEDSub')
switch (event.detail.subscribeStatus) {
case SubscribeStatus.Full: {
this.unsubscribe(event.detail.ied);
Expand Down Expand Up @@ -225,15 +208,15 @@ export class SubscriberIEDListSmv extends LitElement {
inputsElement = createElement(ied.ownerDocument, 'Inputs', {});

const actions: Create[] = [];
localState.currentDataset!.querySelectorAll('FCDA').forEach(fcda => {
this.currentDataset!.querySelectorAll('FCDA').forEach(fcda => {
if (
!inputsElement!.querySelector(
`ExtRef[iedName=${localState.currentSampledValuesIEDName}]` +
`ExtRef[iedName=${this.currentSampledValuesIEDName}]` +
`${getFcdaReferences(fcda)}`
)
) {
const extRef = createElement(ied.ownerDocument, 'ExtRef', {
iedName: localState.currentSampledValuesIEDName!,
iedName: this.currentSampledValuesIEDName!,
serviceType: 'SMV',
ldInst: fcda.getAttribute('ldInst') ?? '',
lnClass: fcda.getAttribute('lnClass') ?? '',
Expand All @@ -259,13 +242,6 @@ export class SubscriberIEDListSmv extends LitElement {
};
this.dispatchEvent(newActionEvent({ title, actions: [inputAction] }));
}

this.dispatchEvent(
newSampledValuesSelectEvent(
localState.currentSampledValuesControl!,
localState.currentDataset!
)
);
}

/**
Expand All @@ -275,9 +251,9 @@ export class SubscriberIEDListSmv extends LitElement {
private unsubscribe(ied: Element): void {
const actions: Delete[] = [];
ied.querySelectorAll('LN0 > Inputs, LN > Inputs').forEach(inputs => {
localState.currentDataset!.querySelectorAll('FCDA').forEach(fcda => {
this.currentDataset!.querySelectorAll('FCDA').forEach(fcda => {
const extRef = inputs.querySelector(
`ExtRef[iedName=${localState.currentSampledValuesIEDName}]` +
`ExtRef[iedName=${this.currentSampledValuesIEDName}]` +
`${getFcdaReferences(fcda)}`
);

Expand All @@ -291,13 +267,6 @@ export class SubscriberIEDListSmv extends LitElement {
actions: this.extendDeleteActions(actions),
})
);

this.dispatchEvent(
newSampledValuesSelectEvent(
localState.currentSampledValuesControl!,
localState.currentDataset!
)
);
}

/**
Expand Down Expand Up @@ -349,25 +318,25 @@ export class SubscriberIEDListSmv extends LitElement {
}

render(): TemplateResult {
const partialSubscribedIeds = localState.availableIeds.filter(
const partialSubscribedIeds = this.availableIeds.filter(
ied => ied.partial
);
const availableIeds = localState.availableIeds.filter(
const availableIeds = this.availableIeds.filter(
ied => !ied.partial
);
const smvControlName =
localState.currentSampledValuesControl?.getAttribute('name') ?? undefined;
this.currentSampledValuesControl?.getAttribute('name') ?? undefined;

return html`
<section>
<h1>
${translate('sampledvalues.subscriberIed.title', {
selected: smvControlName
? localState.currentSampledValuesIEDName + ' > ' + smvControlName
? this.currentSampledValuesIEDName + ' > ' + smvControlName
: 'IED',
})}
</h1>
${localState.currentSampledValuesControl
${this.currentSampledValuesControl
? html`<div class="subscriberWrapper">
<mwc-list>
<mwc-list-item noninteractive>
Expand All @@ -376,8 +345,8 @@ export class SubscriberIEDListSmv extends LitElement {
>
</mwc-list-item>
<li divider role="separator"></li>
${localState.subscribedIeds.length > 0
? localState.subscribedIeds.map(
${this.subscribedIeds.length > 0
? this.subscribedIeds.map(
ied =>
html`<ied-element-smv
.status=${SubscribeStatus.Full}
Expand Down
8 changes: 4 additions & 4 deletions src/editors/subscription/foundation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ export enum SubscribeStatus {
}

export interface GOOSESelectDetail {
gseControl: Element;
dataset: Element;
gseControl: Element | undefined;
dataset: Element | undefined;
}
export type GOOSESelectEvent = CustomEvent<GOOSESelectDetail>;
export function newGOOSESelectEvent(
gseControl: Element,
dataset: Element,
gseControl: Element | undefined,
dataset: Element | undefined,
eventInitDict?: CustomEventInit<GOOSESelectDetail>
): GOOSESelectEvent {
return new CustomEvent<GOOSESelectDetail>('goose-dataset', {
Expand Down
Loading

0 comments on commit 7889be9

Please sign in to comment.