@node-projects/web-component-designer 0.0.266 → 0.0.268

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.
@@ -87,4 +87,5 @@ export declare class DesignItem implements IDesignItem {
87
87
  _removeChildInternal(designItem: IDesignItem): void;
88
88
  _refreshIfStyleSheet(): void;
89
89
  getPlacementService(style?: CSSStyleDeclaration): IPlacementService;
90
+ static createDesignItemFromImageBlob(serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, data: Blob): Promise<IDesignItem>;
90
91
  }
@@ -482,4 +482,16 @@ export class DesignItem {
482
482
  style ??= getComputedStyle(this.element);
483
483
  return this.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this, style));
484
484
  }
485
+ static createDesignItemFromImageBlob(serviceContainer, instanceServiceContainer, data) {
486
+ return new Promise(resolve => {
487
+ let reader = new FileReader();
488
+ reader.onloadend = () => {
489
+ const img = document.createElement('img');
490
+ img.src = reader.result;
491
+ const di = DesignItem.createDesignItemFromInstance(img, serviceContainer, instanceServiceContainer);
492
+ return resolve(di);
493
+ };
494
+ reader.readAsDataURL(data);
495
+ });
496
+ }
485
497
  }
@@ -1,11 +1,12 @@
1
+ import { IDesignItem } from "../../item/IDesignItem.js";
1
2
  import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
3
  import { IProperty } from "../propertiesService/IProperty.js";
3
4
  import { IBindableObject } from "./IBindableObject.js";
4
5
  export interface IBindableObjectDragDropService {
5
- dragEnter(designerCanvas: IDesignerCanvas, event: DragEvent, element: Element): any;
6
- dragLeave(designerCanvas: IDesignerCanvas, event: DragEvent, element: Element): any;
6
+ dragEnter(designerCanvas: IDesignerCanvas, event: DragEvent, element: Element): void;
7
+ dragLeave(designerCanvas: IDesignerCanvas, event: DragEvent, element: Element): void;
7
8
  dragOver(designerCanvas: IDesignerCanvas, event: DragEvent, element: Element): 'none' | 'copy' | 'link' | 'move';
8
- drop(designerCanvas: IDesignerCanvas, event: DragEvent, bindableObject: IBindableObject<any>, element: Element): any;
9
- dragOverOnProperty?(event: DragEvent, property: IProperty): 'none' | 'copy' | 'link' | 'move';
10
- dropOnProperty?(event: DragEvent, property: IProperty): any;
9
+ drop(designerCanvas: IDesignerCanvas, event: DragEvent, bindableObject: IBindableObject<any>, element: Element): void;
10
+ dragOverOnProperty?(event: DragEvent, property: IProperty, designItems: IDesignItem[]): 'none' | 'copy' | 'link' | 'move';
11
+ dropOnProperty?(event: DragEvent, property: IProperty, bindableObject: IBindableObject<any>, designItems: IDesignItem[]): void;
11
12
  }
@@ -1,5 +1,6 @@
1
1
  import { DomConverter } from "../../widgets/designerView/DomConverter.js";
2
2
  import { copyToClipboard, getFromClipboard, getTextFromClipboard } from "../../helper/ClipboardHelper.js";
