From 95cbf83f6c078dfb3d622727af3977379e628a03 Mon Sep 17 00:00:00 2001 From: Flurb Date: Mon, 4 Apr 2022 10:52:04 +0200 Subject: [PATCH 1/5] Add basic plugin Signed-off-by: Flurb --- public/js/plugins.js | 9 ++++++ src/menu/CompasImportFromLiander.ts | 30 +++++++++++++++++++ src/translations/de.ts | 3 ++ src/translations/en.ts | 3 ++ .../__snapshots__/open-scd.test.snap.js | 17 ++++++++++- 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/menu/CompasImportFromLiander.ts diff --git a/public/js/plugins.js b/public/js/plugins.js index 8eb37075cc..dd9eeb4648 100644 --- a/public/js/plugins.js +++ b/public/js/plugins.js @@ -82,6 +82,15 @@ export const officialPlugins = [ requireDoc: false, position: 'top' }, + { + name: 'Import from API', + src: '/src/menu/CompasImportFromLiander.js', + icon: 'create_new_folder', + default: false, + kind: 'menu', + requireDoc: false, + position: 'top' + }, { name: 'Save project', src: '/src/menu/CompasSave.js', diff --git a/src/menu/CompasImportFromLiander.ts b/src/menu/CompasImportFromLiander.ts new file mode 100644 index 0000000000..ee8ad097a5 --- /dev/null +++ b/src/menu/CompasImportFromLiander.ts @@ -0,0 +1,30 @@ +import { html, LitElement } from 'lit-element'; +import { get } from 'lit-translate'; + +import '../filtered-list.js'; +import '../wizard-textfield.js'; +import { + newWizardEvent, + Wizard, +} from '../foundation.js'; + +export default class ImportFromApiPlugin extends LitElement { + private importFromApiWizard(): Wizard { + return [ + { + title: get('compas.import.title'), + content: [ + html` + + `, + ], + }, + ]; + } + + async run(): Promise { + document + .querySelector('open-scd') + ?.dispatchEvent(newWizardEvent(this.importFromApiWizard())); + } +} diff --git a/src/translations/de.ts b/src/translations/de.ts index 6fd6ee97f4..095f775fbb 100644 --- a/src/translations/de.ts +++ b/src/translations/de.ts @@ -567,6 +567,9 @@ export const de: Translations = { minor: '???', patch: '???', }, + import: { + title: '???' + }, open: { title: '???', localTitle: '???', diff --git a/src/translations/en.ts b/src/translations/en.ts index 994f9084c8..a8ded63859 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -563,6 +563,9 @@ export const en = { minor: 'Minor change', patch: 'Patch change', }, + import: { + title: 'Import from API' + }, open: { title: 'Open project', localTitle: 'Local', diff --git a/test/integration/__snapshots__/open-scd.test.snap.js b/test/integration/__snapshots__/open-scd.test.snap.js index b4bd6f5fe3..c1f447c129 100644 --- a/test/integration/__snapshots__/open-scd.test.snap.js +++ b/test/integration/__snapshots__/open-scd.test.snap.js @@ -1,7 +1,7 @@ /* @web/test-runner snapshot v1 */ export const snapshots = {}; -snapshots["open-scd looks like its snapshot"] = +snapshots["open-scd looks like its snapshot"] = ` Project from CIM + + + create_new_folder + + Import from API + Date: Tue, 5 Apr 2022 12:03:55 +0200 Subject: [PATCH 2/5] Implemented Import from API plugin Signed-off-by: Flurb --- public/cim/README.md | 8 +++ public/js/plugins.js | 4 +- src/compas/CompasImportFromApi.ts | 61 +++++++++++++++++++ src/compas/CompasSettings.ts | 17 +++++- ...tFromLiander.ts => CompasImportFromApi.ts} | 7 ++- src/translations/de.ts | 1 + src/translations/en.ts | 1 + .../__snapshots__/open-scd.test.snap.js | 4 +- test/unit/compas/CompasImportFromApi.test.ts | 17 ++++++ .../CompasImportFromApi.test.snap.js | 37 +++++++++++ 10 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 public/cim/README.md create mode 100644 src/compas/CompasImportFromApi.ts rename src/menu/{CompasImportFromLiander.ts => CompasImportFromApi.ts} (83%) create mode 100644 test/unit/compas/CompasImportFromApi.test.ts create mode 100644 test/unit/compas/__snapshots__/CompasImportFromApi.test.snap.js diff --git a/public/cim/README.md b/public/cim/README.md new file mode 100644 index 0000000000..0cbc9a9d79 --- /dev/null +++ b/public/cim/README.md @@ -0,0 +1,8 @@ +Directory containing fixed files for the 'Import from API' plugin, namely: + +- cim-eq-hoorn-v3.xml +- cim-eq-makkum.xml +- cim-eq-winselingseweg-voorbeeld.xml +- EQ-entsoe-voorbeeld.xml + +Without these files, the 'Import from API' doesn't work and the hardcoded files cannot be opened. \ No newline at end of file diff --git a/public/js/plugins.js b/public/js/plugins.js index dd9eeb4648..a2439c169b 100644 --- a/public/js/plugins.js +++ b/public/js/plugins.js @@ -84,8 +84,8 @@ export const officialPlugins = [ }, { name: 'Import from API', - src: '/src/menu/CompasImportFromLiander.js', - icon: 'create_new_folder', + src: '/src/menu/CompasImportFromApi.js', + icon: 'cloud_download', default: false, kind: 'menu', requireDoc: false, diff --git a/src/compas/CompasImportFromApi.ts b/src/compas/CompasImportFromApi.ts new file mode 100644 index 0000000000..b7a0be2b05 --- /dev/null +++ b/src/compas/CompasImportFromApi.ts @@ -0,0 +1,61 @@ +import {customElement, html, LitElement, TemplateResult} from "lit-element"; + +import '@material/mwc-button'; + +import {newOpenDocEvent, newWizardEvent} from "../foundation.js"; + +import {createLogEvent, handleError, handleResponse, parseXml} from "../compas-services/foundation.js"; +import {dispatchEventOnOpenScd} from "./foundation.js"; + +import '../WizardDivider.js'; +import './CompasSclTypeList.js'; +import './CompasScl.js'; +import { CompasSettings } from "./CompasSettings.js"; +import { CompasCimMappingService } from "../compas-services/CompasCimMappingService.js"; + +@customElement('compas-import-from-api') +export default class CompasImportFromApiElement extends LitElement { + private async processCimFile(name: string) { + const url = CompasSettings().compasSettings.importFromApiUrl; + + const doc = await fetch(url + '/' + name + '.xml') + .catch(handleError) + .then(handleResponse) + .then(parseXml); + + await CompasCimMappingService().map({cimData: [{name: name + '.xml', doc: doc}]}).then(response => { + const sclName = name + ".ssd"; + + const sclElement = response.querySelectorAll("SCL").item(0); + const sclDocument = document.implementation.createDocument("", "", null); + sclDocument.getRootNode().appendChild(sclElement.cloneNode(true)); + + dispatchEventOnOpenScd(newOpenDocEvent(sclDocument, sclName)); + }).catch(createLogEvent); + + dispatchEventOnOpenScd(newWizardEvent()); + } + + render(): TemplateResult { + return html ` + + this.processCimFile('cim-eq-hoorn-v3')}> + cim-eq-hoorn-v3 + + this.processCimFile('cim-eq-makkum')}> + cim-eq-makkum + + this.processCimFile('cim-eq-winselingseweg-voorbeeld')}> + cim-eq-winselingseweg-voorbeeld + + this.processCimFile('EQ-entsoe-voorbeeld')}> + EQ-entsoe-voorbeeld + + + ` + } +} diff --git a/src/compas/CompasSettings.ts b/src/compas/CompasSettings.ts index bb31cfce77..d5239fef86 100644 --- a/src/compas/CompasSettings.ts +++ b/src/compas/CompasSettings.ts @@ -13,6 +13,7 @@ export type CompasSettingsRecord = { sclValidatorServiceUrl: string; cimMappingServiceUrl: string; sclAutoAlignmentServiceUrl: string; + importFromApiUrl: string; }; export function CompasSettings() { @@ -24,6 +25,7 @@ export function CompasSettings() { sclValidatorServiceUrl: this.getCompasSetting('sclValidatorServiceUrl'), cimMappingServiceUrl: this.getCompasSetting('cimMappingServiceUrl'), sclAutoAlignmentServiceUrl: this.getCompasSetting('sclAutoAlignmentServiceUrl'), + importFromApiUrl: this.getCompasSetting('importFromApiUrl'), }; }, @@ -32,7 +34,8 @@ export function CompasSettings() { sclDataServiceUrl: '/compas-scl-data-service', sclValidatorServiceUrl: '/compas-scl-validator', cimMappingServiceUrl: '/compas-cim-mapping', - sclAutoAlignmentServiceUrl: '/compas-scl-auto-alignment' + sclAutoAlignmentServiceUrl: '/compas-scl-auto-alignment', + importFromApiUrl: '/public/cim' } }, @@ -72,11 +75,16 @@ export class CompasSettingsElement extends LitElement { return this.shadowRoot!.querySelector('mwc-textfield[id="sclAutoAlignmentServiceUrl"]'); } + getImportFromApiUrlField(): TextFieldBase { + return this.shadowRoot!.querySelector('mwc-textfield[id="importFromApiUrl"]'); + } + valid(): boolean { return this.getSclDataServiceUrlField().checkValidity() && this.getSclValidatorServiceUrlField().checkValidity() && this.getCimMappingServiceUrlField().checkValidity() - && this.getSclAutoAlignmentServiceUrlField().checkValidity(); + && this.getSclAutoAlignmentServiceUrlField().checkValidity() + && this.getImportFromApiUrlField().checkValidity(); } save(): boolean { @@ -89,6 +97,7 @@ export class CompasSettingsElement extends LitElement { CompasSettings().setCompasSetting('sclValidatorServiceUrl', this.getSclValidatorServiceUrlField().value); CompasSettings().setCompasSetting('cimMappingServiceUrl', this.getCimMappingServiceUrlField().value); CompasSettings().setCompasSetting('sclAutoAlignmentServiceUrl', this.getSclAutoAlignmentServiceUrlField().value); + CompasSettings().setCompasSetting('importFromApiUrl', this.getImportFromApiUrlField().value); return true; } @@ -122,6 +131,10 @@ export class CompasSettingsElement extends LitElement { label="${translate('compas.settings.sclAutoAlignmentServiceUrl')}" value="${this.compasSettings.sclAutoAlignmentServiceUrl}" required> + + { if (this.reset()) { diff --git a/src/menu/CompasImportFromLiander.ts b/src/menu/CompasImportFromApi.ts similarity index 83% rename from src/menu/CompasImportFromLiander.ts rename to src/menu/CompasImportFromApi.ts index ee8ad097a5..7924a6a9e4 100644 --- a/src/menu/CompasImportFromLiander.ts +++ b/src/menu/CompasImportFromApi.ts @@ -8,15 +8,16 @@ import { Wizard, } from '../foundation.js'; +import "../compas/CompasImportFromApi.js"; + export default class ImportFromApiPlugin extends LitElement { + private importFromApiWizard(): Wizard { return [ { title: get('compas.import.title'), content: [ - html` - - `, + html``, ], }, ]; diff --git a/src/translations/de.ts b/src/translations/de.ts index 095f775fbb..f9ad06a024 100644 --- a/src/translations/de.ts +++ b/src/translations/de.ts @@ -640,6 +640,7 @@ export const de: Translations = { sclValidatorServiceUrl: 'CoMPAS SCL Validator Service URL', cimMappingServiceUrl: 'CoMPAS CIM Mapping Service URL', sclAutoAlignmentServiceUrl: 'CoMPAS SCL Auto Alignment Service URL', + importFromApiUrl: 'CoMPAS Import from API URL', }, session: { headingExpiring: '???', diff --git a/src/translations/en.ts b/src/translations/en.ts index a8ded63859..c235da9dbb 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -636,6 +636,7 @@ export const en = { sclValidatorServiceUrl: 'CoMPAS SCL Validator Service URL', cimMappingServiceUrl: 'CoMPAS CIM Mapping Service URL', sclAutoAlignmentServiceUrl: 'CoMPAS SCL Auto Alignment Service URL', + importFromApiUrl: 'CoMPAS Import from API URL', }, session: { headingExpiring: 'Your session is about to expire!', diff --git a/test/integration/__snapshots__/open-scd.test.snap.js b/test/integration/__snapshots__/open-scd.test.snap.js index c1f447c129..ed2b03b372 100644 --- a/test/integration/__snapshots__/open-scd.test.snap.js +++ b/test/integration/__snapshots__/open-scd.test.snap.js @@ -858,10 +858,10 @@ snapshots["open-scd looks like its snapshot"] = left="" mwc-list-item="" tabindex="-1" - value="/src/menu/CompasImportFromLiander.js" + value="/src/menu/CompasImportFromApi.js" > - create_new_folder + cloud_download Import from API diff --git a/test/unit/compas/CompasImportFromApi.test.ts b/test/unit/compas/CompasImportFromApi.test.ts new file mode 100644 index 0000000000..52b88eb2f2 --- /dev/null +++ b/test/unit/compas/CompasImportFromApi.test.ts @@ -0,0 +1,17 @@ +import {expect, fixtureSync, html} from '@open-wc/testing'; +import CompasImportFromApiElement from '../../../src/compas/CompasImportFromApi.js'; + +import "../../../src/compas/CompasImportFromApi.js"; + +describe('compas-import-from-api', () => { + let element: CompasImportFromApiElement; + + beforeEach(async () => { + element = fixtureSync(html``); + await element; + }); + + it('looks like the latest snapshot', () => { + expect(element).shadowDom.to.equalSnapshot(); + }); +}); diff --git a/test/unit/compas/__snapshots__/CompasImportFromApi.test.snap.js b/test/unit/compas/__snapshots__/CompasImportFromApi.test.snap.js new file mode 100644 index 0000000000..de9f4b3e3c --- /dev/null +++ b/test/unit/compas/__snapshots__/CompasImportFromApi.test.snap.js @@ -0,0 +1,37 @@ +/* @web/test-runner snapshot v1 */ +export const snapshots = {}; + +snapshots["compas-import-from-api looks like the latest snapshot"] = +` + + cim-eq-hoorn-v3 + + + cim-eq-makkum + + + cim-eq-winselingseweg-voorbeeld + + + EQ-entsoe-voorbeeld + + +`; +/* end snapshot compas-import-from-api looks like the latest snapshot */ + From 448ea5e9887a4fcdc699aaf49191ebb56d07c009 Mon Sep 17 00:00:00 2001 From: Flurb Date: Tue, 5 Apr 2022 12:06:58 +0200 Subject: [PATCH 3/5] Added /public/cim/ to gitignore Signed-off-by: Flurb --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 7f40a9ea19..73363161a7 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ /_site/ /build/ /out-tsc/ + +/public/cim/ From ebd72c1b3780b6e050e4c51f2ac6add6445a8eab Mon Sep 17 00:00:00 2001 From: Flurb Date: Tue, 5 Apr 2022 15:52:58 +0200 Subject: [PATCH 4/5] Beautiful review comments fixed Signed-off-by: Flurb --- .gitignore | 1 + src/compas/CompasImportFromApi.ts | 23 ++++++++++++++--------- src/compas/CompasSettings.ts | 19 +++---------------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 73363161a7..227db6c376 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ /out-tsc/ /public/cim/ +!/public/cim/README.md diff --git a/src/compas/CompasImportFromApi.ts b/src/compas/CompasImportFromApi.ts index b7a0be2b05..3929b887ef 100644 --- a/src/compas/CompasImportFromApi.ts +++ b/src/compas/CompasImportFromApi.ts @@ -2,7 +2,7 @@ import {customElement, html, LitElement, TemplateResult} from "lit-element"; import '@material/mwc-button'; -import {newOpenDocEvent, newWizardEvent} from "../foundation.js"; +import {newOpenDocEvent, newPendingStateEvent, newWizardEvent} from "../foundation.js"; import {createLogEvent, handleError, handleResponse, parseXml} from "../compas-services/foundation.js"; import {dispatchEventOnOpenScd} from "./foundation.js"; @@ -10,15 +10,12 @@ import {dispatchEventOnOpenScd} from "./foundation.js"; import '../WizardDivider.js'; import './CompasSclTypeList.js'; import './CompasScl.js'; -import { CompasSettings } from "./CompasSettings.js"; import { CompasCimMappingService } from "../compas-services/CompasCimMappingService.js"; @customElement('compas-import-from-api') export default class CompasImportFromApiElement extends LitElement { private async processCimFile(name: string) { - const url = CompasSettings().compasSettings.importFromApiUrl; - - const doc = await fetch(url + '/' + name + '.xml') + const doc = await fetch('/public/cim/' + name + '.xml') .catch(handleError) .then(handleResponse) .then(parseXml); @@ -40,19 +37,27 @@ export default class CompasImportFromApiElement extends LitElement { return html ` this.processCimFile('cim-eq-hoorn-v3')}> + @click=${() => dispatchEventOnOpenScd(newPendingStateEvent( + this.processCimFile('cim-eq-hoorn-v3') + ))}> cim-eq-hoorn-v3 this.processCimFile('cim-eq-makkum')}> + @click=${() => dispatchEventOnOpenScd(newPendingStateEvent( + this.processCimFile('cim-eq-makkum') + ))}> cim-eq-makkum this.processCimFile('cim-eq-winselingseweg-voorbeeld')}> + @click=${() => dispatchEventOnOpenScd(newPendingStateEvent( + this.processCimFile('cim-eq-winselingseweg-voorbeeld') + ))}> cim-eq-winselingseweg-voorbeeld this.processCimFile('EQ-entsoe-voorbeeld')}> + @click=${() => dispatchEventOnOpenScd(newPendingStateEvent( + this.processCimFile('EQ-entsoe-voorbeeld') + ))}> EQ-entsoe-voorbeeld diff --git a/src/compas/CompasSettings.ts b/src/compas/CompasSettings.ts index d5239fef86..f2779549f0 100644 --- a/src/compas/CompasSettings.ts +++ b/src/compas/CompasSettings.ts @@ -13,7 +13,6 @@ export type CompasSettingsRecord = { sclValidatorServiceUrl: string; cimMappingServiceUrl: string; sclAutoAlignmentServiceUrl: string; - importFromApiUrl: string; }; export function CompasSettings() { @@ -24,8 +23,7 @@ export function CompasSettings() { sclDataServiceUrl: this.getCompasSetting('sclDataServiceUrl'), sclValidatorServiceUrl: this.getCompasSetting('sclValidatorServiceUrl'), cimMappingServiceUrl: this.getCompasSetting('cimMappingServiceUrl'), - sclAutoAlignmentServiceUrl: this.getCompasSetting('sclAutoAlignmentServiceUrl'), - importFromApiUrl: this.getCompasSetting('importFromApiUrl'), + sclAutoAlignmentServiceUrl: this.getCompasSetting('sclAutoAlignmentServiceUrl') }; }, @@ -34,8 +32,7 @@ export function CompasSettings() { sclDataServiceUrl: '/compas-scl-data-service', sclValidatorServiceUrl: '/compas-scl-validator', cimMappingServiceUrl: '/compas-cim-mapping', - sclAutoAlignmentServiceUrl: '/compas-scl-auto-alignment', - importFromApiUrl: '/public/cim' + sclAutoAlignmentServiceUrl: '/compas-scl-auto-alignment' } }, @@ -75,16 +72,11 @@ export class CompasSettingsElement extends LitElement { return this.shadowRoot!.querySelector('mwc-textfield[id="sclAutoAlignmentServiceUrl"]'); } - getImportFromApiUrlField(): TextFieldBase { - return this.shadowRoot!.querySelector('mwc-textfield[id="importFromApiUrl"]'); - } - valid(): boolean { return this.getSclDataServiceUrlField().checkValidity() && this.getSclValidatorServiceUrlField().checkValidity() && this.getCimMappingServiceUrlField().checkValidity() - && this.getSclAutoAlignmentServiceUrlField().checkValidity() - && this.getImportFromApiUrlField().checkValidity(); + && this.getSclAutoAlignmentServiceUrlField().checkValidity(); } save(): boolean { @@ -97,7 +89,6 @@ export class CompasSettingsElement extends LitElement { CompasSettings().setCompasSetting('sclValidatorServiceUrl', this.getSclValidatorServiceUrlField().value); CompasSettings().setCompasSetting('cimMappingServiceUrl', this.getCimMappingServiceUrlField().value); CompasSettings().setCompasSetting('sclAutoAlignmentServiceUrl', this.getSclAutoAlignmentServiceUrlField().value); - CompasSettings().setCompasSetting('importFromApiUrl', this.getImportFromApiUrlField().value); return true; } @@ -131,10 +122,6 @@ export class CompasSettingsElement extends LitElement { label="${translate('compas.settings.sclAutoAlignmentServiceUrl')}" value="${this.compasSettings.sclAutoAlignmentServiceUrl}" required> - - { if (this.reset()) { From 764dc8c11fc98744f3d51c7aabf6c457fde81f26 Mon Sep 17 00:00:00 2001 From: Flurb Date: Tue, 5 Apr 2022 15:57:12 +0200 Subject: [PATCH 5/5] Removed translations Signed-off-by: Flurb --- src/translations/de.ts | 3 +-- src/translations/en.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/translations/de.ts b/src/translations/de.ts index f9ad06a024..5dca9320e5 100644 --- a/src/translations/de.ts +++ b/src/translations/de.ts @@ -639,8 +639,7 @@ export const de: Translations = { sclDataServiceUrl: 'CoMPAS SCL Data Service URL', sclValidatorServiceUrl: 'CoMPAS SCL Validator Service URL', cimMappingServiceUrl: 'CoMPAS CIM Mapping Service URL', - sclAutoAlignmentServiceUrl: 'CoMPAS SCL Auto Alignment Service URL', - importFromApiUrl: 'CoMPAS Import from API URL', + sclAutoAlignmentServiceUrl: 'CoMPAS SCL Auto Alignment Service URL' }, session: { headingExpiring: '???', diff --git a/src/translations/en.ts b/src/translations/en.ts index c235da9dbb..ecebc386db 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -635,8 +635,7 @@ export const en = { sclDataServiceUrl: 'CoMPAS SCL Data Service URL', sclValidatorServiceUrl: 'CoMPAS SCL Validator Service URL', cimMappingServiceUrl: 'CoMPAS CIM Mapping Service URL', - sclAutoAlignmentServiceUrl: 'CoMPAS SCL Auto Alignment Service URL', - importFromApiUrl: 'CoMPAS Import from API URL', + sclAutoAlignmentServiceUrl: 'CoMPAS SCL Auto Alignment Service URL' }, session: { headingExpiring: 'Your session is about to expire!',