Skip to content

Commit

Permalink
feat(wizards/reportcontrol): add remove option to edit wizard (#493)
Browse files Browse the repository at this point in the history
* feat(wizards/reportcontrol): add remove option to edit wizard

* test(wizards/reportcontrol): fix rebase issues
  • Loading branch information
JakobVogelsang authored and Jakob Vogelsang committed Jan 20, 2022
1 parent cf22102 commit 9017a8d
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 6 deletions.
52 changes: 52 additions & 0 deletions src/wizards/reportcontrol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,55 @@ import {
identity,
isPublic,
newSubWizardEvent,
newWizardEvent,
newActionEvent,
selector,
SimpleAction,
Wizard,
WizardActor,
WizardInput,
Delete,
} from '../foundation.js';
import { maxLength, patterns } from './foundation/limits.js';

export function removeReportControlAction(element: Element): Delete[] {
if (!element.parentElement) return [];

const dataSet = element.parentElement.querySelector(
`DataSet[name="${element.getAttribute('datSet')}"]`
);

const isDataSetUsedByThisControlBlockOnly =
Array.from(
element.parentElement.querySelectorAll<Element>(
'ReportControl, GSEControl, SampledValueControl'
)
).filter(
controlblock =>
controlblock.getAttribute('datSet') === dataSet?.getAttribute('name')
).length <= 1;

const actions: Delete[] = [];
actions.push({
old: {
parent: element.parentElement!,
element,
reference: element.nextSibling,
},
});

if (dataSet && isDataSetUsedByThisControlBlockOnly)
actions.push({
old: {
parent: element.parentElement!,
element: dataSet,
reference: element.nextSibling,
},
});

return actions;
}

function getRptEnabledAction(
olRptEnabled: Element | null,
max: string | null,
Expand Down Expand Up @@ -220,6 +261,17 @@ export function editReportControlWizard(element: Element): Wizard {
bufTime,
intgPd,
}),
html`<mwc-button
label="${translate('remove')}"
icon="delete"
@click=${(e: MouseEvent) => {
const deleteActions = removeReportControlAction(element);
deleteActions.forEach(deleteAction =>
e.target?.dispatchEvent(newActionEvent(deleteAction))
);
e.target?.dispatchEvent(newWizardEvent());
}}
></mwc-button>`,
],
},
];
Expand Down
41 changes: 35 additions & 6 deletions test/integration/wizards/reportcontrol-wizarding-editing.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { expect, fixture, html } from '@open-wc/testing';
import '../../mock-wizard-editor.js';
import { MockWizardEditor } from '../../mock-wizard-editor.js';

import { Button } from '@material/mwc-button';
import { ListItemBase } from '@material/mwc-list/mwc-list-item-base';

