diff --git a/dist/__snapshots__/oscd-designer.spec.snap.js b/dist/__snapshots__/oscd-designer.spec.snap.js
index a533bc1..fb165d4 100644
--- a/dist/__snapshots__/oscd-designer.spec.snap.js
+++ b/dist/__snapshots__/oscd-designer.spec.snap.js
@@ -246,8 +246,8 @@ snapshots["Designer given conducting equipment grounds equipment on connection p
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -423,8 +423,8 @@ snapshots["Designer given conducting equipment connects equipment on connection
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -688,8 +688,8 @@ snapshots["Designer given conducting equipment connects equipment on connect men
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -965,8 +965,8 @@ snapshots["Designer given conducting equipment with established connectivity uni
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -1180,8 +1180,8 @@ snapshots["Designer given conducting equipment with established connectivity con
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -1357,8 +1357,8 @@ snapshots["Designer given conducting equipment with established connectivity avo
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -1641,8 +1641,8 @@ snapshots["Designer given conducting equipment with established connectivity kee
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -1816,8 +1816,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -2001,8 +2001,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -2321,8 +2321,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -2621,8 +2621,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -2855,8 +2855,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -3024,8 +3024,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -3151,8 +3151,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -3384,8 +3384,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -3521,8 +3521,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -3785,8 +3785,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="7"
esld:rot="3"
- esld:x="22"
- esld:y="7"
+ esld:x="21"
+ esld:y="6"
name="SMC1"
type="SMC"
>
@@ -4078,8 +4078,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -4977,6 +4977,17 @@ snapshots["Designer given a voltage level opens a menu on voltage level right cl
Resize
+
+
+ Copy
+
+
+ copy_all
+
+
+
+
+ Copy
+
+
+ copy_all
+
+
@@ -5721,8 +5743,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -6235,8 +6257,8 @@ snapshots["Designer given conducting equipment with established connectivity bet
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -6418,8 +6440,8 @@ snapshots["Designer given conducting equipment retargets grounded terminals when
esld:lx="22"
esld:ly="8"
esld:rot="3"
- esld:x="22"
- esld:y="8"
+ esld:x="21"
+ esld:y="7"
name="SMC1"
type="SMC"
>
@@ -6436,3 +6458,1638 @@ snapshots["Designer given conducting equipment retargets grounded terminals when
`;
/* end snapshot Designer given conducting equipment retargets grounded terminals when reparenting equipment */
+snapshots["Designer given conducting equipment copies equipment on shift click"] =
+`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+/* end snapshot Designer given conducting equipment copies equipment on shift click */
+
+snapshots["Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies equipment on shift click"] =
+`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+/* end snapshot Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies equipment on shift click */
+
+snapshots["Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies equipment on copy menu item select"] =
+`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+/* end snapshot Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies equipment on copy menu item select */
+
+snapshots["Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies bays on copy menu item select"] =
+`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+/* end snapshot Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies bays on copy menu item select */
+
+snapshots["Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies voltage levels on move handle shift click"] =
+`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+/* end snapshot Designer given conducting equipment with established connectivity between more than two pieces of equipment and a bus bar copies voltage levels on move handle shift click */
+
diff --git a/oscd-designer.spec.ts b/oscd-designer.spec.ts
index b883c6a..e56c018 100644
--- a/oscd-designer.spec.ts
+++ b/oscd-designer.spec.ts
@@ -69,7 +69,7 @@ export const equipmentDocString = `
-
+
@@ -316,7 +316,7 @@ describe('Designer', () => {
expect(voltageLevel).to.have.attribute('smth:h', '7');
});
- it('allows moving voltage levels', async () => {
+ it('moves voltage levels on move handle click', async () => {
const sldEditor =
element.shadowRoot!.querySelector('sld-editor')!;
const moveHandle =
@@ -376,7 +376,7 @@ describe('Designer', () => {
const sldEditor =
element.shadowRoot!.querySelector('sld-editor')!;
const item = sldEditor.shadowRoot!.querySelector(
- 'mwc-list-item:nth-of-type(2)'
+ 'mwc-list-item:nth-last-of-type(5)'
)!;
item.selected = true;
await element.updateComplete;
@@ -417,7 +417,7 @@ describe('Designer', () => {
element.shadowRoot!.querySelector('sld-editor')!;
await element.updateComplete;
sldEditor.shadowRoot!.querySelector(
- 'mwc-list-item:nth-of-type(3)'
+ 'mwc-list-item:nth-last-of-type(4)'
)!.selected = true;
await sldEditor.updateComplete;
expect(element)
@@ -512,7 +512,9 @@ describe('Designer', () => {
expect(bus).to.have.attribute('y', '3');
expect(bus).to.have.attribute('smth:w', '1');
expect(bus).to.have.attribute('h', '8');
- expect(bus).dom.to.equalSnapshot({ ignoreAttributes: ['esld:uuid'] });
+ await expect(bus).dom.to.equalSnapshot({
+ ignoreAttributes: ['esld:uuid'],
+ });
});
});
@@ -602,7 +604,7 @@ describe('Designer', () => {
expect(voltageLevel).to.have.attribute('esld:h', '13');
});
- it('allows moving bays', async () => {
+ it('moves bays on move handle click', async () => {
const sldEditor =
element.shadowRoot!.querySelector('sld-editor')!;
sldEditor
@@ -654,7 +656,7 @@ describe('Designer', () => {
await sendMouse({ type: 'click', position: [600, 200] });
expect(element).to.have.property('placing', undefined);
expect(cNode).to.have.attribute('pathName', 'S1/V2/B2/L1');
- expect(element.doc.documentElement).dom.to.equalSnapshot({
+ await expect(element.doc.documentElement).dom.to.equalSnapshot({
ignoreAttributes: ['esld:uuid'],
});
});
@@ -807,6 +809,30 @@ describe('Designer', () => {
expect(equipment).to.have.attribute('esld:y', '3');
});
+ it('copies equipment on shift click', async () => {
+ const sldEditor =
+ element.shadowRoot!.querySelector('sld-editor')!;
+ const equipment = element.doc.querySelector('ConductingEquipment');
+ const id = identity(equipment);
+ const eqClickTarget = sldEditor
+ .shadowRoot!.getElementById(id)!
+ .querySelector('rect')!;
+ eqClickTarget.dispatchEvent(
+ new PointerEvent('click', { shiftKey: true })
+ );
+ expect(element.doc.querySelector('ConductingEquipment[*|x="3"][*|y="3"]'))
+ .to.not.exist;
+ await sendMouse({ type: 'click', position: [150, 180] });
+ expect(
+ element.doc.querySelector('ConductingEquipment[*|x="3"][*|y="3"]')
+ ).to.exist.and.have.attribute('type', equipment!.getAttribute('type')!);
+ expect(equipment).to.have.attribute('esld:x', '4');
+ expect(equipment).to.have.attribute('esld:y', '4');
+ await expect(element.doc.documentElement).dom.to.equalSnapshot({
+ ignoreAttributes: ['esld:uuid'],
+ });
+ });
+
it('rotates equipment on middle mouse button click', () => {
const sldEditor =
element.shadowRoot!.querySelector('sld-editor')!;
@@ -890,7 +916,7 @@ describe('Designer', () => {
eqClickTarget.dispatchEvent(new PointerEvent('contextmenu'));
await element.updateComplete;
const item = sldEditor.shadowRoot!.querySelector(
- 'mwc-list-item:nth-of-type(7)'
+ 'mwc-list-item:nth-last-of-type(5)'
)!;
item.selected = true;
await element.updateComplete;
@@ -1592,6 +1618,38 @@ describe('Designer', () => {
});
});
+ it('copies equipment on copy menu item select', async () => {
+ queryUI({
+ scl: 'ConductingEquipment',
+ ui: 'rect',
+ }).dispatchEvent(new PointerEvent('contextmenu'));
+ await element.updateComplete;
+ const sldEditor =
+ element.shadowRoot!.querySelector('sld-editor')!;
+ sldEditor.shadowRoot!.querySelector(
+ 'mwc-list-item:nth-last-of-type(6)'
+ )!.selected = true;
+ expect(
+ element.doc.querySelector('ConductingEquipment[*|x="3"][*|y="3"]')
+ ).to.not.exist;
+ expect(
+ element.doc.querySelector('ConductingEquipment')
+ ).to.have.attribute('esld:x', '4');
+ expect(
+ element.doc.querySelector('ConductingEquipment')
+ ).to.have.attribute('esld:y', '4');
+ await sendMouse({ type: 'click', position: [150, 180] });
+ expect(
+ element.doc.querySelector('ConductingEquipment[*|x="3"][*|y="3"]')
+ ).to.exist;
+ expect(
+ element.doc.querySelector('ConductingEquipment[*|x="4"][*|y="4"]')
+ ).to.exist;
+ await expect(element.doc.documentElement).dom.to.equalSnapshot({
+ ignoreAttributes: ['esld:uuid'],
+ });
+ });
+
it('moves the bus bar on move menu item select', async () => {
queryUI({
scl: '[name="L"]',
@@ -1673,6 +1731,45 @@ describe('Designer', () => {
ignoreAttributes: ['esld:uuid'],
});
});
+
+ it('copies bays on copy menu item select', async () => {
+ queryUI({
+ scl: '[name="V2"] [name="B1"]',
+ ui: 'rect',
+ }).dispatchEvent(new PointerEvent('contextmenu'));
+ await element.updateComplete;
+ const sldEditor =
+ element.shadowRoot!.querySelector('sld-editor')!;
+ sldEditor.shadowRoot!.querySelector(
+ 'mwc-list-item:nth-last-of-type(6)'
+ )!.selected = true;
+ expect(element.doc.querySelector('[name="V1"] [name="B2"]')).not.to
+ .exist;
+ await sendMouse({ type: 'click', position: [280, 350] });
+ expect(element.doc.querySelector('[name="V1"] [name="B2"]')).to
+ .exist;
+ await expect(element.doc.documentElement).dom.to.equalSnapshot({
+ ignoreAttributes: ['esld:uuid'],
+ });
+ });
+
+ it('copies voltage levels on move handle shift click', async () => {
+ queryUI({
+ scl: '[name="V1"]',
+ ui: '.handle',
+ }).dispatchEvent(new PointerEvent('click', { shiftKey: true }));
+ expect(element.doc.querySelector('[name="V1"] [name="B2"]')).not.to
+ .exist;
+ element
+ .shadowRoot!.querySelector