Files
Umbraco-CMS/src/Umbraco.Web.UI.Client
Bjarne Fyrstenborg c53cb49496 Adjust Image Cropper handle (focal point) (#1021)
* Adjust Image Cropper focal point to be consistent with Color Area handle

* Make focus point focusable via keyboard

* Update import of utils from uui

* Make focal point accessible via keyboard

* Move logic to function

* Reset coords

* Remove reset coords

* Reset coords if focal point is updated to center

* Format document

* Set focal point property instead

* Formatting

* Fix warnings

* Width and height

* Remove added outline so we can see when focal point has focus via keyboard

* Reset coords

* Cleanup

* Update import

* Cleanup

* Use UmbChangeEvent

* Adjust elements

* Import drag for uui

* Cleanup styling

* Cleanup

* Remove unnecessary events

* Container is HTMLElement

* Check focal point updated

* Fix conflicts after merge

* Null check

* Update correct element types

* Revert to custom event

* Cleanup console

* Don't hide overflow, so focal point is not cut off on edges on image

* Add margin top at actions so focal point doesn't overlap buttons

* Top margin at actions

* Crosshair cursor when focal point is not hidden

* Cancel update focal point

* Add move cursor to viewport image

* Use crop label

* Add missing label

* Disable draggable of image as in old backoffice

* Fix previous merge conflicts

* Update src/packages/media/media/components/input-image-cropper/image-cropper-focus-setter.element.ts

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>

* Update src/packages/media/media/components/input-image-cropper/image-cropper-focus-setter.element.ts

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>

* Update src/packages/media/media/components/input-image-cropper/image-cropper-focus-setter.element.ts

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>

* Update src/packages/media/media/components/input-image-cropper/image-cropper-focus-setter.element.ts

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>

* Remove disconnectedCallback

* Ignore in the debug element

* Add custom event for focal point change

* Import type

* Replace with UmbImageCropChangeEvent

* Use UmbFocalPointModel

* Move set focal pont style to setter

* Update custom event name

* Localize focal point label

* Fix import of UmbFocalPointModel type

* Localize buttons

* Update labels

* Combine imports

---------

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
2024-10-16 14:13:57 +02:00
..
2024-10-11 08:34:48 +02:00
2024-10-14 10:02:35 +02:00
2024-10-14 10:02:35 +02:00
2024-10-01 13:19:32 +02:00

@umbraco-cms/backoffice

This package contains the types for the Umbraco Backoffice.

Installation

npm install -D @umbraco-cms/backoffice

Usage

Vanilla JavaScript

Create an umbraco-package.json file in the root of your package.

{
	"name": "My.Package",
	"version": "0.1.0",
	"extensions": [
		{
			"type": "dashboard",
			"alias": "my.custom.dashboard",
			"name": "My Dashboard",
			"js": "/App_Plugins/MyPackage/dashboard.js",
			"weight": -1,
			"meta": {
				"label": "My Dashboard",
				"pathname": "my-dashboard"
			},
			"conditions": [
				{
					"alias": "Umb.Condition.SectionAlias",
					"match": "Umb.Section.Content"
				}
			]
		}
	]
}

Then create a dashboard.js file the same folder.

import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';
import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';

const template = document.createElement('template');
template.innerHTML = `
  <style>
    :host {
      padding: 20px;
      display: block;
      box-sizing: border-box;
    }
  </style>

  <uui-box>
    <h1>Welcome to my dashboard</h1>
    <p>Example of vanilla JS code</p>

    <uui-button label="Click me" id="clickMe" look="secondary"></uui-button>
  </uui-box>
`;

export default class MyDashboardElement extends UmbElementMixin(HTMLElement) {
	/** @type {import('@umbraco-cms/backoffice/notification').UmbNotificationContext} */
	#notificationContext;

	constructor() {
		super();
		this.attachShadow({ mode: 'open' });
		this.shadowRoot.appendChild(template.content.cloneNode(true));

		this.shadowRoot.getElementById('clickMe').addEventListener('click', this.onClick.bind(this));

		this.consumeContext(UMB_NOTIFICATION_CONTEXT, (_instance) => {
			this.#notificationContext = _instance;
		});
	}

	onClick = () => {
		this.#notificationContext?.peek('positive', { data: { headline: 'Hello' } });
	};
}

customElements.define('my-custom-dashboard', MyDashboardElement);

TypeScript with Lit

First install Lit and Vite. This command will create a new folder called my-package which will have the Vite tooling and Lit for WebComponent development setup.

npm create vite@latest -- --template lit-ts my-package

Go to the new folder and install the backoffice package.

cd my-package
npm install -D @umbraco-cms/backoffice

Then go to the element located in src/my-element.ts and replace it with the following code.

// src/my-element.ts
import { LitElement, html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';
import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';

@customElement('my-element')
export default class MyElement extends UmbElementMixin(LitElement) {
	private _notificationContext?: UmbNotificationContext;

	constructor() {
		super();
		this.consumeContext(UMB_NOTIFICATION_CONTEXT, (_instance) => {
			this._notificationContext = _instance;
		});
	}

	onClick() {
		this._notificationContext?.peek('positive', { data: { message: '#h5yr' } });
	}

	override render() {
		return html`
			<uui-box headline="Welcome">
				<p>A TypeScript Lit Dashboard</p>
				<uui-button look="primary" label="Click me" @click=${() => this.onClick()}></uui-button>
			</uui-box>
		`;
	}
}

declare global {
	interface HTMLElementTagNameMap {
		'my-element': MyElement;
	}
}

Finally add an umbraco-package.json file in the root of your package folder my-package.

{
	"name": "My.Package",
	"version": "0.1.0",
	"extensions": [
		{
			"type": "dashboard",
			"alias": "my.custom.dashboard",
			"name": "My Dashboard",
			"js": "/App_Plugins/MyPackage/dist/my-package.js",
			"weight": -1,
			"meta": {
				"label": "My Dashboard",
				"pathname": "my-dashboard"
			},
			"conditions": [
				{
					"alias": "Umb.Condition.SectionAlias",
					"match": "Umb.Section.Content"
				}
			]
		}
	]
}