3
+ import { DesignItem } from "../../item/DesignItem.js";
3
4
  export class CopyPasteAsJsonService {
4
5
  async copyItems(designItems) {
5
6
  const copyText = DomConverter.ConvertToString(designItems, false);
@@ -26,6 +27,15 @@ export class CopyPasteAsJsonService {
26
27
  data = await (await items[0].getType('application/json'))?.text();
27
28
  }
28
29
  catch { }
30
+ try {
31
+ let imageFmt = items[0].types.find(x => x.startsWith("image/"));
32
+ if (imageFmt) {
33
+ let imgData = await items[0].getType(imageFmt);
34
+ let di = await DesignItem.createDesignItemFromImageBlob(serviceContainer, instanceServiceContainer, imgData);
35
+ return [[di]];
36
+ }
37
+ }
38
+ catch { }
29
39
  }
30
40
  else {
31
41
  data = await getTextFromClipboard();
@@ -2,5 +2,5 @@ import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
2
  import { IExternalDragDropService } from "./IExternalDragDropService.js";
3
3
  export declare class ExternalDragDropService implements IExternalDragDropService {
4
4
  dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
5
- drop(designerCanvas: IDesignerCanvas, event: DragEvent): void;
5
+ drop(designerCanvas: IDesignerCanvas, event: DragEvent): Promise<void>;
6
6
  }
@@ -6,23 +6,17 @@ export class ExternalDragDropService {
6
6
  return 'copy';
7
7
  return 'none';
8
8
  }
9
- drop(designerCanvas, event) {
9
+ async drop(designerCanvas, event) {
10
10
  if (event.dataTransfer.files[0].type.startsWith('image/')) {
11
- let reader = new FileReader();
12
- reader.onloadend = () => {
13
- const img = document.createElement('img');
14
- img.src = reader.result;
15
- const di = DesignItem.createDesignItemFromInstance(img, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
16
- let grp = di.openGroup("Insert of &lt;img&gt;");
17
- di.setStyle('position', 'absolute');
18
- const targetRect = event.target.getBoundingClientRect();
19
- di.setStyle('top', event.offsetY + targetRect.top - designerCanvas.containerBoundingRect.y + 'px');
20
- di.setStyle('left', event.offsetX + targetRect.left - designerCanvas.containerBoundingRect.x + 'px');
21
- designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
22
- grp.commit();
23
- requestAnimationFrame(() => designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]));
24
- };
25
- reader.readAsDataURL(event.dataTransfer.files[0]);
11
+ let di = await DesignItem.createDesignItemFromImageBlob(designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer, event.dataTransfer.files[0]);
12
+ let grp = di.openGroup("Insert of &lt;img&gt;");
13
+ di.setStyle('position', 'absolute');
14
+ const targetRect = event.target.getBoundingClientRect();
15
+ di.setStyle('top', event.offsetY + targetRect.top - designerCanvas.containerBoundingRect.y + 'px');
16
+ di.setStyle('left', event.offsetX + targetRect.left - designerCanvas.containerBoundingRect.x + 'px');
17
+ designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
18
+ grp.commit();
19
+ requestAnimationFrame(() => designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]));
26
20
  }
27
21
  }
28
22
  }
@@ -7,6 +7,7 @@ import { TextPropertyEditor } from './propertyEditors/TextPropertyEditor.js';
7
7
  import { BooleanPropertyEditor } from './propertyEditors/BooleanPropertyEditor.js';
8
8
  import { ImageButtonListPropertyEditor } from './propertyEditors/ImageButtonListPropertyEditor.js';
9
9
  import { ThicknessPropertyEditor } from "./propertyEditors/ThicknessPropertyEditor.js";
