Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"packages/openscd": "0.37.0",
"packages/core": "0.1.4",
".": "0.42.0"
".": "0.43.0"
}
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## [0.43.0](https://github.com/openscd/open-scd/compare/v0.42.0...v0.43.0) (2025-10-27)


### Features

* add elements to virtual ied ([#1714](https://github.com/openscd/open-scd/issues/1714)) ([0c1074b](https://github.com/openscd/open-scd/commit/0c1074bf9d4f154a06c8031e593974c1f618fead))
* add virtual ied ([#1712](https://github.com/openscd/open-scd/issues/1712)) ([cf45fe9](https://github.com/openscd/open-scd/commit/cf45fe92e4a09066ca9b426b282486229dfbc43a))
* edit and delete virtual IED elements ([#1715](https://github.com/openscd/open-scd/issues/1715)) ([106688b](https://github.com/openscd/open-scd/commit/106688bd736b449a3182045ecb6fccc5a51067c7))


### Bug Fixes

* Disable experimental require module to make node 20.19 and above work ([#1709](https://github.com/openscd/open-scd/issues/1709)) ([d47a3da](https://github.com/openscd/open-scd/commit/d47a3dac6c57ee814cfbd78f3636fe872a052568))
* Require lnInst only for regular lns ([#1713](https://github.com/openscd/open-scd/issues/1713)) ([003161f](https://github.com/openscd/open-scd/commit/003161fd5a0b363477ece059629ed2c0d6d86aa0))

## [0.42.0](https://github.com/openscd/open-scd/compare/v0.41.0...v0.42.0) (2025-09-15)


Expand Down
7 changes: 7 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/compas-open-scd/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "compas-open-scd",
"version": "0.42.0-1",
"version": "0.43.0-1",
"repository": "https://github.com/openscd/open-scd.git",
"description": "OpenSCD CoMPAS Edition",
"directory": "packages/compas-open-scd",
Expand Down
49 changes: 49 additions & 0 deletions packages/openscd/src/translations/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,8 @@ export const de: Translations = {
missing: 'Kein IED vorhanden',
toggleChildElements: 'Kindelemente umschalten',
settings: 'Services für IED or AccessPoint',
createIed: 'Virtuelles IED erstellen',
addAccessPoint: 'AccessPoint hinzufügen',
wizard: {
daTitle: 'DA Informationen anzeigen',
doTitle: 'DO Informationen anzeigen',
Expand All @@ -248,11 +250,57 @@ export const de: Translations = {
daBType: 'DA Typ',
daValue: 'DA Wert',
},
createDialog: {
iedName: 'IED Name',
nameFormatError: 'IED Name darf keine Leerzeichen enthalten',
nameUniqueError: 'IED Name ist bereits vergeben',
},
addAccessPointDialog: {
title: 'AccessPoint hinzufügen',
nameHelper: 'AccessPoint Name',
descHelper: 'AccessPoint Beschreibung',
apName: 'AccessPoint Name',
createServerAt: 'ServerAt hinzufügen',
selectAccessPoint: 'AccessPoint auswählen',
serverAtDesc: 'ServerAt Beschreibung',
nameFormatError: 'AccessPoint Name darf keine Leerzeichen enthalten',
nameUniqueError: 'AccessPoint Name ist bereits vergeben',
nameTooLongError: 'AccessPoint Name ist zu lang',
},
addLDeviceDialog: {
title: 'LDevice hinzufügen',
inst: 'LDevice inst',
desc: 'LDevice Beschreibung',
instRequiredError: 'LDevice inst ist erforderlich',
instFormatError: 'LDevice inst darf keine Leerzeichen enthalten',
instUniqueError: 'LDevice inst ist bereits vergeben',
instTooLongError: 'LDevice inst ist zu lang',
},
addLnDialog: {
title: 'LN hinzufügen',
amount: 'Menge',
prefix: 'Prefix',
filter: 'Logical Node Types filtern',
noResults: 'Keine Logical Node Types gefunden',
},
},
accesspoint: {
wizard: {
nameHelper: 'AccessPoint Name',
descHelper: 'AccessPoint Beschreibung',
title: {
add: 'AccessPoint hinzufügen',
edit: 'AccessPoint bearbeiten',
delete: 'AccessPoint mit Abhängigkeiten entfernen',
references: 'Gelöschte Abhängikeiten',
},
},
},
ied: {
wizard: {
nameHelper: 'Name des IED',
descHelper: 'Beschreibung des IED',
manufacturerHelper: 'Hersteller des IED',
title: {
edit: 'IED bearbeiten',
delete: 'IED mit Abhängigkeiten entfernen',
Expand All @@ -269,6 +317,7 @@ export const de: Translations = {
nameHelper: 'Name des Logisches Gerät',
noNameSupportHelper: 'IED unterstützt keine funktionale Benennung',
descHelper: 'Beschreibung des Logisches Gerät',
instHelper: 'Instanz des Logisches Gerät',
title: {
edit: 'Logisches Gerät bearbeiten',
},
Expand Down
49 changes: 49 additions & 0 deletions packages/openscd/src/translations/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ export const en = {
missing: 'No IED',
toggleChildElements: 'Toggle child elements',
settings: 'Show Services the IED/AccessPoint provides',
createIed: 'Create Virtual IED',
addAccessPoint: 'Add AccessPoint',
wizard: {
daTitle: 'Show DA Info',
doTitle: 'Show DO Info',
Expand All @@ -245,11 +247,57 @@ export const en = {
daBType: 'Data attribute type',
daValue: 'Data attribute value',
},
createDialog: {
iedName: 'IED name',
nameFormatError: 'IED name cannot contain spaces',
nameUniqueError: 'IED name already exists',
},
addAccessPointDialog: {
title: 'Add AccessPoint',
nameHelper: 'AccessPoint name',
descHelper: 'AccessPoint description',
apName: 'AccessPoint name',
createServerAt: 'Add ServerAt',
selectAccessPoint: 'Select AccessPoint',
serverAtDesc: 'ServerAt description',
nameFormatError: 'AccessPoint name cannot contain spaces',
nameUniqueError: 'AccessPoint name already exists',
nameTooLongError: 'AccessPoint name is too long',
},
addLDeviceDialog: {
title: 'Add LDevice',
inst: 'LDevice inst',
desc: 'LDevice description',
instRequiredError: 'LDevice inst is required',
instFormatError: 'Invalid inst',
instUniqueError: 'LDevice inst already exists',
instTooLongError: 'LDevice inst is too long',
},
addLnDialog: {
title: 'Add LN',
amount: 'Amount',
prefix: 'Prefix',
filter: 'Filter Logical Node Types',
noResults: 'No Logical Node Types found',
},
},
accesspoint: {
wizard: {
nameHelper: 'AccessPoint name',
descHelper: 'AccessPoint description',
title: {
add: 'Add AccessPoint',
edit: 'Edit AccessPoint',
delete: 'Remove AccessPoint with references',
references: 'References to be removed',
},
},
},
ied: {
wizard: {
nameHelper: 'IED name',
descHelper: 'IED description',
manufacturerHelper: 'IED manufacturer',
title: {
edit: 'Edit IED',
delete: 'Remove IED with references',
Expand All @@ -266,6 +314,7 @@ export const en = {
nameHelper: 'Logical device name',
noNameSupportHelper: "IED doesn't support Functional Naming",
descHelper: 'Logical device description',
instHelper: 'Logical device inst',
title: {
edit: 'Edit logical device',
},
Expand Down
1 change: 1 addition & 0 deletions packages/plugins/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"@material/mwc-switch": "0.22.1",
"@material/mwc-textarea": "0.22.1",
"@material/mwc-textfield": "0.22.1",
"@openenergytools/scl-lib": "^1.8.0",
"@openscd/core": "*",
"@openscd/open-scd": "*",
"@openscd/wizards": "*",
Expand Down
112 changes: 112 additions & 0 deletions packages/plugins/src/components/tooltip.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import {
css,
customElement,
html,
LitElement,
property,
TemplateResult,
} from 'lit-element';

/** A tooltip element that follows the mouse cursor and displays a text box. */
@customElement('oscd-tooltip-4c6027dd')
export class OscdTooltip extends LitElement {
@property({ type: String })
text = '';

@property({ type: Boolean, reflect: true })
visible = false;

@property({ type: Number })
x = 0;

@property({ type: Number })
y = 0;

@property({ type: Number })
offset = 12;

private pendingFrame = 0;

show(text: string, clientX: number, clientY: number): void {
this.text = text;
this.visible = true;
this.updatePosition(clientX, clientY);
}

hide(): void {
this.visible = false;
this.text = '';
if (this.pendingFrame) {
cancelAnimationFrame(this.pendingFrame);
this.pendingFrame = 0;
}
}

updatePosition(clientX: number, clientY: number): void {
this.x = clientX + this.offset;
this.y = clientY + this.offset;

if (this.pendingFrame) return;

this.pendingFrame = requestAnimationFrame(() => {
this.pendingFrame = 0;
if (!this.visible) return;

const tipRect = this.getBoundingClientRect();
let x = this.x;
let y = this.y;

const innerW = window.innerWidth;
const innerH = window.innerHeight;

if (x + tipRect.width + this.offset > innerW) {
x = this.x - this.offset - tipRect.width - this.offset;
}
if (x < this.offset) x = this.offset;

if (y + tipRect.height + this.offset > innerH) {
y = this.y - this.offset - tipRect.height - this.offset;
}
if (y < this.offset) y = this.offset;

this.style.transform = `translate3d(${Math.round(x)}px, ${Math.round(
y
)}px, 0)`;
});
}

render(): TemplateResult {
return html`<slot>${this.text}</slot>`;
}

static styles = css`
:host {
position: fixed;
pointer-events: none;
background: rgba(20, 20, 20, 0.95);
color: rgba(240, 240, 240, 0.98);
padding: 6px 8px;
border-radius: 4px;
font-size: 0.85em;
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
z-index: 6000;
max-width: 60vw;
border: 1px solid rgba(255, 255, 255, 0.04);
left: 0;
top: 0;
transform: translate3d(0, 0, 0);
will-change: transform;
opacity: 1;
transition: opacity 0.15s ease-in-out;
}

:host(:not([visible])) {
opacity: 0;
pointer-events: none;
}

:host([hidden]) {
display: none;
}
`;
}
Loading