Display variant selection on unpublish only if the document is variant (#17893)

* Display variant selection on unpublish only if the document is variant.

* Allow for publish and unpublish of variant and invariant content.

* Added integration tests for amends to ContentPublishingService.

* Fixed assert.

* Fixed assert and used consistent language codes.

* Further integration tests.
This commit is contained in:
Andy Butland
2025-01-08 15:07:56 +01:00
committed by GitHub
parent f9c52b7ebc
commit bfff224c3e
8 changed files with 145 additions and 34 deletions

View File

@@ -4,7 +4,7 @@ import type { TemplateResult } from '@umbraco-cms/backoffice/external/lit';
export interface UmbConfirmModalData {
headline: string;
content: TemplateResult | string;
color?: 'positive' | 'danger';
color?: 'positive' | 'danger' | 'warning';
cancelLabel?: string;
confirmLabel?: string;
}

View File

@@ -67,7 +67,7 @@ export class UmbDocumentPublishEntityBulkAction extends UmbEntityBulkActionBase<
data: {
headline: localizationController.term('content_readyToPublish'),
content: localizationController.term('prompt_confirmListViewPublish'),
color: 'danger',
color: 'positive',
confirmLabel: localizationController.term('actions_publish'),
},
})
@@ -77,7 +77,11 @@ export class UmbDocumentPublishEntityBulkAction extends UmbEntityBulkActionBase<
if (confirm !== false) {
const variantId = new UmbVariantId(options[0].language.unique, null);
const publishingRepository = new UmbDocumentPublishingRepository(this._host);
await publishingRepository.unpublish(this.selection[0], [variantId]);
for (let i = 0; i < this.selection.length; i++) {
const id = this.selection[i];
await publishingRepository.publish(id, [ { variantId }]);
}
eventContext.dispatchEvent(event);
}
return;

View File

@@ -29,10 +29,13 @@ export class UmbDocumentPublishModalElement extends UmbModalBaseElement<
this.#selectionManager.setMultiple(true);
this.#selectionManager.setSelectable(true);
// Only display variants that are relevant to pick from, i.e. variants that are draft, not-published-mandatory or published with pending changes:
// Only display variants that are relevant to pick from, i.e. variants that are draft, not-published-mandatory or published with pending changes.
// If we don't know the state (e.g. from a bulk publishing selection) we need to consider it available for selection.
this._options =
this.data?.options.filter(
(option) => isNotPublishedMandatory(option) || option.variant?.state !== UmbDocumentVariantState.NOT_CREATED,
(option) => (option.variant && option.variant.state === null) ||
isNotPublishedMandatory(option) ||
option.variant?.state !== UmbDocumentVariantState.NOT_CREATED,
) ?? [];
let selected = this.value?.selection ?? [];

View File

@@ -66,7 +66,7 @@ export class UmbDocumentUnpublishEntityBulkAction extends UmbEntityBulkActionBas
data: {
headline: localizationController.term('actions_unpublish'),
content: localizationController.term('prompt_confirmListViewUnpublish'),
color: 'danger',
color: 'warning',
confirmLabel: localizationController.term('actions_unpublish'),
},
})
@@ -76,7 +76,11 @@ export class UmbDocumentUnpublishEntityBulkAction extends UmbEntityBulkActionBas
if (confirm !== false) {
const variantId = new UmbVariantId(options[0].language.unique, null);
const publishingRepository = new UmbDocumentPublishingRepository(this._host);
await publishingRepository.unpublish(this.selection[0], [variantId]);
for (let i = 0; i < this.selection.length; i++) {
const id = this.selection[i];
await publishingRepository.unpublish(id, [variantId]);
}
eventContext.dispatchEvent(event);
}
return;

View File

@@ -47,17 +47,29 @@ export class UmbDocumentUnpublishModalElement extends UmbModalBaseElement<
@state()
_hasInvalidSelection = true;
@state()
_isInvariant = false;
override firstUpdated() {
this.#configureSelectionManager();
this.#getReferences();
// If invariant, don't display the variant selection component.
if (this.data?.options.length === 1 && this.data.options[0].unique === "invariant") {
this._isInvariant = true;
this._hasInvalidSelection = false;
return;
}
this.#configureSelectionManager();
}
async #configureSelectionManager() {
this._selectionManager.setMultiple(true);
this._selectionManager.setSelectable(true);
// Only display variants that are relevant to pick from, i.e. variants that are draft or published with pending changes:
this._options = this.data?.options.filter((option) => isPublished(option)) ?? [];
// Only display variants that are relevant to pick from, i.e. variants that are published or published with pending changes.
// If we don't know the state (e.g. from a bulk publishing selection) we need to consider it available for selection.
this._options = this.data?.options.filter((option) => (option.variant && option.variant.state === null) || isPublished(option)) ?? [];
let selected = this.value?.selection ?? [];
@@ -104,7 +116,10 @@ export class UmbDocumentUnpublishModalElement extends UmbModalBaseElement<
#submit() {
if (this._hasUnpublishPermission) {
this.value = { selection: this._selection };
const selection = this._isInvariant
? ["invariant"]
: this._selection;
this.value = { selection };
this.modalContext?.submit();
return;
}
@@ -121,17 +136,21 @@ export class UmbDocumentUnpublishModalElement extends UmbModalBaseElement<
override render() {
return html`<umb-body-layout headline=${this.localize.term('content_unpublish')}>
<p id="subtitle">
<umb-localize key="content_languagesToUnpublish">
Select the languages to unpublish. Unpublishing a mandatory language will unpublish all languages.
</umb-localize>
</p>
<umb-document-variant-language-picker
.selectionManager=${this._selectionManager}
.variantLanguageOptions=${this._options}
.requiredFilter=${this._hasInvalidSelection ? this._requiredFilter : undefined}
.pickableFilter=${this.data?.pickableFilter}></umb-document-variant-language-picker>
${!this._isInvariant
? html`
<p id="subtitle">
<umb-localize key="content_languagesToUnpublish">
Select the languages to unpublish. Unpublishing a mandatory language will unpublish all languages.
</umb-localize>
</p>
<umb-document-variant-language-picker
.selectionManager=${this._selectionManager}
.variantLanguageOptions=${this._options}
.requiredFilter=${this._hasInvalidSelection ? this._requiredFilter : undefined}
.pickableFilter=${this.data?.pickableFilter}></umb-document-variant-language-picker>
`
: nothing}
<p>
<umb-localize key="prompt_confirmUnpublish">
@@ -159,7 +178,7 @@ export class UmbDocumentUnpublishModalElement extends UmbModalBaseElement<
<uui-button label=${this.localize.term('general_close')} @click=${this.#close}></uui-button>
<uui-button
label="${this.localize.term('actions_unpublish')}"
?disabled=${this._hasInvalidSelection || !this._hasUnpublishPermission || this._selection.length === 0}
?disabled=${this._hasInvalidSelection || !this._hasUnpublishPermission || (!this._isInvariant && this._selection.length === 0)}
look="primary"
color="warning"
@click=${this.#submit}></uui-button>