diff --git a/com.woltlab.wcf/templates/articleAdd.tpl b/com.woltlab.wcf/templates/articleAdd.tpl
index aa5b44b8d83..c837487e84f 100644
--- a/com.woltlab.wcf/templates/articleAdd.tpl
+++ b/com.woltlab.wcf/templates/articleAdd.tpl
@@ -1,13 +1,7 @@
{capture assign='__contentHeader'}
{/capture}
-{capture assign='contentInteractionButtons'}
- {if $action == 'edit'}
- {if $article->canDelete()}
-
-
-
- {/if}
- {if $languages|count > 1 || $article->isMultilingual}
-
- {/if}
- {/if}
-{/capture}
-
-{if $articleIsFrontend|empty}
- {include file='header' pageTitle='wcf.acp.article.'|concat:$action}
-{else}
- {include file='header' contentHeader=$__contentHeader}
-{/if}
+{include file='header' contentHeader=$__contentHeader}
{if $__wcf->session->getPermission('admin.content.article.canManageArticle')}
@@ -131,10 +65,6 @@
{/if}
-{if $articleIsFrontend|empty}
- {unsafe:$__contentHeader}
-{/if}
-
{include file='shared_formNotice'}
{if $action == 'edit'}
diff --git a/ts/WoltLabSuite/Core/Acp/Ui/Article/InlineEditor.ts b/ts/WoltLabSuite/Core/Acp/Ui/Article/InlineEditor.ts
index fd72804fe32..36c65a280d9 100644
--- a/ts/WoltLabSuite/Core/Acp/Ui/Article/InlineEditor.ts
+++ b/ts/WoltLabSuite/Core/Acp/Ui/Article/InlineEditor.ts
@@ -4,6 +4,7 @@
* @author Alexander Ebert
* @copyright 2001-2019 WoltLab GmbH
* @license GNU Lesser General Public License
+ * @deprecated 6.2 No longer in use.
*/
import { showDefaultSuccessSnackbar } from "WoltLabSuite/Core/Component/Snackbar";
diff --git a/ts/WoltLabSuite/Core/Component/Interaction/FormBuilderDialog.ts b/ts/WoltLabSuite/Core/Component/Interaction/FormBuilderDialog.ts
index 3da4b225c5a..c48f6e2b811 100644
--- a/ts/WoltLabSuite/Core/Component/Interaction/FormBuilderDialog.ts
+++ b/ts/WoltLabSuite/Core/Component/Interaction/FormBuilderDialog.ts
@@ -9,27 +9,65 @@
import { dialogFactory } from "WoltLabSuite/Core/Component/Dialog";
import { showDefaultSuccessSnackbar } from "WoltLabSuite/Core/Component/Snackbar";
+import { InteractionEffect } from "./InteractionEffect";
-async function handleFormBuilderDialogAction(element: HTMLElement, endpoint: string): Promise {
+type Payload = Record;
+
+async function handleFormBuilderDialogAction(
+ container: HTMLElement,
+ element: HTMLElement,
+ endpoint: string,
+ interactionEffect: InteractionEffect = InteractionEffect.ReloadItem,
+ detail: Payload,
+): Promise {
const { ok } = await dialogFactory().usingFormBuilder().fromEndpoint(endpoint);
if (!ok) {
return;
}
- element.dispatchEvent(
- new CustomEvent("interaction:invalidate", {
- bubbles: true,
- }),
- );
+ if (interactionEffect === InteractionEffect.ReloadItem || interactionEffect === InteractionEffect.ReloadPage) {
+ element.dispatchEvent(
+ new CustomEvent("interaction:invalidate", {
+ bubbles: true,
+ detail: {
+ ...detail,
+ _reloadPage: String(interactionEffect === InteractionEffect.ReloadPage),
+ },
+ }),
+ );
+ } else if (interactionEffect === InteractionEffect.ReloadList) {
+ container.dispatchEvent(
+ new CustomEvent("interaction:invalidate-all", {
+ detail: {
+ ...detail,
+ },
+ }),
+ );
+ } else {
+ element.dispatchEvent(
+ new CustomEvent("interaction:remove", {
+ bubbles: true,
+ detail: {
+ ...detail,
+ },
+ }),
+ );
+ }
showDefaultSuccessSnackbar();
}
export function setup(identifier: string, container: HTMLElement): void {
- container.addEventListener("interaction:execute", (event: CustomEvent) => {
+ container.addEventListener("interaction:execute", (event: CustomEvent) => {
if (event.detail.interaction === identifier) {
- void handleFormBuilderDialogAction(event.target as HTMLElement, event.detail.endpoint);
+ void handleFormBuilderDialogAction(
+ container,
+ event.target as HTMLElement,
+ event.detail.endpoint,
+ event.detail.interactionEffect as InteractionEffect,
+ event.detail,
+ );
}
});
}
diff --git a/ts/WoltLabSuite/Core/Component/Interaction/InteractionEffect.ts b/ts/WoltLabSuite/Core/Component/Interaction/InteractionEffect.ts
index c348a0afca6..cd4d65d9835 100644
--- a/ts/WoltLabSuite/Core/Component/Interaction/InteractionEffect.ts
+++ b/ts/WoltLabSuite/Core/Component/Interaction/InteractionEffect.ts
@@ -10,5 +10,6 @@
export enum InteractionEffect {
ReloadItem = "ReloadItem",
ReloadList = "ReloadList",
+ ReloadPage = "ReloadPage",
RemoveItem = "RemoveItem",
}
diff --git a/ts/WoltLabSuite/Core/Component/Interaction/LegacyDboAction.ts b/ts/WoltLabSuite/Core/Component/Interaction/LegacyDboAction.ts
index a292f96388d..0ce1c49ed42 100644
--- a/ts/WoltLabSuite/Core/Component/Interaction/LegacyDboAction.ts
+++ b/ts/WoltLabSuite/Core/Component/Interaction/LegacyDboAction.ts
@@ -14,6 +14,8 @@ import { showDefaultSuccessSnackbar, showSuccessSnackbar } from "WoltLabSuite/Co
import { getPhrase } from "WoltLabSuite/Core/Language";
import { InteractionEffect } from "./InteractionEffect";
+type Payload = Record;
+
async function handleDboAction(
container: HTMLElement,
element: HTMLElement,
@@ -23,6 +25,7 @@ async function handleDboAction(
confirmationType: ConfirmationType,
customConfirmationMessage: string = "",
interactionEffect: InteractionEffect = InteractionEffect.ReloadItem,
+ detail: Payload,
): Promise {
const confirmationResult = await handleConfirmation(objectName, confirmationType, customConfirmationMessage);
if (!confirmationResult.result) {
@@ -34,18 +37,27 @@ async function handleDboAction(
.payload(confirmationResult.reason ? { reason: confirmationResult.reason } : {})
.dispatch();
- if (interactionEffect === InteractionEffect.ReloadItem) {
+ if (interactionEffect === InteractionEffect.ReloadItem || interactionEffect === InteractionEffect.ReloadPage) {
element.dispatchEvent(
- new CustomEvent("interaction:invalidate", {
+ new CustomEvent("interaction:invalidate", {
bubbles: true,
+ detail: {
+ ...detail,
+ _reloadPage: String(interactionEffect === InteractionEffect.ReloadPage),
+ },
}),
);
} else if (interactionEffect === InteractionEffect.ReloadList) {
- container.dispatchEvent(new CustomEvent("interaction:invalidate-all"));
+ container.dispatchEvent(
+ new CustomEvent("interaction:invalidate-all", {
+ detail,
+ }),
+ );
} else {
element.dispatchEvent(
- new CustomEvent("interaction:remove", {
+ new CustomEvent("interaction:remove", {
bubbles: true,
+ detail,
}),
);
}
@@ -58,7 +70,7 @@ async function handleDboAction(
}
export function setup(identifier: string, container: HTMLElement): void {
- container.addEventListener("interaction:execute", (event: CustomEvent) => {
+ container.addEventListener("interaction:execute", (event: CustomEvent) => {
if (event.detail.interaction === identifier) {
void handleDboAction(
container,
@@ -66,9 +78,10 @@ export function setup(identifier: string, container: HTMLElement): void {
event.detail.objectName,
event.detail.className,
event.detail.actionName,
- event.detail.confirmationType,
+ event.detail.confirmationType as ConfirmationType,
event.detail.confirmationMessage,
- event.detail.interactionEffect,
+ event.detail.interactionEffect as InteractionEffect,
+ event.detail,
);
}
});
diff --git a/ts/WoltLabSuite/Core/Component/Interaction/Rpc.ts b/ts/WoltLabSuite/Core/Component/Interaction/Rpc.ts
index 143bdf0a47f..6bf2b4d8ca2 100644
--- a/ts/WoltLabSuite/Core/Component/Interaction/Rpc.ts
+++ b/ts/WoltLabSuite/Core/Component/Interaction/Rpc.ts
@@ -14,6 +14,8 @@ import { showDefaultSuccessSnackbar, showSuccessSnackbar } from "WoltLabSuite/Co
import { getPhrase } from "WoltLabSuite/Core/Language";
import { InteractionEffect } from "./InteractionEffect";
+type Payload = Record;
+
async function handleRpcInteraction(
container: HTMLElement,
element: HTMLElement,
@@ -22,6 +24,7 @@ async function handleRpcInteraction(
confirmationType: ConfirmationType,
customConfirmationMessage: string = "",
interactionEffect: InteractionEffect = InteractionEffect.ReloadItem,
+ detail: Payload,
): Promise {
const confirmationResult = await handleConfirmation(objectName, confirmationType, customConfirmationMessage);
if (!confirmationResult.result) {
@@ -43,18 +46,23 @@ async function handleRpcInteraction(
}
}
- if (interactionEffect === InteractionEffect.ReloadItem) {
+ if (interactionEffect === InteractionEffect.ReloadItem || interactionEffect === InteractionEffect.ReloadPage) {
element.dispatchEvent(
- new CustomEvent("interaction:invalidate", {
+ new CustomEvent("interaction:invalidate", {
bubbles: true,
+ detail: {
+ ...detail,
+ _reloadPage: String(interactionEffect === InteractionEffect.ReloadPage),
+ },
}),
);
} else if (interactionEffect === InteractionEffect.ReloadList) {
- container.dispatchEvent(new CustomEvent("interaction:invalidate-all"));
+ container.dispatchEvent(new CustomEvent("interaction:invalidate-all", { detail }));
} else {
element.dispatchEvent(
- new CustomEvent("interaction:remove", {
+ new CustomEvent("interaction:remove", {
bubbles: true,
+ detail,
}),
);
}
@@ -67,16 +75,17 @@ async function handleRpcInteraction(
}
export function setup(identifier: string, container: HTMLElement): void {
- container.addEventListener("interaction:execute", (event: CustomEvent) => {
+ container.addEventListener("interaction:execute", (event: CustomEvent) => {
if (event.detail.interaction === identifier) {
void handleRpcInteraction(
container,
event.target as HTMLElement,
event.detail.objectName,
event.detail.endpoint,
- event.detail.confirmationType,
+ event.detail.confirmationType as ConfirmationType,
event.detail.confirmationMessage,
- event.detail.interactionEffect,
+ event.detail.interactionEffect as InteractionEffect,
+ event.detail,
);
}
});
diff --git a/ts/WoltLabSuite/Core/Component/Interaction/StandaloneButton.ts b/ts/WoltLabSuite/Core/Component/Interaction/StandaloneButton.ts
index cb31669f76c..3a7e773bc07 100644
--- a/ts/WoltLabSuite/Core/Component/Interaction/StandaloneButton.ts
+++ b/ts/WoltLabSuite/Core/Component/Interaction/StandaloneButton.ts
@@ -15,6 +15,8 @@ interface HeaderContent {
template: string;
}
+type Payload = Record;
+
export class StandaloneButton {
#container: HTMLElement;
#providerClassName: string;
@@ -100,9 +102,15 @@ export class StandaloneButton {
}
#initEventListeners(): void {
- this.#container.addEventListener("interaction:invalidate", () => {
- void this.#refreshContextMenu();
- void this.#refreshHeader();
+ this.#container.addEventListener("interaction:invalidate", (event: CustomEvent) => {
+ if (event.detail._reloadPage === "true") {
+ setTimeout(() => {
+ window.location.reload();
+ }, 2000);
+ } else {
+ void this.#refreshContextMenu();
+ void this.#refreshHeader();
+ }
});
this.#container.addEventListener("interaction:invalidate-all", () => {
@@ -111,7 +119,9 @@ export class StandaloneButton {
});
this.#container.addEventListener("interaction:remove", () => {
- window.location.href = this.#redirectUrl;
+ setTimeout(() => {
+ window.location.href = this.#redirectUrl;
+ }, 2000);
});
}
}
diff --git a/wcfsetup/install/files/acp/templates/adAdd.tpl b/wcfsetup/install/files/acp/templates/adAdd.tpl
index 1a574bded63..5e134fbfd65 100644
--- a/wcfsetup/install/files/acp/templates/adAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/adAdd.tpl
@@ -15,8 +15,11 @@
diff --git a/wcfsetup/install/files/acp/templates/articleAdd.tpl b/wcfsetup/install/files/acp/templates/articleAdd.tpl
index 398f9dc60bf..5ac705bb0db 100644
--- a/wcfsetup/install/files/acp/templates/articleAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/articleAdd.tpl
@@ -1,73 +1,22 @@
-{capture assign='__contentHeader'}
-
-{/capture}
+{include file='header' pageTitle='wcf.acp.article.'|concat:$action}
-{if $articleIsFrontend|empty}
- {include file='header' pageTitle='wcf.acp.article.'|concat:$action}
-{else}
- {include file='header' contentHeader=$__contentHeader}
-{/if}
+
{if $__wcf->session->getPermission('admin.content.article.canManageArticle')}
@@ -123,7 +53,7 @@
{/if}
-{if $articleIsFrontend|empty}
- {unsafe:$__contentHeader}
-{/if}
-
{include file='shared_formNotice'}
{if $action == 'edit'}
@@ -654,5 +580,4 @@
});
-
{include file='footer'}
diff --git a/wcfsetup/install/files/acp/templates/bbcodeMediaProviderAdd.tpl b/wcfsetup/install/files/acp/templates/bbcodeMediaProviderAdd.tpl
index ba45d0a21bf..6fea5075a0d 100644
--- a/wcfsetup/install/files/acp/templates/bbcodeMediaProviderAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/bbcodeMediaProviderAdd.tpl
@@ -4,11 +4,14 @@
-
+
diff --git a/wcfsetup/install/files/acp/templates/captchaQuestionAdd.tpl b/wcfsetup/install/files/acp/templates/captchaQuestionAdd.tpl
index 636ce79406a..974d4458d50 100644
--- a/wcfsetup/install/files/acp/templates/captchaQuestionAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/captchaQuestionAdd.tpl
@@ -7,8 +7,11 @@
diff --git a/wcfsetup/install/files/acp/templates/contactOptionAdd.tpl b/wcfsetup/install/files/acp/templates/contactOptionAdd.tpl
index 93bce9c949d..a91fd0f37a3 100644
--- a/wcfsetup/install/files/acp/templates/contactOptionAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/contactOptionAdd.tpl
@@ -9,8 +9,11 @@
diff --git a/wcfsetup/install/files/acp/templates/contactRecipientAdd.tpl b/wcfsetup/install/files/acp/templates/contactRecipientAdd.tpl
index 6d0b6944488..f67e8f44c7b 100644
--- a/wcfsetup/install/files/acp/templates/contactRecipientAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/contactRecipientAdd.tpl
@@ -7,8 +7,11 @@
diff --git a/wcfsetup/install/files/acp/templates/cronjobAdd.tpl b/wcfsetup/install/files/acp/templates/cronjobAdd.tpl
index 998e4e987d0..21078aa4d44 100644
--- a/wcfsetup/install/files/acp/templates/cronjobAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/cronjobAdd.tpl
@@ -7,8 +7,11 @@
diff --git a/wcfsetup/install/files/acp/templates/labelAdd.tpl b/wcfsetup/install/files/acp/templates/labelAdd.tpl
index 3a02376cacc..343dcab7e15 100644
--- a/wcfsetup/install/files/acp/templates/labelAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/labelAdd.tpl
@@ -7,8 +7,11 @@
diff --git a/wcfsetup/install/files/acp/templates/labelGroupAdd.tpl b/wcfsetup/install/files/acp/templates/labelGroupAdd.tpl
index b9cc95db40e..93b4356d59a 100644
--- a/wcfsetup/install/files/acp/templates/labelGroupAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/labelGroupAdd.tpl
@@ -24,9 +24,10 @@
diff --git a/wcfsetup/install/files/acp/templates/languageAdd.tpl b/wcfsetup/install/files/acp/templates/languageAdd.tpl
index 3fc6a658f3e..a8bb28e34a7 100644
--- a/wcfsetup/install/files/acp/templates/languageAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/languageAdd.tpl
@@ -7,8 +7,11 @@
diff --git a/wcfsetup/install/files/acp/templates/menuAdd.tpl b/wcfsetup/install/files/acp/templates/menuAdd.tpl
index c64392465bc..fd8fade00c5 100644
--- a/wcfsetup/install/files/acp/templates/menuAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/menuAdd.tpl
@@ -8,10 +8,10 @@
diff --git a/wcfsetup/install/files/acp/templates/noticeAdd.tpl b/wcfsetup/install/files/acp/templates/noticeAdd.tpl
index 43383e3cd8c..2df7895077e 100644
--- a/wcfsetup/install/files/acp/templates/noticeAdd.tpl
+++ b/wcfsetup/install/files/acp/templates/noticeAdd.tpl
@@ -7,8 +7,11 @@
diff --git a/wcfsetup/install/files/acp/templates/package.tpl b/wcfsetup/install/files/acp/templates/package.tpl
index 9336b6cfa80..40402e7a1c8 100644
--- a/wcfsetup/install/files/acp/templates/package.tpl
+++ b/wcfsetup/install/files/acp/templates/package.tpl
@@ -15,21 +15,14 @@
{$package->getName()}
- {hascontent}
-
- {/hascontent}
+