10
+ import { FontPropertyEditor } from './propertyEditors/FontPropertyEditor.js';
10
11
  export class DefaultEditorTypesService {
11
12
  getEditorForProperty(property) {
12
13
  if (property.createEditor)
@@ -20,6 +21,10 @@ export class DefaultEditorTypesService {
20
21
  {
21
22
  return new ColorPropertyEditor(property);
22
23
  }
24
+ case "font":
25
+ {
26
+ return new FontPropertyEditor(property);
27
+ }
23
28
  case "date":
24
29
  {
25
30
  return new DatePropertyEditor(property);
@@ -0,0 +1,9 @@
1
+ import { IProperty } from '../IProperty.js';
2
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
3
+ import { ValueType } from '../ValueType.js';
4
+ export declare class FontPropertyEditor extends BasePropertyEditor<HTMLSelectElement> {
5
+ static fontList: string[];
6
+ constructor(property: IProperty);
7
+ parseFontList(): void;
8
+ refreshValue(valueType: ValueType, value: any): void;
9
+ }
@@ -0,0 +1,37 @@
1
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
2
+ export class FontPropertyEditor extends BasePropertyEditor {
3
+ static fontList;
4
+ constructor(property) {
5
+ super(property);
6
+ let element = document.createElement("select");
7
+ this.element = element;
8
+ if (FontPropertyEditor.fontList) {
9
+ this.parseFontList();
10
+ //@ts-ignore
11
+ }
12
+ else if (window.queryLocalFonts) {
13
+ //@ts-ignore
14
+ window.queryLocalFonts().then(x => {
15
+ //@ts-ignore
16
+ FontPropertyEditor.fontList = [...new Set(x.map(y => y.family))];
17
+ this.parseFontList();
18
+ });
19
+ }
20
+ else {
21
+ FontPropertyEditor.fontList = ["Verdana", "Arial", "Tahoma", "Trebuchet MS", "Times New Roman", "Georgia", "Garamond", "Courier New", "Brush Script MT"];
22
+ this.parseFontList();
23
+ }
24
+ }
25
+ parseFontList() {
26
+ for (let v of FontPropertyEditor.fontList) {
27
+ let option = document.createElement("option");
28
+ option.value = v;
29
+ option.text = v;
30
+ this.element.appendChild(option);
31
+ }
32
+ this.element.onchange = (e) => this._valueChanged(this.element.value);
33
+ }
34
+ refreshValue(valueType, value) {
35
+ this.element.value = value;
36
+ }
37
+ }
@@ -0,0 +1,7 @@
1
+ import { IProperty } from '../IProperty.js';
2
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
3
+ import { ValueType } from '../ValueType.js';
4
+ export declare class SelectPropertyEditor extends BasePropertyEditor<HTMLSelectElement> {
5
+ constructor(property: IProperty);
6
+ refreshValue(valueType: ValueType, value: any): void;
7
+ }
@@ -0,0 +1,28 @@
1
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
2
+ export class SelectPropertyEditor extends BasePropertyEditor {
3
+ constructor(property) {
4
+ super(property);
5
+ let element = document.createElement("select");
6
+ if (property.type == 'enum') {
7
+ for (let v of property.enumValues) {
8
+ let option = document.createElement("option");
9
+ option.value = v[1];
10
+ option.text = v[0];
11
+ element.appendChild(option);
12
+ }
13
+ }
14
+ else {
15
+ for (let v of property.values) {
16
+ let option = document.createElement("option");
17
+ option.value = v;
18
+ option.text = v;
19
+ element.appendChild(option);
20
+ }
21
+ }
22
+ element.onchange = (e) => this._valueChanged(element.value);
23
+ this.element = element;
24
+ }
25
+ refreshValue(valueType, value) {
26
+ this.element.value = value;
27
+ }
28
+ }
@@ -281,7 +281,9 @@
281
281
  "floodOpacity": {},
282
282
  "font": {},
283
283
  "fontDisplay": {},
284
- "fontFamily": {},
284
+ "fontFamily": {
285
+ "type": "font"
286
+ },
285
287
  "fontFeatureSettings": {},
286
288
  "fontKerning": {},
287
289
  "fontOpticalSizing": {},
@@ -32,6 +32,7 @@ export class CssPropertiesService extends CommonPropertiesService {
32
32
  "box-shadow",
33
33
  "opacity",
34
34
  "position",
35
+ "font-family",
35
36
  "font-size",
36
37
  "font-weight",
37
38
  "inset",
@@ -780,8 +780,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
780
780
  const ddService = this.serviceContainer.bindableObjectDragDropService;
781
781
  if (ddService) {
782
782
  const el = this.getElementAtPoint({ x: event.x, y: event.y });
783
- const effect = ddService.drop(this, event, bo, el);
784
- event.dataTransfer.dropEffect = effect;
783
+ ddService.drop(this, event, bo, el);
785
784
  }
786
785
  }
787
786
  else {
@@ -224,7 +224,7 @@ export class PropertyGridPropertyList extends BaseCustomWebComponentLazyAppend {
224
224
  if (hasTransferDataBindingObject) {
225
225
  const ddService = this._serviceContainer.bindableObjectDragDropService;
226
226
  if (ddService) {
227
- const effect = ddService.dragOverOnProperty(event, property);
227
+ const effect = ddService.dragOverOnProperty(event, property, this._designItems);
228
228
  if ((effect ?? 'none') != 'none') {
229
229
  label.classList.add('createBinding');
230
230
  event.dataTransfer.dropEffect = effect;
@@ -238,11 +238,12 @@ export class PropertyGridPropertyList extends BaseCustomWebComponentLazyAppend {
238
238
  _onDrop(event, property, label) {
239
239
  event.preventDefault();
240
240
  label.classList.remove('createBinding');
241
- const hasTransferDataBindingObject = event.dataTransfer.types.indexOf(dragDropFormatNameBindingObject) >= 0;
242
- if (hasTransferDataBindingObject) {
241
+ const transferDataBindingObject = event.dataTransfer.getData(dragDropFormatNameBindingObject);
242
+ if (transferDataBindingObject) {
243
+ const bo = JSON.parse(transferDataBindingObject);
243
244
  const ddService = this._serviceContainer.bindableObjectDragDropService;
244
245
  if (ddService) {
245
- ddService.dropOnProperty(event, property);
246
+ ddService.dropOnProperty(event, property, bo, this._designItems);
246
247
  }
247
248
  }
248
249
  }
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.266",
4
+ "version": "0.0.268",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",