Disable "Update collection thumbnail" checkbox on initial page selection dialog until thumbnail is loaded (#2392)

Closes #2391
This commit is contained in:
Emma Segal-Grossman 2025-02-14 01:03:13 -05:00 committed by GitHub
parent 0f2da4f785
commit 659e124168
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 24 additions and 13 deletions

View File

@ -8,6 +8,7 @@ import queryString from "query-string";
import { import {
HomeView, HomeView,
type BtrixValidateDetail,
type CollectionSnapshotPreview, type CollectionSnapshotPreview,
} from "./collection-snapshot-preview"; } from "./collection-snapshot-preview";
import type { SelectSnapshotDetail } from "./select-collection-page"; import type { SelectSnapshotDetail } from "./select-collection-page";
@ -20,8 +21,8 @@ import type { Collection } from "@/types/collection";
* @fires btrix-change * @fires btrix-change
*/ */
@localized() @localized()
@customElement("btrix-collection-replay-dialog") @customElement("btrix-collection-initial-view-dialog")
export class CollectionStartPageDialog extends BtrixElement { export class CollectionInitialViewDialog extends BtrixElement {
static readonly Options: Record< static readonly Options: Record<
HomeView, HomeView,
{ label: string; icon: NonNullable<SlIcon["name"]>; detail: string } { label: string; icon: NonNullable<SlIcon["name"]>; detail: string }
@ -71,6 +72,9 @@ export class CollectionStartPageDialog extends BtrixElement {
@query("#thumbnailPreview") @query("#thumbnailPreview")
private readonly thumbnailPreview?: CollectionSnapshotPreview | null; private readonly thumbnailPreview?: CollectionSnapshotPreview | null;
@state()
validThumbnail = false;
willUpdate(changedProperties: PropertyValues<this>) { willUpdate(changedProperties: PropertyValues<this>) {
if (changedProperties.has("collection") && this.collection) { if (changedProperties.has("collection") && this.collection) {
this.homeView = this.collection.homeUrl ? HomeView.URL : HomeView.Pages; this.homeView = this.collection.homeUrl ? HomeView.URL : HomeView.Pages;
@ -174,6 +178,12 @@ export class CollectionStartPageDialog extends BtrixElement {
view=${this.homeView} view=${this.homeView}
replaySrc=${`/replay/?${query}#view=pages`} replaySrc=${`/replay/?${query}#view=pages`}
.snapshot=${snapshot} .snapshot=${snapshot}
@btrix-validate=${({
detail: { valid },
}: CustomEvent<BtrixValidateDetail>) => {
console.log({ valid });
this.validThumbnail = valid;
}}
> >
</btrix-collection-snapshot-preview> </btrix-collection-snapshot-preview>
@ -192,7 +202,7 @@ export class CollectionStartPageDialog extends BtrixElement {
} }
private renderForm() { private renderForm() {
const { icon, detail } = CollectionStartPageDialog.Options[this.homeView]; const { icon, detail } = CollectionInitialViewDialog.Options[this.homeView];
return html` return html`
<form @submit=${this.onSubmit}> <form @submit=${this.onSubmit}>
@ -226,7 +236,7 @@ export class CollectionStartPageDialog extends BtrixElement {
${Object.values(HomeView).map((homeView) => { ${Object.values(HomeView).map((homeView) => {
const { label, icon, detail } = const { label, icon, detail } =
CollectionStartPageDialog.Options[homeView]; CollectionInitialViewDialog.Options[homeView];
return html` return html`
<sl-option value=${homeView}> <sl-option value=${homeView}>
<sl-icon slot="prefix" name=${icon}></sl-icon> <sl-icon slot="prefix" name=${icon}></sl-icon>
@ -255,7 +265,8 @@ export class CollectionStartPageDialog extends BtrixElement {
<sl-checkbox <sl-checkbox
name="useThumbnail" name="useThumbnail"
class="mt-3 part-[form-control-help-text]:text-balance" class="mt-3 part-[form-control-help-text]:text-balance"
checked ?checked=${this.validThumbnail}
?disabled=${!this.validThumbnail || !this.selectedSnapshot}
help-text=${msg( help-text=${msg(
"If this collection is public, the preview will be used as the thumbnail for this collection.", "If this collection is public, the preview will be used as the thumbnail for this collection.",
)} )}

View File

@ -16,7 +16,7 @@ export enum HomeView {
URL = "url", URL = "url",
} }
export type BtrixValidateDetails = { export type BtrixValidateDetail = {
valid: boolean; valid: boolean;
}; };
@ -93,7 +93,7 @@ export class CollectionSnapshotPreview extends TailwindElement {
if (resp.status === 200) { if (resp.status === 200) {
this.dispatchEvent( this.dispatchEvent(
new CustomEvent<BtrixValidateDetails>("btrix-validate", { new CustomEvent<BtrixValidateDetail>("btrix-validate", {
detail: { valid: true }, detail: { valid: true },
}), }),
); );
@ -105,7 +105,7 @@ export class CollectionSnapshotPreview extends TailwindElement {
console.error(e); console.error(e);
if (signal.aborted) return; if (signal.aborted) return;
this.dispatchEvent( this.dispatchEvent(
new CustomEvent<BtrixValidateDetails>("btrix-validate", { new CustomEvent<BtrixValidateDetail>("btrix-validate", {
detail: { valid: false }, detail: { valid: false },
}), }),
); );

View File

@ -12,7 +12,7 @@ import {
validateNameMax, validateNameMax,
type CollectionEdit, type CollectionEdit,
} from "../collection-edit-dialog"; } from "../collection-edit-dialog";
import { type BtrixValidateDetails } from "../collection-snapshot-preview"; import { type BtrixValidateDetail } from "../collection-snapshot-preview";
import { import {
CollectionThumbnail, CollectionThumbnail,
DEFAULT_THUMBNAIL_VARIANT, DEFAULT_THUMBNAIL_VARIANT,
@ -305,7 +305,7 @@ function renderPageThumbnail(
isEqual(this.selectedSnapshot, this.collection?.thumbnailSource)} isEqual(this.selectedSnapshot, this.collection?.thumbnailSource)}
@btrix-validate=${({ @btrix-validate=${({
detail: { valid }, detail: { valid },
}: CustomEvent<BtrixValidateDetails>) => { }: CustomEvent<BtrixValidateDetail>) => {
if (this.defaultThumbnailName == null && !valid) { if (this.defaultThumbnailName == null && !valid) {
this.errorTab = "general"; this.errorTab = "general";
} else { } else {

View File

@ -3,7 +3,7 @@ import("./collections-grid");
import("./collection-items-dialog"); import("./collection-items-dialog");
import("./collection-edit-dialog"); import("./collection-edit-dialog");
import("./collection-create-dialog"); import("./collection-create-dialog");
import("./collection-replay-dialog"); import("./collection-initial-view-dialog");
import("./collection-workflow-list"); import("./collection-workflow-list");
import("./select-collection-access"); import("./select-collection-access");
import("./select-collection-page"); import("./select-collection-page");

View File

@ -328,7 +328,7 @@ export class CollectionDetail extends BtrixElement {
> >
</btrix-collection-items-dialog> </btrix-collection-items-dialog>
<btrix-collection-replay-dialog <btrix-collection-initial-view-dialog
?open=${this.openDialogName === "replaySettings"} ?open=${this.openDialogName === "replaySettings"}
@btrix-change=${() => { @btrix-change=${() => {
// Don't do full refresh of rwp so that rwp-url-change fires // Don't do full refresh of rwp so that rwp-url-change fires
@ -341,7 +341,7 @@ export class CollectionDetail extends BtrixElement {
.collection=${this.collection} .collection=${this.collection}
?replayLoaded=${this.isRwpLoaded} ?replayLoaded=${this.isRwpLoaded}
> >
</btrix-collection-replay-dialog> </btrix-collection-initial-view-dialog>
<btrix-collection-edit-dialog <btrix-collection-edit-dialog
.collection=${this.collection} .collection=${this.collection}