@node-projects/web-component-designer 0.1.25 → 0.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -44,6 +44,7 @@ import { IDesignItemService } from './designItemService/IDesignItemService.js';
44
44
  import { IEventsService } from './eventsService/IEventsService.js';
45
45
  import { IPropertyGridDragDropService } from './dragDropService/IPropertyGridDragDropService.js';
46
46
  import { IConfigUiService } from './configUiService/IConfigUiService.js';
47
+ import { IRefactorService } from './refactorService/IRefactorService.js';
47
48
  interface ServiceNameMap {
48
49
  "propertyService": IPropertiesService;
49
50
  "attachedPropertyService": IPropertiesService;
@@ -70,6 +71,7 @@ interface ServiceNameMap {
70
71
  "eventsService": IEventsService;
71
72
  "propertyGridDragDropService": IPropertyGridDragDropService;
72
73
  "configUiService": IConfigUiService;
74
+ "refactorService": IRefactorService;
73
75
  "undoService": (designerCanvas: IDesignerCanvas) => IUndoService;
74
76
  "selectionService": (designerCanvas: IDesignerCanvas) => ISelectionService;
75
77
  "contentService": (designerCanvas: IDesignerCanvas) => IContentService;
@@ -118,5 +120,6 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
118
120
  get demoProviderService(): IDemoProviderService;
119
121
  get designItemService(): IDesignItemService;
120
122
  get configUiServices(): IConfigUiService[];
123
+ get refactorServices(): IRefactorService[];
121
124
  }
122
125
  export {};
@@ -100,4 +100,7 @@ export class ServiceContainer extends BaseServiceContainer {
100
100
  get configUiServices() {
101
101
  return this.getServices('configUiService');
102
102
  }
103
+ get refactorServices() {
104
+ return this.getServices('refactorService');
105
+ }
103
106
  }
@@ -15,30 +15,31 @@ export class BaseCustomWebcomponentBindingsService {
15
15
  if (a[0].startsWith('css:')) {
16
16
  bnd.targetName = name.substring(4);
17
17
  bnd.target = BindingTarget.css;
18
- bnd.expression = value.substring(2, value.length - 4);
18
+ bnd.expression = value.substring(2, value.length - 2);
19
19
  }
20
20
  else if (a[0].startsWith('class:')) {
21
21
  bnd.targetName = name.substring(4);
22
22
  bnd.target = BindingTarget.class;
23
- bnd.expression = value.substring(2, value.length - 4);
23
+ bnd.expression = value.substring(2, value.length - 2);
24
24
  }
25
25
  else if (a[0].startsWith('$')) {
26
26
  bnd.targetName = name.substring(1);
27
27
  bnd.target = BindingTarget.attribute;
28
- bnd.expression = value.substring(2, value.length - 4);
28
+ bnd.expression = value.substring(2, value.length - 2);
29
29
  }
30
30
  else if (a[0].startsWith('@')) {
31
31
  bnd.targetName = name.substring(1);
32
32
  bnd.target = BindingTarget.event;
33
- bnd.expression = value.substring(2, value.length - 4);
33
+ bnd.expression = value.substring(2, value.length - 2);
34
34
  }
35
35
  else {
36
36
  bnd.targetName = PropertiesHelper.dashToCamelCase(name);
37
37
  bnd.target = BindingTarget.property;
38
- bnd.expression = value.substring(2, value.length - 4);
38
+ bnd.expression = value.substring(2, value.length - 2);
39
39
  }
40
40
  bnd.type = BaseCustomWebcomponentBindingsService.type;
41
41
  bnd.targetName = bnd.targetName;
42
+ bnd.bindableObjectNames = [value.substring(2, value.length - 2)];
42
43
  bindings.push(bnd);
43
44
  }
44
45
  }
