diff --git a/src/Umbraco.Web.UI.Client/mocks/db/document-publishing.manager.ts b/src/Umbraco.Web.UI.Client/mocks/db/document-publishing.manager.ts index 67d8f54ba498..cf61b5ba8abb 100644 --- a/src/Umbraco.Web.UI.Client/mocks/db/document-publishing.manager.ts +++ b/src/Umbraco.Web.UI.Client/mocks/db/document-publishing.manager.ts @@ -1,9 +1,11 @@ import type { UmbMockDocumentModel } from '../data/mock-data-set.types.js'; import type { UmbDocumentMockDB } from './document.db.js'; import type { + CreateAndPublishDocumentRequestModel, PublishDocumentRequestModel, PublishDocumentWithDescendantsRequestModel, UnpublishDocumentRequestModel, + UpdateAndPublishDocumentRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { DocumentVariantResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -55,6 +57,34 @@ export class UmbMockDocumentPublishingManager { this.#documentDb.detail.update(id, document); } + createAndPublish(data: CreateAndPublishDocumentRequestModel) { + const id = this.#documentDb.detail.create(data); + this.#publishCultures(id, data.culturesToPublish); + return id; + } + + updateAndPublish(id: string, data: UpdateAndPublishDocumentRequestModel) { + this.#documentDb.detail.update(id, data); + this.#publishCultures(id, data.culturesToPublish); + } + + #publishCultures(id: string, culturesToPublish: Array) { + const document: UmbMockDocumentModel = this.#documentDb.detail.read(id); + + // Invariant content types publish with an empty cultures array; publish the invariant variant in that case. + const cultures: Array = culturesToPublish.length > 0 ? culturesToPublish : [null]; + + cultures.forEach((culture) => { + const variant = document.variants.find((x) => x.culture === culture); + if (variant) { + variant.state = 'Published' as UmbDocumentVariantState; + variant.updateDate = new Date().toISOString(); + } + }); + + this.#documentDb.detail.update(id, document); + } + publishWithDescendants(id: string, data: PublishDocumentWithDescendantsRequestModel) { const document: UmbMockDocumentModel = this.#documentDb.detail.read(id); const documents = this.getDescendants(id, []); @@ -64,10 +94,7 @@ export class UmbMockDocumentPublishingManager { for (const culture of data.cultures) { for (const d of documents) { const variant = document.variants.find((x) => x.culture === culture); - if ( - variant && - (data.includeUnpublishedDescendants || variant.state !== 'Published') - ) { + if (variant && (data.includeUnpublishedDescendants || variant.state !== 'Published')) { variant.state = 'Published' as UmbDocumentVariantState; variant.updateDate = new Date().toISOString(); } diff --git a/src/Umbraco.Web.UI.Client/mocks/msw-handlers/document/detail.handlers.ts b/src/Umbraco.Web.UI.Client/mocks/msw-handlers/document/detail.handlers.ts index c9d891ea1d77..5f12b4f463f2 100644 --- a/src/Umbraco.Web.UI.Client/mocks/msw-handlers/document/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/mocks/msw-handlers/document/detail.handlers.ts @@ -4,11 +4,13 @@ import { umbMockManager } from '../../mock-manager.js'; import { umbDocumentMockDb } from '../../db/document.db.js'; import { UMB_SLUG } from './slug.js'; import type { + CreateAndPublishDocumentRequestModel, CreateDocumentRequestModel, DefaultReferenceResponseModel, GetDocumentByIdAvailableSegmentOptionsResponse, GetDocumentByIdReferencedDescendantsResponse, PagedIReferenceResponseModel, + UpdateAndPublishDocumentRequestModel, UpdateDocumentRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -38,6 +40,21 @@ export const detailHandlers = [ }); }), + http.post(umbracoPath(`${UMB_SLUG}/create-and-publish`), async ({ request }) => { + const requestBody = (await request.json()) as CreateAndPublishDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); + + const id = umbDocumentMockDb.publishing.createAndPublish(requestBody); + + return HttpResponse.json(null, { + status: 201, + headers: { + Location: request.url + '/' + id, + 'Umb-Generated-Resource': id, + }, + }); + }), + http.get(umbracoPath(`${UMB_SLUG}/configuration`), () => { return HttpResponse.json(umbDocumentMockDb.getConfiguration()); }), @@ -155,6 +172,19 @@ export const detailHandlers = [ } }), + http.put(umbracoPath(`${UMB_SLUG}/:id/update-and-publish`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); + if (id === 'forbidden') { + // Simulate a forbidden response + return new HttpResponse(null, { status: 403 }); + } + const requestBody = (await request.json()) as UpdateAndPublishDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); + umbDocumentMockDb.publishing.updateAndPublish(id, requestBody); + return new HttpResponse(null, { status: 200 }); + }), + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { const id = params.id as string; if (!id) return new HttpResponse(null, { status: 400 }); diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 19ed8f268343..bef5871132ff 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -1542,9 +1542,11 @@ export default { cssSavedText: 'Stylesheet saved without any errors', dataTypeSaved: 'Datatype saved', dictionaryItemSaved: 'Dictionary item saved', + editContentPublishedFailed: 'Document could not be published or saved', editContentPublishedFailedByValidation: 'Document could not be published, but we saved it for you', editContentPublishedFailedByParent: 'Document could not be published, because a parent page is not published', editContentPublishedHeader: 'Document published', + editContentPublishedReloadFailed: 'Document published, but the editor could not be refreshed', editContentPublishedText: 'and is visible on the website', editContentUnpublishedHeader: 'Document unpublished', editContentUnpublishedText: 'and is no longer visible on the website', @@ -2192,7 +2194,7 @@ export default { updateDate: 'User last updated', userCreated: 'has been created', userCreatedSuccessHelp: 'The new user has successfully been created. To log in to Umbraco use the password below.', - userCreatedApiSuccessHelp: 'Set client credentials for the account via the user\'s profile.', + userCreatedApiSuccessHelp: "Set client credentials for the account via the user's profile.", userHasPassword: 'The user already has a password set', userHasGroup: "The user is already in group '%0%'", userLockoutNotEnabled: 'Lockout is not enabled for this user', diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts index 977f033ea405..2c69f15ea5e3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts @@ -12,6 +12,7 @@ import { UmbWorkspaceIsNewRedirectController, type ManifestWorkspace, UmbWorkspaceIsNewRedirectControllerAlias, + umbWorkspaceWillNavigateAway, } from '@umbraco-cms/backoffice/workspace'; import { UmbBooleanState, @@ -362,10 +363,7 @@ export class UmbBlockWorkspaceContext, UmbContentVariantPickerValue>; } +/** + * Interface for the third argument of performCreateOrUpdate, relevant if the persistence method should be different from default. + */ +export interface UmbContentWorkspaceCreateOrUpdatePersistMethods { + create?: ( + saveData: DetailModelType, + variantIds: Array, + parent: UmbEntityModel, + ) => Promise; + update?: (saveData: DetailModelType, variantIds: Array) => Promise; +} + /** * The base class for a content detail workspace context. * @exports @@ -96,16 +110,16 @@ export interface UmbContentDetailWorkspaceContextArgs< * @template CreateArgsType */ export abstract class UmbContentDetailWorkspaceContextBase< - DetailModelType extends UmbContentDetailModel, - DetailRepositoryType extends UmbDetailRepository = UmbDetailRepository, - ContentTypeDetailModelType extends UmbContentTypeDetailModel = UmbContentTypeDetailModel, - VariantModelType extends UmbEntityVariantModel = DetailModelType extends { variants: UmbEntityVariantModel[] } - ? DetailModelType['variants'][0] - : never, - VariantOptionModelType extends UmbEntityVariantOptionModel = UmbEntityVariantOptionModel, - CreateArgsType extends - UmbEntityDetailWorkspaceContextCreateArgs = UmbEntityDetailWorkspaceContextCreateArgs, - > + DetailModelType extends UmbContentDetailModel, + DetailRepositoryType extends UmbDetailRepository = UmbDetailRepository, + ContentTypeDetailModelType extends UmbContentTypeDetailModel = UmbContentTypeDetailModel, + VariantModelType extends UmbEntityVariantModel = DetailModelType extends { variants: UmbEntityVariantModel[] } + ? DetailModelType['variants'][0] + : never, + VariantOptionModelType extends UmbEntityVariantOptionModel = UmbEntityVariantOptionModel, + CreateArgsType extends UmbEntityDetailWorkspaceContextCreateArgs = + UmbEntityDetailWorkspaceContextCreateArgs, +> extends UmbEntityDetailWorkspaceContextBase implements UmbContentWorkspaceContext, @@ -1060,119 +1074,113 @@ export abstract class UmbContentDetailWorkspaceContextBase< * Perform the create or update of the content * @param {Array} variantIds - The variant ids to save * @param {DetailModelType} saveData - The data to save + * @param {UmbContentWorkspaceCreateOrUpdatePersistMethods} [persistenceMethod] - Optional custom persistence logic. * @memberof UmbContentDetailWorkspaceContextBase */ - public async performCreateOrUpdate(variantIds: Array, saveData: DetailModelType) { + public async performCreateOrUpdate( + variantIds: Array, + saveData: DetailModelType, + persistenceMethod?: UmbContentWorkspaceCreateOrUpdatePersistMethods, + ) { if (this.getIsNew()) { - await this.#create(variantIds, saveData); + await this.#create(variantIds, saveData, persistenceMethod?.create); } else { - await this.#update(variantIds, saveData); + await this.#update(variantIds, saveData, persistenceMethod?.update); } } - async #create(variantIds: Array, saveData: DetailModelType) { - if (!this._detailRepository) throw new Error('Detail repository is not set'); - + async #create( + variantIds: Array, + saveData: DetailModelType, + overwriteCreate?: UmbContentWorkspaceCreateOrUpdatePersistMethods['create'], + ) { const parent = this._internal_getCreateUnderParent(); if (!parent) throw new Error('Parent is not set'); - const { data, error } = await this._detailRepository.create(saveData, parent.unique); - if (!data || error) { - throw new Error('Error creating content'); - } - - const variantIdsIncludingInvariant = [...variantIds, UmbVariantId.CreateInvariant()]; + const persisted = overwriteCreate + ? await overwriteCreate(saveData, variantIds, parent) + : await this.#defaultCreatePersistence(saveData, parent.unique); - // Only update the variants that was chosen to be saved: - const persistedData = this._data.getCurrent(); - const newPersistedData = await new UmbMergeContentVariantDataController(this).process( - persistedData, - data, - variantIds, - variantIdsIncludingInvariant, - ); - this._data.setPersisted(newPersistedData); - - // Only update the variants that was chosen to be saved: - const currentData = this._data.getCurrent(); - const newCurrentData = await new UmbMergeContentVariantDataController(this).process( - currentData, - data, - variantIds, - variantIdsIncludingInvariant, - ); - this._data.setCurrent(newCurrentData); + // Set persisted AND current before flipping isNew: the flip triggers the new->edit redirect, + // whose navigation guard compares the two states with an order-sensitive comparison. + await this.#applyPersistedData(persisted, variantIds); this.setIsNew(false); - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - if (!eventContext) { - throw new Error('Event context is missing'); - } - - const reloadStructureEvent = new UmbRequestReloadStructureForEntityEvent({ - entityType: parent.entityType, - unique: parent.unique, - }); + await this.#dispatchActionEvents( + new UmbRequestReloadStructureForEntityEvent({ entityType: parent.entityType, unique: parent.unique }), + new UmbRequestReloadChildrenOfEntityEvent({ entityType: parent.entityType, unique: parent.unique }), + ); + } - eventContext.dispatchEvent(reloadStructureEvent); + async #update( + variantIds: Array, + saveData: DetailModelType, + overwriteUpdate?: UmbContentWorkspaceCreateOrUpdatePersistMethods['update'], + ) { + const persisted = overwriteUpdate + ? await overwriteUpdate(saveData, variantIds) + : await this.#defaultUpdatePersistence(saveData); - const reloadChildrenEvent = new UmbRequestReloadChildrenOfEntityEvent({ - entityType: parent.entityType, - unique: parent.unique, - }); + await this.#applyPersistedData(persisted, variantIds); - eventContext.dispatchEvent(reloadChildrenEvent); + const unique = this.getUnique(); + if (!unique) { + return; + } + const entityType = this.getEntityType(); + await this.#dispatchActionEvents( + new UmbRequestReloadStructureForEntityEvent({ unique, entityType }), + new UmbEntityUpdatedEvent({ unique, entityType, eventUnique: this._workspaceEventUnique }), + ); } - async #update(variantIds: Array, saveData: DetailModelType) { + async #defaultCreatePersistence(saveData: DetailModelType, parentUnique: string | null): Promise { if (!this._detailRepository) throw new Error('Detail repository is not set'); + const { data, error } = await this._detailRepository.create(saveData, parentUnique); + if (!data || error) throw new Error('Error creating content'); + return data; + } + async #defaultUpdatePersistence(saveData: DetailModelType): Promise { + if (!this._detailRepository) throw new Error('Detail repository is not set'); const { data, error } = await this._detailRepository.save(saveData); - if (!data || error) { - throw new Error('Error saving content'); + if (!data || error) throw new Error('Error saving content'); + return data; + } + + /** + * Partial update the current data with the persisted data, only for the variants that were saved. + * @param {DetailModelType | undefined} persisted - The saved document, or undefined if not returned + * @param {Array} variantIds - The variants that were saved + */ + async #applyPersistedData(persisted: DetailModelType | undefined, variantIds: Array) { + if (!persisted) { + throw new Error('Persisted data is missing, persistence methods should return latest draft from the server.'); } const variantIdsIncludingInvariant = [...variantIds, UmbVariantId.CreateInvariant()]; - // Only update the variants that was chosen to be saved: - // Use getPersisted() as the base so non-saved variants retain the actual - // server state, not unsaved local edits from current data. - const persistedData = this._data.getPersisted(); const newPersistedData = await new UmbMergeContentVariantDataController(this).process( - persistedData, - data, + this._data.getPersisted(), + persisted, variantIds, variantIdsIncludingInvariant, ); this._data.setPersisted(newPersistedData); - // Only update the variants that was chosen to be saved: - const currentData = this._data.getCurrent(); const newCurrentData = await new UmbMergeContentVariantDataController(this).process( - currentData, - data, + this._data.getCurrent(), + persisted, variantIds, variantIdsIncludingInvariant, ); this._data.setCurrent(newCurrentData); + } - const unique = this.getUnique()!; - const entityType = this.getEntityType(); - + async #dispatchActionEvents(...events: Array) { const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - if (!eventContext) { - throw new Error('Event context is missing'); - } - const structureEvent = new UmbRequestReloadStructureForEntityEvent({ unique, entityType }); - eventContext.dispatchEvent(structureEvent); - - const updatedEvent = new UmbEntityUpdatedEvent({ - unique, - entityType, - eventUnique: this._workspaceEventUnique, - }); - - eventContext.dispatchEvent(updatedEvent); + if (!eventContext) throw new Error('Event context is missing'); + events.forEach((event) => eventContext.dispatchEvent(event)); } override resetState() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts index e68b0957e9d6..c18f7224ae90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, formDataBodySerializer, type Options as Options2, type TDataShape } from './client'; import { client } from './client.gen'; -import type { DeleteDataTypeByIdData, DeleteDataTypeByIdErrors, DeleteDataTypeByIdResponses, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdErrors, DeleteDataTypeFolderByIdResponses, DeleteDictionaryByIdData, DeleteDictionaryByIdErrors, DeleteDictionaryByIdResponses, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdErrors, DeleteDocumentBlueprintByIdResponses, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdErrors, DeleteDocumentBlueprintFolderByIdResponses, DeleteDocumentByIdData, DeleteDocumentByIdErrors, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessErrors, DeleteDocumentByIdPublicAccessResponses, DeleteDocumentByIdResponses, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdErrors, DeleteDocumentTypeByIdResponses, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdErrors, DeleteDocumentTypeFolderByIdResponses, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeErrors, DeleteLanguageByIsoCodeResponses, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameErrors, DeleteLogViewerSavedSearchByNameResponses, DeleteMediaByIdData, DeleteMediaByIdErrors, DeleteMediaByIdResponses, DeleteMediaTypeByIdData, DeleteMediaTypeByIdErrors, DeleteMediaTypeByIdResponses, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdErrors, DeleteMediaTypeFolderByIdResponses, DeleteMemberByIdData, DeleteMemberByIdErrors, DeleteMemberByIdResponses, DeleteMemberGroupByIdData, DeleteMemberGroupByIdErrors, DeleteMemberGroupByIdResponses, DeleteMemberTypeByIdData, DeleteMemberTypeByIdErrors, DeleteMemberTypeByIdResponses, DeleteMemberTypeFolderByIdData, DeleteMemberTypeFolderByIdErrors, DeleteMemberTypeFolderByIdResponses, DeletePackageCreatedByIdData, DeletePackageCreatedByIdErrors, DeletePackageCreatedByIdResponses, DeletePartialViewByPathData, DeletePartialViewByPathErrors, DeletePartialViewByPathResponses, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathErrors, DeletePartialViewFolderByPathResponses, DeletePreviewData, DeletePreviewResponses, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdErrors, DeleteRecycleBinDocumentByIdResponses, DeleteRecycleBinDocumentData, DeleteRecycleBinDocumentErrors, DeleteRecycleBinDocumentResponses, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdErrors, DeleteRecycleBinMediaByIdResponses, DeleteRecycleBinMediaData, DeleteRecycleBinMediaErrors, DeleteRecycleBinMediaResponses, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdErrors, DeleteRedirectManagementByIdResponses, DeleteScriptByPathData, DeleteScriptByPathErrors, DeleteScriptByPathResponses, DeleteScriptFolderByPathData, DeleteScriptFolderByPathErrors, DeleteScriptFolderByPathResponses, DeleteStylesheetByPathData, DeleteStylesheetByPathErrors, DeleteStylesheetByPathResponses, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathErrors, DeleteStylesheetFolderByPathResponses, DeleteTemplateByIdData, DeleteTemplateByIdErrors, DeleteTemplateByIdResponses, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdErrors, DeleteTemporaryFileByIdResponses, DeleteUserAvatarByIdData, DeleteUserAvatarByIdErrors, DeleteUserAvatarByIdResponses, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameErrors, DeleteUserById2FaByProviderNameResponses, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdErrors, DeleteUserByIdClientCredentialsByClientIdResponses, DeleteUserByIdData, DeleteUserByIdErrors, DeleteUserByIdResponses, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameErrors, DeleteUserCurrent2FaByProviderNameResponses, DeleteUserCurrentAvatarData, DeleteUserCurrentAvatarErrors, DeleteUserCurrentAvatarResponses, DeleteUserData, DeleteUserDataByIdData, DeleteUserDataByIdErrors, DeleteUserDataByIdResponses, DeleteUserErrors, DeleteUserGroupByIdData, DeleteUserGroupByIdErrors, DeleteUserGroupByIdResponses, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersErrors, DeleteUserGroupByIdUsersResponses, DeleteUserGroupData, DeleteUserGroupErrors, DeleteUserGroupResponses, DeleteUserResponses, DeleteWebhookByIdData, DeleteWebhookByIdErrors, DeleteWebhookByIdResponses, GetCollectionDocumentByIdData, GetCollectionDocumentByIdErrors, GetCollectionDocumentByIdResponses, GetCollectionMediaData, GetCollectionMediaErrors, GetCollectionMediaResponses, GetCultureData, GetCultureErrors, GetCultureResponses, GetDataTypeBatchData, GetDataTypeBatchErrors, GetDataTypeBatchResponses, GetDataTypeByIdData, GetDataTypeByIdErrors, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedErrors, GetDataTypeByIdIsUsedResponses, GetDataTypeByIdReferencedByData, GetDataTypeByIdReferencedByErrors, GetDataTypeByIdReferencedByResponses, GetDataTypeByIdResponses, GetDataTypeByIdSchemaData, GetDataTypeByIdSchemaErrors, GetDataTypeByIdSchemaResponses, GetDataTypeConfigurationData, GetDataTypeConfigurationErrors, GetDataTypeConfigurationResponses, GetDataTypeFolderByIdData, GetDataTypeFolderByIdErrors, GetDataTypeFolderByIdResponses, GetDataTypeSchemasBatchData, GetDataTypeSchemasBatchErrors, GetDataTypeSchemasBatchResponses, GetDictionaryByIdData, GetDictionaryByIdErrors, GetDictionaryByIdExportData, GetDictionaryByIdExportErrors, GetDictionaryByIdExportResponses, GetDictionaryByIdResponses, GetDictionaryData, GetDictionaryErrors, GetDictionaryResponses, GetDocumentAreReferencedData, GetDocumentAreReferencedErrors, GetDocumentAreReferencedResponses, GetDocumentBlueprintByIdAuditLogData, GetDocumentBlueprintByIdAuditLogErrors, GetDocumentBlueprintByIdAuditLogResponses, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdErrors, GetDocumentBlueprintByIdResponses, GetDocumentBlueprintByIdScaffoldData, GetDocumentBlueprintByIdScaffoldErrors, GetDocumentBlueprintByIdScaffoldResponses, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdErrors, GetDocumentBlueprintFolderByIdResponses, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogErrors, GetDocumentByIdAuditLogResponses, GetDocumentByIdAvailableSegmentOptionsData, GetDocumentByIdAvailableSegmentOptionsErrors, GetDocumentByIdAvailableSegmentOptionsResponses, GetDocumentByIdData, GetDocumentByIdDomainsData, GetDocumentByIdDomainsErrors, GetDocumentByIdDomainsResponses, GetDocumentByIdErrors, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsErrors, GetDocumentByIdNotificationsResponses, GetDocumentByIdPreviewUrlData, GetDocumentByIdPreviewUrlErrors, GetDocumentByIdPreviewUrlResponses, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessErrors, GetDocumentByIdPublicAccessResponses, GetDocumentByIdPublishedData, GetDocumentByIdPublishedErrors, GetDocumentByIdPublishedResponses, GetDocumentByIdPublishWithDescendantsResultByTaskIdData, GetDocumentByIdPublishWithDescendantsResultByTaskIdErrors, GetDocumentByIdPublishWithDescendantsResultByTaskIdResponses, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByErrors, GetDocumentByIdReferencedByResponses, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsErrors, GetDocumentByIdReferencedDescendantsResponses, GetDocumentByIdResponses, GetDocumentConfigurationData, GetDocumentConfigurationErrors, GetDocumentConfigurationResponses, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootErrors, GetDocumentTypeAllowedAtRootResponses, GetDocumentTypeBatchData, GetDocumentTypeBatchErrors, GetDocumentTypeBatchResponses, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenErrors, GetDocumentTypeByIdAllowedChildrenResponses, GetDocumentTypeByIdAllowedParentsData, GetDocumentTypeByIdAllowedParentsErrors, GetDocumentTypeByIdAllowedParentsResponses, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintErrors, GetDocumentTypeByIdBlueprintResponses, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesErrors, GetDocumentTypeByIdCompositionReferencesResponses, GetDocumentTypeByIdData, GetDocumentTypeByIdErrors, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportErrors, GetDocumentTypeByIdExportResponses, GetDocumentTypeByIdResponses, GetDocumentTypeByIdSchemaData, GetDocumentTypeByIdSchemaErrors, GetDocumentTypeByIdSchemaResponses, GetDocumentTypeConfigurationData, GetDocumentTypeConfigurationErrors, GetDocumentTypeConfigurationResponses, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdErrors, GetDocumentTypeFolderByIdResponses, GetDocumentUrlsData, GetDocumentUrlsErrors, GetDocumentUrlsResponses, GetDocumentVersionByIdData, GetDocumentVersionByIdErrors, GetDocumentVersionByIdResponses, GetDocumentVersionData, GetDocumentVersionErrors, GetDocumentVersionResponses, GetDynamicRootStepsData, GetDynamicRootStepsErrors, GetDynamicRootStepsResponses, GetFilterDataTypeData, GetFilterDataTypeErrors, GetFilterDataTypeResponses, GetFilterMemberData, GetFilterMemberErrors, GetFilterMemberResponses, GetFilterUserData, GetFilterUserErrors, GetFilterUserGroupData, GetFilterUserGroupErrors, GetFilterUserGroupResponses, GetFilterUserResponses, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameErrors, GetHealthCheckGroupByNameResponses, GetHealthCheckGroupData, GetHealthCheckGroupErrors, GetHealthCheckGroupResponses, GetHelpData, GetHelpErrors, GetHelpResponses, GetImagingResizeUrlsData, GetImagingResizeUrlsErrors, GetImagingResizeUrlsResponses, GetImportAnalyzeData, GetImportAnalyzeErrors, GetImportAnalyzeResponses, GetIndexerByIndexNameData, GetIndexerByIndexNameErrors, GetIndexerByIndexNameResponses, GetIndexerData, GetIndexerErrors, GetIndexerResponses, GetInstallSettingsData, GetInstallSettingsErrors, GetInstallSettingsResponses, GetItemDataTypeAncestorsData, GetItemDataTypeAncestorsErrors, GetItemDataTypeAncestorsResponses, GetItemDataTypeData, GetItemDataTypeErrors, GetItemDataTypeResponses, GetItemDataTypeSearchData, GetItemDataTypeSearchErrors, GetItemDataTypeSearchResponses, GetItemDictionaryData, GetItemDictionaryErrors, GetItemDictionaryResponses, GetItemDocumentAncestorsData, GetItemDocumentAncestorsErrors, GetItemDocumentAncestorsResponses, GetItemDocumentBlueprintData, GetItemDocumentBlueprintErrors, GetItemDocumentBlueprintResponses, GetItemDocumentData, GetItemDocumentErrors, GetItemDocumentResponses, GetItemDocumentSearchData, GetItemDocumentSearchErrors, GetItemDocumentSearchResponses, GetItemDocumentTypeAncestorsData, GetItemDocumentTypeAncestorsErrors, GetItemDocumentTypeAncestorsResponses, GetItemDocumentTypeData, GetItemDocumentTypeErrors, GetItemDocumentTypeResponses, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchErrors, GetItemDocumentTypeSearchResponses, GetItemLanguageData, GetItemLanguageDefaultData, GetItemLanguageDefaultErrors, GetItemLanguageDefaultResponses, GetItemLanguageErrors, GetItemLanguageResponses, GetItemMediaAncestorsData, GetItemMediaAncestorsErrors, GetItemMediaAncestorsResponses, GetItemMediaData, GetItemMediaErrors, GetItemMediaResponses, GetItemMediaSearchData, GetItemMediaSearchErrors, GetItemMediaSearchResponses, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedErrors, GetItemMediaTypeAllowedResponses, GetItemMediaTypeAncestorsData, GetItemMediaTypeAncestorsErrors, GetItemMediaTypeAncestorsResponses, GetItemMediaTypeData, GetItemMediaTypeErrors, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersErrors, GetItemMediaTypeFoldersResponses, GetItemMediaTypeResponses, GetItemMediaTypeSearchData, GetItemMediaTypeSearchErrors, GetItemMediaTypeSearchResponses, GetItemMemberAncestorsData, GetItemMemberAncestorsErrors, GetItemMemberAncestorsResponses, GetItemMemberData, GetItemMemberErrors, GetItemMemberGroupData, GetItemMemberGroupErrors, GetItemMemberGroupResponses, GetItemMemberResponses, GetItemMemberSearchData, GetItemMemberSearchErrors, GetItemMemberSearchResponses, GetItemMemberTypeAncestorsData, GetItemMemberTypeAncestorsErrors, GetItemMemberTypeAncestorsResponses, GetItemMemberTypeData, GetItemMemberTypeErrors, GetItemMemberTypeResponses, GetItemMemberTypeSearchData, GetItemMemberTypeSearchErrors, GetItemMemberTypeSearchResponses, GetItemPartialViewData, GetItemPartialViewErrors, GetItemPartialViewResponses, GetItemRelationTypeData, GetItemRelationTypeErrors, GetItemRelationTypeResponses, GetItemScriptData, GetItemScriptErrors, GetItemScriptResponses, GetItemStaticFileData, GetItemStaticFileErrors, GetItemStaticFileResponses, GetItemStylesheetData, GetItemStylesheetErrors, GetItemStylesheetResponses, GetItemTemplateAncestorsData, GetItemTemplateAncestorsErrors, GetItemTemplateAncestorsResponses, GetItemTemplateData, GetItemTemplateErrors, GetItemTemplateResponses, GetItemTemplateSearchData, GetItemTemplateSearchErrors, GetItemTemplateSearchResponses, GetItemUserData, GetItemUserErrors, GetItemUserGroupData, GetItemUserGroupErrors, GetItemUserGroupResponses, GetItemUserResponses, GetItemWebhookData, GetItemWebhookErrors, GetItemWebhookResponses, GetLanguageByIsoCodeData, GetLanguageByIsoCodeErrors, GetLanguageByIsoCodeResponses, GetLanguageData, GetLanguageErrors, GetLanguageResponses, GetLogViewerLevelCountData, GetLogViewerLevelCountErrors, GetLogViewerLevelCountResponses, GetLogViewerLevelData, GetLogViewerLevelErrors, GetLogViewerLevelResponses, GetLogViewerLogData, GetLogViewerLogErrors, GetLogViewerLogResponses, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateErrors, GetLogViewerMessageTemplateResponses, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameErrors, GetLogViewerSavedSearchByNameResponses, GetLogViewerSavedSearchData, GetLogViewerSavedSearchErrors, GetLogViewerSavedSearchResponses, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeErrors, GetLogViewerValidateLogsSizeResponses, GetManifestManifestData, GetManifestManifestErrors, GetManifestManifestPrivateData, GetManifestManifestPrivateErrors, GetManifestManifestPrivateResponses, GetManifestManifestPublicData, GetManifestManifestPublicResponses, GetManifestManifestResponses, GetMediaAreReferencedData, GetMediaAreReferencedErrors, GetMediaAreReferencedResponses, GetMediaByIdAuditLogData, GetMediaByIdAuditLogErrors, GetMediaByIdAuditLogResponses, GetMediaByIdData, GetMediaByIdErrors, GetMediaByIdReferencedByData, GetMediaByIdReferencedByErrors, GetMediaByIdReferencedByResponses, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsErrors, GetMediaByIdReferencedDescendantsResponses, GetMediaByIdResponses, GetMediaConfigurationData, GetMediaConfigurationErrors, GetMediaConfigurationResponses, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootErrors, GetMediaTypeAllowedAtRootResponses, GetMediaTypeBatchData, GetMediaTypeBatchErrors, GetMediaTypeBatchResponses, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenErrors, GetMediaTypeByIdAllowedChildrenResponses, GetMediaTypeByIdAllowedParentsData, GetMediaTypeByIdAllowedParentsErrors, GetMediaTypeByIdAllowedParentsResponses, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesErrors, GetMediaTypeByIdCompositionReferencesResponses, GetMediaTypeByIdData, GetMediaTypeByIdErrors, GetMediaTypeByIdExportData, GetMediaTypeByIdExportErrors, GetMediaTypeByIdExportResponses, GetMediaTypeByIdResponses, GetMediaTypeByIdSchemaData, GetMediaTypeByIdSchemaErrors, GetMediaTypeByIdSchemaResponses, GetMediaTypeConfigurationData, GetMediaTypeConfigurationErrors, GetMediaTypeConfigurationResponses, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdErrors, GetMediaTypeFolderByIdResponses, GetMediaUrlsData, GetMediaUrlsErrors, GetMediaUrlsResponses, GetMemberAreReferencedData, GetMemberAreReferencedErrors, GetMemberAreReferencedResponses, GetMemberByIdData, GetMemberByIdErrors, GetMemberByIdReferencedByData, GetMemberByIdReferencedByErrors, GetMemberByIdReferencedByResponses, GetMemberByIdReferencedDescendantsData, GetMemberByIdReferencedDescendantsErrors, GetMemberByIdReferencedDescendantsResponses, GetMemberByIdResponses, GetMemberConfigurationData, GetMemberConfigurationErrors, GetMemberConfigurationResponses, GetMemberGroupByIdData, GetMemberGroupByIdErrors, GetMemberGroupByIdResponses, GetMemberGroupData, GetMemberGroupErrors, GetMemberGroupResponses, GetMemberTypeAllowedAtRootData, GetMemberTypeAllowedAtRootErrors, GetMemberTypeAllowedAtRootResponses, GetMemberTypeBatchData, GetMemberTypeBatchErrors, GetMemberTypeBatchResponses, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesErrors, GetMemberTypeByIdCompositionReferencesResponses, GetMemberTypeByIdData, GetMemberTypeByIdErrors, GetMemberTypeByIdExportData, GetMemberTypeByIdExportErrors, GetMemberTypeByIdExportResponses, GetMemberTypeByIdResponses, GetMemberTypeByIdSchemaData, GetMemberTypeByIdSchemaErrors, GetMemberTypeByIdSchemaResponses, GetMemberTypeConfigurationData, GetMemberTypeConfigurationErrors, GetMemberTypeConfigurationResponses, GetMemberTypeFolderByIdData, GetMemberTypeFolderByIdErrors, GetMemberTypeFolderByIdResponses, GetModelsBuilderDashboardData, GetModelsBuilderDashboardErrors, GetModelsBuilderDashboardResponses, GetModelsBuilderStatusData, GetModelsBuilderStatusErrors, GetModelsBuilderStatusResponses, GetNewsDashboardData, GetNewsDashboardErrors, GetNewsDashboardResponses, GetObjectTypesData, GetObjectTypesErrors, GetObjectTypesResponses, GetOembedQueryData, GetOembedQueryErrors, GetOembedQueryResponses, GetPackageConfigurationData, GetPackageConfigurationErrors, GetPackageConfigurationResponses, GetPackageCreatedByIdData, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadErrors, GetPackageCreatedByIdDownloadResponses, GetPackageCreatedByIdErrors, GetPackageCreatedByIdResponses, GetPackageCreatedData, GetPackageCreatedErrors, GetPackageCreatedResponses, GetPackageMigrationStatusData, GetPackageMigrationStatusErrors, GetPackageMigrationStatusResponses, GetPartialViewByPathData, GetPartialViewByPathErrors, GetPartialViewByPathResponses, GetPartialViewFolderByPathData, GetPartialViewFolderByPathErrors, GetPartialViewFolderByPathResponses, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdErrors, GetPartialViewSnippetByIdResponses, GetPartialViewSnippetData, GetPartialViewSnippetErrors, GetPartialViewSnippetResponses, GetProfilingStatusData, GetProfilingStatusErrors, GetProfilingStatusResponses, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedErrors, GetPropertyTypeIsUsedResponses, GetPublishedCacheRebuildStatusData, GetPublishedCacheRebuildStatusErrors, GetPublishedCacheRebuildStatusResponses, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentErrors, GetRecycleBinDocumentByIdOriginalParentResponses, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenErrors, GetRecycleBinDocumentChildrenResponses, GetRecycleBinDocumentReferencedByData, GetRecycleBinDocumentReferencedByErrors, GetRecycleBinDocumentReferencedByResponses, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootErrors, GetRecycleBinDocumentRootResponses, GetRecycleBinDocumentSiblingsData, GetRecycleBinDocumentSiblingsErrors, GetRecycleBinDocumentSiblingsResponses, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentErrors, GetRecycleBinMediaByIdOriginalParentResponses, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenErrors, GetRecycleBinMediaChildrenResponses, GetRecycleBinMediaReferencedByData, GetRecycleBinMediaReferencedByErrors, GetRecycleBinMediaReferencedByResponses, GetRecycleBinMediaRootData, GetRecycleBinMediaRootErrors, GetRecycleBinMediaRootResponses, GetRecycleBinMediaSiblingsData, GetRecycleBinMediaSiblingsErrors, GetRecycleBinMediaSiblingsResponses, GetRedirectManagementByIdData, GetRedirectManagementByIdErrors, GetRedirectManagementByIdResponses, GetRedirectManagementData, GetRedirectManagementErrors, GetRedirectManagementResponses, GetRedirectManagementStatusData, GetRedirectManagementStatusErrors, GetRedirectManagementStatusResponses, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdErrors, GetRelationByRelationTypeIdResponses, GetRelationTypeByIdData, GetRelationTypeByIdErrors, GetRelationTypeByIdResponses, GetRelationTypeData, GetRelationTypeErrors, GetRelationTypeResponses, GetScriptByPathData, GetScriptByPathErrors, GetScriptByPathResponses, GetScriptFolderByPathData, GetScriptFolderByPathErrors, GetScriptFolderByPathResponses, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryErrors, GetSearcherBySearcherNameQueryResponses, GetSearcherData, GetSearcherErrors, GetSearcherResponses, GetSecurityConfigurationData, GetSecurityConfigurationErrors, GetSecurityConfigurationResponses, GetSegmentData, GetSegmentErrors, GetSegmentResponses, GetServerConfigurationData, GetServerConfigurationResponses, GetServerInformationData, GetServerInformationErrors, GetServerInformationResponses, GetServerStatusData, GetServerStatusErrors, GetServerStatusResponses, GetServerTroubleshootingData, GetServerTroubleshootingErrors, GetServerTroubleshootingResponses, GetServerUpgradeCheckData, GetServerUpgradeCheckErrors, GetServerUpgradeCheckResponses, GetStylesheetByPathData, GetStylesheetByPathErrors, GetStylesheetByPathResponses, GetStylesheetFolderByPathData, GetStylesheetFolderByPathErrors, GetStylesheetFolderByPathResponses, GetTagData, GetTagErrors, GetTagResponses, GetTelemetryData, GetTelemetryErrors, GetTelemetryLevelData, GetTelemetryLevelErrors, GetTelemetryLevelResponses, GetTelemetryResponses, GetTemplateByIdData, GetTemplateByIdErrors, GetTemplateByIdResponses, GetTemplateConfigurationData, GetTemplateConfigurationErrors, GetTemplateConfigurationResponses, GetTemplateQuerySettingsData, GetTemplateQuerySettingsErrors, GetTemplateQuerySettingsResponses, GetTemporaryFileByIdData, GetTemporaryFileByIdErrors, GetTemporaryFileByIdResponses, GetTemporaryFileConfigurationData, GetTemporaryFileConfigurationErrors, GetTemporaryFileConfigurationResponses, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsErrors, GetTreeDataTypeAncestorsResponses, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenErrors, GetTreeDataTypeChildrenResponses, GetTreeDataTypeRootData, GetTreeDataTypeRootErrors, GetTreeDataTypeRootResponses, GetTreeDataTypeSearchData, GetTreeDataTypeSearchErrors, GetTreeDataTypeSearchResponses, GetTreeDataTypeSiblingsData, GetTreeDataTypeSiblingsErrors, GetTreeDataTypeSiblingsResponses, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsErrors, GetTreeDictionaryAncestorsResponses, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenErrors, GetTreeDictionaryChildrenResponses, GetTreeDictionaryRootData, GetTreeDictionaryRootErrors, GetTreeDictionaryRootResponses, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsErrors, GetTreeDocumentAncestorsResponses, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsErrors, GetTreeDocumentBlueprintAncestorsResponses, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenErrors, GetTreeDocumentBlueprintChildrenResponses, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootErrors, GetTreeDocumentBlueprintRootResponses, GetTreeDocumentBlueprintSiblingsData, GetTreeDocumentBlueprintSiblingsErrors, GetTreeDocumentBlueprintSiblingsResponses, GetTreeDocumentChildrenData, GetTreeDocumentChildrenErrors, GetTreeDocumentChildrenResponses, GetTreeDocumentRootData, GetTreeDocumentRootErrors, GetTreeDocumentRootResponses, GetTreeDocumentSiblingsData, GetTreeDocumentSiblingsErrors, GetTreeDocumentSiblingsResponses, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsErrors, GetTreeDocumentTypeAncestorsResponses, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenErrors, GetTreeDocumentTypeChildrenResponses, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootErrors, GetTreeDocumentTypeRootResponses, GetTreeDocumentTypeSearchData, GetTreeDocumentTypeSearchErrors, GetTreeDocumentTypeSearchResponses, GetTreeDocumentTypeSiblingsData, GetTreeDocumentTypeSiblingsErrors, GetTreeDocumentTypeSiblingsResponses, GetTreeMediaAncestorsData, GetTreeMediaAncestorsErrors, GetTreeMediaAncestorsResponses, GetTreeMediaChildrenData, GetTreeMediaChildrenErrors, GetTreeMediaChildrenResponses, GetTreeMediaRootData, GetTreeMediaRootErrors, GetTreeMediaRootResponses, GetTreeMediaSiblingsData, GetTreeMediaSiblingsErrors, GetTreeMediaSiblingsResponses, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsErrors, GetTreeMediaTypeAncestorsResponses, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenErrors, GetTreeMediaTypeChildrenResponses, GetTreeMediaTypeRootData, GetTreeMediaTypeRootErrors, GetTreeMediaTypeRootResponses, GetTreeMediaTypeSiblingsData, GetTreeMediaTypeSiblingsErrors, GetTreeMediaTypeSiblingsResponses, GetTreeMemberGroupRootData, GetTreeMemberGroupRootErrors, GetTreeMemberGroupRootResponses, GetTreeMemberTypeAncestorsData, GetTreeMemberTypeAncestorsErrors, GetTreeMemberTypeAncestorsResponses, GetTreeMemberTypeChildrenData, GetTreeMemberTypeChildrenErrors, GetTreeMemberTypeChildrenResponses, GetTreeMemberTypeRootData, GetTreeMemberTypeRootErrors, GetTreeMemberTypeRootResponses, GetTreeMemberTypeSiblingsData, GetTreeMemberTypeSiblingsErrors, GetTreeMemberTypeSiblingsResponses, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsErrors, GetTreePartialViewAncestorsResponses, GetTreePartialViewChildrenData, GetTreePartialViewChildrenErrors, GetTreePartialViewChildrenResponses, GetTreePartialViewRootData, GetTreePartialViewRootErrors, GetTreePartialViewRootResponses, GetTreePartialViewSiblingsData, GetTreePartialViewSiblingsErrors, GetTreePartialViewSiblingsResponses, GetTreeScriptAncestorsData, GetTreeScriptAncestorsErrors, GetTreeScriptAncestorsResponses, GetTreeScriptChildrenData, GetTreeScriptChildrenErrors, GetTreeScriptChildrenResponses, GetTreeScriptRootData, GetTreeScriptRootErrors, GetTreeScriptRootResponses, GetTreeScriptSiblingsData, GetTreeScriptSiblingsErrors, GetTreeScriptSiblingsResponses, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsErrors, GetTreeStaticFileAncestorsResponses, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenErrors, GetTreeStaticFileChildrenResponses, GetTreeStaticFileRootData, GetTreeStaticFileRootErrors, GetTreeStaticFileRootResponses, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsErrors, GetTreeStylesheetAncestorsResponses, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenErrors, GetTreeStylesheetChildrenResponses, GetTreeStylesheetRootData, GetTreeStylesheetRootErrors, GetTreeStylesheetRootResponses, GetTreeStylesheetSiblingsData, GetTreeStylesheetSiblingsErrors, GetTreeStylesheetSiblingsResponses, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsErrors, GetTreeTemplateAncestorsResponses, GetTreeTemplateChildrenData, GetTreeTemplateChildrenErrors, GetTreeTemplateChildrenResponses, GetTreeTemplateRootData, GetTreeTemplateRootErrors, GetTreeTemplateRootResponses, GetTreeTemplateSiblingsData, GetTreeTemplateSiblingsErrors, GetTreeTemplateSiblingsResponses, GetUpgradeSettingsData, GetUpgradeSettingsErrors, GetUpgradeSettingsResponses, GetUserById2FaData, GetUserById2FaErrors, GetUserById2FaResponses, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesErrors, GetUserByIdCalculateStartNodesResponses, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsErrors, GetUserByIdClientCredentialsResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, GetUserConfigurationData, GetUserConfigurationErrors, GetUserConfigurationResponses, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameErrors, GetUserCurrent2FaByProviderNameResponses, GetUserCurrent2FaData, GetUserCurrent2FaErrors, GetUserCurrent2FaResponses, GetUserCurrentConfigurationData, GetUserCurrentConfigurationErrors, GetUserCurrentConfigurationResponses, GetUserCurrentData, GetUserCurrentErrors, GetUserCurrentLoginProvidersData, GetUserCurrentLoginProvidersErrors, GetUserCurrentLoginProvidersResponses, GetUserCurrentPermissionsData, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentErrors, GetUserCurrentPermissionsDocumentResponses, GetUserCurrentPermissionsErrors, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaErrors, GetUserCurrentPermissionsMediaResponses, GetUserCurrentPermissionsResponses, GetUserCurrentResponses, GetUserData, GetUserDataByIdData, GetUserDataByIdErrors, GetUserDataByIdResponses, GetUserDataData, GetUserDataErrors, GetUserDataResponses, GetUserErrors, GetUserGroupByIdData, GetUserGroupByIdErrors, GetUserGroupByIdResponses, GetUserGroupData, GetUserGroupErrors, GetUserGroupResponses, GetUserResponses, GetWebhookByIdData, GetWebhookByIdErrors, GetWebhookByIdLogsData, GetWebhookByIdLogsErrors, GetWebhookByIdLogsResponses, GetWebhookByIdResponses, GetWebhookData, GetWebhookErrors, GetWebhookEventsData, GetWebhookEventsErrors, GetWebhookEventsResponses, GetWebhookLogsData, GetWebhookLogsErrors, GetWebhookLogsResponses, GetWebhookResponses, PatchDocumentByIdPatchData, PatchDocumentByIdPatchErrors, PatchDocumentByIdPatchResponses, PostDataTypeByIdCopyData, PostDataTypeByIdCopyErrors, PostDataTypeByIdCopyResponses, PostDataTypeData, PostDataTypeErrors, PostDataTypeFolderData, PostDataTypeFolderErrors, PostDataTypeFolderResponses, PostDataTypeResponses, PostDictionaryData, PostDictionaryErrors, PostDictionaryImportData, PostDictionaryImportErrors, PostDictionaryImportResponses, PostDictionaryResponses, PostDocumentBlueprintData, PostDocumentBlueprintErrors, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderErrors, PostDocumentBlueprintFolderResponses, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentErrors, PostDocumentBlueprintFromDocumentResponses, PostDocumentBlueprintResponses, PostDocumentByIdCopyData, PostDocumentByIdCopyErrors, PostDocumentByIdCopyResponses, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessErrors, PostDocumentByIdPublicAccessResponses, PostDocumentData, PostDocumentErrors, PostDocumentResponses, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsErrors, PostDocumentTypeAvailableCompositionsResponses, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyErrors, PostDocumentTypeByIdCopyResponses, PostDocumentTypeByIdTemplateData, PostDocumentTypeByIdTemplateErrors, PostDocumentTypeByIdTemplateResponses, PostDocumentTypeData, PostDocumentTypeErrors, PostDocumentTypeFolderData, PostDocumentTypeFolderErrors, PostDocumentTypeFolderResponses, PostDocumentTypeImportData, PostDocumentTypeImportErrors, PostDocumentTypeImportResponses, PostDocumentTypeResponses, PostDocumentValidateData, PostDocumentValidateErrors, PostDocumentValidateResponses, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackErrors, PostDocumentVersionByIdRollbackResponses, PostDynamicRootQueryData, PostDynamicRootQueryErrors, PostDynamicRootQueryResponses, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionErrors, PostHealthCheckExecuteActionResponses, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckErrors, PostHealthCheckGroupByNameCheckResponses, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildErrors, PostIndexerByIndexNameRebuildResponses, PostInstallSetupData, PostInstallSetupErrors, PostInstallSetupResponses, PostInstallValidateDatabaseData, PostInstallValidateDatabaseErrors, PostInstallValidateDatabaseResponses, PostLanguageData, PostLanguageErrors, PostLanguageResponses, PostLogViewerSavedSearchData, PostLogViewerSavedSearchErrors, PostLogViewerSavedSearchResponses, PostMediaData, PostMediaErrors, PostMediaResponses, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsErrors, PostMediaTypeAvailableCompositionsResponses, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyErrors, PostMediaTypeByIdCopyResponses, PostMediaTypeData, PostMediaTypeErrors, PostMediaTypeFolderData, PostMediaTypeFolderErrors, PostMediaTypeFolderResponses, PostMediaTypeImportData, PostMediaTypeImportErrors, PostMediaTypeImportResponses, PostMediaTypeResponses, PostMediaValidateData, PostMediaValidateErrors, PostMediaValidateResponses, PostMemberData, PostMemberErrors, PostMemberGroupData, PostMemberGroupErrors, PostMemberGroupResponses, PostMemberResponses, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsErrors, PostMemberTypeAvailableCompositionsResponses, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyErrors, PostMemberTypeByIdCopyResponses, PostMemberTypeData, PostMemberTypeErrors, PostMemberTypeFolderData, PostMemberTypeFolderErrors, PostMemberTypeFolderResponses, PostMemberTypeImportData, PostMemberTypeImportErrors, PostMemberTypeImportResponses, PostMemberTypeResponses, PostMemberValidateData, PostMemberValidateErrors, PostMemberValidateResponses, PostModelsBuilderBuildData, PostModelsBuilderBuildErrors, PostModelsBuilderBuildResponses, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationErrors, PostPackageByNameRunMigrationResponses, PostPackageCreatedData, PostPackageCreatedErrors, PostPackageCreatedResponses, PostPartialViewData, PostPartialViewErrors, PostPartialViewFolderData, PostPartialViewFolderErrors, PostPartialViewFolderResponses, PostPartialViewResponses, PostPreviewData, PostPreviewErrors, PostPreviewResponses, PostPublishedCacheRebuildData, PostPublishedCacheRebuildErrors, PostPublishedCacheRebuildResponses, PostPublishedCacheReloadData, PostPublishedCacheReloadErrors, PostPublishedCacheReloadResponses, PostRedirectManagementStatusData, PostRedirectManagementStatusErrors, PostRedirectManagementStatusResponses, PostScriptData, PostScriptErrors, PostScriptFolderData, PostScriptFolderErrors, PostScriptFolderResponses, PostScriptResponses, PostSecurityForgotPasswordData, PostSecurityForgotPasswordErrors, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetErrors, PostSecurityForgotPasswordResetResponses, PostSecurityForgotPasswordResponses, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyErrors, PostSecurityForgotPasswordVerifyResponses, PostStylesheetData, PostStylesheetErrors, PostStylesheetFolderData, PostStylesheetFolderErrors, PostStylesheetFolderResponses, PostStylesheetResponses, PostTelemetryLevelData, PostTelemetryLevelErrors, PostTelemetryLevelResponses, PostTemplateData, PostTemplateErrors, PostTemplateQueryExecuteData, PostTemplateQueryExecuteErrors, PostTemplateQueryExecuteResponses, PostTemplateResponses, PostTemporaryFileData, PostTemporaryFileErrors, PostTemporaryFileResponses, PostUpgradeAuthorizeData, PostUpgradeAuthorizeErrors, PostUpgradeAuthorizeResponses, PostUserAvatarByIdData, PostUserAvatarByIdErrors, PostUserAvatarByIdResponses, PostUserByIdChangePasswordData, PostUserByIdChangePasswordErrors, PostUserByIdChangePasswordResponses, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsErrors, PostUserByIdClientCredentialsResponses, PostUserByIdResetPasswordData, PostUserByIdResetPasswordErrors, PostUserByIdResetPasswordResponses, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameErrors, PostUserCurrent2FaByProviderNameResponses, PostUserCurrentAvatarData, PostUserCurrentAvatarErrors, PostUserCurrentAvatarResponses, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordErrors, PostUserCurrentChangePasswordResponses, PostUserData, PostUserDataData, PostUserDataErrors, PostUserDataResponses, PostUserDisableData, PostUserDisableErrors, PostUserDisableResponses, PostUserEnableData, PostUserEnableErrors, PostUserEnableResponses, PostUserErrors, PostUserGroupByIdUsersData, PostUserGroupByIdUsersErrors, PostUserGroupByIdUsersResponses, PostUserGroupData, PostUserGroupErrors, PostUserGroupResponses, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordErrors, PostUserInviteCreatePasswordResponses, PostUserInviteData, PostUserInviteErrors, PostUserInviteResendData, PostUserInviteResendErrors, PostUserInviteResendResponses, PostUserInviteResponses, PostUserInviteVerifyData, PostUserInviteVerifyErrors, PostUserInviteVerifyResponses, PostUserResponses, PostUserSetUserGroupsData, PostUserSetUserGroupsErrors, PostUserSetUserGroupsResponses, PostUserUnlockData, PostUserUnlockErrors, PostUserUnlockResponses, PostWebhookData, PostWebhookErrors, PostWebhookResponses, PutDataTypeByIdData, PutDataTypeByIdErrors, PutDataTypeByIdMoveData, PutDataTypeByIdMoveErrors, PutDataTypeByIdMoveResponses, PutDataTypeByIdResponses, PutDataTypeFolderByIdData, PutDataTypeFolderByIdErrors, PutDataTypeFolderByIdResponses, PutDictionaryByIdData, PutDictionaryByIdErrors, PutDictionaryByIdMoveData, PutDictionaryByIdMoveErrors, PutDictionaryByIdMoveResponses, PutDictionaryByIdResponses, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdErrors, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveErrors, PutDocumentBlueprintByIdMoveResponses, PutDocumentBlueprintByIdResponses, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdErrors, PutDocumentBlueprintFolderByIdResponses, PutDocumentByIdData, PutDocumentByIdDomainsData, PutDocumentByIdDomainsErrors, PutDocumentByIdDomainsResponses, PutDocumentByIdErrors, PutDocumentByIdMoveData, PutDocumentByIdMoveErrors, PutDocumentByIdMoveResponses, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinErrors, PutDocumentByIdMoveToRecycleBinResponses, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsErrors, PutDocumentByIdNotificationsResponses, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessErrors, PutDocumentByIdPublicAccessResponses, PutDocumentByIdPublishData, PutDocumentByIdPublishErrors, PutDocumentByIdPublishResponses, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsErrors, PutDocumentByIdPublishWithDescendantsResponses, PutDocumentByIdResponses, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishErrors, PutDocumentByIdUnpublishResponses, PutDocumentSortData, PutDocumentSortErrors, PutDocumentSortResponses, PutDocumentTypeByIdData, PutDocumentTypeByIdErrors, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportErrors, PutDocumentTypeByIdImportResponses, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveErrors, PutDocumentTypeByIdMoveResponses, PutDocumentTypeByIdResponses, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdErrors, PutDocumentTypeFolderByIdResponses, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupErrors, PutDocumentVersionByIdPreventCleanupResponses, PutLanguageByIsoCodeData, PutLanguageByIsoCodeErrors, PutLanguageByIsoCodeResponses, PutMediaByIdData, PutMediaByIdErrors, PutMediaByIdMoveData, PutMediaByIdMoveErrors, PutMediaByIdMoveResponses, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinErrors, PutMediaByIdMoveToRecycleBinResponses, PutMediaByIdResponses, PutMediaByIdValidateData, PutMediaByIdValidateErrors, PutMediaByIdValidateResponses, PutMediaSortData, PutMediaSortErrors, PutMediaSortResponses, PutMediaTypeByIdData, PutMediaTypeByIdErrors, PutMediaTypeByIdImportData, PutMediaTypeByIdImportErrors, PutMediaTypeByIdImportResponses, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveErrors, PutMediaTypeByIdMoveResponses, PutMediaTypeByIdResponses, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdErrors, PutMediaTypeFolderByIdResponses, PutMemberByIdData, PutMemberByIdErrors, PutMemberByIdResponses, PutMemberByIdValidateData, PutMemberByIdValidateErrors, PutMemberByIdValidateResponses, PutMemberGroupByIdData, PutMemberGroupByIdErrors, PutMemberGroupByIdResponses, PutMemberTypeByIdData, PutMemberTypeByIdErrors, PutMemberTypeByIdImportData, PutMemberTypeByIdImportErrors, PutMemberTypeByIdImportResponses, PutMemberTypeByIdMoveData, PutMemberTypeByIdMoveErrors, PutMemberTypeByIdMoveResponses, PutMemberTypeByIdResponses, PutMemberTypeFolderByIdData, PutMemberTypeFolderByIdErrors, PutMemberTypeFolderByIdResponses, PutPackageCreatedByIdData, PutPackageCreatedByIdErrors, PutPackageCreatedByIdResponses, PutPartialViewByPathData, PutPartialViewByPathErrors, PutPartialViewByPathRenameData, PutPartialViewByPathRenameErrors, PutPartialViewByPathRenameResponses, PutPartialViewByPathResponses, PutProfilingStatusData, PutProfilingStatusErrors, PutProfilingStatusResponses, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreErrors, PutRecycleBinDocumentByIdRestoreResponses, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreErrors, PutRecycleBinMediaByIdRestoreResponses, PutScriptByPathData, PutScriptByPathErrors, PutScriptByPathRenameData, PutScriptByPathRenameErrors, PutScriptByPathRenameResponses, PutScriptByPathResponses, PutStylesheetByPathData, PutStylesheetByPathErrors, PutStylesheetByPathRenameData, PutStylesheetByPathRenameErrors, PutStylesheetByPathRenameResponses, PutStylesheetByPathResponses, PutTemplateByIdData, PutTemplateByIdErrors, PutTemplateByIdResponses, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Errors, PutUmbracoManagementApiV11DocumentByIdValidate11Responses, PutUserByIdData, PutUserByIdErrors, PutUserByIdResponses, PutUserCurrentProfileData, PutUserCurrentProfileErrors, PutUserCurrentProfileResponses, PutUserDataData, PutUserDataErrors, PutUserDataResponses, PutUserGroupByIdData, PutUserGroupByIdErrors, PutUserGroupByIdResponses, PutWebhookByIdData, PutWebhookByIdErrors, PutWebhookByIdResponses } from './types.gen'; +import type { DeleteDataTypeByIdData, DeleteDataTypeByIdErrors, DeleteDataTypeByIdResponses, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdErrors, DeleteDataTypeFolderByIdResponses, DeleteDictionaryByIdData, DeleteDictionaryByIdErrors, DeleteDictionaryByIdResponses, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdErrors, DeleteDocumentBlueprintByIdResponses, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdErrors, DeleteDocumentBlueprintFolderByIdResponses, DeleteDocumentByIdData, DeleteDocumentByIdErrors, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessErrors, DeleteDocumentByIdPublicAccessResponses, DeleteDocumentByIdResponses, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdErrors, DeleteDocumentTypeByIdResponses, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdErrors, DeleteDocumentTypeFolderByIdResponses, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeErrors, DeleteLanguageByIsoCodeResponses, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameErrors, DeleteLogViewerSavedSearchByNameResponses, DeleteMediaByIdData, DeleteMediaByIdErrors, DeleteMediaByIdResponses, DeleteMediaTypeByIdData, DeleteMediaTypeByIdErrors, DeleteMediaTypeByIdResponses, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdErrors, DeleteMediaTypeFolderByIdResponses, DeleteMemberByIdData, DeleteMemberByIdErrors, DeleteMemberByIdResponses, DeleteMemberGroupByIdData, DeleteMemberGroupByIdErrors, DeleteMemberGroupByIdResponses, DeleteMemberTypeByIdData, DeleteMemberTypeByIdErrors, DeleteMemberTypeByIdResponses, DeleteMemberTypeFolderByIdData, DeleteMemberTypeFolderByIdErrors, DeleteMemberTypeFolderByIdResponses, DeletePackageCreatedByIdData, DeletePackageCreatedByIdErrors, DeletePackageCreatedByIdResponses, DeletePartialViewByPathData, DeletePartialViewByPathErrors, DeletePartialViewByPathResponses, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathErrors, DeletePartialViewFolderByPathResponses, DeletePreviewData, DeletePreviewResponses, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdErrors, DeleteRecycleBinDocumentByIdResponses, DeleteRecycleBinDocumentData, DeleteRecycleBinDocumentErrors, DeleteRecycleBinDocumentResponses, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdErrors, DeleteRecycleBinMediaByIdResponses, DeleteRecycleBinMediaData, DeleteRecycleBinMediaErrors, DeleteRecycleBinMediaResponses, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdErrors, DeleteRedirectManagementByIdResponses, DeleteScriptByPathData, DeleteScriptByPathErrors, DeleteScriptByPathResponses, DeleteScriptFolderByPathData, DeleteScriptFolderByPathErrors, DeleteScriptFolderByPathResponses, DeleteStylesheetByPathData, DeleteStylesheetByPathErrors, DeleteStylesheetByPathResponses, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathErrors, DeleteStylesheetFolderByPathResponses, DeleteTemplateByIdData, DeleteTemplateByIdErrors, DeleteTemplateByIdResponses, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdErrors, DeleteTemporaryFileByIdResponses, DeleteUserAvatarByIdData, DeleteUserAvatarByIdErrors, DeleteUserAvatarByIdResponses, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameErrors, DeleteUserById2FaByProviderNameResponses, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdErrors, DeleteUserByIdClientCredentialsByClientIdResponses, DeleteUserByIdData, DeleteUserByIdErrors, DeleteUserByIdResponses, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameErrors, DeleteUserCurrent2FaByProviderNameResponses, DeleteUserCurrentAvatarData, DeleteUserCurrentAvatarErrors, DeleteUserCurrentAvatarResponses, DeleteUserData, DeleteUserDataByIdData, DeleteUserDataByIdErrors, DeleteUserDataByIdResponses, DeleteUserErrors, DeleteUserGroupByIdData, DeleteUserGroupByIdErrors, DeleteUserGroupByIdResponses, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersErrors, DeleteUserGroupByIdUsersResponses, DeleteUserGroupData, DeleteUserGroupErrors, DeleteUserGroupResponses, DeleteUserResponses, DeleteWebhookByIdData, DeleteWebhookByIdErrors, DeleteWebhookByIdResponses, GetCollectionDocumentByIdData, GetCollectionDocumentByIdErrors, GetCollectionDocumentByIdResponses, GetCollectionMediaData, GetCollectionMediaErrors, GetCollectionMediaResponses, GetCultureData, GetCultureErrors, GetCultureResponses, GetDataTypeBatchData, GetDataTypeBatchErrors, GetDataTypeBatchResponses, GetDataTypeByIdData, GetDataTypeByIdErrors, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedErrors, GetDataTypeByIdIsUsedResponses, GetDataTypeByIdReferencedByData, GetDataTypeByIdReferencedByErrors, GetDataTypeByIdReferencedByResponses, GetDataTypeByIdResponses, GetDataTypeByIdSchemaData, GetDataTypeByIdSchemaErrors, GetDataTypeByIdSchemaResponses, GetDataTypeConfigurationData, GetDataTypeConfigurationErrors, GetDataTypeConfigurationResponses, GetDataTypeFolderByIdData, GetDataTypeFolderByIdErrors, GetDataTypeFolderByIdResponses, GetDataTypeSchemasBatchData, GetDataTypeSchemasBatchErrors, GetDataTypeSchemasBatchResponses, GetDictionaryByIdData, GetDictionaryByIdErrors, GetDictionaryByIdExportData, GetDictionaryByIdExportErrors, GetDictionaryByIdExportResponses, GetDictionaryByIdResponses, GetDictionaryData, GetDictionaryErrors, GetDictionaryResponses, GetDocumentAreReferencedData, GetDocumentAreReferencedErrors, GetDocumentAreReferencedResponses, GetDocumentBlueprintByIdAuditLogData, GetDocumentBlueprintByIdAuditLogErrors, GetDocumentBlueprintByIdAuditLogResponses, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdErrors, GetDocumentBlueprintByIdResponses, GetDocumentBlueprintByIdScaffoldData, GetDocumentBlueprintByIdScaffoldErrors, GetDocumentBlueprintByIdScaffoldResponses, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdErrors, GetDocumentBlueprintFolderByIdResponses, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogErrors, GetDocumentByIdAuditLogResponses, GetDocumentByIdAvailableSegmentOptionsData, GetDocumentByIdAvailableSegmentOptionsErrors, GetDocumentByIdAvailableSegmentOptionsResponses, GetDocumentByIdData, GetDocumentByIdDomainsData, GetDocumentByIdDomainsErrors, GetDocumentByIdDomainsResponses, GetDocumentByIdErrors, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsErrors, GetDocumentByIdNotificationsResponses, GetDocumentByIdPreviewUrlData, GetDocumentByIdPreviewUrlErrors, GetDocumentByIdPreviewUrlResponses, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessErrors, GetDocumentByIdPublicAccessResponses, GetDocumentByIdPublishedData, GetDocumentByIdPublishedErrors, GetDocumentByIdPublishedResponses, GetDocumentByIdPublishWithDescendantsResultByTaskIdData, GetDocumentByIdPublishWithDescendantsResultByTaskIdErrors, GetDocumentByIdPublishWithDescendantsResultByTaskIdResponses, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByErrors, GetDocumentByIdReferencedByResponses, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsErrors, GetDocumentByIdReferencedDescendantsResponses, GetDocumentByIdResponses, GetDocumentConfigurationData, GetDocumentConfigurationErrors, GetDocumentConfigurationResponses, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootErrors, GetDocumentTypeAllowedAtRootResponses, GetDocumentTypeBatchData, GetDocumentTypeBatchErrors, GetDocumentTypeBatchResponses, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenErrors, GetDocumentTypeByIdAllowedChildrenResponses, GetDocumentTypeByIdAllowedParentsData, GetDocumentTypeByIdAllowedParentsErrors, GetDocumentTypeByIdAllowedParentsResponses, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintErrors, GetDocumentTypeByIdBlueprintResponses, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesErrors, GetDocumentTypeByIdCompositionReferencesResponses, GetDocumentTypeByIdData, GetDocumentTypeByIdErrors, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportErrors, GetDocumentTypeByIdExportResponses, GetDocumentTypeByIdResponses, GetDocumentTypeByIdSchemaData, GetDocumentTypeByIdSchemaErrors, GetDocumentTypeByIdSchemaResponses, GetDocumentTypeConfigurationData, GetDocumentTypeConfigurationErrors, GetDocumentTypeConfigurationResponses, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdErrors, GetDocumentTypeFolderByIdResponses, GetDocumentUrlsData, GetDocumentUrlsErrors, GetDocumentUrlsResponses, GetDocumentVersionByIdData, GetDocumentVersionByIdErrors, GetDocumentVersionByIdResponses, GetDocumentVersionData, GetDocumentVersionErrors, GetDocumentVersionResponses, GetDynamicRootStepsData, GetDynamicRootStepsErrors, GetDynamicRootStepsResponses, GetFilterDataTypeData, GetFilterDataTypeErrors, GetFilterDataTypeResponses, GetFilterMemberData, GetFilterMemberErrors, GetFilterMemberResponses, GetFilterUserData, GetFilterUserErrors, GetFilterUserGroupData, GetFilterUserGroupErrors, GetFilterUserGroupResponses, GetFilterUserResponses, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameErrors, GetHealthCheckGroupByNameResponses, GetHealthCheckGroupData, GetHealthCheckGroupErrors, GetHealthCheckGroupResponses, GetHelpData, GetHelpErrors, GetHelpResponses, GetImagingResizeUrlsData, GetImagingResizeUrlsErrors, GetImagingResizeUrlsResponses, GetImportAnalyzeData, GetImportAnalyzeErrors, GetImportAnalyzeResponses, GetIndexerByIndexNameData, GetIndexerByIndexNameErrors, GetIndexerByIndexNameResponses, GetIndexerData, GetIndexerErrors, GetIndexerResponses, GetInstallSettingsData, GetInstallSettingsErrors, GetInstallSettingsResponses, GetItemDataTypeAncestorsData, GetItemDataTypeAncestorsErrors, GetItemDataTypeAncestorsResponses, GetItemDataTypeData, GetItemDataTypeErrors, GetItemDataTypeResponses, GetItemDataTypeSearchData, GetItemDataTypeSearchErrors, GetItemDataTypeSearchResponses, GetItemDictionaryData, GetItemDictionaryErrors, GetItemDictionaryResponses, GetItemDocumentAncestorsData, GetItemDocumentAncestorsErrors, GetItemDocumentAncestorsResponses, GetItemDocumentBlueprintData, GetItemDocumentBlueprintErrors, GetItemDocumentBlueprintResponses, GetItemDocumentData, GetItemDocumentErrors, GetItemDocumentResponses, GetItemDocumentSearchData, GetItemDocumentSearchErrors, GetItemDocumentSearchResponses, GetItemDocumentTypeAncestorsData, GetItemDocumentTypeAncestorsErrors, GetItemDocumentTypeAncestorsResponses, GetItemDocumentTypeData, GetItemDocumentTypeErrors, GetItemDocumentTypeResponses, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchErrors, GetItemDocumentTypeSearchResponses, GetItemLanguageData, GetItemLanguageDefaultData, GetItemLanguageDefaultErrors, GetItemLanguageDefaultResponses, GetItemLanguageErrors, GetItemLanguageResponses, GetItemMediaAncestorsData, GetItemMediaAncestorsErrors, GetItemMediaAncestorsResponses, GetItemMediaData, GetItemMediaErrors, GetItemMediaResponses, GetItemMediaSearchData, GetItemMediaSearchErrors, GetItemMediaSearchResponses, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedErrors, GetItemMediaTypeAllowedResponses, GetItemMediaTypeAncestorsData, GetItemMediaTypeAncestorsErrors, GetItemMediaTypeAncestorsResponses, GetItemMediaTypeData, GetItemMediaTypeErrors, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersErrors, GetItemMediaTypeFoldersResponses, GetItemMediaTypeResponses, GetItemMediaTypeSearchData, GetItemMediaTypeSearchErrors, GetItemMediaTypeSearchResponses, GetItemMemberAncestorsData, GetItemMemberAncestorsErrors, GetItemMemberAncestorsResponses, GetItemMemberData, GetItemMemberErrors, GetItemMemberGroupData, GetItemMemberGroupErrors, GetItemMemberGroupResponses, GetItemMemberResponses, GetItemMemberSearchData, GetItemMemberSearchErrors, GetItemMemberSearchResponses, GetItemMemberTypeAncestorsData, GetItemMemberTypeAncestorsErrors, GetItemMemberTypeAncestorsResponses, GetItemMemberTypeData, GetItemMemberTypeErrors, GetItemMemberTypeResponses, GetItemMemberTypeSearchData, GetItemMemberTypeSearchErrors, GetItemMemberTypeSearchResponses, GetItemPartialViewData, GetItemPartialViewErrors, GetItemPartialViewResponses, GetItemRelationTypeData, GetItemRelationTypeErrors, GetItemRelationTypeResponses, GetItemScriptData, GetItemScriptErrors, GetItemScriptResponses, GetItemStaticFileData, GetItemStaticFileErrors, GetItemStaticFileResponses, GetItemStylesheetData, GetItemStylesheetErrors, GetItemStylesheetResponses, GetItemTemplateAncestorsData, GetItemTemplateAncestorsErrors, GetItemTemplateAncestorsResponses, GetItemTemplateData, GetItemTemplateErrors, GetItemTemplateResponses, GetItemTemplateSearchData, GetItemTemplateSearchErrors, GetItemTemplateSearchResponses, GetItemUserData, GetItemUserErrors, GetItemUserGroupData, GetItemUserGroupErrors, GetItemUserGroupResponses, GetItemUserResponses, GetItemWebhookData, GetItemWebhookErrors, GetItemWebhookResponses, GetLanguageByIsoCodeData, GetLanguageByIsoCodeErrors, GetLanguageByIsoCodeResponses, GetLanguageData, GetLanguageErrors, GetLanguageResponses, GetLogViewerLevelCountData, GetLogViewerLevelCountErrors, GetLogViewerLevelCountResponses, GetLogViewerLevelData, GetLogViewerLevelErrors, GetLogViewerLevelResponses, GetLogViewerLogData, GetLogViewerLogErrors, GetLogViewerLogResponses, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateErrors, GetLogViewerMessageTemplateResponses, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameErrors, GetLogViewerSavedSearchByNameResponses, GetLogViewerSavedSearchData, GetLogViewerSavedSearchErrors, GetLogViewerSavedSearchResponses, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeErrors, GetLogViewerValidateLogsSizeResponses, GetManifestManifestData, GetManifestManifestErrors, GetManifestManifestPrivateData, GetManifestManifestPrivateErrors, GetManifestManifestPrivateResponses, GetManifestManifestPublicData, GetManifestManifestPublicResponses, GetManifestManifestResponses, GetMediaAreReferencedData, GetMediaAreReferencedErrors, GetMediaAreReferencedResponses, GetMediaByIdAuditLogData, GetMediaByIdAuditLogErrors, GetMediaByIdAuditLogResponses, GetMediaByIdData, GetMediaByIdErrors, GetMediaByIdReferencedByData, GetMediaByIdReferencedByErrors, GetMediaByIdReferencedByResponses, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsErrors, GetMediaByIdReferencedDescendantsResponses, GetMediaByIdResponses, GetMediaConfigurationData, GetMediaConfigurationErrors, GetMediaConfigurationResponses, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootErrors, GetMediaTypeAllowedAtRootResponses, GetMediaTypeBatchData, GetMediaTypeBatchErrors, GetMediaTypeBatchResponses, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenErrors, GetMediaTypeByIdAllowedChildrenResponses, GetMediaTypeByIdAllowedParentsData, GetMediaTypeByIdAllowedParentsErrors, GetMediaTypeByIdAllowedParentsResponses, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesErrors, GetMediaTypeByIdCompositionReferencesResponses, GetMediaTypeByIdData, GetMediaTypeByIdErrors, GetMediaTypeByIdExportData, GetMediaTypeByIdExportErrors, GetMediaTypeByIdExportResponses, GetMediaTypeByIdResponses, GetMediaTypeByIdSchemaData, GetMediaTypeByIdSchemaErrors, GetMediaTypeByIdSchemaResponses, GetMediaTypeConfigurationData, GetMediaTypeConfigurationErrors, GetMediaTypeConfigurationResponses, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdErrors, GetMediaTypeFolderByIdResponses, GetMediaUrlsData, GetMediaUrlsErrors, GetMediaUrlsResponses, GetMemberAreReferencedData, GetMemberAreReferencedErrors, GetMemberAreReferencedResponses, GetMemberByIdData, GetMemberByIdErrors, GetMemberByIdReferencedByData, GetMemberByIdReferencedByErrors, GetMemberByIdReferencedByResponses, GetMemberByIdReferencedDescendantsData, GetMemberByIdReferencedDescendantsErrors, GetMemberByIdReferencedDescendantsResponses, GetMemberByIdResponses, GetMemberConfigurationData, GetMemberConfigurationErrors, GetMemberConfigurationResponses, GetMemberGroupByIdData, GetMemberGroupByIdErrors, GetMemberGroupByIdResponses, GetMemberGroupData, GetMemberGroupErrors, GetMemberGroupResponses, GetMemberTypeAllowedAtRootData, GetMemberTypeAllowedAtRootErrors, GetMemberTypeAllowedAtRootResponses, GetMemberTypeBatchData, GetMemberTypeBatchErrors, GetMemberTypeBatchResponses, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesErrors, GetMemberTypeByIdCompositionReferencesResponses, GetMemberTypeByIdData, GetMemberTypeByIdErrors, GetMemberTypeByIdExportData, GetMemberTypeByIdExportErrors, GetMemberTypeByIdExportResponses, GetMemberTypeByIdResponses, GetMemberTypeByIdSchemaData, GetMemberTypeByIdSchemaErrors, GetMemberTypeByIdSchemaResponses, GetMemberTypeConfigurationData, GetMemberTypeConfigurationErrors, GetMemberTypeConfigurationResponses, GetMemberTypeFolderByIdData, GetMemberTypeFolderByIdErrors, GetMemberTypeFolderByIdResponses, GetModelsBuilderDashboardData, GetModelsBuilderDashboardErrors, GetModelsBuilderDashboardResponses, GetModelsBuilderStatusData, GetModelsBuilderStatusErrors, GetModelsBuilderStatusResponses, GetNewsDashboardData, GetNewsDashboardErrors, GetNewsDashboardResponses, GetObjectTypesData, GetObjectTypesErrors, GetObjectTypesResponses, GetOembedQueryData, GetOembedQueryErrors, GetOembedQueryResponses, GetPackageConfigurationData, GetPackageConfigurationErrors, GetPackageConfigurationResponses, GetPackageCreatedByIdData, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadErrors, GetPackageCreatedByIdDownloadResponses, GetPackageCreatedByIdErrors, GetPackageCreatedByIdResponses, GetPackageCreatedData, GetPackageCreatedErrors, GetPackageCreatedResponses, GetPackageMigrationStatusData, GetPackageMigrationStatusErrors, GetPackageMigrationStatusResponses, GetPartialViewByPathData, GetPartialViewByPathErrors, GetPartialViewByPathResponses, GetPartialViewFolderByPathData, GetPartialViewFolderByPathErrors, GetPartialViewFolderByPathResponses, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdErrors, GetPartialViewSnippetByIdResponses, GetPartialViewSnippetData, GetPartialViewSnippetErrors, GetPartialViewSnippetResponses, GetProfilingStatusData, GetProfilingStatusErrors, GetProfilingStatusResponses, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedErrors, GetPropertyTypeIsUsedResponses, GetPublishedCacheRebuildStatusData, GetPublishedCacheRebuildStatusErrors, GetPublishedCacheRebuildStatusResponses, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentErrors, GetRecycleBinDocumentByIdOriginalParentResponses, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenErrors, GetRecycleBinDocumentChildrenResponses, GetRecycleBinDocumentReferencedByData, GetRecycleBinDocumentReferencedByErrors, GetRecycleBinDocumentReferencedByResponses, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootErrors, GetRecycleBinDocumentRootResponses, GetRecycleBinDocumentSiblingsData, GetRecycleBinDocumentSiblingsErrors, GetRecycleBinDocumentSiblingsResponses, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentErrors, GetRecycleBinMediaByIdOriginalParentResponses, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenErrors, GetRecycleBinMediaChildrenResponses, GetRecycleBinMediaReferencedByData, GetRecycleBinMediaReferencedByErrors, GetRecycleBinMediaReferencedByResponses, GetRecycleBinMediaRootData, GetRecycleBinMediaRootErrors, GetRecycleBinMediaRootResponses, GetRecycleBinMediaSiblingsData, GetRecycleBinMediaSiblingsErrors, GetRecycleBinMediaSiblingsResponses, GetRedirectManagementByIdData, GetRedirectManagementByIdErrors, GetRedirectManagementByIdResponses, GetRedirectManagementData, GetRedirectManagementErrors, GetRedirectManagementResponses, GetRedirectManagementStatusData, GetRedirectManagementStatusErrors, GetRedirectManagementStatusResponses, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdErrors, GetRelationByRelationTypeIdResponses, GetRelationTypeByIdData, GetRelationTypeByIdErrors, GetRelationTypeByIdResponses, GetRelationTypeData, GetRelationTypeErrors, GetRelationTypeResponses, GetScriptByPathData, GetScriptByPathErrors, GetScriptByPathResponses, GetScriptFolderByPathData, GetScriptFolderByPathErrors, GetScriptFolderByPathResponses, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryErrors, GetSearcherBySearcherNameQueryResponses, GetSearcherData, GetSearcherErrors, GetSearcherResponses, GetSecurityConfigurationData, GetSecurityConfigurationErrors, GetSecurityConfigurationResponses, GetSegmentData, GetSegmentErrors, GetSegmentResponses, GetServerConfigurationData, GetServerConfigurationResponses, GetServerInformationData, GetServerInformationErrors, GetServerInformationResponses, GetServerStatusData, GetServerStatusErrors, GetServerStatusResponses, GetServerTroubleshootingData, GetServerTroubleshootingErrors, GetServerTroubleshootingResponses, GetServerUpgradeCheckData, GetServerUpgradeCheckErrors, GetServerUpgradeCheckResponses, GetStylesheetByPathData, GetStylesheetByPathErrors, GetStylesheetByPathResponses, GetStylesheetFolderByPathData, GetStylesheetFolderByPathErrors, GetStylesheetFolderByPathResponses, GetTagData, GetTagErrors, GetTagResponses, GetTelemetryData, GetTelemetryErrors, GetTelemetryLevelData, GetTelemetryLevelErrors, GetTelemetryLevelResponses, GetTelemetryResponses, GetTemplateByIdData, GetTemplateByIdErrors, GetTemplateByIdResponses, GetTemplateConfigurationData, GetTemplateConfigurationErrors, GetTemplateConfigurationResponses, GetTemplateQuerySettingsData, GetTemplateQuerySettingsErrors, GetTemplateQuerySettingsResponses, GetTemporaryFileByIdData, GetTemporaryFileByIdErrors, GetTemporaryFileByIdResponses, GetTemporaryFileConfigurationData, GetTemporaryFileConfigurationErrors, GetTemporaryFileConfigurationResponses, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsErrors, GetTreeDataTypeAncestorsResponses, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenErrors, GetTreeDataTypeChildrenResponses, GetTreeDataTypeRootData, GetTreeDataTypeRootErrors, GetTreeDataTypeRootResponses, GetTreeDataTypeSearchData, GetTreeDataTypeSearchErrors, GetTreeDataTypeSearchResponses, GetTreeDataTypeSiblingsData, GetTreeDataTypeSiblingsErrors, GetTreeDataTypeSiblingsResponses, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsErrors, GetTreeDictionaryAncestorsResponses, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenErrors, GetTreeDictionaryChildrenResponses, GetTreeDictionaryRootData, GetTreeDictionaryRootErrors, GetTreeDictionaryRootResponses, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsErrors, GetTreeDocumentAncestorsResponses, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsErrors, GetTreeDocumentBlueprintAncestorsResponses, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenErrors, GetTreeDocumentBlueprintChildrenResponses, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootErrors, GetTreeDocumentBlueprintRootResponses, GetTreeDocumentBlueprintSiblingsData, GetTreeDocumentBlueprintSiblingsErrors, GetTreeDocumentBlueprintSiblingsResponses, GetTreeDocumentChildrenData, GetTreeDocumentChildrenErrors, GetTreeDocumentChildrenResponses, GetTreeDocumentRootData, GetTreeDocumentRootErrors, GetTreeDocumentRootResponses, GetTreeDocumentSiblingsData, GetTreeDocumentSiblingsErrors, GetTreeDocumentSiblingsResponses, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsErrors, GetTreeDocumentTypeAncestorsResponses, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenErrors, GetTreeDocumentTypeChildrenResponses, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootErrors, GetTreeDocumentTypeRootResponses, GetTreeDocumentTypeSearchData, GetTreeDocumentTypeSearchErrors, GetTreeDocumentTypeSearchResponses, GetTreeDocumentTypeSiblingsData, GetTreeDocumentTypeSiblingsErrors, GetTreeDocumentTypeSiblingsResponses, GetTreeMediaAncestorsData, GetTreeMediaAncestorsErrors, GetTreeMediaAncestorsResponses, GetTreeMediaChildrenData, GetTreeMediaChildrenErrors, GetTreeMediaChildrenResponses, GetTreeMediaRootData, GetTreeMediaRootErrors, GetTreeMediaRootResponses, GetTreeMediaSiblingsData, GetTreeMediaSiblingsErrors, GetTreeMediaSiblingsResponses, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsErrors, GetTreeMediaTypeAncestorsResponses, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenErrors, GetTreeMediaTypeChildrenResponses, GetTreeMediaTypeRootData, GetTreeMediaTypeRootErrors, GetTreeMediaTypeRootResponses, GetTreeMediaTypeSiblingsData, GetTreeMediaTypeSiblingsErrors, GetTreeMediaTypeSiblingsResponses, GetTreeMemberGroupRootData, GetTreeMemberGroupRootErrors, GetTreeMemberGroupRootResponses, GetTreeMemberTypeAncestorsData, GetTreeMemberTypeAncestorsErrors, GetTreeMemberTypeAncestorsResponses, GetTreeMemberTypeChildrenData, GetTreeMemberTypeChildrenErrors, GetTreeMemberTypeChildrenResponses, GetTreeMemberTypeRootData, GetTreeMemberTypeRootErrors, GetTreeMemberTypeRootResponses, GetTreeMemberTypeSiblingsData, GetTreeMemberTypeSiblingsErrors, GetTreeMemberTypeSiblingsResponses, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsErrors, GetTreePartialViewAncestorsResponses, GetTreePartialViewChildrenData, GetTreePartialViewChildrenErrors, GetTreePartialViewChildrenResponses, GetTreePartialViewRootData, GetTreePartialViewRootErrors, GetTreePartialViewRootResponses, GetTreePartialViewSiblingsData, GetTreePartialViewSiblingsErrors, GetTreePartialViewSiblingsResponses, GetTreeScriptAncestorsData, GetTreeScriptAncestorsErrors, GetTreeScriptAncestorsResponses, GetTreeScriptChildrenData, GetTreeScriptChildrenErrors, GetTreeScriptChildrenResponses, GetTreeScriptRootData, GetTreeScriptRootErrors, GetTreeScriptRootResponses, GetTreeScriptSiblingsData, GetTreeScriptSiblingsErrors, GetTreeScriptSiblingsResponses, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsErrors, GetTreeStaticFileAncestorsResponses, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenErrors, GetTreeStaticFileChildrenResponses, GetTreeStaticFileRootData, GetTreeStaticFileRootErrors, GetTreeStaticFileRootResponses, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsErrors, GetTreeStylesheetAncestorsResponses, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenErrors, GetTreeStylesheetChildrenResponses, GetTreeStylesheetRootData, GetTreeStylesheetRootErrors, GetTreeStylesheetRootResponses, GetTreeStylesheetSiblingsData, GetTreeStylesheetSiblingsErrors, GetTreeStylesheetSiblingsResponses, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsErrors, GetTreeTemplateAncestorsResponses, GetTreeTemplateChildrenData, GetTreeTemplateChildrenErrors, GetTreeTemplateChildrenResponses, GetTreeTemplateRootData, GetTreeTemplateRootErrors, GetTreeTemplateRootResponses, GetTreeTemplateSiblingsData, GetTreeTemplateSiblingsErrors, GetTreeTemplateSiblingsResponses, GetUpgradeSettingsData, GetUpgradeSettingsErrors, GetUpgradeSettingsResponses, GetUserById2FaData, GetUserById2FaErrors, GetUserById2FaResponses, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesErrors, GetUserByIdCalculateStartNodesResponses, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsErrors, GetUserByIdClientCredentialsResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, GetUserConfigurationData, GetUserConfigurationErrors, GetUserConfigurationResponses, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameErrors, GetUserCurrent2FaByProviderNameResponses, GetUserCurrent2FaData, GetUserCurrent2FaErrors, GetUserCurrent2FaResponses, GetUserCurrentConfigurationData, GetUserCurrentConfigurationErrors, GetUserCurrentConfigurationResponses, GetUserCurrentData, GetUserCurrentErrors, GetUserCurrentLoginProvidersData, GetUserCurrentLoginProvidersErrors, GetUserCurrentLoginProvidersResponses, GetUserCurrentPermissionsData, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentErrors, GetUserCurrentPermissionsDocumentResponses, GetUserCurrentPermissionsErrors, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaErrors, GetUserCurrentPermissionsMediaResponses, GetUserCurrentPermissionsResponses, GetUserCurrentResponses, GetUserData, GetUserDataByIdData, GetUserDataByIdErrors, GetUserDataByIdResponses, GetUserDataData, GetUserDataErrors, GetUserDataResponses, GetUserErrors, GetUserGroupByIdData, GetUserGroupByIdErrors, GetUserGroupByIdResponses, GetUserGroupData, GetUserGroupErrors, GetUserGroupResponses, GetUserResponses, GetWebhookByIdData, GetWebhookByIdErrors, GetWebhookByIdLogsData, GetWebhookByIdLogsErrors, GetWebhookByIdLogsResponses, GetWebhookByIdResponses, GetWebhookData, GetWebhookErrors, GetWebhookEventsData, GetWebhookEventsErrors, GetWebhookEventsResponses, GetWebhookLogsData, GetWebhookLogsErrors, GetWebhookLogsResponses, GetWebhookResponses, PatchDocumentByIdPatchData, PatchDocumentByIdPatchErrors, PatchDocumentByIdPatchResponses, PostDataTypeByIdCopyData, PostDataTypeByIdCopyErrors, PostDataTypeByIdCopyResponses, PostDataTypeData, PostDataTypeErrors, PostDataTypeFolderData, PostDataTypeFolderErrors, PostDataTypeFolderResponses, PostDataTypeResponses, PostDictionaryData, PostDictionaryErrors, PostDictionaryImportData, PostDictionaryImportErrors, PostDictionaryImportResponses, PostDictionaryResponses, PostDocumentBlueprintData, PostDocumentBlueprintErrors, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderErrors, PostDocumentBlueprintFolderResponses, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentErrors, PostDocumentBlueprintFromDocumentResponses, PostDocumentBlueprintResponses, PostDocumentByIdCopyData, PostDocumentByIdCopyErrors, PostDocumentByIdCopyResponses, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessErrors, PostDocumentByIdPublicAccessResponses, PostDocumentCreateAndPublishData, PostDocumentCreateAndPublishErrors, PostDocumentCreateAndPublishResponses, PostDocumentData, PostDocumentErrors, PostDocumentResponses, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsErrors, PostDocumentTypeAvailableCompositionsResponses, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyErrors, PostDocumentTypeByIdCopyResponses, PostDocumentTypeByIdTemplateData, PostDocumentTypeByIdTemplateErrors, PostDocumentTypeByIdTemplateResponses, PostDocumentTypeData, PostDocumentTypeErrors, PostDocumentTypeFolderData, PostDocumentTypeFolderErrors, PostDocumentTypeFolderResponses, PostDocumentTypeImportData, PostDocumentTypeImportErrors, PostDocumentTypeImportResponses, PostDocumentTypeResponses, PostDocumentValidateData, PostDocumentValidateErrors, PostDocumentValidateResponses, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackErrors, PostDocumentVersionByIdRollbackResponses, PostDynamicRootQueryData, PostDynamicRootQueryErrors, PostDynamicRootQueryResponses, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionErrors, PostHealthCheckExecuteActionResponses, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckErrors, PostHealthCheckGroupByNameCheckResponses, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildErrors, PostIndexerByIndexNameRebuildResponses, PostInstallSetupData, PostInstallSetupErrors, PostInstallSetupResponses, PostInstallValidateDatabaseData, PostInstallValidateDatabaseErrors, PostInstallValidateDatabaseResponses, PostLanguageData, PostLanguageErrors, PostLanguageResponses, PostLogViewerSavedSearchData, PostLogViewerSavedSearchErrors, PostLogViewerSavedSearchResponses, PostMediaData, PostMediaErrors, PostMediaResponses, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsErrors, PostMediaTypeAvailableCompositionsResponses, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyErrors, PostMediaTypeByIdCopyResponses, PostMediaTypeData, PostMediaTypeErrors, PostMediaTypeFolderData, PostMediaTypeFolderErrors, PostMediaTypeFolderResponses, PostMediaTypeImportData, PostMediaTypeImportErrors, PostMediaTypeImportResponses, PostMediaTypeResponses, PostMediaValidateData, PostMediaValidateErrors, PostMediaValidateResponses, PostMemberData, PostMemberErrors, PostMemberGroupData, PostMemberGroupErrors, PostMemberGroupResponses, PostMemberResponses, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsErrors, PostMemberTypeAvailableCompositionsResponses, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyErrors, PostMemberTypeByIdCopyResponses, PostMemberTypeData, PostMemberTypeErrors, PostMemberTypeFolderData, PostMemberTypeFolderErrors, PostMemberTypeFolderResponses, PostMemberTypeImportData, PostMemberTypeImportErrors, PostMemberTypeImportResponses, PostMemberTypeResponses, PostMemberValidateData, PostMemberValidateErrors, PostMemberValidateResponses, PostModelsBuilderBuildData, PostModelsBuilderBuildErrors, PostModelsBuilderBuildResponses, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationErrors, PostPackageByNameRunMigrationResponses, PostPackageCreatedData, PostPackageCreatedErrors, PostPackageCreatedResponses, PostPartialViewData, PostPartialViewErrors, PostPartialViewFolderData, PostPartialViewFolderErrors, PostPartialViewFolderResponses, PostPartialViewResponses, PostPreviewData, PostPreviewErrors, PostPreviewResponses, PostPublishedCacheRebuildData, PostPublishedCacheRebuildErrors, PostPublishedCacheRebuildResponses, PostPublishedCacheReloadData, PostPublishedCacheReloadErrors, PostPublishedCacheReloadResponses, PostRedirectManagementStatusData, PostRedirectManagementStatusErrors, PostRedirectManagementStatusResponses, PostScriptData, PostScriptErrors, PostScriptFolderData, PostScriptFolderErrors, PostScriptFolderResponses, PostScriptResponses, PostSecurityForgotPasswordData, PostSecurityForgotPasswordErrors, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetErrors, PostSecurityForgotPasswordResetResponses, PostSecurityForgotPasswordResponses, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyErrors, PostSecurityForgotPasswordVerifyResponses, PostStylesheetData, PostStylesheetErrors, PostStylesheetFolderData, PostStylesheetFolderErrors, PostStylesheetFolderResponses, PostStylesheetResponses, PostTelemetryLevelData, PostTelemetryLevelErrors, PostTelemetryLevelResponses, PostTemplateData, PostTemplateErrors, PostTemplateQueryExecuteData, PostTemplateQueryExecuteErrors, PostTemplateQueryExecuteResponses, PostTemplateResponses, PostTemporaryFileData, PostTemporaryFileErrors, PostTemporaryFileResponses, PostUpgradeAuthorizeData, PostUpgradeAuthorizeErrors, PostUpgradeAuthorizeResponses, PostUserAvatarByIdData, PostUserAvatarByIdErrors, PostUserAvatarByIdResponses, PostUserByIdChangePasswordData, PostUserByIdChangePasswordErrors, PostUserByIdChangePasswordResponses, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsErrors, PostUserByIdClientCredentialsResponses, PostUserByIdResetPasswordData, PostUserByIdResetPasswordErrors, PostUserByIdResetPasswordResponses, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameErrors, PostUserCurrent2FaByProviderNameResponses, PostUserCurrentAvatarData, PostUserCurrentAvatarErrors, PostUserCurrentAvatarResponses, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordErrors, PostUserCurrentChangePasswordResponses, PostUserData, PostUserDataData, PostUserDataErrors, PostUserDataResponses, PostUserDisableData, PostUserDisableErrors, PostUserDisableResponses, PostUserEnableData, PostUserEnableErrors, PostUserEnableResponses, PostUserErrors, PostUserGroupByIdUsersData, PostUserGroupByIdUsersErrors, PostUserGroupByIdUsersResponses, PostUserGroupData, PostUserGroupErrors, PostUserGroupResponses, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordErrors, PostUserInviteCreatePasswordResponses, PostUserInviteData, PostUserInviteErrors, PostUserInviteResendData, PostUserInviteResendErrors, PostUserInviteResendResponses, PostUserInviteResponses, PostUserInviteVerifyData, PostUserInviteVerifyErrors, PostUserInviteVerifyResponses, PostUserResponses, PostUserSetUserGroupsData, PostUserSetUserGroupsErrors, PostUserSetUserGroupsResponses, PostUserUnlockData, PostUserUnlockErrors, PostUserUnlockResponses, PostWebhookData, PostWebhookErrors, PostWebhookResponses, PutDataTypeByIdData, PutDataTypeByIdErrors, PutDataTypeByIdMoveData, PutDataTypeByIdMoveErrors, PutDataTypeByIdMoveResponses, PutDataTypeByIdResponses, PutDataTypeFolderByIdData, PutDataTypeFolderByIdErrors, PutDataTypeFolderByIdResponses, PutDictionaryByIdData, PutDictionaryByIdErrors, PutDictionaryByIdMoveData, PutDictionaryByIdMoveErrors, PutDictionaryByIdMoveResponses, PutDictionaryByIdResponses, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdErrors, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveErrors, PutDocumentBlueprintByIdMoveResponses, PutDocumentBlueprintByIdResponses, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdErrors, PutDocumentBlueprintFolderByIdResponses, PutDocumentByIdData, PutDocumentByIdDomainsData, PutDocumentByIdDomainsErrors, PutDocumentByIdDomainsResponses, PutDocumentByIdErrors, PutDocumentByIdMoveData, PutDocumentByIdMoveErrors, PutDocumentByIdMoveResponses, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinErrors, PutDocumentByIdMoveToRecycleBinResponses, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsErrors, PutDocumentByIdNotificationsResponses, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessErrors, PutDocumentByIdPublicAccessResponses, PutDocumentByIdPublishData, PutDocumentByIdPublishErrors, PutDocumentByIdPublishResponses, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsErrors, PutDocumentByIdPublishWithDescendantsResponses, PutDocumentByIdResponses, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishErrors, PutDocumentByIdUnpublishResponses, PutDocumentByIdUpdateAndPublishData, PutDocumentByIdUpdateAndPublishErrors, PutDocumentByIdUpdateAndPublishResponses, PutDocumentSortData, PutDocumentSortErrors, PutDocumentSortResponses, PutDocumentTypeByIdData, PutDocumentTypeByIdErrors, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportErrors, PutDocumentTypeByIdImportResponses, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveErrors, PutDocumentTypeByIdMoveResponses, PutDocumentTypeByIdResponses, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdErrors, PutDocumentTypeFolderByIdResponses, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupErrors, PutDocumentVersionByIdPreventCleanupResponses, PutLanguageByIsoCodeData, PutLanguageByIsoCodeErrors, PutLanguageByIsoCodeResponses, PutMediaByIdData, PutMediaByIdErrors, PutMediaByIdMoveData, PutMediaByIdMoveErrors, PutMediaByIdMoveResponses, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinErrors, PutMediaByIdMoveToRecycleBinResponses, PutMediaByIdResponses, PutMediaByIdValidateData, PutMediaByIdValidateErrors, PutMediaByIdValidateResponses, PutMediaSortData, PutMediaSortErrors, PutMediaSortResponses, PutMediaTypeByIdData, PutMediaTypeByIdErrors, PutMediaTypeByIdImportData, PutMediaTypeByIdImportErrors, PutMediaTypeByIdImportResponses, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveErrors, PutMediaTypeByIdMoveResponses, PutMediaTypeByIdResponses, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdErrors, PutMediaTypeFolderByIdResponses, PutMemberByIdData, PutMemberByIdErrors, PutMemberByIdResponses, PutMemberByIdValidateData, PutMemberByIdValidateErrors, PutMemberByIdValidateResponses, PutMemberGroupByIdData, PutMemberGroupByIdErrors, PutMemberGroupByIdResponses, PutMemberTypeByIdData, PutMemberTypeByIdErrors, PutMemberTypeByIdImportData, PutMemberTypeByIdImportErrors, PutMemberTypeByIdImportResponses, PutMemberTypeByIdMoveData, PutMemberTypeByIdMoveErrors, PutMemberTypeByIdMoveResponses, PutMemberTypeByIdResponses, PutMemberTypeFolderByIdData, PutMemberTypeFolderByIdErrors, PutMemberTypeFolderByIdResponses, PutPackageCreatedByIdData, PutPackageCreatedByIdErrors, PutPackageCreatedByIdResponses, PutPartialViewByPathData, PutPartialViewByPathErrors, PutPartialViewByPathRenameData, PutPartialViewByPathRenameErrors, PutPartialViewByPathRenameResponses, PutPartialViewByPathResponses, PutProfilingStatusData, PutProfilingStatusErrors, PutProfilingStatusResponses, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreErrors, PutRecycleBinDocumentByIdRestoreResponses, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreErrors, PutRecycleBinMediaByIdRestoreResponses, PutScriptByPathData, PutScriptByPathErrors, PutScriptByPathRenameData, PutScriptByPathRenameErrors, PutScriptByPathRenameResponses, PutScriptByPathResponses, PutStylesheetByPathData, PutStylesheetByPathErrors, PutStylesheetByPathRenameData, PutStylesheetByPathRenameErrors, PutStylesheetByPathRenameResponses, PutStylesheetByPathResponses, PutTemplateByIdData, PutTemplateByIdErrors, PutTemplateByIdResponses, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Errors, PutUmbracoManagementApiV11DocumentByIdValidate11Responses, PutUserByIdData, PutUserByIdErrors, PutUserByIdResponses, PutUserCurrentProfileData, PutUserCurrentProfileErrors, PutUserCurrentProfileResponses, PutUserDataData, PutUserDataErrors, PutUserDataResponses, PutUserGroupByIdData, PutUserGroupByIdErrors, PutUserGroupByIdResponses, PutWebhookByIdData, PutWebhookByIdErrors, PutWebhookByIdResponses } from './types.gen'; export type Options = Options2 & { /** @@ -2292,6 +2292,28 @@ export class DocumentService { }); } + /** + * Updates and publishes a document. + * + * Updates and publishes a document identified by the provided Id with the details from the request model. + */ + public static putDocumentByIdUpdateAndPublish(options: Options) { + return (options.client ?? client).put({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/document/{id}/update-and-publish', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } + }); + } + /** * Gets a collection of items that reference documents. * @@ -2328,6 +2350,28 @@ export class DocumentService { }); } + /** + * Creates and publishes a new document. + * + * Creates and publishes a new document with the configuration specified in the request model. + */ + public static postDocumentCreateAndPublish(options?: Options) { + return (options?.client ?? client).post({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/document/create-and-publish', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers + } + }); + } + /** * Sorts documents. * diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts index 9f2f8ed2b0c0..3de4fde7fc27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts @@ -161,6 +161,16 @@ export type CopyMemberTypeRequestModel = { target?: ReferenceByIdModel | null; }; +export type CreateAndPublishDocumentRequestModel = { + values: Array; + variants: Array; + id?: string | null; + parent?: ReferenceByIdModel | null; + documentType: ReferenceByIdModel; + template: ReferenceByIdModel | null; + culturesToPublish: Array; +}; + export type CreateDataTypeRequestModel = { name: string; editorAlias: string; @@ -2734,6 +2744,13 @@ export type UnpublishDocumentRequestModel = { cultures?: Array | null; }; +export type UpdateAndPublishDocumentRequestModel = { + values: Array; + variants: Array; + template?: ReferenceByIdModel | null; + culturesToPublish: Array; +}; + export type UpdateCurrentUserRequestModel = { languageIsoCode: string; }; @@ -7320,6 +7337,43 @@ export type PutDocumentByIdUnpublishResponses = { 200: unknown; }; +export type PutDocumentByIdUpdateAndPublishData = { + body?: UpdateAndPublishDocumentRequestModel; + path: { + id: string; + }; + query?: never; + url: '/umbraco/management/api/v1/document/{id}/update-and-publish'; +}; + +export type PutDocumentByIdUpdateAndPublishErrors = { + /** + * Bad Request + */ + 400: ProblemDetails; + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; + /** + * Not Found + */ + 404: ProblemDetails; +}; + +export type PutDocumentByIdUpdateAndPublishError = PutDocumentByIdUpdateAndPublishErrors[keyof PutDocumentByIdUpdateAndPublishErrors]; + +export type PutDocumentByIdUpdateAndPublishResponses = { + /** + * OK + */ + 200: unknown; +}; + export type PutUmbracoManagementApiV11DocumentByIdValidate11Data = { body?: ValidateUpdateDocumentRequestModel; path: { @@ -7415,6 +7469,41 @@ export type GetDocumentConfigurationResponses = { export type GetDocumentConfigurationResponse = GetDocumentConfigurationResponses[keyof GetDocumentConfigurationResponses]; +export type PostDocumentCreateAndPublishData = { + body?: CreateAndPublishDocumentRequestModel; + path?: never; + query?: never; + url: '/umbraco/management/api/v1/document/create-and-publish'; +}; + +export type PostDocumentCreateAndPublishErrors = { + /** + * Bad Request + */ + 400: ProblemDetails; + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; + /** + * Not Found + */ + 404: ProblemDetails; +}; + +export type PostDocumentCreateAndPublishError = PostDocumentCreateAndPublishErrors[keyof PostDocumentCreateAndPublishErrors]; + +export type PostDocumentCreateAndPublishResponses = { + /** + * Created + */ + 201: unknown; +}; + export type PutDocumentSortData = { body?: SortingRequestModel; path?: never; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.test.ts new file mode 100644 index 000000000000..cc4745ebe8e6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.test.ts @@ -0,0 +1,61 @@ +import { umbUrlPatternToString } from './url-pattern-to-string.function.js'; +import { expect } from '@open-wc/testing'; + +describe('umbUrlPatternToString', () => { + describe('when params is null', () => { + it('should return the pattern unchanged', () => { + expect(umbUrlPatternToString('/section/:id/edit', null)).to.eq('/section/:id/edit'); + }); + + it('should return a pattern without parameters unchanged', () => { + expect(umbUrlPatternToString('/section/dashboard', null)).to.eq('/section/dashboard'); + }); + }); + + describe('parameter replacement', () => { + it('should replace a single parameter with its value', () => { + expect(umbUrlPatternToString('/section/:id', { id: '123' })).to.eq('/section/123'); + }); + + it('should replace multiple parameters with their values', () => { + expect(umbUrlPatternToString('/:section/:id/edit', { section: 'content', id: '123' })).to.eq( + '/content/123/edit', + ); + }); + + it('should leave the pattern unchanged when it has no parameters', () => { + expect(umbUrlPatternToString('/section/dashboard', { id: '123' })).to.eq('/section/dashboard'); + }); + + it('should replace a parameter that spans the rest of a path segment', () => { + expect(umbUrlPatternToString('/section/:entityType', { entityType: 'document-type' })).to.eq( + '/section/document-type', + ); + }); + }); + + describe('value coercion', () => { + it('should coerce a number value to a string', () => { + expect(umbUrlPatternToString('/page/:index', { index: 42 })).to.eq('/page/42'); + }); + + it('should call toString on an object value', () => { + const value = { toString: () => 'custom' }; + expect(umbUrlPatternToString('/section/:id', { id: value })).to.eq('/section/custom'); + }); + + it('should render a null value as the string "null"', () => { + expect(umbUrlPatternToString('/section/:id', { id: null })).to.eq('/section/null'); + }); + }); + + describe('missing parameters', () => { + it('should keep the literal token when the value is undefined', () => { + expect(umbUrlPatternToString('/section/:id', {})).to.eq('/section/:id'); + }); + + it('should replace known parameters and keep unknown ones literal', () => { + expect(umbUrlPatternToString('/:section/:id', { section: 'content' })).to.eq('/content/:id'); + }); + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts index e7175e73082b..b36ab9149518 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts @@ -8,9 +8,12 @@ export type UrlParametersRecord = UmbUrlParametersRecord; const PARAM_IDENTIFIER = /:([^/]+)/g; /** - * - * @param pattern - * @param params + * Resolves the `:parameter` tokens in a URL pattern using the given parameter values. + * @param {string} pattern - A URL pattern where parameters are written as `:name` (e.g. `/section/:id/edit`). + * @param {UmbUrlParametersRecord | null} params - Key value object, where keys are parameter names and values are the values to replace them with. + * @returns {string} The pattern with its parameter tokens replaced. + * @example + * umbUrlPatternToString('/section/:id/edit', { id: 123 }); // '/section/123/edit' */ export function umbUrlPatternToString(pattern: string, params: UmbUrlParametersRecord | null): string { return params diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts index 6aa5332d926e..7caf10f17f0d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts @@ -1,5 +1,5 @@ import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -import { UmbArrayState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import type { IComponentRoute, UmbRoute } from '@umbraco-cms/backoffice/router'; /** @@ -12,7 +12,8 @@ export class UmbWorkspaceRouteManager extends UmbControllerBase { #routes = new UmbArrayState([], (x) => x.path); public readonly routes = this.#routes.asObservable(); - #activeLocalPath = new UmbStringState(''); + #absolutePath?: string; + #localPath?: string; /** * Set the routes for the workspace. @@ -34,7 +35,10 @@ export class UmbWorkspaceRouteManager extends UmbControllerBase { const oldSetupCallback = route.setup; route.setup = (_component: any, info: any) => { - this.#activeLocalPath.setValue(info.match.fragments.consumed); + // TODO: could this be invalidated by the time it's used? [NL] + // That would be a parent router switches path without the view being changed... + this.#absolutePath = info.slot?.constructAbsolutePath(); + this.#localPath = info.match.fragments.consumed; if (oldSetupCallback) { oldSetupCallback(_component, info); @@ -58,10 +62,19 @@ export class UmbWorkspaceRouteManager extends UmbControllerBase { /** * Get the active local path. - * @returns {*} {string} + * @returns {string} The active local path. * @memberof UmbWorkspaceRouteManager */ getActiveLocalPath(): string { - return this.#activeLocalPath.getValue(); + return this.#localPath ?? ''; + } + + /** + * Get the absolute path. + * @returns {string | undefined} The absolute path. + * @memberof UmbWorkspaceRouteManager + */ + getAbsolutePath(): string | undefined { + return this.#absolutePath; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts index 0499e6769d22..dd78848286f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts @@ -1,4 +1,5 @@ import { UmbSubmittableWorkspaceContextBase } from '../submittable/index.js'; +import { umbWorkspaceWillNavigateAway } from '../utils/check-will-navigate-away.function.js'; import { UmbEntityWorkspaceDataManager } from '../entity/entity-workspace-data-manager.js'; import type { UmbSubmittableTreeEntityWorkspaceContext } from '../contexts/tokens/index.js'; import type { UmbEntityDetailWorkspaceContextArgs, UmbEntityDetailWorkspaceContextCreateArgs } from './types.js'; @@ -28,11 +29,11 @@ const LOADING_STATE_UNIQUE = 'umbLoadingEntityDetail'; const FORBIDDEN_STATE_UNIQUE = 'umbForbiddenEntityDetail'; export abstract class UmbEntityDetailWorkspaceContextBase< - DetailModelType extends UmbEntityModel = UmbEntityModel, - DetailRepositoryType extends UmbDetailRepository = UmbDetailRepository, - CreateArgsType extends - UmbEntityDetailWorkspaceContextCreateArgs = UmbEntityDetailWorkspaceContextCreateArgs, - > + DetailModelType extends UmbEntityModel = UmbEntityModel, + DetailRepositoryType extends UmbDetailRepository = UmbDetailRepository, + CreateArgsType extends UmbEntityDetailWorkspaceContextCreateArgs = + UmbEntityDetailWorkspaceContextCreateArgs, +> extends UmbSubmittableWorkspaceContextBase implements UmbSubmittableTreeEntityWorkspaceContext { @@ -291,6 +292,19 @@ export abstract class UmbEntityDetailWorkspaceContextBase< } } + /** + * Requests the latest persisted version of the entity from the server WITHOUT applying it to the + * workspace state, and returns the processed data. + * @returns { Promise } The latest persisted data. + */ + public async loadWithoutPersist(): Promise { + const unique = this.getUnique(); + if (!unique) throw new Error('Unique is not set'); + const { data, error } = await this._detailRepository!.requestByUnique(unique); + if (error || !data) throw new Error('Error loading entity', { cause: error }); + return await this._processIncomingData(data); + } + /** * Method to check if the workspace data is loaded. * @returns { Promise | undefined } true if the workspace data is loaded. @@ -391,10 +405,7 @@ export abstract class UmbEntityDetailWorkspaceContextBase< * @memberof UmbEntityWorkspaceContextBase */ protected _checkWillNavigateAway(newUrl: string | URL): boolean { - if (newUrl instanceof URL) { - newUrl = newUrl.href; - } - return !newUrl.includes(this.routes.getActiveLocalPath()); + return umbWorkspaceWillNavigateAway(this.routes, this.getUnique(), newUrl); } protected async _create(currentData: DetailModelType, parent: UmbEntityModel) { @@ -402,7 +413,7 @@ export abstract class UmbEntityDetailWorkspaceContextBase< const { error, data } = await this._detailRepository.create(currentData, parent.unique); if (error || !data) { - throw error?.message ?? 'Repository did not return data after create.'; + throw new Error('Repository did not return data after create.', { cause: error }); } this.#entityContext.setUnique(data.unique); @@ -431,7 +442,7 @@ export abstract class UmbEntityDetailWorkspaceContextBase< protected async _update(currentData: DetailModelType) { const { error, data } = await this._detailRepository!.save(currentData); if (error || !data) { - throw error?.message ?? 'Repository did not return data after create.'; + throw new Error('Entity Detail Repository failed saving', { cause: error }); } this._data.setPersisted(data); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts index 3ee9f937020e..783e90aa5ef7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts @@ -8,6 +8,7 @@ export * from './info-app/index.js'; export * from './modals/index.js'; export * from './paths.js'; export * from './submittable/index.js'; +export * from './utils/check-will-navigate-away.function.js'; export * from './utils/object-to-property-value-array.function.js'; export * from './workspace-property-dataset/index.js'; export * from './workspace.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/utils/check-will-navigate-away.function.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/utils/check-will-navigate-away.function.test.ts new file mode 100644 index 000000000000..575ea7dc1a88 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/utils/check-will-navigate-away.function.test.ts @@ -0,0 +1,73 @@ +import { umbWorkspaceWillNavigateAway } from './check-will-navigate-away.function.js'; +import type { UmbWorkspaceRouteManager } from '../controllers/workspace-route-manager.controller.js'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import { expect } from '@open-wc/testing'; + +const BASE = '/umbraco/section/content/workspace/document'; + +function routeManager(config: { + absolutePath?: string; + activeLocalPath?: string; + routes?: Array>; +}): UmbWorkspaceRouteManager { + return { + getAbsolutePath: () => config.absolutePath, + getActiveLocalPath: () => config.activeLocalPath ?? '', + getRoutes: () => (config.routes ?? []) as Array, + } as unknown as UmbWorkspaceRouteManager; +} + +describe('umbWorkspaceWillNavigateAway', () => { + it('does not block before the workspace has been routed (no absolute path)', () => { + const routes = routeManager({ absolutePath: undefined, activeLocalPath: 'edit/123' }); + expect(umbWorkspaceWillNavigateAway(routes, '123', `${BASE}/edit/123`)).to.be.false; + }); + + it('stays when navigating to a sub-view of the active route', () => { + const routes = routeManager({ absolutePath: BASE, activeLocalPath: 'edit/123' }); + expect(umbWorkspaceWillNavigateAway(routes, '123', `${BASE}/edit/123/view/content`)).to.be.false; + }); + + it('stays when the target is exactly the active route', () => { + const routes = routeManager({ absolutePath: BASE, activeLocalPath: 'edit/123' }); + expect(umbWorkspaceWillNavigateAway(routes, '123', `${BASE}/edit/123`)).to.be.false; + }); + + it('navigates away when an identical segment appears elsewhere in the URL (positional anchoring)', () => { + // The bug: a duplicate `edit/123` deeper in the path must not mask a real change to the owned segment. + const routes = routeManager({ + absolutePath: BASE, + activeLocalPath: 'edit/123', + routes: [{ path: 'edit/:unique' }], + }); + expect(umbWorkspaceWillNavigateAway(routes, '123', `${BASE}/edit/456/something/edit/123`)).to.be.true; + }); + + it('does not match a unique that is only a string prefix of the new segment', () => { + const routes = routeManager({ absolutePath: BASE, activeLocalPath: 'edit/123' }); + expect(umbWorkspaceWillNavigateAway(routes, '123', `${BASE}/edit/1234`)).to.be.true; + }); + + it('stays through the create -> edit redirect for the freshly created entity', () => { + const routes = routeManager({ + absolutePath: BASE, + activeLocalPath: 'create/parent/document-root/null/dt-1', + routes: [{ path: 'create/parent/:parentEntityType/:parentUnique/:documentTypeUnique' }, { path: 'edit/:unique' }], + }); + expect(umbWorkspaceWillNavigateAway(routes, 'new-1', `${BASE}/edit/new-1`)).to.be.false; + }); + + it('navigates away when leaving the workspace mount entirely', () => { + const routes = routeManager({ + absolutePath: BASE, + activeLocalPath: 'edit/123', + routes: [{ path: 'edit/:unique' }], + }); + expect(umbWorkspaceWillNavigateAway(routes, '123', '/umbraco/section/media/workspace/media/edit/123')).to.be.true; + }); + + it('ignores query strings when matching', () => { + const routes = routeManager({ absolutePath: BASE, activeLocalPath: 'edit/123' }); + expect(umbWorkspaceWillNavigateAway(routes, '123', `${BASE}/edit/123?foo=bar`)).to.be.false; + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/utils/check-will-navigate-away.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/utils/check-will-navigate-away.function.ts new file mode 100644 index 000000000000..1a5f35e6ed11 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/utils/check-will-navigate-away.function.ts @@ -0,0 +1,41 @@ +import type { UmbWorkspaceRouteManager } from '../controllers/workspace-route-manager.controller.js'; +import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; +import { umbUrlPatternToString } from '@umbraco-cms/backoffice/utils'; + +/** + * Determines whether a pending navigation leaves the workspace that owns the given routes. + * @param {UmbWorkspaceRouteManager} routeManager The route manager of the workspace. + * @param {UmbEntityUnique | undefined} unique The unique of the entity currently being edited. + * @param {string | URL} newUrl The url the navigation is heading towards. + * @returns {boolean} true if the navigation leaves the workspace. + */ +export function umbWorkspaceWillNavigateAway( + routeManager: UmbWorkspaceRouteManager, + unique: UmbEntityUnique | undefined, + newUrl: string | URL, +): boolean { + const basePath = routeManager.getAbsolutePath(); + // Before the workspace has been routed we cannot position the match, so we never block. + if (basePath === undefined) return false; + + const newPath = (newUrl instanceof URL ? newUrl : new URL(newUrl, window.location.origin)).pathname; + + // Check against the active local path + const sameEntityPaths = [routeManager.getActiveLocalPath()]; + + // Check against all routes of the workspace that carry the same unique. + if (unique) { + for (const route of routeManager.getRoutes()) { + // Routes that don't carry the unique keep their unresolved `:param` tokens, so they + // can never match a concrete URL and are effectively skipped. + sameEntityPaths.push(umbUrlPatternToString(route.path, { unique })); + } + } + + // Run the checks: + return !sameEntityPaths.some((localPath) => { + if (localPath === '') return false; + const absolutePath = `${basePath}/${localPath}`; + return newPath === absolutePath || newPath.startsWith(`${absolutePath}/`); + }); +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts index 56582bc8ef8d..562a348c386f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts @@ -6,6 +6,38 @@ import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; export class UmbDocumentPublishingRepository extends UmbRepositoryBase { #publishingDataSource = new UmbDocumentPublishingServerDataSource(this); + /** + * Creates and publishes a new Document in a single operation + * @param {UmbDocumentDetailModel} model - The Document to create + * @param {Array} variantIds - The variants to publish after creating + * @param {string | null} parentUnique - The unique of the parent to create under + * @returns {*} + * @memberof UmbDocumentPublishingRepository + */ + async createAndPublish( + model: UmbDocumentDetailModel, + variantIds: Array, + parentUnique: string | null = null, + ) { + if (!model) throw new Error('Document is missing'); + if (!model.unique) throw new Error('Document unique is missing'); + + return this.#publishingDataSource.createAndPublish(model, variantIds, parentUnique); + } + + /** + * Updates and publishes an existing Document in a single operation + * @param {UmbDocumentDetailModel} model - The Document to update + * @param {Array} variantIds - The variants to publish after updating + * @returns {*} + * @memberof UmbDocumentPublishingRepository + */ + async updateAndPublish(model: UmbDocumentDetailModel, variantIds: Array) { + if (!model.unique) throw new Error('Unique is missing'); + + return this.#publishingDataSource.updateAndPublish(model, variantIds); + } + /** * Publish one or more variants of a Document * @param {string} id diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.test.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.test.ts new file mode 100644 index 000000000000..a903e6c5bee7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.test.ts @@ -0,0 +1,98 @@ +import { expect } from '@open-wc/testing'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { useMockSet } from '@umbraco-cms/internal/mock-manager'; +import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; +import { customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import { UmbDocumentServerDataSource } from '../../repository/detail/document-detail.server.data-source.js'; +import { UmbDocumentPublishingServerDataSource } from './document-publishing.server.data-source.js'; + +const VARIANT_DOCUMENT_ID = 'variant-documents-variant-document-id'; +const INVARIANT_DOCUMENT_ID = 'variant-documents-invariant-document-id'; + +@customElement('umb-test-document-publishing-data-source-host') +class UmbTestHostElement extends UmbControllerHostElementMixin(HTMLElement) {} + +describe('UmbDocumentPublishingServerDataSource (create/update-and-publish)', () => { + let hostElement: UmbTestHostElement; + // The detail data source is used only to read the document back and assert the published outcome, + // since the and-publish endpoints return no document body. + let detailDataSource: UmbDocumentServerDataSource; + let publishingDataSource: UmbDocumentPublishingServerDataSource; + + beforeEach(async () => { + await useMockSet('documents'); + hostElement = new UmbTestHostElement(); + document.body.appendChild(hostElement); + detailDataSource = new UmbDocumentServerDataSource(hostElement); + publishingDataSource = new UmbDocumentPublishingServerDataSource(hostElement); + }); + + afterEach(() => { + document.body.innerHTML = ''; + }); + + describe('createAndPublish', () => { + it('creates a new document and publishes only the requested culture', async () => { + // Use an existing document as a valid model template, with a fresh unique so it is created anew. + const { data: template } = await detailDataSource.read(VARIANT_DOCUMENT_ID); + expect(template, 'precondition: template document loads').to.exist; + const newId = UmbId.new(); + const newModel = { ...template!, unique: newId }; + + const da = UmbVariantId.Create({ culture: 'da', segment: null }); + const { error } = await publishingDataSource.createAndPublish(newModel, [da], null); + expect(error).to.be.undefined; + + const { data: created } = await detailDataSource.read(newId); + const daVariant = created!.variants.find((v) => v.culture === 'da'); + expect(daVariant?.state, 'the requested culture (da) is Published').to.equal('Published'); + }); + }); + + describe('updateAndPublish', () => { + it('publishes only the requested culture', async () => { + const { data: model } = await detailDataSource.read(VARIANT_DOCUMENT_ID); + expect(model, 'precondition: document loads').to.exist; + + // da starts as Draft; publishing only da should leave en-US untouched. + const daVariantId = UmbVariantId.Create({ culture: 'da', segment: null }); + const { error } = await publishingDataSource.updateAndPublish(model!, [daVariantId]); + expect(error).to.be.undefined; + + const { data: updated } = await detailDataSource.read(VARIANT_DOCUMENT_ID); + const da = updated!.variants.find((v) => v.culture === 'da'); + const enUs = updated!.variants.find((v) => v.culture === 'en-US'); + expect(da?.state, 'da becomes Published').to.equal('Published'); + expect(enUs?.state, 'en-US is unaffected (was already Published)').to.equal('Published'); + }); + + it('does not publish a culture that was not requested', async () => { + // A fresh mock set where da is Draft. + const { data: model } = await detailDataSource.read(VARIANT_DOCUMENT_ID); + const enUs = UmbVariantId.Create({ culture: 'en-US', segment: null }); + + const { error } = await publishingDataSource.updateAndPublish(model!, [enUs]); + expect(error).to.be.undefined; + + const { data: updated } = await detailDataSource.read(VARIANT_DOCUMENT_ID); + const da = updated!.variants.find((v) => v.culture === 'da'); + expect(da?.state, 'da stays Draft when only en-US is published').to.equal('Draft'); + }); + }); + + describe('invariant update-and-publish', () => { + it('publishes the invariant variant using an empty culturesToPublish array', async () => { + const { data: model } = await detailDataSource.read(INVARIANT_DOCUMENT_ID); + expect(model, 'precondition: invariant document loads').to.exist; + + const invariant = UmbVariantId.CreateInvariant(); + const { error } = await publishingDataSource.updateAndPublish(model!, [invariant]); + expect(error).to.be.undefined; + + const { data: updated } = await detailDataSource.read(INVARIANT_DOCUMENT_ID); + const variant = updated!.variants.find((v) => v.culture === null); + expect(variant?.state, 'the invariant variant is Published').to.equal('Published'); + }); + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts index 41024e024c38..67b063a2b1ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts @@ -1,10 +1,16 @@ import type { UmbDocumentDetailModel, UmbDocumentVariantPublishModel } from '../../types.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import { + umbMapDocumentCreateRequestBody, + umbMapDocumentUpdateRequestBody, +} from '../../repository/detail/document-detail-request.mappers.js'; import type { + CreateAndPublishDocumentRequestModel, CultureAndScheduleRequestModel, PublishDocumentRequestModel, PublishDocumentWithDescendantsRequestModel, UnpublishDocumentRequestModel, + UpdateAndPublishDocumentRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -29,6 +35,67 @@ export class UmbDocumentPublishingServerDataSource { this.#host = host; } + /** + * Creates and publishes a new Document on the server in a single operation + * @param {UmbDocumentDetailModel} model - Document Model + * @param {Array} variantIds - The variants to publish after creating + * @param {string | null} parentUnique - The unique of the parent to create under + * @returns {*} + * @memberof UmbDocumentPublishingServerDataSource + */ + async createAndPublish( + model: UmbDocumentDetailModel, + variantIds: Array, + parentUnique: string | null = null, + ) { + if (!model) throw new Error('Document is missing'); + if (!model.unique) throw new Error('Document unique is missing'); + + const body: CreateAndPublishDocumentRequestModel = { + ...umbMapDocumentCreateRequestBody(model, parentUnique), + culturesToPublish: this.#mapCulturesToPublish(variantIds), + }; + + // 201 Created returns only the key (no document body). The workspace reloads after this to refresh + // its state, so we deliberately do NOT re-read the full document here — that would be a redundant + // round-trip on top of the reload. + return tryExecute(this.#host, DocumentService.postDocumentCreateAndPublish({ body })); + } + + /** + * Updates and publishes a Document on the server in a single operation + * @param {UmbDocumentDetailModel} model - Document Model + * @param {Array} variantIds - The variants to publish after updating + * @returns {*} + * @memberof UmbDocumentPublishingServerDataSource + */ + async updateAndPublish(model: UmbDocumentDetailModel, variantIds: Array) { + if (!model.unique) throw new Error('Unique is missing'); + + const body: UpdateAndPublishDocumentRequestModel = { + ...umbMapDocumentUpdateRequestBody(model), + culturesToPublish: this.#mapCulturesToPublish(variantIds), + }; + + // 200 returns only a notification header (no document body). The workspace reloads after this to + // refresh its state, so we deliberately do NOT re-read the full document here. + return tryExecute( + this.#host, + DocumentService.putDocumentByIdUpdateAndPublish({ path: { id: model.unique }, body }), + ); + } + + /** + * Maps the selected variants to the culture codes accepted by the create/update-and-publish endpoints. + * Invariant content types require an empty array (cultures cannot be specified), and the server rejects + * `null`/`"*"` entries, so invariant variants are filtered out and only distinct culture codes remain. + * @param {Array} variantIds - The selected variants to publish + * @returns {Array} The distinct culture codes to publish + */ + #mapCulturesToPublish(variantIds: Array): Array { + return [...new Set(variantIds.filter((x) => !x.isCultureInvariant()).map((x) => x.toCultureString()))]; + } + /** * Publish one or more variants of a Document * @param {string} unique diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 1147abdd20c8..268ebcbb1e0d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -170,29 +170,41 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase implem return this.#documentWorkspaceContext.validateVariantsAndSubmit( variantIds, async () => { - if (!this.#documentWorkspaceContext) { - throw new Error('Document workspace context is missing'); - } - - // Save the document before scheduling - await this.#documentWorkspaceContext.performCreateOrUpdate(variantIds, saveData); - - // Schedule the document - const { error } = await this.#publishingRepository.publish(unique, variants); - if (error) { + try { + if (!this.#documentWorkspaceContext) { + throw new Error('Document workspace context is missing'); + } + + // Save the document before scheduling + await this.#documentWorkspaceContext.performCreateOrUpdate(variantIds, saveData); + + // Schedule the document + const { error } = await this.#publishingRepository.publish(unique, variants); + if (error) { + throw error; + } + + const notification = { + data: { message: this.#localize.term('speechBubbles_editContentScheduledSavedText') }, + }; + this.#notificationContext?.peek('positive', notification); + + // reload the document so all states are updated after the publish operation + // TODO: It seems wrong to make a full reload, In this case I think we can just update the variants status? [NL] + await this.#documentWorkspaceContext.reload(); + this.#loadAndProcessLastPublished(); + + // request reload of this entity + const structureEvent = new UmbRequestReloadStructureForEntityEvent({ entityType, unique }); + this.#eventContext?.dispatchEvent(structureEvent); + } catch (error) { + // Notify only on the publish path. The validation-failure path below already + // notifies, so a shared top-level .catch would fire a second toast. [JOV] + this.#notificationContext?.peek('danger', { + data: { message: this.#localize.term('speechBubbles_editContentScheduledNotSavedText') }, + }); return Promise.reject(error); } - - const notification = { data: { message: this.#localize.term('speechBubbles_editContentScheduledSavedText') } }; - this.#notificationContext?.peek('positive', notification); - - // reload the document so all states are updated after the publish operation - await this.#documentWorkspaceContext.reload(); - this.#loadAndProcessLastPublished(); - - // request reload of this entity - const structureEvent = new UmbRequestReloadStructureForEntityEvent({ entityType, unique }); - this.#eventContext?.dispatchEvent(structureEvent); }, async (reason?: any) => { const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); @@ -290,6 +302,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase implem }); // reload the document so all states are updated after the publish operation + // TODO: It seems wrong to make a full reload, I think we should only load the selected variants. [NL] await this.#documentWorkspaceContext.reload(); await this.#loadAndProcessLastPublished(); @@ -322,6 +335,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase implem await new UmbUnpublishDocumentEntityAction(this, { unique, entityType, meta: {} as never }).execute(); // Reload workspace data to reflect the unpublished state + // TODO: It seems wrong to make a full reload, In this case I think we can just update the variants status? [NL] await this.#documentWorkspaceContext.reload(); await this.#loadAndProcessLastPublished(); } @@ -368,8 +382,15 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase implem return this.#documentWorkspaceContext.validateVariantsAndSubmit( variantIds, - async () => { - return this.#performSaveAndPublish(variantIds, saveData); + () => { + // Notify only on the publish path. The validation-failure path below already + // notifies, so a shared top-level .catch would fire a second, contradictory toast. [JOV] + return this.#performSaveAndPublish(variantIds, saveData).catch((error) => { + this.#notificationContext?.peek('danger', { + data: { message: this.#localize.term('speechBubbles_editContentPublishedFailed') }, + }); + return Promise.reject(error); + }); }, async (reason?: any) => { // If data of the selection is not valid Then just save: @@ -399,33 +420,49 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase implem const entityType = this.#documentWorkspaceContext.getEntityType(); if (!entityType) throw new Error('Entity type is missing'); - await this.#documentWorkspaceContext.performCreateOrUpdate(variantIds, saveData); + // The publish already succeeded server-side once we reach the read-back; a failed read-back must not be + // reported as a publish failure, so we fall back to the submitted data and flag the editor as stale. + let reloadAfterPublishFailed = false; + const loadAfterPublish = async (): Promise => { + try { + return await this.#documentWorkspaceContext!.loadWithoutPersist(); + } catch { + reloadAfterPublishFailed = true; + return saveData; + } + }; - const { error } = await this.#publishingRepository.publish( - unique, - variantIds.map((variantId) => ({ variantId })), - ); + await this.#documentWorkspaceContext.performCreateOrUpdate(variantIds, saveData, { + create: async (data, ids, parent) => { + const { error } = await this.#publishingRepository.createAndPublish(data, ids, parent.unique); + if (error) throw new Error('Error creating and publishing document', { cause: error }); + return loadAfterPublish(); + }, + update: async (data, ids) => { + const { error } = await this.#publishingRepository.updateAndPublish(data, ids); + if (error) throw new Error('Error updating and publishing document', { cause: error }); + return loadAfterPublish(); + }, + }); - if (!error) { - this.#notificationContext?.peek('positive', { + this.#notificationContext?.peek('positive', { + data: { + message: this.#localize.term('speechBubbles_editContentPublishedHeader'), + }, + }); + + if (reloadAfterPublishFailed) { + this.#notificationContext?.peek('warning', { data: { - message: this.#localize.term('speechBubbles_editContentPublishedHeader'), + message: this.#localize.term('speechBubbles_editContentPublishedReloadFailed'), }, }); + } - // Clear stale published data and pending changes state so the - // persistedData observer does not run a comparison against outdated - // data during reload, which would briefly show a false-positive - // "pending changes" state. - this.#clear(); - - // reload the document so all states are updated after the publish operation - await this.#documentWorkspaceContext.reload(); - await this.#loadAndProcessLastPublished(); + await this.#loadAndProcessLastPublished(); - const event = new UmbRequestReloadStructureForEntityEvent({ unique, entityType }); - this.#eventContext?.dispatchEvent(event); - } + const event = new UmbRequestReloadStructureForEntityEvent({ unique, entityType }); + this.#eventContext?.dispatchEvent(event); } #publishableVariantsFilter = (option: UmbDocumentVariantOptionModel) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail-request.mappers.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail-request.mappers.ts new file mode 100644 index 000000000000..864473b33eb4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail-request.mappers.ts @@ -0,0 +1,40 @@ +import type { UmbDocumentDetailModel } from '../../types.js'; +import type { + CreateDocumentRequestModel, + UpdateDocumentRequestModel, +} from '@umbraco-cms/backoffice/external/backend-api'; + +/** + * Maps a Document detail model to the create request body. + * Shared by the detail create endpoint and the publishing create-and-publish endpoint. + * @param {UmbDocumentDetailModel} model - The Document to create + * @param {string | null} parentUnique - The unique of the parent to create under + * @returns {CreateDocumentRequestModel} The create request body + */ +export function umbMapDocumentCreateRequestBody( + model: UmbDocumentDetailModel, + parentUnique: string | null, +): CreateDocumentRequestModel { + return { + id: model.unique, + parent: parentUnique ? { id: parentUnique } : null, + documentType: { id: model.documentType.unique }, + template: model.template ? { id: model.template.unique } : null, + values: model.values, + variants: model.variants, + }; +} + +/** + * Maps a Document detail model to the update request body. + * Shared by the detail update endpoint and the publishing update-and-publish endpoint. + * @param {UmbDocumentDetailModel} model - The Document to update + * @returns {UpdateDocumentRequestModel} The update request body + */ +export function umbMapDocumentUpdateRequestBody(model: UmbDocumentDetailModel): UpdateDocumentRequestModel { + return { + template: model.template ? { id: model.template.unique } : null, + values: model.values, + variants: model.variants, + }; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.repository.ts index e02feda28f64..3c9c26d957f4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.repository.ts @@ -3,7 +3,10 @@ import { UmbDocumentServerDataSource } from './document-detail.server.data-sourc import { UMB_DOCUMENT_DETAIL_STORE_CONTEXT } from './document-detail.store.context-token.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbDetailRepositoryBase } from '@umbraco-cms/backoffice/repository'; -export class UmbDocumentDetailRepository extends UmbDetailRepositoryBase { +export class UmbDocumentDetailRepository extends UmbDetailRepositoryBase< + UmbDocumentDetailModel, + UmbDocumentServerDataSource +> { constructor(host: UmbControllerHost) { super(host, UmbDocumentServerDataSource, UMB_DOCUMENT_DETAIL_STORE_CONTEXT); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts index 21c278fbcd67..b8153489ef6b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts @@ -11,6 +11,7 @@ import { tryExecute } from '@umbraco-cms/backoffice/resources'; import { umbDeepMerge, type UmbDeepPartialObject } from '@umbraco-cms/backoffice/utils'; import { UmbDocumentTypeDetailServerDataSource } from '@umbraco-cms/backoffice/document-type'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import { umbMapDocumentCreateRequestBody, umbMapDocumentUpdateRequestBody } from './document-detail-request.mappers.js'; /** * A data source for the Document that fetches data from the server @@ -125,15 +126,7 @@ export class UmbDocumentServerDataSource if (!model) throw new Error('Document is missing'); if (!model.unique) throw new Error('Document unique is missing'); - // TODO: make data mapper to prevent errors - const body: CreateDocumentRequestModel = { - id: model.unique, - parent: parentUnique ? { id: parentUnique } : null, - documentType: { id: model.documentType.unique }, - template: model.template ? { id: model.template.unique } : null, - values: model.values, - variants: model.variants, - }; + const body: CreateDocumentRequestModel = umbMapDocumentCreateRequestBody(model, parentUnique); const { data, error } = await tryExecute( this, @@ -158,12 +151,7 @@ export class UmbDocumentServerDataSource async update(model: UmbDocumentDetailModel) { if (!model.unique) throw new Error('Unique is missing'); - // TODO: make data mapper to prevent errors - const body: UpdateDocumentRequestModel = { - template: model.template ? { id: model.template.unique } : null, - values: model.values, - variants: model.variants, - }; + const body: UpdateDocumentRequestModel = umbMapDocumentUpdateRequestBody(model); const { error } = await tryExecute( this, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/context/document-workspace-create-and-publish.context.test.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/context/document-workspace-create-and-publish.context.test.ts new file mode 100644 index 000000000000..a24018ed73e0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/context/document-workspace-create-and-publish.context.test.ts @@ -0,0 +1,110 @@ +import { expect } from '@open-wc/testing'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { useMockSet } from '@umbraco-cms/internal/mock-manager'; +import { UmbDocumentWorkspaceContext } from './document-workspace.context.js'; +import { TEST_MANIFESTS, UmbTestDocumentWorkspaceHostElement } from './document-workspace-context.test-utils.js'; +import { UmbDocumentPublishingServerDataSource } from '../../publishing/repository/document-publishing.server.data-source.js'; + +const INVARIANT_DOCUMENT_TYPE_ID = 'variant-documents-invariant-document-type-id'; +const VARIANT_DOCUMENT_TYPE_ID = 'variant-documents-variant-document-type-id'; +const PARENT_ENTITY = { entityType: 'document', unique: null } as const; +const EN_US = UmbVariantId.Create({ culture: 'en-US', segment: null }); +const DA = UmbVariantId.Create({ culture: 'da', segment: null }); + +/** + * Reproduces the create-and-publish orchestration the publishing workspace context performs: build the + * save data, then drive performCreateOrUpdate with a persist strategy that calls the combined + * create-and-publish endpoint via the publishing data source. The endpoint does not return the saved + * document, so the strategy re-reads the authoritative server state (loadWithoutPersist) and returns it + * for the workspace to merge — published variants take the server values, edited-but-unpublished variants + * stay dirty. + */ +async function createAndPublish( + context: UmbDocumentWorkspaceContext, + publishingDataSource: UmbDocumentPublishingServerDataSource, + variantIds: Array, +) { + const saveData = await context.constructSaveData(variantIds); + await context.performCreateOrUpdate(variantIds, saveData, { + create: async (data, ids, parent) => { + await publishingDataSource.createAndPublish(data, ids, parent.unique); + return context.loadWithoutPersist(); + }, + update: async (data, ids) => { + await publishingDataSource.updateAndPublish(data, ids); + return context.loadWithoutPersist(); + }, + }); +} + +describe('UmbDocumentWorkspaceContext (create-and-publish redirect dirty state)', () => { + let hostElement: UmbTestDocumentWorkspaceHostElement; + let context: UmbDocumentWorkspaceContext; + let publishingDataSource: UmbDocumentPublishingServerDataSource; + + before(() => { + umbExtensionsRegistry.registerMany(TEST_MANIFESTS); + }); + + after(() => { + umbExtensionsRegistry.unregisterMany(TEST_MANIFESTS.map((m) => m.alias)); + }); + + beforeEach(async () => { + await useMockSet('documents'); + hostElement = new UmbTestDocumentWorkspaceHostElement(); + document.body.appendChild(hostElement); + await hostElement.init(); + context = new UmbDocumentWorkspaceContext(hostElement); + publishingDataSource = new UmbDocumentPublishingServerDataSource(hostElement); + }); + + afterEach(() => { + document.body.innerHTML = ''; + }); + + // #68071 follow-up (reported by Andy Butland): after create-and-publish the workspace flips + // isNew=false, which triggers the new->edit redirect ~500ms later. The reload()+transfer that + // reconcile the data state run only after that, so during the redirect window the workspace must + // already report itself as clean — otherwise the redirect navigation pops a spurious + // "Discard unsaved changes" dialog (most visible with an empty RTE, which keeps current != persisted). + it('is not dirty immediately after create-and-publish, before the reload reconciles state', async () => { + await context.create(PARENT_ENTITY, INVARIANT_DOCUMENT_TYPE_ID); + context.setName('New Test Document'); + await context.setPropertyValue('text', 'A value'); + + await createAndPublish(context, publishingDataSource, [UmbVariantId.CreateInvariant()]); + + expect(context.getIsNew(), 'workspace is no longer new').to.be.false; + expect( + context.getHasUnpersistedChanges(), + 'workspace reports no unpersisted changes right after create-and-publish', + ).to.be.false; + }); + + // Guards the #68071 promise on the create path: the reconcile keeps the edited-but-unpublished variant + // dirty. The persist method re-reads the server document; the workspace merges it so the published + // variant takes the (clean) server values while the unpublished Danish edit stays in the current data + // state and remains dirty. This asserts that end state (no data loss). + it('restores an edited-but-unpublished variant after the full create-and-publish flow (no data loss)', async () => { + await context.create(PARENT_ENTITY, VARIANT_DOCUMENT_TYPE_ID); + context.setName('English name', EN_US); + context.setName('Dansk navn', DA); + await context.setPropertyValue('variantText', 'English value', EN_US); + await context.setPropertyValue('variantText', 'Dansk vaerdi', DA); + + await createAndPublish(context, publishingDataSource, [EN_US]); + + const changed = context.getChangedVariants(); + expect( + changed.some((v) => v.culture === 'en-US'), + 'en-US is clean (it was published)', + ).to.be.false; + expect( + changed.some((v) => v.culture === 'da'), + 'da stays dirty (edited but not published)', + ).to.be.true; + expect(context.getPropertyValue('variantText', DA), 'the Danish edit is preserved').to.equal('Dansk vaerdi'); + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/context/document-workspace-save-and-publish.context.test.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/context/document-workspace-save-and-publish.context.test.ts new file mode 100644 index 000000000000..cfebaa1bab55 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/context/document-workspace-save-and-publish.context.test.ts @@ -0,0 +1,124 @@ +import { expect } from '@open-wc/testing'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { useMockSet } from '@umbraco-cms/internal/mock-manager'; +import { UmbDocumentWorkspaceContext } from './document-workspace.context.js'; +import { TEST_MANIFESTS, UmbTestDocumentWorkspaceHostElement } from './document-workspace-context.test-utils.js'; +import { UmbDocumentServerDataSource } from '../../repository/detail/document-detail.server.data-source.js'; +import { UmbDocumentPublishingServerDataSource } from '../../publishing/repository/document-publishing.server.data-source.js'; + +const VARIANT_DOCUMENT_ID = 'variant-documents-variant-document-id'; +const EN_US = UmbVariantId.Create({ culture: 'en-US', segment: null }); +const DA = UmbVariantId.Create({ culture: 'da', segment: null }); + +const DA_ORIGINAL = 'Dette er den danske varianttekst.'; + +/** + * Reproduces the save-and-publish orchestration that the publishing workspace context performs + * (#performSaveAndPublish): build the save data, then drive performCreateOrUpdate with a persist strategy + * that performs the combined update-and-publish call. Published variants take the server values, while + * only the selected variants will be updated in draft data, leaving the not selected draft variants unchanged. These scenarios use an existing (non-new) document, so the + * update path is used. + */ +async function saveAndPublish( + context: UmbDocumentWorkspaceContext, + publishingDataSource: UmbDocumentPublishingServerDataSource, + variantIds: Array, +) { + const saveData = await context.constructSaveData(variantIds); + await context.performCreateOrUpdate(variantIds, saveData, { + update: async (data, ids) => { + await publishingDataSource.updateAndPublish(data, ids); + return context.loadWithoutPersist(); + }, + }); +} + +describe('UmbDocumentWorkspaceContext (save & publish data state)', () => { + let hostElement: UmbTestDocumentWorkspaceHostElement; + let context: UmbDocumentWorkspaceContext; + let publishingDataSource: UmbDocumentPublishingServerDataSource; + + before(() => { + umbExtensionsRegistry.registerMany(TEST_MANIFESTS); + }); + + after(() => { + umbExtensionsRegistry.unregisterMany(TEST_MANIFESTS.map((m) => m.alias)); + }); + + beforeEach(async () => { + await useMockSet('documents'); + hostElement = new UmbTestDocumentWorkspaceHostElement(); + document.body.appendChild(hostElement); + await hostElement.init(); + context = new UmbDocumentWorkspaceContext(hostElement); + publishingDataSource = new UmbDocumentPublishingServerDataSource(hostElement); + await context.load(VARIANT_DOCUMENT_ID); + }); + + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('keeps an unpublished but edited variant dirty after publishing another variant (#68071)', async () => { + await context.setPropertyValue('variantText', 'Edited English', EN_US); + await context.setPropertyValue('variantText', 'Redigeret dansk', DA); + + await saveAndPublish(context, publishingDataSource, [EN_US]); + + // Danish was edited but not published, so it must remain dirty in the current data state. + expect(context.getPropertyValue('variantText', DA)).to.equal('Redigeret dansk'); + const changed = context.getChangedVariants(); + expect( + changed.some((v) => v.culture === 'da'), + 'da is still reported as a changed variant', + ).to.be.true; + + // English was published, so it should now be clean (current matches persisted). + expect(context.getPropertyValue('variantText', EN_US)).to.equal('Edited English'); + expect( + changed.some((v) => v.culture === 'en-US'), + 'en-US is no longer a changed variant', + ).to.be.false; + }); + + it('persists only the published variant on the server', async () => { + await context.setPropertyValue('variantText', 'Edited English', EN_US); + await context.setPropertyValue('variantText', 'Redigeret dansk', DA); + + await saveAndPublish(context, publishingDataSource, [EN_US]); + + const freshContext = new UmbDocumentWorkspaceContext(hostElement); + await freshContext.load(VARIANT_DOCUMENT_ID); + expect(freshContext.getPropertyValue('variantText', EN_US), 'en-US saved on server').to.equal('Edited English'); + expect(freshContext.getPropertyValue('variantText', DA), 'da not saved on server').to.equal(DA_ORIGINAL); + }); + + it('uses the combined update-and-publish call, not the save-only update endpoint', async () => { + let updateAndPublishCalls = 0; + let updateCalls = 0; + const originalUpdateAndPublish = UmbDocumentPublishingServerDataSource.prototype.updateAndPublish; + const originalUpdate = UmbDocumentServerDataSource.prototype.update; + UmbDocumentPublishingServerDataSource.prototype.updateAndPublish = function (...args) { + updateAndPublishCalls++; + return originalUpdateAndPublish.apply(this, args as never); + }; + UmbDocumentServerDataSource.prototype.update = function (...args) { + updateCalls++; + return originalUpdate.apply(this, args as never); + }; + + try { + await context.setPropertyValue('variantText', 'Edited English', EN_US); + const saveData = await context.constructSaveData([EN_US]); + await publishingDataSource.updateAndPublish(saveData, [EN_US]); + } finally { + UmbDocumentPublishingServerDataSource.prototype.updateAndPublish = originalUpdateAndPublish; + UmbDocumentServerDataSource.prototype.update = originalUpdate; + } + + expect(updateAndPublishCalls, 'update-and-publish called once').to.equal(1); + expect(updateCalls, 'the plain update (save-only) endpoint is not called').to.equal(0); + }); +});