@node-projects/web-component-designer 0.0.109 → 0.0.112

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.
@@ -28,6 +28,10 @@ import { IBindableObjectsService } from "./bindableObjectsService/IBindableObjec
28
28
  import { IBindableObjectDragDropService } from "./bindableObjectsService/IBindableObjectDragDropService.js";
29
29
  import { IDesignViewToolbarButtonProvider } from "../widgets/designerView/tools/toolBar/IDesignViewToolbarButtonProvider.js";
30
30
  import { IElementInteractionService } from './elementInteractionService/IElementInteractionService';
31
+ import { IProperty } from "./propertiesService/IProperty.js";
32
+ import { IDesignItem } from "../item/IDesignItem.js";
33
+ import { IBinding } from "../item/IBinding";
34
+ import { BindingTarget } from "../item/BindingTarget";
31
35
  interface ServiceNameMap {
32
36
  "propertyService": IPropertiesService;
33
37
  "containerService": IPlacementService;
@@ -52,6 +56,7 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
52
56
  readonly config: {
53
57
  codeViewWidget: new (...args: any[]) => ICodeView & HTMLElement;
54
58
  demoViewWidget: new (...args: any[]) => IDemoView & HTMLElement;
59
+ openBindingsEditor?: (property: IProperty, designItems: IDesignItem[], binding: IBinding, bindingTarget: BindingTarget) => Promise<void>;
55
60
  };
56
61
  readonly designerExtensions: Map<(ExtensionType | string), IDesignerExtensionProvider[]>;
57
62
  removeDesignerExtensionOfType(container: (ExtensionType | string), lambda: new (...args: any[]) => IDesignerExtensionProvider): void;
@@ -3,10 +3,12 @@ import { IService } from '../IService';
3
3
  import { IDesignItem } from '../../item/IDesignItem';
4
4
  import { ValueType } from './ValueType';
5
5
  import { BindingTarget } from '../../item/BindingTarget';
6
+ import { IBinding } from '../../item/IBinding';
6
7
  export interface IPropertiesService extends IService {
7
8
  isHandledElement(designItem: IDesignItem): boolean;
8
9
  getProperties(designItem: IDesignItem): IProperty[];
9
10
  getProperty(designItem: IDesignItem, name: string): IProperty;
11
+ getBinding(designItems: IDesignItem[], property: IProperty): IBinding;
10
12
  getPropertyTarget(designItem: IDesignItem, property: IProperty): BindingTarget;
11
13
  setValue(designItems: IDesignItem[], property: IProperty, value: any): any;
12
14
  clearValue(designItems: IDesignItem[], property: IProperty): any;
@@ -2,6 +2,7 @@ import { IPropertiesService } from "../IPropertiesService";
2
2
  import { IProperty } from '../IProperty';
3
3
  import { IDesignItem } from '../../../item/IDesignItem';
4
4
  import { ValueType } from "../ValueType";
5
+ import { IBinding } from "../../../item/IBinding.js";
5
6
  import { BindingTarget } from "../../../item/BindingTarget";
6
7
  export declare class AttributesPropertiesService implements IPropertiesService {
7
8
  name: string;
@@ -13,5 +14,6 @@ export declare class AttributesPropertiesService implements IPropertiesService {
13
14
  clearValue(designItems: IDesignItem[], property: IProperty): void;
14
15
  isSet(designItems: IDesignItem[], property: IProperty): ValueType;
15
16
  getValue(designItems: IDesignItem[], property: IProperty): string;
17
+ getBinding(designItems: IDesignItem[], property: IProperty): IBinding;
16
18
  getUnsetValue(designItems: IDesignItem[], property: IProperty): any;
17
19
  }
@@ -62,6 +62,13 @@ export class AttributesPropertiesService {
62
62
  }
63
63
  return null;
64
64
  }
65
+ getBinding(designItems, property) {
66
+ //TODO: optimize perf, do not call bindings service for each property.
67
+ const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
68
+ return s.getBindings(designItems[0]);
69
+ });
70
+ return bindings.find(x => (x.target == BindingTarget.property || x.target == BindingTarget.attribute) && x.targetName == property.name);
71
+ }
65
72
  getUnsetValue(designItems, property) {
66
73
  return property.defaultValue;
67
74
  }
