From b4a310698056a8185a166ebd2dc845a2aae5265a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 28 Oct 2024 14:56:14 +0100 Subject: [PATCH 01/37] wip add entity-create-option-action extension point --- .../entity-create-option-action.element.ts | 87 ++++++++++++++ .../create-option-action/default/index.ts | 1 + .../create-option-action/default/manifests.ts | 20 ++++ .../create-option-action/default/types.ts | 44 +++++++ .../entity-create-option-action-base.ts | 27 +++++ ...-create-option-action-element.interface.ts | 4 + ...ntity-create-option-action-list.element.ts | 108 ++++++++++++++++++ .../entity-create-option-action.extension.ts | 13 +++ .../entity-create-option-action.interface.ts | 17 +++ .../core/entity/create-option-action/index.ts | 7 ++ .../entity/create-option-action/manifests.ts | 4 + .../core/entity/create-option-action/types.ts | 5 + 12 files changed, 337 insertions(+) create mode 100644 src/packages/core/entity/create-option-action/default/entity-create-option-action.element.ts create mode 100644 src/packages/core/entity/create-option-action/default/index.ts create mode 100644 src/packages/core/entity/create-option-action/default/manifests.ts create mode 100644 src/packages/core/entity/create-option-action/default/types.ts create mode 100644 src/packages/core/entity/create-option-action/entity-create-option-action-base.ts create mode 100644 src/packages/core/entity/create-option-action/entity-create-option-action-element.interface.ts create mode 100644 src/packages/core/entity/create-option-action/entity-create-option-action-list.element.ts create mode 100644 src/packages/core/entity/create-option-action/entity-create-option-action.extension.ts create mode 100644 src/packages/core/entity/create-option-action/entity-create-option-action.interface.ts create mode 100644 src/packages/core/entity/create-option-action/index.ts create mode 100644 src/packages/core/entity/create-option-action/manifests.ts create mode 100644 src/packages/core/entity/create-option-action/types.ts diff --git a/src/packages/core/entity/create-option-action/default/entity-create-option-action.element.ts b/src/packages/core/entity/create-option-action/default/entity-create-option-action.element.ts new file mode 100644 index 0000000000..5c926bbe3e --- /dev/null +++ b/src/packages/core/entity/create-option-action/default/entity-create-option-action.element.ts @@ -0,0 +1,87 @@ +import type { UmbEntityCreateOptionAction } from '../entity-create-option-action.interface.js'; +import type { UmbEntityCreateOptionActionElement } from '../entity-create-option-action-element.interface.js'; +import type { ManifestEntityCreateOptionAction } from '../entity-create-option-action.extension.js'; +import type { MetaEntityCreateOptionActionDefaultKind } from './types.js'; +import { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; +import { html, nothing, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +const elementName = 'umb-entity-create-option-action'; +@customElement(elementName) +export class UmbEntityCreateOptionActionDefaultElement< + MetaType extends MetaEntityCreateOptionActionDefaultKind = MetaEntityCreateOptionActionDefaultKind, + ApiType extends UmbEntityCreateOptionAction = UmbEntityCreateOptionAction, + > + extends UmbLitElement + implements UmbEntityCreateOptionActionElement +{ + #api?: ApiType; + + // TODO: Do these need to be properties? [NL] + @property({ type: String }) + entityType?: string | null; + + // TODO: Do these need to be properties? [NL] + @property({ type: String }) + public unique?: string | null; + + @property({ attribute: false }) + public manifest?: ManifestEntityCreateOptionAction; + + public set api(api: ApiType | undefined) { + this.#api = api; + + // TODO: Fix so when we use a HREF it does not refresh the page? + this.#api?.getHref?.().then((href) => { + this._href = href; + // TODO: Do we need to update the component here? [NL] + }); + } + + @state() + _href?: string; + + override async focus() { + await this.updateComplete; + this.shadowRoot?.querySelector('uui-menu-item')?.focus(); + } + + async #onClickLabel(event: UUIMenuItemEvent) { + if (!this._href) { + event.stopPropagation(); + await this.#api?.execute(); + } + this.dispatchEvent(new UmbActionExecutedEvent()); + } + + // TODO: we need to stop the regular click event from bubbling up to the table so it doesn't select the row. + // This should probably be handled in the UUI Menu item component. so we don't dispatch a label-click event and click event at the same time. + #onClick(event: PointerEvent) { + event.stopPropagation(); + } + + override render() { + const label = this.manifest?.meta.label ? this.localize.string(this.manifest.meta.label) : this.manifest?.name; + + return html` + + ${this.manifest?.meta.icon + ? html`` + : nothing} + + `; + } +} + +export { UmbEntityCreateOptionActionDefaultElement as element }; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbEntityCreateOptionActionDefaultElement; + } +} diff --git a/src/packages/core/entity/create-option-action/default/index.ts b/src/packages/core/entity/create-option-action/default/index.ts new file mode 100644 index 0000000000..d4702960d5 --- /dev/null +++ b/src/packages/core/entity/create-option-action/default/index.ts @@ -0,0 +1 @@ +export * from './types.js'; diff --git a/src/packages/core/entity/create-option-action/default/manifests.ts b/src/packages/core/entity/create-option-action/default/manifests.ts new file mode 100644 index 0000000000..b1b7de24bf --- /dev/null +++ b/src/packages/core/entity/create-option-action/default/manifests.ts @@ -0,0 +1,20 @@ +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'kind', + alias: 'Umb.Kind.EntityCreateOptionAction.Default', + matchKind: 'default', + matchType: 'entityCreateOptionAction', + manifest: { + type: 'entityCreateOptionAction', + kind: 'default', + weight: 1000, + element: () => import('./entity-create-option-action.element.js'), + meta: { + icon: '', + label: 'Default Entity Create Option Action', + }, + }, + }, +]; diff --git a/src/packages/core/entity/create-option-action/default/types.ts b/src/packages/core/entity/create-option-action/default/types.ts new file mode 100644 index 0000000000..465664c91c --- /dev/null +++ b/src/packages/core/entity/create-option-action/default/types.ts @@ -0,0 +1,44 @@ +import type { + ManifestEntityCreateOptionAction, + MetaEntityCreateOptionAction, +} from '../entity-create-option-action.extension.js'; + +export interface ManifestEntityCreateOptionActionDefaultKind + extends ManifestEntityCreateOptionAction { + type: 'entityCreateOptionAction'; + kind: 'default'; +} + +export interface MetaEntityCreateOptionActionDefaultKind extends MetaEntityCreateOptionAction { + /** + * An icon to represent the action to be performed + * @examples [ + * "icon-box", + * "icon-grid" + * ] + */ + icon: string; + + /** + * The friendly name of the action to perform + * @examples [ + * "Create", + * "Create Content Template" + * ] + */ + label: string; + + /** + * The action requires additional input from the user. + * A dialog will prompt the user for more information or to make a choice. + * @type {boolean} + * @memberof MetaEntityCreateOptionActionDefaultKind + */ + additionalOptions?: boolean; +} + +declare global { + interface UmbExtensionManifestMap { + umbDefaultEntityCreateOptionActionKind: ManifestEntityCreateOptionActionDefaultKind; + } +} diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action-base.ts b/src/packages/core/entity/create-option-action/entity-create-option-action-base.ts new file mode 100644 index 0000000000..c8daf62492 --- /dev/null +++ b/src/packages/core/entity/create-option-action/entity-create-option-action-base.ts @@ -0,0 +1,27 @@ +import type { UmbEntityCreateOptionActionArgs } from './types.js'; +import type { UmbEntityCreateOptionAction } from './entity-create-option-action.interface.js'; +import { UmbActionBase } from '@umbraco-cms/backoffice/action'; + +export abstract class UmbEntityCreateOptionActionBase + extends UmbActionBase> + implements UmbEntityCreateOptionAction +{ + /** + * By specifying the href, the action will act as a link. + * The `execute` method will not be called. + * @abstract + * @returns {string | undefined} + */ + public getHref(): Promise { + return Promise.resolve(undefined); + } + + /** + * By specifying the `execute` method, the action will act as a button. + * @abstract + * @returns {Promise} + */ + public execute(): Promise { + return Promise.resolve(); + } +} diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action-element.interface.ts b/src/packages/core/entity/create-option-action/entity-create-option-action-element.interface.ts new file mode 100644 index 0000000000..6f2c9ab833 --- /dev/null +++ b/src/packages/core/entity/create-option-action/entity-create-option-action-element.interface.ts @@ -0,0 +1,4 @@ +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface UmbEntityCreateOptionActionElement extends UmbControllerHostElement {} diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action-list.element.ts b/src/packages/core/entity/create-option-action/entity-create-option-action-list.element.ts new file mode 100644 index 0000000000..082816e24f --- /dev/null +++ b/src/packages/core/entity/create-option-action/entity-create-option-action-list.element.ts @@ -0,0 +1,108 @@ +import type { UmbEntityCreateOptionActionArgs } from './types.js'; +import type { + ManifestEntityCreateOptionAction, + MetaEntityCreateOptionAction, +} from './entity-create-option-action.extension.js'; +import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; +import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbApiConstructorArgumentsMethodType } from '@umbraco-cms/backoffice/extension-api'; + +const elementName = 'umb-entity-create-option-action-list'; +@customElement(elementName) +export class UmbEntityCreateOptionActionListElement extends UmbLitElement { + @property({ type: String, attribute: 'entity-type' }) + public get entityType(): string | undefined { + return this._props.entityType; + } + public set entityType(value: string | undefined) { + if (value === undefined || value === this._props.entityType) return; + this._props.entityType = value; + this.#generateApiArgs(); + this.requestUpdate('_props'); + // Update filter: + //const oldValue = this._filter; + this._filter = (extension: ManifestEntityCreateOptionAction) => + extension.forEntityTypes.includes(value); + //this.requestUpdate('_filter', oldValue); + } + + @state() + _filter?: (extension: ManifestEntityCreateOptionAction) => boolean; + + @property({ type: String }) + public get unique(): string | null | undefined { + return this._props.unique; + } + public set unique(value: string | null | undefined) { + if (value === this._props.unique) return; + this._props.unique = value; + this.#generateApiArgs(); + this.requestUpdate('_props'); + } + + @state() + _props: Partial> = {}; + + @state() + _apiArgs?: UmbApiConstructorArgumentsMethodType< + ManifestEntityCreateOptionAction, + [UmbEntityCreateOptionActionArgs] + >; + + #entityContext = new UmbEntityContext(this); + + #generateApiArgs() { + if (!this._props.entityType || this._props.unique === undefined) return; + + this.#entityContext.setEntityType(this._props.entityType); + this.#entityContext.setUnique(this._props.unique); + this.#hasRenderedOnce = false; + + this._apiArgs = (manifest: ManifestEntityCreateOptionAction) => { + return [{ entityType: this._props.entityType!, unique: this._props.unique!, meta: manifest.meta }]; + }; + } + + #hasRenderedOnce?: boolean; + override render() { + return this._filter + ? html` + { + if (!this.#hasRenderedOnce && i === 0) { + // TODO: Replace this block: + ext.component?.updateComplete.then(async () => { + const menuitem = ext.component?.shadowRoot?.querySelector('uui-menu-item'); + menuitem?.updateComplete.then(async () => { + menuitem?.shadowRoot?.querySelector('#label-button')?.focus?.(); + }); + }); + // end of block, with this, when this PR is part of UI Lib: https://github.com/umbraco/Umbraco.UI/pull/789 + // ext.component?.focus(); + this.#hasRenderedOnce = true; + } + return ext.component; + }}> + ` + : ''; + } + + static override styles = [ + css` + :host { + --uui-menu-item-flat-structure: 1; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbEntityCreateOptionActionListElement; + } +} diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity/create-option-action/entity-create-option-action.extension.ts new file mode 100644 index 0000000000..2835753767 --- /dev/null +++ b/src/packages/core/entity/create-option-action/entity-create-option-action.extension.ts @@ -0,0 +1,13 @@ +import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; + +export interface ManifestEntityCreateOptionAction< + MetaType extends MetaEntityCreateOptionAction = MetaEntityCreateOptionAction, +> extends ManifestElementAndApi, + ManifestWithDynamicConditions { + type: 'entityCreateOptionAction'; + forEntityTypes: Array; + meta: MetaType; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface MetaEntityCreateOptionAction {} diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action.interface.ts b/src/packages/core/entity/create-option-action/entity-create-option-action.interface.ts new file mode 100644 index 0000000000..0956868cb7 --- /dev/null +++ b/src/packages/core/entity/create-option-action/entity-create-option-action.interface.ts @@ -0,0 +1,17 @@ +import type { UmbEntityCreateOptionActionArgs } from './types.js'; +import type { UmbAction } from '@umbraco-cms/backoffice/action'; + +export interface UmbEntityCreateOptionAction + extends UmbAction> { + /** + * The href location, the action will act as a link. + * @returns {Promise} + */ + getHref(): Promise; + + /** + * The `execute` method, the action will act as a button. + * @returns {Promise} + */ + execute(): Promise; +} diff --git a/src/packages/core/entity/create-option-action/index.ts b/src/packages/core/entity/create-option-action/index.ts new file mode 100644 index 0000000000..c3a44c8f72 --- /dev/null +++ b/src/packages/core/entity/create-option-action/index.ts @@ -0,0 +1,7 @@ +export * from './default/index.js'; +export * from './entity-create-option-action-base.js'; +export * from './entity-create-option-action-list.element.js'; +export * from './entity-create-option-action.extension.js'; +export * from './entity-create-option-action.interface.js'; +export * from './types.js'; +export type * from './entity-create-option-action-element.interface.js'; diff --git a/src/packages/core/entity/create-option-action/manifests.ts b/src/packages/core/entity/create-option-action/manifests.ts new file mode 100644 index 0000000000..84f3b7f88d --- /dev/null +++ b/src/packages/core/entity/create-option-action/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as defaultEntityActionManifests } from './default/manifests.js'; +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [...defaultEntityActionManifests]; diff --git a/src/packages/core/entity/create-option-action/types.ts b/src/packages/core/entity/create-option-action/types.ts new file mode 100644 index 0000000000..ca6db2fc24 --- /dev/null +++ b/src/packages/core/entity/create-option-action/types.ts @@ -0,0 +1,5 @@ +import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; + +export interface UmbEntityCreateOptionActionArgs extends UmbEntityModel { + meta: MetaArgsType; +} From 9f17e7a0b39ad9427478cec96d976fe1e262c015 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 28 Oct 2024 15:08:14 +0100 Subject: [PATCH 02/37] add global-components folder --- .../entity-create-option-action-list.element.ts | 4 ++-- .../create-option-action/global-components/index.ts | 3 +++ src/packages/core/entity/create-option-action/index.ts | 9 +++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) rename src/packages/core/entity/create-option-action/{ => global-components}/entity-create-option-action-list.element.ts (96%) create mode 100644 src/packages/core/entity/create-option-action/global-components/index.ts diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action-list.element.ts b/src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts similarity index 96% rename from src/packages/core/entity/create-option-action/entity-create-option-action-list.element.ts rename to src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts index 082816e24f..e8cdaed63f 100644 --- a/src/packages/core/entity/create-option-action/entity-create-option-action-list.element.ts +++ b/src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts @@ -1,8 +1,8 @@ -import type { UmbEntityCreateOptionActionArgs } from './types.js'; +import type { UmbEntityCreateOptionActionArgs } from '../types.js'; import type { ManifestEntityCreateOptionAction, MetaEntityCreateOptionAction, -} from './entity-create-option-action.extension.js'; +} from '../entity-create-option-action.extension.js'; import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; diff --git a/src/packages/core/entity/create-option-action/global-components/index.ts b/src/packages/core/entity/create-option-action/global-components/index.ts new file mode 100644 index 0000000000..40da9cdab0 --- /dev/null +++ b/src/packages/core/entity/create-option-action/global-components/index.ts @@ -0,0 +1,3 @@ +import './entity-create-option-action-list.element.js'; + +export * from './entity-create-option-action-list.element.js'; diff --git a/src/packages/core/entity/create-option-action/index.ts b/src/packages/core/entity/create-option-action/index.ts index c3a44c8f72..5eb9c9635d 100644 --- a/src/packages/core/entity/create-option-action/index.ts +++ b/src/packages/core/entity/create-option-action/index.ts @@ -1,7 +1,12 @@ +import './global-components/index.js'; + export * from './default/index.js'; +export * from './global-components/index.js'; + export * from './entity-create-option-action-base.js'; -export * from './entity-create-option-action-list.element.js'; export * from './entity-create-option-action.extension.js'; export * from './entity-create-option-action.interface.js'; -export * from './types.js'; + export type * from './entity-create-option-action-element.interface.js'; + +export * from './types.js'; From c2ad27620e30f3bfe1dbe657965d931b57162d4c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 28 Oct 2024 15:08:23 +0100 Subject: [PATCH 03/37] register create options --- .../user/entity-actions/create/manifests.ts | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/packages/user/user/entity-actions/create/manifests.ts b/src/packages/user/user/entity-actions/create/manifests.ts index b92ae65395..dc08f52bf6 100644 --- a/src/packages/user/user/entity-actions/create/manifests.ts +++ b/src/packages/user/user/entity-actions/create/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_USER_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_USER_ENTITY_TYPE, UMB_USER_ROOT_ENTITY_TYPE } from '../../entity.js'; import { manifests as modalManifests } from './modal/manifests.js'; @@ -19,5 +19,31 @@ export const manifests: Array = additionalOptions: true, }, }, + { + type: 'entityCreateOptionAction', + kind: 'default', + alias: 'Umb.EntityCreateOptionAction.User.Default', + name: 'Default User Entity Create Option Action', + weight: 1200, + forEntityTypes: [UMB_USER_ENTITY_TYPE], + meta: { + icon: 'icon-add', + label: 'Default (Extension)', + additionalOptions: true, + }, + }, + { + type: 'entityCreateOptionAction', + kind: 'default', + alias: 'Umb.EntityCreateOptionAction.User.Api', + name: 'Api User Entity Create Option Action', + weight: 1200, + forEntityTypes: [UMB_USER_ENTITY_TYPE], + meta: { + icon: 'icon-add', + label: 'Api (Extension)', + additionalOptions: true, + }, + }, ...modalManifests, ]; From 369344be20153949ce156074386caa3e681addf9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 28 Oct 2024 15:11:43 +0100 Subject: [PATCH 04/37] Update index.ts --- src/packages/core/entity/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/packages/core/entity/index.ts b/src/packages/core/entity/index.ts index d3f60a90c0..c9a5284a0c 100644 --- a/src/packages/core/entity/index.ts +++ b/src/packages/core/entity/index.ts @@ -1,3 +1,4 @@ export { UMB_ENTITY_CONTEXT } from './entity.context-token.js'; export { UmbEntityContext } from './entity.context.js'; +export * from './create-option-action/index.js'; export * from './types.js'; From 279c110c2506e6247f2c669e71b25b3776623513 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 28 Oct 2024 17:47:09 +0100 Subject: [PATCH 05/37] use entityCreateOptionAction entity type --- .../entity-create-option-action-list.element.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts b/src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts index e8cdaed63f..eeb948c5d3 100644 --- a/src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts +++ b/src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts @@ -51,6 +51,7 @@ export class UmbEntityCreateOptionActionListElement extends UmbLitElement { >; #entityContext = new UmbEntityContext(this); + #extensionType = 'entityCreateOptionAction'; #generateApiArgs() { if (!this._props.entityType || this._props.unique === undefined) return; @@ -69,7 +70,7 @@ export class UmbEntityCreateOptionActionListElement extends UmbLitElement { return this._filter ? html` Date: Mon, 28 Oct 2024 17:47:41 +0100 Subject: [PATCH 06/37] export manifests --- src/packages/core/entity/create-option-action/manifests.ts | 4 ++-- src/packages/core/entity/manifests.ts | 4 ++++ src/packages/core/manifests.ts | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 src/packages/core/entity/manifests.ts diff --git a/src/packages/core/entity/create-option-action/manifests.ts b/src/packages/core/entity/create-option-action/manifests.ts index 84f3b7f88d..43d020c74e 100644 --- a/src/packages/core/entity/create-option-action/manifests.ts +++ b/src/packages/core/entity/create-option-action/manifests.ts @@ -1,4 +1,4 @@ -import { manifests as defaultEntityActionManifests } from './default/manifests.js'; +import { manifests as defaultManifests } from './default/manifests.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; -export const manifests: Array = [...defaultEntityActionManifests]; +export const manifests: Array = [...defaultManifests]; diff --git a/src/packages/core/entity/manifests.ts b/src/packages/core/entity/manifests.ts new file mode 100644 index 0000000000..3a24422566 --- /dev/null +++ b/src/packages/core/entity/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as createOptionActionManifests } from './create-option-action/manifests.js'; +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [...createOptionActionManifests]; diff --git a/src/packages/core/manifests.ts b/src/packages/core/manifests.ts index 807e23de70..d01847d9d0 100644 --- a/src/packages/core/manifests.ts +++ b/src/packages/core/manifests.ts @@ -7,6 +7,7 @@ import { manifests as cultureManifests } from './culture/manifests.js'; import { manifests as debugManifests } from './debug/manifests.js'; import { manifests as entityActionManifests } from './entity-action/manifests.js'; import { manifests as entityBulkActionManifests } from './entity-bulk-action/manifests.js'; +import { manifests as entityManifests } from './entity/manifests.js'; import { manifests as extensionManifests } from './extension-registry/manifests.js'; import { manifests as iconRegistryManifests } from './icon-registry/manifests.js'; import { manifests as localizationManifests } from './localization/manifests.js'; @@ -36,6 +37,7 @@ export const manifests: Array = ...debugManifests, ...entityActionManifests, ...entityBulkActionManifests, + ...entityManifests, ...extensionManifests, ...iconRegistryManifests, ...localizationManifests, From 467bba753332a1d6f79f8a872a518debfd0de894 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 28 Oct 2024 22:18:27 +0100 Subject: [PATCH 07/37] register user entity create option actions --- .../api-user-entity-create-option-action.ts | 9 ++ .../create/api-user/manifests.ts | 18 ++++ ...efault-user-entity-create-option-action.ts | 45 +++++++++ .../create/default-user/manifests.ts | 18 ++++ .../user/entity-actions/create/manifests.ts | 33 +------ .../user-create-options-modal.element.ts | 95 ++++--------------- 6 files changed, 114 insertions(+), 104 deletions(-) create mode 100644 src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts create mode 100644 src/packages/user/user/entity-actions/create/api-user/manifests.ts create mode 100644 src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts create mode 100644 src/packages/user/user/entity-actions/create/default-user/manifests.ts diff --git a/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts new file mode 100644 index 0000000000..62404d353f --- /dev/null +++ b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts @@ -0,0 +1,9 @@ +import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity'; + +export class UmbApiUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { + override async execute() { + debugger; + } +} + +export { UmbApiUserEntityCreateOptionAction as api }; diff --git a/src/packages/user/user/entity-actions/create/api-user/manifests.ts b/src/packages/user/user/entity-actions/create/api-user/manifests.ts new file mode 100644 index 0000000000..5c5ea02ca8 --- /dev/null +++ b/src/packages/user/user/entity-actions/create/api-user/manifests.ts @@ -0,0 +1,18 @@ +import { UMB_USER_ROOT_ENTITY_TYPE } from '../../../entity.js'; + +export const manifests: Array = [ + { + type: 'entityCreateOptionAction', + kind: 'default', + alias: 'Umb.EntityCreateOptionAction.User.Api', + name: 'Api User Entity Create Option Action', + weight: 1100, + api: () => import('./api-user-entity-create-option-action.js'), + forEntityTypes: [UMB_USER_ROOT_ENTITY_TYPE], + meta: { + icon: 'icon-unplug', + label: '#user_userKindApi', + additionalOptions: true, + }, + }, +]; diff --git a/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts new file mode 100644 index 0000000000..e661e70363 --- /dev/null +++ b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts @@ -0,0 +1,45 @@ +import { UMB_CREATE_USER_MODAL } from '../../../modals/create/create-user-modal.token.js'; +import type { UmbUserKindType } from '../../../utils/index.js'; +import { UmbUserKind } from '../../../utils/index.js'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity'; +import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; + +export class UmbDefaultUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { + override async execute() { + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const kind: UmbUserKindType = UmbUserKind.DEFAULT; + + const modalContext = modalManager.open(this, UMB_CREATE_USER_MODAL, { + data: { + user: { + kind, + }, + }, + }); + + modalContext + ?.onSubmit() + .then(() => { + this.#requestReloadChildrenOfEntity(); + }) + .catch(async () => { + // modal is closed after creation instead of navigating to the new user. + // We therefore need to reload the children of the entity + this.#requestReloadChildrenOfEntity(); + }); + } + + async #requestReloadChildrenOfEntity() { + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadChildrenOfEntityEvent({ + entityType: this.args.entityType, + unique: this.args.unique, + }); + + eventContext.dispatchEvent(event); + } +} + +export { UmbDefaultUserEntityCreateOptionAction as api }; diff --git a/src/packages/user/user/entity-actions/create/default-user/manifests.ts b/src/packages/user/user/entity-actions/create/default-user/manifests.ts new file mode 100644 index 0000000000..4e12d1e039 --- /dev/null +++ b/src/packages/user/user/entity-actions/create/default-user/manifests.ts @@ -0,0 +1,18 @@ +import { UMB_USER_ROOT_ENTITY_TYPE } from '../../../entity.js'; + +export const manifests: Array = [ + { + type: 'entityCreateOptionAction', + kind: 'default', + alias: 'Umb.EntityCreateOptionAction.User.Default', + name: 'Default User Entity Create Option Action', + weight: 1200, + api: () => import('./default-user-entity-create-option-action.js'), + forEntityTypes: [UMB_USER_ROOT_ENTITY_TYPE], + meta: { + icon: 'icon-user', + label: '#user_userKindDefault', + additionalOptions: true, + }, + }, +]; diff --git a/src/packages/user/user/entity-actions/create/manifests.ts b/src/packages/user/user/entity-actions/create/manifests.ts index dc08f52bf6..658fa547d3 100644 --- a/src/packages/user/user/entity-actions/create/manifests.ts +++ b/src/packages/user/user/entity-actions/create/manifests.ts @@ -1,5 +1,6 @@ -import { UMB_USER_ENTITY_TYPE, UMB_USER_ROOT_ENTITY_TYPE } from '../../entity.js'; - +import { UMB_USER_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { manifests as apiUser } from './api-user/manifests.js'; +import { manifests as defaultUser } from './default-user/manifests.js'; import { manifests as modalManifests } from './modal/manifests.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; @@ -19,31 +20,7 @@ export const manifests: Array = additionalOptions: true, }, }, - { - type: 'entityCreateOptionAction', - kind: 'default', - alias: 'Umb.EntityCreateOptionAction.User.Default', - name: 'Default User Entity Create Option Action', - weight: 1200, - forEntityTypes: [UMB_USER_ENTITY_TYPE], - meta: { - icon: 'icon-add', - label: 'Default (Extension)', - additionalOptions: true, - }, - }, - { - type: 'entityCreateOptionAction', - kind: 'default', - alias: 'Umb.EntityCreateOptionAction.User.Api', - name: 'Api User Entity Create Option Action', - weight: 1200, - forEntityTypes: [UMB_USER_ENTITY_TYPE], - meta: { - icon: 'icon-add', - label: 'Api (Extension)', - additionalOptions: true, - }, - }, + ...apiUser, + ...defaultUser, ...modalManifests, ]; diff --git a/src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts b/src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts index 74e8646990..cc9ba965f2 100644 --- a/src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts +++ b/src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts @@ -1,92 +1,35 @@ -import { UMB_CREATE_USER_MODAL } from '../../../modals/create/create-user-modal.token.js'; -import { UmbUserKind, type UmbUserKindType } from '../../../utils/index.js'; -import { html, customElement, map } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_MODAL_MANAGER_CONTEXT, UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; -import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; - -interface UmbUserCreateOptionModel { - label: string; - description?: string; - icon: string; - kind: UmbUserKindType; -} const elementName = 'umb-user-create-options-modal'; @customElement(elementName) export class UmbUserCreateOptionsModalElement extends UmbModalBaseElement { - #options: Array = [ - { - label: this.localize.term('user_userKindDefault'), - icon: 'icon-user', - kind: UmbUserKind.DEFAULT, - }, - { - label: this.localize.term('user_userKindApi'), - icon: 'icon-unplug', - kind: UmbUserKind.API, - }, - ]; - - async #onClick(event: Event, kind: UmbUserKindType) { - event.stopPropagation(); - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const entityContext = await this.getContext(UMB_ENTITY_CONTEXT); - - const unique = entityContext.getUnique(); - const entityType = entityContext.getEntityType(); - - if (unique === undefined) throw new Error('Missing unique'); - if (!entityType) throw new Error('Missing entityType'); - - const modalContext = modalManager.open(this, UMB_CREATE_USER_MODAL, { - data: { - user: { - kind, - }, - }, + @state() + entity: UmbEntityModel = { + entityType: '', + unique: '', + }; + + constructor() { + super(); + + this.consumeContext(UMB_ENTITY_CONTEXT, (context) => { + this.entity = { + entityType: context.getEntityType(), + unique: context.getUnique(), + }; }); - - modalContext - ?.onSubmit() - .then(() => { - this.#requestReloadChildrenOfEntity({ entityType, unique }); - }) - .catch(async () => { - // modal is closed after creation instead of navigating to the new user. - // We therefore need to reload the children of the entity - this.#requestReloadChildrenOfEntity({ entityType, unique }); - }); - } - - async #requestReloadChildrenOfEntity({ entityType, unique }: UmbEntityModel) { - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadChildrenOfEntityEvent({ - entityType, - unique, - }); - - eventContext.dispatchEvent(event); } override render() { return html` - - ${map( - this.#options, - (item) => html` - this.#onClick(event, item.kind)}> - `, - )} - + Date: Mon, 28 Oct 2024 22:49:05 +0100 Subject: [PATCH 08/37] setup common action and generic modal --- .../common/create/create.action.kind.ts | 22 +++++++++ .../common/create/create.action.ts | 20 ++++++++ .../core/entity-action/common/create/index.ts | 1 + .../entity-action/common/create/manifests.ts | 4 ++ .../common/create/modal/constants.ts | 1 + ...create-option-action-list-modal.element.ts | 37 ++++++++++++++ ...y-create-option-action-list-modal.token.ts | 20 ++++++++ .../common/create/modal/index.ts | 2 + .../common/create/modal/manifests.ts | 10 ++++ .../core/entity-action/common/create/types.ts | 16 ++++++ .../core/entity-action/common/index.ts | 3 +- src/packages/core/entity-action/manifests.ts | 3 ++ .../create/create-user-entity-action.ts | 21 -------- .../user/entity-actions/create/manifests.ts | 11 +---- .../user/entity-actions/create/modal/index.ts | 8 --- .../entity-actions/create/modal/manifests.ts | 8 --- .../user-create-options-modal.element.ts | 49 ------------------- 17 files changed, 139 insertions(+), 97 deletions(-) create mode 100644 src/packages/core/entity-action/common/create/create.action.kind.ts create mode 100644 src/packages/core/entity-action/common/create/create.action.ts create mode 100644 src/packages/core/entity-action/common/create/index.ts create mode 100644 src/packages/core/entity-action/common/create/manifests.ts create mode 100644 src/packages/core/entity-action/common/create/modal/constants.ts create mode 100644 src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts create mode 100644 src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.token.ts create mode 100644 src/packages/core/entity-action/common/create/modal/index.ts create mode 100644 src/packages/core/entity-action/common/create/modal/manifests.ts create mode 100644 src/packages/core/entity-action/common/create/types.ts delete mode 100644 src/packages/user/user/entity-actions/create/create-user-entity-action.ts delete mode 100644 src/packages/user/user/entity-actions/create/modal/index.ts delete mode 100644 src/packages/user/user/entity-actions/create/modal/manifests.ts delete mode 100644 src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts diff --git a/src/packages/core/entity-action/common/create/create.action.kind.ts b/src/packages/core/entity-action/common/create/create.action.kind.ts new file mode 100644 index 0000000000..a220d955aa --- /dev/null +++ b/src/packages/core/entity-action/common/create/create.action.kind.ts @@ -0,0 +1,22 @@ +import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js'; +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifest: UmbExtensionManifestKind = { + type: 'kind', + alias: 'Umb.Kind.EntityAction.Create', + matchKind: 'create', + matchType: 'entityAction', + manifest: { + ...UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST.manifest, + type: 'entityAction', + kind: 'create', + api: () => import('./create.action.js'), + weight: 1200, + forEntityTypes: [], + meta: { + icon: 'icon-add', + label: '#actions_create', + additionalOptions: true, + }, + }, +}; diff --git a/src/packages/core/entity-action/common/create/create.action.ts b/src/packages/core/entity-action/common/create/create.action.ts new file mode 100644 index 0000000000..35f0dda58a --- /dev/null +++ b/src/packages/core/entity-action/common/create/create.action.ts @@ -0,0 +1,20 @@ +import { UmbEntityActionBase } from '../../entity-action-base.js'; +import type { MetaEntityActionCreateKind } from './types.js'; +import { UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL } from './modal/index.js'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; + +export class UmbCreateEntityAction extends UmbEntityActionBase { + override async execute() { + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modalContext = modalManager.open(this, UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL, { + data: { + unique: this.args.unique, + entityType: this.args.entityType, + }, + }); + + await modalContext.onSubmit(); + } +} + +export { UmbCreateEntityAction as api }; diff --git a/src/packages/core/entity-action/common/create/index.ts b/src/packages/core/entity-action/common/create/index.ts new file mode 100644 index 0000000000..d44c5eca74 --- /dev/null +++ b/src/packages/core/entity-action/common/create/index.ts @@ -0,0 +1 @@ +export { UmbCreateEntityAction } from './create.action.js'; diff --git a/src/packages/core/entity-action/common/create/manifests.ts b/src/packages/core/entity-action/common/create/manifests.ts new file mode 100644 index 0000000000..d1e496f559 --- /dev/null +++ b/src/packages/core/entity-action/common/create/manifests.ts @@ -0,0 +1,4 @@ +import { manifest as createKindManifest } from './create.action.kind.js'; +import { manifests as modalManifests } from './modal/manifests.js'; + +export const manifests = [createKindManifest, ...modalManifests]; diff --git a/src/packages/core/entity-action/common/create/modal/constants.ts b/src/packages/core/entity-action/common/create/modal/constants.ts new file mode 100644 index 0000000000..ab81577a04 --- /dev/null +++ b/src/packages/core/entity-action/common/create/modal/constants.ts @@ -0,0 +1 @@ +export const UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL_ALIAS = 'Umb.Modal.Entity.CreateOptionActionList'; diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts new file mode 100644 index 0000000000..e9ada04e69 --- /dev/null +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -0,0 +1,37 @@ +import type { + UmbEntityCreateOptionActionListModalData, + UmbEntityCreateOptionActionListModalValue, +} from './entity-create-option-action-list-modal.token.js'; +import { html, customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; + +const elementName = 'umb-entity-create-option-action-list-modal'; +@customElement(elementName) +export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseElement< + UmbEntityCreateOptionActionListModalData, + UmbEntityCreateOptionActionListModalValue +> { + override render() { + return html` + + + + + + + `; + } +} + +export { UmbEntityCreateOptionActionListModalElement as element }; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbEntityCreateOptionActionListModalElement; + } +} diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.token.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.token.ts new file mode 100644 index 0000000000..dd1aba66b4 --- /dev/null +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.token.ts @@ -0,0 +1,20 @@ +import { UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL_ALIAS } from './constants.js'; +import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbEntityCreateOptionActionListModalData { + unique: UmbEntityUnique; + entityType: string; +} + +export type UmbEntityCreateOptionActionListModalValue = never; + +export const UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL = new UmbModalToken< + UmbEntityCreateOptionActionListModalData, + UmbEntityCreateOptionActionListModalValue +>(UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL_ALIAS, { + modal: { + type: 'sidebar', + size: 'small', + }, +}); diff --git a/src/packages/core/entity-action/common/create/modal/index.ts b/src/packages/core/entity-action/common/create/modal/index.ts new file mode 100644 index 0000000000..876d392b23 --- /dev/null +++ b/src/packages/core/entity-action/common/create/modal/index.ts @@ -0,0 +1,2 @@ +export * from './constants.js'; +export * from './entity-create-option-action-list-modal.token.js'; diff --git a/src/packages/core/entity-action/common/create/modal/manifests.ts b/src/packages/core/entity-action/common/create/modal/manifests.ts new file mode 100644 index 0000000000..2b6ee6ed47 --- /dev/null +++ b/src/packages/core/entity-action/common/create/modal/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'modal', + alias: UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL_ALIAS, + name: 'Entity Create Option Action List Modal', + element: () => import('./entity-create-option-action-list-modal.element.js'), + }, +]; diff --git a/src/packages/core/entity-action/common/create/types.ts b/src/packages/core/entity-action/common/create/types.ts new file mode 100644 index 0000000000..7d102e750a --- /dev/null +++ b/src/packages/core/entity-action/common/create/types.ts @@ -0,0 +1,16 @@ +import type { MetaEntityActionDefaultKind } from '../../default/index.js'; +import type { ManifestEntityAction } from '../../entity-action.extension.js'; + +export interface ManifestEntityActionCreateKind extends ManifestEntityAction { + type: 'entityAction'; + kind: 'create'; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface MetaEntityActionCreateKind extends MetaEntityActionDefaultKind {} + +declare global { + interface UmbExtensionManifestMap { + umbEntityActionCreateKind: ManifestEntityActionCreateKind; + } +} diff --git a/src/packages/core/entity-action/common/index.ts b/src/packages/core/entity-action/common/index.ts index 30877954f8..5a7c2ae86b 100644 --- a/src/packages/core/entity-action/common/index.ts +++ b/src/packages/core/entity-action/common/index.ts @@ -1,2 +1,3 @@ -export * from './duplicate/index.js'; +export * from './create/index.js'; export * from './delete/index.js'; +export * from './duplicate/index.js'; diff --git a/src/packages/core/entity-action/manifests.ts b/src/packages/core/entity-action/manifests.ts index aeaaceafc0..7d6813e49a 100644 --- a/src/packages/core/entity-action/manifests.ts +++ b/src/packages/core/entity-action/manifests.ts @@ -1,9 +1,12 @@ +import { manifests as createEntityActionManifests } from './common/create/manifests.js'; import { manifests as defaultEntityActionManifests } from './default/manifests.js'; import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js'; + import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ + ...createEntityActionManifests, ...defaultEntityActionManifests, ...deleteEntityActionManifests, ...duplicateEntityActionManifests, diff --git a/src/packages/user/user/entity-actions/create/create-user-entity-action.ts b/src/packages/user/user/entity-actions/create/create-user-entity-action.ts deleted file mode 100644 index a6da26da4f..0000000000 --- a/src/packages/user/user/entity-actions/create/create-user-entity-action.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { UMB_USER_CREATE_OPTIONS_MODAL } from './modal/index.js'; -import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; - -export class UmbCreateUserEntityAction extends UmbEntityActionBase { - override async execute() { - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const modalContext = modalManager.open(this, UMB_USER_CREATE_OPTIONS_MODAL, { - data: { - parent: { - unique: this.args.unique, - entityType: this.args.entityType, - }, - }, - }); - - await modalContext.onSubmit(); - } -} - -export { UmbCreateUserEntityAction as api }; diff --git a/src/packages/user/user/entity-actions/create/manifests.ts b/src/packages/user/user/entity-actions/create/manifests.ts index 658fa547d3..2e67f026d0 100644 --- a/src/packages/user/user/entity-actions/create/manifests.ts +++ b/src/packages/user/user/entity-actions/create/manifests.ts @@ -1,26 +1,17 @@ import { UMB_USER_ROOT_ENTITY_TYPE } from '../../entity.js'; import { manifests as apiUser } from './api-user/manifests.js'; import { manifests as defaultUser } from './default-user/manifests.js'; -import { manifests as modalManifests } from './modal/manifests.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ { type: 'entityAction', - kind: 'default', + kind: 'create', alias: 'Umb.EntityAction.User.Create', name: 'Create User Entity Action', - weight: 1200, - api: () => import('./create-user-entity-action.js'), forEntityTypes: [UMB_USER_ROOT_ENTITY_TYPE], - meta: { - icon: 'icon-add', - label: '#actions_create', - additionalOptions: true, - }, }, ...apiUser, ...defaultUser, - ...modalManifests, ]; diff --git a/src/packages/user/user/entity-actions/create/modal/index.ts b/src/packages/user/user/entity-actions/create/modal/index.ts deleted file mode 100644 index 778a1fe38d..0000000000 --- a/src/packages/user/user/entity-actions/create/modal/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; - -export const UMB_USER_CREATE_OPTIONS_MODAL = new UmbModalToken('Umb.Modal.User.CreateOptions', { - modal: { - type: 'sidebar', - size: 'small', - }, -}); diff --git a/src/packages/user/user/entity-actions/create/modal/manifests.ts b/src/packages/user/user/entity-actions/create/modal/manifests.ts deleted file mode 100644 index 08dc77d154..0000000000 --- a/src/packages/user/user/entity-actions/create/modal/manifests.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const manifests: Array = [ - { - type: 'modal', - alias: 'Umb.Modal.User.CreateOptions', - name: 'User Create Options Modal', - element: () => import('./user-create-options-modal.element.js'), - }, -]; diff --git a/src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts b/src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts deleted file mode 100644 index cc9ba965f2..0000000000 --- a/src/packages/user/user/entity-actions/create/modal/user-create-options-modal.element.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; -import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; - -const elementName = 'umb-user-create-options-modal'; -@customElement(elementName) -export class UmbUserCreateOptionsModalElement extends UmbModalBaseElement { - @state() - entity: UmbEntityModel = { - entityType: '', - unique: '', - }; - - constructor() { - super(); - - this.consumeContext(UMB_ENTITY_CONTEXT, (context) => { - this.entity = { - entityType: context.getEntityType(), - unique: context.getUnique(), - }; - }); - } - - override render() { - return html` - - - - - - - `; - } -} - -export { UmbUserCreateOptionsModalElement as element }; - -declare global { - interface HTMLElementTagNameMap { - [elementName]: UmbUserCreateOptionsModalElement; - } -} From 398c0e356367ca1bdd3df0f4c5b690e5db546430 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 13:18:14 +0100 Subject: [PATCH 09/37] restructure modules --- .../entity-create-option-action.element.ts | 0 .../create-option-action/default/index.ts | 0 .../create-option-action/default/manifests.ts | 0 .../create-option-action/default/types.ts | 0 .../entity-create-option-action-base.ts | 0 ...-create-option-action-element.interface.ts | 0 .../entity-create-option-action.extension.ts | 0 .../entity-create-option-action.interface.ts | 0 ...ntity-create-option-action-list.element.ts | 0 .../global-components/index.ts | 0 .../create}/create-option-action/index.ts | 0 .../create}/create-option-action/manifests.ts | 0 .../create}/create-option-action/types.ts | 0 .../common/create/create.action.ts | 39 +++++++++++++++++++ .../core/entity-action/common/create/index.ts | 1 + .../entity-action/common/create/manifests.ts | 3 +- src/packages/core/entity-action/manifests.ts | 2 - src/packages/core/entity/index.ts | 1 - src/packages/core/entity/manifests.ts | 4 -- src/packages/core/manifests.ts | 2 - .../api-user-entity-create-option-action.ts | 2 +- ...efault-user-entity-create-option-action.ts | 8 ++-- 22 files changed, 48 insertions(+), 14 deletions(-) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/default/entity-create-option-action.element.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/default/index.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/default/manifests.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/default/types.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/entity-create-option-action-base.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/entity-create-option-action-element.interface.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/entity-create-option-action.extension.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/entity-create-option-action.interface.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/global-components/entity-create-option-action-list.element.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/global-components/index.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/index.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/manifests.ts (100%) rename src/packages/core/{entity => entity-action/common/create}/create-option-action/types.ts (100%) delete mode 100644 src/packages/core/entity/manifests.ts diff --git a/src/packages/core/entity/create-option-action/default/entity-create-option-action.element.ts b/src/packages/core/entity-action/common/create/create-option-action/default/entity-create-option-action.element.ts similarity index 100% rename from src/packages/core/entity/create-option-action/default/entity-create-option-action.element.ts rename to src/packages/core/entity-action/common/create/create-option-action/default/entity-create-option-action.element.ts diff --git a/src/packages/core/entity/create-option-action/default/index.ts b/src/packages/core/entity-action/common/create/create-option-action/default/index.ts similarity index 100% rename from src/packages/core/entity/create-option-action/default/index.ts rename to src/packages/core/entity-action/common/create/create-option-action/default/index.ts diff --git a/src/packages/core/entity/create-option-action/default/manifests.ts b/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts similarity index 100% rename from src/packages/core/entity/create-option-action/default/manifests.ts rename to src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts diff --git a/src/packages/core/entity/create-option-action/default/types.ts b/src/packages/core/entity-action/common/create/create-option-action/default/types.ts similarity index 100% rename from src/packages/core/entity/create-option-action/default/types.ts rename to src/packages/core/entity-action/common/create/create-option-action/default/types.ts diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action-base.ts b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-base.ts similarity index 100% rename from src/packages/core/entity/create-option-action/entity-create-option-action-base.ts rename to src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-base.ts diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action-element.interface.ts b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-element.interface.ts similarity index 100% rename from src/packages/core/entity/create-option-action/entity-create-option-action-element.interface.ts rename to src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-element.interface.ts diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts similarity index 100% rename from src/packages/core/entity/create-option-action/entity-create-option-action.extension.ts rename to src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts diff --git a/src/packages/core/entity/create-option-action/entity-create-option-action.interface.ts b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.interface.ts similarity index 100% rename from src/packages/core/entity/create-option-action/entity-create-option-action.interface.ts rename to src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.interface.ts diff --git a/src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts b/src/packages/core/entity-action/common/create/create-option-action/global-components/entity-create-option-action-list.element.ts similarity index 100% rename from src/packages/core/entity/create-option-action/global-components/entity-create-option-action-list.element.ts rename to src/packages/core/entity-action/common/create/create-option-action/global-components/entity-create-option-action-list.element.ts diff --git a/src/packages/core/entity/create-option-action/global-components/index.ts b/src/packages/core/entity-action/common/create/create-option-action/global-components/index.ts similarity index 100% rename from src/packages/core/entity/create-option-action/global-components/index.ts rename to src/packages/core/entity-action/common/create/create-option-action/global-components/index.ts diff --git a/src/packages/core/entity/create-option-action/index.ts b/src/packages/core/entity-action/common/create/create-option-action/index.ts similarity index 100% rename from src/packages/core/entity/create-option-action/index.ts rename to src/packages/core/entity-action/common/create/create-option-action/index.ts diff --git a/src/packages/core/entity/create-option-action/manifests.ts b/src/packages/core/entity-action/common/create/create-option-action/manifests.ts similarity index 100% rename from src/packages/core/entity/create-option-action/manifests.ts rename to src/packages/core/entity-action/common/create/create-option-action/manifests.ts diff --git a/src/packages/core/entity/create-option-action/types.ts b/src/packages/core/entity-action/common/create/create-option-action/types.ts similarity index 100% rename from src/packages/core/entity/create-option-action/types.ts rename to src/packages/core/entity-action/common/create/create-option-action/types.ts diff --git a/src/packages/core/entity-action/common/create/create.action.ts b/src/packages/core/entity-action/common/create/create.action.ts index 35f0dda58a..d96860c9b9 100644 --- a/src/packages/core/entity-action/common/create/create.action.ts +++ b/src/packages/core/entity-action/common/create/create.action.ts @@ -1,10 +1,49 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; +import type { UmbEntityActionArgs } from '../../types.js'; import type { MetaEntityActionCreateKind } from './types.js'; import { UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL } from './modal/index.js'; +import type { ManifestEntityCreateOptionAction } from './create-option-action/index.js'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { createExtensionApi, UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; export class UmbCreateEntityAction extends UmbEntityActionBase { + #hasSingleOption = true; + #singleActionOptionManifest?: ManifestEntityCreateOptionAction; + + constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { + super(host, args); + + new UmbExtensionsManifestInitializer( + this, + umbExtensionsRegistry, + 'entityCreateOptionAction', + (ext) => ext.forEntityTypes.includes(this.args.entityType), + async (actionOptions) => { + this.#hasSingleOption = actionOptions.length === 1; + this.#singleActionOptionManifest = this.#hasSingleOption + ? (actionOptions[0].manifest as ManifestEntityCreateOptionAction) + : undefined; + }, + 'umbEntityActionsObserver', + ); + } + override async execute() { + if (this.#hasSingleOption) { + if (!this.#singleActionOptionManifest) throw new Error('No first action manifest found'); + + const api = await createExtensionApi(this, this.#singleActionOptionManifest, [ + { unique: this.args.unique, entityType: this.args.entityType, meta: this.#singleActionOptionManifest.meta }, + ]); + + if (!api) throw new Error(`Could not create api for ${this.#singleActionOptionManifest.alias}`); + + await api.execute(); + return; + } + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const modalContext = modalManager.open(this, UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL, { data: { diff --git a/src/packages/core/entity-action/common/create/index.ts b/src/packages/core/entity-action/common/create/index.ts index d44c5eca74..e3989cd62d 100644 --- a/src/packages/core/entity-action/common/create/index.ts +++ b/src/packages/core/entity-action/common/create/index.ts @@ -1 +1,2 @@ export { UmbCreateEntityAction } from './create.action.js'; +export * from './create-option-action/index.js'; diff --git a/src/packages/core/entity-action/common/create/manifests.ts b/src/packages/core/entity-action/common/create/manifests.ts index d1e496f559..6aee3f93b6 100644 --- a/src/packages/core/entity-action/common/create/manifests.ts +++ b/src/packages/core/entity-action/common/create/manifests.ts @@ -1,4 +1,5 @@ import { manifest as createKindManifest } from './create.action.kind.js'; import { manifests as modalManifests } from './modal/manifests.js'; +import { manifests as createOptionActionManifests } from './create-option-action/manifests.js'; -export const manifests = [createKindManifest, ...modalManifests]; +export const manifests = [createKindManifest, ...modalManifests, ...createOptionActionManifests]; diff --git a/src/packages/core/entity-action/manifests.ts b/src/packages/core/entity-action/manifests.ts index 7d6813e49a..2f9fa9adc4 100644 --- a/src/packages/core/entity-action/manifests.ts +++ b/src/packages/core/entity-action/manifests.ts @@ -1,4 +1,3 @@ -import { manifests as createEntityActionManifests } from './common/create/manifests.js'; import { manifests as defaultEntityActionManifests } from './default/manifests.js'; import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js'; @@ -6,7 +5,6 @@ import { manifests as duplicateEntityActionManifests } from './common/duplicate/ import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ - ...createEntityActionManifests, ...defaultEntityActionManifests, ...deleteEntityActionManifests, ...duplicateEntityActionManifests, diff --git a/src/packages/core/entity/index.ts b/src/packages/core/entity/index.ts index c9a5284a0c..d3f60a90c0 100644 --- a/src/packages/core/entity/index.ts +++ b/src/packages/core/entity/index.ts @@ -1,4 +1,3 @@ export { UMB_ENTITY_CONTEXT } from './entity.context-token.js'; export { UmbEntityContext } from './entity.context.js'; -export * from './create-option-action/index.js'; export * from './types.js'; diff --git a/src/packages/core/entity/manifests.ts b/src/packages/core/entity/manifests.ts deleted file mode 100644 index 3a24422566..0000000000 --- a/src/packages/core/entity/manifests.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { manifests as createOptionActionManifests } from './create-option-action/manifests.js'; -import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; - -export const manifests: Array = [...createOptionActionManifests]; diff --git a/src/packages/core/manifests.ts b/src/packages/core/manifests.ts index d01847d9d0..807e23de70 100644 --- a/src/packages/core/manifests.ts +++ b/src/packages/core/manifests.ts @@ -7,7 +7,6 @@ import { manifests as cultureManifests } from './culture/manifests.js'; import { manifests as debugManifests } from './debug/manifests.js'; import { manifests as entityActionManifests } from './entity-action/manifests.js'; import { manifests as entityBulkActionManifests } from './entity-bulk-action/manifests.js'; -import { manifests as entityManifests } from './entity/manifests.js'; import { manifests as extensionManifests } from './extension-registry/manifests.js'; import { manifests as iconRegistryManifests } from './icon-registry/manifests.js'; import { manifests as localizationManifests } from './localization/manifests.js'; @@ -37,7 +36,6 @@ export const manifests: Array = ...debugManifests, ...entityActionManifests, ...entityBulkActionManifests, - ...entityManifests, ...extensionManifests, ...iconRegistryManifests, ...localizationManifests, diff --git a/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts index 62404d353f..e0c48579b8 100644 --- a/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts +++ b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts @@ -1,4 +1,4 @@ -import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity'; +import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-action'; export class UmbApiUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { override async execute() { diff --git a/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts index e661e70363..7da007dc51 100644 --- a/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts +++ b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts @@ -2,8 +2,10 @@ import { UMB_CREATE_USER_MODAL } from '../../../modals/create/create-user-modal. import type { UmbUserKindType } from '../../../utils/index.js'; import { UmbUserKind } from '../../../utils/index.js'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity'; -import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { + UmbEntityCreateOptionActionBase, + UmbRequestReloadChildrenOfEntityEvent, +} from '@umbraco-cms/backoffice/entity-action'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbDefaultUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { @@ -19,7 +21,7 @@ export class UmbDefaultUserEntityCreateOptionAction extends UmbEntityCreateOptio }, }); - modalContext + await modalContext ?.onSubmit() .then(() => { this.#requestReloadChildrenOfEntity(); From 3153d5cdfabb9112121858931a96463dfbcc6e38 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 13:25:39 +0100 Subject: [PATCH 10/37] import after restructure --- .../entity-create-option-action.extension.ts | 3 ++- src/packages/core/entity-action/manifests.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts index 2835753767..9aff339da4 100644 --- a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts +++ b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts @@ -1,8 +1,9 @@ +import type { UmbEntityCreateOptionAction } from './entity-create-option-action.interface.js'; import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; export interface ManifestEntityCreateOptionAction< MetaType extends MetaEntityCreateOptionAction = MetaEntityCreateOptionAction, -> extends ManifestElementAndApi, +> extends ManifestElementAndApi>, ManifestWithDynamicConditions { type: 'entityCreateOptionAction'; forEntityTypes: Array; diff --git a/src/packages/core/entity-action/manifests.ts b/src/packages/core/entity-action/manifests.ts index 2f9fa9adc4..7d6813e49a 100644 --- a/src/packages/core/entity-action/manifests.ts +++ b/src/packages/core/entity-action/manifests.ts @@ -1,3 +1,4 @@ +import { manifests as createEntityActionManifests } from './common/create/manifests.js'; import { manifests as defaultEntityActionManifests } from './default/manifests.js'; import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js'; @@ -5,6 +6,7 @@ import { manifests as duplicateEntityActionManifests } from './common/duplicate/ import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ + ...createEntityActionManifests, ...defaultEntityActionManifests, ...deleteEntityActionManifests, ...duplicateEntityActionManifests, From 01dba83d67c3d2c5868d25113dbc85c4a50259fe Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 17:03:27 +0100 Subject: [PATCH 11/37] render create options --- .../create-user-collection-action.element.ts | 123 +++++++++--------- 1 file changed, 63 insertions(+), 60 deletions(-) diff --git a/src/packages/user/user/collection/action/create-user-collection-action.element.ts b/src/packages/user/user/collection/action/create-user-collection-action.element.ts index 4ffcc353d0..6ddc1b57cc 100644 --- a/src/packages/user/user/collection/action/create-user-collection-action.element.ts +++ b/src/packages/user/user/collection/action/create-user-collection-action.element.ts @@ -1,13 +1,7 @@ -import { UMB_CREATE_USER_MODAL } from '../../modals/create/create-user-modal.token.js'; -import type { UmbUserKindType } from '../../utils/index.js'; -import { UmbUserKind } from '../../utils/index.js'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; -import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; -import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; const elementName = 'umb-create-user-collection-action-button'; @customElement(elementName) @@ -15,83 +9,92 @@ export class UmbCollectionActionButtonElement extends UmbLitElement { @state() private _popoverOpen = false; - async #onClick(event: Event, kind: UmbUserKindType) { - event.stopPropagation(); - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const entityContext = await this.getContext(UMB_ENTITY_CONTEXT); - - const unique = entityContext.getUnique(); - const entityType = entityContext.getEntityType(); + @state() + private _multipleOptions = false; - if (unique === undefined) throw new Error('Missing unique'); - if (!entityType) throw new Error('Missing entityType'); + #apiControllers: Array = []; + #createLabel = this.localize.term('general_create'); - const modalContext = modalManager.open(this, UMB_CREATE_USER_MODAL, { - data: { - user: { - kind, - }, - }, - }); + #onPopoverToggle(event: PointerEvent) { + // TODO: This ignorer is just neede for JSON SCHEMA TO WORK, As its not updated with latest TS jet. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this._popoverOpen = event.newState === 'open'; + } - modalContext - ?.onSubmit() - .then(() => { - this.#requestReloadChildrenOfEntity({ entityType, unique }); - }) - .catch(async () => { - // modal is closed after creation instead of navigating to the new user. - // We therefore need to reload the children of the entity - this.#requestReloadChildrenOfEntity({ entityType, unique }); - }); + async #onClick(event: Event, controller: any) { + event.stopPropagation(); + await controller.api.execute(); } - async #requestReloadChildrenOfEntity({ entityType, unique }: UmbEntityModel) { - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadChildrenOfEntityEvent({ - entityType, - unique, - }); + constructor() { + super(); - eventContext.dispatchEvent(event); + new UmbExtensionsApiInitializer( + this, + umbExtensionsRegistry, + 'entityCreateOptionAction', + [], + undefined, + (controllers) => { + this.#apiControllers = controllers; + this._multipleOptions = controllers.length > 1; + }, + ); } - #onPopoverToggle(event: ToggleEvent) { - // TODO: This ignorer is just neede for JSON SCHEMA TO WORK, As its not updated with latest TS jet. - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - this._popoverOpen = event.newState === 'open'; + override render() { + return this._multipleOptions ? this.#renderMultiOptionAction() : this.#renderSingleOptionAction(); } - override render() { - const label = this.localize.term('general_create'); + #renderSingleOptionAction() { + return html` this.#onClick(event, this.#apiControllers[0])}>`; + } + #renderMultiOptionAction() { return html` - - ${label} + + ${this.#createLabel} + ${this.#renderDropdown()} + `; + } + + #renderDropdown() { + return html` - this.#onClick(event, UmbUserKind.DEFAULT)}> - - - this.#onClick(event, UmbUserKind.API)}> - - + ${this.#apiControllers.map((controller) => this.#renderMenuItem(controller))} `; } + + #renderMenuItem(controller: any) { + const label = controller.manifest.meta.label + ? this.localize.string(controller.manifest.meta.label) + : controller.manifest.meta.name; + + return html` + this.#onClick(event, controller)}> + + + `; + } } export { UmbCollectionActionButtonElement as element }; From 6a82d9a6913f2e2803e96046fad5d22eab8467db Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 19:11:03 +0100 Subject: [PATCH 12/37] rename button --- .../action/create-user-collection-action.element.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/packages/user/user/collection/action/create-user-collection-action.element.ts b/src/packages/user/user/collection/action/create-user-collection-action.element.ts index 6ddc1b57cc..41c36a27d1 100644 --- a/src/packages/user/user/collection/action/create-user-collection-action.element.ts +++ b/src/packages/user/user/collection/action/create-user-collection-action.element.ts @@ -3,9 +3,9 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -const elementName = 'umb-create-user-collection-action-button'; +const elementName = 'umb-collection-create-action-button'; @customElement(elementName) -export class UmbCollectionActionButtonElement extends UmbLitElement { +export class UmbCollectionCreateActionButtonElement extends UmbLitElement { @state() private _popoverOpen = false; @@ -97,10 +97,10 @@ export class UmbCollectionActionButtonElement extends UmbLitElement { } } -export { UmbCollectionActionButtonElement as element }; +export { UmbCollectionCreateActionButtonElement as element }; declare global { interface HTMLElementTagNameMap { - [elementName]: UmbCollectionActionButtonElement; + [elementName]: UmbCollectionCreateActionButtonElement; } } From a1c6ab63b86429ce125eee71e9ac0f660f1672cc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 19:13:17 +0100 Subject: [PATCH 13/37] rename file --- ...on-action.element.ts => collection-create-action.element.ts} | 0 src/packages/user/user/collection/action/manifests.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/packages/user/user/collection/action/{create-user-collection-action.element.ts => collection-create-action.element.ts} (100%) diff --git a/src/packages/user/user/collection/action/create-user-collection-action.element.ts b/src/packages/user/user/collection/action/collection-create-action.element.ts similarity index 100% rename from src/packages/user/user/collection/action/create-user-collection-action.element.ts rename to src/packages/user/user/collection/action/collection-create-action.element.ts diff --git a/src/packages/user/user/collection/action/manifests.ts b/src/packages/user/user/collection/action/manifests.ts index 70aa992311..d2228e9b1b 100644 --- a/src/packages/user/user/collection/action/manifests.ts +++ b/src/packages/user/user/collection/action/manifests.ts @@ -5,7 +5,7 @@ export const manifests: Array = [ type: 'collectionAction', name: 'Create User Collection Action', alias: 'Umb.CollectionAction.User.Create', - element: () => import('./create-user-collection-action.element.js'), + element: () => import('./collection-create-action.element.js'), weight: 200, conditions: [ { From 1c805fa934ffc24dc2842d27c320c4015da40d01 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 19:14:36 +0100 Subject: [PATCH 14/37] use constants --- src/packages/user/user/collection/action/manifests.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/packages/user/user/collection/action/manifests.ts b/src/packages/user/user/collection/action/manifests.ts index d2228e9b1b..640a712e12 100644 --- a/src/packages/user/user/collection/action/manifests.ts +++ b/src/packages/user/user/collection/action/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_USER_COLLECTION_ALIAS } from '../constants.js'; import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; export const manifests: Array = [ @@ -10,7 +11,7 @@ export const manifests: Array = [ conditions: [ { alias: UMB_COLLECTION_ALIAS_CONDITION, - match: 'Umb.Collection.User', + match: UMB_USER_COLLECTION_ALIAS, }, ], }, From a38d950836c57d15eddf7539aaa6be832284fa49 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 19:24:41 +0100 Subject: [PATCH 15/37] remove element from create action option manifest --- .../entity-create-option-action.element.ts | 87 ------------------- .../create-option-action/default/index.ts | 1 - .../create-option-action/default/manifests.ts | 20 ----- .../create-option-action/default/types.ts | 44 ---------- ...-create-option-action-element.interface.ts | 4 - .../entity-create-option-action.extension.ts | 4 +- .../create/create-option-action/index.ts | 5 -- .../create/create-option-action/manifests.ts | 4 - .../common/create/create.action.ts | 2 +- .../entity-action/common/create/manifests.ts | 3 +- 10 files changed, 4 insertions(+), 170 deletions(-) delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/default/entity-create-option-action.element.ts delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/default/index.ts delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/default/types.ts delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-element.interface.ts delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/manifests.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/entity-create-option-action.element.ts b/src/packages/core/entity-action/common/create/create-option-action/default/entity-create-option-action.element.ts deleted file mode 100644 index 5c926bbe3e..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/default/entity-create-option-action.element.ts +++ /dev/null @@ -1,87 +0,0 @@ -import type { UmbEntityCreateOptionAction } from '../entity-create-option-action.interface.js'; -import type { UmbEntityCreateOptionActionElement } from '../entity-create-option-action-element.interface.js'; -import type { ManifestEntityCreateOptionAction } from '../entity-create-option-action.extension.js'; -import type { MetaEntityCreateOptionActionDefaultKind } from './types.js'; -import { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; -import { html, nothing, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import type { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; - -const elementName = 'umb-entity-create-option-action'; -@customElement(elementName) -export class UmbEntityCreateOptionActionDefaultElement< - MetaType extends MetaEntityCreateOptionActionDefaultKind = MetaEntityCreateOptionActionDefaultKind, - ApiType extends UmbEntityCreateOptionAction = UmbEntityCreateOptionAction, - > - extends UmbLitElement - implements UmbEntityCreateOptionActionElement -{ - #api?: ApiType; - - // TODO: Do these need to be properties? [NL] - @property({ type: String }) - entityType?: string | null; - - // TODO: Do these need to be properties? [NL] - @property({ type: String }) - public unique?: string | null; - - @property({ attribute: false }) - public manifest?: ManifestEntityCreateOptionAction; - - public set api(api: ApiType | undefined) { - this.#api = api; - - // TODO: Fix so when we use a HREF it does not refresh the page? - this.#api?.getHref?.().then((href) => { - this._href = href; - // TODO: Do we need to update the component here? [NL] - }); - } - - @state() - _href?: string; - - override async focus() { - await this.updateComplete; - this.shadowRoot?.querySelector('uui-menu-item')?.focus(); - } - - async #onClickLabel(event: UUIMenuItemEvent) { - if (!this._href) { - event.stopPropagation(); - await this.#api?.execute(); - } - this.dispatchEvent(new UmbActionExecutedEvent()); - } - - // TODO: we need to stop the regular click event from bubbling up to the table so it doesn't select the row. - // This should probably be handled in the UUI Menu item component. so we don't dispatch a label-click event and click event at the same time. - #onClick(event: PointerEvent) { - event.stopPropagation(); - } - - override render() { - const label = this.manifest?.meta.label ? this.localize.string(this.manifest.meta.label) : this.manifest?.name; - - return html` - - ${this.manifest?.meta.icon - ? html`` - : nothing} - - `; - } -} - -export { UmbEntityCreateOptionActionDefaultElement as element }; - -declare global { - interface HTMLElementTagNameMap { - [elementName]: UmbEntityCreateOptionActionDefaultElement; - } -} diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/index.ts b/src/packages/core/entity-action/common/create/create-option-action/default/index.ts deleted file mode 100644 index d4702960d5..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/default/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './types.js'; diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts b/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts deleted file mode 100644 index b1b7de24bf..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; - -export const manifests: Array = [ - { - type: 'kind', - alias: 'Umb.Kind.EntityCreateOptionAction.Default', - matchKind: 'default', - matchType: 'entityCreateOptionAction', - manifest: { - type: 'entityCreateOptionAction', - kind: 'default', - weight: 1000, - element: () => import('./entity-create-option-action.element.js'), - meta: { - icon: '', - label: 'Default Entity Create Option Action', - }, - }, - }, -]; diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/types.ts b/src/packages/core/entity-action/common/create/create-option-action/default/types.ts deleted file mode 100644 index 465664c91c..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/default/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { - ManifestEntityCreateOptionAction, - MetaEntityCreateOptionAction, -} from '../entity-create-option-action.extension.js'; - -export interface ManifestEntityCreateOptionActionDefaultKind - extends ManifestEntityCreateOptionAction { - type: 'entityCreateOptionAction'; - kind: 'default'; -} - -export interface MetaEntityCreateOptionActionDefaultKind extends MetaEntityCreateOptionAction { - /** - * An icon to represent the action to be performed - * @examples [ - * "icon-box", - * "icon-grid" - * ] - */ - icon: string; - - /** - * The friendly name of the action to perform - * @examples [ - * "Create", - * "Create Content Template" - * ] - */ - label: string; - - /** - * The action requires additional input from the user. - * A dialog will prompt the user for more information or to make a choice. - * @type {boolean} - * @memberof MetaEntityCreateOptionActionDefaultKind - */ - additionalOptions?: boolean; -} - -declare global { - interface UmbExtensionManifestMap { - umbDefaultEntityCreateOptionActionKind: ManifestEntityCreateOptionActionDefaultKind; - } -} diff --git a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-element.interface.ts b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-element.interface.ts deleted file mode 100644 index 6f2c9ab833..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-element.interface.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; - -// eslint-disable-next-line @typescript-eslint/no-empty-object-type -export interface UmbEntityCreateOptionActionElement extends UmbControllerHostElement {} diff --git a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts index 9aff339da4..37341069c2 100644 --- a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts +++ b/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts @@ -1,9 +1,9 @@ import type { UmbEntityCreateOptionAction } from './entity-create-option-action.interface.js'; -import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; export interface ManifestEntityCreateOptionAction< MetaType extends MetaEntityCreateOptionAction = MetaEntityCreateOptionAction, -> extends ManifestElementAndApi>, +> extends ManifestApi>, ManifestWithDynamicConditions { type: 'entityCreateOptionAction'; forEntityTypes: Array; diff --git a/src/packages/core/entity-action/common/create/create-option-action/index.ts b/src/packages/core/entity-action/common/create/create-option-action/index.ts index 5eb9c9635d..f14590182c 100644 --- a/src/packages/core/entity-action/common/create/create-option-action/index.ts +++ b/src/packages/core/entity-action/common/create/create-option-action/index.ts @@ -1,12 +1,7 @@ import './global-components/index.js'; -export * from './default/index.js'; export * from './global-components/index.js'; - export * from './entity-create-option-action-base.js'; export * from './entity-create-option-action.extension.js'; export * from './entity-create-option-action.interface.js'; - -export type * from './entity-create-option-action-element.interface.js'; - export * from './types.js'; diff --git a/src/packages/core/entity-action/common/create/create-option-action/manifests.ts b/src/packages/core/entity-action/common/create/create-option-action/manifests.ts deleted file mode 100644 index 43d020c74e..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/manifests.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { manifests as defaultManifests } from './default/manifests.js'; -import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; - -export const manifests: Array = [...defaultManifests]; diff --git a/src/packages/core/entity-action/common/create/create.action.ts b/src/packages/core/entity-action/common/create/create.action.ts index d96860c9b9..a912365d80 100644 --- a/src/packages/core/entity-action/common/create/create.action.ts +++ b/src/packages/core/entity-action/common/create/create.action.ts @@ -23,7 +23,7 @@ export class UmbCreateEntityAction extends UmbEntityActionBase { this.#hasSingleOption = actionOptions.length === 1; this.#singleActionOptionManifest = this.#hasSingleOption - ? (actionOptions[0].manifest as ManifestEntityCreateOptionAction) + ? (actionOptions[0].manifest as unknown as ManifestEntityCreateOptionAction) : undefined; }, 'umbEntityActionsObserver', diff --git a/src/packages/core/entity-action/common/create/manifests.ts b/src/packages/core/entity-action/common/create/manifests.ts index 6aee3f93b6..d1e496f559 100644 --- a/src/packages/core/entity-action/common/create/manifests.ts +++ b/src/packages/core/entity-action/common/create/manifests.ts @@ -1,5 +1,4 @@ import { manifest as createKindManifest } from './create.action.kind.js'; import { manifests as modalManifests } from './modal/manifests.js'; -import { manifests as createOptionActionManifests } from './create-option-action/manifests.js'; -export const manifests = [createKindManifest, ...modalManifests, ...createOptionActionManifests]; +export const manifests = [createKindManifest, ...modalManifests]; From bdac8bade371184f0aab457f8e456f0f992fb354 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 20:00:45 +0100 Subject: [PATCH 16/37] render as ref item --- ...ntity-create-option-action-list.element.ts | 109 ------------------ .../global-components/index.ts | 3 - .../create/create-option-action/index.ts | 3 - ...create-option-action-list-modal.element.ts | 50 +++++++- .../collection-create-action.element.ts | 10 +- 5 files changed, 52 insertions(+), 123 deletions(-) delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/global-components/entity-create-option-action-list.element.ts delete mode 100644 src/packages/core/entity-action/common/create/create-option-action/global-components/index.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/global-components/entity-create-option-action-list.element.ts b/src/packages/core/entity-action/common/create/create-option-action/global-components/entity-create-option-action-list.element.ts deleted file mode 100644 index eeb948c5d3..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/global-components/entity-create-option-action-list.element.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type { UmbEntityCreateOptionActionArgs } from '../types.js'; -import type { - ManifestEntityCreateOptionAction, - MetaEntityCreateOptionAction, -} from '../entity-create-option-action.extension.js'; -import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; -import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbApiConstructorArgumentsMethodType } from '@umbraco-cms/backoffice/extension-api'; - -const elementName = 'umb-entity-create-option-action-list'; -@customElement(elementName) -export class UmbEntityCreateOptionActionListElement extends UmbLitElement { - @property({ type: String, attribute: 'entity-type' }) - public get entityType(): string | undefined { - return this._props.entityType; - } - public set entityType(value: string | undefined) { - if (value === undefined || value === this._props.entityType) return; - this._props.entityType = value; - this.#generateApiArgs(); - this.requestUpdate('_props'); - // Update filter: - //const oldValue = this._filter; - this._filter = (extension: ManifestEntityCreateOptionAction) => - extension.forEntityTypes.includes(value); - //this.requestUpdate('_filter', oldValue); - } - - @state() - _filter?: (extension: ManifestEntityCreateOptionAction) => boolean; - - @property({ type: String }) - public get unique(): string | null | undefined { - return this._props.unique; - } - public set unique(value: string | null | undefined) { - if (value === this._props.unique) return; - this._props.unique = value; - this.#generateApiArgs(); - this.requestUpdate('_props'); - } - - @state() - _props: Partial> = {}; - - @state() - _apiArgs?: UmbApiConstructorArgumentsMethodType< - ManifestEntityCreateOptionAction, - [UmbEntityCreateOptionActionArgs] - >; - - #entityContext = new UmbEntityContext(this); - #extensionType = 'entityCreateOptionAction'; - - #generateApiArgs() { - if (!this._props.entityType || this._props.unique === undefined) return; - - this.#entityContext.setEntityType(this._props.entityType); - this.#entityContext.setUnique(this._props.unique); - this.#hasRenderedOnce = false; - - this._apiArgs = (manifest: ManifestEntityCreateOptionAction) => { - return [{ entityType: this._props.entityType!, unique: this._props.unique!, meta: manifest.meta }]; - }; - } - - #hasRenderedOnce?: boolean; - override render() { - return this._filter - ? html` - { - if (!this.#hasRenderedOnce && i === 0) { - // TODO: Replace this block: - ext.component?.updateComplete.then(async () => { - const menuitem = ext.component?.shadowRoot?.querySelector('uui-menu-item'); - menuitem?.updateComplete.then(async () => { - menuitem?.shadowRoot?.querySelector('#label-button')?.focus?.(); - }); - }); - // end of block, with this, when this PR is part of UI Lib: https://github.com/umbraco/Umbraco.UI/pull/789 - // ext.component?.focus(); - this.#hasRenderedOnce = true; - } - return ext.component; - }}> - ` - : ''; - } - - static override styles = [ - css` - :host { - --uui-menu-item-flat-structure: 1; - } - `, - ]; -} - -declare global { - interface HTMLElementTagNameMap { - [elementName]: UmbEntityCreateOptionActionListElement; - } -} diff --git a/src/packages/core/entity-action/common/create/create-option-action/global-components/index.ts b/src/packages/core/entity-action/common/create/create-option-action/global-components/index.ts deleted file mode 100644 index 40da9cdab0..0000000000 --- a/src/packages/core/entity-action/common/create/create-option-action/global-components/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import './entity-create-option-action-list.element.js'; - -export * from './entity-create-option-action-list.element.js'; diff --git a/src/packages/core/entity-action/common/create/create-option-action/index.ts b/src/packages/core/entity-action/common/create/create-option-action/index.ts index f14590182c..1794649010 100644 --- a/src/packages/core/entity-action/common/create/create-option-action/index.ts +++ b/src/packages/core/entity-action/common/create/create-option-action/index.ts @@ -1,6 +1,3 @@ -import './global-components/index.js'; - -export * from './global-components/index.js'; export * from './entity-create-option-action-base.js'; export * from './entity-create-option-action.extension.js'; export * from './entity-create-option-action.interface.js'; diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index e9ada04e69..f3ac6ad2a8 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -2,7 +2,9 @@ import type { UmbEntityCreateOptionActionListModalData, UmbEntityCreateOptionActionListModalValue, } from './entity-create-option-action-list-modal.token.js'; -import { html, customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; const elementName = 'umb-entity-create-option-action-list-modal'; @@ -11,13 +13,40 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle UmbEntityCreateOptionActionListModalData, UmbEntityCreateOptionActionListModalValue > { + @state() + private _apiControllers: Array = []; + + constructor() { + super(); + + new UmbExtensionsApiInitializer( + this, + umbExtensionsRegistry, + 'entityCreateOptionAction', + [], + undefined, + (controllers) => { + this._apiControllers = controllers; + }, + ); + } + + async #onClick(event: Event, controller: any) { + event.stopPropagation(); + await controller.api.execute(); + } + override render() { return html` - + + ${repeat( + this._apiControllers, + (controller) => controller.manifest.alias, + (controller) => this.#renderRefItem(controller), + )} + `; } + + #renderRefItem(controller: any) { + const manifest = controller.manifest; + const label = manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.meta.name; + + return html` + this.#onClick(event, controller)}> + `; + } } export { UmbEntityCreateOptionActionListModalElement as element }; diff --git a/src/packages/user/user/collection/action/collection-create-action.element.ts b/src/packages/user/user/collection/action/collection-create-action.element.ts index 41c36a27d1..90805b018e 100644 --- a/src/packages/user/user/collection/action/collection-create-action.element.ts +++ b/src/packages/user/user/collection/action/collection-create-action.element.ts @@ -12,7 +12,9 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { @state() private _multipleOptions = false; - #apiControllers: Array = []; + @state() + private _apiControllers: Array = []; + #createLabel = this.localize.term('general_create'); #onPopoverToggle(event: PointerEvent) { @@ -37,7 +39,7 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { [], undefined, (controllers) => { - this.#apiControllers = controllers; + this._apiControllers = controllers; this._multipleOptions = controllers.length > 1; }, ); @@ -52,7 +54,7 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { label=${this.#createLabel} color="default" look="outline" - @click=${(event: Event) => this.#onClick(event, this.#apiControllers[0])}>`; + @click=${(event: Event) => this.#onClick(event, this._apiControllers[0])}>`; } #renderMultiOptionAction() { @@ -77,7 +79,7 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { @toggle=${this.#onPopoverToggle}> - ${this.#apiControllers.map((controller) => this.#renderMenuItem(controller))} + ${this._apiControllers.map((controller) => this.#renderMenuItem(controller))} From 3662e6c3b9850265850b8283ee48ba3f4bfad9ea Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 20:03:02 +0100 Subject: [PATCH 17/37] render icon from manifest --- .../collection/action/collection-create-action.element.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/packages/user/user/collection/action/collection-create-action.element.ts b/src/packages/user/user/collection/action/collection-create-action.element.ts index 90805b018e..f0a2d88b95 100644 --- a/src/packages/user/user/collection/action/collection-create-action.element.ts +++ b/src/packages/user/user/collection/action/collection-create-action.element.ts @@ -87,13 +87,12 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { } #renderMenuItem(controller: any) { - const label = controller.manifest.meta.label - ? this.localize.string(controller.manifest.meta.label) - : controller.manifest.meta.name; + const manifest = controller.manifest; + const label = manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.meta.name; return html` this.#onClick(event, controller)}> - + `; } From ab6fa407fb4546c5a538a07ec7a0f1ad22a7a930 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Oct 2024 22:02:22 +0100 Subject: [PATCH 18/37] add default kind --- .../create-option-action/default/index.ts | 1 + .../create-option-action/default/manifests.ts | 18 +++++++ .../create-option-action/default/types.ts | 52 +++++++++++++++++++ .../create/create-option-action/index.ts | 1 + .../create/create-option-action/manifests.ts | 3 ++ 5 files changed, 75 insertions(+) create mode 100644 src/packages/core/entity-action/common/create/create-option-action/default/index.ts create mode 100644 src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts create mode 100644 src/packages/core/entity-action/common/create/create-option-action/default/types.ts create mode 100644 src/packages/core/entity-action/common/create/create-option-action/manifests.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/index.ts b/src/packages/core/entity-action/common/create/create-option-action/default/index.ts new file mode 100644 index 0000000000..d4702960d5 --- /dev/null +++ b/src/packages/core/entity-action/common/create/create-option-action/default/index.ts @@ -0,0 +1 @@ +export * from './types.js'; diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts b/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts new file mode 100644 index 0000000000..1aa548f357 --- /dev/null +++ b/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts @@ -0,0 +1,18 @@ +export const manifests = [ + { + type: 'kind', + alias: 'Umb.Kind.EntityCreateOptionAction.Default', + matchKind: 'default', + matchType: 'entityCreateOptionAction', + manifest: { + type: 'entityCreateOptionAction', + kind: 'default', + weight: 1000, + meta: { + icon: '', + label: 'Fill out label', + description: 'Fill out description', + }, + }, + }, +]; diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/types.ts b/src/packages/core/entity-action/common/create/create-option-action/default/types.ts new file mode 100644 index 0000000000..f131c65468 --- /dev/null +++ b/src/packages/core/entity-action/common/create/create-option-action/default/types.ts @@ -0,0 +1,52 @@ +import type { + ManifestEntityCreateOptionAction, + MetaEntityCreateOptionAction, +} from '../entity-create-option-action.extension.js'; + +export interface ManifestEntityCreateOptionActionDefaultKind + extends ManifestEntityCreateOptionAction { + type: 'entityCreateOptionAction'; + kind: 'default'; +} + +export interface MetaEntityCreateOptionActionDefaultKind extends MetaEntityCreateOptionAction { + /** + * An icon to represent the action to be performed + * @examples [ + * "icon-box", + * "icon-grid" + * ] + */ + icon: string; + + /** + * The friendly name of the action to perform + * @examples [ + * "Create with Template", + * "Create from Blueprint" + * ] + */ + label: string; + + /** + * A description of the action to be performed + * @examples [ + * "Create a document type with a template", + * "Create a document from a blueprint" + * ] + */ + description: string; + + /** + * The action requires additional input from the user. + * A dialog will prompt the user for more information or to make a choice. + * @type {boolean} + */ + additionalOptions?: boolean; +} + +declare global { + interface UmbExtensionManifestMap { + umbDefaultEntityCreateOptionActionKind: ManifestEntityCreateOptionActionDefaultKind; + } +} diff --git a/src/packages/core/entity-action/common/create/create-option-action/index.ts b/src/packages/core/entity-action/common/create/create-option-action/index.ts index 1794649010..3134f695a1 100644 --- a/src/packages/core/entity-action/common/create/create-option-action/index.ts +++ b/src/packages/core/entity-action/common/create/create-option-action/index.ts @@ -1,3 +1,4 @@ +export * from './default/index.js'; export * from './entity-create-option-action-base.js'; export * from './entity-create-option-action.extension.js'; export * from './entity-create-option-action.interface.js'; diff --git a/src/packages/core/entity-action/common/create/create-option-action/manifests.ts b/src/packages/core/entity-action/common/create/create-option-action/manifests.ts new file mode 100644 index 0000000000..a61fc1b883 --- /dev/null +++ b/src/packages/core/entity-action/common/create/create-option-action/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as defaultManifests } from './default/manifests.js'; + +export const manifests = [...defaultManifests]; From e843484c9551fa51251f6dc738a949a8b52c4c5f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 30 Oct 2024 19:02:53 +0100 Subject: [PATCH 19/37] add module --- package.json | 1 + src/packages/core/entity-action/common/create/create.action.ts | 2 +- src/packages/core/entity-action/common/create/index.ts | 2 +- .../default/index.ts | 0 .../default/manifests.ts | 0 .../default/types.ts | 0 .../entity-create-option-action-base.ts | 0 .../entity-create-option-action.extension.ts | 0 .../entity-create-option-action.interface.ts | 0 .../index.ts | 0 .../manifests.ts | 0 .../types.ts | 0 tsconfig.json | 3 +++ 13 files changed, 6 insertions(+), 2 deletions(-) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/default/index.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/default/manifests.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/default/types.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/entity-create-option-action-base.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/entity-create-option-action.extension.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/entity-create-option-action.interface.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/index.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/manifests.ts (100%) rename src/packages/core/{entity-action/common/create/create-option-action => entity-create-option-action}/types.ts (100%) diff --git a/package.json b/package.json index e8c3c25519..3b2715be05 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "./document": "./dist-cms/packages/documents/documents/index.js", "./entity-action": "./dist-cms/packages/core/entity-action/index.js", "./entity-bulk-action": "./dist-cms/packages/core/entity-bulk-action/index.js", + "./entity-create-option-action": "./dist-cms/packages/core/entity-create-option-action/index.js", "./entity": "./dist-cms/packages/core/entity/index.js", "./event": "./dist-cms/packages/core/event/index.js", "./extension-registry": "./dist-cms/packages/core/extension-registry/index.js", diff --git a/src/packages/core/entity-action/common/create/create.action.ts b/src/packages/core/entity-action/common/create/create.action.ts index a912365d80..e92c8813d4 100644 --- a/src/packages/core/entity-action/common/create/create.action.ts +++ b/src/packages/core/entity-action/common/create/create.action.ts @@ -2,7 +2,7 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; import type { UmbEntityActionArgs } from '../../types.js'; import type { MetaEntityActionCreateKind } from './types.js'; import { UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL } from './modal/index.js'; -import type { ManifestEntityCreateOptionAction } from './create-option-action/index.js'; +import type { ManifestEntityCreateOptionAction } from '../../../entity-create-option-action/index.js'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/packages/core/entity-action/common/create/index.ts b/src/packages/core/entity-action/common/create/index.ts index e3989cd62d..3a3fdc0b1b 100644 --- a/src/packages/core/entity-action/common/create/index.ts +++ b/src/packages/core/entity-action/common/create/index.ts @@ -1,2 +1,2 @@ export { UmbCreateEntityAction } from './create.action.js'; -export * from './create-option-action/index.js'; +export * from '../../../entity-create-option-action/index.js'; diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/index.ts b/src/packages/core/entity-create-option-action/default/index.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/default/index.ts rename to src/packages/core/entity-create-option-action/default/index.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts b/src/packages/core/entity-create-option-action/default/manifests.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/default/manifests.ts rename to src/packages/core/entity-create-option-action/default/manifests.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/default/types.ts b/src/packages/core/entity-create-option-action/default/types.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/default/types.ts rename to src/packages/core/entity-create-option-action/default/types.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-base.ts b/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action-base.ts rename to src/packages/core/entity-create-option-action/entity-create-option-action-base.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.extension.ts rename to src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.interface.ts b/src/packages/core/entity-create-option-action/entity-create-option-action.interface.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/entity-create-option-action.interface.ts rename to src/packages/core/entity-create-option-action/entity-create-option-action.interface.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/index.ts b/src/packages/core/entity-create-option-action/index.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/index.ts rename to src/packages/core/entity-create-option-action/index.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/manifests.ts b/src/packages/core/entity-create-option-action/manifests.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/manifests.ts rename to src/packages/core/entity-create-option-action/manifests.ts diff --git a/src/packages/core/entity-action/common/create/create-option-action/types.ts b/src/packages/core/entity-create-option-action/types.ts similarity index 100% rename from src/packages/core/entity-action/common/create/create-option-action/types.ts rename to src/packages/core/entity-create-option-action/types.ts diff --git a/tsconfig.json b/tsconfig.json index 40f18ca7ce..3fc4bfabed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -68,6 +68,9 @@ DON'T EDIT THIS FILE DIRECTLY. It is generated by /devops/tsconfig/index.js "@umbraco-cms/backoffice/document": ["./src/packages/documents/documents/index.ts"], "@umbraco-cms/backoffice/entity-action": ["./src/packages/core/entity-action/index.ts"], "@umbraco-cms/backoffice/entity-bulk-action": ["./src/packages/core/entity-bulk-action/index.ts"], + "@umbraco-cms/backoffice/entity-create-option-action": [ + "./src/packages/core/entity-create-option-action/index.ts" + ], "@umbraco-cms/backoffice/entity": ["./src/packages/core/entity/index.ts"], "@umbraco-cms/backoffice/event": ["./src/packages/core/event/index.ts"], "@umbraco-cms/backoffice/extension-registry": ["./src/packages/core/extension-registry/index.ts"], From 9f0468c445b1e804d64863be64e6f31b022b2156 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 31 Oct 2024 13:03:22 +0100 Subject: [PATCH 20/37] remove default kind and require in on the base --- .../common/create/create.action.ts | 2 +- .../core/entity-action/common/create/index.ts | 1 - ...create-option-action-list-modal.element.ts | 44 ++++++++++++---- .../default/index.ts | 1 - .../default/manifests.ts | 18 ------- .../default/types.ts | 52 ------------------- .../entity-create-option-action-base.ts | 5 +- .../entity-create-option-action.extension.ts | 44 +++++++++++++++- .../entity-create-option-action.interface.ts | 6 ++- .../core/entity-create-option-action/index.ts | 1 - .../entity-create-option-action/manifests.ts | 3 -- .../api-user-entity-create-option-action.ts | 2 +- .../create/api-user/manifests.ts | 1 - ...efault-user-entity-create-option-action.ts | 8 ++- .../create/default-user/manifests.ts | 1 - 15 files changed, 90 insertions(+), 99 deletions(-) delete mode 100644 src/packages/core/entity-create-option-action/default/index.ts delete mode 100644 src/packages/core/entity-create-option-action/default/manifests.ts delete mode 100644 src/packages/core/entity-create-option-action/default/types.ts delete mode 100644 src/packages/core/entity-create-option-action/manifests.ts diff --git a/src/packages/core/entity-action/common/create/create.action.ts b/src/packages/core/entity-action/common/create/create.action.ts index e92c8813d4..e341354768 100644 --- a/src/packages/core/entity-action/common/create/create.action.ts +++ b/src/packages/core/entity-action/common/create/create.action.ts @@ -2,11 +2,11 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; import type { UmbEntityActionArgs } from '../../types.js'; import type { MetaEntityActionCreateKind } from './types.js'; import { UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL } from './modal/index.js'; -import type { ManifestEntityCreateOptionAction } from '../../../entity-create-option-action/index.js'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { createExtensionApi, UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestEntityCreateOptionAction } from '@umbraco-cms/backoffice/entity-create-option-action'; export class UmbCreateEntityAction extends UmbEntityActionBase { #hasSingleOption = true; diff --git a/src/packages/core/entity-action/common/create/index.ts b/src/packages/core/entity-action/common/create/index.ts index 3a3fdc0b1b..d44c5eca74 100644 --- a/src/packages/core/entity-action/common/create/index.ts +++ b/src/packages/core/entity-action/common/create/index.ts @@ -1,2 +1 @@ export { UmbCreateEntityAction } from './create.action.js'; -export * from '../../../entity-create-option-action/index.js'; diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index f3ac6ad2a8..a261169e90 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -2,11 +2,15 @@ import type { UmbEntityCreateOptionActionListModalData, UmbEntityCreateOptionActionListModalValue, } from './entity-create-option-action-list-modal.token.js'; +import type { ManifestEntityCreateOptionAction } from '@umbraco-cms/backoffice/entity-create-option-action'; +import type { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +type ManifestType = ManifestEntityCreateOptionAction; + const elementName = 'umb-entity-create-option-action-list-modal'; @customElement(elementName) export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseElement< @@ -14,7 +18,9 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle UmbEntityCreateOptionActionListModalValue > { @state() - private _apiControllers: Array = []; + private _apiControllers: Array> = []; + + #hrefMap = new Map(); constructor() { super(); @@ -26,13 +32,29 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle [], undefined, (controllers) => { - this._apiControllers = controllers; + this._apiControllers = controllers as unknown as Array>; + + this._apiControllers.forEach((controller) => { + controller.api?.getHref().then((href) => { + const alias = controller.manifest?.alias; + if (!alias) throw new Error('No alias found'); + // only apply to map if href is defined + if (href) { + this.#hrefMap.set(alias, href); + } + }); + }); }, ); } - async #onClick(event: Event, controller: any) { + async #onClick(event: Event, controller: UmbExtensionApiInitializer) { event.stopPropagation(); + + if (!controller.api) throw new Error('No api found'); + + const href = this.#hrefMap.get(controller.manifest?.alias); + await controller.api.execute(); } @@ -43,7 +65,7 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle ${repeat( this._apiControllers, - (controller) => controller.manifest.alias, + (controller) => controller.manifest?.alias, (controller) => this.#renderRefItem(controller), )} @@ -56,16 +78,20 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle `; } - #renderRefItem(controller: any) { + #renderRefItem(controller: UmbExtensionApiInitializer) { const manifest = controller.manifest; - const label = manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.meta.name; + if (!manifest) throw new Error('No manifest found'); + + const label = manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.name; + const href = this.#hrefMap.get(manifest.alias); return html` this.#onClick(event, controller)}> + @click=${(event: Event) => this.#onClick(event, controller)} + .href=${href}> `; } } diff --git a/src/packages/core/entity-create-option-action/default/index.ts b/src/packages/core/entity-create-option-action/default/index.ts deleted file mode 100644 index d4702960d5..0000000000 --- a/src/packages/core/entity-create-option-action/default/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './types.js'; diff --git a/src/packages/core/entity-create-option-action/default/manifests.ts b/src/packages/core/entity-create-option-action/default/manifests.ts deleted file mode 100644 index 1aa548f357..0000000000 --- a/src/packages/core/entity-create-option-action/default/manifests.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const manifests = [ - { - type: 'kind', - alias: 'Umb.Kind.EntityCreateOptionAction.Default', - matchKind: 'default', - matchType: 'entityCreateOptionAction', - manifest: { - type: 'entityCreateOptionAction', - kind: 'default', - weight: 1000, - meta: { - icon: '', - label: 'Fill out label', - description: 'Fill out description', - }, - }, - }, -]; diff --git a/src/packages/core/entity-create-option-action/default/types.ts b/src/packages/core/entity-create-option-action/default/types.ts deleted file mode 100644 index f131c65468..0000000000 --- a/src/packages/core/entity-create-option-action/default/types.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { - ManifestEntityCreateOptionAction, - MetaEntityCreateOptionAction, -} from '../entity-create-option-action.extension.js'; - -export interface ManifestEntityCreateOptionActionDefaultKind - extends ManifestEntityCreateOptionAction { - type: 'entityCreateOptionAction'; - kind: 'default'; -} - -export interface MetaEntityCreateOptionActionDefaultKind extends MetaEntityCreateOptionAction { - /** - * An icon to represent the action to be performed - * @examples [ - * "icon-box", - * "icon-grid" - * ] - */ - icon: string; - - /** - * The friendly name of the action to perform - * @examples [ - * "Create with Template", - * "Create from Blueprint" - * ] - */ - label: string; - - /** - * A description of the action to be performed - * @examples [ - * "Create a document type with a template", - * "Create a document from a blueprint" - * ] - */ - description: string; - - /** - * The action requires additional input from the user. - * A dialog will prompt the user for more information or to make a choice. - * @type {boolean} - */ - additionalOptions?: boolean; -} - -declare global { - interface UmbExtensionManifestMap { - umbDefaultEntityCreateOptionActionKind: ManifestEntityCreateOptionActionDefaultKind; - } -} diff --git a/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts b/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts index c8daf62492..2800261185 100644 --- a/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts +++ b/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts @@ -1,8 +1,11 @@ import type { UmbEntityCreateOptionActionArgs } from './types.js'; import type { UmbEntityCreateOptionAction } from './entity-create-option-action.interface.js'; +import type { MetaEntityCreateOptionAction } from './entity-create-option-action.extension.js'; import { UmbActionBase } from '@umbraco-cms/backoffice/action'; -export abstract class UmbEntityCreateOptionActionBase +export abstract class UmbEntityCreateOptionActionBase< + ArgsMetaType extends MetaEntityCreateOptionAction = MetaEntityCreateOptionAction, + > extends UmbActionBase> implements UmbEntityCreateOptionAction { diff --git a/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts index 37341069c2..cce0b9a4f2 100644 --- a/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts +++ b/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts @@ -3,7 +3,7 @@ import type { ManifestApi, ManifestWithDynamicConditions } from '@umbraco-cms/ba export interface ManifestEntityCreateOptionAction< MetaType extends MetaEntityCreateOptionAction = MetaEntityCreateOptionAction, -> extends ManifestApi>, +> extends ManifestApi>, ManifestWithDynamicConditions { type: 'entityCreateOptionAction'; forEntityTypes: Array; @@ -11,4 +11,44 @@ export interface ManifestEntityCreateOptionAction< } // eslint-disable-next-line @typescript-eslint/no-empty-object-type -export interface MetaEntityCreateOptionAction {} +export interface MetaEntityCreateOptionAction { + /** + * An icon to represent the action to be performed + * @examples [ + * "icon-box", + * "icon-grid" + * ] + */ + icon: string; + + /** + * The friendly name of the action to perform + * @examples [ + * "Create with Template", + * "Create from Blueprint" + * ] + */ + label: string; + + /** + * A description of the action to be performed + * @examples [ + * "Create a document type with a template", + * "Create a document from a blueprint" + * ] + */ + description?: string; + + /** + * The action requires additional input from the user. + * A dialog will prompt the user for more information or to make a choice. + * @type {boolean} + */ + additionalOptions?: boolean; +} + +declare global { + interface UmbExtensionManifestMap { + umbEntityCreateOptionAction: ManifestEntityCreateOptionAction; + } +} diff --git a/src/packages/core/entity-create-option-action/entity-create-option-action.interface.ts b/src/packages/core/entity-create-option-action/entity-create-option-action.interface.ts index 0956868cb7..141e9dd084 100644 --- a/src/packages/core/entity-create-option-action/entity-create-option-action.interface.ts +++ b/src/packages/core/entity-create-option-action/entity-create-option-action.interface.ts @@ -1,8 +1,10 @@ +import type { MetaEntityCreateOptionAction } from './entity-create-option-action.extension.js'; import type { UmbEntityCreateOptionActionArgs } from './types.js'; import type { UmbAction } from '@umbraco-cms/backoffice/action'; -export interface UmbEntityCreateOptionAction - extends UmbAction> { +export interface UmbEntityCreateOptionAction< + ArgsMetaType extends MetaEntityCreateOptionAction = MetaEntityCreateOptionAction, +> extends UmbAction> { /** * The href location, the action will act as a link. * @returns {Promise} diff --git a/src/packages/core/entity-create-option-action/index.ts b/src/packages/core/entity-create-option-action/index.ts index 3134f695a1..1794649010 100644 --- a/src/packages/core/entity-create-option-action/index.ts +++ b/src/packages/core/entity-create-option-action/index.ts @@ -1,4 +1,3 @@ -export * from './default/index.js'; export * from './entity-create-option-action-base.js'; export * from './entity-create-option-action.extension.js'; export * from './entity-create-option-action.interface.js'; diff --git a/src/packages/core/entity-create-option-action/manifests.ts b/src/packages/core/entity-create-option-action/manifests.ts deleted file mode 100644 index a61fc1b883..0000000000 --- a/src/packages/core/entity-create-option-action/manifests.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { manifests as defaultManifests } from './default/manifests.js'; - -export const manifests = [...defaultManifests]; diff --git a/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts index e0c48579b8..ebb5d4571a 100644 --- a/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts +++ b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts @@ -1,4 +1,4 @@ -import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-create-option-action'; export class UmbApiUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { override async execute() { diff --git a/src/packages/user/user/entity-actions/create/api-user/manifests.ts b/src/packages/user/user/entity-actions/create/api-user/manifests.ts index 5c5ea02ca8..8232d63fbc 100644 --- a/src/packages/user/user/entity-actions/create/api-user/manifests.ts +++ b/src/packages/user/user/entity-actions/create/api-user/manifests.ts @@ -3,7 +3,6 @@ import { UMB_USER_ROOT_ENTITY_TYPE } from '../../../entity.js'; export const manifests: Array = [ { type: 'entityCreateOptionAction', - kind: 'default', alias: 'Umb.EntityCreateOptionAction.User.Api', name: 'Api User Entity Create Option Action', weight: 1100, diff --git a/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts index 7da007dc51..3d67778126 100644 --- a/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts +++ b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts @@ -1,14 +1,12 @@ import { UMB_CREATE_USER_MODAL } from '../../../modals/create/create-user-modal.token.js'; import type { UmbUserKindType } from '../../../utils/index.js'; import { UmbUserKind } from '../../../utils/index.js'; +import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-create-option-action'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { - UmbEntityCreateOptionActionBase, - UmbRequestReloadChildrenOfEntityEvent, -} from '@umbraco-cms/backoffice/entity-action'; +import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -export class UmbDefaultUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { +export class UmbDefaultUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { override async execute() { const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const kind: UmbUserKindType = UmbUserKind.DEFAULT; diff --git a/src/packages/user/user/entity-actions/create/default-user/manifests.ts b/src/packages/user/user/entity-actions/create/default-user/manifests.ts index 4e12d1e039..cccb602cfc 100644 --- a/src/packages/user/user/entity-actions/create/default-user/manifests.ts +++ b/src/packages/user/user/entity-actions/create/default-user/manifests.ts @@ -3,7 +3,6 @@ import { UMB_USER_ROOT_ENTITY_TYPE } from '../../../entity.js'; export const manifests: Array = [ { type: 'entityCreateOptionAction', - kind: 'default', alias: 'Umb.EntityCreateOptionAction.User.Default', name: 'Default User Entity Create Option Action', weight: 1200, From f2f96d2997062c092d5397ae498afe600750051b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 31 Oct 2024 13:57:59 +0100 Subject: [PATCH 21/37] get ref for item --- ...create-option-action-list-modal.element.ts | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index a261169e90..1db65a8f85 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -20,7 +20,11 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle @state() private _apiControllers: Array> = []; - #hrefMap = new Map(); + @state() + _hrefMap = new Map(); + + @state() + _hrefList: Array = []; constructor() { super(); @@ -31,19 +35,11 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle 'entityCreateOptionAction', [], undefined, - (controllers) => { + async (controllers) => { this._apiControllers = controllers as unknown as Array>; - this._apiControllers.forEach((controller) => { - controller.api?.getHref().then((href) => { - const alias = controller.manifest?.alias; - if (!alias) throw new Error('No alias found'); - // only apply to map if href is defined - if (href) { - this.#hrefMap.set(alias, href); - } - }); - }); + const hrefPromises = this._apiControllers.map((controller) => controller.api?.getHref()); + this._hrefList = await Promise.all(hrefPromises); }, ); } @@ -51,10 +47,15 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle async #onClick(event: Event, controller: UmbExtensionApiInitializer) { event.stopPropagation(); - if (!controller.api) throw new Error('No api found'); + if (!controller.manifest) throw new Error('No manifest found'); + const href = this._hrefMap.get(controller.manifest?.alias); - const href = this.#hrefMap.get(controller.manifest?.alias); + // skip if href is defined + if (href) { + return; + } + if (!controller.api) throw new Error('No API found'); await controller.api.execute(); } @@ -66,7 +67,7 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle ${repeat( this._apiControllers, (controller) => controller.manifest?.alias, - (controller) => this.#renderRefItem(controller), + (controller, index) => this.#renderRefItem(controller, index), )} @@ -78,12 +79,12 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle `; } - #renderRefItem(controller: UmbExtensionApiInitializer) { + #renderRefItem(controller: UmbExtensionApiInitializer, index: number) { const manifest = controller.manifest; if (!manifest) throw new Error('No manifest found'); const label = manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.name; - const href = this.#hrefMap.get(manifest.alias); + const href = this._hrefList[index]; return html` this.#onClick(event, controller)} - .href=${href}> + href=${ifDefined(href)}> `; } } From 81ced370f2652db6d0f1cdaf854ed1f8478f764c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 31 Oct 2024 14:20:56 +0100 Subject: [PATCH 22/37] switch between button and link state --- ...ity-create-option-action-list-modal.element.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index 1db65a8f85..270bd46805 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -59,6 +59,14 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle await controller.api.execute(); } + #getTarget(href?: string) { + if (href && href.startsWith('http')) { + return '_blank'; + } + + return '_self'; + } + override render() { return html` @@ -87,12 +95,15 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle const href = this._hrefList[index]; return html` - this.#onClick(event, controller)} - href=${ifDefined(href)}> + href=${ifDefined(href)} + target=${this.#getTarget(href)} + ?selectable=${!href} + ?readonly=${!href}> `; } } From 7e923dc70b235865802c358f2461374f12f8f2c6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 31 Oct 2024 15:41:11 +0100 Subject: [PATCH 23/37] pass args to api --- ...create-option-action-list-modal.element.ts | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index 270bd46805..2bdc224261 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -6,7 +6,7 @@ import type { ManifestEntityCreateOptionAction } from '@umbraco-cms/backoffice/e import type { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { html, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, repeat, ifDefined, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; type ManifestType = ManifestEntityCreateOptionAction; @@ -26,18 +26,29 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle @state() _hrefList: Array = []; - constructor() { - super(); + @property({ attribute: false }) + public override set data(value: UmbEntityCreateOptionActionListModalData | undefined) { + super.data = value; + + if (value) { + this.#initApi(); + } + } + + #initApi() { + if (this._data?.entityType === undefined) throw new Error('No entityType found'); + if (this._data?.unique === undefined) throw new Error('No unique found'); new UmbExtensionsApiInitializer( this, umbExtensionsRegistry, 'entityCreateOptionAction', - [], + (manifest: ManifestType) => { + return [{ entityType: this._data!.entityType, unique: this._data!.unique, meta: manifest.meta }]; + }, undefined, async (controllers) => { this._apiControllers = controllers as unknown as Array>; - const hrefPromises = this._apiControllers.map((controller) => controller.api?.getHref()); this._hrefList = await Promise.all(hrefPromises); }, From c14a04025a2e82a7c1996584b85590ed65f1baac Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 31 Oct 2024 18:44:05 +0100 Subject: [PATCH 24/37] null check + render correct icon --- ...create-option-action-list-modal.element.ts | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index 2bdc224261..03360e282c 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -6,7 +6,15 @@ import type { ManifestEntityCreateOptionAction } from '@umbraco-cms/backoffice/e import type { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { html, customElement, state, repeat, ifDefined, property } from '@umbraco-cms/backoffice/external/lit'; +import { + html, + customElement, + state, + repeat, + ifDefined, + property, + type PropertyValues, +} from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; type ManifestType = ManifestEntityCreateOptionAction; @@ -26,25 +34,27 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle @state() _hrefList: Array = []; - @property({ attribute: false }) - public override set data(value: UmbEntityCreateOptionActionListModalData | undefined) { - super.data = value; + protected override updated(_changedProperties: PropertyValues): void { + super.updated(_changedProperties); - if (value) { + if (_changedProperties.has('data')) { this.#initApi(); } } #initApi() { - if (this._data?.entityType === undefined) throw new Error('No entityType found'); - if (this._data?.unique === undefined) throw new Error('No unique found'); + const data = this.data; + if (!data) throw new Error('No data found'); + + if (data.entityType === undefined) throw new Error('No entityType found'); + if (data.unique === undefined) throw new Error('No unique found'); new UmbExtensionsApiInitializer( this, umbExtensionsRegistry, 'entityCreateOptionAction', (manifest: ManifestType) => { - return [{ entityType: this._data!.entityType, unique: this._data!.unique, meta: manifest.meta }]; + return [{ entityType: data.entityType, unique: data.unique, meta: manifest.meta }]; }, undefined, async (controllers) => { @@ -109,12 +119,13 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle this.#onClick(event, controller)} href=${ifDefined(href)} target=${this.#getTarget(href)} ?selectable=${!href} - ?readonly=${!href}> + ?readonly=${!href}> + + `; } } From 0694926ea8ff54abd02b078a5c7e7ad2eb7a9a83 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 31 Oct 2024 19:14:18 +0100 Subject: [PATCH 25/37] extract to base class --- .../api-user-entity-create-option-action.ts | 17 ++++-- ...efault-user-entity-create-option-action.ts | 49 ++++------------ .../user-entity-create-option-action-base.ts | 58 +++++++++++++++++++ 3 files changed, 82 insertions(+), 42 deletions(-) create mode 100644 src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts diff --git a/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts index ebb5d4571a..2fd165fed7 100644 --- a/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts +++ b/src/packages/user/user/entity-actions/create/api-user/api-user-entity-create-option-action.ts @@ -1,8 +1,17 @@ -import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-create-option-action'; +import { UmbUserEntityCreateOptionActionBase } from '../user-entity-create-option-action-base.js'; +import { UmbUserKind } from '../../../utils/index.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { + MetaEntityCreateOptionAction, + UmbEntityCreateOptionActionArgs, +} from '@umbraco-cms/backoffice/entity-create-option-action'; -export class UmbApiUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { - override async execute() { - debugger; +export class UmbApiUserEntityCreateOptionAction extends UmbUserEntityCreateOptionActionBase { + constructor(host: UmbControllerHost, args: UmbEntityCreateOptionActionArgs) { + super(host, { + ...args, + kind: UmbUserKind.API, + }); } } diff --git a/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts index 3d67778126..9c67384285 100644 --- a/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts +++ b/src/packages/user/user/entity-actions/create/default-user/default-user-entity-create-option-action.ts @@ -1,44 +1,17 @@ -import { UMB_CREATE_USER_MODAL } from '../../../modals/create/create-user-modal.token.js'; -import type { UmbUserKindType } from '../../../utils/index.js'; import { UmbUserKind } from '../../../utils/index.js'; -import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-create-option-action'; -import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; -import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UmbUserEntityCreateOptionActionBase } from '../user-entity-create-option-action-base.js'; +import type { + MetaEntityCreateOptionAction, + UmbEntityCreateOptionActionArgs, +} from '@umbraco-cms/backoffice/entity-create-option-action'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export class UmbDefaultUserEntityCreateOptionAction extends UmbEntityCreateOptionActionBase { - override async execute() { - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const kind: UmbUserKindType = UmbUserKind.DEFAULT; - - const modalContext = modalManager.open(this, UMB_CREATE_USER_MODAL, { - data: { - user: { - kind, - }, - }, - }); - - await modalContext - ?.onSubmit() - .then(() => { - this.#requestReloadChildrenOfEntity(); - }) - .catch(async () => { - // modal is closed after creation instead of navigating to the new user. - // We therefore need to reload the children of the entity - this.#requestReloadChildrenOfEntity(); - }); - } - - async #requestReloadChildrenOfEntity() { - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadChildrenOfEntityEvent({ - entityType: this.args.entityType, - unique: this.args.unique, +export class UmbDefaultUserEntityCreateOptionAction extends UmbUserEntityCreateOptionActionBase { + constructor(host: UmbControllerHost, args: UmbEntityCreateOptionActionArgs) { + super(host, { + ...args, + kind: UmbUserKind.DEFAULT, }); - - eventContext.dispatchEvent(event); } } diff --git a/src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts b/src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts new file mode 100644 index 0000000000..ea74db1f15 --- /dev/null +++ b/src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts @@ -0,0 +1,58 @@ +import { UMB_CREATE_USER_MODAL } from '../../modals/create/create-user-modal.token.js'; +import type { UmbUserKindType } from '../../utils/index.js'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { + UmbEntityCreateOptionActionBase, + type MetaEntityCreateOptionAction, + type UmbEntityCreateOptionActionArgs, +} from '@umbraco-cms/backoffice/entity-create-option-action'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; + +export interface UmbUserEntityCreateOptionActionBaseArgs + extends UmbEntityCreateOptionActionArgs { + kind: UmbUserKindType; +} + +export abstract class UmbUserEntityCreateOptionActionBase extends UmbEntityCreateOptionActionBase { + #kind: UmbUserKindType; + + constructor(host: UmbControllerHost, args: UmbUserEntityCreateOptionActionBaseArgs) { + super(host, args); + this.#kind = args.kind; + } + + override async execute() { + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + + const modalContext = modalManager.open(this, UMB_CREATE_USER_MODAL, { + data: { + user: { + kind: this.#kind, + }, + }, + }); + + await modalContext + ?.onSubmit() + .then(() => { + this.#requestReloadChildrenOfEntity(); + }) + .catch(async () => { + // modal is closed after creation instead of navigating to the new user. + // We therefore need to reload the children of the entity + this.#requestReloadChildrenOfEntity(); + }); + } + + async #requestReloadChildrenOfEntity() { + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadChildrenOfEntityEvent({ + entityType: this.args.entityType, + unique: this.args.unique, + }); + + eventContext.dispatchEvent(event); + } +} From 62a2f5f027c3f1e008aa5c2c0887eddf7f0efd43 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 2 Nov 2024 20:29:53 +0100 Subject: [PATCH 26/37] clean up --- .../entity-create-option-action-list-modal.element.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index 03360e282c..e3c871d6ec 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -12,7 +12,6 @@ import { state, repeat, ifDefined, - property, type PropertyValues, } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; @@ -28,9 +27,6 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle @state() private _apiControllers: Array> = []; - @state() - _hrefMap = new Map(); - @state() _hrefList: Array = []; @@ -65,12 +61,9 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle ); } - async #onClick(event: Event, controller: UmbExtensionApiInitializer) { + async #onClick(event: Event, controller: UmbExtensionApiInitializer, href?: string) { event.stopPropagation(); - if (!controller.manifest) throw new Error('No manifest found'); - const href = this._hrefMap.get(controller.manifest?.alias); - // skip if href is defined if (href) { return; @@ -119,7 +112,7 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle this.#onClick(event, controller)} + @click=${(event: Event) => this.#onClick(event, controller, href)} href=${ifDefined(href)} target=${this.#getTarget(href)} ?selectable=${!href} From 66d0cc796d2fd120fb83c25c2bbf7e715d22c06a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 2 Nov 2024 20:30:32 +0100 Subject: [PATCH 27/37] clean up --- .../modal/entity-create-option-action-list-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index e3c871d6ec..3675770b96 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -42,7 +42,7 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle const data = this.data; if (!data) throw new Error('No data found'); - if (data.entityType === undefined) throw new Error('No entityType found'); + if (!data.entityType) throw new Error('No entityType found'); if (data.unique === undefined) throw new Error('No unique found'); new UmbExtensionsApiInitializer( From 20c00bd16fe8cdc95d1c7146bf29b098d4779253 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 2 Nov 2024 20:41:41 +0100 Subject: [PATCH 28/37] move create modal into create folder --- .../user/user/entity-actions/create/index.ts | 1 + .../user/user/entity-actions/create/manifests.ts | 2 ++ .../create/modal}/constants.ts | 0 .../create/modal}/create-user-modal.element.ts | 4 ++-- .../create/modal}/create-user-modal.token.ts | 2 +- .../modal}/create-user-success-modal.element.ts | 8 ++++---- .../modal}/create-user-success-modal.token.ts | 0 .../user/entity-actions/create/modal/index.ts | 1 + .../entity-actions/create/modal/manifests.ts | 16 ++++++++++++++++ .../user-entity-create-option-action-base.ts | 2 +- src/packages/user/user/modals/manifests.ts | 14 -------------- 11 files changed, 28 insertions(+), 22 deletions(-) create mode 100644 src/packages/user/user/entity-actions/create/index.ts rename src/packages/user/user/{modals/create => entity-actions/create/modal}/constants.ts (100%) rename src/packages/user/user/{modals/create => entity-actions/create/modal}/create-user-modal.element.ts (97%) rename src/packages/user/user/{modals/create => entity-actions/create/modal}/create-user-modal.token.ts (85%) rename src/packages/user/user/{modals/create => entity-actions/create/modal}/create-user-success-modal.element.ts (92%) rename src/packages/user/user/{modals/create => entity-actions/create/modal}/create-user-success-modal.token.ts (100%) create mode 100644 src/packages/user/user/entity-actions/create/modal/index.ts create mode 100644 src/packages/user/user/entity-actions/create/modal/manifests.ts diff --git a/src/packages/user/user/entity-actions/create/index.ts b/src/packages/user/user/entity-actions/create/index.ts new file mode 100644 index 0000000000..28d9f38fba --- /dev/null +++ b/src/packages/user/user/entity-actions/create/index.ts @@ -0,0 +1 @@ +export * from './modal/index.js'; diff --git a/src/packages/user/user/entity-actions/create/manifests.ts b/src/packages/user/user/entity-actions/create/manifests.ts index 2e67f026d0..095b44610b 100644 --- a/src/packages/user/user/entity-actions/create/manifests.ts +++ b/src/packages/user/user/entity-actions/create/manifests.ts @@ -1,6 +1,7 @@ import { UMB_USER_ROOT_ENTITY_TYPE } from '../../entity.js'; import { manifests as apiUser } from './api-user/manifests.js'; import { manifests as defaultUser } from './default-user/manifests.js'; +import { manifests as modalManifests } from './modal/manifests.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; @@ -14,4 +15,5 @@ export const manifests: Array = }, ...apiUser, ...defaultUser, + ...modalManifests, ]; diff --git a/src/packages/user/user/modals/create/constants.ts b/src/packages/user/user/entity-actions/create/modal/constants.ts similarity index 100% rename from src/packages/user/user/modals/create/constants.ts rename to src/packages/user/user/entity-actions/create/modal/constants.ts diff --git a/src/packages/user/user/modals/create/create-user-modal.element.ts b/src/packages/user/user/entity-actions/create/modal/create-user-modal.element.ts similarity index 97% rename from src/packages/user/user/modals/create/create-user-modal.element.ts rename to src/packages/user/user/entity-actions/create/modal/create-user-modal.element.ts index 863fc88bec..cea24184d8 100644 --- a/src/packages/user/user/modals/create/create-user-modal.element.ts +++ b/src/packages/user/user/entity-actions/create/modal/create-user-modal.element.ts @@ -1,5 +1,5 @@ -import { UmbUserDetailRepository } from '../../repository/index.js'; -import { UmbUserKind } from '../../utils/index.js'; +import { UmbUserDetailRepository } from '../../../repository/index.js'; +import { UmbUserKind } from '../../../utils/index.js'; import { UMB_CREATE_USER_SUCCESS_MODAL } from './create-user-success-modal.token.js'; import type { UmbCreateUserModalData } from './create-user-modal.token.js'; import type { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; diff --git a/src/packages/user/user/modals/create/create-user-modal.token.ts b/src/packages/user/user/entity-actions/create/modal/create-user-modal.token.ts similarity index 85% rename from src/packages/user/user/modals/create/create-user-modal.token.ts rename to src/packages/user/user/entity-actions/create/modal/create-user-modal.token.ts index 4486b12f4f..3fb7a19847 100644 --- a/src/packages/user/user/modals/create/create-user-modal.token.ts +++ b/src/packages/user/user/entity-actions/create/modal/create-user-modal.token.ts @@ -1,4 +1,4 @@ -import type { UmbUserKindType } from '../../utils/index.js'; +import type { UmbUserKindType } from '../../../utils/index.js'; import { UMB_CREATE_USER_MODAL_ALIAS } from './constants.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; diff --git a/src/packages/user/user/modals/create/create-user-success-modal.element.ts b/src/packages/user/user/entity-actions/create/modal/create-user-success-modal.element.ts similarity index 92% rename from src/packages/user/user/modals/create/create-user-success-modal.element.ts rename to src/packages/user/user/entity-actions/create/modal/create-user-success-modal.element.ts index f30bf145be..d3c43c0a0d 100644 --- a/src/packages/user/user/modals/create/create-user-success-modal.element.ts +++ b/src/packages/user/user/entity-actions/create/modal/create-user-success-modal.element.ts @@ -1,7 +1,7 @@ -import { UmbUserItemRepository } from '../../repository/item/index.js'; -import { UmbNewUserPasswordRepository } from '../../repository/new-password/index.js'; -import type { UmbUserItemModel } from '../../repository/item/types.js'; -import { UMB_USER_WORKSPACE_PATH } from '../../paths.js'; +import { UmbUserItemRepository } from '../../../repository/item/index.js'; +import { UmbNewUserPasswordRepository } from '../../../repository/new-password/index.js'; +import type { UmbUserItemModel } from '../../../repository/item/index.js'; +import { UMB_USER_WORKSPACE_PATH } from '../../../paths.js'; import type { UmbCreateUserSuccessModalData, UmbCreateUserSuccessModalValue, diff --git a/src/packages/user/user/modals/create/create-user-success-modal.token.ts b/src/packages/user/user/entity-actions/create/modal/create-user-success-modal.token.ts similarity index 100% rename from src/packages/user/user/modals/create/create-user-success-modal.token.ts rename to src/packages/user/user/entity-actions/create/modal/create-user-success-modal.token.ts diff --git a/src/packages/user/user/entity-actions/create/modal/index.ts b/src/packages/user/user/entity-actions/create/modal/index.ts new file mode 100644 index 0000000000..4f07201dcf --- /dev/null +++ b/src/packages/user/user/entity-actions/create/modal/index.ts @@ -0,0 +1 @@ +export * from './constants.js'; diff --git a/src/packages/user/user/entity-actions/create/modal/manifests.ts b/src/packages/user/user/entity-actions/create/modal/manifests.ts new file mode 100644 index 0000000000..ca86e33e91 --- /dev/null +++ b/src/packages/user/user/entity-actions/create/modal/manifests.ts @@ -0,0 +1,16 @@ +import { UMB_CREATE_USER_MODAL_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'modal', + alias: UMB_CREATE_USER_MODAL_ALIAS, + name: 'Create User Modal', + js: () => import('./create-user-modal.element.js'), + }, + { + type: 'modal', + alias: 'Umb.Modal.User.CreateSuccess', + name: 'Create Success User Modal', + js: () => import('./create-user-success-modal.element.js'), + }, +]; diff --git a/src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts b/src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts index ea74db1f15..ca55652d5a 100644 --- a/src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts +++ b/src/packages/user/user/entity-actions/create/user-entity-create-option-action-base.ts @@ -1,5 +1,5 @@ -import { UMB_CREATE_USER_MODAL } from '../../modals/create/create-user-modal.token.js'; import type { UmbUserKindType } from '../../utils/index.js'; +import { UMB_CREATE_USER_MODAL } from './modal/create-user-modal.token.js'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; diff --git a/src/packages/user/user/modals/manifests.ts b/src/packages/user/user/modals/manifests.ts index 614f3e0d7b..03273e88df 100644 --- a/src/packages/user/user/modals/manifests.ts +++ b/src/packages/user/user/modals/manifests.ts @@ -1,18 +1,4 @@ -import { UMB_CREATE_USER_MODAL_ALIAS } from './create/constants.js'; - export const manifests: Array = [ - { - type: 'modal', - alias: UMB_CREATE_USER_MODAL_ALIAS, - name: 'Create User Modal', - js: () => import('./create/create-user-modal.element.js'), - }, - { - type: 'modal', - alias: 'Umb.Modal.User.CreateSuccess', - name: 'Create Success User Modal', - js: () => import('./create/create-user-success-modal.element.js'), - }, { type: 'modal', alias: 'Umb.Modal.User.Picker', From 94bcc4d4c664276c5cbce9f01f9e53d0755bde71 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 2 Nov 2024 21:00:48 +0100 Subject: [PATCH 29/37] add create collection action kind --- .../collection-create-action.element.ts | 0 .../collection/action/create/manifests.ts | 19 +++++++++++++++++++ .../core/collection/action/create/types.ts | 12 ++++++++++++ .../core/collection/action/manifests.ts | 4 ++++ src/packages/core/collection/manifests.ts | 2 ++ ...create-option-action-list-modal.element.ts | 16 +++++++++------- .../user/user/collection/action/manifests.ts | 3 +-- 7 files changed, 47 insertions(+), 9 deletions(-) rename src/packages/{user/user/collection/action => core/collection/action/create}/collection-create-action.element.ts (100%) create mode 100644 src/packages/core/collection/action/create/manifests.ts create mode 100644 src/packages/core/collection/action/create/types.ts create mode 100644 src/packages/core/collection/action/manifests.ts diff --git a/src/packages/user/user/collection/action/collection-create-action.element.ts b/src/packages/core/collection/action/create/collection-create-action.element.ts similarity index 100% rename from src/packages/user/user/collection/action/collection-create-action.element.ts rename to src/packages/core/collection/action/create/collection-create-action.element.ts diff --git a/src/packages/core/collection/action/create/manifests.ts b/src/packages/core/collection/action/create/manifests.ts new file mode 100644 index 0000000000..429fb41b26 --- /dev/null +++ b/src/packages/core/collection/action/create/manifests.ts @@ -0,0 +1,19 @@ +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'kind', + alias: 'Umb.Kind.CollectionAction.Create', + matchKind: 'create', + matchType: 'collectionAction', + manifest: { + type: 'collectionAction', + kind: 'create', + element: () => import('./collection-create-action.element.js'), + weight: 1200, + meta: { + label: '#actions_create', + }, + }, + }, +]; diff --git a/src/packages/core/collection/action/create/types.ts b/src/packages/core/collection/action/create/types.ts new file mode 100644 index 0000000000..50ef773e2c --- /dev/null +++ b/src/packages/core/collection/action/create/types.ts @@ -0,0 +1,12 @@ +import type { ManifestCollectionAction } from '../../extensions/index.js'; + +export interface ManifestCollectionActionCreateKind extends ManifestCollectionAction { + type: 'collectionAction'; + kind: 'create'; +} + +declare global { + interface UmbExtensionManifestMap { + umbCollectionActionCreateKind: ManifestCollectionActionCreateKind; + } +} diff --git a/src/packages/core/collection/action/manifests.ts b/src/packages/core/collection/action/manifests.ts new file mode 100644 index 0000000000..19f4780244 --- /dev/null +++ b/src/packages/core/collection/action/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as createManifests } from './create/manifests.js'; +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [...createManifests]; diff --git a/src/packages/core/collection/manifests.ts b/src/packages/core/collection/manifests.ts index 1ee0674ee8..7433177e0c 100644 --- a/src/packages/core/collection/manifests.ts +++ b/src/packages/core/collection/manifests.ts @@ -1,9 +1,11 @@ import type { UmbExtensionManifestKind } from '../extension-registry/registry.js'; import { manifest as collectionAliasCondition } from './collection-alias.manifest.js'; import { manifest as collectionBulkActionPermissionCondition } from './collection-bulk-action-permission.manifest.js'; +import { manifests as actionManifests } from './action/manifests.js'; import { manifests as workspaceViewManifests } from './workspace-view/manifests.js'; export const manifests: Array = [ + ...actionManifests, ...workspaceViewManifests, collectionAliasCondition, collectionBulkActionPermissionCondition, diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index 3675770b96..2cb2537636 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -85,13 +85,15 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle return html` - - ${repeat( - this._apiControllers, - (controller) => controller.manifest?.alias, - (controller, index) => this.#renderRefItem(controller, index), - )} - + ${this._apiControllers.length === 0 + ? html`
No create options available.
` + : html` + ${repeat( + this._apiControllers, + (controller) => controller.manifest?.alias, + (controller, index) => this.#renderRefItem(controller, index), + )} + `}
= [ { type: 'collectionAction', + kind: 'create', name: 'Create User Collection Action', alias: 'Umb.CollectionAction.User.Create', - element: () => import('./collection-create-action.element.js'), - weight: 200, conditions: [ { alias: UMB_COLLECTION_ALIAS_CONDITION, From ea5f43dc41e1b08148f234163fec330c602dbb2d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 2 Nov 2024 22:29:38 +0100 Subject: [PATCH 30/37] filter + add types --- .../modal/entity-create-option-action-list-modal.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index 2cb2537636..5150c3946d 100644 --- a/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -28,7 +28,7 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle private _apiControllers: Array> = []; @state() - _hrefList: Array = []; + _hrefList: Array = []; protected override updated(_changedProperties: PropertyValues): void { super.updated(_changedProperties); @@ -52,7 +52,7 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle (manifest: ManifestType) => { return [{ entityType: data.entityType, unique: data.unique, meta: manifest.meta }]; }, - undefined, + (manifest: ManifestType) => manifest.forEntityTypes.includes(data.entityType), async (controllers) => { this._apiControllers = controllers as unknown as Array>; const hrefPromises = this._apiControllers.map((controller) => controller.api?.getHref()); From 11a3c6039504557ac443a49efa5ce9648a7c0ede Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 2 Nov 2024 22:29:48 +0100 Subject: [PATCH 31/37] align with modal --- .../collection-create-action.element.ts | 72 ++++++++++++++++--- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/src/packages/core/collection/action/create/collection-create-action.element.ts b/src/packages/core/collection/action/create/collection-create-action.element.ts index f0a2d88b95..fd80de09a2 100644 --- a/src/packages/core/collection/action/create/collection-create-action.element.ts +++ b/src/packages/core/collection/action/create/collection-create-action.element.ts @@ -1,7 +1,12 @@ -import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; +import type { ManifestEntityCreateOptionAction } from '@umbraco-cms/backoffice/entity-create-option-action'; + +type ManifestType = ManifestEntityCreateOptionAction; const elementName = 'umb-collection-create-action-button'; @customElement(elementName) @@ -13,9 +18,13 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { private _multipleOptions = false; @state() - private _apiControllers: Array = []; + private _apiControllers: Array> = []; + + @state() + _hrefList: Array = []; #createLabel = this.localize.term('general_create'); + #entityContext?: typeof UMB_ENTITY_CONTEXT.TYPE; #onPopoverToggle(event: PointerEvent) { // TODO: This ignorer is just neede for JSON SCHEMA TO WORK, As its not updated with latest TS jet. @@ -24,27 +33,61 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { this._popoverOpen = event.newState === 'open'; } - async #onClick(event: Event, controller: any) { + async #onClick(event: Event, controller: UmbExtensionApiInitializer, href?: string) { event.stopPropagation(); + + // skip if href is defined + if (href) { + return; + } + + if (!controller.api) throw new Error('No API found'); await controller.api.execute(); } constructor() { super(); + this.consumeContext(UMB_ENTITY_CONTEXT, (context) => { + this.#entityContext = context; + this.#initApi(); + }); + } + + #initApi() { + if (!this.#entityContext) return; + + const entityType = this.#entityContext.getEntityType(); + if (!entityType) throw new Error('No entityType found'); + + const unique = this.#entityContext.getUnique(); + if (unique === undefined) throw new Error('No unique found'); + new UmbExtensionsApiInitializer( this, umbExtensionsRegistry, 'entityCreateOptionAction', - [], - undefined, - (controllers) => { - this._apiControllers = controllers; + (manifest: ManifestType) => { + return [{ entityType, unique, meta: manifest.meta }]; + }, + (manifest: ManifestType) => manifest.forEntityTypes.includes(entityType), + async (controllers) => { + this._apiControllers = controllers as unknown as Array>; this._multipleOptions = controllers.length > 1; + const hrefPromises = this._apiControllers.map((controller) => controller.api?.getHref()); + this._hrefList = await Promise.all(hrefPromises); }, ); } + #getTarget(href?: string) { + if (href && href.startsWith('http')) { + return '_blank'; + } + + return '_self'; + } + override render() { return this._multipleOptions ? this.#renderMultiOptionAction() : this.#renderSingleOptionAction(); } @@ -79,19 +122,26 @@ export class UmbCollectionCreateActionButtonElement extends UmbLitElement { @toggle=${this.#onPopoverToggle}> - ${this._apiControllers.map((controller) => this.#renderMenuItem(controller))} + ${this._apiControllers.map((controller, index) => this.#renderMenuItem(controller, index))} `; } - #renderMenuItem(controller: any) { + #renderMenuItem(controller: UmbExtensionApiInitializer, index: number) { const manifest = controller.manifest; - const label = manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.meta.name; + if (!manifest) throw new Error('No manifest found'); + + const label = manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.name; + const href = this._hrefList[index]; return html` - this.#onClick(event, controller)}> + this.#onClick(event, controller, href)} + href=${ifDefined(href)} + target=${this.#getTarget(href)}> `; From d9b9392f305472eccce9fee06312842ca67a1960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Nov 2024 12:38:41 +0100 Subject: [PATCH 32/37] lint corrections --- src/assets/lang/ar.ts | 3160 +++++++++-------- .../entity-create-option-action.extension.ts | 1 - src/packages/core/localization/manifests.ts | 2 +- .../section-sidebar-menu.element.ts | 2 +- ...-tiny-mce-toolbar-configuration.element.ts | 14 +- 5 files changed, 1634 insertions(+), 1545 deletions(-) diff --git a/src/assets/lang/ar.ts b/src/assets/lang/ar.ts index 64bb555510..5f57427859 100644 --- a/src/assets/lang/ar.ts +++ b/src/assets/lang/ar.ts @@ -1,541 +1,561 @@ import type { UmbLocalizationDictionary } from '@umbraco-cms/backoffice/localization-api'; export default { - actions: { - assigndomain: 'الثقافة وأسماء النطاقات', - auditTrail: 'سجل التدقيق', - browse: 'تصفح ', - changeDataType: 'تغيير نوع البيانات', - changeDocType: 'تغيير نوع الوثيقة', - chooseWhereToCopy: 'اختر مكان النسخ', - chooseWhereToImport: 'اختر مكان الاستيراد', - chooseWhereToMove: 'اختر مكان النقل', - copy: 'نسخ', - copyTo: 'نسخ إلى', - create: 'إنشاء', - createblueprint: 'إنشاء مخطط انشائي للمستند', - createGroup: 'إنشاء مجموعة', - createPackage: 'إنشاء حزمة', - delete: 'حذف', - disable: 'تعطيل', - editContent: 'تحرير المحتوى', - editSettings: 'تحرير الإعدادات', - emptyrecyclebin: 'إفراغ سلة المحذوفات', - enable: 'تمكين', - export: 'تصدير', - exportDocumentType: 'تصدير نوع الوثيقة', - folderCreate: 'إنشاء مجلد', - folderDelete: 'حذف مجلد', - folderRename: 'إعادة تسمية مجلد', - import: 'استيراد', - importdocumenttype: 'استيراد نوع وثيقة', - importPackage: 'استيراد حزمة', - infiniteEditorChooseWhereToCopy: 'اختر مكان نسخ العنصر (العناصر) المحددة', - infiniteEditorChooseWhereToMove: 'اختر مكان نقل العنصر (العناصر) المحددة', - liveEdit: 'تحرير مباشر', - logout: 'تسجيل خروج', - move: 'نقل إلى', - notify: 'الإشعارات', - protect: 'الوصول العام', - publish: 'نشر', - refreshNode: 'إعادة تحميل', - remove: 'إزالة', - rename: 'إعادة تسمية', - republish: 'إعادة نشر الموقع بالكامل', - resendInvite: 'إعادة إرسال الدعوة', - restore: 'استعادة', - rights: 'الأذونات', - rollback: 'التراجع', - sendtopublish: 'إرسال للنشر', - sendToTranslate: 'إرسال للترجمة', - setGroup: 'تعيين مجموعة', - setPermissions: 'تعيين الأذونات', - sort: 'ترتيب الابناء', - toInTheTreeStructureBelow: 'في هيكل الشجري أدناه', - translate: 'ترجمة', - trash: 'سلة المهملات', - unlock: 'فتح القفل', - unpublish: 'إلغاء النشر', - update: 'تحديث', - wasCopiedTo: 'تم نسخه إلى', - wasDeleted: 'تم حذفه', - wasMovedTo: 'تم نقله إلى', - }, - actionCategories: { - content: 'المحتوى', - administration: 'الإدارة', - structure: 'الهيكل', - other: 'أخرى', - }, - actionDescriptions: { - assignDomain: 'السماح بالوصول لتعيين الثقافة وأسماء النطاقات', - auditTrail: 'السماح بالوصول لعرض سجل تاريخ العقدة', - browse: 'السماح بالوصول لعرض العقدة', - changeDocType: 'السماح بالوصول لتغيير نوع وثيقة للعقدة', - copy: 'السماح بالوصول لنسخ العقدة', - create: 'السماح بالوصول لإنشاء العقد', - delete: 'السماح بالوصول لحذف العقد', - move: 'السماح بالوصول لنقل العقدة', - protect: 'السماح بالوصول لتعيين وتغيير قيود الوصول للعقدة', - publish: 'السماح بالوصول لنشر العقدة', - unpublish: 'السماح بالوصول لإلغاء نشر العقدة', - rights: 'السماح بالوصول لتغيير الأذونات للعقدة', - rollback: 'السماح بالوصول للتراجع عن العقدة إلى حالة سابقة', - sendtopublish: 'السماح بالوصول لإرسال العقدة للموافقة قبل النشر', - sendToTranslate: 'السماح بالوصول لإرسال العقدة للترجمة', - sort: 'السماح بالوصول لتغيير ترتيب العقد', - translate: 'السماح بالوصول لترجمة العقدة', - update: 'السماح بالوصول لحفظ العقدة', - createblueprint: 'السماح بالوصول لإنشاء مخطط الوثيقة', - notify: 'السماح بالوصول لإعداد الإشعارات لعقد المحتوى', - }, - apps: { - umbContent: 'المحتوى', - umbInfo: 'المعلومات', - }, - assignDomain: { - permissionDenied: 'تم رفض الإذن.', - addNew: 'إضافة نطاق جديد', - addCurrent: 'إضافة النطاق الحالي', - remove: 'إزالة', - invalidNode: 'عقدة غير صالحة.', - invalidDomain: 'واحد أو أكثر من النطاقات لها تنسيق غير صالح.', - duplicateDomain: 'تم تعيين النطاق بالفعل.', - language: 'اللغة', - domain: 'النطاق', - domainCreated: "تم إنشاء النطاق الجديد '%0%'", - domainDeleted: "تم حذف النطاق '%0%'", - domainExists: "تم تعيين النطاق '%0%' بالفعل", - domainUpdated: "تم تحديث النطاق '%0%'", - orEdit: 'تحرير النطاقات الحالية', - domainHelpWithVariants: 'أسماء النطاقات الصالحة هي: "example.com"، "www.example.com"، "example.com:8080"، أو "https://www.example.com/".\\n علاوة على ذلك، يتم دعم المسارات ذات المستوى الواحد في النطاقات، مثل "example.com/en" أو "/en".', - inherit: 'وراثة', - setLanguage: 'الثقافة', - setLanguageHelp: 'تعيين الثقافة للعقد أدناه العقدة الحالية،
أو وراثة الثقافة من العقد الأصلية. سيتم تطبيقها أيضًا
\\n على العقدة الحالية، ما لم يتم تطبيق نطاق أدناه أيضًا.', - setDomains: 'النطاقات', - }, - buttons: { - clearSelection: 'مسح التحديد', - select: 'تحديد', - somethingElse: 'افعل شيئًا آخر', - bold: 'غامق', - deindent: 'إلغاء الفقرة', - formFieldInsert: 'إدراج حقل النموذج', - graphicHeadline: 'إدراج عنوان رسومي', - htmlEdit: 'تحرير HTML', - indent: 'فقرة', - italic: 'مائل', - justifyCenter: 'توسيط', - justifyLeft: 'محاذاة لليسار', - justifyRight: 'محاذاة لليمين', - linkInsert: 'إدراج رابط', - linkLocal: 'إدراج رابط محلي (مرساة)', - listBullet: 'قائمة نقطية', - listNumeric: 'قائمة رقمية', - macroInsert: 'إدراج ماكرو', - pictureInsert: 'إدراج صورة', - publishAndClose: 'نشر وإغلاق', - publishDescendants: 'نشر مع الفروع', - relations: 'تحرير العلاقات', - returnToList: 'العودة إلى القائمة', - save: 'حفظ', - saveAndClose: 'حفظ وإغلاق', - saveAndPublish: 'حفظ ونشر', - saveToPublish: 'إرسال للموافقة', - saveListView: 'حفظ عرض القائمة', - schedulePublish: 'جدولة', - saveAndPreview: 'حفظ ومعاينة', - showPageDisabled: "تم تعطيل المعاينة لأنه لم يتم تعيين قالب", - styleChoose: 'اختر النمط', - styleShow: 'عرض الأنماط', - tableInsert: 'إدراج جدول', - generateModelsAndClose: 'توليد النماذج وإغلاق', - saveAndGenerateModels: 'حفظ وتوليد النماذج', - undo: 'تراجع', - redo: 'إعادة', - deleteTag: 'حذف العلامة', - confirmActionCancel: 'إلغاء', - confirmActionConfirm: 'تأكيد', - morePublishingOptions: 'خيارات نشر إضافية', - submitChanges: 'إرسال التغييرات', - }, - auditTrails: { - atViewingFor: "عرض ل", - delete: "تم حذف المحتوى", - unpublish: "تم إلغاء نشر المحتوى", - unpublishvariant: "تم إلغاء نشر المحتوى للغات: %0%", - publish: "تم نشر المحتوى", - publishvariant: "تم نشر المحتوى للغات: %0%", - save: "تم حفظ المحتوى", - savevariant: "تم حفظ المحتوى للغات: %0%", - move: "تم نقل المحتوى", - copy: "تم نسخ المحتوى", - rollback: "تم التراجع عن المحتوى", - sendtopublish: "تم إرسال المحتوى للنشر", - sendtopublishvariant: "تم إرسال المحتوى للنشر للغات: %0%", - sort: "ترتيب العناصر الفرعية بواسطة المستخدم", - custom: "%0%", - contentversionpreventcleanup: "إيقاف التنظيف للإصدار: %0%", - contentversionenablecleanup: "تفعيل التنظيف للإصدار: %0%", - smallCopy: "نسخ", - smallPublish: "نشر", - smallPublishVariant: "نشر", - smallMove: "نقل", - smallSave: "حفظ", - smallSaveVariant: "حفظ", - smallDelete: "حذف", - smallUnpublish: "إلغاء نشر", - smallUnpublishVariant: "إلغاء نشر", - smallRollBack: "التراجع", - smallSendToPublish: "إرسال للنشر", - smallSendToPublishVariant: "إرسال للنشر", - smallSort: "ترتيب", - smallCustom: "مخصص", - smallContentVersionPreventCleanup: "حفظ", - smallContentVersionEnableCleanup: "حفظ", - historyIncludingVariants: "التاريخ (جميع النسخ)" - }, - codefile: { - createFolderIllegalChars: "لا يمكن أن يحتوي اسم المجلد على أحرف غير قانونية.", - deleteItemFailed: "فشل في حذف العنصر: %0%" - }, - content: { - isPublished: "تم نشره", - about: "حول هذه الصفحة", - alias: "اللقب", - alternativeTextHelp: "(كيف يمكنك وصف الصورة عبر الهاتف)", - alternativeUrls: "روابط بديلة", - clickToEdit: "انقر لتحرير هذا العنصر", - createBy: "أنشأه", - createByDesc: "المؤلف الأصلي", - updatedBy: "تم التحديث بواسطة", - createDate: "تاريخ الإنشاء", - createDateDesc: "تاريخ/وقت إنشاء هذه الوثيقة", - documentType: "نوع الوثيقة", - editing: "تحرير", - expireDate: "إزالة في", - itemChanged: "تم تغيير هذا العنصر بعد النشر", - itemNotPublished: "هذا العنصر غير منشور", - lastPublished: "تم نشره آخر مرة", - noItemsToShow: "لا توجد عناصر لعرضها", - listViewNoItems: "لا توجد عناصر لعرضها في القائمة.", - listViewNoContent: "لم تتم إضافة عناصر فرعية", - listViewNoMembers: "لم تتم إضافة أعضاء", - mediatype: "نوع الوسائط", - mediaLinks: "رابط إلى عنصر/عناصر الوسائط", - membergroup: "مجموعة الأعضاء", - memberrole: "دور", - membertype: "نوع العضو", - noChanges: "لم يتم إجراء تغييرات", - noDate: "لم يتم اختيار تاريخ", - nodeName: "عنوان الصفحة", - noMediaLink: "لا يحتوي هذا العنصر الإعلامي على رابط", - noProperties: "لا يمكن إضافة محتوى لهذا العنصر", - otherElements: "الخصائص", - parentNotPublished: "هذه الوثيقة منشورة ولكنها غير مرئية لأن الأصل '%0%' غير منشور", - parentCultureNotPublished: "هذه الثقافة منشورة ولكنها غير مرئية لأنها غير منشورة على الأصل '%0%'", - parentNotPublishedAnomaly: "هذه الوثيقة منشورة ولكنها ليست في الذاكرة المؤقتة", - getUrlException: "لم يتمكن من الحصول على عنوان URL", - routeError: "هذه الوثيقة منشورة ولكن عنوان URL الخاص بها يتداخل مع المحتوى %0%", - routeErrorCannotRoute: "هذه الوثيقة منشورة ولكن لا يمكن توجيه عنوان URL الخاص بها", - publish: "نشر", - published: "منشور", - publishedPendingChanges: "منشور (تغييرات معلقة)", - publishStatus: "حالة النشر", - publishDescendantsHelp: "نشر %0% وجميع عناصر المحتوى أسفله وبالتالي جعل محتواها متاحًا للعامة.", - publishDescendantsWithVariantsHelp: "نشر النسخ ونسخ نفس النوع أسفله وبالتالي جعل محتواها متاحًا للعامة.", - noVariantsToProcess: "لا توجد نسخ متاحة", - releaseDate: "نشر في", - unpublishDate: "إلغاء نشر في", - removeDate: "مسح التاريخ", - setDate: "تعيين التاريخ", - sortDone: "تم تحديث ترتيب الفرز", - sortHelp: 'لترتيب العقد، ببساطة اسحب العقد أو انقر على أحد رؤوس الأعمدة. يمكنك تحديد عناصر متعددة عن طريق الضغط على مفتاح "shift" أو "control" أثناء التحديد', - statistics: "الإحصاءات", - titleOptional: "العنوان (اختياري)", - altTextOptional: "نص بديل (اختياري)", - captionTextOptional: "التعليق (اختياري)", - type: "النوع", - unpublish: "إلغاء نشر", - unpublished: "غير منشور", - notCreated: "لم يتم إنشاؤه", - updateDate: "آخر تعديل", - updateDateDesc: "تاريخ/وقت تعديل هذه الوثيقة", - uploadClear: "إزالة الملف/الملفات", - uploadClearImageContext: "انقر هنا لإزالة الصورة من عنصر الوسائط", - uploadClearFileContext: "انقر هنا لإزالة الملف من عنصر الوسائط", - urls: "رابط إلى الوثيقة", - memberof: "عضو في المجموعة(s)", - notmemberof: "ليس عضوًا في المجموعة(s)", - childItems: "العناصر الفرعية", - target: "الهدف", - scheduledPublishServerTime: "يترجم هذا إلى الوقت التالي على الخادم:", - scheduledPublishDocumentation: "ماذا يعني هذا؟", - nestedContentDeleteItem: "هل أنت متأكد أنك تريد حذف هذا العنصر؟", - nestedContentDeleteAllItems: "هل أنت متأكد أنك تريد حذف جميع العناصر؟", - nestedContentEditorNotSupported: "الخاصية %0% تستخدم محرر %1% والذي لا يدعمه المحتوى المتداخل.", - nestedContentNoContentTypes: "لم يتم تكوين أنواع المحتوى لهذه الخاصية.", - nestedContentAddElementType: "إضافة نوع عنصر", - nestedContentSelectElementTypeModalTitle: "اختر نوع العنصر", - nestedContentGroupHelpText: "حدد المجموعة التي يجب عرض خصائصها. إذا تركت فارغة، ستستخدم المجموعة الأولى على نوع العنصر.", - nestedContentTemplateHelpTextPart1: "أدخل تعبير Angular لتقييمه لكل عنصر للحصول على اسمه. استخدم", - nestedContentTemplateHelpTextPart2: "لعرض مؤشر العنصر", - nestedContentNoGroups: "نوع العنصر المحدد لا يحتوي على أي مجموعات مدعومة (التبويبات غير مدعومة بواسطة هذا المحرر، إما قم بتغييرها إلى مجموعات أو استخدم محرر قائمة الكتل).", - addTextBox: "إضافة مربع نص آخر", - removeTextBox: "إزالة هذا مربع النص", - contentRoot: "جذر المحتوى", - includeUnpublished: "تضمين عناصر المحتوى غير المنشورة.", - isSensitiveValue: "هذه القيمة مخفية. إذا كنت بحاجة إلى الوصول لعرض هذه القيمة، يرجى الاتصال بمدير موقعك.", - isSensitiveValue_short: "هذه القيمة مخفية.", - languagesToPublish: "ما اللغات التي ترغب في نشرها؟", - languagesToSendForApproval: "ما اللغات التي ترغب في إرسالها للموافقة؟", - languagesToSchedule: "ما اللغات التي ترغب في جدولتها؟", - languagesToUnpublish: "حدد اللغات التي ترغب في إلغاء نشرها. إلغاء نشر لغة إلزامية سيؤدي إلى إلغاء نشر جميع اللغات.", - variantsWillBeSaved: "جميع النسخ الجديدة سيتم حفظها.", - variantsToPublish: "أي النسخ ترغب في نشرها؟", - variantsToSave: "اختر النسخ التي سيتم حفظها.", - publishRequiresVariants: "النسخ التالية مطلوبة لعملية النشر:", - notReadyToPublish: "لسنا جاهزين للنشر", - readyToPublish: "جاهز للنشر؟", - readyToSave: "جاهز للحفظ؟", - resetFocalPoint: "إعادة تعيين نقطة التركيز", - sendForApproval: "إرسال للموافقة", - schedulePublishHelp: "حدد التاريخ والوقت للنشر و/أو إلغاء نشر عنصر المحتوى.", - createEmpty: "إنشاء جديد", - createFromClipboard: "الصق من الحافظة", - nodeIsInTrash: "هذا العنصر في سلة المهملات", - variantSaveNotAllowed: "الحفظ غير مسموح به", - variantPublishNotAllowed: "النشر غير مسموح به", - variantSendForApprovalNotAllowed: "إرسال للموافقة غير مسموح به", - variantScheduleNotAllowed: "الجدولة غير مسموح بها", - variantUnpublishNotAllowed: "إلغاء النشر غير مسموح به" - }, - blueprints: { - createBlueprintFrom: "إنشاء نموذج وثيقة جديد من '%0%'", - createBlueprintItemUnder: "إنشاء عنصر جديد تحت '%0%'", - createBlueprintFolderUnder: "إنشاء مجلد جديد تحت '%0%'", - blankBlueprint: "فارغ", - selectBlueprint: "حدد نموذج وثيقة", - createdBlueprintHeading: "تم إنشاء نموذج الوثيقة", - createdBlueprintMessage: "تم إنشاء نموذج وثيقة من '%0%'", - duplicateBlueprintMessage: "يوجد نموذج وثيقة آخر بنفس الاسم بالفعل", - blueprintDescription: "نموذج الوثيقة هو محتوى محدد مسبقًا يمكن للمحرر تحديده لاستخدامه كأساس لإنشاء محتوى جديد" - }, - media: { - clickToUpload: "انقر لتحميل", - orClickHereToUpload: "أو انقر هنا لاختيار الملفات", - disallowedFileType: "لا يمكن تحميل هذا الملف، فهو لا يحتوي على نوع ملف معتمد", - disallowedMediaType: "لا يمكن تحميل هذا الملف، نوع الوسائط باللقب '%0%' غير مسموح به هنا", - invalidFileName: "لا يمكن تحميل هذا الملف، فهو لا يحتوي على اسم ملف صحيح", - maxFileSize: "أقصى حجم للملف هو", - mediaRoot: "جذر الوسائط", - moveToSameFolderFailed: "لا يمكن أن تكون المجلدات الأصلية والوجهة هي نفسها", - createFolderFailed: "فشل في إنشاء مجلد تحت المعرف %0%", - renameFolderFailed: "فشل في إعادة تسمية المجلد بالمعرف %0%", - dragAndDropYourFilesIntoTheArea: "اسحب وأفلت ملفاتك في المنطقة", - uploadNotAllowed: "التحميل غير مسموح به في هذا الموقع" - }, - member: { - createNewMember: "إنشاء عضو جديد", - allMembers: "جميع الأعضاء", - duplicateMemberLogin: "يوجد عضو بهذا تسجيل الدخول بالفعل", - memberGroupNoProperties: "مجموعات الأعضاء لا تحتوي على خصائص إضافية للتعديل.", - memberHasGroup: "العضو بالفعل في المجموعة '%0%'", - memberHasPassword: "العضو لديه كلمة مرور محددة بالفعل", - memberLockoutNotEnabled: "التحقق من القفل غير مفعل لهذا العضو", - memberNotInGroup: "العضو ليس في المجموعة '%0%'", - '2fa': "التحقق بخطوتين" - }, - contentType: { - copyFailed: "فشل في نسخ نوع المحتوى", - moveFailed: "فشل في نقل نوع المحتوى" - }, - mediaType: { - copyFailed: "فشل في نسخ نوع الوسائط", - moveFailed: "فشل في نقل نوع الوسائط", - autoPickMediaType: "اختيار تلقائي" - }, - memberType: { - copyFailed: "فشل في نسخ نوع العضو" - }, + actions: { + assigndomain: 'الثقافة وأسماء النطاقات', + auditTrail: 'سجل التدقيق', + browse: 'تصفح ', + changeDataType: 'تغيير نوع البيانات', + changeDocType: 'تغيير نوع الوثيقة', + chooseWhereToCopy: 'اختر مكان النسخ', + chooseWhereToImport: 'اختر مكان الاستيراد', + chooseWhereToMove: 'اختر مكان النقل', + copy: 'نسخ', + copyTo: 'نسخ إلى', + create: 'إنشاء', + createblueprint: 'إنشاء مخطط انشائي للمستند', + createGroup: 'إنشاء مجموعة', + createPackage: 'إنشاء حزمة', + delete: 'حذف', + disable: 'تعطيل', + editContent: 'تحرير المحتوى', + editSettings: 'تحرير الإعدادات', + emptyrecyclebin: 'إفراغ سلة المحذوفات', + enable: 'تمكين', + export: 'تصدير', + exportDocumentType: 'تصدير نوع الوثيقة', + folderCreate: 'إنشاء مجلد', + folderDelete: 'حذف مجلد', + folderRename: 'إعادة تسمية مجلد', + import: 'استيراد', + importdocumenttype: 'استيراد نوع وثيقة', + importPackage: 'استيراد حزمة', + infiniteEditorChooseWhereToCopy: 'اختر مكان نسخ العنصر (العناصر) المحددة', + infiniteEditorChooseWhereToMove: 'اختر مكان نقل العنصر (العناصر) المحددة', + liveEdit: 'تحرير مباشر', + logout: 'تسجيل خروج', + move: 'نقل إلى', + notify: 'الإشعارات', + protect: 'الوصول العام', + publish: 'نشر', + refreshNode: 'إعادة تحميل', + remove: 'إزالة', + rename: 'إعادة تسمية', + republish: 'إعادة نشر الموقع بالكامل', + resendInvite: 'إعادة إرسال الدعوة', + restore: 'استعادة', + rights: 'الأذونات', + rollback: 'التراجع', + sendtopublish: 'إرسال للنشر', + sendToTranslate: 'إرسال للترجمة', + setGroup: 'تعيين مجموعة', + setPermissions: 'تعيين الأذونات', + sort: 'ترتيب الابناء', + toInTheTreeStructureBelow: 'في هيكل الشجري أدناه', + translate: 'ترجمة', + trash: 'سلة المهملات', + unlock: 'فتح القفل', + unpublish: 'إلغاء النشر', + update: 'تحديث', + wasCopiedTo: 'تم نسخه إلى', + wasDeleted: 'تم حذفه', + wasMovedTo: 'تم نقله إلى', + }, + actionCategories: { + content: 'المحتوى', + administration: 'الإدارة', + structure: 'الهيكل', + other: 'أخرى', + }, + actionDescriptions: { + assignDomain: 'السماح بالوصول لتعيين الثقافة وأسماء النطاقات', + auditTrail: 'السماح بالوصول لعرض سجل تاريخ العقدة', + browse: 'السماح بالوصول لعرض العقدة', + changeDocType: 'السماح بالوصول لتغيير نوع وثيقة للعقدة', + copy: 'السماح بالوصول لنسخ العقدة', + create: 'السماح بالوصول لإنشاء العقد', + delete: 'السماح بالوصول لحذف العقد', + move: 'السماح بالوصول لنقل العقدة', + protect: 'السماح بالوصول لتعيين وتغيير قيود الوصول للعقدة', + publish: 'السماح بالوصول لنشر العقدة', + unpublish: 'السماح بالوصول لإلغاء نشر العقدة', + rights: 'السماح بالوصول لتغيير الأذونات للعقدة', + rollback: 'السماح بالوصول للتراجع عن العقدة إلى حالة سابقة', + sendtopublish: 'السماح بالوصول لإرسال العقدة للموافقة قبل النشر', + sendToTranslate: 'السماح بالوصول لإرسال العقدة للترجمة', + sort: 'السماح بالوصول لتغيير ترتيب العقد', + translate: 'السماح بالوصول لترجمة العقدة', + update: 'السماح بالوصول لحفظ العقدة', + createblueprint: 'السماح بالوصول لإنشاء مخطط الوثيقة', + notify: 'السماح بالوصول لإعداد الإشعارات لعقد المحتوى', + }, + apps: { + umbContent: 'المحتوى', + umbInfo: 'المعلومات', + }, + assignDomain: { + permissionDenied: 'تم رفض الإذن.', + addNew: 'إضافة نطاق جديد', + addCurrent: 'إضافة النطاق الحالي', + remove: 'إزالة', + invalidNode: 'عقدة غير صالحة.', + invalidDomain: 'واحد أو أكثر من النطاقات لها تنسيق غير صالح.', + duplicateDomain: 'تم تعيين النطاق بالفعل.', + language: 'اللغة', + domain: 'النطاق', + domainCreated: "تم إنشاء النطاق الجديد '%0%'", + domainDeleted: "تم حذف النطاق '%0%'", + domainExists: "تم تعيين النطاق '%0%' بالفعل", + domainUpdated: "تم تحديث النطاق '%0%'", + orEdit: 'تحرير النطاقات الحالية', + domainHelpWithVariants: + 'أسماء النطاقات الصالحة هي: "example.com"، "www.example.com"، "example.com:8080"، أو "https://www.example.com/".\\n علاوة على ذلك، يتم دعم المسارات ذات المستوى الواحد في النطاقات، مثل "example.com/en" أو "/en".', + inherit: 'وراثة', + setLanguage: 'الثقافة', + setLanguageHelp: + 'تعيين الثقافة للعقد أدناه العقدة الحالية،
أو وراثة الثقافة من العقد الأصلية. سيتم تطبيقها أيضًا
\\n على العقدة الحالية، ما لم يتم تطبيق نطاق أدناه أيضًا.', + setDomains: 'النطاقات', + }, + buttons: { + clearSelection: 'مسح التحديد', + select: 'تحديد', + somethingElse: 'افعل شيئًا آخر', + bold: 'غامق', + deindent: 'إلغاء الفقرة', + formFieldInsert: 'إدراج حقل النموذج', + graphicHeadline: 'إدراج عنوان رسومي', + htmlEdit: 'تحرير HTML', + indent: 'فقرة', + italic: 'مائل', + justifyCenter: 'توسيط', + justifyLeft: 'محاذاة لليسار', + justifyRight: 'محاذاة لليمين', + linkInsert: 'إدراج رابط', + linkLocal: 'إدراج رابط محلي (مرساة)', + listBullet: 'قائمة نقطية', + listNumeric: 'قائمة رقمية', + macroInsert: 'إدراج ماكرو', + pictureInsert: 'إدراج صورة', + publishAndClose: 'نشر وإغلاق', + publishDescendants: 'نشر مع الفروع', + relations: 'تحرير العلاقات', + returnToList: 'العودة إلى القائمة', + save: 'حفظ', + saveAndClose: 'حفظ وإغلاق', + saveAndPublish: 'حفظ ونشر', + saveToPublish: 'إرسال للموافقة', + saveListView: 'حفظ عرض القائمة', + schedulePublish: 'جدولة', + saveAndPreview: 'حفظ ومعاينة', + showPageDisabled: 'تم تعطيل المعاينة لأنه لم يتم تعيين قالب', + styleChoose: 'اختر النمط', + styleShow: 'عرض الأنماط', + tableInsert: 'إدراج جدول', + generateModelsAndClose: 'توليد النماذج وإغلاق', + saveAndGenerateModels: 'حفظ وتوليد النماذج', + undo: 'تراجع', + redo: 'إعادة', + deleteTag: 'حذف العلامة', + confirmActionCancel: 'إلغاء', + confirmActionConfirm: 'تأكيد', + morePublishingOptions: 'خيارات نشر إضافية', + submitChanges: 'إرسال التغييرات', + }, + auditTrails: { + atViewingFor: 'عرض ل', + delete: 'تم حذف المحتوى', + unpublish: 'تم إلغاء نشر المحتوى', + unpublishvariant: 'تم إلغاء نشر المحتوى للغات: %0%', + publish: 'تم نشر المحتوى', + publishvariant: 'تم نشر المحتوى للغات: %0%', + save: 'تم حفظ المحتوى', + savevariant: 'تم حفظ المحتوى للغات: %0%', + move: 'تم نقل المحتوى', + copy: 'تم نسخ المحتوى', + rollback: 'تم التراجع عن المحتوى', + sendtopublish: 'تم إرسال المحتوى للنشر', + sendtopublishvariant: 'تم إرسال المحتوى للنشر للغات: %0%', + sort: 'ترتيب العناصر الفرعية بواسطة المستخدم', + custom: '%0%', + contentversionpreventcleanup: 'إيقاف التنظيف للإصدار: %0%', + contentversionenablecleanup: 'تفعيل التنظيف للإصدار: %0%', + smallCopy: 'نسخ', + smallPublish: 'نشر', + smallPublishVariant: 'نشر', + smallMove: 'نقل', + smallSave: 'حفظ', + smallSaveVariant: 'حفظ', + smallDelete: 'حذف', + smallUnpublish: 'إلغاء نشر', + smallUnpublishVariant: 'إلغاء نشر', + smallRollBack: 'التراجع', + smallSendToPublish: 'إرسال للنشر', + smallSendToPublishVariant: 'إرسال للنشر', + smallSort: 'ترتيب', + smallCustom: 'مخصص', + smallContentVersionPreventCleanup: 'حفظ', + smallContentVersionEnableCleanup: 'حفظ', + historyIncludingVariants: 'التاريخ (جميع النسخ)', + }, + codefile: { + createFolderIllegalChars: 'لا يمكن أن يحتوي اسم المجلد على أحرف غير قانونية.', + deleteItemFailed: 'فشل في حذف العنصر: %0%', + }, + content: { + isPublished: 'تم نشره', + about: 'حول هذه الصفحة', + alias: 'اللقب', + alternativeTextHelp: '(كيف يمكنك وصف الصورة عبر الهاتف)', + alternativeUrls: 'روابط بديلة', + clickToEdit: 'انقر لتحرير هذا العنصر', + createBy: 'أنشأه', + createByDesc: 'المؤلف الأصلي', + updatedBy: 'تم التحديث بواسطة', + createDate: 'تاريخ الإنشاء', + createDateDesc: 'تاريخ/وقت إنشاء هذه الوثيقة', + documentType: 'نوع الوثيقة', + editing: 'تحرير', + expireDate: 'إزالة في', + itemChanged: 'تم تغيير هذا العنصر بعد النشر', + itemNotPublished: 'هذا العنصر غير منشور', + lastPublished: 'تم نشره آخر مرة', + noItemsToShow: 'لا توجد عناصر لعرضها', + listViewNoItems: 'لا توجد عناصر لعرضها في القائمة.', + listViewNoContent: 'لم تتم إضافة عناصر فرعية', + listViewNoMembers: 'لم تتم إضافة أعضاء', + mediatype: 'نوع الوسائط', + mediaLinks: 'رابط إلى عنصر/عناصر الوسائط', + membergroup: 'مجموعة الأعضاء', + memberrole: 'دور', + membertype: 'نوع العضو', + noChanges: 'لم يتم إجراء تغييرات', + noDate: 'لم يتم اختيار تاريخ', + nodeName: 'عنوان الصفحة', + noMediaLink: 'لا يحتوي هذا العنصر الإعلامي على رابط', + noProperties: 'لا يمكن إضافة محتوى لهذا العنصر', + otherElements: 'الخصائص', + parentNotPublished: "هذه الوثيقة منشورة ولكنها غير مرئية لأن الأصل '%0%' غير منشور", + parentCultureNotPublished: "هذه الثقافة منشورة ولكنها غير مرئية لأنها غير منشورة على الأصل '%0%'", + parentNotPublishedAnomaly: 'هذه الوثيقة منشورة ولكنها ليست في الذاكرة المؤقتة', + getUrlException: 'لم يتمكن من الحصول على عنوان URL', + routeError: 'هذه الوثيقة منشورة ولكن عنوان URL الخاص بها يتداخل مع المحتوى %0%', + routeErrorCannotRoute: 'هذه الوثيقة منشورة ولكن لا يمكن توجيه عنوان URL الخاص بها', + publish: 'نشر', + published: 'منشور', + publishedPendingChanges: 'منشور (تغييرات معلقة)', + publishStatus: 'حالة النشر', + publishDescendantsHelp: 'نشر %0% وجميع عناصر المحتوى أسفله وبالتالي جعل محتواها متاحًا للعامة.', + publishDescendantsWithVariantsHelp: 'نشر النسخ ونسخ نفس النوع أسفله وبالتالي جعل محتواها متاحًا للعامة.', + noVariantsToProcess: 'لا توجد نسخ متاحة', + releaseDate: 'نشر في', + unpublishDate: 'إلغاء نشر في', + removeDate: 'مسح التاريخ', + setDate: 'تعيين التاريخ', + sortDone: 'تم تحديث ترتيب الفرز', + sortHelp: + 'لترتيب العقد، ببساطة اسحب العقد أو انقر على أحد رؤوس الأعمدة. يمكنك تحديد عناصر متعددة عن طريق الضغط على مفتاح "shift" أو "control" أثناء التحديد', + statistics: 'الإحصاءات', + titleOptional: 'العنوان (اختياري)', + altTextOptional: 'نص بديل (اختياري)', + captionTextOptional: 'التعليق (اختياري)', + type: 'النوع', + unpublish: 'إلغاء نشر', + unpublished: 'غير منشور', + notCreated: 'لم يتم إنشاؤه', + updateDate: 'آخر تعديل', + updateDateDesc: 'تاريخ/وقت تعديل هذه الوثيقة', + uploadClear: 'إزالة الملف/الملفات', + uploadClearImageContext: 'انقر هنا لإزالة الصورة من عنصر الوسائط', + uploadClearFileContext: 'انقر هنا لإزالة الملف من عنصر الوسائط', + urls: 'رابط إلى الوثيقة', + memberof: 'عضو في المجموعة(s)', + notmemberof: 'ليس عضوًا في المجموعة(s)', + childItems: 'العناصر الفرعية', + target: 'الهدف', + scheduledPublishServerTime: 'يترجم هذا إلى الوقت التالي على الخادم:', + scheduledPublishDocumentation: + 'ماذا يعني هذا؟', + nestedContentDeleteItem: 'هل أنت متأكد أنك تريد حذف هذا العنصر؟', + nestedContentDeleteAllItems: 'هل أنت متأكد أنك تريد حذف جميع العناصر؟', + nestedContentEditorNotSupported: 'الخاصية %0% تستخدم محرر %1% والذي لا يدعمه المحتوى المتداخل.', + nestedContentNoContentTypes: 'لم يتم تكوين أنواع المحتوى لهذه الخاصية.', + nestedContentAddElementType: 'إضافة نوع عنصر', + nestedContentSelectElementTypeModalTitle: 'اختر نوع العنصر', + nestedContentGroupHelpText: + 'حدد المجموعة التي يجب عرض خصائصها. إذا تركت فارغة، ستستخدم المجموعة الأولى على نوع العنصر.', + nestedContentTemplateHelpTextPart1: 'أدخل تعبير Angular لتقييمه لكل عنصر للحصول على اسمه. استخدم', + nestedContentTemplateHelpTextPart2: 'لعرض مؤشر العنصر', + nestedContentNoGroups: + 'نوع العنصر المحدد لا يحتوي على أي مجموعات مدعومة (التبويبات غير مدعومة بواسطة هذا المحرر، إما قم بتغييرها إلى مجموعات أو استخدم محرر قائمة الكتل).', + addTextBox: 'إضافة مربع نص آخر', + removeTextBox: 'إزالة هذا مربع النص', + contentRoot: 'جذر المحتوى', + includeUnpublished: 'تضمين عناصر المحتوى غير المنشورة.', + isSensitiveValue: 'هذه القيمة مخفية. إذا كنت بحاجة إلى الوصول لعرض هذه القيمة، يرجى الاتصال بمدير موقعك.', + isSensitiveValue_short: 'هذه القيمة مخفية.', + languagesToPublish: 'ما اللغات التي ترغب في نشرها؟', + languagesToSendForApproval: 'ما اللغات التي ترغب في إرسالها للموافقة؟', + languagesToSchedule: 'ما اللغات التي ترغب في جدولتها؟', + languagesToUnpublish: 'حدد اللغات التي ترغب في إلغاء نشرها. إلغاء نشر لغة إلزامية سيؤدي إلى إلغاء نشر جميع اللغات.', + variantsWillBeSaved: 'جميع النسخ الجديدة سيتم حفظها.', + variantsToPublish: 'أي النسخ ترغب في نشرها؟', + variantsToSave: 'اختر النسخ التي سيتم حفظها.', + publishRequiresVariants: 'النسخ التالية مطلوبة لعملية النشر:', + notReadyToPublish: 'لسنا جاهزين للنشر', + readyToPublish: 'جاهز للنشر؟', + readyToSave: 'جاهز للحفظ؟', + resetFocalPoint: 'إعادة تعيين نقطة التركيز', + sendForApproval: 'إرسال للموافقة', + schedulePublishHelp: 'حدد التاريخ والوقت للنشر و/أو إلغاء نشر عنصر المحتوى.', + createEmpty: 'إنشاء جديد', + createFromClipboard: 'الصق من الحافظة', + nodeIsInTrash: 'هذا العنصر في سلة المهملات', + variantSaveNotAllowed: 'الحفظ غير مسموح به', + variantPublishNotAllowed: 'النشر غير مسموح به', + variantSendForApprovalNotAllowed: 'إرسال للموافقة غير مسموح به', + variantScheduleNotAllowed: 'الجدولة غير مسموح بها', + variantUnpublishNotAllowed: 'إلغاء النشر غير مسموح به', + }, + blueprints: { + createBlueprintFrom: "إنشاء نموذج وثيقة جديد من '%0%'", + createBlueprintItemUnder: "إنشاء عنصر جديد تحت '%0%'", + createBlueprintFolderUnder: "إنشاء مجلد جديد تحت '%0%'", + blankBlueprint: 'فارغ', + selectBlueprint: 'حدد نموذج وثيقة', + createdBlueprintHeading: 'تم إنشاء نموذج الوثيقة', + createdBlueprintMessage: "تم إنشاء نموذج وثيقة من '%0%'", + duplicateBlueprintMessage: 'يوجد نموذج وثيقة آخر بنفس الاسم بالفعل', + blueprintDescription: 'نموذج الوثيقة هو محتوى محدد مسبقًا يمكن للمحرر تحديده لاستخدامه كأساس لإنشاء محتوى جديد', + }, + media: { + clickToUpload: 'انقر لتحميل', + orClickHereToUpload: 'أو انقر هنا لاختيار الملفات', + disallowedFileType: 'لا يمكن تحميل هذا الملف، فهو لا يحتوي على نوع ملف معتمد', + disallowedMediaType: "لا يمكن تحميل هذا الملف، نوع الوسائط باللقب '%0%' غير مسموح به هنا", + invalidFileName: 'لا يمكن تحميل هذا الملف، فهو لا يحتوي على اسم ملف صحيح', + maxFileSize: 'أقصى حجم للملف هو', + mediaRoot: 'جذر الوسائط', + moveToSameFolderFailed: 'لا يمكن أن تكون المجلدات الأصلية والوجهة هي نفسها', + createFolderFailed: 'فشل في إنشاء مجلد تحت المعرف %0%', + renameFolderFailed: 'فشل في إعادة تسمية المجلد بالمعرف %0%', + dragAndDropYourFilesIntoTheArea: 'اسحب وأفلت ملفاتك في المنطقة', + uploadNotAllowed: 'التحميل غير مسموح به في هذا الموقع', + }, + member: { + createNewMember: 'إنشاء عضو جديد', + allMembers: 'جميع الأعضاء', + duplicateMemberLogin: 'يوجد عضو بهذا تسجيل الدخول بالفعل', + memberGroupNoProperties: 'مجموعات الأعضاء لا تحتوي على خصائص إضافية للتعديل.', + memberHasGroup: "العضو بالفعل في المجموعة '%0%'", + memberHasPassword: 'العضو لديه كلمة مرور محددة بالفعل', + memberLockoutNotEnabled: 'التحقق من القفل غير مفعل لهذا العضو', + memberNotInGroup: "العضو ليس في المجموعة '%0%'", + '2fa': 'التحقق بخطوتين', + }, + contentType: { + copyFailed: 'فشل في نسخ نوع المحتوى', + moveFailed: 'فشل في نقل نوع المحتوى', + }, + mediaType: { + copyFailed: 'فشل في نسخ نوع الوسائط', + moveFailed: 'فشل في نقل نوع الوسائط', + autoPickMediaType: 'اختيار تلقائي', + }, + memberType: { + copyFailed: 'فشل في نسخ نوع العضو', + }, create: { - chooseNode: "أين تريد إنشاء %0% الجديد", - createUnder: "إنشاء عنصر تحت", - createContentBlueprint: "حدد نوع الوثيقة الذي تريد إنشاء نموذج وثيقة له", - enterFolderName: "أدخل اسم المجلد", - updateData: "اختر نوعًا وعنوانًا", - noDocumentTypes: "لا توجد أنواع وثائق مسموح بها متاحة لإنشاء المحتوى هنا. يجب تمكينها في أنواع الوثائق ضمن قسم الإعدادات، عن طريق تعديل أنواع العقد الفرعية المسموح بها ضمن الأذونات.", - noDocumentTypesAtRoot: "لا توجد أنواع وثائق متاحة لإنشاء المحتوى هنا. يجب عليك إنشاء هذه الأنواع في أنواع الوثائق ضمن قسم الإعدادات.", - noDocumentTypesWithNoSettingsAccess: "الصفحة المحددة في شجرة المحتوى لا تسمح بإنشاء أي صفحات أسفلها.", - noDocumentTypesEditPermissions: "تعديل الأذونات لهذا النوع من الوثائق", - noDocumentTypesCreateNew: "إنشاء نوع وثيقة جديد", - noDocumentTypesAllowedAtRoot: "لا توجد أنواع وثائق مسموح بها لإنشاء المحتوى هنا. يجب تمكينها في أنواع الوثائق ضمن قسم الإعدادات، عن طريق تغيير خيار السماح كجذر ضمن الأذونات.", - noMediaTypes: "لا توجد أنواع وسائط مسموح بها لإنشاء الوسائط هنا. يجب تمكينها في أنواع الوسائط ضمن قسم الإعدادات، عن طريق تعديل أنواع العقد الفرعية المسموح بها ضمن الأذونات.", - noMediaTypesWithNoSettingsAccess: "الوسائط المحددة في الشجرة لا تسمح بإنشاء أي وسائط أخرى أسفلها.", - noMediaTypesEditPermissions: "تعديل الأذونات لهذا النوع من الوسائط", - documentTypeWithoutTemplate: "نوع الوثيقة بدون قالب", - documentTypeWithTemplate: "نوع الوثيقة مع قالب", - documentTypeWithTemplateDescription: "تعريف البيانات لصفحة محتوى يمكن إنشاؤها من قبل المحررين في شجرة المحتوى ويمكن الوصول إليها مباشرة عبر URL.", - documentType: "نوع الوثيقة", - documentTypeDescription: "تعريف البيانات لمكون محتوى يمكن إنشاؤه من قبل المحررين في شجرة المحتوى ويمكن اختياره في صفحات أخرى ولكنه لا يحتوي على URL مباشر.", - elementType: "نوع العنصر", - elementTypeDescription: "يحدد المخطط لمجموعة متكررة من الخصائص، على سبيل المثال، في محرر 'قائمة الكتل' أو 'شبكة الكتل'.", - composition: "تركيب", - compositionDescription: "يحدد مجموعة قابلة لإعادة الاستخدام من الخصائص يمكن تضمينها في تعريف أنواع وثائق متعددة. على سبيل المثال، مجموعة من 'إعدادات الصفحة المشتركة'.", - folder: "مجلد", - folderDescription: "يستخدم لتنظيم أنواع الوثائق، والتركيبات، وأنواع العناصر التي تم إنشاؤها في شجرة نوع الوثيقة هذه.", - newFolder: "مجلد جديد", - newDataType: "نوع بيانات جديد", - newJavascriptFile: "ملف JavaScript جديد", - newEmptyPartialView: "عرض جزئي فارغ جديد", - newPartialViewMacro: "ماكرو عرض جزئي جديد", - newPartialViewFromSnippet: "عرض جزئي جديد من مقطع", - newPartialViewMacroFromSnippet: "ماكرو عرض جزئي جديد من مقطع", - newPartialViewMacroNoMacro: "ماكرو عرض جزئي جديد (بدون ماكرو)", - newStyleSheetFile: "ملف ورقة أنماط جديد", - newRteStyleSheetFile: "ملف ورقة أنماط محرر النصوص الغني الجديد" - }, - dashboard: { - browser: "تصفح موقعك", - dontShowAgain: "- إخفاء", - nothinghappens: "إذا لم يفتح Umbraco، قد تحتاج إلى السماح بالنوافذ المنبثقة من هذا الموقع", - openinnew: "تم فتحه في نافذة جديدة", - restart: "إعادة تشغيل", - visit: "زيارة", - welcome: "مرحبا" - }, - prompt: { - stay: "ابق", - discardChanges: "تجاهل التغييرات", - unsavedChanges: "لديك تغييرات غير محفوظة", - unsavedChangesWarning: "هل أنت متأكد أنك تريد الانتقال بعيدًا عن هذه الصفحة؟ - لديك تغييرات غير محفوظة", - confirmListViewPublish: "النشر سيجعل العناصر المحددة مرئية على الموقع.", - confirmListViewUnpublish: "إلغاء النشر سيزيل العناصر المحددة وجميع نسلها من الموقع.", - confirmUnpublish: "إلغاء النشر سيزيل هذه الصفحة وجميع نسلها من الموقع.", - doctypeChangeWarning: "لديك تغييرات غير محفوظة. إجراء تغييرات على نوع الوثيقة سيتسبب في تجاهل التغييرات." - }, - bulk: { - done: "تم", - deletedItem: "تم حذف %0% عنصر", - deletedItems: "تم حذف %0% عناصر", - deletedItemOfItem: "تم حذف %0% من %1% عنصر", - deletedItemOfItems: "تم حذف %0% من %1% عناصر", - publishedItem: "تم نشر %0% عنصر", - publishedItems: "تم نشر %0% عناصر", - publishedItemOfItem: "تم نشر %0% من %1% عنصر", - publishedItemOfItems: "تم نشر %0% من %1% عناصر", - unpublishedItem: "تم إلغاء نشر %0% عنصر", - unpublishedItems: "تم إلغاء نشر %0% عناصر", - unpublishedItemOfItem: "تم إلغاء نشر %0% من %1% عنصر", - unpublishedItemOfItems: "تم إلغاء نشر %0% من %1% عناصر", - movedItem: "تم نقل %0% عنصر", - movedItems: "تم نقل %0% عناصر", - movedItemOfItem: "تم نقل %0% من %1% عنصر", - movedItemOfItems: "تم نقل %0% من %1% عناصر", - copiedItem: "تم نسخ %0% عنصر", - copiedItems: "تم نسخ %0% عناصر", - copiedItemOfItem: "تم نسخ %0% من %1% عنصر", - copiedItemOfItems: "تم نسخ %0% من %1% عناصر" - }, - defaultdialogs: { - nodeNameLinkPicker: "عنوان الرابط", - urlLinkPicker: "الرابط", - anchorLinkPicker: "مرساة / سلسلة استعلام", - anchorInsert: "اسم", - closeThisWindow: "أغلق هذه النافذة", - confirmdelete: "هل أنت متأكد أنك تريد الحذف", - confirmdeleteNumberOfItems: "هل أنت متأكد أنك تريد حذف %0% من %1% العناصر", - confirmdisable: "هل أنت متأكد أنك تريد التعطيل", - confirmremove: "هل أنت متأكد أنك تريد الإزالة", - confirmremoveusageof: "هل أنت متأكد أنك تريد إزالة استخدام %0%", - confirmlogout: "هل أنت متأكد؟", - confirmSure: "هل أنت متأكد؟", - cut: "قص", - editDictionary: "تحرير عنصر القاموس", - editLanguage: "تحرير اللغة", - editSelectedMedia: "تحرير الوسائط المحددة", - insertAnchor: "إدراج رابط محلي", - insertCharacter: "إدراج حرف", - insertgraphicheadline: "إدراج عنوان رسومي", - insertimage: "إدراج صورة", - insertlink: "إدراج رابط", - insertMacro: "انقر لإضافة ماكرو", - inserttable: "إدراج جدول", - languagedeletewarning: "سيؤدي هذا إلى حذف اللغة", - languageChangeWarning: "قد يكون تغيير الثقافة للغة عملية مكلفة وستؤدي إلى إعادة بناء ذاكرة التخزين المؤقت للمحتوى والفهارس", - lastEdited: "آخر تحرير", - link: "رابط", - linkinternal: "رابط داخلي:", - linklocaltip: "عند استخدام الروابط المحلية، أدخل \"#\" أمام الرابط", - linknewwindow: "فتح في نافذة جديدة؟", - macroDoesNotHaveProperties: "هذا الماكرو لا يحتوي على خصائص يمكنك تحريرها", - paste: "لصق", - permissionsEdit: "تحرير الأذونات لـ", - permissionsSet: "تعيين الأذونات لـ", - permissionsSetForGroup: "تعيين الأذونات لـ %0% لمجموعة المستخدمين %1%", - permissionsHelp: "اختر مجموعات المستخدمين التي تريد تعيين الأذونات لها", - recycleBinDeleting: "يتم الآن حذف العناصر في سلة المهملات. يرجى عدم إغلاق هذه النافذة أثناء تنفيذ هذه العملية", - recycleBinIsEmpty: "سلة المهملات فارغة الآن", - recycleBinWarning: "عند حذف العناصر من سلة المهملات، ستختفي إلى الأبد", - regexSearchError: "خدمة الويب الخاصة بـ regexlib.com تواجه حالياً بعض المشاكل، ونحن لا نملك السيطرة على ذلك. نحن آسفون لهذا الإزعاج.", - regexSearchHelp: "ابحث عن تعبير منتظم لإضافته كتحقق لحقل النموذج. مثال: 'بريد إلكتروني،' 'رمز بريدي'، 'عنوان URL'.", - removeMacro: "إزالة الماكرو", - requiredField: "حقل مطلوب", - sitereindexed: "تمت إعادة فهرسة الموقع", - siterepublished: "تم تحديث ذاكرة التخزين المؤقت للموقع. جميع المحتويات المنشورة محدثة الآن، بينما تظل جميع المحتويات غير المنشورة كما هي", - siterepublishHelp: "سيتم تحديث ذاكرة التخزين المؤقت للموقع. سيتم تحديث جميع المحتويات المنشورة، بينما ستظل المحتويات غير المنشورة كما هي.", - tableColumns: "عدد الأعمدة", - tableRows: "عدد الصفوف", - thumbnailimageclickfororiginal: "انقر على الصورة لرؤية الحجم الكامل", - treepicker: "اختيار العنصر", - viewCacheItem: "عرض عنصر ذاكرة التخزين المؤقت", - relateToOriginalLabel: "يرتبط بالأصل", - includeDescendants: "تضمين الأحفاد", - theFriendliestCommunity: "أكثر مجتمع ودود", - linkToPage: "رابط إلى الصفحة", - openInNewWindow: "فتح الوثيقة المرتبطة في نافذة أو علامة تبويب جديدة", - linkToMedia: "رابط إلى الوسائط", - selectContentStartNode: "اختر العقدة الأساسية للمحتوى", - selectMedia: "اختر الوسائط", - selectMediaType: "اختر نوع الوسائط", - selectIcon: "اختر الأيقونة", - selectItem: "اختر العنصر", - selectLink: "اختر الرابط", - selectMacro: "اختر الماكرو", - selectContent: "اختر المحتوى", - selectContentType: "اختر نوع المحتوى", - selectMediaStartNode: "اختر العقدة الأساسية للوسائط", - selectMember: "اختر العضو", - selectMembers: "اختر الأعضاء", - selectMemberGroup: "اختر مجموعة الأعضاء", - selectMemberType: "اختر نوع العضو", - selectNode: "اختر العقدة", - selectLanguages: "اختر اللغات", - selectSections: "اختر الأقسام", - selectUser: "اختر المستخدم", - selectUsers: "اختر المستخدمين", - noIconsFound: "لم يتم العثور على أيقونات", - noMacroParams: "لا توجد معلمات لهذا الماكرو", - noMacros: "لا توجد ماكروات لإدراجها", - externalLoginProviders: "تسجيل الدخول الخارجي", - exceptionDetail: "تفاصيل الاستثناء", - stacktrace: "التتبع الكامل", - innerException: "الاستثناء الداخلي", - linkYour: "ربط حساب {0} الخاص بك", - linkYourConfirm: "أنت على وشك ربط حسابك في Umbraco وحسابك في {0} وسيتم توجيهك إلى {0} للتأكيد.", - unLinkYour: "إلغاء ربط حساب {0} الخاص بك", - unLinkYourConfirm: "أنت على وشك إلغاء ربط حسابك في Umbraco وحسابك في {0} وسيتم تسجيل خروجك.", - linkedToService: "حسابك مرتبط بهذه الخدمة", - selectEditor: "اختر المحرر", - selectEditorConfiguration: "اختر التكوين", - selectSnippet: "اختر الشريحة", - variantdeletewarning: "سيؤدي ذلك إلى حذف العقدة وجميع اللغات المرتبطة بها. إذا كنت ترغب فقط في حذف لغة واحدة، يجب عليك إلغاء نشر العقدة في تلك اللغة بدلاً من ذلك.", - propertyuserpickerremovewarning: "سيتم إزالة المستخدم %0%.", - userremovewarning: "سيتم إزالة المستخدم %0% من المجموعة %1%", - yesRemove: "نعم، أزل", - deleteLayout: "أنت تقوم بحذف التخطيط", - deletingALayout: "سيؤدي تعديل التخطيط إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا التكوين." - }, + chooseNode: 'أين تريد إنشاء %0% الجديد', + createUnder: 'إنشاء عنصر تحت', + createContentBlueprint: 'حدد نوع الوثيقة الذي تريد إنشاء نموذج وثيقة له', + enterFolderName: 'أدخل اسم المجلد', + updateData: 'اختر نوعًا وعنوانًا', + noDocumentTypes: + 'لا توجد أنواع وثائق مسموح بها متاحة لإنشاء المحتوى هنا. يجب تمكينها في أنواع الوثائق ضمن قسم الإعدادات، عن طريق تعديل أنواع العقد الفرعية المسموح بها ضمن الأذونات.', + noDocumentTypesAtRoot: + 'لا توجد أنواع وثائق متاحة لإنشاء المحتوى هنا. يجب عليك إنشاء هذه الأنواع في أنواع الوثائق ضمن قسم الإعدادات.', + noDocumentTypesWithNoSettingsAccess: 'الصفحة المحددة في شجرة المحتوى لا تسمح بإنشاء أي صفحات أسفلها.', + noDocumentTypesEditPermissions: 'تعديل الأذونات لهذا النوع من الوثائق', + noDocumentTypesCreateNew: 'إنشاء نوع وثيقة جديد', + noDocumentTypesAllowedAtRoot: + 'لا توجد أنواع وثائق مسموح بها لإنشاء المحتوى هنا. يجب تمكينها في أنواع الوثائق ضمن قسم الإعدادات، عن طريق تغيير خيار السماح كجذر ضمن الأذونات.', + noMediaTypes: + 'لا توجد أنواع وسائط مسموح بها لإنشاء الوسائط هنا. يجب تمكينها في أنواع الوسائط ضمن قسم الإعدادات، عن طريق تعديل أنواع العقد الفرعية المسموح بها ضمن الأذونات.', + noMediaTypesWithNoSettingsAccess: 'الوسائط المحددة في الشجرة لا تسمح بإنشاء أي وسائط أخرى أسفلها.', + noMediaTypesEditPermissions: 'تعديل الأذونات لهذا النوع من الوسائط', + documentTypeWithoutTemplate: 'نوع الوثيقة بدون قالب', + documentTypeWithTemplate: 'نوع الوثيقة مع قالب', + documentTypeWithTemplateDescription: + 'تعريف البيانات لصفحة محتوى يمكن إنشاؤها من قبل المحررين في شجرة المحتوى ويمكن الوصول إليها مباشرة عبر URL.', + documentType: 'نوع الوثيقة', + documentTypeDescription: + 'تعريف البيانات لمكون محتوى يمكن إنشاؤه من قبل المحررين في شجرة المحتوى ويمكن اختياره في صفحات أخرى ولكنه لا يحتوي على URL مباشر.', + elementType: 'نوع العنصر', + elementTypeDescription: + "يحدد المخطط لمجموعة متكررة من الخصائص، على سبيل المثال، في محرر 'قائمة الكتل' أو 'شبكة الكتل'.", + composition: 'تركيب', + compositionDescription: + "يحدد مجموعة قابلة لإعادة الاستخدام من الخصائص يمكن تضمينها في تعريف أنواع وثائق متعددة. على سبيل المثال، مجموعة من 'إعدادات الصفحة المشتركة'.", + folder: 'مجلد', + folderDescription: + 'يستخدم لتنظيم أنواع الوثائق، والتركيبات، وأنواع العناصر التي تم إنشاؤها في شجرة نوع الوثيقة هذه.', + newFolder: 'مجلد جديد', + newDataType: 'نوع بيانات جديد', + newJavascriptFile: 'ملف JavaScript جديد', + newEmptyPartialView: 'عرض جزئي فارغ جديد', + newPartialViewMacro: 'ماكرو عرض جزئي جديد', + newPartialViewFromSnippet: 'عرض جزئي جديد من مقطع', + newPartialViewMacroFromSnippet: 'ماكرو عرض جزئي جديد من مقطع', + newPartialViewMacroNoMacro: 'ماكرو عرض جزئي جديد (بدون ماكرو)', + newStyleSheetFile: 'ملف ورقة أنماط جديد', + newRteStyleSheetFile: 'ملف ورقة أنماط محرر النصوص الغني الجديد', + }, + dashboard: { + browser: 'تصفح موقعك', + dontShowAgain: '- إخفاء', + nothinghappens: 'إذا لم يفتح Umbraco، قد تحتاج إلى السماح بالنوافذ المنبثقة من هذا الموقع', + openinnew: 'تم فتحه في نافذة جديدة', + restart: 'إعادة تشغيل', + visit: 'زيارة', + welcome: 'مرحبا', + }, + prompt: { + stay: 'ابق', + discardChanges: 'تجاهل التغييرات', + unsavedChanges: 'لديك تغييرات غير محفوظة', + unsavedChangesWarning: 'هل أنت متأكد أنك تريد الانتقال بعيدًا عن هذه الصفحة؟ - لديك تغييرات غير محفوظة', + confirmListViewPublish: 'النشر سيجعل العناصر المحددة مرئية على الموقع.', + confirmListViewUnpublish: 'إلغاء النشر سيزيل العناصر المحددة وجميع نسلها من الموقع.', + confirmUnpublish: 'إلغاء النشر سيزيل هذه الصفحة وجميع نسلها من الموقع.', + doctypeChangeWarning: 'لديك تغييرات غير محفوظة. إجراء تغييرات على نوع الوثيقة سيتسبب في تجاهل التغييرات.', + }, + bulk: { + done: 'تم', + deletedItem: 'تم حذف %0% عنصر', + deletedItems: 'تم حذف %0% عناصر', + deletedItemOfItem: 'تم حذف %0% من %1% عنصر', + deletedItemOfItems: 'تم حذف %0% من %1% عناصر', + publishedItem: 'تم نشر %0% عنصر', + publishedItems: 'تم نشر %0% عناصر', + publishedItemOfItem: 'تم نشر %0% من %1% عنصر', + publishedItemOfItems: 'تم نشر %0% من %1% عناصر', + unpublishedItem: 'تم إلغاء نشر %0% عنصر', + unpublishedItems: 'تم إلغاء نشر %0% عناصر', + unpublishedItemOfItem: 'تم إلغاء نشر %0% من %1% عنصر', + unpublishedItemOfItems: 'تم إلغاء نشر %0% من %1% عناصر', + movedItem: 'تم نقل %0% عنصر', + movedItems: 'تم نقل %0% عناصر', + movedItemOfItem: 'تم نقل %0% من %1% عنصر', + movedItemOfItems: 'تم نقل %0% من %1% عناصر', + copiedItem: 'تم نسخ %0% عنصر', + copiedItems: 'تم نسخ %0% عناصر', + copiedItemOfItem: 'تم نسخ %0% من %1% عنصر', + copiedItemOfItems: 'تم نسخ %0% من %1% عناصر', + }, + defaultdialogs: { + nodeNameLinkPicker: 'عنوان الرابط', + urlLinkPicker: 'الرابط', + anchorLinkPicker: 'مرساة / سلسلة استعلام', + anchorInsert: 'اسم', + closeThisWindow: 'أغلق هذه النافذة', + confirmdelete: 'هل أنت متأكد أنك تريد الحذف', + confirmdeleteNumberOfItems: 'هل أنت متأكد أنك تريد حذف %0% من %1% العناصر', + confirmdisable: 'هل أنت متأكد أنك تريد التعطيل', + confirmremove: 'هل أنت متأكد أنك تريد الإزالة', + confirmremoveusageof: 'هل أنت متأكد أنك تريد إزالة استخدام %0%', + confirmlogout: 'هل أنت متأكد؟', + confirmSure: 'هل أنت متأكد؟', + cut: 'قص', + editDictionary: 'تحرير عنصر القاموس', + editLanguage: 'تحرير اللغة', + editSelectedMedia: 'تحرير الوسائط المحددة', + insertAnchor: 'إدراج رابط محلي', + insertCharacter: 'إدراج حرف', + insertgraphicheadline: 'إدراج عنوان رسومي', + insertimage: 'إدراج صورة', + insertlink: 'إدراج رابط', + insertMacro: 'انقر لإضافة ماكرو', + inserttable: 'إدراج جدول', + languagedeletewarning: 'سيؤدي هذا إلى حذف اللغة', + languageChangeWarning: + 'قد يكون تغيير الثقافة للغة عملية مكلفة وستؤدي إلى إعادة بناء ذاكرة التخزين المؤقت للمحتوى والفهارس', + lastEdited: 'آخر تحرير', + link: 'رابط', + linkinternal: 'رابط داخلي:', + linklocaltip: 'عند استخدام الروابط المحلية، أدخل "#" أمام الرابط', + linknewwindow: 'فتح في نافذة جديدة؟', + macroDoesNotHaveProperties: 'هذا الماكرو لا يحتوي على خصائص يمكنك تحريرها', + paste: 'لصق', + permissionsEdit: 'تحرير الأذونات لـ', + permissionsSet: 'تعيين الأذونات لـ', + permissionsSetForGroup: 'تعيين الأذونات لـ %0% لمجموعة المستخدمين %1%', + permissionsHelp: 'اختر مجموعات المستخدمين التي تريد تعيين الأذونات لها', + recycleBinDeleting: 'يتم الآن حذف العناصر في سلة المهملات. يرجى عدم إغلاق هذه النافذة أثناء تنفيذ هذه العملية', + recycleBinIsEmpty: 'سلة المهملات فارغة الآن', + recycleBinWarning: 'عند حذف العناصر من سلة المهملات، ستختفي إلى الأبد', + regexSearchError: + "خدمة الويب الخاصة بـ regexlib.com تواجه حالياً بعض المشاكل، ونحن لا نملك السيطرة على ذلك. نحن آسفون لهذا الإزعاج.", + regexSearchHelp: "ابحث عن تعبير منتظم لإضافته كتحقق لحقل النموذج. مثال: 'بريد إلكتروني،' 'رمز بريدي'، 'عنوان URL'.", + removeMacro: 'إزالة الماكرو', + requiredField: 'حقل مطلوب', + sitereindexed: 'تمت إعادة فهرسة الموقع', + siterepublished: + 'تم تحديث ذاكرة التخزين المؤقت للموقع. جميع المحتويات المنشورة محدثة الآن، بينما تظل جميع المحتويات غير المنشورة كما هي', + siterepublishHelp: + 'سيتم تحديث ذاكرة التخزين المؤقت للموقع. سيتم تحديث جميع المحتويات المنشورة، بينما ستظل المحتويات غير المنشورة كما هي.', + tableColumns: 'عدد الأعمدة', + tableRows: 'عدد الصفوف', + thumbnailimageclickfororiginal: 'انقر على الصورة لرؤية الحجم الكامل', + treepicker: 'اختيار العنصر', + viewCacheItem: 'عرض عنصر ذاكرة التخزين المؤقت', + relateToOriginalLabel: 'يرتبط بالأصل', + includeDescendants: 'تضمين الأحفاد', + theFriendliestCommunity: 'أكثر مجتمع ودود', + linkToPage: 'رابط إلى الصفحة', + openInNewWindow: 'فتح الوثيقة المرتبطة في نافذة أو علامة تبويب جديدة', + linkToMedia: 'رابط إلى الوسائط', + selectContentStartNode: 'اختر العقدة الأساسية للمحتوى', + selectMedia: 'اختر الوسائط', + selectMediaType: 'اختر نوع الوسائط', + selectIcon: 'اختر الأيقونة', + selectItem: 'اختر العنصر', + selectLink: 'اختر الرابط', + selectMacro: 'اختر الماكرو', + selectContent: 'اختر المحتوى', + selectContentType: 'اختر نوع المحتوى', + selectMediaStartNode: 'اختر العقدة الأساسية للوسائط', + selectMember: 'اختر العضو', + selectMembers: 'اختر الأعضاء', + selectMemberGroup: 'اختر مجموعة الأعضاء', + selectMemberType: 'اختر نوع العضو', + selectNode: 'اختر العقدة', + selectLanguages: 'اختر اللغات', + selectSections: 'اختر الأقسام', + selectUser: 'اختر المستخدم', + selectUsers: 'اختر المستخدمين', + noIconsFound: 'لم يتم العثور على أيقونات', + noMacroParams: 'لا توجد معلمات لهذا الماكرو', + noMacros: 'لا توجد ماكروات لإدراجها', + externalLoginProviders: 'تسجيل الدخول الخارجي', + exceptionDetail: 'تفاصيل الاستثناء', + stacktrace: 'التتبع الكامل', + innerException: 'الاستثناء الداخلي', + linkYour: 'ربط حساب {0} الخاص بك', + linkYourConfirm: 'أنت على وشك ربط حسابك في Umbraco وحسابك في {0} وسيتم توجيهك إلى {0} للتأكيد.', + unLinkYour: 'إلغاء ربط حساب {0} الخاص بك', + unLinkYourConfirm: 'أنت على وشك إلغاء ربط حسابك في Umbraco وحسابك في {0} وسيتم تسجيل خروجك.', + linkedToService: 'حسابك مرتبط بهذه الخدمة', + selectEditor: 'اختر المحرر', + selectEditorConfiguration: 'اختر التكوين', + selectSnippet: 'اختر الشريحة', + variantdeletewarning: + 'سيؤدي ذلك إلى حذف العقدة وجميع اللغات المرتبطة بها. إذا كنت ترغب فقط في حذف لغة واحدة، يجب عليك إلغاء نشر العقدة في تلك اللغة بدلاً من ذلك.', + propertyuserpickerremovewarning: 'سيتم إزالة المستخدم %0%.', + userremovewarning: 'سيتم إزالة المستخدم %0% من المجموعة %1%', + yesRemove: 'نعم، أزل', + deleteLayout: 'أنت تقوم بحذف التخطيط', + deletingALayout: 'سيؤدي تعديل التخطيط إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا التكوين.', + }, dictionary: { importDictionaryItemHelp: '\n لاستيراد عنصر قاموس، ابحث عن ملف ".udt" على جهاز الكمبيوتر الخاص بك بالنقر على زر "استيراد"\n (سيُطلب منك التأكيد في الشاشة التالية)\n ', @@ -554,8 +574,7 @@ export default { }, examineManagement: { configuredSearchers: 'باحثون مكوّنون', - configuredSearchersDescription: - 'يعرض الخصائص والأدوات لأي باحث مكوّن (مثل الباحث متعدد الفهارس)', + configuredSearchersDescription: 'يعرض الخصائص والأدوات لأي باحث مكوّن (مثل الباحث متعدد الفهارس)', fieldValues: 'قيم الحقول', healthStatus: 'حالة الصحة', healthStatusDescription: 'حالة صحة الفهرس وما إذا كان يمكن قراءته', @@ -564,8 +583,7 @@ export default { contentInIndex: 'المحتوى في الفهرس', indexInfoDescription: 'يعرض خصائص الفهرس', manageIndexes: 'إدارة فهارس Examine', - manageIndexesDescription: - 'يسمح لك بمشاهدة تفاصيل كل فهرس ويوفر بعض الأدوات لإدارة الفهارس', + manageIndexesDescription: 'يسمح لك بمشاهدة تفاصيل كل فهرس ويوفر بعض الأدوات لإدارة الفهارس', rebuildIndex: 'إعادة بناء الفهرس', rebuildIndexWarning: 'سيؤدي هذا إلى إعادة بناء الفهرس.
بناءً على حجم المحتوى الموجود في موقعك، قد يستغرق هذا بعض الوقت.
لا يُنصح بإعادة بناء الفهرس في أوقات حركة المرور العالية على الموقع أو عند قيام المحررين بتحرير المحتوى.', @@ -630,8 +648,7 @@ export default { selectFolder: 'اختر المجلد للتحريك', inTheTree: 'إلى في هيكل الشجرة أدناه', wasMoved: 'تم نقله تحت', - hasReferencesDeleteConsequence: - 'حذف %0% سيؤدي إلى حذف الخصائص وبياناتها من العناصر التالية', + hasReferencesDeleteConsequence: 'حذف %0% سيؤدي إلى حذف الخصائص وبياناتها من العناصر التالية', acceptDeleteConsequence: 'أفهم أن هذا الإجراء سيؤدي إلى حذف الخصائص والبيانات الوثائق إلى هذا النوع من البيانات\n \n ', }, @@ -657,19 +674,19 @@ export default { receivedErrorFromServer: 'تم استلام خطأ من الخادم', dissallowedMediaType: 'تم رفض نوع الملف المحدد من قبل المسؤول', codemirroriewarning: - "ملاحظة! حتى مع تمكين CodeMirror عن طريق التكوين، فإنه معطل في\n Internet Explorer لأنه ليس مستقرًا بما فيه الكفاية.\n ", + 'ملاحظة! حتى مع تمكين CodeMirror عن طريق التكوين، فإنه معطل في\n Internet Explorer لأنه ليس مستقرًا بما فيه الكفاية.\n ', contentTypeAliasAndNameNotNull: 'يرجى ملء كل من الاسم المستعار والاسم في نوع الخاصية الجديد!', filePermissionsError: 'هناك مشكلة في الوصول للقراءة/الكتابة لملف أو مجلد محدد', macroErrorLoadingPartialView: 'خطأ في تحميل برنامج عرض جزئي (الملف: %0%)', missingTitle: 'يرجى إدخال عنوان', missingType: 'يرجى اختيار نوع', pictureResizeBiggerThanOrg: - "أنت على وشك جعل الصورة أكبر من حجمها الأصلي. هل أنت متأكد\n أنك تريد المتابعة؟\n ", + 'أنت على وشك جعل الصورة أكبر من حجمها الأصلي. هل أنت متأكد\n أنك تريد المتابعة؟\n ', startNodeDoesNotExists: 'تم حذف العقدة البداية، يرجى الاتصال بالمسؤول الخاص بك', stylesMustMarkBeforeSelect: 'يرجى تمييز المحتوى قبل تغيير النمط', stylesNoStylesOnPage: 'لا توجد أنماط نشطة متاحة', tableColMergeLeft: 'يرجى وضع المؤشر على يسار الخليتين اللتين ترغب في دمجهما', - tableSplitNotSplittable: "لا يمكنك تقسيم خلية لم يتم دمجها.", + tableSplitNotSplittable: 'لا يمكنك تقسيم خلية لم يتم دمجها.', propertyHasErrors: 'هذه الخاصية غير صالحة', externalLoginError: 'تسجيل الدخول الخارجي', unauthorized: 'لم تكن مصرحًا لك قبل القيام بهذا الإجراء', @@ -691,7 +708,7 @@ export default { serverError: 'خطأ في الخادم', temporarilyUnavailable: 'الخدمة غير متاحة مؤقتًا', }, - general: { + general: { options: 'خيارات', about: 'حول', action: 'إجراء', @@ -908,690 +925,745 @@ export default { headers: { page: 'صفحة', }, - installer: { - databaseErrorCannotConnect: "لا يمكن للمثبت الاتصال بقاعدة البيانات.", - databaseErrorWebConfig: "تعذر حفظ ملف web.config. يرجى تعديل سلسلة الاتصال يدويًا.", - databaseFound: "تم العثور على قاعدة بياناتك وتم التعرف عليها كـ", - databaseHeader: "تكوين قاعدة البيانات", - databaseInstall: "اضغط على زر التثبيت لتثبيت قاعدة بيانات Umbraco %0%", - databaseInstallDone: "تم نسخ Umbraco %0% الآن إلى قاعدة بياناتك. اضغط على التالي للمتابعة.", - databaseNotFound: "

لم يتم العثور على قاعدة البيانات! يرجى التحقق من أن المعلومات في سلسلة الاتصال في ملف \"web.config\" صحيحة.

\n

للمتابعة، يرجى تعديل ملف \"web.config\" (باستخدام Visual Studio أو محرر النصوص المفضل لديك)، والتمرير إلى الأسفل، وإضافة سلسلة الاتصال لقاعدة البيانات الخاصة بك في المفتاح المسمى \"UmbracoDbDSN\" وحفظ الملف.

\n

اضغط على زر إعادة المحاولة عند الانتهاء.
\n\t\t\t مزيد من المعلومات حول تحرير web.config هنا.

", - databaseText: "لإكمال هذه الخطوة، يجب أن تكون لديك بعض المعلومات حول خادم قاعدة البيانات الخاص بك (\"سلسلة الاتصال\").
\n يرجى الاتصال بمزود خدمة الإنترنت الخاص بك إذا لزم الأمر.\n إذا كنت تقوم بالتثبيت على جهاز محلي أو خادم، قد تحتاج إلى معلومات من مسؤول النظام الخاص بك.", - databaseUpgrade: "

اضغط على زر الترقية لترقية قاعدة البيانات إلى Umbraco %0%

\n

لا تقلق - لن يتم حذف أي محتوى وكل شيء سيستمر في العمل بعد ذلك!

", - databaseUpgradeDone: "تم ترقية قاعدة البيانات الخاصة بك إلى الإصدار النهائي %0%.
اضغط على التالي للمتابعة.", - databaseUpToDate: "قاعدة البيانات الحالية محدثة! اضغط على التالي لمتابعة معالج التكوين", - defaultUserChangePass: "يجب تغيير كلمة مرور المستخدم الافتراضي!", - defaultUserDisabled: "تم تعطيل المستخدم الافتراضي أو لا يمكنه الوصول إلى Umbraco!

لا حاجة إلى اتخاذ أي إجراءات أخرى. اضغط على التالي للمتابعة.", - defaultUserPassChanged: "تم تغيير كلمة مرور المستخدم الافتراضي بنجاح منذ التثبيت!

لا حاجة إلى اتخاذ أي إجراءات أخرى. اضغط على التالي للمتابعة.", - defaultUserPasswordChanged: "تم تغيير كلمة المرور!", - greatStart: "ابدأ بداية رائعة، شاهد مقاطع الفيديو التمهيدية الخاصة بنا", - licenseText: "بالنقر على الزر التالي (أو تعديل umbracoConfigurationStatus في web.config)، فإنك توافق على رخصة هذا البرنامج كما هو موضح في الصندوق أدناه. لاحظ أن توزيع Umbraco يتكون من رخصتين مختلفتين، رخصة MIT مفتوحة المصدر للإطار ورخصة البرمجيات المجانية الخاصة بـ Umbraco التي تغطي واجهة المستخدم.", - None: "لم يتم تثبيته بعد.", - permissionsAffectedFolders: "الملفات والمجلدات المتأثرة", - permissionsAffectedFoldersMoreInfo: "مزيد من المعلومات حول إعداد الأذونات لـ Umbraco هنا", - permissionsAffectedFoldersText: "يجب منح أذونات تعديل لـ ASP.NET على الملفات/المجلدات التالية", - permissionsAlmostPerfect: "إعدادات الأذونات الخاصة بك تقريبًا مثالية!

\n يمكنك تشغيل Umbraco بدون مشاكل، لكن لن تتمكن من تثبيت الحزم الموصى بها للاستفادة الكاملة من Umbraco.", - permissionsHowtoResolve: "كيفية الحل", - permissionsHowtoResolveLink: "اضغط هنا لقراءة النسخة النصية", - permissionsHowtoResolveText: "شاهد الفيديو التعليمي الخاص بإعداد أذونات المجلدات لـ Umbraco أو اقرأ النسخة النصية.", - permissionsMaybeAnIssue: "قد تكون إعدادات الأذونات الخاصة بك مشكلة!\n

\n يمكنك تشغيل Umbraco بدون مشاكل، لكن لن تتمكن من إنشاء مجلدات أو تثبيت الحزم الموصى بها للاستفادة الكاملة من Umbraco.", - permissionsNotReady: "إعدادات الأذونات الخاصة بك غير جاهزة لـ Umbraco!\n

\n لتشغيل Umbraco، ستحتاج إلى تحديث إعدادات الأذونات الخاصة بك.", - permissionsPerfect: "إعدادات الأذونات الخاصة بك مثالية!

\n أنت جاهز لتشغيل Umbraco وتثبيت الحزم!", - permissionsResolveFolderIssues: "حل مشكلة المجلد", - permissionsResolveFolderIssuesLink: "اتبع هذا الرابط للحصول على مزيد من المعلومات حول مشاكل ASP.NET وإنشاء المجلدات", - permissionsSettingUpPermissions: "إعداد أذونات المجلدات", - permissionsText: "يحتاج Umbraco إلى أذونات الكتابة/التعديل لبعض الأدلة لتخزين الملفات مثل الصور وملفات PDF. كما أنه يخزن بيانات مؤقتة (المعروفة باسم: ذاكرة التخزين المؤقت) لتحسين أداء موقع الويب الخاص بك.", - runwayFromScratch: "أريد البدء من الصفر", - runwayFromScratchText: "موقع الويب الخاص بك فارغ تمامًا في الوقت الحالي، وهذا مثالي إذا كنت ترغب في البدء من الصفر وإنشاء الأنواع الوثائق والقوالب الخاصة بك. (تعرف على الكيفية) لا يزال بإمكانك اختيار تثبيت Runway لاحقًا. يرجى الانتقال إلى قسم المطور واختيار الحزم.", - runwayHeader: "لقد قمت بإعداد منصة Umbraco نظيفة. ماذا تريد أن تفعل بعد ذلك؟", - runwayInstalled: "تم تثبيت Runway", - runwayInstalledText: "لديك الأساس في مكانه. اختر الوحدات التي ترغب في تثبيتها فوقه.
\n هذه هي قائمتنا الموصى بها من الوحدات، قم بتحديد الوحدات التي ترغب في تثبيتها، أو عرض القائمة الكاملة للوحدات", - runwayOnlyProUsers: "يوصى بها فقط للمستخدمين ذوي الخبرة", - runwaySimpleSite: "أريد البدء بموقع ويب بسيط", - runwaySimpleSiteText: "

\"Runway\" هو موقع ويب بسيط يوفر بعض الأنواع الوثائق والقوالب الأساسية. يمكن للمثبت إعداد Runway لك تلقائيًا، لكن يمكنك بسهولة تحريره أو توسيعه أو إزالته. ليس ضروريًا ويمكنك استخدام Umbraco بشكل مثالي بدونها. ومع ذلك، يوفر Runway أساسًا سهلًا يعتمد على أفضل الممارسات لبدء التشغيل بسرعة أكبر من أي وقت مضى. إذا اخترت تثبيت Runway، يمكنك اختيار الوحدات الأساسية الاختيارية المعروفة باسم وحدات Runway لتعزيز صفحات Runway الخاصة بك.

\n متضمن مع Runway: الصفحة الرئيسية، صفحة البدء، صفحة تثبيت الوحدات.
\n الوحدات الاختيارية: التنقل العلوي، خريطة الموقع، الاتصال، المعرض.
", - runwayWhatIsRunway: "ما هو Runway", - step1: "الخطوة 1/5 قبول الترخيص", - step2: "الخطوة 2/5: تكوين قاعدة البيانات", - step3: "الخطوة 3/5: التحقق من أذونات الملفات", - step4: "الخطوة 4/5: التحقق من أمان Umbraco", - step5: "الخطوة 5/5: Umbraco جاهز للبدء", - thankYou: "شكرًا لاختيارك Umbraco", - theEndBrowseSite: "

تصفح موقعك الجديد

\nلقد قمت بتثبيت Runway، فلماذا لا ترى كيف يبدو موقع الويب الجديد الخاص بك.", - theEndFurtherHelp: "

مزيد من المساعدة والمعلومات

\nاحصل على المساعدة من مجتمعنا الحائز على جوائز، تصفح الوثائق أو شاهد بعض مقاطع الفيديو المجانية حول كيفية بناء موقع بسيط، كيفية استخدام الحزم ودليل سريع لمصطلحات Umbraco", - theEndHeader: "تم تثبيت Umbraco %0% وهو جاهز للاستخدام", - theEndInstallFailed: "لإكمال التثبيت، ستحتاج إلى تحرير /web.config file يدويًا وتحديث المفتاح AppSetting UmbracoConfigurationStatus في الأسفل إلى القيمة '%0%'.", - theEndInstallSuccess: "يمكنك البدء فورًا بالنقر على زر \"إطلاق Umbraco\" أدناه.
إذا كنت جديدًا على Umbraco، يمكنك العثور على الكثير من الموارد على صفحات البدء الخاصة بنا.", - theEndOpenUmbraco: "

إطلاق Umbraco

\nلإدارة موقع الويب الخاص بك، افتح ببساطة الخلفية لـ Umbraco وابدأ بإضافة المحتوى أو تحديث القوالب والأنماط أو إضافة ميزات جديدة", - Unavailable: "فشل الاتصال بقاعدة البيانات.", - Version3: "إصدار Umbraco 3", - Version4: "إصدار Umbraco 4", - watch: "شاهد", - welcomeIntro: "سيقوم هذا المعالج بتوجيهك خلال عملية تكوين Umbraco %0% لتثبيت جديد أو الترقية من الإصدار 3.0.\n

\n اضغط على التالي لبدء المعالج." - }, + installer: { + databaseErrorCannotConnect: 'لا يمكن للمثبت الاتصال بقاعدة البيانات.', + databaseErrorWebConfig: 'تعذر حفظ ملف web.config. يرجى تعديل سلسلة الاتصال يدويًا.', + databaseFound: 'تم العثور على قاعدة بياناتك وتم التعرف عليها كـ', + databaseHeader: 'تكوين قاعدة البيانات', + databaseInstall: 'اضغط على زر التثبيت لتثبيت قاعدة بيانات Umbraco %0%', + databaseInstallDone: 'تم نسخ Umbraco %0% الآن إلى قاعدة بياناتك. اضغط على التالي للمتابعة.', + databaseNotFound: + '

لم يتم العثور على قاعدة البيانات! يرجى التحقق من أن المعلومات في سلسلة الاتصال في ملف "web.config" صحيحة.

\n

للمتابعة، يرجى تعديل ملف "web.config" (باستخدام Visual Studio أو محرر النصوص المفضل لديك)، والتمرير إلى الأسفل، وإضافة سلسلة الاتصال لقاعدة البيانات الخاصة بك في المفتاح المسمى "UmbracoDbDSN" وحفظ الملف.

\n

اضغط على زر إعادة المحاولة عند الانتهاء.
\n\t\t\t مزيد من المعلومات حول تحرير web.config هنا.

', + databaseText: + 'لإكمال هذه الخطوة، يجب أن تكون لديك بعض المعلومات حول خادم قاعدة البيانات الخاص بك ("سلسلة الاتصال").
\n يرجى الاتصال بمزود خدمة الإنترنت الخاص بك إذا لزم الأمر.\n إذا كنت تقوم بالتثبيت على جهاز محلي أو خادم، قد تحتاج إلى معلومات من مسؤول النظام الخاص بك.', + databaseUpgrade: + '

اضغط على زر الترقية لترقية قاعدة البيانات إلى Umbraco %0%

\n

لا تقلق - لن يتم حذف أي محتوى وكل شيء سيستمر في العمل بعد ذلك!

', + databaseUpgradeDone: + 'تم ترقية قاعدة البيانات الخاصة بك إلى الإصدار النهائي %0%.
اضغط على التالي للمتابعة.', + databaseUpToDate: 'قاعدة البيانات الحالية محدثة! اضغط على التالي لمتابعة معالج التكوين', + defaultUserChangePass: 'يجب تغيير كلمة مرور المستخدم الافتراضي!', + defaultUserDisabled: + 'تم تعطيل المستخدم الافتراضي أو لا يمكنه الوصول إلى Umbraco!

لا حاجة إلى اتخاذ أي إجراءات أخرى. اضغط على التالي للمتابعة.', + defaultUserPassChanged: + 'تم تغيير كلمة مرور المستخدم الافتراضي بنجاح منذ التثبيت!

لا حاجة إلى اتخاذ أي إجراءات أخرى. اضغط على التالي للمتابعة.', + defaultUserPasswordChanged: 'تم تغيير كلمة المرور!', + greatStart: 'ابدأ بداية رائعة، شاهد مقاطع الفيديو التمهيدية الخاصة بنا', + licenseText: + 'بالنقر على الزر التالي (أو تعديل umbracoConfigurationStatus في web.config)، فإنك توافق على رخصة هذا البرنامج كما هو موضح في الصندوق أدناه. لاحظ أن توزيع Umbraco يتكون من رخصتين مختلفتين، رخصة MIT مفتوحة المصدر للإطار ورخصة البرمجيات المجانية الخاصة بـ Umbraco التي تغطي واجهة المستخدم.', + None: 'لم يتم تثبيته بعد.', + permissionsAffectedFolders: 'الملفات والمجلدات المتأثرة', + permissionsAffectedFoldersMoreInfo: 'مزيد من المعلومات حول إعداد الأذونات لـ Umbraco هنا', + permissionsAffectedFoldersText: 'يجب منح أذونات تعديل لـ ASP.NET على الملفات/المجلدات التالية', + permissionsAlmostPerfect: + 'إعدادات الأذونات الخاصة بك تقريبًا مثالية!

\n يمكنك تشغيل Umbraco بدون مشاكل، لكن لن تتمكن من تثبيت الحزم الموصى بها للاستفادة الكاملة من Umbraco.', + permissionsHowtoResolve: 'كيفية الحل', + permissionsHowtoResolveLink: 'اضغط هنا لقراءة النسخة النصية', + permissionsHowtoResolveText: + 'شاهد الفيديو التعليمي الخاص بإعداد أذونات المجلدات لـ Umbraco أو اقرأ النسخة النصية.', + permissionsMaybeAnIssue: + 'قد تكون إعدادات الأذونات الخاصة بك مشكلة!\n

\n يمكنك تشغيل Umbraco بدون مشاكل، لكن لن تتمكن من إنشاء مجلدات أو تثبيت الحزم الموصى بها للاستفادة الكاملة من Umbraco.', + permissionsNotReady: + 'إعدادات الأذونات الخاصة بك غير جاهزة لـ Umbraco!\n

\n لتشغيل Umbraco، ستحتاج إلى تحديث إعدادات الأذونات الخاصة بك.', + permissionsPerfect: + 'إعدادات الأذونات الخاصة بك مثالية!

\n أنت جاهز لتشغيل Umbraco وتثبيت الحزم!', + permissionsResolveFolderIssues: 'حل مشكلة المجلد', + permissionsResolveFolderIssuesLink: + 'اتبع هذا الرابط للحصول على مزيد من المعلومات حول مشاكل ASP.NET وإنشاء المجلدات', + permissionsSettingUpPermissions: 'إعداد أذونات المجلدات', + permissionsText: + 'يحتاج Umbraco إلى أذونات الكتابة/التعديل لبعض الأدلة لتخزين الملفات مثل الصور وملفات PDF. كما أنه يخزن بيانات مؤقتة (المعروفة باسم: ذاكرة التخزين المؤقت) لتحسين أداء موقع الويب الخاص بك.', + runwayFromScratch: 'أريد البدء من الصفر', + runwayFromScratchText: + 'موقع الويب الخاص بك فارغ تمامًا في الوقت الحالي، وهذا مثالي إذا كنت ترغب في البدء من الصفر وإنشاء الأنواع الوثائق والقوالب الخاصة بك. (تعرف على الكيفية) لا يزال بإمكانك اختيار تثبيت Runway لاحقًا. يرجى الانتقال إلى قسم المطور واختيار الحزم.', + runwayHeader: 'لقد قمت بإعداد منصة Umbraco نظيفة. ماذا تريد أن تفعل بعد ذلك؟', + runwayInstalled: 'تم تثبيت Runway', + runwayInstalledText: + 'لديك الأساس في مكانه. اختر الوحدات التي ترغب في تثبيتها فوقه.
\n هذه هي قائمتنا الموصى بها من الوحدات، قم بتحديد الوحدات التي ترغب في تثبيتها، أو عرض القائمة الكاملة للوحدات', + runwayOnlyProUsers: 'يوصى بها فقط للمستخدمين ذوي الخبرة', + runwaySimpleSite: 'أريد البدء بموقع ويب بسيط', + runwaySimpleSiteText: + '

"Runway" هو موقع ويب بسيط يوفر بعض الأنواع الوثائق والقوالب الأساسية. يمكن للمثبت إعداد Runway لك تلقائيًا، لكن يمكنك بسهولة تحريره أو توسيعه أو إزالته. ليس ضروريًا ويمكنك استخدام Umbraco بشكل مثالي بدونها. ومع ذلك، يوفر Runway أساسًا سهلًا يعتمد على أفضل الممارسات لبدء التشغيل بسرعة أكبر من أي وقت مضى. إذا اخترت تثبيت Runway، يمكنك اختيار الوحدات الأساسية الاختيارية المعروفة باسم وحدات Runway لتعزيز صفحات Runway الخاصة بك.

\n متضمن مع Runway: الصفحة الرئيسية، صفحة البدء، صفحة تثبيت الوحدات.
\n الوحدات الاختيارية: التنقل العلوي، خريطة الموقع، الاتصال، المعرض.
', + runwayWhatIsRunway: 'ما هو Runway', + step1: 'الخطوة 1/5 قبول الترخيص', + step2: 'الخطوة 2/5: تكوين قاعدة البيانات', + step3: 'الخطوة 3/5: التحقق من أذونات الملفات', + step4: 'الخطوة 4/5: التحقق من أمان Umbraco', + step5: 'الخطوة 5/5: Umbraco جاهز للبدء', + thankYou: 'شكرًا لاختيارك Umbraco', + theEndBrowseSite: + '

تصفح موقعك الجديد

\nلقد قمت بتثبيت Runway، فلماذا لا ترى كيف يبدو موقع الويب الجديد الخاص بك.', + theEndFurtherHelp: + '

مزيد من المساعدة والمعلومات

\nاحصل على المساعدة من مجتمعنا الحائز على جوائز، تصفح الوثائق أو شاهد بعض مقاطع الفيديو المجانية حول كيفية بناء موقع بسيط، كيفية استخدام الحزم ودليل سريع لمصطلحات Umbraco', + theEndHeader: 'تم تثبيت Umbraco %0% وهو جاهز للاستخدام', + theEndInstallFailed: + "لإكمال التثبيت، ستحتاج إلى تحرير /web.config file يدويًا وتحديث المفتاح AppSetting UmbracoConfigurationStatus في الأسفل إلى القيمة '%0%'.", + theEndInstallSuccess: + 'يمكنك البدء فورًا بالنقر على زر "إطلاق Umbraco" أدناه.
إذا كنت جديدًا على Umbraco، يمكنك العثور على الكثير من الموارد على صفحات البدء الخاصة بنا.', + theEndOpenUmbraco: + '

إطلاق Umbraco

\nلإدارة موقع الويب الخاص بك، افتح ببساطة الخلفية لـ Umbraco وابدأ بإضافة المحتوى أو تحديث القوالب والأنماط أو إضافة ميزات جديدة', + Unavailable: 'فشل الاتصال بقاعدة البيانات.', + Version3: 'إصدار Umbraco 3', + Version4: 'إصدار Umbraco 4', + watch: 'شاهد', + welcomeIntro: + 'سيقوم هذا المعالج بتوجيهك خلال عملية تكوين Umbraco %0% لتثبيت جديد أو الترقية من الإصدار 3.0.\n

\n اضغط على التالي لبدء المعالج.', + }, language: { - cultureCode: 'رمز الثقافة', - displayName: 'اسم الثقافة', - noFallbackLanguages: 'لا توجد لغات أخرى للاختيار من بينها', - }, - lockout: { - lockoutWillOccur: "لقد كنت غير نشط وسيتم تسجيل خروجك تلقائيًا في", - renewSession: 'جدد الآن لحفظ عملك', - }, - login: { - greeting0: 'مرحبًا! بداية أسبوع مثمرة مع Umbraco!', - greeting1: 'مرحبًا! يوم ثلاثاء إبداعي في Umbraco!', - greeting2: 'مرحبًا! يوم أربعاء موفق في إدارة محتواك!', - greeting3: 'مرحبًا! يوم خميس مليء بالإنجازات مع Umbraco!', - greeting4: 'مرحبًا! إنه يوم جمعة رائع لإدارة محتوى موقعك!', - greeting5: 'مرحبًا! عطلة نهاية أسبوع سعيدة مع Umbraco!', - greeting6: 'مرحبًا! يوم أحد جديد، فرص جديدة في Umbraco!', - instruction: 'سجل الدخول إلى Umbraco', - signInWith: 'سجل الدخول باستخدام {0}', - timeout: 'انتهت جلستك. يرجى تسجيل الدخول مرة أخرى أدناه.', - }, - main: { - dashboard: 'لوحة التحكم', - sections: 'الأقسام', - tree: 'المحتوى', - }, - moveOrCopy: { - choose: 'اختر الصفحة أعلاه...', - copyDone: '%0% تم نسخه إلى %1%', - copyTo: 'حدد المكان الذي يجب نسخ الوثيقة %0% إليه أدناه', - moveDone: '%0% تم نقله إلى %1%', - moveTo: 'حدد المكان الذي يجب نقل الوثيقة %0% إليه أدناه', - nodeSelected: "تم تحديده كجذر لمحتواك الجديد، انقر على 'موافق' أدناه.", - noNodeSelected: "لم يتم تحديد أي عقدة بعد، يرجى تحديد عقدة في القائمة أعلاه قبل النقر على 'موافق'", - notAllowedByContentType: 'العقدة الحالية غير مسموح بها تحت العقدة المحددة بسبب نوعها', - notAllowedByPath: 'لا يمكن نقل العقدة الحالية إلى إحدى صفحاتها الفرعية، ولا يمكن أن تكون الوالد والوجهة هي نفسها', - notAllowedAtRoot: 'لا يمكن أن توجد العقدة الحالية في الجذر', - notValid: "لا يُسمح بالإجراء نظرًا لأن لديك أذونات غير كافية على 1 أو أكثر من الوثيقة الفرعية.\n", - relateToOriginal: 'ربط العناصر المنسوخة بالأصل', - }, - notifications: { - editNotifications: 'حدد إشعارك لـ %0%', - notificationsSavedFor: 'تم حفظ إعدادات الإشعارات لـ', - notifications: 'الإشعارات', - }, - packager: { - actions: 'إجراءات', - created: 'أنشئ', - createPackage: 'إنشاء حزمة', - chooseLocalPackageText: '\n اختر حزمة من جهازك، بالنقر على زر تصفح
\n وتحديد الحزمة. عادةً ما تحتوي حزم Umbraco على امتداد ".umb" أو ".zip".\n ', - deletewarning: 'سيؤدي ذلك إلى حذف الحزمة', - includeAllChildNodes: 'تضمين جميع العقد الفرعية', - installed: 'مثبتة', - installedPackages: 'الحزم المثبتة', - installInstructions: 'تعليمات التثبيت', - noConfigurationView: 'لا تحتوي هذه الحزمة على عرض تكوين', - noPackagesCreated: 'لم يتم إنشاء أي حزم بعد', - noPackages: 'لم يتم تثبيت أي حزم', - noPackagesDescription: "تصفح الحزم المتاحة باستخدام أيقونة 'الحزم' في أعلى يمين الشاشة", - packageContent: 'محتوى الحزمة', - packageLicense: 'الرخصة', - packageSearch: 'البحث عن الحزم', - packageSearchResults: 'نتائج البحث عن', - packageNoResults: 'لم نجد شيئًا لـ', - packageNoResultsDescription: 'يرجى محاولة البحث عن حزمة أخرى أو تصفح الفئات\n', - packagesPopular: 'الأكثر شيوعًا', - packagesPromoted: 'مروج لها', - packagesNew: 'الإصدارات الجديدة', - packageHas: 'لديه', - packageKarmaPoints: 'نقاط الكارما', - packageInfo: 'معلومات', - packageOwner: 'المالك', - packageContrib: 'المساهمون', - packageCreated: 'أنشئ', - packageCurrentVersion: 'الإصدار الحالي', - packageNetVersion: 'إصدار .NET', - packageDownloads: 'التنزيلات', - packageLikes: 'الإعجابات', - packageCompatibility: 'التوافق', - packageCompatibilityDescription: 'تكون هذه الحزمة متوافقة مع الإصدارات التالية من Umbraco، حسب\n ما أبلغ عنه أعضاء المجتمع. لا يمكن ضمان التوافق الكامل للإصدارات المبلغ عنها أقل من 100%\n ', - packageExternalSources: 'المصادر الخارجية', - packageAuthor: 'المؤلف', - packageDocumentation: 'الوثائق', - packageMetaData: 'بيانات الحزمة', - packageName: 'اسم الحزمة', - packageNoItemsHeader: "لا تحتوي الحزمة على أي عناصر", - packageNoItemsText: 'لا تحتوي هذه الحزمة على أي عناصر لإلغاء التثبيت.

\n يمكنك إزالة هذا بأمان من النظام بالنقر على "إلغاء تثبيت الحزمة" أدناه.', - packageOptions: 'خيارات الحزمة', - packageMigrationsRun: 'تشغيل ترحيلات الحزمة المعلقة', - packageMigrationsComplete: 'تم إكمال ترحيلات الحزمة بنجاح.', - packageMigrationsNonePending: 'تم إكمال جميع ترحيلات الحزمة بنجاح.', - packageReadme: 'ملف README الخاص بالحزمة', - packageRepository: 'مستودع الحزمة', - packageUninstallConfirm: 'تأكيد إلغاء تثبيت الحزمة', - packageUninstalledHeader: 'تم إلغاء تثبيت الحزمة', - packageUninstalledText: 'تم إلغاء تثبيت الحزمة بنجاح', - packageUninstallHeader: 'إلغاء تثبيت الحزمة', - packageUninstallText: 'يمكنك إلغاء تحديد العناصر التي لا ترغب في إزالتها في الوقت الحالي أدناه. عند النقر على "تأكيد الإلغاء"، ستتم إزالة جميع العناصر المحددة.
\n ملاحظة: أي مستندات أو وسائط تعتمد على العناصر التي تقوم بإزالتها، ستتوقف عن العمل، وقد يؤدي ذلك إلى عدم استقرار النظام، لذا قم بإلغاء التثبيت بحذر. إذا كان لديك أي شكوك، اتصل بمؤلف الحزمة.', - packageVersion: 'إصدار الحزمة', - verifiedToWorkOnUmbracoCloud: 'تم التحقق من عمله على Umbraco Cloud', - }, + cultureCode: 'رمز الثقافة', + displayName: 'اسم الثقافة', + noFallbackLanguages: 'لا توجد لغات أخرى للاختيار من بينها', + }, + lockout: { + lockoutWillOccur: 'لقد كنت غير نشط وسيتم تسجيل خروجك تلقائيًا في', + renewSession: 'جدد الآن لحفظ عملك', + }, + login: { + greeting0: 'مرحبًا! بداية أسبوع مثمرة مع Umbraco!', + greeting1: 'مرحبًا! يوم ثلاثاء إبداعي في Umbraco!', + greeting2: 'مرحبًا! يوم أربعاء موفق في إدارة محتواك!', + greeting3: 'مرحبًا! يوم خميس مليء بالإنجازات مع Umbraco!', + greeting4: 'مرحبًا! إنه يوم جمعة رائع لإدارة محتوى موقعك!', + greeting5: 'مرحبًا! عطلة نهاية أسبوع سعيدة مع Umbraco!', + greeting6: 'مرحبًا! يوم أحد جديد، فرص جديدة في Umbraco!', + instruction: 'سجل الدخول إلى Umbraco', + signInWith: 'سجل الدخول باستخدام {0}', + timeout: 'انتهت جلستك. يرجى تسجيل الدخول مرة أخرى أدناه.', + }, + main: { + dashboard: 'لوحة التحكم', + sections: 'الأقسام', + tree: 'المحتوى', + }, + moveOrCopy: { + choose: 'اختر الصفحة أعلاه...', + copyDone: '%0% تم نسخه إلى %1%', + copyTo: 'حدد المكان الذي يجب نسخ الوثيقة %0% إليه أدناه', + moveDone: '%0% تم نقله إلى %1%', + moveTo: 'حدد المكان الذي يجب نقل الوثيقة %0% إليه أدناه', + nodeSelected: "تم تحديده كجذر لمحتواك الجديد، انقر على 'موافق' أدناه.", + noNodeSelected: "لم يتم تحديد أي عقدة بعد، يرجى تحديد عقدة في القائمة أعلاه قبل النقر على 'موافق'", + notAllowedByContentType: 'العقدة الحالية غير مسموح بها تحت العقدة المحددة بسبب نوعها', + notAllowedByPath: 'لا يمكن نقل العقدة الحالية إلى إحدى صفحاتها الفرعية، ولا يمكن أن تكون الوالد والوجهة هي نفسها', + notAllowedAtRoot: 'لا يمكن أن توجد العقدة الحالية في الجذر', + notValid: 'لا يُسمح بالإجراء نظرًا لأن لديك أذونات غير كافية على 1 أو أكثر من الوثيقة الفرعية.\n', + relateToOriginal: 'ربط العناصر المنسوخة بالأصل', + }, + notifications: { + editNotifications: 'حدد إشعارك لـ %0%', + notificationsSavedFor: 'تم حفظ إعدادات الإشعارات لـ', + notifications: 'الإشعارات', + }, + packager: { + actions: 'إجراءات', + created: 'أنشئ', + createPackage: 'إنشاء حزمة', + chooseLocalPackageText: + '\n اختر حزمة من جهازك، بالنقر على زر تصفح
\n وتحديد الحزمة. عادةً ما تحتوي حزم Umbraco على امتداد ".umb" أو ".zip".\n ', + deletewarning: 'سيؤدي ذلك إلى حذف الحزمة', + includeAllChildNodes: 'تضمين جميع العقد الفرعية', + installed: 'مثبتة', + installedPackages: 'الحزم المثبتة', + installInstructions: 'تعليمات التثبيت', + noConfigurationView: 'لا تحتوي هذه الحزمة على عرض تكوين', + noPackagesCreated: 'لم يتم إنشاء أي حزم بعد', + noPackages: 'لم يتم تثبيت أي حزم', + noPackagesDescription: "تصفح الحزم المتاحة باستخدام أيقونة 'الحزم' في أعلى يمين الشاشة", + packageContent: 'محتوى الحزمة', + packageLicense: 'الرخصة', + packageSearch: 'البحث عن الحزم', + packageSearchResults: 'نتائج البحث عن', + packageNoResults: 'لم نجد شيئًا لـ', + packageNoResultsDescription: 'يرجى محاولة البحث عن حزمة أخرى أو تصفح الفئات\n', + packagesPopular: 'الأكثر شيوعًا', + packagesPromoted: 'مروج لها', + packagesNew: 'الإصدارات الجديدة', + packageHas: 'لديه', + packageKarmaPoints: 'نقاط الكارما', + packageInfo: 'معلومات', + packageOwner: 'المالك', + packageContrib: 'المساهمون', + packageCreated: 'أنشئ', + packageCurrentVersion: 'الإصدار الحالي', + packageNetVersion: 'إصدار .NET', + packageDownloads: 'التنزيلات', + packageLikes: 'الإعجابات', + packageCompatibility: 'التوافق', + packageCompatibilityDescription: + 'تكون هذه الحزمة متوافقة مع الإصدارات التالية من Umbraco، حسب\n ما أبلغ عنه أعضاء المجتمع. لا يمكن ضمان التوافق الكامل للإصدارات المبلغ عنها أقل من 100%\n ', + packageExternalSources: 'المصادر الخارجية', + packageAuthor: 'المؤلف', + packageDocumentation: 'الوثائق', + packageMetaData: 'بيانات الحزمة', + packageName: 'اسم الحزمة', + packageNoItemsHeader: 'لا تحتوي الحزمة على أي عناصر', + packageNoItemsText: + 'لا تحتوي هذه الحزمة على أي عناصر لإلغاء التثبيت.

\n يمكنك إزالة هذا بأمان من النظام بالنقر على "إلغاء تثبيت الحزمة" أدناه.', + packageOptions: 'خيارات الحزمة', + packageMigrationsRun: 'تشغيل ترحيلات الحزمة المعلقة', + packageMigrationsComplete: 'تم إكمال ترحيلات الحزمة بنجاح.', + packageMigrationsNonePending: 'تم إكمال جميع ترحيلات الحزمة بنجاح.', + packageReadme: 'ملف README الخاص بالحزمة', + packageRepository: 'مستودع الحزمة', + packageUninstallConfirm: 'تأكيد إلغاء تثبيت الحزمة', + packageUninstalledHeader: 'تم إلغاء تثبيت الحزمة', + packageUninstalledText: 'تم إلغاء تثبيت الحزمة بنجاح', + packageUninstallHeader: 'إلغاء تثبيت الحزمة', + packageUninstallText: + 'يمكنك إلغاء تحديد العناصر التي لا ترغب في إزالتها في الوقت الحالي أدناه. عند النقر على "تأكيد الإلغاء"، ستتم إزالة جميع العناصر المحددة.
\n ملاحظة: أي مستندات أو وسائط تعتمد على العناصر التي تقوم بإزالتها، ستتوقف عن العمل، وقد يؤدي ذلك إلى عدم استقرار النظام، لذا قم بإلغاء التثبيت بحذر. إذا كان لديك أي شكوك، اتصل بمؤلف الحزمة.', + packageVersion: 'إصدار الحزمة', + verifiedToWorkOnUmbracoCloud: 'تم التحقق من عمله على Umbraco Cloud', + }, paste: { - doNothing: 'الصق مع التنسيق الكامل (غير موصى به)', - errorMessage: "النص الذي تحاول لصقه يحتوي على أحرف خاصة أو تنسيق. قد يكون ذلك بسبب نسخ النص من Microsoft Word. يمكن لـ Umbraco إزالة الأحرف الخاصة أو التنسيق تلقائيًا، بحيث يكون المحتوى الملصق أكثر ملاءمة للويب.\n", - removeAll: 'الصق كـ نص خام بدون أي تنسيق على الإطلاق', - removeSpecialFormattering: 'الصق، ولكن قم بإزالة التنسيق (موصى به)', - }, - publicAccess: { - paGroups: 'حماية قائمة على المجموعة', - paGroupsHelp: 'إذا كنت ترغب في منح الوصول إلى جميع أعضاء مجموعات الأعضاء المحددة', - paGroupsNoGroups: 'تحتاج إلى إنشاء مجموعة أعضاء قبل أن تتمكن من استخدام المصادقة القائمة على المجموعة', - paErrorPage: 'صفحة الخطأ', - paErrorPageHelp: 'تستخدم عندما يكون الأشخاص مسجلين الدخول، ولكن ليس لديهم وصول', - paHowWould: 'اختر كيفية تقييد الوصول إلى الصفحة %0%', - paIsProtected: '%0% محمية الآن', - paIsRemoved: 'تمت إزالة الحماية من %0%', - paLoginPage: 'صفحة تسجيل الدخول', - paLoginPageHelp: 'اختر الصفحة التي تحتوي على نموذج تسجيل الدخول', - paRemoveProtection: 'إزالة الحماية...', - paRemoveProtectionConfirm: 'هل أنت متأكد أنك تريد إزالة الحماية من الصفحة %0%؟', - paSelectPages: 'اختر الصفحات التي تحتوي على نموذج تسجيل الدخول ورسائل الخطأ', - paSelectGroups: 'اختر المجموعات التي لديها وصول إلى الصفحة %0%', - paSelectMembers: 'اختر الأعضاء الذين لديهم وصول إلى الصفحة %0%', - paMembers: 'حماية الأعضاء المحددين', - paMembersHelp: 'إذا كنت ترغب في منح الوصول إلى أعضاء محددين', - }, - publish: { - invalidPublishBranchPermissions: 'أذونات المستخدم غير كافية لنشر جميع الوثائق التابعة', - contentPublishedFailedIsTrashed: '\n %0% لم يتم نشره لأن العنصر في سلة المهملات.\n ', - contentPublishedFailedAwaitingRelease: '\n %0% لم يتم نشره لأن العنصر مجدول للإصدار.\n ', - contentPublishedFailedExpired: '\n %0% لم يتم نشره لأن العنصر منتهي الصلاحية.\n ', - contentPublishedFailedInvalid: '\n %0% لم يتم نشره لأن بعض الخصائص لم تتجاوز قواعد التحقق.\n ', - contentPublishedFailedByEvent: '\n %0% لم يتم نشره، ألغى ملحق طرف ثالث الإجراء.\n ', - contentPublishedFailedByParent: '\n %0% لا يمكن نشره، لأن صفحة الوالد غير منشورة.\n ', - contentPublishedFailedByMissingName: '%0% لا يمكن نشره، لأنه يفتقر إلى اسم.', - contentPublishedFailedReqCultureValidationError: "فشل التحقق من اللغة المطلوبة '%0%'. تم حفظ هذه اللغة ولكن لم يتم نشرها.\n", - inProgress: 'النشر جارٍ - يرجى الانتظار...', - inProgressCounter: '%0% من أصل %1% صفحات تم نشرها...', - nodePublish: '%0% تم نشره', - nodePublishAll: '%0% والصفحات الفرعية تم نشرها', - publishAll: 'نشر %0% وجميع الصفحات الفرعية الخاصة به', - publishHelp: 'انقر على نشر لنشر %0% وجعل محتواه متاحًا علنًا.

\n يمكنك نشر هذه الصفحة وجميع صفحاتها الفرعية عن طريق تحديد تضمين الصفحات الفرعية غير المنشورة أدناه.\n ', - }, - colorpicker: { - noColors: 'لم تقم بتكوين أي ألوان معتمدة', - }, - contentPicker: { - allowedItemTypes: 'يمكنك فقط اختيار العناصر من النوع(s): %0%', - defineDynamicRoot: 'حدد الجذر', - defineRootNode: 'اختر جذر العقدة', - pickedTrashedItem: 'لقد اخترت عنصر محتوى محذوف حاليًا أو في سلة المهملات', - pickedTrashedItems: 'لقد اخترت عناصر محتوى محذوفة حاليًا أو في سلة المهملات', - }, - dynamicRoot: { - configurationTitle: 'استعلام الجذر الديناميكي', - pickDynamicRootOriginTitle: 'اختر الأصل', - pickDynamicRootOriginDesc: 'حدد الأصل لاستعلام الجذر الديناميكي الخاص بك', - originRootTitle: 'الجذر', - originRootDesc: 'العقدة الجذرية لجلسة التحرير هذه', - originParentTitle: 'الوالد', - originParentDesc: 'العقدة الأم للمصدر في جلسة التحرير هذه', - originCurrentTitle: 'الحالي', - originCurrentDesc: 'عقدة المحتوى التي هي المصدر لجلسة التحرير هذه', - originSiteTitle: 'الموقع', - originSiteDesc: 'ابحث عن أقرب عقدة بها اسم مضيف', - originByKeyTitle: 'عقدة محددة', - originByKeyDesc: 'اختر عقدة محددة كأصل لهذا الاستعلام', - pickDynamicRootQueryStepTitle: 'أضف خطوة إلى الاستعلام', - pickDynamicRootQueryStepDesc: 'حدد الخطوة التالية لاستعلام الجذر الديناميكي الخاص بك', - queryStepNearestAncestorOrSelfTitle: 'أقرب سلف أو نفس', - queryStepNearestAncestorOrSelfDesc: 'استعلام أقرب سلف أو نفس يتطابق مع أحد الأنواع المكونة', - queryStepFurthestAncestorOrSelfTitle: 'أبعد سلف أو نفس', - queryStepFurthestAncestorOrSelfDesc: 'استعلام أبعد سلف أو نفس يتطابق مع أحد الأنواع المكونة', - queryStepNearestDescendantOrSelfTitle: 'أقرب نسل أو نفس', - queryStepNearestDescendantOrSelfDesc: 'استعلام أقرب نسل أو نفس يتطابق مع أحد الأنواع المكونة', - queryStepFurthestDescendantOrSelfTitle: 'أبعد نسل أو نفس', - queryStepFurthestDescendantOrSelfDesc: 'استعلام أبعد نسل أو نفس يتطابق مع أحد الأنواع المكونة', - queryStepCustomTitle: 'مخصص', - queryStepCustomDesc: 'استعلام باستخدام خطوة استعلام مخصصة', - addQueryStep: 'إضافة خطوة استعلام', - queryStepTypes: 'التي تتطابق مع الأنواع: ', - noValidStartNodeTitle: 'لا توجد محتويات متطابقة', - noValidStartNodeDesc: 'تكوين هذه الخاصية لا يتطابق مع أي محتوى. أنشئ المحتوى المفقود أو اتصل بمسؤولك لضبط إعدادات الجذر الديناميكي لهذه الخاصية.', - }, - mediaPicker: { - deletedItem: 'عنصر محذوف', - pickedTrashedItem: 'لقد اخترت عنصر وسائط محذوف حاليًا أو في سلة المهملات', - pickedTrashedItems: 'لقد اخترت عناصر وسائط محذوفة حاليًا أو في سلة المهملات', - trashed: 'محذوف', - openMedia: 'افتح في مكتبة الوسائط', - changeMedia: 'تغيير عنصر الوسائط', - editMediaEntryLabel: 'تحرير %0% على %1%', - confirmCancelMediaEntryCreationHeadline: 'تجاهل الإنشاء؟', - confirmCancelMediaEntryCreationMessage: 'هل أنت متأكد أنك تريد إلغاء الإنشاء.', - confirmCancelMediaEntryHasChanges: 'لقد أجريت تغييرات على هذا المحتوى. هل أنت متأكد أنك تريد\n تجاهلها؟\n ', - confirmRemoveAllMediaEntryMessage: 'إزالة جميع الوسائط؟', - tabClipboard: 'الحافظة', - notAllowed: 'غير مسموح', - openMediaPicker: 'افتح محدد الوسائط', - }, - propertyEditorPicker: { - title: 'اختر محرر الخصائص', - openPropertyEditorPicker: 'اختر واجهة مستخدم محرر الخصائص', - }, - relatedlinks: { - enterExternal: 'أدخل رابط خارجي', - chooseInternal: 'اختر صفحة داخلية', - caption: 'التسمية التوضيحية', - link: 'رابط', - newWindow: 'فتح في نافذة جديدة', - captionPlaceholder: 'أدخل التسمية التوضيحية للعرض', - externalLinkPlaceholder: 'أدخل الرابط', - }, - imagecropper: { - reset: 'إعادة تعيين', - updateEditCrop: 'تم', - undoEditCrop: 'تراجع عن التعديلات', - customCrop: 'مخصص', - }, - rollback: { - changes: 'التغييرات', - created: 'أنشئ', - headline: 'اختر إصدارًا للمقارنة مع الإصدار الحالي', - currentVersion: 'الإصدار الحالي', - diffHelp: 'يظهر هذا الاختلافات بين الإصدار الحالي (المسودة) والإصدار المحدد
النص الأحمر سيتم حذفه في الإصدار المحدد، النص الأخضر سيتم إضافته', - noDiff: 'لا توجد اختلافات بين الإصدار الحالي (المسودة) والإصدار المحدد', - documentRolledBack: 'تمت استعادة الوثيقة', - htmlHelp: 'يعرض هذا الإصدار المحدد كـ HTML، إذا كنت ترغب في رؤية الفرق بين إصدارين في نفس الوقت، استخدم عرض الفرق\n ', - rollbackTo: 'استعادة إلى', - selectVersion: 'اختر الإصدار', - view: 'عرض', - pagination: 'عرض الإصدار %0% إلى %1% من %2% إصدارات', - versions: 'الإصدارات', - currentDraftVersion: 'الإصدار الحالي المسودة', - currentPublishedVersion: 'الإصدار الحالي المنشور', - }, - scripts: { - editscript: 'تحرير ملف السكربت', - }, - sections: { - content: 'المحتوى', - media: 'الوسائط', - member: 'الأعضاء', - packages: 'الحزم', - marketplace: 'السوق', - settings: 'الإعدادات', - translation: 'القاموس', - users: 'المستخدمون', - }, + doNothing: 'الصق مع التنسيق الكامل (غير موصى به)', + errorMessage: + 'النص الذي تحاول لصقه يحتوي على أحرف خاصة أو تنسيق. قد يكون ذلك بسبب نسخ النص من Microsoft Word. يمكن لـ Umbraco إزالة الأحرف الخاصة أو التنسيق تلقائيًا، بحيث يكون المحتوى الملصق أكثر ملاءمة للويب.\n', + removeAll: 'الصق كـ نص خام بدون أي تنسيق على الإطلاق', + removeSpecialFormattering: 'الصق، ولكن قم بإزالة التنسيق (موصى به)', + }, + publicAccess: { + paGroups: 'حماية قائمة على المجموعة', + paGroupsHelp: 'إذا كنت ترغب في منح الوصول إلى جميع أعضاء مجموعات الأعضاء المحددة', + paGroupsNoGroups: 'تحتاج إلى إنشاء مجموعة أعضاء قبل أن تتمكن من استخدام المصادقة القائمة على المجموعة', + paErrorPage: 'صفحة الخطأ', + paErrorPageHelp: 'تستخدم عندما يكون الأشخاص مسجلين الدخول، ولكن ليس لديهم وصول', + paHowWould: 'اختر كيفية تقييد الوصول إلى الصفحة %0%', + paIsProtected: '%0% محمية الآن', + paIsRemoved: 'تمت إزالة الحماية من %0%', + paLoginPage: 'صفحة تسجيل الدخول', + paLoginPageHelp: 'اختر الصفحة التي تحتوي على نموذج تسجيل الدخول', + paRemoveProtection: 'إزالة الحماية...', + paRemoveProtectionConfirm: 'هل أنت متأكد أنك تريد إزالة الحماية من الصفحة %0%؟', + paSelectPages: 'اختر الصفحات التي تحتوي على نموذج تسجيل الدخول ورسائل الخطأ', + paSelectGroups: 'اختر المجموعات التي لديها وصول إلى الصفحة %0%', + paSelectMembers: 'اختر الأعضاء الذين لديهم وصول إلى الصفحة %0%', + paMembers: 'حماية الأعضاء المحددين', + paMembersHelp: 'إذا كنت ترغب في منح الوصول إلى أعضاء محددين', + }, + publish: { + invalidPublishBranchPermissions: 'أذونات المستخدم غير كافية لنشر جميع الوثائق التابعة', + contentPublishedFailedIsTrashed: '\n %0% لم يتم نشره لأن العنصر في سلة المهملات.\n ', + contentPublishedFailedAwaitingRelease: '\n %0% لم يتم نشره لأن العنصر مجدول للإصدار.\n ', + contentPublishedFailedExpired: '\n %0% لم يتم نشره لأن العنصر منتهي الصلاحية.\n ', + contentPublishedFailedInvalid: '\n %0% لم يتم نشره لأن بعض الخصائص لم تتجاوز قواعد التحقق.\n ', + contentPublishedFailedByEvent: '\n %0% لم يتم نشره، ألغى ملحق طرف ثالث الإجراء.\n ', + contentPublishedFailedByParent: '\n %0% لا يمكن نشره، لأن صفحة الوالد غير منشورة.\n ', + contentPublishedFailedByMissingName: '%0% لا يمكن نشره، لأنه يفتقر إلى اسم.', + contentPublishedFailedReqCultureValidationError: + "فشل التحقق من اللغة المطلوبة '%0%'. تم حفظ هذه اللغة ولكن لم يتم نشرها.\n", + inProgress: 'النشر جارٍ - يرجى الانتظار...', + inProgressCounter: '%0% من أصل %1% صفحات تم نشرها...', + nodePublish: '%0% تم نشره', + nodePublishAll: '%0% والصفحات الفرعية تم نشرها', + publishAll: 'نشر %0% وجميع الصفحات الفرعية الخاصة به', + publishHelp: + 'انقر على نشر لنشر %0% وجعل محتواه متاحًا علنًا.

\n يمكنك نشر هذه الصفحة وجميع صفحاتها الفرعية عن طريق تحديد تضمين الصفحات الفرعية غير المنشورة أدناه.\n ', + }, + colorpicker: { + noColors: 'لم تقم بتكوين أي ألوان معتمدة', + }, + contentPicker: { + allowedItemTypes: 'يمكنك فقط اختيار العناصر من النوع(s): %0%', + defineDynamicRoot: 'حدد الجذر', + defineRootNode: 'اختر جذر العقدة', + pickedTrashedItem: 'لقد اخترت عنصر محتوى محذوف حاليًا أو في سلة المهملات', + pickedTrashedItems: 'لقد اخترت عناصر محتوى محذوفة حاليًا أو في سلة المهملات', + }, + dynamicRoot: { + configurationTitle: 'استعلام الجذر الديناميكي', + pickDynamicRootOriginTitle: 'اختر الأصل', + pickDynamicRootOriginDesc: 'حدد الأصل لاستعلام الجذر الديناميكي الخاص بك', + originRootTitle: 'الجذر', + originRootDesc: 'العقدة الجذرية لجلسة التحرير هذه', + originParentTitle: 'الوالد', + originParentDesc: 'العقدة الأم للمصدر في جلسة التحرير هذه', + originCurrentTitle: 'الحالي', + originCurrentDesc: 'عقدة المحتوى التي هي المصدر لجلسة التحرير هذه', + originSiteTitle: 'الموقع', + originSiteDesc: 'ابحث عن أقرب عقدة بها اسم مضيف', + originByKeyTitle: 'عقدة محددة', + originByKeyDesc: 'اختر عقدة محددة كأصل لهذا الاستعلام', + pickDynamicRootQueryStepTitle: 'أضف خطوة إلى الاستعلام', + pickDynamicRootQueryStepDesc: 'حدد الخطوة التالية لاستعلام الجذر الديناميكي الخاص بك', + queryStepNearestAncestorOrSelfTitle: 'أقرب سلف أو نفس', + queryStepNearestAncestorOrSelfDesc: 'استعلام أقرب سلف أو نفس يتطابق مع أحد الأنواع المكونة', + queryStepFurthestAncestorOrSelfTitle: 'أبعد سلف أو نفس', + queryStepFurthestAncestorOrSelfDesc: 'استعلام أبعد سلف أو نفس يتطابق مع أحد الأنواع المكونة', + queryStepNearestDescendantOrSelfTitle: 'أقرب نسل أو نفس', + queryStepNearestDescendantOrSelfDesc: 'استعلام أقرب نسل أو نفس يتطابق مع أحد الأنواع المكونة', + queryStepFurthestDescendantOrSelfTitle: 'أبعد نسل أو نفس', + queryStepFurthestDescendantOrSelfDesc: 'استعلام أبعد نسل أو نفس يتطابق مع أحد الأنواع المكونة', + queryStepCustomTitle: 'مخصص', + queryStepCustomDesc: 'استعلام باستخدام خطوة استعلام مخصصة', + addQueryStep: 'إضافة خطوة استعلام', + queryStepTypes: 'التي تتطابق مع الأنواع: ', + noValidStartNodeTitle: 'لا توجد محتويات متطابقة', + noValidStartNodeDesc: + 'تكوين هذه الخاصية لا يتطابق مع أي محتوى. أنشئ المحتوى المفقود أو اتصل بمسؤولك لضبط إعدادات الجذر الديناميكي لهذه الخاصية.', + }, + mediaPicker: { + deletedItem: 'عنصر محذوف', + pickedTrashedItem: 'لقد اخترت عنصر وسائط محذوف حاليًا أو في سلة المهملات', + pickedTrashedItems: 'لقد اخترت عناصر وسائط محذوفة حاليًا أو في سلة المهملات', + trashed: 'محذوف', + openMedia: 'افتح في مكتبة الوسائط', + changeMedia: 'تغيير عنصر الوسائط', + editMediaEntryLabel: 'تحرير %0% على %1%', + confirmCancelMediaEntryCreationHeadline: 'تجاهل الإنشاء؟', + confirmCancelMediaEntryCreationMessage: 'هل أنت متأكد أنك تريد إلغاء الإنشاء.', + confirmCancelMediaEntryHasChanges: 'لقد أجريت تغييرات على هذا المحتوى. هل أنت متأكد أنك تريد\n تجاهلها؟\n ', + confirmRemoveAllMediaEntryMessage: 'إزالة جميع الوسائط؟', + tabClipboard: 'الحافظة', + notAllowed: 'غير مسموح', + openMediaPicker: 'افتح محدد الوسائط', + }, + propertyEditorPicker: { + title: 'اختر محرر الخصائص', + openPropertyEditorPicker: 'اختر واجهة مستخدم محرر الخصائص', + }, + relatedlinks: { + enterExternal: 'أدخل رابط خارجي', + chooseInternal: 'اختر صفحة داخلية', + caption: 'التسمية التوضيحية', + link: 'رابط', + newWindow: 'فتح في نافذة جديدة', + captionPlaceholder: 'أدخل التسمية التوضيحية للعرض', + externalLinkPlaceholder: 'أدخل الرابط', + }, + imagecropper: { + reset: 'إعادة تعيين', + updateEditCrop: 'تم', + undoEditCrop: 'تراجع عن التعديلات', + customCrop: 'مخصص', + }, + rollback: { + changes: 'التغييرات', + created: 'أنشئ', + headline: 'اختر إصدارًا للمقارنة مع الإصدار الحالي', + currentVersion: 'الإصدار الحالي', + diffHelp: + 'يظهر هذا الاختلافات بين الإصدار الحالي (المسودة) والإصدار المحدد
النص الأحمر سيتم حذفه في الإصدار المحدد، النص الأخضر سيتم إضافته', + noDiff: 'لا توجد اختلافات بين الإصدار الحالي (المسودة) والإصدار المحدد', + documentRolledBack: 'تمت استعادة الوثيقة', + htmlHelp: + 'يعرض هذا الإصدار المحدد كـ HTML، إذا كنت ترغب في رؤية الفرق بين إصدارين في نفس الوقت، استخدم عرض الفرق\n ', + rollbackTo: 'استعادة إلى', + selectVersion: 'اختر الإصدار', + view: 'عرض', + pagination: 'عرض الإصدار %0% إلى %1% من %2% إصدارات', + versions: 'الإصدارات', + currentDraftVersion: 'الإصدار الحالي المسودة', + currentPublishedVersion: 'الإصدار الحالي المنشور', + }, + scripts: { + editscript: 'تحرير ملف السكربت', + }, + sections: { + content: 'المحتوى', + media: 'الوسائط', + member: 'الأعضاء', + packages: 'الحزم', + marketplace: 'السوق', + settings: 'الإعدادات', + translation: 'القاموس', + users: 'المستخدمون', + }, help: { - tours: 'الجولات', - theBestUmbracoVideoTutorials: 'أفضل دروس الفيديو في Umbraco', - umbracoForum: 'زيارة our.umbraco.com', - umbracoTv: 'زيارة umbraco.tv', - umbracoLearningBase: 'شاهد دروس الفيديو المجانية لدينا', - umbracoLearningBaseDescription: 'على قاعدة تعلم Umbraco', - }, - settings: { - defaulttemplate: 'القالب الافتراضي', - importDocumentTypeHelp: 'للاستيراد نوع الوثيقة ابحث عن ملف ".udt" على جهاز الكمبيوتر الخاص بك بالنقر على زر "استيراد" (سيُطلب منك تأكيد ذلك في الشاشة التالية)', - newtabname: 'عنوان التبويب الجديد', - nodetype: 'نوع العقدة', - objecttype: 'النوع', - stylesheet: 'ورقة الأنماط', - script: 'السكريبت', - tab: 'التبويب', - tabname: 'عنوان التبويب', - tabs: 'التبويبات', - contentTypeEnabled: 'نوع المحتوى الرئيسي مفعل', - contentTypeUses: 'هذا النوع من المحتوى يستخدم', - noPropertiesDefinedOnTab: 'لا توجد خصائص محددة على هذا التبويب. انقر على رابط "إضافة خاصية جديدة" في الأعلى لإنشاء خاصية جديدة.', - createMatchingTemplate: 'إنشاء قالب مطابق', - addIcon: 'إضافة أيقونة', - }, - sort: { - sortOrder: 'ترتيب الفرز', - sortCreationDate: 'تاريخ الإنشاء', - sortDone: 'تمت عملية الفرز.', - sortHelp: 'اسحب العناصر المختلفة لأعلى أو لأسفل أدناه لتحديد كيفية ترتيبها. أو انقر على رؤوس الأعمدة لفرز جميع العناصر.', - sortPleaseWait: 'يرجى الانتظار. يتم فرز العناصر، قد يستغرق ذلك بعض الوقت.', - sortEmptyState: 'لا تحتوي هذه العقدة على عقدة فرعية لفرزها', - }, - speechBubbles: { - validationFailedHeader: 'التحقق', - validationFailedMessage: 'يجب إصلاح أخطاء التحقق قبل أن يمكن حفظ العنصر', - operationFailedHeader: 'فشل', - operationSavedHeader: 'تم الحفظ', - operationSavedHeaderReloadUser: 'تم الحفظ. لعرض التغييرات، يرجى إعادة تحميل متصفحك', - invalidUserPermissionsText: 'أذونات المستخدم غير كافية، لم نتمكن من إتمام العملية', - operationCancelledHeader: 'ملغي', - operationCancelledText: 'تم إلغاء العملية بواسطة ملحق طرف ثالث', - folderUploadNotAllowed: 'يتم تحميل هذا الملف كجزء من مجلد، ولكن إنشاء مجلد جديد غير مسموح هنا', - folderCreationNotAllowed: 'إنشاء مجلد جديد غير مسموح هنا', - contentTypeDublicatePropertyType: 'نوع الخاصية موجود بالفعل', - contentTypePropertyTypeCreated: 'تم إنشاء نوع الخاصية', - contentTypePropertyTypeCreatedText: 'الاسم: %0%
نوع البيانات: %1%', - contentTypePropertyTypeDeleted: 'تم حذف نوع الخاصية', - contentTypeSavedHeader: 'تم حفظ نوع الوثيقة', - contentTypeTabCreated: 'تم إنشاء التبويب', - contentTypeTabDeleted: 'تم حذف التبويب', - contentTypeTabDeletedText: 'تم حذف التبويب بالمعرف: %0%', - cssErrorHeader: 'لم يتم حفظ ورقة الأنماط', - cssSavedHeader: 'تم حفظ ورقة الأنماط', - cssSavedText: 'تم حفظ ورقة الأنماط بدون أي أخطاء', - dataTypeSaved: 'تم حفظ نوع البيانات', - dictionaryItemSaved: 'تم حفظ عنصر القاموس', - editContentPublishedHeader: 'تم نشر المحتوى', - editContentPublishedText: 'وهو مرئي على الموقع', - editMultiContentPublishedText: 'تم نشر %0% مستندات وهي مرئية على الموقع', - editVariantPublishedText: '%0% تم نشره وهو مرئي على الموقع', - editMultiVariantPublishedText: '%0% مستندات تم نشرها للغات %1% وهي مرئية على الموقع', - editBlueprintSavedHeader: 'تم حفظ مخطط الوثيقة', - editBlueprintSavedText: 'تم حفظ التغييرات بنجاح', - editContentSavedHeader: 'تم حفظ المحتوى', - editContentSavedText: 'تذكر النشر لجعل التغييرات مرئية', - editContentScheduledSavedText: 'تم تحديث جدول النشر', - editVariantSavedText: '%0% تم حفظه', - editContentSendToPublish: 'تم إرسالها للموافقة', - editContentSendToPublishText: 'تم إرسال التغييرات للموافقة', - editVariantSendToPublishText: '%0% تغييرات تم إرسالها للموافقة', - editMediaSaved: 'تم حفظ الوسائط', - editMediaSavedText: 'تم حفظ الوسائط بدون أي أخطاء', - editMemberSaved: 'تم حفظ العضو', - editStylesheetPropertySaved: 'تم حفظ خاصية ورقة الأنماط', - editStylesheetSaved: 'تم حفظ ورقة الأنماط', - editTemplateSaved: 'تم حفظ القالب', - editUserError: 'حدث خطأ عند حفظ المستخدم (تحقق من السجل)', - editUserSaved: 'تم حفظ المستخدم', - editUserTypeSaved: 'تم حفظ نوع المستخدم', - editUserGroupSaved: 'تم حفظ مجموعة المستخدمين', - editCulturesAndHostnamesSaved: 'تم حفظ الثقافات وأسماء المضيفين', - editCulturesAndHostnamesError: 'حدث خطأ عند حفظ الثقافات وأسماء المضيفين', - fileErrorHeader: 'لم يتم حفظ الملف', - fileErrorText: 'لم يتم حفظ الملف. يرجى التحقق من أذونات الملف', - fileSavedHeader: 'تم حفظ الملف', - fileSavedText: 'تم حفظ الملف بدون أي أخطاء', - languageSaved: 'تم حفظ اللغة', - mediaTypeSavedHeader: 'تم حفظ نوع الوسائط', - memberTypeSavedHeader: 'تم حفظ نوع العضو', - memberGroupSavedHeader: 'تم حفظ مجموعة الأعضاء', - memberGroupNameDuplicate: 'مجموعة أعضاء أخرى بنفس الاسم موجودة بالفعل', - templateErrorHeader: 'لم يتم حفظ القالب', - templateErrorText: 'يرجى التأكد من عدم وجود قالبين بنفس الاسم المستعار', - templateSavedHeader: 'تم حفظ القالب', - templateSavedText: 'تم حفظ القالب بدون أي أخطاء!', - contentUnpublished: 'تم إلغاء نشر المحتوى', - contentCultureUnpublished: 'تم إلغاء نشر التباين %0%', - contentMandatoryCultureUnpublished: "اللغة الإلزامية '%0%' تم إلغاء نشرها. جميع اللغات لهذا العنصر المحتوى أصبحت الآن غير منشورة.", - partialViewSavedHeader: 'تم حفظ العرض الجزئي', - partialViewSavedText: 'تم حفظ العرض الجزئي بدون أي أخطاء!', - partialViewErrorHeader: 'لم يتم حفظ العرض الجزئي', - partialViewErrorText: 'حدث خطأ أثناء حفظ الملف.', - permissionsSavedFor: 'تم حفظ الأذونات لـ', - deleteUserGroupsSuccess: 'تم حذف %0% مجموعات مستخدمين', - deleteUserGroupSuccess: '%0% تم حذفه', - enableUsersSuccess: 'تم تفعيل %0% مستخدمين', - disableUsersSuccess: 'تم تعطيل %0% مستخدمين', - enableUserSuccess: '%0% تم تفعيله الآن', - disableUserSuccess: '%0% تم تعطيله الآن', - setUserGroupOnUsersSuccess: 'تم تعيين مجموعات المستخدمين', - unlockUsersSuccess: 'تم فك قفل %0% مستخدمين', - unlockUserSuccess: '%0% تم فك قفله الآن', - memberExportedSuccess: 'تم تصدير العضو إلى ملف', - memberExportedError: 'حدث خطأ أثناء تصدير العضو', - deleteUserSuccess: 'تم حذف المستخدم %0%', - resendInviteHeader: 'دعوة المستخدم', - resendInviteSuccess: 'تم إعادة إرسال الدعوة إلى %0%', - contentReqCulturePublishError: "لا يمكن نشر الوثيقة لأن '%0%' المطلوب غير منشور", - contentCultureValidationError: "فشل التحقق من اللغة '%0%'", - documentTypeExportedSuccess: 'تم تصدير نوع الوثيقة إلى ملف', - documentTypeExportedError: 'حدث خطأ أثناء تصدير نوع الوثيقة', - dictionaryItemExportedSuccess: 'تم تصدير عنصر (عناصر) القاموس إلى ملف', - dictionaryItemExportedError: 'حدث خطأ أثناء تصدير عنصر (عناصر) القاموس', - dictionaryItemImported: 'تم استيراد عنصر (عناصر) القاموس التالية!', - scheduleErrReleaseDate1: 'تاريخ الإصدار لا يمكن أن يكون في الماضي', - scheduleErrReleaseDate2: "لا يمكن جدولة الوثيقة للنشر لأن '%0%' المطلوب غير منشور", - scheduleErrReleaseDate3: "لا يمكن جدولة الوثيقة للنشر لأن '%0%' المطلوب له تاريخ نشر لاحق من لغة غير إلزامية", - scheduleErrExpireDate1: 'تاريخ انتهاء الصلاحية لا يمكن أن يكون في الماضي', - scheduleErrExpireDate2: 'تاريخ انتهاء الصلاحية لا يمكن أن يكون قبل تاريخ الإصدار', - publishWithNoDomains: 'لم يتم تكوين النطاقات لموقع متعدد اللغات، يرجى الاتصال بالمسؤول، راجع السجل لمزيد من المعلومات', - publishWithMissingDomain: 'لا يوجد مجال مكون لـ %0%، يرجى الاتصال بالمسؤول، راجع السجل لمزيد من المعلومات', - preventCleanupEnableError: 'حدث خطأ أثناء تمكين تنظيف الإصدارات لـ %0%', - preventCleanupDisableError: 'حدث خطأ أثناء تعطيل تنظيف الإصدارات لـ %0%', - copySuccessMessage: 'تم نسخ معلومات النظام الخاصة بك بنجاح إلى الحافظة', - cannotCopyInformation: 'لم نتمكن من نسخ معلومات النظام الخاصة بك إلى الحافظة', - }, - stylesheet: { - addRule: 'إضافة نمط', - editRule: 'تعديل النمط', - editorRules: 'أنماط محرر النصوص الغني', - editorRulesHelp: 'حدد الأنماط التي يجب أن تكون متاحة في محرر النصوص الغني لهذه ورقة الأنماط', - editstylesheet: 'تعديل ورقة الأنماط', - editstylesheetproperty: 'تعديل خاصية ورقة الأنماط', - nameHelp: 'الاسم المعروض في قائمة اختيار الأنماط في المحرر', - preview: 'معاينة', - previewHelp: 'كيف سيبدو النص في محرر النصوص الغني.', - selector: 'المحدد', - selectorHelp: 'يستخدم بناء جملة CSS، على سبيل المثال "h1" أو ".redHeader"', - styles: 'الأنماط', - stylesHelp: 'CSS الذي يجب تطبيقه في محرر النصوص الغني، على سبيل المثال "color:red;"', - tabCode: 'الكود', - tabRules: 'محرر النصوص الغني', - }, - template: { - runtimeModeProduction: 'المحتوى غير قابل للتحرير عند استخدام وضع التشغيل Production.', - deleteByIdFailed: 'فشل في حذف القالب بالمعرف %0%', - edittemplate: 'تعديل القالب', - insertSections: 'الأقسام', - insertContentArea: 'إدراج منطقة المحتوى', - insertContentAreaPlaceHolder: 'إدراج عنصر نائبة لمنطقة المحتوى', - insert: 'إدراج', - insertDesc: 'اختر ما تريد إدراجه في قالبك', - insertDictionaryItem: 'عنصر القاموس', - insertDictionaryItemDesc: 'عنصر القاموس هو عنصر نائبة لنص قابل للترجمة، مما يسهل إنشاء تصميمات لمواقع متعددة اللغات.', - insertMacro: 'ماكرو', - insertMacroDesc: 'ماكرو هو مكون قابل للتكوين رائع للأجزاء القابلة لإعادة الاستخدام من التصميم الخاص بك، حيث تحتاج إلى خيار لتوفير معلمات، مثل المعارض والنماذج والقوائم.', - insertPageField: 'القيمة', - insertPageFieldDesc: 'يعرض قيمة حقل مسمى من الصفحة الحالية، مع خيارات لتعديل القيمة أو الرجوع إلى القيم البديلة.', - insertPartialView: 'عرض جزئي', - insertPartialViewDesc: 'العرض الجزئي هو ملف قالب منفصل يمكن عرضه داخل قالب آخر، وهو رائع لإعادة استخدام الترميز أو لفصل القوالب المعقدة إلى ملفات منفصلة.', - mastertemplate: 'القالب الرئيسي', - noMaster: 'لا يوجد رئيسي', - renderBody: 'عرض القالب الفرعي', - renderBodyDesc: 'يعرض محتويات القالب الفرعي، من خلال إدراج عنصر نائبة @RenderBody().', - defineSection: 'تحديد قسم مسمى', - defineSectionDesc: 'يحدد جزء من القالب كقسم مسمى عن طريق لفه في @section { ... }. يمكن عرض هذا في منطقة محددة من القالب الرئيسي لهذا القالب، باستخدام @RenderSection.', - renderSection: 'عرض قسم مسمى', - renderSectionDesc: 'يعرض منطقة مسمى من قالب فرعي، من خلال إدراج عنصر نائبة @RenderSection(name). هذا يعرض منطقة من قالب فرعي والتي يتم لفها في تعريف @section [name]{ ... } المقابل.', - sectionName: 'اسم القسم', - sectionMandatory: 'القسم إلزامي', - sectionMandatoryDesc: 'إذا كان إلزاميًا، يجب أن يحتوي القالب الفرعي على تعريف @section، خلاف ذلك يتم عرض خطأ.', - queryBuilder: 'باني الاستعلام', - itemsReturned: 'العناصر التي تم إرجاعها، في', - iWant: 'أريد', - allContent: 'جميع المحتويات', - contentOfType: 'محتوى من نوع "%0%"', - from: 'من', - websiteRoot: 'موقعي', - where: 'حيث', - and: 'و', - is: 'هو', - isNot: 'ليس', - before: 'قبل', - beforeIncDate: 'قبل (بما في ذلك التاريخ المحدد)', - after: 'بعد', - afterIncDate: 'بعد (بما في ذلك التاريخ المحدد)', - equals: 'يساوي', - doesNotEqual: 'لا يساوي', - contains: 'يحتوي على', - doesNotContain: 'لا يحتوي على', - greaterThan: 'أكبر من', - greaterThanEqual: 'أكبر من أو يساوي', - lessThan: 'أقل من', - lessThanEqual: 'أقل من أو يساوي', - id: 'المعرف', - name: 'الاسم', - createdDate: 'تاريخ الإنشاء', - lastUpdatedDate: 'تاريخ آخر تحديث', - orderBy: 'ترتيب حسب', - ascending: 'تصاعدي', - descending: 'تنازلي', - template: 'القالب', - }, + tours: 'الجولات', + theBestUmbracoVideoTutorials: 'أفضل دروس الفيديو في Umbraco', + umbracoForum: 'زيارة our.umbraco.com', + umbracoTv: 'زيارة umbraco.tv', + umbracoLearningBase: 'شاهد دروس الفيديو المجانية لدينا', + umbracoLearningBaseDescription: 'على قاعدة تعلم Umbraco', + }, + settings: { + defaulttemplate: 'القالب الافتراضي', + importDocumentTypeHelp: + 'للاستيراد نوع الوثيقة ابحث عن ملف ".udt" على جهاز الكمبيوتر الخاص بك بالنقر على زر "استيراد" (سيُطلب منك تأكيد ذلك في الشاشة التالية)', + newtabname: 'عنوان التبويب الجديد', + nodetype: 'نوع العقدة', + objecttype: 'النوع', + stylesheet: 'ورقة الأنماط', + script: 'السكريبت', + tab: 'التبويب', + tabname: 'عنوان التبويب', + tabs: 'التبويبات', + contentTypeEnabled: 'نوع المحتوى الرئيسي مفعل', + contentTypeUses: 'هذا النوع من المحتوى يستخدم', + noPropertiesDefinedOnTab: + 'لا توجد خصائص محددة على هذا التبويب. انقر على رابط "إضافة خاصية جديدة" في الأعلى لإنشاء خاصية جديدة.', + createMatchingTemplate: 'إنشاء قالب مطابق', + addIcon: 'إضافة أيقونة', + }, + sort: { + sortOrder: 'ترتيب الفرز', + sortCreationDate: 'تاريخ الإنشاء', + sortDone: 'تمت عملية الفرز.', + sortHelp: + 'اسحب العناصر المختلفة لأعلى أو لأسفل أدناه لتحديد كيفية ترتيبها. أو انقر على رؤوس الأعمدة لفرز جميع العناصر.', + sortPleaseWait: 'يرجى الانتظار. يتم فرز العناصر، قد يستغرق ذلك بعض الوقت.', + sortEmptyState: 'لا تحتوي هذه العقدة على عقدة فرعية لفرزها', + }, + speechBubbles: { + validationFailedHeader: 'التحقق', + validationFailedMessage: 'يجب إصلاح أخطاء التحقق قبل أن يمكن حفظ العنصر', + operationFailedHeader: 'فشل', + operationSavedHeader: 'تم الحفظ', + operationSavedHeaderReloadUser: 'تم الحفظ. لعرض التغييرات، يرجى إعادة تحميل متصفحك', + invalidUserPermissionsText: 'أذونات المستخدم غير كافية، لم نتمكن من إتمام العملية', + operationCancelledHeader: 'ملغي', + operationCancelledText: 'تم إلغاء العملية بواسطة ملحق طرف ثالث', + folderUploadNotAllowed: 'يتم تحميل هذا الملف كجزء من مجلد، ولكن إنشاء مجلد جديد غير مسموح هنا', + folderCreationNotAllowed: 'إنشاء مجلد جديد غير مسموح هنا', + contentTypeDublicatePropertyType: 'نوع الخاصية موجود بالفعل', + contentTypePropertyTypeCreated: 'تم إنشاء نوع الخاصية', + contentTypePropertyTypeCreatedText: 'الاسم: %0%
نوع البيانات: %1%', + contentTypePropertyTypeDeleted: 'تم حذف نوع الخاصية', + contentTypeSavedHeader: 'تم حفظ نوع الوثيقة', + contentTypeTabCreated: 'تم إنشاء التبويب', + contentTypeTabDeleted: 'تم حذف التبويب', + contentTypeTabDeletedText: 'تم حذف التبويب بالمعرف: %0%', + cssErrorHeader: 'لم يتم حفظ ورقة الأنماط', + cssSavedHeader: 'تم حفظ ورقة الأنماط', + cssSavedText: 'تم حفظ ورقة الأنماط بدون أي أخطاء', + dataTypeSaved: 'تم حفظ نوع البيانات', + dictionaryItemSaved: 'تم حفظ عنصر القاموس', + editContentPublishedHeader: 'تم نشر المحتوى', + editContentPublishedText: 'وهو مرئي على الموقع', + editMultiContentPublishedText: 'تم نشر %0% مستندات وهي مرئية على الموقع', + editVariantPublishedText: '%0% تم نشره وهو مرئي على الموقع', + editMultiVariantPublishedText: '%0% مستندات تم نشرها للغات %1% وهي مرئية على الموقع', + editBlueprintSavedHeader: 'تم حفظ مخطط الوثيقة', + editBlueprintSavedText: 'تم حفظ التغييرات بنجاح', + editContentSavedHeader: 'تم حفظ المحتوى', + editContentSavedText: 'تذكر النشر لجعل التغييرات مرئية', + editContentScheduledSavedText: 'تم تحديث جدول النشر', + editVariantSavedText: '%0% تم حفظه', + editContentSendToPublish: 'تم إرسالها للموافقة', + editContentSendToPublishText: 'تم إرسال التغييرات للموافقة', + editVariantSendToPublishText: '%0% تغييرات تم إرسالها للموافقة', + editMediaSaved: 'تم حفظ الوسائط', + editMediaSavedText: 'تم حفظ الوسائط بدون أي أخطاء', + editMemberSaved: 'تم حفظ العضو', + editStylesheetPropertySaved: 'تم حفظ خاصية ورقة الأنماط', + editStylesheetSaved: 'تم حفظ ورقة الأنماط', + editTemplateSaved: 'تم حفظ القالب', + editUserError: 'حدث خطأ عند حفظ المستخدم (تحقق من السجل)', + editUserSaved: 'تم حفظ المستخدم', + editUserTypeSaved: 'تم حفظ نوع المستخدم', + editUserGroupSaved: 'تم حفظ مجموعة المستخدمين', + editCulturesAndHostnamesSaved: 'تم حفظ الثقافات وأسماء المضيفين', + editCulturesAndHostnamesError: 'حدث خطأ عند حفظ الثقافات وأسماء المضيفين', + fileErrorHeader: 'لم يتم حفظ الملف', + fileErrorText: 'لم يتم حفظ الملف. يرجى التحقق من أذونات الملف', + fileSavedHeader: 'تم حفظ الملف', + fileSavedText: 'تم حفظ الملف بدون أي أخطاء', + languageSaved: 'تم حفظ اللغة', + mediaTypeSavedHeader: 'تم حفظ نوع الوسائط', + memberTypeSavedHeader: 'تم حفظ نوع العضو', + memberGroupSavedHeader: 'تم حفظ مجموعة الأعضاء', + memberGroupNameDuplicate: 'مجموعة أعضاء أخرى بنفس الاسم موجودة بالفعل', + templateErrorHeader: 'لم يتم حفظ القالب', + templateErrorText: 'يرجى التأكد من عدم وجود قالبين بنفس الاسم المستعار', + templateSavedHeader: 'تم حفظ القالب', + templateSavedText: 'تم حفظ القالب بدون أي أخطاء!', + contentUnpublished: 'تم إلغاء نشر المحتوى', + contentCultureUnpublished: 'تم إلغاء نشر التباين %0%', + contentMandatoryCultureUnpublished: + "اللغة الإلزامية '%0%' تم إلغاء نشرها. جميع اللغات لهذا العنصر المحتوى أصبحت الآن غير منشورة.", + partialViewSavedHeader: 'تم حفظ العرض الجزئي', + partialViewSavedText: 'تم حفظ العرض الجزئي بدون أي أخطاء!', + partialViewErrorHeader: 'لم يتم حفظ العرض الجزئي', + partialViewErrorText: 'حدث خطأ أثناء حفظ الملف.', + permissionsSavedFor: 'تم حفظ الأذونات لـ', + deleteUserGroupsSuccess: 'تم حذف %0% مجموعات مستخدمين', + deleteUserGroupSuccess: '%0% تم حذفه', + enableUsersSuccess: 'تم تفعيل %0% مستخدمين', + disableUsersSuccess: 'تم تعطيل %0% مستخدمين', + enableUserSuccess: '%0% تم تفعيله الآن', + disableUserSuccess: '%0% تم تعطيله الآن', + setUserGroupOnUsersSuccess: 'تم تعيين مجموعات المستخدمين', + unlockUsersSuccess: 'تم فك قفل %0% مستخدمين', + unlockUserSuccess: '%0% تم فك قفله الآن', + memberExportedSuccess: 'تم تصدير العضو إلى ملف', + memberExportedError: 'حدث خطأ أثناء تصدير العضو', + deleteUserSuccess: 'تم حذف المستخدم %0%', + resendInviteHeader: 'دعوة المستخدم', + resendInviteSuccess: 'تم إعادة إرسال الدعوة إلى %0%', + contentReqCulturePublishError: "لا يمكن نشر الوثيقة لأن '%0%' المطلوب غير منشور", + contentCultureValidationError: "فشل التحقق من اللغة '%0%'", + documentTypeExportedSuccess: 'تم تصدير نوع الوثيقة إلى ملف', + documentTypeExportedError: 'حدث خطأ أثناء تصدير نوع الوثيقة', + dictionaryItemExportedSuccess: 'تم تصدير عنصر (عناصر) القاموس إلى ملف', + dictionaryItemExportedError: 'حدث خطأ أثناء تصدير عنصر (عناصر) القاموس', + dictionaryItemImported: 'تم استيراد عنصر (عناصر) القاموس التالية!', + scheduleErrReleaseDate1: 'تاريخ الإصدار لا يمكن أن يكون في الماضي', + scheduleErrReleaseDate2: "لا يمكن جدولة الوثيقة للنشر لأن '%0%' المطلوب غير منشور", + scheduleErrReleaseDate3: "لا يمكن جدولة الوثيقة للنشر لأن '%0%' المطلوب له تاريخ نشر لاحق من لغة غير إلزامية", + scheduleErrExpireDate1: 'تاريخ انتهاء الصلاحية لا يمكن أن يكون في الماضي', + scheduleErrExpireDate2: 'تاريخ انتهاء الصلاحية لا يمكن أن يكون قبل تاريخ الإصدار', + publishWithNoDomains: + 'لم يتم تكوين النطاقات لموقع متعدد اللغات، يرجى الاتصال بالمسؤول، راجع السجل لمزيد من المعلومات', + publishWithMissingDomain: 'لا يوجد مجال مكون لـ %0%، يرجى الاتصال بالمسؤول، راجع السجل لمزيد من المعلومات', + preventCleanupEnableError: 'حدث خطأ أثناء تمكين تنظيف الإصدارات لـ %0%', + preventCleanupDisableError: 'حدث خطأ أثناء تعطيل تنظيف الإصدارات لـ %0%', + copySuccessMessage: 'تم نسخ معلومات النظام الخاصة بك بنجاح إلى الحافظة', + cannotCopyInformation: 'لم نتمكن من نسخ معلومات النظام الخاصة بك إلى الحافظة', + }, + stylesheet: { + addRule: 'إضافة نمط', + editRule: 'تعديل النمط', + editorRules: 'أنماط محرر النصوص الغني', + editorRulesHelp: 'حدد الأنماط التي يجب أن تكون متاحة في محرر النصوص الغني لهذه ورقة الأنماط', + editstylesheet: 'تعديل ورقة الأنماط', + editstylesheetproperty: 'تعديل خاصية ورقة الأنماط', + nameHelp: 'الاسم المعروض في قائمة اختيار الأنماط في المحرر', + preview: 'معاينة', + previewHelp: 'كيف سيبدو النص في محرر النصوص الغني.', + selector: 'المحدد', + selectorHelp: 'يستخدم بناء جملة CSS، على سبيل المثال "h1" أو ".redHeader"', + styles: 'الأنماط', + stylesHelp: 'CSS الذي يجب تطبيقه في محرر النصوص الغني، على سبيل المثال "color:red;"', + tabCode: 'الكود', + tabRules: 'محرر النصوص الغني', + }, + template: { + runtimeModeProduction: 'المحتوى غير قابل للتحرير عند استخدام وضع التشغيل Production.', + deleteByIdFailed: 'فشل في حذف القالب بالمعرف %0%', + edittemplate: 'تعديل القالب', + insertSections: 'الأقسام', + insertContentArea: 'إدراج منطقة المحتوى', + insertContentAreaPlaceHolder: 'إدراج عنصر نائبة لمنطقة المحتوى', + insert: 'إدراج', + insertDesc: 'اختر ما تريد إدراجه في قالبك', + insertDictionaryItem: 'عنصر القاموس', + insertDictionaryItemDesc: + 'عنصر القاموس هو عنصر نائبة لنص قابل للترجمة، مما يسهل إنشاء تصميمات لمواقع متعددة اللغات.', + insertMacro: 'ماكرو', + insertMacroDesc: + 'ماكرو هو مكون قابل للتكوين رائع للأجزاء القابلة لإعادة الاستخدام من التصميم الخاص بك، حيث تحتاج إلى خيار لتوفير معلمات، مثل المعارض والنماذج والقوائم.', + insertPageField: 'القيمة', + insertPageFieldDesc: 'يعرض قيمة حقل مسمى من الصفحة الحالية، مع خيارات لتعديل القيمة أو الرجوع إلى القيم البديلة.', + insertPartialView: 'عرض جزئي', + insertPartialViewDesc: + 'العرض الجزئي هو ملف قالب منفصل يمكن عرضه داخل قالب آخر، وهو رائع لإعادة استخدام الترميز أو لفصل القوالب المعقدة إلى ملفات منفصلة.', + mastertemplate: 'القالب الرئيسي', + noMaster: 'لا يوجد رئيسي', + renderBody: 'عرض القالب الفرعي', + renderBodyDesc: 'يعرض محتويات القالب الفرعي، من خلال إدراج عنصر نائبة @RenderBody().', + defineSection: 'تحديد قسم مسمى', + defineSectionDesc: + 'يحدد جزء من القالب كقسم مسمى عن طريق لفه في @section { ... }. يمكن عرض هذا في منطقة محددة من القالب الرئيسي لهذا القالب، باستخدام @RenderSection.', + renderSection: 'عرض قسم مسمى', + renderSectionDesc: + 'يعرض منطقة مسمى من قالب فرعي، من خلال إدراج عنصر نائبة @RenderSection(name). هذا يعرض منطقة من قالب فرعي والتي يتم لفها في تعريف @section [name]{ ... } المقابل.', + sectionName: 'اسم القسم', + sectionMandatory: 'القسم إلزامي', + sectionMandatoryDesc: + 'إذا كان إلزاميًا، يجب أن يحتوي القالب الفرعي على تعريف @section، خلاف ذلك يتم عرض خطأ.', + queryBuilder: 'باني الاستعلام', + itemsReturned: 'العناصر التي تم إرجاعها، في', + iWant: 'أريد', + allContent: 'جميع المحتويات', + contentOfType: 'محتوى من نوع "%0%"', + from: 'من', + websiteRoot: 'موقعي', + where: 'حيث', + and: 'و', + is: 'هو', + isNot: 'ليس', + before: 'قبل', + beforeIncDate: 'قبل (بما في ذلك التاريخ المحدد)', + after: 'بعد', + afterIncDate: 'بعد (بما في ذلك التاريخ المحدد)', + equals: 'يساوي', + doesNotEqual: 'لا يساوي', + contains: 'يحتوي على', + doesNotContain: 'لا يحتوي على', + greaterThan: 'أكبر من', + greaterThanEqual: 'أكبر من أو يساوي', + lessThan: 'أقل من', + lessThanEqual: 'أقل من أو يساوي', + id: 'المعرف', + name: 'الاسم', + createdDate: 'تاريخ الإنشاء', + lastUpdatedDate: 'تاريخ آخر تحديث', + orderBy: 'ترتيب حسب', + ascending: 'تصاعدي', + descending: 'تنازلي', + template: 'القالب', + }, grid: { - media: 'صورة', - macro: 'ماكرو', - insertControl: 'اختر نوع المحتوى', - chooseLayout: 'اختر تخطيطاً', - addRows: 'أضف صفاً', - addElement: 'أضف محتوى', - dropElement: 'إسقاط المحتوى', - settingsApplied: 'تم تطبيق الإعدادات', - contentNotAllowed: 'هذا المحتوى غير مسموح به هنا', - contentAllowed: 'هذا المحتوى مسموح به هنا', - clickToEmbed: 'انقر للتضمين', - clickToInsertImage: 'انقر لإدراج صورة', - clickToInsertMacro: 'انقر لإدراج ماكرو', - placeholderWriteHere: 'اكتب هنا...', - gridLayouts: 'تخطيطات الشبكة', - gridLayoutsDetail: 'التخطيطات هي منطقة العمل العامة لمحرر الشبكة، وعادةً ما تحتاج فقط إلى واحد أو اثنين من التخطيطات المختلفة', - addGridLayout: 'إضافة تخطيط شبكة', - editGridLayout: 'تعديل تخطيط الشبكة', - addGridLayoutDetail: 'ضبط التخطيط من خلال تعيين عرض الأعمدة وإضافة أقسام إضافية', - rowConfigurations: 'تكوينات الصفوف', - rowConfigurationsDetail: 'الصفوف هي خلايا محددة مسبقاً مرتبة أفقياً', - addRowConfiguration: 'إضافة تكوين صف', - editRowConfiguration: 'تعديل تكوين الصف', - addRowConfigurationDetail: 'ضبط الصف من خلال تعيين عرض الخلايا وإضافة خلايا إضافية', - noConfiguration: 'لا يوجد تكوين إضافي متاح', - columns: 'الأعمدة', - columnsDetails: 'إجمالي عدد الأعمدة في تخطيط الشبكة', - settings: 'الإعدادات', - settingsDetails: 'تكوين الإعدادات التي يمكن للمحررين تغييرها', - styles: 'الأنماط', - stylesDetails: 'تكوين التنسيق الذي يمكن للمحررين تغييره', - allowAllEditors: 'السماح لجميع المحررين', - allowAllRowConfigurations: 'السماح بجميع تكوينات الصفوف', - maxItems: 'الحد الأقصى للعناصر', - maxItemsDescription: 'اتركه فارغًا أو اضبطه على 0 لغير المحدود', - setAsDefault: 'تعيين كافتراضي', - chooseExtra: 'اختر إضافي', - chooseDefault: 'اختر افتراضي', - areAdded: 'تمت إضافتها', - warning: 'تحذير', - warningText: '

تعديل اسم تكوين الصف سيؤدي إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا التكوين.

تعديل التسمية فقط لن يؤدي إلى فقدان البيانات.

', - youAreDeleting: 'أنت تقوم بحذف تكوين الصف', - deletingARow: '\n حذف اسم تكوين الصف سيؤدي إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا\n التكوين.\n ', - deleteLayout: 'أنت تقوم بحذف التخطيط', - deletingALayout: 'تعديل التخطيط سيؤدي إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا التكوين.\n ', - }, - contentTypeEditor: { - compositions: 'التركيبات', - group: 'مجموعة', - groupReorderSameAliasError: 'لا يمكنك نقل المجموعة %0% إلى هذا التبويب لأن المجموعة ستأخذ نفس الاسم المستعار كالتبويب: "%1%". قم بإعادة تسمية المجموعة للمتابعة.\n ', - noGroups: 'لم تقم بإضافة أي مجموعات', - addGroup: 'إضافة مجموعة', - inheritedFrom: 'موروث من', - addProperty: 'إضافة خاصية', - editProperty: 'تعديل الخاصية', - requiredLabel: 'التسمية المطلوبة', - enableListViewHeading: 'تمكين عرض القائمة', - enableListViewDescription: 'تكوين العنصر لعرض قائمة قابلة للفرز والبحث من أبنائه.', - allowedTemplatesHeading: 'القوالب المسموح بها', - allowedTemplatesDescription: 'اختر القوالب التي يُسمح للمحررين باستخدامها على محتوى من هذا النوع', - allowAtRootHeading: 'السماح في الجذر', - allowAtRootDescription: 'السماح للمحررين بإنشاء محتوى من هذا النوع في جذر شجرة المحتوى.\n ', - childNodesHeading: 'أنواع العقد الفرعية المسموح بها', - childNodesDescription: 'السماح بإنشاء محتوى من الأنواع المحددة أسفل محتوى من هذا النوع.', - chooseChildNode: 'اختر العقدة الفرعية', - compositionsDescription: 'ارث التبويبات والخصائص من نوع مستند موجود. سيتم إضافة التبويبات الجديدة إلى نوع الوثيقة الحالي أو دمجها إذا كان هناك تبويب بنفس الاسم.', - compositionInUse: 'هذا النوع من المحتوى قيد الاستخدام في تركيب، وبالتالي لا يمكن تركيبه بنفسه.\n ', - noAvailableCompositions: 'لا توجد أنواع محتوى متاحة لاستخدامها كتركيب.', - compositionRemoveWarning: 'إزالة التركيب ستؤدي إلى حذف جميع بيانات الخصائص المرتبطة. بمجرد حفظ نوع الوثيقة لا يوجد طريق للعودة.', - availableEditors: 'إنشاء جديد', - reuse: 'استخدام موجود', - editorSettings: 'إعدادات المحرر', - searchResultSettings: 'الإعدادات المتاحة', - searchResultEditors: 'إنشاء تكوين جديد', - configuration: 'التكوين', - yesDelete: 'نعم، احذف', - movedUnderneath: 'تم نقله تحت', - copiedUnderneath: 'تم نسخه تحت', - folderToMove: 'اختر المجلد للتحريك', - folderToCopy: 'اختر المجلد للنسخ', - structureBelow: 'إلى هيكل الشجرة أدناه', - allDocumentTypes: 'جميع أنواع الوثائق', - allDocuments: 'جميع الوثائق', - allMediaItems: 'جميع العناصر الإعلامية', - usingThisDocument: 'استخدام هذا النوع من الوثائق سيتم حذفه نهائيًا، يرجى تأكيد أنك تريد حذف هذه أيضًا.\n ', - usingThisMedia: 'استخدام هذا النوع من الوسائط سيتم حذفه نهائيًا، يرجى تأكيد أنك تريد حذف هذه أيضًا.\n ', - usingThisMember: 'استخدام هذا النوع من الأعضاء سيتم حذفه نهائيًا، يرجى تأكيد أنك تريد حذف هذه أيضًا\n ', - andAllDocuments: 'وجميع الوثائق التي تستخدم هذا النوع', - andAllMediaItems: 'وجميع العناصر الإعلامية التي تستخدم هذا النوع', - andAllMembers: 'وجميع الأعضاء الذين يستخدمون هذا النوع', - memberCanEdit: 'يمكن للعضو التعديل', - memberCanEditDescription: 'السماح بتعديل قيمة هذه الخاصية من قبل العضو في صفحة ملفه الشخصي\n ', - isSensitiveData: 'بيانات حساسة', - isSensitiveDataDescription: 'إخفاء قيمة هذه الخاصية عن محرري المحتوى الذين لا يملكون حق الوصول لعرض المعلومات الحساسة\n ', - showOnMemberProfile: 'عرض على ملف العضو', - showOnMemberProfileDescription: 'السماح بعرض قيمة هذه الخاصية في صفحة ملف العضو\n ', - tabHasNoSortOrder: 'التبويب ليس له ترتيب فرز', - compositionUsageHeading: 'أين يتم استخدام هذا التركيب؟', - compositionUsageSpecification: 'يتم استخدام هذا التركيب حاليًا في تركيب أنواع المحتوى التالية:\n ', - variantsHeading: 'السماح بالاختلافات', - cultureVariantHeading: 'السماح بالاختلاف حسب الثقافة', - segmentVariantHeading: 'السماح بالتجزئة', - cultureVariantLabel: 'الاختلاف حسب الثقافة', - segmentVariantLabel: 'الاختلاف حسب القطاعات', - variantsDescription: 'السماح للمحررين بإنشاء محتوى من هذا النوع بلغات مختلفة.', - cultureVariantDescription: 'السماح للمحررين بإنشاء محتوى بلغات مختلفة.', - segmentVariantDescription: 'السماح للمحررين بإنشاء قطاعات من هذا المحتوى.', - allowVaryByCulture: 'السماح بالاختلاف حسب الثقافة', - allowVaryBySegment: 'السماح بالتجزئة', - elementType: 'نوع العنصر', - elementHeading: 'هو نوع عنصر', - elementDescription: 'نوع العنصر مخصص للاستخدام ضمن أنواع مستندات أخرى، وليس في شجرة المحتوى.\n ', - elementCannotToggle: 'لا يمكن تغيير نوع مستند إلى نوع عنصر بمجرد أن يتم استخدامه لإنشاء عنصر أو أكثر من محتوى.\n ', - elementDoesNotSupport: 'هذا غير قابل للتطبيق لنوع العنصر', - propertyHasChanges: 'لقد أجريت تغييرات على هذه الخاصية. هل أنت متأكد أنك تريد التخلص منها؟', - displaySettingsHeadline: 'المظهر', - displaySettingsLabelOnTop: 'التسمية في الأعلى (عرض كامل)', - confirmDeleteTabMessage: 'هل أنت متأكد أنك تريد حذف التبويب %0%؟', - confirmDeleteGroupMessage: 'هل أنت متأكد أنك تريد حذف المجموعة %0%؟', - confirmDeletePropertyMessage: 'هل أنت متأكد أنك تريد حذف الخاصية %0%؟', - confirmDeleteTabNotice: 'سوف يؤدي ذلك أيضًا إلى حذف جميع العناصر أسفل هذا التبويب.', - confirmDeleteGroupNotice: 'سوف يؤدي ذلك أيضًا إلى حذف جميع العناصر أسفل هذه المجموعة.', - addTab: 'إضافة تبويب', - convertToTab: 'تحويل إلى تبويب', - tabDirectPropertiesDropZone: 'اسحب الخصائص هنا لوضعها مباشرة على التبويب', - removeChildNode: 'أنت تقوم بإزالة العقدة الفرعية', - removeChildNodeWarning: 'إزالة عقدة فرعية ستحد من خيارات المحررين لإنشاء أنواع محتوى مختلفة أسفل عقدة.', - usingEditor: 'استخدام هذا المحرر سيتم تحديثه بالإعدادات الجديدة.', - historyCleanupHeading: 'تنظيف السجل', - historyCleanupDescription: 'السماح بتجاوز الإعدادات العالمية لتنظيف السجل.', - historyCleanupKeepAllVersionsNewerThanDays: 'احتفظ بجميع الإصدارات الأحدث من الأيام', - historyCleanupKeepLatestVersionPerDayForDays: 'احتفظ بأحدث إصدار لكل يوم لعدد من الأيام', - historyCleanupPreventCleanup: 'منع التنظيف', - historyCleanupEnableCleanup: 'تمكين التنظيف', - historyCleanupGloballyDisabled: 'ملاحظة! تنظيف إصدارات المحتوى التاريخية معطل عالميًا. لن تكون هذه الإعدادات فعالة حتى يتم تمكينها.', - changeDataTypeHelpText: 'تغيير نوع البيانات مع القيم المخزنة معطل. للسماح بذلك، يمكنك تغيير إعداد Umbraco:CMS:DataTypes:CanBeChanged في appsettings.json.', - collections: 'المجموعات', - collectionsDescription: 'تكوين العنصر لعرض قائمة بأبنائه.', - structure: 'الهيكل', - presentation: 'العرض', - }, - languages: { - addLanguage: 'إضافة لغة', - culture: 'رمز ISO', - mandatoryLanguage: 'اللغة الإلزامية', - mandatoryLanguageHelp: 'يجب ملء الخصائص في هذه اللغة قبل أن يتم نشر العقدة.\n ', - defaultLanguage: 'اللغة الافتراضية', - defaultLanguageHelp: 'يمكن لموقع Umbraco أن يحتوي فقط على لغة افتراضية واحدة.', - changingDefaultLanguageWarning: 'تغيير اللغة الافتراضية قد يؤدي إلى فقدان المحتوى الافتراضي.', - fallsbackToLabel: 'يعود إلى', - noFallbackLanguageOption: 'لا توجد لغة بديلة', - fallbackLanguageDescription: 'للسماح للمحتوى متعدد اللغات بالرجوع إلى لغة أخرى إذا لم يكن موجوداً باللغة المطلوبة، اخترها هنا.\n ', - fallbackLanguage: 'لغة بديلة', - none: 'لا شيء', - invariantPropertyUnlockHelp: '%0% مشتركة عبر اللغات والأقسام.', - invariantCulturePropertyUnlockHelp: '%0% مشتركة عبر جميع اللغات.', - invariantSegmentPropertyUnlockHelp: '%0% مشتركة عبر جميع الأقسام.', - invariantLanguageProperty: 'مشتركة: اللغات', - invariantSegmentProperty: 'مشتركة: الأقسام', - }, + media: 'صورة', + macro: 'ماكرو', + insertControl: 'اختر نوع المحتوى', + chooseLayout: 'اختر تخطيطاً', + addRows: 'أضف صفاً', + addElement: 'أضف محتوى', + dropElement: 'إسقاط المحتوى', + settingsApplied: 'تم تطبيق الإعدادات', + contentNotAllowed: 'هذا المحتوى غير مسموح به هنا', + contentAllowed: 'هذا المحتوى مسموح به هنا', + clickToEmbed: 'انقر للتضمين', + clickToInsertImage: 'انقر لإدراج صورة', + clickToInsertMacro: 'انقر لإدراج ماكرو', + placeholderWriteHere: 'اكتب هنا...', + gridLayouts: 'تخطيطات الشبكة', + gridLayoutsDetail: + 'التخطيطات هي منطقة العمل العامة لمحرر الشبكة، وعادةً ما تحتاج فقط إلى واحد أو اثنين من التخطيطات المختلفة', + addGridLayout: 'إضافة تخطيط شبكة', + editGridLayout: 'تعديل تخطيط الشبكة', + addGridLayoutDetail: 'ضبط التخطيط من خلال تعيين عرض الأعمدة وإضافة أقسام إضافية', + rowConfigurations: 'تكوينات الصفوف', + rowConfigurationsDetail: 'الصفوف هي خلايا محددة مسبقاً مرتبة أفقياً', + addRowConfiguration: 'إضافة تكوين صف', + editRowConfiguration: 'تعديل تكوين الصف', + addRowConfigurationDetail: 'ضبط الصف من خلال تعيين عرض الخلايا وإضافة خلايا إضافية', + noConfiguration: 'لا يوجد تكوين إضافي متاح', + columns: 'الأعمدة', + columnsDetails: 'إجمالي عدد الأعمدة في تخطيط الشبكة', + settings: 'الإعدادات', + settingsDetails: 'تكوين الإعدادات التي يمكن للمحررين تغييرها', + styles: 'الأنماط', + stylesDetails: 'تكوين التنسيق الذي يمكن للمحررين تغييره', + allowAllEditors: 'السماح لجميع المحررين', + allowAllRowConfigurations: 'السماح بجميع تكوينات الصفوف', + maxItems: 'الحد الأقصى للعناصر', + maxItemsDescription: 'اتركه فارغًا أو اضبطه على 0 لغير المحدود', + setAsDefault: 'تعيين كافتراضي', + chooseExtra: 'اختر إضافي', + chooseDefault: 'اختر افتراضي', + areAdded: 'تمت إضافتها', + warning: 'تحذير', + warningText: + '

تعديل اسم تكوين الصف سيؤدي إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا التكوين.

تعديل التسمية فقط لن يؤدي إلى فقدان البيانات.

', + youAreDeleting: 'أنت تقوم بحذف تكوين الصف', + deletingARow: + '\n حذف اسم تكوين الصف سيؤدي إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا\n التكوين.\n ', + deleteLayout: 'أنت تقوم بحذف التخطيط', + deletingALayout: 'تعديل التخطيط سيؤدي إلى فقدان البيانات لأي محتوى موجود يعتمد على هذا التكوين.\n ', + }, + contentTypeEditor: { + compositions: 'التركيبات', + group: 'مجموعة', + groupReorderSameAliasError: + 'لا يمكنك نقل المجموعة %0% إلى هذا التبويب لأن المجموعة ستأخذ نفس الاسم المستعار كالتبويب: "%1%". قم بإعادة تسمية المجموعة للمتابعة.\n ', + noGroups: 'لم تقم بإضافة أي مجموعات', + addGroup: 'إضافة مجموعة', + inheritedFrom: 'موروث من', + addProperty: 'إضافة خاصية', + editProperty: 'تعديل الخاصية', + requiredLabel: 'التسمية المطلوبة', + enableListViewHeading: 'تمكين عرض القائمة', + enableListViewDescription: 'تكوين العنصر لعرض قائمة قابلة للفرز والبحث من أبنائه.', + allowedTemplatesHeading: 'القوالب المسموح بها', + allowedTemplatesDescription: 'اختر القوالب التي يُسمح للمحررين باستخدامها على محتوى من هذا النوع', + allowAtRootHeading: 'السماح في الجذر', + allowAtRootDescription: 'السماح للمحررين بإنشاء محتوى من هذا النوع في جذر شجرة المحتوى.\n ', + childNodesHeading: 'أنواع العقد الفرعية المسموح بها', + childNodesDescription: 'السماح بإنشاء محتوى من الأنواع المحددة أسفل محتوى من هذا النوع.', + chooseChildNode: 'اختر العقدة الفرعية', + compositionsDescription: + 'ارث التبويبات والخصائص من نوع مستند موجود. سيتم إضافة التبويبات الجديدة إلى نوع الوثيقة الحالي أو دمجها إذا كان هناك تبويب بنفس الاسم.', + compositionInUse: 'هذا النوع من المحتوى قيد الاستخدام في تركيب، وبالتالي لا يمكن تركيبه بنفسه.\n ', + noAvailableCompositions: 'لا توجد أنواع محتوى متاحة لاستخدامها كتركيب.', + compositionRemoveWarning: + 'إزالة التركيب ستؤدي إلى حذف جميع بيانات الخصائص المرتبطة. بمجرد حفظ نوع الوثيقة لا يوجد طريق للعودة.', + availableEditors: 'إنشاء جديد', + reuse: 'استخدام موجود', + editorSettings: 'إعدادات المحرر', + searchResultSettings: 'الإعدادات المتاحة', + searchResultEditors: 'إنشاء تكوين جديد', + configuration: 'التكوين', + yesDelete: 'نعم، احذف', + movedUnderneath: 'تم نقله تحت', + copiedUnderneath: 'تم نسخه تحت', + folderToMove: 'اختر المجلد للتحريك', + folderToCopy: 'اختر المجلد للنسخ', + structureBelow: 'إلى هيكل الشجرة أدناه', + allDocumentTypes: 'جميع أنواع الوثائق', + allDocuments: 'جميع الوثائق', + allMediaItems: 'جميع العناصر الإعلامية', + usingThisDocument: 'استخدام هذا النوع من الوثائق سيتم حذفه نهائيًا، يرجى تأكيد أنك تريد حذف هذه أيضًا.\n ', + usingThisMedia: 'استخدام هذا النوع من الوسائط سيتم حذفه نهائيًا، يرجى تأكيد أنك تريد حذف هذه أيضًا.\n ', + usingThisMember: 'استخدام هذا النوع من الأعضاء سيتم حذفه نهائيًا، يرجى تأكيد أنك تريد حذف هذه أيضًا\n ', + andAllDocuments: 'وجميع الوثائق التي تستخدم هذا النوع', + andAllMediaItems: 'وجميع العناصر الإعلامية التي تستخدم هذا النوع', + andAllMembers: 'وجميع الأعضاء الذين يستخدمون هذا النوع', + memberCanEdit: 'يمكن للعضو التعديل', + memberCanEditDescription: 'السماح بتعديل قيمة هذه الخاصية من قبل العضو في صفحة ملفه الشخصي\n ', + isSensitiveData: 'بيانات حساسة', + isSensitiveDataDescription: + 'إخفاء قيمة هذه الخاصية عن محرري المحتوى الذين لا يملكون حق الوصول لعرض المعلومات الحساسة\n ', + showOnMemberProfile: 'عرض على ملف العضو', + showOnMemberProfileDescription: 'السماح بعرض قيمة هذه الخاصية في صفحة ملف العضو\n ', + tabHasNoSortOrder: 'التبويب ليس له ترتيب فرز', + compositionUsageHeading: 'أين يتم استخدام هذا التركيب؟', + compositionUsageSpecification: 'يتم استخدام هذا التركيب حاليًا في تركيب أنواع المحتوى التالية:\n ', + variantsHeading: 'السماح بالاختلافات', + cultureVariantHeading: 'السماح بالاختلاف حسب الثقافة', + segmentVariantHeading: 'السماح بالتجزئة', + cultureVariantLabel: 'الاختلاف حسب الثقافة', + segmentVariantLabel: 'الاختلاف حسب القطاعات', + variantsDescription: 'السماح للمحررين بإنشاء محتوى من هذا النوع بلغات مختلفة.', + cultureVariantDescription: 'السماح للمحررين بإنشاء محتوى بلغات مختلفة.', + segmentVariantDescription: 'السماح للمحررين بإنشاء قطاعات من هذا المحتوى.', + allowVaryByCulture: 'السماح بالاختلاف حسب الثقافة', + allowVaryBySegment: 'السماح بالتجزئة', + elementType: 'نوع العنصر', + elementHeading: 'هو نوع عنصر', + elementDescription: 'نوع العنصر مخصص للاستخدام ضمن أنواع مستندات أخرى، وليس في شجرة المحتوى.\n ', + elementCannotToggle: + 'لا يمكن تغيير نوع مستند إلى نوع عنصر بمجرد أن يتم استخدامه لإنشاء عنصر أو أكثر من محتوى.\n ', + elementDoesNotSupport: 'هذا غير قابل للتطبيق لنوع العنصر', + propertyHasChanges: 'لقد أجريت تغييرات على هذه الخاصية. هل أنت متأكد أنك تريد التخلص منها؟', + displaySettingsHeadline: 'المظهر', + displaySettingsLabelOnTop: 'التسمية في الأعلى (عرض كامل)', + confirmDeleteTabMessage: 'هل أنت متأكد أنك تريد حذف التبويب %0%؟', + confirmDeleteGroupMessage: 'هل أنت متأكد أنك تريد حذف المجموعة %0%؟', + confirmDeletePropertyMessage: 'هل أنت متأكد أنك تريد حذف الخاصية %0%؟', + confirmDeleteTabNotice: 'سوف يؤدي ذلك أيضًا إلى حذف جميع العناصر أسفل هذا التبويب.', + confirmDeleteGroupNotice: 'سوف يؤدي ذلك أيضًا إلى حذف جميع العناصر أسفل هذه المجموعة.', + addTab: 'إضافة تبويب', + convertToTab: 'تحويل إلى تبويب', + tabDirectPropertiesDropZone: 'اسحب الخصائص هنا لوضعها مباشرة على التبويب', + removeChildNode: 'أنت تقوم بإزالة العقدة الفرعية', + removeChildNodeWarning: 'إزالة عقدة فرعية ستحد من خيارات المحررين لإنشاء أنواع محتوى مختلفة أسفل عقدة.', + usingEditor: 'استخدام هذا المحرر سيتم تحديثه بالإعدادات الجديدة.', + historyCleanupHeading: 'تنظيف السجل', + historyCleanupDescription: 'السماح بتجاوز الإعدادات العالمية لتنظيف السجل.', + historyCleanupKeepAllVersionsNewerThanDays: 'احتفظ بجميع الإصدارات الأحدث من الأيام', + historyCleanupKeepLatestVersionPerDayForDays: 'احتفظ بأحدث إصدار لكل يوم لعدد من الأيام', + historyCleanupPreventCleanup: 'منع التنظيف', + historyCleanupEnableCleanup: 'تمكين التنظيف', + historyCleanupGloballyDisabled: + 'ملاحظة! تنظيف إصدارات المحتوى التاريخية معطل عالميًا. لن تكون هذه الإعدادات فعالة حتى يتم تمكينها.', + changeDataTypeHelpText: + 'تغيير نوع البيانات مع القيم المخزنة معطل. للسماح بذلك، يمكنك تغيير إعداد Umbraco:CMS:DataTypes:CanBeChanged في appsettings.json.', + collections: 'المجموعات', + collectionsDescription: 'تكوين العنصر لعرض قائمة بأبنائه.', + structure: 'الهيكل', + presentation: 'العرض', + }, + languages: { + addLanguage: 'إضافة لغة', + culture: 'رمز ISO', + mandatoryLanguage: 'اللغة الإلزامية', + mandatoryLanguageHelp: 'يجب ملء الخصائص في هذه اللغة قبل أن يتم نشر العقدة.\n ', + defaultLanguage: 'اللغة الافتراضية', + defaultLanguageHelp: 'يمكن لموقع Umbraco أن يحتوي فقط على لغة افتراضية واحدة.', + changingDefaultLanguageWarning: 'تغيير اللغة الافتراضية قد يؤدي إلى فقدان المحتوى الافتراضي.', + fallsbackToLabel: 'يعود إلى', + noFallbackLanguageOption: 'لا توجد لغة بديلة', + fallbackLanguageDescription: + 'للسماح للمحتوى متعدد اللغات بالرجوع إلى لغة أخرى إذا لم يكن موجوداً باللغة المطلوبة، اخترها هنا.\n ', + fallbackLanguage: 'لغة بديلة', + none: 'لا شيء', + invariantPropertyUnlockHelp: '%0% مشتركة عبر اللغات والأقسام.', + invariantCulturePropertyUnlockHelp: '%0% مشتركة عبر جميع اللغات.', + invariantSegmentPropertyUnlockHelp: '%0% مشتركة عبر جميع الأقسام.', + invariantLanguageProperty: 'مشتركة: اللغات', + invariantSegmentProperty: 'مشتركة: الأقسام', + }, macro: { addParameter: 'إضافة معلمة', editParameter: 'تعديل المعلمة', @@ -1602,7 +1674,7 @@ export default { }, modelsBuilder: { buildingModels: 'بناء النماذج', - waitingMessage: "قد يستغرق هذا بعض الوقت، لا داعي للقلق", + waitingMessage: 'قد يستغرق هذا بعض الوقت، لا داعي للقلق', modelsGenerated: 'تم إنشاء النماذج', modelsGeneratedError: 'لم يتم إنشاء النماذج', modelsExceptionInUlog: 'فشل إنشاء النماذج، راجع الاستثناء في سجل U', @@ -1644,15 +1716,14 @@ export default { DownloadXmlDTD: 'تنزيل XML DTD', fields: 'الحقول', includeSubpages: 'تضمين الصفحات الفرعية', - noTranslators: - 'لم يتم العثور على مستخدمين مترجمين. يرجى إنشاء مستخدم مترجم قبل البدء في إرسال المحتوى للترجمة', + noTranslators: 'لم يتم العثور على مستخدمين مترجمين. يرجى إنشاء مستخدم مترجم قبل البدء في إرسال المحتوى للترجمة', pageHasBeenSendToTranslation: "تم إرسال الصفحة '%0%' للترجمة", sendToTranslate: "إرسال الصفحة '%0%' للترجمة", totalWords: 'إجمالي الكلمات', translateTo: 'ترجم إلى', translationDone: 'الترجمة مكتملة.', translationDoneHelp: - "يمكنك معاينة الصفحات التي قمت بترجمتها للتو بالنقر أدناه. إذا تم العثور على الصفحة الأصلية، ستتلقى مقارنة بين الصفحتين.", + 'يمكنك معاينة الصفحات التي قمت بترجمتها للتو بالنقر أدناه. إذا تم العثور على الصفحة الأصلية، ستتلقى مقارنة بين الصفحتين.', translationFailed: 'فشلت الترجمة، قد يكون ملف XML تالفاً', translationOptions: 'خيارات الترجمة', translator: 'المترجم', @@ -1705,7 +1776,7 @@ export default { updateNoServer: 'لا يوجد اتصال بالخادم', updateNoServerError: 'خطأ في التحقق من التحديث. يرجى مراجعة تتبع الأخطاء لمزيد من المعلومات', }, - user: { + user: { access: 'الوصول', accessHelp: 'استناداً إلى المجموعات المعينة وعقد البداية، يتمتع المستخدم بالوصول إلى العقد التالية', assignAccess: 'تعيين الوصول', @@ -1724,8 +1795,8 @@ export default { newPassword: 'كلمة مرور جديدة', newPasswordFormatLengthTip: 'الحد الأدنى هو %0% حرفاً!', newPasswordFormatNonAlphaTip: 'يجب أن تحتوي على %0% حرفاً خاصاً على الأقل.', - noLockouts: "لم يتم قفله", - noPasswordChange: "لم يتم تغيير كلمة المرور", + noLockouts: 'لم يتم قفله', + noPasswordChange: 'لم يتم تغيير كلمة المرور', confirmNewPassword: 'تأكيد كلمة المرور الجديدة', changePasswordDescription: "يمكنك تغيير كلمة مرورك للوصول إلى واجهة Umbraco من خلال ملء النموذج أدناه والنقر على زر 'تغيير كلمة المرور'", @@ -1772,9 +1843,8 @@ export default { passwordIsBlank: 'لا يمكن أن تكون كلمة المرور الجديدة فارغة!', passwordCurrent: 'كلمة المرور الحالية', passwordInvalid: 'كلمة المرور الحالية غير صحيحة', - passwordIsDifferent: - 'كان هناك اختلاف بين كلمة المرور الجديدة وكلمة المرور المؤكدة. يرجى المحاولة مرة أخرى!', - passwordMismatch: "كلمة المرور المؤكدة لا تطابق كلمة المرور الجديدة!", + passwordIsDifferent: 'كان هناك اختلاف بين كلمة المرور الجديدة وكلمة المرور المؤكدة. يرجى المحاولة مرة أخرى!', + passwordMismatch: 'كلمة المرور المؤكدة لا تطابق كلمة المرور الجديدة!', passwordRequiresDigit: "يجب أن تحتوي كلمة المرور على رقم واحد على الأقل ('0'-'9')", passwordRequiresLower: "يجب أن تحتوي كلمة المرور على حرف صغير واحد على الأقل ('a'-'z')", passwordRequiresNonAlphanumeric: 'يجب أن تحتوي كلمة المرور على حرف غير أبجدي رقمي واحد على الأقل', @@ -1809,8 +1879,7 @@ export default { startnodeshelp: 'تقييد شجرة المحتوى إلى عقد بداية محددة', updateDate: 'تاريخ آخر تحديث للمستخدم', userCreated: 'تم إنشاؤه', - userCreatedSuccessHelp: - 'تم إنشاء المستخدم الجديد بنجاح. لتسجيل الدخول إلى Umbraco استخدم كلمة المرور أدناه.', + userCreatedSuccessHelp: 'تم إنشاء المستخدم الجديد بنجاح. لتسجيل الدخول إلى Umbraco استخدم كلمة المرور أدناه.', userHasPassword: 'تم تعيين كلمة مرور للمستخدم بالفعل', userHasGroup: "المستخدم موجود بالفعل في المجموعة '%0%'", userLockoutNotEnabled: 'القفل غير مفعل لهذا المستخدم', @@ -1821,14 +1890,12 @@ export default { usergroup: 'مجموعة المستخدمين', usergroups: 'مجموعات المستخدمين', userInvited: 'تمت دعوته', - userInvitedSuccessHelp: - 'تم إرسال دعوة إلى المستخدم الجديد مع تفاصيل حول كيفية تسجيل الدخول إلى Umbraco.', + userInvitedSuccessHelp: 'تم إرسال دعوة إلى المستخدم الجديد مع تفاصيل حول كيفية تسجيل الدخول إلى Umbraco.', userinviteWelcomeMessage: 'مرحباً بك في Umbraco! في دقيقة واحدة فقط ستكون جاهزاً، نحن فقط بحاجة منك لتعيين كلمة مرور وإضافة صورة لملفك الشخصي.', userinviteExpiredMessage: 'مرحباً بك في Umbraco! للأسف انتهت صلاحية دعوتك. يرجى الاتصال بالمسؤول الخاص بك واطلب منهم إعادة إرسالها.', - userinviteAvatarMessage: - 'رفع صورة لنفسك سيساعد الآخرين على التعرف عليك بسهولة. انقر على الدائرة أعلاه لرفع صورتك.', + userinviteAvatarMessage: 'رفع صورة لنفسك سيساعد الآخرين على التعرف عليك بسهولة. انقر على الدائرة أعلاه لرفع صورتك.', writer: 'كاتب', configureTwoFactor: 'تكوين التحقق بخطوتين', change: 'تغيير', @@ -1915,10 +1982,10 @@ export default { macroErrorModeCheckSuccessMessage: "MacroErrors تم تعيينها إلى '%0%'.", macroErrorModeCheckErrorMessage: "MacroErrors تم تعيينها إلى '%0%' مما سيمنع بعض أو جميع الصفحات في\n موقعك من التحميل بالكامل إذا كانت هناك أي أخطاء في الماكرو. تصحيح ذلك سيجعل القيمة تُعيّن إلى '%1%'.\n ", - httpsCheckValidCertificate: "شهادة موقعك صالحة.", + httpsCheckValidCertificate: 'شهادة موقعك صالحة.', httpsCheckInvalidCertificate: "خطأ في التحقق من الشهادة: '%0%'", - httpsCheckExpiredCertificate: "شهادة SSL لموقعك قد انتهت صلاحيتها.", - httpsCheckExpiringCertificate: "شهادة SSL لموقعك تنتهي صلاحيتها في %0% يوماً.", + httpsCheckExpiredCertificate: 'شهادة SSL لموقعك قد انتهت صلاحيتها.', + httpsCheckExpiringCertificate: 'شهادة SSL لموقعك تنتهي صلاحيتها في %0% يوماً.', healthCheckInvalidUrl: "خطأ في اختبار URL %0% - '%1%'", httpsCheckIsCurrentSchemeHttps: 'أنت حالياً %0% تعرض الموقع باستخدام مخطط HTTPS.', httpsCheckConfigurationRectifyNotPossible: @@ -1953,15 +2020,12 @@ export default { 'تم العثور على الرؤوس التالية التي تكشف عن معلومات حول تكنولوجيا الموقع: %0%.', excessiveHeadersNotFound: 'لم يتم العثور على رؤوس تكشف عن معلومات حول تكنولوجيا الموقع.\n ', smtpMailSettingsNotFound: "إعدادات 'Umbraco:CMS:Global:Smtp' لم يتم العثور عليها.", - smtpMailSettingsHostNotConfigured: - "إعداد 'Umbraco:CMS:Global:Smtp:Host' لم يتم العثور عليه.\n ", - smtpMailSettingsConnectionSuccess: - 'تم تكوين إعدادات SMTP بشكل صحيح والخدمة تعمل كما هو متوقع.\n ', + smtpMailSettingsHostNotConfigured: "إعداد 'Umbraco:CMS:Global:Smtp:Host' لم يتم العثور عليه.\n ", + smtpMailSettingsConnectionSuccess: 'تم تكوين إعدادات SMTP بشكل صحيح والخدمة تعمل كما هو متوقع.\n ', smtpMailSettingsConnectionFail: "لم يتم الوصول إلى خادم SMTP المُعين بالمضيف '%0%' والمنفذ '%1%'. يرجى التحقق للتأكد من صحة إعدادات SMTP في التكوين 'Umbraco:CMS:Global:Smtp'.\n ", notificationEmailsCheckSuccessMessage: 'تم تعيين بريد الإشعارات إلى %0%.', - notificationEmailsCheckErrorMessage: - 'بريد الإشعارات ما زال مضبوطًا على القيمة الافتراضية %0%.', + notificationEmailsCheckErrorMessage: 'بريد الإشعارات ما زال مضبوطًا على القيمة الافتراضية %0%.', checkGroup: 'فحص المجموعة', helpText: '\n

مدقق الصحة يقيم مجالات مختلفة في موقعك لأفضل إعدادات الممارسات والتكوين والمشاكل المحتملة، وما إلى ذلك. يمكنك إصلاح المشكلات بسهولة عن طريق الضغط على زر.\n يمكنك إضافة فحوصات صحية خاصة بك، راجع التوثيق لمزيد من المعلومات حول فحوصات الصحة المخصصة.

\n ', @@ -1975,8 +2039,7 @@ export default { redirectUrlManagement: 'إدارة URL التحويل', panelInformation: 'توجه URLs التالية إلى هذا العنصر المحتوى:', noRedirects: 'لم يتم إجراء أي تحويلات', - noRedirectsDescription: - 'عند إعادة تسمية صفحة منشورة أو نقلها، سيتم تلقائيًا إجراء تحويل إلى الصفحة الجديدة.\n ', + noRedirectsDescription: 'عند إعادة تسمية صفحة منشورة أو نقلها، سيتم تلقائيًا إجراء تحويل إلى الصفحة الجديدة.\n ', redirectRemoved: 'تمت إزالة URL التحويل.', redirectRemoveError: 'خطأ في إزالة URL التحويل.', redirectRemoveWarning: 'سيتم إزالة التحويل', @@ -2098,8 +2161,7 @@ export default { labelUsedItems: 'العناصر التالية يتم الاستشهاد بها', labelUsedDescendants: 'العناصر اللاحقة التالية لها تبعيات', labelDependentDescendants: 'العناصر اللاحقة التالية لها تبعيات', - deleteWarning: - 'يتم الاستشهاد بهذا العنصر أو أحفاده. يمكن أن تؤدي الحذف إلى روابط مكسورة على موقعك الإلكتروني.', + deleteWarning: 'يتم الاستشهاد بهذا العنصر أو أحفاده. يمكن أن تؤدي الحذف إلى روابط مكسورة على موقعك الإلكتروني.', unpublishWarning: 'يتم الاستشهاد بهذا العنصر أو أحفاده. يمكن أن يؤدي إلغاء النشر إلى روابط مكسورة على موقعك الإلكتروني. يرجى اتخاذ الإجراءات المناسبة.', deleteDisabledWarning: 'يتم الاستشهاد بهذا العنصر أو أحفاده. لذلك، تم تعطيل الحذف.', @@ -2109,286 +2171,314 @@ export default { return `...ومزيد من ${count} عناصر`; }, }, - logViewer: { - deleteSavedSearch: 'حذف البحث المحفوظ', - logLevels: 'مستويات السجل', - selectAllLogLevelFilters: 'تحديد الكل', - deselectAllLogLevelFilters: 'إلغاء تحديد الكل', - savedSearches: 'البحث المحفوظ', - saveSearch: 'حفظ البحث', - saveSearchDescription: 'أدخل اسمًا وديًا لاستعلام البحث الخاص بك', - filterSearch: 'تصفية البحث', - totalItems: 'إجمالي العناصر', - timestamp: 'الطابع الزمني', - level: 'المستوى', - machine: 'الآلة', - message: 'الرسالة', - exception: 'الاستثناء', - properties: 'الخصائص', - searchWithGoogle: 'البحث باستخدام جوجل', - searchThisMessageWithGoogle: 'ابحث عن هذه الرسالة باستخدام جوجل', - searchWithBing: 'البحث باستخدام بينج', - searchThisMessageWithBing: 'ابحث عن هذه الرسالة باستخدام بينج', - searchOurUmbraco: 'البحث في Umbraco الخاص بنا', - searchThisMessageOnOurUmbracoForumsAndDocs: 'ابحث عن هذه الرسالة في منتديات ومراسلات Umbraco الخاصة بنا', - searchOurUmbracoWithGoogle: 'البحث في Umbraco الخاص بنا باستخدام جوجل', - searchOurUmbracoForumsUsingGoogle: 'البحث في منتديات Umbraco الخاصة بنا باستخدام جوجل', - searchUmbracoSource: 'البحث في مصدر Umbraco', - searchWithinUmbracoSourceCodeOnGithub: 'البحث ضمن كود مصدر Umbraco على Github', - searchUmbracoIssues: 'البحث في قضايا Umbraco', - searchUmbracoIssuesOnGithub: 'البحث في قضايا Umbraco على Github', - deleteThisSearch: 'حذف هذا البحث', - findLogsWithRequestId: 'البحث في السجلات باستخدام معرّف الطلب', - findLogsWithNamespace: 'البحث في السجلات باستخدام النطاق', - findLogsWithMachineName: 'البحث في السجلات باستخدام اسم الآلة', - open: 'فتح', - polling: 'استطلاع', - every2: 'كل 2 ثانية', - every5: 'كل 5 ثوانٍ', - every10: 'كل 10 ثوانٍ', - every20: 'كل 20 ثانية', - every30: 'كل 30 ثانية', - pollingEvery2: 'استطلاع كل 2 ثانية', - pollingEvery5: 'استطلاع كل 5 ثوانٍ', - pollingEvery10: 'استطلاع كل 10 ثوانٍ', - pollingEvery20: 'استطلاع كل 20 ثانية', - pollingEvery30: 'استطلاع كل 30 ثانية' - }, - clipboard: { - labelForCopyAllEntries: 'نسخ %0%', - labelForArrayOfItemsFrom: '%0% من %1%', - labelForArrayOfItems: 'مجموعة من %0%', - labelForRemoveAllEntries: 'إزالة جميع العناصر', - labelForClearClipboard: 'مسح الحافظة', - labelForCopyToClipboard: 'نسخ إلى الحافظة' - }, - propertyActions: { - tooltipForPropertyActionsMenu: 'فتح إجراءات الخصائص', - tooltipForPropertyActionsMenuClose: 'إغلاق إجراءات الخصائص' - }, - nuCache: { - refreshStatus: 'تحديث الحالة', - memoryCache: 'ذاكرة التخزين المؤقت', - memoryCacheDescription: 'هذا الزر يتيح لك إعادة تحميل ذاكرة التخزين المؤقت في الذاكرة، من خلال إعادة تحميلها بالكامل من قاعدة البيانات (ولكنه لا يعيد بناء تلك الذاكرة المؤقتة في قاعدة البيانات). هذا سريع نسبيًا. استخدمه عندما تعتقد أن ذاكرة التخزين المؤقت في الذاكرة لم يتم تحديثها بشكل صحيح، بعد بعض الأحداث التي تم تشغيلها—مما قد يشير إلى مشكلة طفيفة في Umbraco. (ملاحظة: يشغل إعادة التحميل على جميع الخوادم في بيئة LB).', - reload: 'إعادة تحميل', - databaseCache: 'ذاكرة التخزين المؤقت لقاعدة البيانات', - databaseCacheDescription: 'هذا الزر يتيح لك إعادة بناء ذاكرة التخزين المؤقت لقاعدة البيانات، أي محتوى جدول cmsContentNu. إعادة البناء يمكن أن تكون مكلفة. استخدمه عندما لا يكون إعادة التحميل كافيًا، وتعتقد أن ذاكرة التخزين المؤقت لقاعدة البيانات لم يتم إنشاؤها بشكل صحيح—مما قد يشير إلى مشكلة حاسمة في Umbraco.', - rebuild: 'إعادة بناء', - internals: 'الأنظمة الداخلية', - internalsDescription: 'هذا الزر يتيح لك تشغيل مجموعة لقطات NuCache (بعد تشغيل GC الكامل). ما لم تكن تعرف ما يعني ذلك، فمن المحتمل أنك لا تحتاج إلى استخدامه.', - collect: 'جمع', - publishedCacheStatus: 'حالة ذاكرة التخزين المؤقت المنشورة', - caches: 'ذاكرات التخزين المؤقت' - }, - profiling: { - performanceProfiling: 'تحليل الأداء', - performanceProfilingDescription: "

تشغيل Umbraco حاليًا في وضع التصحيح. هذا يعني أنه يمكنك استخدام أداة تحليل الأداء المدمجة لتقييم الأداء عند عرض الصفحات.

إذا كنت تريد تفعيل أداة التحليل لعرض صفحة معينة، أضف ببساطة umbDebug=true إلى سلسلة الاستعلام عند طلب الصفحة.

إذا كنت تريد أن يتم تفعيل أداة التحليل بشكل افتراضي لجميع عمليات عرض الصفحات، يمكنك استخدام التبديل أدناه. سيقوم بتعيين ملف تعريف في متصفحك، والذي يقوم بعد ذلك بتفعيل أداة التحليل تلقائيًا. بعبارة أخرى، ستكون أداة التحليل نشطة افتراضيًا فقط في متصفحك - وليس في متصفحات الآخرين.

", - activateByDefault: 'تفعيل أداة التحليل بشكل افتراضي', - reminder: 'تذكير ودي', - reminderDescription: '

يجب ألا تدع موقع الإنتاج يعمل في وضع التصحيح. يتم إيقاف وضع التصحيح عن طريق تعيين Umbraco:CMS:Hosting:Debug إلى false في appsettings.json أو appsettings.{Environment}.json أو عبر متغير بيئة.

', - profilerEnabledDescription: "

Umbraco حاليًا لا يعمل في وضع التصحيح، لذا لا يمكنك استخدام أداة التحليل المدمجة. هذا هو الوضع الصحيح لموقع الإنتاج.

يتم تشغيل وضع التصحيح عن طريق تعيين Umbraco:CMS:Hosting:Debug إلى true في appsettings.json أو appsettings.{Environment}.json أو عبر متغير بيئة.

" - }, - settingsDashboardVideos: { - trainingHeadline: 'ساعات من مقاطع فيديو تدريب Umbraco على بعد نقرة واحدة', - trainingDescription: '

هل تريد إتقان Umbraco؟ اقض بضع دقائق في تعلم بعض الممارسات الأفضل من خلال مشاهدة واحدة من هذه الفيديوهات حول استخدام Umbraco. وزيارة umbraco.tv لمزيد من مقاطع الفيديو حول Umbraco

' - }, - settingsDashboard: { - documentationHeader: 'التوثيق', - documentationDescription: 'اقرأ المزيد عن العمل مع العناصر في الإعدادات في توثيقنا.', - communityHeader: 'المجتمع', - communityDescription: 'اطرح سؤالاً في منتدى المجتمع أو مجتمع Discord لدينا.', - trainingHeader: 'التدريب', - trainingDescription: 'اكتشف فرص التدريب والتأهيل الرسمية', - supportHeader: 'الدعم', - supportDescription: 'قم بتوسيع فريقك مع مجموعة ماهرة ومتحمسة من خبراء Umbraco.', - videosHeader: 'مقاطع الفيديو', - videosDescription: 'شاهد مقاطع الفيديو التعليمية المجانية لدينا على قناة YouTube الخاصة بأساسيات Umbraco، لتصبح على اطلاع سريع بـ Umbraco.', - getHelp: 'احصل على المساعدة التي تحتاجها', - getCertified: 'احصل على الشهادة', - goForum: 'اذهب إلى المنتدى', - chatWithCommunity: 'الدردشة مع المجتمع', - watchVideos: 'شاهد مقاطع الفيديو' - }, - startupDashboard: { - fallbackHeadline: 'مرحبًا بك في نظام إدارة المحتوى الودود', - fallbackDescription: "شكرًا لاختيارك Umbraco - نعتقد أن هذه قد تكون بداية شيء جميل. بينما قد يبدو الأمر مربكًا في البداية، لقد بذلنا الكثير لجعل منحنى التعلم سلسًا وسريعًا قدر الإمكان." - }, - welcomeDashboard: { - ourUmbracoHeadline: 'Umbraco الخاص بنا - أكثر المجتمعات صداقة', - ourUmbracoDescription: "Umbraco الخاص بنا، الموقع الرسمي للمجتمع، هو وجهتك الشاملة لكل شيء متعلق بـ Umbraco. سواء كنت بحاجة إلى إجابة على سؤال، أو إضافات رائعة، أو دليل حول كيفية القيام بشيء ما في Umbraco، فإن أفضل وأصدق مجتمع في العالم هو مجرد نقرة بعيدًا.", - ourUmbracoButton: 'زيارة Umbraco الخاص بنا', - documentationHeadline: 'التوثيق', - documentationDescription: 'ابحث عن إجابات لجميع أسئلتك حول Umbraco', - communityHeadline: 'المجتمع', - communityDescription: 'احصل على الدعم والإلهام من خبراء Umbraco المتحمسين', - resourcesHeadline: 'الموارد', - resourcesDescription: 'دروس فيديو مجانية لبدء رحلتك مع نظام إدارة المحتوى', - trainingHeadline: 'التدريب', - trainingDescription: 'التدريب الواقعي وشهادات Umbraco الرسمية' - }, - blockEditor: { - headlineCreateBlock: 'اختيار نوع العنصر', - headlineAddSettingsElementType: 'إضافة نوع عنصر الإعدادات', - headlineAddCustomView: 'اختيار العرض', - headlineAddCustomStylesheet: 'اختيار ورقة الأنماط', - headlineAddThumbnail: 'اختيار الصورة المصغرة', - labelcreateNewElementType: 'إنشاء نوع عنصر جديد', - labelCustomStylesheet: 'ورقة أنماط مخصصة', - addCustomStylesheet: 'إضافة ورقة أنماط', - headlineEditorAppearance: 'مظهر الكتلة', - headlineDataModels: 'نماذج البيانات', - headlineCatalogueAppearance: 'مظهر الكتالوج', - labelBackgroundColor: 'لون الخلفية', - labelIconColor: 'لون الأيقونة', - labelContentElementType: 'نموذج المحتوى', - labelLabelTemplate: 'التسمية', - labelCustomView: 'عرض مخصص', - labelCustomViewInfoTitle: 'عرض وصف العرض المخصص', - labelCustomViewDescription: 'تجاوز كيفية ظهور هذه الكتلة في واجهة المستخدم الخلفية. اختر ملف .html يحتوي على تقديمك.', - labelSettingsElementType: 'نموذج الإعدادات', - labelEditorSize: 'حجم محرر التراكب', - addCustomView: 'إضافة عرض مخصص', - addSettingsElementType: 'إضافة إعدادات', - confirmDeleteBlockMessage: 'هل أنت متأكد أنك تريد حذف المحتوى %0%؟', - confirmDeleteBlockTypeMessage: 'هل أنت متأكد أنك تريد حذف تكوين الكتلة %0%؟', - confirmDeleteBlockTypeNotice: 'سيظل محتوى هذه الكتلة موجودًا، ولكن تحرير هذا المحتوى لن يكون متاحًا وسيظهر كمحتوى غير مدعوم.', - confirmDeleteBlockGroupMessage: 'هل أنت متأكد أنك تريد حذف المجموعة %0% وجميع تكوينات الكتلة الخاصة بها؟', - confirmDeleteBlockGroupNotice: 'سيظل محتوى هذه الكتل موجودًا، ولكن تحرير هذا المحتوى لن يكون متاحًا وسيظهر كمحتوى غير مدعوم.', - blockConfigurationOverlayTitle: "تكوين '%0%'", - elementTypeDoesNotExist: 'لا يمكن تحريره لأن نوع العنصر غير موجود.', - thumbnail: 'صورة مصغرة', - addThumbnail: 'إضافة صورة مصغرة', - tabCreateEmpty: 'إنشاء فارغ', - tabClipboard: 'الحافظة', - tabBlockSettings: 'الإعدادات', - headlineAdvanced: 'متقدم', - headlineCustomView: 'عرض مخصص', - forceHideContentEditor: 'إخفاء محرر المحتوى', - forceHideContentEditorHelp: 'إخفاء زر تحرير المحتوى ومحرر المحتوى من تراكب محرر الكتل', - gridInlineEditing: 'تحرير مباشر', - gridInlineEditingHelp: 'يتيح التحرير المباشر لأول خاصية. يمكن تحرير الخصائص الإضافية في التراكب.', - blockHasChanges: 'لقد أجريت تغييرات على هذا المحتوى. هل أنت متأكد أنك تريد تجاهلها؟', - confirmCancelBlockCreationHeadline: 'تجاهل الإنشاء؟', - confirmCancelBlockCreationMessage: 'هل أنت متأكد أنك تريد إلغاء الإنشاء.', - elementTypeDoesNotExistHeadline: 'خطأ!', - elementTypeDoesNotExistDescription: 'نوع العنصر لهذه الكتلة لم يعد موجودًا', - addBlock: 'إضافة محتوى', - addThis: 'إضافة %0%', - propertyEditorNotSupported: "الخاصية '%0%' تستخدم المحرر '%1%' والذي لا يدعمه الكتل.", - focusParentBlock: 'تعيين التركيز على الكتلة الحاوية', - areaIdentification: 'التحديد', - areaValidation: 'التحقق', - areaValidationEntriesShort: '%0% يجب أن تكون موجودة على الأقل %2% مرة(s).', - areaValidationEntriesExceed: '%0% يجب أن تكون موجودة بحد أقصى %3% مرة(s).', - areaNumberOfBlocks: 'عدد الكتل', - areaDisallowAllBlocks: 'السماح بأنواع كتل محددة فقط', - areaAllowedBlocks: 'أنواع الكتل المسموح بها', - areaAllowedBlocksHelp: 'حدد أنواع الكتل المسموح بها في هذه المنطقة، واختياريًا عدد كل نوع من الأنواع التي يجب أن تكون موجودة.', - confirmDeleteBlockAreaMessage: 'هل أنت متأكد أنك تريد حذف هذه المنطقة؟', - confirmDeleteBlockAreaNotice: 'أي كتل تم إنشاؤها حاليًا داخل هذه المنطقة سيتم حذفها.', - layoutOptions: 'خيارات التخطيط', - structuralOptions: 'هيكلية', - sizeOptions: 'خيارات الحجم', - sizeOptionsHelp: 'حدد خيارًا أو أكثر من خيارات الحجم، هذا يمكن أن يتيح تغيير حجم الكتلة', - allowedBlockColumns: 'امتدادات الأعمدة المتاحة', - allowedBlockColumnsHelp: 'حدد عدد الأعمدة المختلفة التي يُسمح لهذه الكتلة بالامتداد عبرها. هذا لا يمنع الكتل من وضعها في مناطق ذات امتداد أعمدة أصغر.', - allowedBlockRows: 'امتدادات الصفوف المتاحة', - allowedBlockRowsHelp: 'حدد نطاق الصفوف التخطيطية التي يُسمح لهذه الكتلة بالامتداد عبرها.', - allowBlockInRoot: 'السماح في الجذر', - allowBlockInRootHelp: 'اجعل هذه الكتلة متاحة في جذر التخطيط.', - allowBlockInAreas: 'السماح في المناطق', - allowBlockInAreasHelp: 'اجعل هذه الكتلة متاحة افتراضيًا ضمن مناطق كتل أخرى (ما لم يتم تعيين أذونات صريحة لهذه المناطق).', - areaAllowedBlocksEmpty: 'افتراضيًا، جميع أنواع الكتل مسموح بها في منطقة، استخدم هذا الخيار للسماح بأنواع محددة فقط.', - areas: 'المناطق', - areasLayoutColumns: 'أعمدة الشبكة للمناطق', - areasLayoutColumnsHelp: 'حدد عدد الأعمدة المتاحة للمناطق. إذا لم يتم تحديدها، سيتم استخدام عدد الأعمدة المحدد للتخطيط الكامل.', - areasConfigurations: 'المناطق', - areasConfigurationsHelp: 'لتمكين تداخل الكتل داخل هذه الكتلة، حدد منطقة واحدة أو أكثر. تتبع المناطق التخطيط المحدد من خلال تكوين عمود الشبكة الخاص بها. يمكن تعديل "امتداد العمود" و "امتداد الصف" لكل منطقة باستخدام مربع مقبض التدرج في الزاوية السفلى اليمنى من المنطقة المحددة.', - invalidDropPosition: '%0% غير مسموح به في هذا الموضع.', - defaultLayoutStylesheet: 'ورقة أنماط التخطيط الافتراضية', - confirmPasteDisallowedNestedBlockHeadline: 'تم رفض المحتوى غير المسموح به', - confirmPasteDisallowedNestedBlockMessage: 'احتوى المحتوى الذي تم إدراجه على محتوى غير مسموح به، والذي لم يتم إنشاؤه. هل ترغب في الاحتفاظ ببقية هذا المحتوى على أي حال؟', - areaAliasHelp: 'عند استخدام GetBlockGridHTML() لعرض شبكة الكتل، سيتم عرض الاسم المستعار في الشيفرة المصدرية كخاصية \'data-area-alias\'. استخدم خاصية الاسم المستعار لاستهداف العنصر للمنطقة. مثال. .umb-block-grid__area[data-area-alias="MyAreaAlias"] { ... }', - scaleHandlerButtonTitle: 'اسحب للتغيير الحجم', - areaCreateLabelTitle: 'تسمية زر الإنشاء', - areaCreateLabelHelp: 'تجاوز نص التسمية لإضافة كتلة جديدة إلى هذه المنطقة، مثال: "إضافة عنصر واجهة المستخدم"', - showSizeOptions: 'عرض خيارات تغيير الحجم', - addBlockType: 'إضافة كتلة', - addBlockGroup: 'إضافة مجموعة', - pickSpecificAllowance: 'اختر مجموعة أو كتلة', - allowanceMinimum: 'تحديد الحد الأدنى المطلوب', - allowanceMaximum: 'تحديد الحد الأقصى المطلوب', - block: 'كتلة', - tabBlock: 'كتلة', - tabBlockTypeSettings: 'الإعدادات', - tabAreas: 'المناطق', - tabAdvanced: 'متقدم', - headlineAllowance: 'الأذونات', - getSampleHeadline: 'تثبيت التكوين التجريبي', - getSampleDescription: "سيضيف هذا كتل أساسية ويساعدك على البدء باستخدام محرر شبكة الكتل. ستحصل على كتل للعناوين والنصوص الغنية والصور، بالإضافة إلى تخطيط بعمودين.", - getSampleButton: 'تثبيت', - actionEnterSortMode: 'وضع الترتيب', - actionExitSortMode: 'إنهاء وضع الترتيب', - areaAliasIsNotUnique: 'يجب أن يكون اسم المنطقة هذا فريد مقارنةً بالمناطق الأخرى لهذه الكتلة.', - configureArea: 'تكوين المنطقة', - deleteArea: 'حذف المنطقة', - addColumnSpanOption: 'إضافة خيار امتداد %0% عمود' - }, - contentTemplatesDashboard: { - whatHeadline: 'ما هي المخططات الوثائقية؟', - whatDescription: 'المخططات الوثائقية هي محتوى مُعرّف مسبقًا يمكن تحديده عند إنشاء عقدة محتوى جديدة.', - createHeadline: 'كيف يمكنني إنشاء مخطط وثائقي؟', - createDescription: '

هناك طريقتان لإنشاء مخطط وثائقي:

  • انقر بزر الماوس الأيمن على عقدة المحتوى واختر "إنشاء مخطط وثائقي" لإنشاء مخطط وثائقي جديد.
  • انقر بزر الماوس الأيمن على شجرة المخططات الوثائقية في قسم الإعدادات واختر نوع الوثيقة الذي تريد إنشاء مخطط وثائقي له.

بمجرد إعطائها اسمًا، يمكن للمحررين البدء في استخدام المخطط الوثائقي كأساس لصفحتهم الجديدة.

', - manageHeadline: 'كيف يمكنني إدارة المخططات الوثائقية؟', - manageDescription: 'يمكنك تعديل وحذف المخططات الوثائقية من "شجرة المخططات الوثائقية" في قسم الإعدادات. قم بتوسيع نوع الوثيقة الذي يعتمد عليه المخطط الوثائقي وانقر عليه لتعديله أو حذفه.' - }, - preview: { - endLabel: 'نهاية', - endTitle: 'إنهاء وضع المعاينة', - openWebsiteLabel: 'معاينة الموقع', - openWebsiteTitle: 'فتح الموقع في وضع المعاينة', - returnToPreviewHeadline: 'معاينة الموقع؟', - returnToPreviewDescription: 'لقد انتهيت من وضع المعاينة، هل ترغب في تمكينه مرة أخرى لعرض أحدث إصدار محفوظ من موقعك؟', - returnToPreviewAcceptButton: 'معاينة أحدث إصدار', - returnToPreviewDeclineButton: 'عرض الإصدار المنشور', - viewPublishedContentHeadline: 'عرض الإصدار المنشور؟', - viewPublishedContentDescription: 'أنت في وضع المعاينة، هل تريد الخروج لعرض الإصدار المنشور لموقعك؟', - viewPublishedContentAcceptButton: 'عرض الإصدار المنشور', - viewPublishedContentDeclineButton: 'البقاء في وضع المعاينة' - }, - permissions: { - FolderCreation: 'إنشاء مجلد', - FileWritingForPackages: 'كتابة الملفات للحزم', - FileWriting: 'كتابة الملفات', - MediaFolderCreation: 'إنشاء مجلد الوسائط' - }, - treeSearch: { - searchResult: 'عنصر تم إرجاعه', - searchResults: 'عناصر تم إرجاعها' - }, - analytics: { - consentForAnalytics: 'الموافقة على بيانات التتبع', - analyticsLevelSavedSuccess: 'تم حفظ مستوى التتبع!', - analyticsDescription: '\n لتحسين Umbraco وإضافة ميزات جديدة بناءً على معلومات ذات صلة قدر الإمكان،\n
نود جمع معلومات النظام والاستخدام من تثبيتك.\n
سيتم مشاركة البيانات المجمعة بانتظام بالإضافة إلى الدروس المستفادة من هذه المقاييس.\n
نأمل أن تساعدنا في جمع بعض البيانات القيمة.\n
\n
نحن لن نقوم بجمع أي بيانات شخصية مثل المحتوى أو الكود أو معلومات المستخدم، وستكون جميع البيانات مجهولة الهوية تمامًا.\n ', - minimalLevelDescription: 'سوف نرسل فقط معرف موقع مجهول الهوية لإعلامنا بوجود الموقع.', - basicLevelDescription: 'سوف نرسل معرف موقع مجهول الهوية، إصدار Umbraco، والحزم المثبتة', - detailedLevelDescription: '\n سوف نرسل:\n
    \n
  • معرف موقع مجهول الهوية، إصدار Umbraco، والحزم المثبتة.
  • \n
  • عدد: العقد الجذرية، العقد المحتوى، الوسائط، أنواع الوثائق، القوالب، اللغات، النطاقات، مجموعات المستخدمين، المستخدمين، الأعضاء، مقدمي تسجيل الدخول الخارجيين إلى المكتب الخلفي، ومحرري الخصائص قيد الاستخدام.
  • \n
  • معلومات النظام: خادم الويب، نظام تشغيل الخادم، إطار عمل الخادم، لغة نظام تشغيل الخادم، ومزود قاعدة البيانات.
  • \n
  • إعدادات التكوين: وضع Modelsbuilder، إذا كان هناك مسار Umbraco مخصص، بيئة ASP، ما إذا كان API التوصيل مفعلًا، ويتيح الوصول العام، وإذا كنت في وضع التصحيح.
  • \n
\n قد نغير ما نرسله على المستوى التفصيلي في المستقبل. إذا كان الأمر كذلك، فسيتم سردها أعلاه.\n
من خلال اختيار "تفصيلي" توافق على جمع المعلومات المجهولة الهوية الحالية والمستقبلية.
\n ' - }, - routing: { - routeNotFoundTitle: 'لم يتم العثور على الصفحة', - routeNotFoundDescription: 'لم يتم العثور على المسار المطلوب. يرجى التحقق من عنوان URL والمحاولة مرة أخرى.' - }, - codeEditor: { - label: 'محرر الأكواد', - languageConfigLabel: 'اللغة', - languageConfigDescription: 'اختر اللغة لتظليل بناء الجملة وIntelliSense.', - heightConfigLabel: 'الارتفاع', - heightConfigDescription: 'حدد ارتفاع محرر الأكواد بالبكسل.', - lineNumbersConfigLabel: 'أرقام الأسطر', - lineNumbersConfigDescription: 'عرض أرقام الأسطر في محرر الأكواد.', - minimapConfigLabel: 'خريطة مصغرة', - minimapConfigDescription: 'عرض خريطة مصغرة في محرر الأكواد.', - wordWrapConfigLabel: 'تغليف الكلمات', - wordWrapConfigDescription: 'تفعيل تغليف الكلمات في محرر الأكواد.' - } + logViewer: { + deleteSavedSearch: 'حذف البحث المحفوظ', + logLevels: 'مستويات السجل', + selectAllLogLevelFilters: 'تحديد الكل', + deselectAllLogLevelFilters: 'إلغاء تحديد الكل', + savedSearches: 'البحث المحفوظ', + saveSearch: 'حفظ البحث', + saveSearchDescription: 'أدخل اسمًا وديًا لاستعلام البحث الخاص بك', + filterSearch: 'تصفية البحث', + totalItems: 'إجمالي العناصر', + timestamp: 'الطابع الزمني', + level: 'المستوى', + machine: 'الآلة', + message: 'الرسالة', + exception: 'الاستثناء', + properties: 'الخصائص', + searchWithGoogle: 'البحث باستخدام جوجل', + searchThisMessageWithGoogle: 'ابحث عن هذه الرسالة باستخدام جوجل', + searchWithBing: 'البحث باستخدام بينج', + searchThisMessageWithBing: 'ابحث عن هذه الرسالة باستخدام بينج', + searchOurUmbraco: 'البحث في Umbraco الخاص بنا', + searchThisMessageOnOurUmbracoForumsAndDocs: 'ابحث عن هذه الرسالة في منتديات ومراسلات Umbraco الخاصة بنا', + searchOurUmbracoWithGoogle: 'البحث في Umbraco الخاص بنا باستخدام جوجل', + searchOurUmbracoForumsUsingGoogle: 'البحث في منتديات Umbraco الخاصة بنا باستخدام جوجل', + searchUmbracoSource: 'البحث في مصدر Umbraco', + searchWithinUmbracoSourceCodeOnGithub: 'البحث ضمن كود مصدر Umbraco على Github', + searchUmbracoIssues: 'البحث في قضايا Umbraco', + searchUmbracoIssuesOnGithub: 'البحث في قضايا Umbraco على Github', + deleteThisSearch: 'حذف هذا البحث', + findLogsWithRequestId: 'البحث في السجلات باستخدام معرّف الطلب', + findLogsWithNamespace: 'البحث في السجلات باستخدام النطاق', + findLogsWithMachineName: 'البحث في السجلات باستخدام اسم الآلة', + open: 'فتح', + polling: 'استطلاع', + every2: 'كل 2 ثانية', + every5: 'كل 5 ثوانٍ', + every10: 'كل 10 ثوانٍ', + every20: 'كل 20 ثانية', + every30: 'كل 30 ثانية', + pollingEvery2: 'استطلاع كل 2 ثانية', + pollingEvery5: 'استطلاع كل 5 ثوانٍ', + pollingEvery10: 'استطلاع كل 10 ثوانٍ', + pollingEvery20: 'استطلاع كل 20 ثانية', + pollingEvery30: 'استطلاع كل 30 ثانية', + }, + clipboard: { + labelForCopyAllEntries: 'نسخ %0%', + labelForArrayOfItemsFrom: '%0% من %1%', + labelForArrayOfItems: 'مجموعة من %0%', + labelForRemoveAllEntries: 'إزالة جميع العناصر', + labelForClearClipboard: 'مسح الحافظة', + labelForCopyToClipboard: 'نسخ إلى الحافظة', + }, + propertyActions: { + tooltipForPropertyActionsMenu: 'فتح إجراءات الخصائص', + tooltipForPropertyActionsMenuClose: 'إغلاق إجراءات الخصائص', + }, + nuCache: { + refreshStatus: 'تحديث الحالة', + memoryCache: 'ذاكرة التخزين المؤقت', + memoryCacheDescription: + 'هذا الزر يتيح لك إعادة تحميل ذاكرة التخزين المؤقت في الذاكرة، من خلال إعادة تحميلها بالكامل من قاعدة البيانات (ولكنه لا يعيد بناء تلك الذاكرة المؤقتة في قاعدة البيانات). هذا سريع نسبيًا. استخدمه عندما تعتقد أن ذاكرة التخزين المؤقت في الذاكرة لم يتم تحديثها بشكل صحيح، بعد بعض الأحداث التي تم تشغيلها—مما قد يشير إلى مشكلة طفيفة في Umbraco. (ملاحظة: يشغل إعادة التحميل على جميع الخوادم في بيئة LB).', + reload: 'إعادة تحميل', + databaseCache: 'ذاكرة التخزين المؤقت لقاعدة البيانات', + databaseCacheDescription: + 'هذا الزر يتيح لك إعادة بناء ذاكرة التخزين المؤقت لقاعدة البيانات، أي محتوى جدول cmsContentNu. إعادة البناء يمكن أن تكون مكلفة. استخدمه عندما لا يكون إعادة التحميل كافيًا، وتعتقد أن ذاكرة التخزين المؤقت لقاعدة البيانات لم يتم إنشاؤها بشكل صحيح—مما قد يشير إلى مشكلة حاسمة في Umbraco.', + rebuild: 'إعادة بناء', + internals: 'الأنظمة الداخلية', + internalsDescription: + 'هذا الزر يتيح لك تشغيل مجموعة لقطات NuCache (بعد تشغيل GC الكامل). ما لم تكن تعرف ما يعني ذلك، فمن المحتمل أنك لا تحتاج إلى استخدامه.', + collect: 'جمع', + publishedCacheStatus: 'حالة ذاكرة التخزين المؤقت المنشورة', + caches: 'ذاكرات التخزين المؤقت', + }, + profiling: { + performanceProfiling: 'تحليل الأداء', + performanceProfilingDescription: + '

تشغيل Umbraco حاليًا في وضع التصحيح. هذا يعني أنه يمكنك استخدام أداة تحليل الأداء المدمجة لتقييم الأداء عند عرض الصفحات.

إذا كنت تريد تفعيل أداة التحليل لعرض صفحة معينة، أضف ببساطة umbDebug=true إلى سلسلة الاستعلام عند طلب الصفحة.

إذا كنت تريد أن يتم تفعيل أداة التحليل بشكل افتراضي لجميع عمليات عرض الصفحات، يمكنك استخدام التبديل أدناه. سيقوم بتعيين ملف تعريف في متصفحك، والذي يقوم بعد ذلك بتفعيل أداة التحليل تلقائيًا. بعبارة أخرى، ستكون أداة التحليل نشطة افتراضيًا فقط في متصفحك - وليس في متصفحات الآخرين.

', + activateByDefault: 'تفعيل أداة التحليل بشكل افتراضي', + reminder: 'تذكير ودي', + reminderDescription: + '

يجب ألا تدع موقع الإنتاج يعمل في وضع التصحيح. يتم إيقاف وضع التصحيح عن طريق تعيين Umbraco:CMS:Hosting:Debug إلى false في appsettings.json أو appsettings.{Environment}.json أو عبر متغير بيئة.

', + profilerEnabledDescription: + '

Umbraco حاليًا لا يعمل في وضع التصحيح، لذا لا يمكنك استخدام أداة التحليل المدمجة. هذا هو الوضع الصحيح لموقع الإنتاج.

يتم تشغيل وضع التصحيح عن طريق تعيين Umbraco:CMS:Hosting:Debug إلى true في appsettings.json أو appsettings.{Environment}.json أو عبر متغير بيئة.

', + }, + settingsDashboardVideos: { + trainingHeadline: 'ساعات من مقاطع فيديو تدريب Umbraco على بعد نقرة واحدة', + trainingDescription: + '

هل تريد إتقان Umbraco؟ اقض بضع دقائق في تعلم بعض الممارسات الأفضل من خلال مشاهدة واحدة من هذه الفيديوهات حول استخدام Umbraco. وزيارة umbraco.tv لمزيد من مقاطع الفيديو حول Umbraco

', + }, + settingsDashboard: { + documentationHeader: 'التوثيق', + documentationDescription: 'اقرأ المزيد عن العمل مع العناصر في الإعدادات في توثيقنا.', + communityHeader: 'المجتمع', + communityDescription: 'اطرح سؤالاً في منتدى المجتمع أو مجتمع Discord لدينا.', + trainingHeader: 'التدريب', + trainingDescription: 'اكتشف فرص التدريب والتأهيل الرسمية', + supportHeader: 'الدعم', + supportDescription: 'قم بتوسيع فريقك مع مجموعة ماهرة ومتحمسة من خبراء Umbraco.', + videosHeader: 'مقاطع الفيديو', + videosDescription: + 'شاهد مقاطع الفيديو التعليمية المجانية لدينا على قناة YouTube الخاصة بأساسيات Umbraco، لتصبح على اطلاع سريع بـ Umbraco.', + getHelp: 'احصل على المساعدة التي تحتاجها', + getCertified: 'احصل على الشهادة', + goForum: 'اذهب إلى المنتدى', + chatWithCommunity: 'الدردشة مع المجتمع', + watchVideos: 'شاهد مقاطع الفيديو', + }, + startupDashboard: { + fallbackHeadline: 'مرحبًا بك في نظام إدارة المحتوى الودود', + fallbackDescription: + 'شكرًا لاختيارك Umbraco - نعتقد أن هذه قد تكون بداية شيء جميل. بينما قد يبدو الأمر مربكًا في البداية، لقد بذلنا الكثير لجعل منحنى التعلم سلسًا وسريعًا قدر الإمكان.', + }, + welcomeDashboard: { + ourUmbracoHeadline: 'Umbraco الخاص بنا - أكثر المجتمعات صداقة', + ourUmbracoDescription: + 'Umbraco الخاص بنا، الموقع الرسمي للمجتمع، هو وجهتك الشاملة لكل شيء متعلق بـ Umbraco. سواء كنت بحاجة إلى إجابة على سؤال، أو إضافات رائعة، أو دليل حول كيفية القيام بشيء ما في Umbraco، فإن أفضل وأصدق مجتمع في العالم هو مجرد نقرة بعيدًا.', + ourUmbracoButton: 'زيارة Umbraco الخاص بنا', + documentationHeadline: 'التوثيق', + documentationDescription: 'ابحث عن إجابات لجميع أسئلتك حول Umbraco', + communityHeadline: 'المجتمع', + communityDescription: 'احصل على الدعم والإلهام من خبراء Umbraco المتحمسين', + resourcesHeadline: 'الموارد', + resourcesDescription: 'دروس فيديو مجانية لبدء رحلتك مع نظام إدارة المحتوى', + trainingHeadline: 'التدريب', + trainingDescription: 'التدريب الواقعي وشهادات Umbraco الرسمية', + }, + blockEditor: { + headlineCreateBlock: 'اختيار نوع العنصر', + headlineAddSettingsElementType: 'إضافة نوع عنصر الإعدادات', + headlineAddCustomView: 'اختيار العرض', + headlineAddCustomStylesheet: 'اختيار ورقة الأنماط', + headlineAddThumbnail: 'اختيار الصورة المصغرة', + labelcreateNewElementType: 'إنشاء نوع عنصر جديد', + labelCustomStylesheet: 'ورقة أنماط مخصصة', + addCustomStylesheet: 'إضافة ورقة أنماط', + headlineEditorAppearance: 'مظهر الكتلة', + headlineDataModels: 'نماذج البيانات', + headlineCatalogueAppearance: 'مظهر الكتالوج', + labelBackgroundColor: 'لون الخلفية', + labelIconColor: 'لون الأيقونة', + labelContentElementType: 'نموذج المحتوى', + labelLabelTemplate: 'التسمية', + labelCustomView: 'عرض مخصص', + labelCustomViewInfoTitle: 'عرض وصف العرض المخصص', + labelCustomViewDescription: + 'تجاوز كيفية ظهور هذه الكتلة في واجهة المستخدم الخلفية. اختر ملف .html يحتوي على تقديمك.', + labelSettingsElementType: 'نموذج الإعدادات', + labelEditorSize: 'حجم محرر التراكب', + addCustomView: 'إضافة عرض مخصص', + addSettingsElementType: 'إضافة إعدادات', + confirmDeleteBlockMessage: 'هل أنت متأكد أنك تريد حذف المحتوى %0%؟', + confirmDeleteBlockTypeMessage: 'هل أنت متأكد أنك تريد حذف تكوين الكتلة %0%؟', + confirmDeleteBlockTypeNotice: + 'سيظل محتوى هذه الكتلة موجودًا، ولكن تحرير هذا المحتوى لن يكون متاحًا وسيظهر كمحتوى غير مدعوم.', + confirmDeleteBlockGroupMessage: + 'هل أنت متأكد أنك تريد حذف المجموعة %0% وجميع تكوينات الكتلة الخاصة بها؟', + confirmDeleteBlockGroupNotice: + 'سيظل محتوى هذه الكتل موجودًا، ولكن تحرير هذا المحتوى لن يكون متاحًا وسيظهر كمحتوى غير مدعوم.', + blockConfigurationOverlayTitle: "تكوين '%0%'", + elementTypeDoesNotExist: 'لا يمكن تحريره لأن نوع العنصر غير موجود.', + thumbnail: 'صورة مصغرة', + addThumbnail: 'إضافة صورة مصغرة', + tabCreateEmpty: 'إنشاء فارغ', + tabClipboard: 'الحافظة', + tabBlockSettings: 'الإعدادات', + headlineAdvanced: 'متقدم', + headlineCustomView: 'عرض مخصص', + forceHideContentEditor: 'إخفاء محرر المحتوى', + forceHideContentEditorHelp: 'إخفاء زر تحرير المحتوى ومحرر المحتوى من تراكب محرر الكتل', + gridInlineEditing: 'تحرير مباشر', + gridInlineEditingHelp: 'يتيح التحرير المباشر لأول خاصية. يمكن تحرير الخصائص الإضافية في التراكب.', + blockHasChanges: 'لقد أجريت تغييرات على هذا المحتوى. هل أنت متأكد أنك تريد تجاهلها؟', + confirmCancelBlockCreationHeadline: 'تجاهل الإنشاء؟', + confirmCancelBlockCreationMessage: 'هل أنت متأكد أنك تريد إلغاء الإنشاء.', + elementTypeDoesNotExistHeadline: 'خطأ!', + elementTypeDoesNotExistDescription: 'نوع العنصر لهذه الكتلة لم يعد موجودًا', + addBlock: 'إضافة محتوى', + addThis: 'إضافة %0%', + propertyEditorNotSupported: "الخاصية '%0%' تستخدم المحرر '%1%' والذي لا يدعمه الكتل.", + focusParentBlock: 'تعيين التركيز على الكتلة الحاوية', + areaIdentification: 'التحديد', + areaValidation: 'التحقق', + areaValidationEntriesShort: '%0% يجب أن تكون موجودة على الأقل %2% مرة(s).', + areaValidationEntriesExceed: '%0% يجب أن تكون موجودة بحد أقصى %3% مرة(s).', + areaNumberOfBlocks: 'عدد الكتل', + areaDisallowAllBlocks: 'السماح بأنواع كتل محددة فقط', + areaAllowedBlocks: 'أنواع الكتل المسموح بها', + areaAllowedBlocksHelp: + 'حدد أنواع الكتل المسموح بها في هذه المنطقة، واختياريًا عدد كل نوع من الأنواع التي يجب أن تكون موجودة.', + confirmDeleteBlockAreaMessage: 'هل أنت متأكد أنك تريد حذف هذه المنطقة؟', + confirmDeleteBlockAreaNotice: 'أي كتل تم إنشاؤها حاليًا داخل هذه المنطقة سيتم حذفها.', + layoutOptions: 'خيارات التخطيط', + structuralOptions: 'هيكلية', + sizeOptions: 'خيارات الحجم', + sizeOptionsHelp: 'حدد خيارًا أو أكثر من خيارات الحجم، هذا يمكن أن يتيح تغيير حجم الكتلة', + allowedBlockColumns: 'امتدادات الأعمدة المتاحة', + allowedBlockColumnsHelp: + 'حدد عدد الأعمدة المختلفة التي يُسمح لهذه الكتلة بالامتداد عبرها. هذا لا يمنع الكتل من وضعها في مناطق ذات امتداد أعمدة أصغر.', + allowedBlockRows: 'امتدادات الصفوف المتاحة', + allowedBlockRowsHelp: 'حدد نطاق الصفوف التخطيطية التي يُسمح لهذه الكتلة بالامتداد عبرها.', + allowBlockInRoot: 'السماح في الجذر', + allowBlockInRootHelp: 'اجعل هذه الكتلة متاحة في جذر التخطيط.', + allowBlockInAreas: 'السماح في المناطق', + allowBlockInAreasHelp: + 'اجعل هذه الكتلة متاحة افتراضيًا ضمن مناطق كتل أخرى (ما لم يتم تعيين أذونات صريحة لهذه المناطق).', + areaAllowedBlocksEmpty: + 'افتراضيًا، جميع أنواع الكتل مسموح بها في منطقة، استخدم هذا الخيار للسماح بأنواع محددة فقط.', + areas: 'المناطق', + areasLayoutColumns: 'أعمدة الشبكة للمناطق', + areasLayoutColumnsHelp: + 'حدد عدد الأعمدة المتاحة للمناطق. إذا لم يتم تحديدها، سيتم استخدام عدد الأعمدة المحدد للتخطيط الكامل.', + areasConfigurations: 'المناطق', + areasConfigurationsHelp: + 'لتمكين تداخل الكتل داخل هذه الكتلة، حدد منطقة واحدة أو أكثر. تتبع المناطق التخطيط المحدد من خلال تكوين عمود الشبكة الخاص بها. يمكن تعديل "امتداد العمود" و "امتداد الصف" لكل منطقة باستخدام مربع مقبض التدرج في الزاوية السفلى اليمنى من المنطقة المحددة.', + invalidDropPosition: '%0% غير مسموح به في هذا الموضع.', + defaultLayoutStylesheet: 'ورقة أنماط التخطيط الافتراضية', + confirmPasteDisallowedNestedBlockHeadline: 'تم رفض المحتوى غير المسموح به', + confirmPasteDisallowedNestedBlockMessage: + 'احتوى المحتوى الذي تم إدراجه على محتوى غير مسموح به، والذي لم يتم إنشاؤه. هل ترغب في الاحتفاظ ببقية هذا المحتوى على أي حال؟', + areaAliasHelp: + 'عند استخدام GetBlockGridHTML() لعرض شبكة الكتل، سيتم عرض الاسم المستعار في الشيفرة المصدرية كخاصية \'data-area-alias\'. استخدم خاصية الاسم المستعار لاستهداف العنصر للمنطقة. مثال. .umb-block-grid__area[data-area-alias="MyAreaAlias"] { ... }', + scaleHandlerButtonTitle: 'اسحب للتغيير الحجم', + areaCreateLabelTitle: 'تسمية زر الإنشاء', + areaCreateLabelHelp: 'تجاوز نص التسمية لإضافة كتلة جديدة إلى هذه المنطقة، مثال: "إضافة عنصر واجهة المستخدم"', + showSizeOptions: 'عرض خيارات تغيير الحجم', + addBlockType: 'إضافة كتلة', + addBlockGroup: 'إضافة مجموعة', + pickSpecificAllowance: 'اختر مجموعة أو كتلة', + allowanceMinimum: 'تحديد الحد الأدنى المطلوب', + allowanceMaximum: 'تحديد الحد الأقصى المطلوب', + block: 'كتلة', + tabBlock: 'كتلة', + tabBlockTypeSettings: 'الإعدادات', + tabAreas: 'المناطق', + tabAdvanced: 'متقدم', + headlineAllowance: 'الأذونات', + getSampleHeadline: 'تثبيت التكوين التجريبي', + getSampleDescription: + 'سيضيف هذا كتل أساسية ويساعدك على البدء باستخدام محرر شبكة الكتل. ستحصل على كتل للعناوين والنصوص الغنية والصور، بالإضافة إلى تخطيط بعمودين.', + getSampleButton: 'تثبيت', + actionEnterSortMode: 'وضع الترتيب', + actionExitSortMode: 'إنهاء وضع الترتيب', + areaAliasIsNotUnique: 'يجب أن يكون اسم المنطقة هذا فريد مقارنةً بالمناطق الأخرى لهذه الكتلة.', + configureArea: 'تكوين المنطقة', + deleteArea: 'حذف المنطقة', + addColumnSpanOption: 'إضافة خيار امتداد %0% عمود', + }, + contentTemplatesDashboard: { + whatHeadline: 'ما هي المخططات الوثائقية؟', + whatDescription: 'المخططات الوثائقية هي محتوى مُعرّف مسبقًا يمكن تحديده عند إنشاء عقدة محتوى جديدة.', + createHeadline: 'كيف يمكنني إنشاء مخطط وثائقي؟', + createDescription: + '

هناك طريقتان لإنشاء مخطط وثائقي:

  • انقر بزر الماوس الأيمن على عقدة المحتوى واختر "إنشاء مخطط وثائقي" لإنشاء مخطط وثائقي جديد.
  • انقر بزر الماوس الأيمن على شجرة المخططات الوثائقية في قسم الإعدادات واختر نوع الوثيقة الذي تريد إنشاء مخطط وثائقي له.

بمجرد إعطائها اسمًا، يمكن للمحررين البدء في استخدام المخطط الوثائقي كأساس لصفحتهم الجديدة.

', + manageHeadline: 'كيف يمكنني إدارة المخططات الوثائقية؟', + manageDescription: + 'يمكنك تعديل وحذف المخططات الوثائقية من "شجرة المخططات الوثائقية" في قسم الإعدادات. قم بتوسيع نوع الوثيقة الذي يعتمد عليه المخطط الوثائقي وانقر عليه لتعديله أو حذفه.', + }, + preview: { + endLabel: 'نهاية', + endTitle: 'إنهاء وضع المعاينة', + openWebsiteLabel: 'معاينة الموقع', + openWebsiteTitle: 'فتح الموقع في وضع المعاينة', + returnToPreviewHeadline: 'معاينة الموقع؟', + returnToPreviewDescription: + 'لقد انتهيت من وضع المعاينة، هل ترغب في تمكينه مرة أخرى لعرض أحدث إصدار محفوظ من موقعك؟', + returnToPreviewAcceptButton: 'معاينة أحدث إصدار', + returnToPreviewDeclineButton: 'عرض الإصدار المنشور', + viewPublishedContentHeadline: 'عرض الإصدار المنشور؟', + viewPublishedContentDescription: 'أنت في وضع المعاينة، هل تريد الخروج لعرض الإصدار المنشور لموقعك؟', + viewPublishedContentAcceptButton: 'عرض الإصدار المنشور', + viewPublishedContentDeclineButton: 'البقاء في وضع المعاينة', + }, + permissions: { + FolderCreation: 'إنشاء مجلد', + FileWritingForPackages: 'كتابة الملفات للحزم', + FileWriting: 'كتابة الملفات', + MediaFolderCreation: 'إنشاء مجلد الوسائط', + }, + treeSearch: { + searchResult: 'عنصر تم إرجاعه', + searchResults: 'عناصر تم إرجاعها', + }, + analytics: { + consentForAnalytics: 'الموافقة على بيانات التتبع', + analyticsLevelSavedSuccess: 'تم حفظ مستوى التتبع!', + analyticsDescription: + '\n لتحسين Umbraco وإضافة ميزات جديدة بناءً على معلومات ذات صلة قدر الإمكان،\n
نود جمع معلومات النظام والاستخدام من تثبيتك.\n
سيتم مشاركة البيانات المجمعة بانتظام بالإضافة إلى الدروس المستفادة من هذه المقاييس.\n
نأمل أن تساعدنا في جمع بعض البيانات القيمة.\n
\n
نحن لن نقوم بجمع أي بيانات شخصية مثل المحتوى أو الكود أو معلومات المستخدم، وستكون جميع البيانات مجهولة الهوية تمامًا.\n ', + minimalLevelDescription: 'سوف نرسل فقط معرف موقع مجهول الهوية لإعلامنا بوجود الموقع.', + basicLevelDescription: 'سوف نرسل معرف موقع مجهول الهوية، إصدار Umbraco، والحزم المثبتة', + detailedLevelDescription: + '\n سوف نرسل:\n
    \n
  • معرف موقع مجهول الهوية، إصدار Umbraco، والحزم المثبتة.
  • \n
  • عدد: العقد الجذرية، العقد المحتوى، الوسائط، أنواع الوثائق، القوالب، اللغات، النطاقات، مجموعات المستخدمين، المستخدمين، الأعضاء، مقدمي تسجيل الدخول الخارجيين إلى المكتب الخلفي، ومحرري الخصائص قيد الاستخدام.
  • \n
  • معلومات النظام: خادم الويب، نظام تشغيل الخادم، إطار عمل الخادم، لغة نظام تشغيل الخادم، ومزود قاعدة البيانات.
  • \n
  • إعدادات التكوين: وضع Modelsbuilder، إذا كان هناك مسار Umbraco مخصص، بيئة ASP، ما إذا كان API التوصيل مفعلًا، ويتيح الوصول العام، وإذا كنت في وضع التصحيح.
  • \n
\n قد نغير ما نرسله على المستوى التفصيلي في المستقبل. إذا كان الأمر كذلك، فسيتم سردها أعلاه.\n
من خلال اختيار "تفصيلي" توافق على جمع المعلومات المجهولة الهوية الحالية والمستقبلية.
\n ', + }, + routing: { + routeNotFoundTitle: 'لم يتم العثور على الصفحة', + routeNotFoundDescription: 'لم يتم العثور على المسار المطلوب. يرجى التحقق من عنوان URL والمحاولة مرة أخرى.', + }, + codeEditor: { + label: 'محرر الأكواد', + languageConfigLabel: 'اللغة', + languageConfigDescription: 'اختر اللغة لتظليل بناء الجملة وIntelliSense.', + heightConfigLabel: 'الارتفاع', + heightConfigDescription: 'حدد ارتفاع محرر الأكواد بالبكسل.', + lineNumbersConfigLabel: 'أرقام الأسطر', + lineNumbersConfigDescription: 'عرض أرقام الأسطر في محرر الأكواد.', + minimapConfigLabel: 'خريطة مصغرة', + minimapConfigDescription: 'عرض خريطة مصغرة في محرر الأكواد.', + wordWrapConfigLabel: 'تغليف الكلمات', + wordWrapConfigDescription: 'تفعيل تغليف الكلمات في محرر الأكواد.', + }, } as UmbLocalizationDictionary; diff --git a/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts index cce0b9a4f2..0139e7ba5d 100644 --- a/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts +++ b/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts @@ -10,7 +10,6 @@ export interface ManifestEntityCreateOptionAction< meta: MetaType; } -// eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface MetaEntityCreateOptionAction { /** * An icon to represent the action to be performed diff --git a/src/packages/core/localization/manifests.ts b/src/packages/core/localization/manifests.ts index cec662b335..576c677f65 100644 --- a/src/packages/core/localization/manifests.ts +++ b/src/packages/core/localization/manifests.ts @@ -260,5 +260,5 @@ export const manifests: Array = [ culture: 'zh-tw', }, js: () => import('../../../assets/lang/zh-tw.js'), - } + }, ]; diff --git a/src/packages/core/menu/section-sidebar-menu/section-sidebar-menu.element.ts b/src/packages/core/menu/section-sidebar-menu/section-sidebar-menu.element.ts index 8ac5aaaf70..cbf60d85a9 100644 --- a/src/packages/core/menu/section-sidebar-menu/section-sidebar-menu.element.ts +++ b/src/packages/core/menu/section-sidebar-menu/section-sidebar-menu.element.ts @@ -1,10 +1,10 @@ +import type { ManifestMenu } from '../menu.extension.js'; import type { ManifestSectionSidebarAppBaseMenu, ManifestSectionSidebarAppMenuKind } from './types.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { ManifestMenu } from '../menu.extension.js'; // TODO: Move to separate file: const manifest: UmbExtensionManifestKind = { diff --git a/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts b/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts index 5ada737930..a63effc1e6 100644 --- a/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts +++ b/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts @@ -114,17 +114,17 @@ export class UmbPropertyEditorUITinyMceToolbarConfigurationElement override render() { return html`
    - ${repeat( - this._toolbarConfig, - (v) => v.alias, + ${repeat( + this._toolbarConfig, + (v) => v.alias, (v) => html`
  • - - + + ${v.label} - +
  • `, - )} + )}
`; } From 8f1716dd6b744f9ba563ab5a1d3b3b7f5a2fcf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Nov 2024 12:39:31 +0100 Subject: [PATCH 33/37] type export --- src/packages/core/entity-create-option-action/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/core/entity-create-option-action/index.ts b/src/packages/core/entity-create-option-action/index.ts index 1794649010..9d1c5d4520 100644 --- a/src/packages/core/entity-create-option-action/index.ts +++ b/src/packages/core/entity-create-option-action/index.ts @@ -1,4 +1,4 @@ export * from './entity-create-option-action-base.js'; export * from './entity-create-option-action.extension.js'; export * from './entity-create-option-action.interface.js'; -export * from './types.js'; +export type * from './types.js'; From ebba0e2f1cb13d7ecb8f0890b0f8f14f0953f23c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Nov 2024 12:42:21 +0100 Subject: [PATCH 34/37] update all-packages list --- src/json-schema/all-packages.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/json-schema/all-packages.ts b/src/json-schema/all-packages.ts index 11e3b72b14..2f8a997a00 100644 --- a/src/json-schema/all-packages.ts +++ b/src/json-schema/all-packages.ts @@ -33,6 +33,7 @@ import '@umbraco-cms/backoffice/document-type'; import '@umbraco-cms/backoffice/document'; import '@umbraco-cms/backoffice/entity-action'; import '@umbraco-cms/backoffice/entity-bulk-action'; +import '@umbraco-cms/backoffice/entity-create-option-action'; import '@umbraco-cms/backoffice/entity'; import '@umbraco-cms/backoffice/event'; import '@umbraco-cms/backoffice/extension-registry'; From b98dedb72d54f687e87fe047a35a4177f83b723d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Nov 2024 13:31:50 +0100 Subject: [PATCH 35/37] constants --- src/packages/core/entity-create-option-action/constants.ts | 1 + .../entity-create-option-action.extension.ts | 3 ++- src/packages/core/entity-create-option-action/index.ts | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 src/packages/core/entity-create-option-action/constants.ts diff --git a/src/packages/core/entity-create-option-action/constants.ts b/src/packages/core/entity-create-option-action/constants.ts new file mode 100644 index 0000000000..4c25e59099 --- /dev/null +++ b/src/packages/core/entity-create-option-action/constants.ts @@ -0,0 +1 @@ +export const UMB_EXTENSION_TYPE_ENTITY_CREATE_OPTION_ACTION = 'entityCreateOptionAction'; diff --git a/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts b/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts index 0139e7ba5d..4f62ecd3de 100644 --- a/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts +++ b/src/packages/core/entity-create-option-action/entity-create-option-action.extension.ts @@ -1,11 +1,12 @@ import type { UmbEntityCreateOptionAction } from './entity-create-option-action.interface.js'; +import type { UMB_EXTENSION_TYPE_ENTITY_CREATE_OPTION_ACTION } from './constants.js'; import type { ManifestApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; export interface ManifestEntityCreateOptionAction< MetaType extends MetaEntityCreateOptionAction = MetaEntityCreateOptionAction, > extends ManifestApi>, ManifestWithDynamicConditions { - type: 'entityCreateOptionAction'; + type: typeof UMB_EXTENSION_TYPE_ENTITY_CREATE_OPTION_ACTION; forEntityTypes: Array; meta: MetaType; } diff --git a/src/packages/core/entity-create-option-action/index.ts b/src/packages/core/entity-create-option-action/index.ts index 9d1c5d4520..566d9306e5 100644 --- a/src/packages/core/entity-create-option-action/index.ts +++ b/src/packages/core/entity-create-option-action/index.ts @@ -1,3 +1,4 @@ +export * from './constants.js'; export * from './entity-create-option-action-base.js'; export * from './entity-create-option-action.extension.js'; export * from './entity-create-option-action.interface.js'; From 3eaaf12dd201a49817fd42b85fea955008f3ed46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Nov 2024 13:31:55 +0100 Subject: [PATCH 36/37] jsdocs --- .../entity-create-option-action-base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts b/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts index 2800261185..236d7e6394 100644 --- a/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts +++ b/src/packages/core/entity-create-option-action/entity-create-option-action-base.ts @@ -13,7 +13,7 @@ export abstract class UmbEntityCreateOptionActionBase< * By specifying the href, the action will act as a link. * The `execute` method will not be called. * @abstract - * @returns {string | undefined} + * @returns {string | undefined} - A promise which resolves into a HREF string or undefined. */ public getHref(): Promise { return Promise.resolve(undefined); From 66b6441581cf39efa866476cd3768da5a02095cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Nov 2024 13:38:36 +0100 Subject: [PATCH 37/37] update vite.config for core package --- src/packages/core/vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/packages/core/vite.config.ts b/src/packages/core/vite.config.ts index a4cb479492..5a0214273d 100644 --- a/src/packages/core/vite.config.ts +++ b/src/packages/core/vite.config.ts @@ -23,6 +23,7 @@ export default defineConfig({ 'debug/index': './debug/index.ts', 'entity-action/index': './entity-action/index.ts', 'entity-bulk-action/index': './entity-bulk-action/index.ts', + 'entity-create-option-action/index': './entity-create-option-action/index.ts', 'entity/index': './entity/index.ts', 'entry-point': 'entry-point.ts', 'event/index': './event/index.ts',