diff --git a/.styles/root.css b/.styles/root.css index 2d91537..55f661a 100644 --- a/.styles/root.css +++ b/.styles/root.css @@ -1,3 +1,7 @@ +.dialog-content:not(:only-child) { + margin-bottom: 8px; +} + .actor--player.style-v1 { --header-size: 75px; } @@ -35,4 +39,4 @@ height: auto; } -/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../styles/v1/player/root.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAAA;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC%22,%22file%22:%22root.css%22%7D */ +/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../styles/v1/Dialog.scss%22,%22../styles/v1/player/root.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAAA;EACC;;;ACDD;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC%22,%22file%22:%22root.css%22%7D */ diff --git a/.styles/v1/Dialog.css b/.styles/v1/Dialog.css new file mode 100644 index 0000000..9405aad --- /dev/null +++ b/.styles/v1/Dialog.css @@ -0,0 +1,5 @@ +.dialog-content:not(:only-child) { + margin-bottom: 8px; +} + +/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../../styles/v1/Dialog.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAAA;EACC%22,%22file%22:%22Dialog.css%22%7D */ diff --git a/.styles/v1/index.css b/.styles/v1/index.css index 2a85465..d0ed1e4 100644 --- a/.styles/v1/index.css +++ b/.styles/v1/index.css @@ -1,3 +1,7 @@ +.dialog-content:not(:only-child) { + margin-bottom: 8px; +} + .actor--player.style-v1 { --header-size: 75px; } @@ -35,4 +39,4 @@ height: auto; } -/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../../styles/v1/player/root.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAAA;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC%22,%22file%22:%22index.css%22%7D */ +/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../../styles/v1/Dialog.scss%22,%22../../styles/v1/player/root.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAAA;EACC;;;ACDD;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EACC%22,%22file%22:%22index.css%22%7D */ diff --git a/eslint.config.mjs b/eslint.config.mjs index e3f0a8c..f412e22 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -30,6 +30,7 @@ export default [ ChatMessage: `readonly`, ActiveEffect: `readonly`, Dialog: `readonly`, + renderTemplate: `readonly`, }, }, }, diff --git a/src/main.mjs b/src/main.mjs index 53eb4f2..fba71bb 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -9,6 +9,7 @@ import { PlayerData } from "./documents/Actor/Player/Model.mjs"; // Misc Imports import "./utils/logger.mjs"; +import "./utils/DialogManager.mjs"; import { registerCustomComponents } from "./components/_index.mjs"; import { registerHandlebarsHelpers } from "./helpers/_index.mjs"; import { registerSettings } from "./settings/_index.mjs"; diff --git a/src/utils/DialogManager.mjs b/src/utils/DialogManager.mjs index 430a670..56d1d9b 100644 --- a/src/utils/DialogManager.mjs +++ b/src/utils/DialogManager.mjs @@ -76,7 +76,63 @@ export class DialogManager { ); }; + /** + * Asks the user to provide a simple piece of information, this is primarily + * intended to be used within macros so that it can have better info gathering + * as needed. + */ + static async ask(data, opts = {}) { + if (!data.question) { + throw new Error(`Asking the user for input must contain a question`); + } + data.inputType ??= `text`; + data.initialValue ??= ``; + + opts.title ??= `System Question`; + opts.jQuery = true; + + const content = await renderTemplate( + `systems/${game.system.id}/templates/Dialogs/ask.hbs`, + data, + ); + + return new Promise((resolve, reject) => { + DialogManager.createOrFocus( + data.question, + { + content, + buttons: { + confirm: { + label: `Confirm`, + callback: (html) => { + const element = html.find(`.user-input`)[0]; + let value = element.value; + switch (data.inputType) { + case `number`: + value = parseFloat(value); + break; + case `checkbox`: + value = element.checked; + break; + } + Logger.debug(`Ask response: ${value} (type: ${typeof value})`); + resolve(value); + }, + }, + cancel: { + label: `Cancel`, + callback: () => reject(), + }, + }, + }, + opts, + ); + }); + }; + static get size() { return DialogManager.#dialogs.size; } }; + +globalThis.DialogManager = DialogManager; diff --git a/styles/v1/Dialog.scss b/styles/v1/Dialog.scss new file mode 100644 index 0000000..9522789 --- /dev/null +++ b/styles/v1/Dialog.scss @@ -0,0 +1,3 @@ +.dialog-content:not(:only-child) { + margin-bottom: 8px; +} diff --git a/styles/v1/index.scss b/styles/v1/index.scss index 96a8ce1..c4a7503 100644 --- a/styles/v1/index.scss +++ b/styles/v1/index.scss @@ -1,3 +1,5 @@ // Styling version 1 -@use "./player/root.scss"; \ No newline at end of file +@use "./Dialog.scss"; + +@use "./player/root.scss"; diff --git a/templates/Dialogs/ask.hbs b/templates/Dialogs/ask.hbs new file mode 100644 index 0000000..d08d8a2 --- /dev/null +++ b/templates/Dialogs/ask.hbs @@ -0,0 +1,12 @@ +
+ {{question}} +
+ +