@@ -3,6 +3,7 @@ import { IProperty } from '../IProperty';
3
3
  import { IDesignItem } from '../../../item/IDesignItem';
4
4
  import { ValueType } from "../ValueType";
5
5
  import { BindingTarget } from "../../../item/BindingTarget";
6
+ import { IBinding } from "../../../item/IBinding";
6
7
  export declare class CommonPropertiesService implements IPropertiesService {
7
8
  private commonProperties;
8
9
  name: string;
@@ -14,5 +15,6 @@ export declare class CommonPropertiesService implements IPropertiesService {
14
15
  clearValue(designItems: IDesignItem[], property: IProperty): void;
15
16
  isSet(designItems: IDesignItem[], property: IProperty): ValueType;
16
17
  getValue(designItems: IDesignItem[], property: IProperty): string | boolean;
18
+ getBinding(designItems: IDesignItem[], property: IProperty): IBinding;
17
19
  getUnsetValue(designItems: IDesignItem[], property: IProperty): any;
18
20
  }
@@ -106,6 +106,13 @@ export class CommonPropertiesService {
106
106
  }
107
107
  return null;
108
108
  }
109
+ getBinding(designItems, property) {
110
+ //TODO: optimize perf, do not call bindings service for each property.
111
+ const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
112
+ return s.getBindings(designItems[0]);
113
+ });
114
+ return bindings.find(x => (x.target == BindingTarget.property || x.target == BindingTarget.attribute) && x.targetName == property.name);
115
+ }
109
116
  getUnsetValue(designItems, property) {
110
117
  return property.defaultValue;
111
118
  }
@@ -3,6 +3,7 @@ import { IProperty } from '../IProperty';
3
3
  import { IDesignItem } from '../../../item/IDesignItem';
4
4
  import { ValueType } from '../ValueType';
5
5
  import { BindingTarget } from '../../../item/BindingTarget.js';
6
+ import { IBinding } from '../../../item/IBinding';
6
7
  export declare class CssPropertiesService implements IPropertiesService {
7
8
  private styles;
8
9
  private alignment;
@@ -18,5 +19,6 @@ export declare class CssPropertiesService implements IPropertiesService {
18
19
  clearValue(designItems: IDesignItem[], property: IProperty): void;
19
20
  isSet(designItems: IDesignItem[], property: IProperty): ValueType;
20
21
  getValue(designItems: IDesignItem[], property: IProperty): string;
22
+ getBinding(designItems: IDesignItem[], property: IProperty): IBinding;
21
23
  getUnsetValue(designItems: IDesignItem[], property: IProperty): any;
22
24
  }
@@ -312,6 +312,13 @@ export class CssPropertiesService {
312
312
  }
313
313
  return null;
314
314
  }
315
+ getBinding(designItems, property) {
316
+ //TODO: optimize perf, do not call bindings service for each property.
317
+ const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
318
+ return s.getBindings(designItems[0]);
319
+ });
320
+ return bindings.find(x => (x.target == BindingTarget.css) && x.targetName == property.name);
321
+ }
315
322
  //todo: optimize perf, call window.getComputedStyle only once per item, and not per property
316
323
  getUnsetValue(designItems, property) {
317
324
  if (designItems != null && designItems.length !== 0) {
@@ -3,6 +3,7 @@ import { IProperty } from '../IProperty';
3
3
  import { IDesignItem } from '../../../item/IDesignItem';
4
4
  import { ValueType } from "../ValueType";
5
5
  import { BindingTarget } from "../../../item/BindingTarget";
6
+ import { IBinding } from "../../../item/IBinding";
6
7
  export declare abstract class UnkownElementPropertiesService implements IPropertiesService {
7
8
  isHandledElement(designItem: IDesignItem): boolean;
8
9
  protected _notifyChangedProperty(designItem: IDesignItem, property: IProperty, value: any): void;
@@ -12,6 +13,7 @@ export declare abstract class UnkownElementPropertiesService implements IPropert
12
13
  getPropertyTarget(designItem: IDesignItem, property: IProperty): BindingTarget;
13
14
  clearValue(designItems: IDesignItem[], property: IProperty): void;
14
15
  isSet(designItems: IDesignItem[], property: IProperty): ValueType;
16
+ getBinding(designItems: IDesignItem[], property: IProperty): IBinding;
15
17
  getValue(designItems: IDesignItem[], property: IProperty): string | boolean;
16
18
  getUnsetValue(designItems: IDesignItem[], property: IProperty): any;
17
19
  }
@@ -69,11 +69,24 @@ export class UnkownElementPropertiesService {
69
69
  all = all && has;
70
70
  some = some || has;
71
71
  });
72
+ //TODO: optimize perf, do not call bindings service for each property.
73
+ const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
74
+ return s.getBindings(designItems[0]);
75
+ });
76
+ if (bindings && bindings.find(x => (x.target == BindingTarget.property || x.target == BindingTarget.attribute) && x.targetName == property.name))
77
+ return ValueType.bound;
72
78
  }