@@ -0,0 +1,6 @@
1
+ import { IDesignItem } from "../../item/IDesignItem.js";
2
+ import { IRefactoring } from "./IRefactoring.js";
3
+ export declare class BindingsRefactorService {
4
+ getRefactorings(designItems: IDesignItem[]): IRefactoring[];
5
+ refactor(refactoring: IRefactoring, oldValue: string, newValue: string): void;
6
+ }
@@ -0,0 +1,21 @@
1
+ export class BindingsRefactorService {
2
+ getRefactorings(designItems) {
3
+ let refactorings = [];
4
+ for (let d of designItems) {
5
+ let bindings = d.serviceContainer.bindingService.getBindings(d);
6
+ if (bindings) {
7
+ for (let b of bindings) {
8
+ for (let s of b.bindableObjectNames) {
9
+ refactorings.push({ service: this, name: s, designItem: d, type: 'binding', sourceObject: b, display: b.target + '(' + b.targetName + ')' });
10
+ }
11
+ }
12
+ }
13
+ }
14
+ return refactorings;
15
+ }
16
+ refactor(refactoring, oldValue, newValue) {
17
+ let binding = refactoring.sourceObject;
18
+ binding.bindableObjectNames = binding.bindableObjectNames.map(x => x == oldValue ? newValue : x);
19
+ refactoring.designItem.serviceContainer.bindingService.setBinding(refactoring.designItem, binding);
20
+ }
21
+ }
@@ -0,0 +1,6 @@
1
+ import { IDesignItem } from "../../item/IDesignItem.js";
2
+ import { IRefactoring } from "./IRefactoring.js";
3
+ export interface IRefactorService {
4
+ getRefactorings(designItems: IDesignItem[]): IRefactoring[];
5
+ refactor(refactoring: IRefactoring, oldValue: string, newValue: string): any;
6
+ }
@@ -0,0 +1,13 @@
1
+ import { BindingTarget } from "../../item/BindingTarget.js";
2
+ import { IDesignItem } from "../../item/IDesignItem.js";
3
+ import { IRefactorService } from "./IRefactorService.js";
4
+ export interface IRefactoring {
5
+ service: IRefactorService;
6
+ name: string;
7
+ designItem: IDesignItem;
8
+ type: 'binding' | 'script';
9
+ display?: string;
10
+ sourceObject: any;
11
+ target?: BindingTarget;
12
+ targetName?: string;
13
+ }
@@ -0,0 +1,5 @@
1
+ import { IDesignItem } from "../../item/IDesignItem.js";
2
+ import { IRefactoring } from "./IRefactoring.js";
3
+ export declare class RefactorService {
4
+ getRefactorings(designItems: IDesignItem[]): Record<string, IRefactoring[]>;
5
+ }
@@ -0,0 +1,17 @@
1
+ export class RefactorService {
2
+ getRefactorings(designItems) {
3
+ let refactorings = {};
4
+ for (let d of designItems) {
5
+ let bindings = d.serviceContainer.bindingService.getBindings(d);
6
+ for (let b of bindings) {
7
+ for (let s of b.bindableObjectNames) {
8
+ if (!refactorings[s]) {
9
+ refactorings[s] = [];
10
+ }
11
+ refactorings[s].push({ name: s, designItem: d, type: 'binding', sourceObject: b });
12
+ }
13
+ }
14
+ }
15
+ return refactorings;
16
+ }
17
+ }
@@ -0,0 +1,23 @@
1
+ import { BaseCustomWebComponentConstructorAppend, TypedEvent } from '@node-projects/base-custom-webcomponent';
2
+ import { ICodeView } from './ICodeView.js';
3
+ import { IActivateable } from '../../../interfaces/IActivateable.js';
4
+ import { IStringPosition } from '../../services/htmlWriterService/IStringPosition.js';
5
+ import { IUiCommandHandler } from '../../../commandHandling/IUiCommandHandler.js';
6
+ import { IUiCommand } from '../../../commandHandling/IUiCommand.js';
7
+ export declare class CodeViewSimple extends BaseCustomWebComponentConstructorAppend implements ICodeView, IActivateable, IUiCommandHandler {
8
+ dispose(): void;
9
+ canvasElement: HTMLElement;
10
+ elementsToPackages: Map<string, string>;
11
+ onTextChanged: TypedEvent<string>;
12
+ private _text;
13
+ static readonly style: CSSStyleSheet;
14
+ static readonly template: HTMLTemplateElement;
15
+ executeCommand(command: IUiCommand): void;
16
+ canExecuteCommand(command: IUiCommand): boolean;
17
+ ready(): Promise<void>;
18
+ focusEditor(): void;
19
+ activated(): void;
20
+ update(code: any): void;
21
+ getText(): string;
22
+ setSelection(position: IStringPosition): void;
23
+ }
@@ -0,0 +1,55 @@
1
+ import { BaseCustomWebComponentConstructorAppend, css, html, TypedEvent } from '@node-projects/base-custom-webcomponent';
2
+ export class CodeViewSimple extends BaseCustomWebComponentConstructorAppend {
3
+ dispose() {
4
+ }
5
+ canvasElement;
6
+ elementsToPackages;
7
+ onTextChanged = new TypedEvent();
8
+ _text;
9
+ static style = css `
10
+ :host {
11
+ display: block;
12
+ height: 100%;
13
+ width: 100%;
14
+ }
15
+
16
+ textarea {
17
+ height: 100%;
18
+ width: 100%;
19
+ resize: none;
20
+ white-space: nowrap;
21
+ box-sizing: border-box;
22
+ }
23
+ `;
24
+ static template = html `
25
+ <div id="container" style="width: 100%; height: 100%; position: absolute;">
26
+ <textarea id="text"></textarea>
27
+ </div>
28
+ `;
29
+ executeCommand(command) {
30
+ }
31
+ canExecuteCommand(command) {
32
+ return false;
33
+ }
34
+ async ready() {
35
+ this._text = this._getDomElement('text');
36
+ }
37
+ focusEditor() {
38
+ requestAnimationFrame(() => {
39
+ this.focus();
40
+ this._text.focus();
41
+ });
42
+ }
43
+ activated() {
44
+ }
45
+ update(code) {
46
+ this._text.value = code;
47
+ }
48
+ getText() {
49
+ return this._text.value;
50
+ }
51
+ setSelection(position) {
52
+ this._text.setSelectionRange(position.start, position.start + position.length);
53
+ }
54
+ }
55
+ customElements.define('node-projects-code-view-simple', CodeViewSimple);
@@ -0,0 +1,20 @@
1
+ import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
+ import { InstanceServiceContainer } from '../../services/InstanceServiceContainer.js';
3
+ import { IDesignItem } from '../../item/IDesignItem.js';
4
+ import { IRefactoring } from '../../services/refactorService/IRefactoring.js';
5
+ export declare class RefactorView extends BaseCustomWebComponentConstructorAppend {
6
+ static readonly template: HTMLTemplateElement;
7
+ static readonly style: CSSStyleSheet;
8
+ static readonly is = "node-projects-refactor-view";
9
+ static readonly properties: {};
10
+ private _instanceServiceContainer;
11
+ private _selectionChangedHandler;
12
+ private _selectedItems;
13
+ refactorings: Map<string, IRefactoring[]>;
14
+ ready(): void;
15
+ set instanceServiceContainer(value: InstanceServiceContainer);
16
+ get selectedItems(): IDesignItem[];
17
+ set selectedItems(items: IDesignItem[]);
18
+ _refactor(refactoring: [string, IRefactoring[]], event: KeyboardEvent): void;
19
+ updateRefactorlist(designItems: IDesignItem[]): void;
20
+ }
@@ -0,0 +1,99 @@
1
+ import { BaseCustomWebComponentConstructorAppend, css, html } from '@node-projects/base-custom-webcomponent';
2
+ export class RefactorView extends BaseCustomWebComponentConstructorAppend {
3
+ static template = html `
4
+ <div id="root">
5
+ <template repeat:item="[[this.refactorings]]">
6
+ <details>
7
+ <summary style="display: flex;">
8
+ name:<input value="[[item[0]]]" @keydown="[[this._refactor(item, event)]]" style="flex-grow: 1; min-width: 0">
9
+ </summary>
10
+ <ul>
11
+ <template repeat:reft="[[item[1]]]">
12
+ <li>[[reft.type]] - [[reft.display]]</li>
13
+ </template>
14
+ </ul>
15
+ </details>
16
+ </template>
17
+ </div>`;
18
+ static style = css `
19
+ :host {
20
+ box-sizing: border-box;
21
+ font-family: monospace;
22
+ height: 100%;
23
+ width: 100%;
24
+ position: absolute;
25
+ overflow: hidden;
26
+ }
27
+
28
+ ul {
29
+ margin: 4px;
30
+ padding-left: 30px;
31
+ font-size: 10px;
32
+ }
33
+
34
+ #root {
35
+ padding: 5px;
36
+ display: flex;
37
+ flex-direction: column;
38
+ gap: 4px;
39
+ overflow-y: auto;
40
+ height: calc(100% - 10px);
41
+ }`;
42
+ static is = 'node-projects-refactor-view';
43
+ static properties = {};
44
+ _instanceServiceContainer;
45
+ _selectionChangedHandler;
46
+ _selectedItems;
47
+ refactorings = new Map();
48
+ ;
49
+ ready() {
50
+ this._bindingsParse();
51
+ }
52
+ set instanceServiceContainer(value) {
53
+ this._instanceServiceContainer = value;
54
+ this._selectionChangedHandler?.dispose();
55
+ this._selectionChangedHandler = this._instanceServiceContainer.selectionService.onSelectionChanged.on(e => {
56
+ this.selectedItems = e.selectedElements;
57
+ });
58
+ this.selectedItems = this._instanceServiceContainer.selectionService.selectedElements;
59
+ }
60
+ get selectedItems() {
61
+ return this._selectedItems;
62
+ }
63
+ set selectedItems(items) {
64
+ if (this._selectedItems != items) {
65
+ this._selectedItems = items;
66
+ this.updateRefactorlist(this._selectedItems);
67
+ }
68
+ }
69
+ _refactor(refactoring, event) {
70
+ const ip = event.target;
71
+ if (event.key == 'Enter') {
72
+ for (let r of refactoring[1]) {
73
+ r.service.refactor(r, r.name, ip.value);
74
+ }
75
+ }
76
+ }
77
+ updateRefactorlist(designItems) {
78
+ this.refactorings.clear();
79
+ if (designItems && designItems.length) {
80
+ let refactorings = [];
81
+ const serviceContainer = designItems[0].serviceContainer;
82
+ for (let s of serviceContainer.refactorServices) {
83
+ let rfs = s.getRefactorings(designItems);
84
+ refactorings.push(...rfs);
85
+ }
86
+ //Group refactorings by name
87
+ for (const r of refactorings) {
88
+ let thisList = this.refactorings.get(r.name);
89
+ if (thisList === undefined) {
90
+ thisList = [];
91
+ this.refactorings.set(r.name, thisList);
92
+ }
93
+ thisList.push(r);
94
+ }
95
+ }
96
+ this._bindingsRefresh();
97
+ }
98
+ }
99
+ customElements.define(RefactorView.is, RefactorView);
package/dist/index.d.ts CHANGED
@@ -120,6 +120,9 @@ export * from "./elements/services/propertiesService/services/CssCustomPropertie
120
120
  export * from "./elements/services/propertiesService/services/UnkownElementsPropertiesService.js";
