+ {{#if this.mayHaveRolls}}
+
+ {{#if this.hasRolls}}
+ {{icon "rollmaster-dices" class="svg-roll"}}
+ {{#if this.errors.length}}
+ {{icon "triangle-exclamation" class="roll__invalid"}}
+ {{/if}}
+ {{/if}}
+
+ {{#if this.loading}}
+ {{icon "spinner" class="rollmaster-spinner"}}
+ {{/if}}
+
+ {{/if}}
+
+}
diff --git a/assets/javascripts/discourse/initializers/preview.js b/assets/javascripts/discourse/initializers/preview.js
index 9364331..e4e4eaf 100644
--- a/assets/javascripts/discourse/initializers/preview.js
+++ b/assets/javascripts/discourse/initializers/preview.js
@@ -1,41 +1,5 @@
-import { debounce } from "@ember/runloop";
-import loadscript from "discourse/lib/load-script";
import { withPluginApi } from "discourse/lib/plugin-api";
-/* global rpgDiceRoller */
-
-const PARENT_PREVIEW_WRAPPER_CLASS = "d-editor-preview";
-const ROLL_SELECTOR = ".bb-rollmaster[data-notation]";
-const NOTE_ATTR = "data-notation";
-
-function validateRoll(post) {
- /** @type NodeList */
- const rollEls = post.querySelectorAll(ROLL_SELECTOR);
- /** @type string[] */
- rollEls.forEach((el) => {
- /** @type string */
- const notation = el.getAttribute(NOTE_ATTR);
- const rolls = notation
- .split("\n")
- .map((r) => r.trim())
- .filter(Boolean);
- rolls.forEach((roll) => {
- try {
- rpgDiceRoller.Parser.parse(roll);
- } catch (err) {
- console.error(err, el);
- // TODO: add UI display on error
- }
- });
- });
-}
-
-/**
- * Check if the post is a preview.
- * @param {HTMLElement} post
- */
-function checkIsPreview(post) {
- return post.classList.contains(PARENT_PREVIEW_WRAPPER_CLASS);
-}
+import ComposerValidRoll from "../components/composer-valid-roll";
function initializeRollmasterPreview(api) {
const siteSettings = api.container.lookup("service:site-settings");
@@ -43,28 +7,7 @@ function initializeRollmasterPreview(api) {
return;
}
- api.decorateCookedElement(
- (post) => {
- Promise.all([
- loadscript("/plugins/rollmaster/vendors/math.js"),
- loadscript("/plugins/rollmaster/vendors/random-js.min.js"),
- ])
- .then(() => {
- return loadscript(
- "/plugins/rollmaster/vendors/rpg-dice-roller.min.js"
- );
- })
- .then(() => {
- if (checkIsPreview(post) && post.querySelector(ROLL_SELECTOR)) {
- debounce(this, validateRoll, post, 1000);
- }
- });
- },
- {
- id: "decorate composer preview",
- afterAdopt: true,
- }
- );
+ api.renderInOutlet("after-d-editor", ComposerValidRoll);
}
export default {
diff --git a/assets/stylesheets/.gitkeep b/assets/stylesheets/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/assets/stylesheets/common/index.scss b/assets/stylesheets/common/index.scss
new file mode 100644
index 0000000..999aa47
--- /dev/null
+++ b/assets/stylesheets/common/index.scss
@@ -0,0 +1,32 @@
+.rollmaster-valid-composer {
+ display: block;
+ position: absolute;
+ right: 0.125em;
+ bottom: 0em;
+ padding: 0.125em;
+
+ svg.svg-roll {
+ --success-mild: color-mix(
+ in srgb,
+ var(--success-medium),
+ rgb(140, 140, 140)
+ );
+ color: var(--success-mild, --success-medium);
+ &:has(~ .rollmaster-spinner) {
+ color: var(--primary-low-mid);
+ }
+
+ &:has(+ .roll__invalid) {
+ color: var(--danger);
+ }
+ }
+
+ svg.roll__invalid {
+ color: var(--danger);
+ }
+}
+
+.rollmaster-spinner {
+ animation: rotate-forever 1s infinite linear;
+ color: var(--primary-low-mid);
+}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index f7030e9..d976371 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -8,3 +8,7 @@ en:
rollmaster:
bbcode:
placeholder: "Rolling: "
+ validator:
+ loading: "validating roll notation..."
+ success: "all roll notations valid"
+ error: "invalid roll notation found"
diff --git a/plugin.rb b/plugin.rb
index 9a5e274..bad6c33 100644
--- a/plugin.rb
+++ b/plugin.rb
@@ -10,6 +10,8 @@
enabled_site_setting :rollmaster_enabled
+register_asset "stylesheets/common/index.scss"
+
module ::Rollmaster
PLUGIN_NAME = "rollmaster"
end
@@ -18,6 +20,9 @@ module ::Rollmaster
after_initialize do
# Code which should run after Rails has finished booting
+
+ register_svg_icon "rollmaster-dices"
+
# I don't think this is needed, but it doesn't hurt to be safe
::Rollmaster::DiceEngine.reset_context
diff --git a/svg-icons/sprites.svg b/svg-icons/sprites.svg
new file mode 100644
index 0000000..152b2de
--- /dev/null
+++ b/svg-icons/sprites.svg
@@ -0,0 +1,8 @@
+
+
+