73
79
  else
74
80
  return ValueType.none;
75
81
  return all ? ValueType.all : some ? ValueType.some : ValueType.none;
76
82
  }
83
+ getBinding(designItems, property) {
84
+ //TODO: optimize perf, do not call bindings service for each property.
85
+ const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
86
+ return s.getBindings(designItems[0]);
87
+ });
88
+ return bindings.find(x => (x.target == BindingTarget.property || x.target == BindingTarget.attribute) && x.targetName == property.name);
89
+ }
77
90
  getValue(designItems, property) {
78
91
  if (designItems != null && designItems.length !== 0) {
79
92
  let attributeName = PropertiesHelper.camelToDashCase(property.name);
@@ -1,3 +1,4 @@
1
+ import { IProperty } from '../../services/propertiesService/IProperty';
1
2
  import { ServiceContainer } from '../../services/ServiceContainer';
2
3
  import { BaseCustomWebComponentLazyAppend } from '@node-projects/base-custom-webcomponent';
3
4
  import { IDesignItem } from '../../item/IDesignItem';
@@ -12,6 +13,7 @@ export declare class PropertyGridPropertyList extends BaseCustomWebComponentLazy
12
13
  constructor(serviceContainer: ServiceContainer);
13
14
  setPropertiesService(propertiesService: IPropertiesService): void;
14
15
  createElements(designItem: IDesignItem): void;
16
+ openContextMenu(event: MouseEvent, property: IProperty): void;
15
17
  designItemsChanged(designItems: IDesignItem[]): void;
16
18
  refreshForDesignItems(items: IDesignItem[]): void;
17
19
  }
@@ -114,10 +114,10 @@ export class PropertyGridPropertyList extends BaseCustomWebComponentLazyAppend {
114
114
  rect.style.border = '1px white solid';
115
115
  rectContainer.appendChild(rect);
116
116
  this._div.appendChild(rectContainer);
117
- ContextMenuHelper.addContextMenu(rectContainer, [
118
- { title: 'clear', action: (e) => p.service.clearValue(this._designItems, p) },
119
- { title: 'new binding', action: (e) => alert('new binding() ' + p.name) }
120
- ]);
117
+ rect.oncontextmenu = (event) => {
118
+ event.preventDefault();
119
+ this.openContextMenu(event, p);
120
+ };
121
121
  let label = document.createElement("label");
122
122
  label.htmlFor = p.name;
123
123
  label.textContent = p.name;
@@ -131,6 +131,23 @@ export class PropertyGridPropertyList extends BaseCustomWebComponentLazyAppend {
131
131
  }
132
132
  }
133
133
  }