import { FilteredList } from '../../../src/filtered-list.js';
Expand Down Expand Up @@ -85,7 +86,7 @@ describe('Wizards for SCL element ReportControl', () => {

const report = <ListItemBase>(
(<FilteredList>element.wizardUI.dialog?.querySelector('filtered-list'))
.items[0]
.items[1]
);
report.click();
await new Promise(resolve => setTimeout(resolve, 20)); // await animation
Expand All @@ -108,29 +109,29 @@ describe('Wizards for SCL element ReportControl', () => {

it('rejects name attribute starting with decimals', async () => {
expect(
parentIED.querySelector('ReportControl')?.getAttribute('name')
parentIED.querySelectorAll('ReportControl')[1]?.getAttribute('name')
).to.not.equal('4adsasd');

nameField.value = '4adsasd';
await element.requestUpdate();
primaryAction.click();

expect(
parentIED.querySelector('ReportControl')?.getAttribute('name')
parentIED.querySelectorAll('ReportControl')[1]?.getAttribute('name')
).to.not.equal('4adsasd');
});

it('edits name attribute on primary action', async () => {
expect(
parentIED.querySelector('ReportControl')?.getAttribute('name')
parentIED.querySelectorAll('ReportControl')[1]?.getAttribute('name')
).to.not.equal('myNewName');

nameField.value = 'myNewName';
await element.requestUpdate();
primaryAction.click();

expect(
parentIED.querySelector('ReportControl')?.getAttribute('name')
parentIED.querySelectorAll('ReportControl')[1]?.getAttribute('name')
).to.equal('myNewName');
});

Expand All @@ -142,7 +143,7 @@ describe('Wizards for SCL element ReportControl', () => {

const report = <ListItemBase>(
(<FilteredList>element.wizardUI.dialog?.querySelector('filtered-list'))
.items[0]
.items[1]
);

expect(report.innerHTML).to.contain('myNewName');
Expand All @@ -160,5 +161,33 @@ describe('Wizards for SCL element ReportControl', () => {

expect(report.innerHTML).to.contain('ReportCb');
});

it('removes the ReportControl element and its referenced elements on remove button click', async () => {
expect(
doc.querySelector(
'IED[name="IED2"] LN[lnClass="XSWI"] ReportControl[name="ReportCb2"]'
)
).to.exist;
expect(
doc.querySelector(
'IED[name="IED2"] LN[lnClass="XSWI"][inst="1"] DataSet[name="dataSet"]'
)
).to.exist;
const deleteButton = <Button>(
element.wizardUI.dialog!.querySelector('mwc-button[icon="delete"]')!
);
await deleteButton.updateComplete;
deleteButton.click();
expect(
doc.querySelector(
'IED[name="IED2"] LN[lnClass="XSWI"][inst="1"] ReportControl[name="ReportCb2"]'
)
).to.not.exist;
expect(
doc.querySelector(
'IED[name="IED2"] LN[lnClass="XSWI"][inst="1"] DataSet[name="dataSet"]'
)
).to.not.exist;
});
});
});
5 changes: 5 additions & 0 deletions test/unit/wizards/__snapshots__/reportcontrol.test.snap.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ snapshots["Wizards for SCL ReportControl element define an edit wizard that look
type="number"
>
</wizard-textfield>
<mwc-button
icon="delete"
label="[remove]"
>
</mwc-button>
</div>
<mwc-button
dialogaction="close"
Expand Down
89 changes: 89 additions & 0 deletions test/unit/wizards/reportcontrol.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ import { MockWizard } from '../../mock-wizard.js';

import {
isCreate,
isDelete,
isUpdate,
Update,
WizardInput,
} from '../../../src/foundation.js';
import { WizardTextField } from '../../../src/wizard-textfield.js';
import {
editReportControlWizard,
removeReportControlAction,
selectReportControlWizard,
} from '../../../src/wizards/reportcontrol.js';
import { inverseRegExp, regExp, regexString } from '../../foundation.js';
Expand Down Expand Up @@ -313,6 +315,93 @@ describe('Wizards for SCL ReportControl element', () => {
expect(updateAction.new.element).to.have.attribute('max', '6');
});
});

describe('contains a remove button that', () => {
const ln01gse = <Element>new DOMParser().parseFromString(
`<LN0 lnClass="LLN0" lnType="myType">
<DataSet name="myDataSet"/>
<DataSet name="myDataSet2"/>
<ReportControl name="myName" datSet="myDataSet"/>
<ReportControl name="myName2" datSet="myDataSet2"/>
</LN0>`,
'application/xml'
).documentElement;

const ln02gse = <Element>new DOMParser().parseFromString(
`<LN0 lnClass="LLN0" lnType="myType">
<DataSet name="myDataSet"/>
<ReportControl name="myName" datSet="myDataSet"/>
<ReportControl name="myName2" datSet="myDataSet"/>
</LN0>`,
'application/xml'
).documentElement;

const ln02rp = <Element>new DOMParser().parseFromString(
`<LN0 lnClass="LLN0" lnType="myType">
<DataSet name="myDataSet"/>
<ReportControl name="myName" datSet="myDataSet"/>
<GSEControl name="myName2" datSet="myDataSet"/>
</LN0>`,
'application/xml'
).documentElement;

const ln02smv = <Element>new DOMParser().parseFromString(
`<LN0 lnClass="LLN0" lnType="myType">
<DataSet name="myDataSet"/>
<ReportControl name="myName" datSet="myDataSet"/>
<SampledValueControl name="myName2" datSet="myDataSet"/>
</LN0>`,
'application/xml'
).documentElement;

const missingparent = <Element>(
new DOMParser().parseFromString(
`<ReportControl name="myName" datSet="myDataSet"/>`,
'application/xml'
).documentElement
);

it('removes ReportControl and its referenced DataSet if no other ReportControl are assigned', () => {
const reportControl = ln01gse.querySelector('ReportControl')!;
const actions = removeReportControlAction(reportControl);
expect(actions.length).to.equal(2);
expect(actions[0]).to.satisfy(isDelete);
expect(actions[0].old.element).to.equal(reportControl);
expect(actions[1]).to.satisfy(isDelete);
expect(actions[1].old.element).to.equal(
ln01gse.querySelector('DataSet')
);
});

it('does not remove if another ReportControl is assigned to the same DataSet', () => {
const reportControl = ln02gse.querySelector('ReportControl')!;
const actions = removeReportControlAction(reportControl);
expect(actions.length).to.equal(1);
expect(actions[0]).to.satisfy(isDelete);
expect(actions[0].old.element).to.equal(reportControl);
});

it('does not remove if another GSEControl is assigned to the same DataSet', () => {
const reportControl = ln02rp.querySelector('ReportControl')!;
const actions = removeReportControlAction(reportControl);
expect(actions.length).to.equal(1);
expect(actions[0]).to.satisfy(isDelete);
expect(actions[0].old.element).to.equal(reportControl);
});

it('does not remove if another SMV is assigned to the same DataSet', () => {
const reportControl = ln02smv.querySelector('ReportControl')!;
const actions = removeReportControlAction(reportControl);
expect(actions.length).to.equal(1);
expect(actions[0]).to.satisfy(isDelete);
expect(actions[0].old.element).to.equal(reportControl);
});

it('does not remove with missing parent element', () => {
const actions = removeReportControlAction(missingparent);
expect(actions.length).to.equal(0);
});
});
});

describe('define a select wizard that', () => {
Expand Down

0 comments on commit 9017a8d

Please sign in to comment.