121
121
  export * from "./elements/services/propertiesService/PropertyType.js";
122
122
  export * from "./elements/services/propertiesService/ValueType.js";
123
+ export * from "./elements/services/refactorService/BindingsRefactorService.js";
124
+ export type { IRefactorService } from "./elements/services/refactorService/IRefactorService.js";
125
+ export type { IRefactoring } from "./elements/services/refactorService/IRefactoring.js";
123
126
  export type { ISelectionChangedEvent } from "./elements/services/selectionService/ISelectionChangedEvent.js";
124
127
  export type { ISelectionService } from "./elements/services/selectionService/ISelectionService.js";
125
128
  export * from "./elements/services/selectionService/SelectionService.js";
@@ -246,6 +249,7 @@ export * from "./elements/widgets/designerView/extensions/pointerExtensions/Curs
246
249
  export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtensionProvider.js";
247
250
  export type { IMiniatureView } from "./elements/widgets/miniatureView/IMiniatureView.js";
248
251
  export * from "./elements/widgets/debugView/debug-view.js";
252
+ export * from "./elements/widgets/refactorView/refactor-view.js";
249
253
  export * from "./elements/widgets/demoView/demoView.js";
250
254
  export * from "./elements/widgets/paletteView/paletteElements.js";
251
255
  export * from "./elements/widgets/paletteView/paletteView.js";
