From f0c29b5d753939df8f3fb00c4835b1f3c14e3887 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Mon, 1 Jun 2026 03:10:07 -0400 Subject: [PATCH] Avoid default type on name and item create dialogs --- daggerheart.mjs | 30 ++++++++++++++++++++++++++++++ module/documents/actor.mjs | 5 +++++ module/documents/item.mjs | 1 + 3 files changed, 36 insertions(+) diff --git a/daggerheart.mjs b/daggerheart.mjs index 23977628..25c41ced 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -446,3 +446,33 @@ Hooks.on('canvasTearDown', canvas => { Hooks.on('canvasReady', canas => { game.system.registeredTriggers.registerSceneTriggers(canvas.scene); }); + +/** Make the user to select a document type, instead of having a default doc type for them to accidentally keep */ +Hooks.on('renderDialogV2', (_dialog, html) => { + if (!html.classList.contains('dialog')) return; + const cls = html.classList.contains('item-create') + ? documents.DHItem.implementation + : html.classList.contains('actor-create') + ? documents.DhpActor.implementation + : null; + if (!cls) return; + + const form = html.querySelector('form'); + const submit = html.querySelector('button[type=submit]'); + const select = html.querySelector('select[name=type]'); + const nameInput = html.querySelector('input[name=name]'); + if (!form || !select || !submit || !nameInput) return; + + nameInput.placeholder = cls.defaultName({}); + const emptyOption = document.createElement('option'); + emptyOption.value = ''; + emptyOption.selected = true; + select.required = true; + select.prepend(emptyOption); + submit.addEventListener('click', event => { + if (!form.reportValidity()) { + event.preventDefault(); + event.stopPropagation(); + } + }); +}); diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 6c462d98..fb10435f 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -65,6 +65,11 @@ export default class DhpActor extends Actor { }; } + static createDialog(data, createOptions, options, renderOptions) { + options.classes = [options.classes ?? [], 'actor-create'].flat(); // handled in hook + return super.createDialog(data, createOptions, options, renderOptions); + } + /* -------------------------------------------- */ /** @inheritDoc */ diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 603ca594..f46e24e6 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -82,6 +82,7 @@ export default class DHItem extends foundry.documents.Item { /** @inheritdoc */ static async createDialog(data = {}, createOptions = {}, options = {}) { const { folders, types, template, context = {}, ...dialogOptions } = options; + dialogOptions.classes = [options.classes ?? [], 'item-create'].flat(); // handled in hook if (types?.length === 0) { throw new Error('The array of sub-types to restrict to must not be empty.');