134
+ openContextMenu(event, property) {
135
+ const ctxMenu = [
136
+ { title: 'clear', action: (e) => property.service.clearValue(this._designItems, property) },
137
+ ];
138
+ if (this._serviceContainer.config.openBindingsEditor) {
139
+ ctxMenu.push(...[
140
+ { title: '-' },
141
+ { title: 'edit binding', action: () => {
142
+ let target = this._propertiesService.getPropertyTarget(this._designItems[0], property);
143
+ let binding = this._propertiesService.getBinding(this._designItems, property);
144
+ this._serviceContainer.config.openBindingsEditor(property, this._designItems, binding, target);
145
+ } }
146
+ ]);
147
+ }
148
+ ;
149
+ ContextMenuHelper.showContextMenu(null, event, null, ctxMenu);
150
+ }
134
151
  designItemsChanged(designItems) {
135
152
  this._designItems = designItems;
136
153
  for (let m of this._propertyMap) {
@@ -141,6 +158,7 @@ export class PropertyGridPropertyList extends BaseCustomWebComponentLazyAppend {
141
158
  for (let m of this._propertyMap) {
142
159
  let s = this._propertiesService.isSet(items, m[0]);
143
160
  let v = this._propertiesService.getValue(items, m[0]);
161
+ m[1].isSetElement.title = s;
144
162
  if (s == ValueType.none) {
145
163
  m[1].isSetElement.style.background = '';
146
164
  v = this._propertiesService.getUnsetValue(items, m[0]);
package/dist/index.d.ts CHANGED
@@ -14,6 +14,9 @@ export * from "./elements/helper/Helper.js";
14
14
  export type { IContextMenuItem } from "./elements/helper/contextMenu/IContextmenuItem.js";
15
15
  export * from "./elements/item/DesignItem.js";
16
16
  export type { IDesignItem } from "./elements/item/IDesignItem.js";
17
+ export type { IBinding } from "./elements/item/IBinding.js";
18
+ export * from "./elements/item/BindingMode.js";
19
+ export * from "./elements/item/BindingTarget.js";
17
20
  export * from "./elements/services/bindableObjectsService/BindableObjectType.js";
18
21
  export type { IBindableObject } from "./elements/services/bindableObjectsService/IBindableObject.js";
19
22
  export type { IBindableObjectsService } from "./elements/services/bindableObjectsService/IBindableObjectsService.js";
package/dist/index.js CHANGED
@@ -12,6 +12,8 @@ export * from "./elements/helper/w3color.js";
12
12
  export * from "./elements/helper/contextMenu/ContextMenuHelper.js";
13
13
  export * from "./elements/helper/Helper.js";
14
14
  export * from "./elements/item/DesignItem.js";
15
+ export * from "./elements/item/BindingMode.js";
16
+ export * from "./elements/item/BindingTarget.js";
15
17
  export * from "./elements/services/bindableObjectsService/BindableObjectType.js";
16
18
  export * from "./elements/services/bindingsService/BaseCustomWebcomponentBindingsService.js";
17
19
  export * from "./elements/services/bindingsService/SpecialTagsBindingService.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.0.109",
4
+ "version": "0.0.112",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",
@@ -13,26 +13,26 @@
13
13
  "prepublishOnly": "npm run build"
14
14
  },
15
15
  "dependencies": {
16
- "@node-projects/base-custom-webcomponent": "^0.9.1",
16
+ "@node-projects/base-custom-webcomponent": "^0.9.2",
17
17
  "construct-style-sheets-polyfill": "^3.1.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@node-projects/lean-he-esm": "^3.3.0",
21
21
  "@node-projects/node-html-parser-esm": "^2.4.1",
22
- "@papyrs/stylo": "^0.0.34",
22
+ "@papyrs/stylo": "^0.0.37",
23
23
  "@types/codemirror": "^5.60.5",
24
24
  "@types/jquery": "^3.5.14",
25
25
  "@types/jquery.fancytree": "0.0.7",
26
- "ace-builds": "^1.7.1",
26
+ "ace-builds": "^1.9.6",
27
27
  "codemirror": "^6.0.1",
28
28
  "esprima-next": "^5.8.3",
29
29
  "html2canvas": "*",
30
- "jest": "^28.1.3",
31
- "jquery": "^3.6.0",
30
+ "jest": "^28.0.8",
31
+ "jquery": "^3.6.1",
32
32
  "jquery.fancytree": "^2.38.2",
33
- "monaco-editor": "^0.33.0",
34
- "ts-jest": "^28.0.7",
35
- "typescript": "^4.7.4",
33
+ "monaco-editor": "^0.34.0",
34
+ "ts-jest": "^28.0.8",
35
+ "typescript": "^4.8.2",
36
36
  "typescript-lit-html-plugin": "^0.9.0"
37
37
  },
38
38
  "repository": {