package/dist/index.js CHANGED
@@ -80,6 +80,7 @@ export * from "./elements/services/propertiesService/services/CssCustomPropertie
80
80
  export * from "./elements/services/propertiesService/services/UnkownElementsPropertiesService.js";
81
81
  export * from "./elements/services/propertiesService/PropertyType.js";
82
82
  export * from "./elements/services/propertiesService/ValueType.js";
83
+ export * from "./elements/services/refactorService/BindingsRefactorService.js";
83
84
  export * from "./elements/services/selectionService/SelectionService.js";
84
85
  export * from "./elements/services/stylesheetService/AbstractStylesheetService.js";
85
86
  export * from "./elements/services/undoService/ChangeGroup.js";
@@ -186,6 +187,7 @@ export * from "./elements/widgets/designerView/extensions/pointerExtensions/Abst
186
187
  export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtension.js";
187
188
  export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtensionProvider.js";
188
189
  export * from "./elements/widgets/debugView/debug-view.js";
190
+ export * from "./elements/widgets/refactorView/refactor-view.js";
189
191
  export * from "./elements/widgets/demoView/demoView.js";
190
192
  export * from "./elements/widgets/paletteView/paletteElements.js";
191
193
  export * from "./elements/widgets/paletteView/paletteView.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.1.25",
4
+ "version": "0.1.27",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",
@@ -12,10 +12,10 @@
12
12
  "prepublishOnly": "npm run build"
13
13
  },
14
14
  "dependencies": {
15
- "@node-projects/base-custom-webcomponent": ">=0.19.0"
15
+ "@node-projects/base-custom-webcomponent": ">=0.21.2"
16
16
  },
17
17
  "devDependencies": {
18
- "mdn-data": "^2.1.0"
18
+ "mdn-data": "^2.3.0"
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",