To register on the grimdarkminiatures website/app you either need to use your exisitng Woo ID or create a new one (see below).

Sign Up

Why sign up?
  • Get access to Registered User's priviledges, which may include hidden pages, special features and special pricing, if they exist, on this website.
  • Get access to all sites powered by Woo without having to enter your details everytime.

Sign In

Email Address (Woo ID) Password Forgot Your Password?
User Name or Password is incorrect.
What is a Woo ID help

New tile

Remove tile?

var woo_appProperties = (function() { var woo_appProperties_Global = {}; var self = document.getElementById('woo_appProperties'); self.classList.add("woo-ui-gadget"); woo_appProperties_Global.unload = () => { //Unload callbacks here console.log("Unloaded woo_appProperties"); } return woo_appProperties_Global; })();var gkxwvsqf_202494204618_139 = (function() { var self = document.getElementById('gkxwvsqf_202494204618_139'); var gkxwvsqf_202494204618_139_Global = {}; gkxwvsqf_202494204618_139_Global.unload = () => { //Unload callbacks here console.log("Unloaded gkxwvsqf_202494204618_139"); } return gkxwvsqf_202494204618_139_Global; })();var gkxwvsqf_202601832446_812 = (function() { var self = document.getElementById('gkxwvsqf_202601832446_812'); var gkxwvsqf_202601832446_812_Global = {}; var loginDom = document.getElementById('login-button-grimdarkminis'); //var loginDomMob = document.getElementById('mob_icon_gkxwvsqf_202601832446_812'); var loggedIn = false; var loggingInOrOut = false; var openModal = false; var whatIs = document.querySelector(".woo_whatIsWooID_gkxwvsqf_202601832446_812"); var forgotPass = document.querySelector(".forgot_pass_gkxwvsqf_202601832446_812"); function getAppData(){ return new Promise((resolve) => { var url = woo.getRemoteCouch() + "/grimdarkminiatures$public/grimdarkminiatures-invoice-settings"; var data = {} resolve(woo.queryCouch(url, "GET", data)); }).catch((error) => { return null; }); } getAppData().then((data) => { if (data){ $("#gkxwvsqf_202601832446_812 .website_name").html(data.brandName); $("#gkxwvsqf_202601832446_812 #fullLogoImage").attr("src", "/resources/grimdarkminiatures/uploads/" + data.logoImage); } }) function forgotPass_gkxwvsqf_202601832446_812(){ woo.updateCurrentPage("forgot-password"); } function whatIsClick_gkxwvsqf_202601832446_812(){ var note = "<h2>What is the Woo ID?</h2><p> With a growing awareness of on-line privacy and security issues, further tightening of the spam laws worldwide and the need for businesses to have more robust collection of data systems in place, Woo has risen to the challenge by creating a universal ID for users on the platform - called a Woo ID.</p><p>The Woo ID provides you with the security that Woo is dedicated, and bound by law, to ensure your information is kept private and that all anti-spam laws are adhered to. Every user added to a Woo website gets to verify their email address. This ensures issues with data entry and out-of-date email accounts are spotted early.</p><p>The Woo ID universal ID is the market leader: creating a safe and spam free environment for you.</p><p><a href='https://woo.co/privacy-policy' target=_blank>Read more about Woo and their Privacy Policy</a></p>"; var message = $("<div class='alert_success_box'><img src='/resources/images/wooIcon.png' width='40px' style='padding: 3px;' /><br>" + note + "<p><button type='button' style='width: 50px;'>OK</button></p></div>") .appendTo("body").slideDown('normal'); $(message).click(function(){ $(this).slideUp('normal', function(){ $(this).remove(); }); }); } function closeButtonPressed_gkxwvsqf_202601832446_812(){ $(".woo-dialogBox").hide(); loggingInOrOut = false; openModal = false; } function makeModal_gkxwvsqf_202601832446_812(content){ openModal = true; var dialogBox = document.createElement('div'); dialogBox.className = "woo-dialogBox"; document.getElementsByClassName("wooMainContent")[0].appendChild(dialogBox); var closeBox = document.createElement('button'); closeBox.className = 'woo-dialogClose'; closeBox.classList.add('material-symbols-outlined'); closeBox.addEventListener('click', closeButtonPressed_gkxwvsqf_202601832446_812); var dialogContent = document.createElement('div'); dialogContent.className = "woo-dialogContent"; dialogContent.appendChild(closeBox); dialogContent.appendChild(content); dialogBox.appendChild(dialogContent); } function login_gkxwvsqf_202601832446_812(usernameElem, passwordElem){ woo.execLogin(usernameElem.value, passwordElem.value).then(() => { $(".woo-dialogBox").hide(); openModal = false; }).catch((error) => { loggingInOrOut = false; //alert("User name or password is incorrect. Please try again."); $(".wooMainContent #woo_loginErrorMessage").css("display", "block"); }); } function register_gkxwvsqf_202601832446_812(){ woo.updateCurrentPage("register"); } function loginOnClick_gkxwvsqf_202601832446_812(){ if (loggingInOrOut == false) { loggingInOrOut = true; if (!loggedIn){ if ($(".woo-dialogBox").length){ $(".woo-dialogBox").show(); } else { var signinModal = document.querySelector("#signinModal_gkxwvsqf_202601832446_812"); var usernameInput = document.querySelector("#wooUsername_gkxwvsqf_202601832446_812"); var passwordInput = document.querySelector("#wooPassword_gkxwvsqf_202601832446_812"); document.querySelector(".woo_logIn_gkxwvsqf_202601832446_812").addEventListener('click', login_gkxwvsqf_202601832446_812.bind(this, usernameInput, passwordInput)); document.querySelector(".woo_signUp_gkxwvsqf_202601832446_812").addEventListener('click', register_gkxwvsqf_202601832446_812.bind(this)); makeModal_gkxwvsqf_202601832446_812(signinModal); } } else { woo.execLogout(); } } } function changeLoginState_gkxwvsqf_202601832446_812(loginState){ if(!loginState){ loggedIn = false; loginDom.innerHTML = "Login"; //loginDomMob.innerHTML = "lock"; } else { loggedIn = true; loginDom.innerHTML = "Logout"; //loginDomMob.innerHTML = "lock_open"; } } function addEventListeners_gkxwvsqf_202601832446_812() { if (window.location.hostname === "grimdarkminiatures.woo.co") { document.getElementById("login-button-grimdarkminis").hidden = false; } if (woo.sessionData != null){ changeLoginState_gkxwvsqf_202601832446_812(true); } else { changeLoginState_gkxwvsqf_202601832446_812(false); } //loginDomMob.addEventListener('click', loginOnClick_gkxwvsqf_202601832446_812, false); loginDom.addEventListener('click', loginOnClick_gkxwvsqf_202601832446_812, false); whatIs.addEventListener('click', whatIsClick_gkxwvsqf_202601832446_812, false); forgotPass.addEventListener('click', forgotPass_gkxwvsqf_202601832446_812, false); } addEventListeners_gkxwvsqf_202601832446_812(); gkxwvsqf_202601832446_812_Global.unload = () => { //Unload callbacks here //loginDomMob.removeEventListener('click', loginOnClick_gkxwvsqf_202601832446_812, false); loginDom.removeEventListener('click', loginOnClick_gkxwvsqf_202601832446_812, false); whatIs.removeEventListener('click', whatIsClick_gkxwvsqf_202601832446_812, false); forgotPass.removeEventListener('click', forgotPass_gkxwvsqf_202601832446_812, false); //document.querySelector(".woo_logIn_gkxwvsqf_202601832446_812").removeEventListener('click', login_gkxwvsqf_202601832446_812); //document.querySelector(".woo_signUp_gkxwvsqf_202601832446_812").removeEventListener('click', register_gkxwvsqf_202601832446_812); console.log("Unloaded gkxwvsqf_202601832446_812"); } return gkxwvsqf_202601832446_812_Global; })();var gkxwvsqf_202510410143_600 = (function() { var self = document.getElementById('gkxwvsqf_202510410143_600'); var gkxwvsqf_202510410143_600_Global = {}; var initialTiles = [{"name":"the-great-beast-of-contagion","url":"resources/grimdarkminiatures/uploads/IMG_1515.jpeg"},{"name":"the-dark-magi","url":"resources/grimdarkminiatures/uploads/dm1.jpeg"},{"name":"da'-big-green","url":"resources/grimdarkminiatures/uploads/dbg5.jpeg"},{"name":"the-sorcerer-of-poxes","url":"resources/grimdarkminiatures/uploads/sp2.jpeg"},{"name":"gastroparesis-the-indigestible","url":"resources/grimdarkminiatures/uploads/jerry7.jpeg"},{"name":"magos-myrmidax","url":"resources/grimdarkminiatures/uploads/Magos Myrmidon B.JPG"},{"name":"the-forgefather","url":"resources/grimdarkminiatures/uploads/forgefather3.jpeg"},{"name":"the-magister-of-flame","url":"resources/grimdarkminiatures/uploads/mf17.jpeg"},{"name":"haustor-the-untended","url":"resources/grimdarkminiatures/uploads/h30.jpeg"},{"name":"lord-baarel,-contemptor-incaendius","url":"resources/grimdarkminiatures/uploads/IMG_2356 2.jpeg"}]; var handlers = new Map(); var templatePage = "projecttemplate"; var board = document.getElementById('tileBoard'); var openBtn = document.getElementById('openAddTileModal'); var modal = document.getElementById('addTileModal'); var nameInput = document.getElementById('tileNameInput'); var fileInput = document.getElementById('tileImageFile'); var errorEl = document.getElementById('tileAddError'); var closeBtn = document.getElementById('addTileCloseBtn'); var confirmBtn = document.getElementById('addTileConfirmBtn'); var backdrop = modal && modal.querySelector('.tile-add-backdrop'); var removeConfirmModal = document.getElementById('removeTileConfirmModal'); var removeConfirmMessage = document.getElementById('removeTileConfirmMessage'); var removeConfirmBackdrop = document.getElementById('removeTileConfirmBackdrop'); var removeCancelBtn = document.getElementById('removeTileCancelBtn'); var removeConfirmBtn = document.getElementById('removeTileConfirmBtn'); var pendingRemoveWrap = null; function syncBodyScrollLock() { var addOpen = modal && !modal.hidden; var removeOpen = removeConfirmModal && !removeConfirmModal.hidden; document.body.style.overflow = addOpen || removeOpen ? 'hidden' : ''; } function openModal() { if (!modal) return; modal.hidden = false; modal.classList.add('tile-add-modal-open'); syncBodyScrollLock(); if (nameInput) nameInput.value = ''; if (fileInput) fileInput.value = ''; if (errorEl) errorEl.textContent = ''; if (nameInput) nameInput.focus(); } function closeModal() { if (!modal) return; modal.hidden = true; modal.classList.remove('tile-add-modal-open'); syncBodyScrollLock(); if (nameInput) nameInput.value = ''; if (fileInput) fileInput.value = ''; if (errorEl) errorEl.textContent = ''; } function openRemoveConfirm(wrap) { if (!removeConfirmModal || !wrap) return; pendingRemoveWrap = wrap; var hit = wrap.querySelector('.tile-gallery-tile-hit'); var id = hit && hit.getAttribute('linkID'); if (removeConfirmMessage) { removeConfirmMessage.textContent = id ? 'Remove “' + id + '” from the gallery? This cannot be undone.' : 'Remove this tile from the gallery? This cannot be undone.'; } removeConfirmModal.hidden = false; removeConfirmModal.classList.add('tile-add-modal-open'); syncBodyScrollLock(); if (removeCancelBtn) removeCancelBtn.focus(); } function closeRemoveConfirm() { if (!removeConfirmModal) return; pendingRemoveWrap = null; removeConfirmModal.hidden = true; removeConfirmModal.classList.remove('tile-add-modal-open'); syncBodyScrollLock(); } function removeFromInitialTiles(url, name) { var u = String(url); var n = name == null ? '' : String(name); for (var i = 0; i < initialTiles.length; i++) { var it = initialTiles[i]; if (!it) continue; if (String(it.url) === u && String(it.name) === n) { initialTiles.splice(i, 1); return; } } } function confirmRemoveTile() { var wrap = pendingRemoveWrap; closeRemoveConfirm(); if (!wrap) return; var hit = wrap.querySelector('.tile-gallery-tile-hit'); var linkId = hit && hit.getAttribute('linkID'); removeFromInitialTiles(wrap.dataset.objectUrl, linkId == null ? '' : linkId); woo.updateGadgetProperty('gkxwvsqf_202510410143_600', woo.pageDB, "imageList", initialTiles).then(() => { return woo.deletePage(linkId); }).catch((error) => { console.log(error); }); var u = wrap.dataset.objectUrl; if (u && u.indexOf('blob:') === 0) URL.revokeObjectURL(u); wrap.remove(); } function createTileElement(url, name) { var wrap = document.createElement('article'); wrap.className = 'tile-gallery-tile'; wrap.dataset.objectUrl = url; var tileBtn = document.createElement('button'); tileBtn.type = 'button'; tileBtn.className = 'tile-gallery-tile-hit'; tileBtn.setAttribute('linkID', name); tileBtn.setAttribute('aria-label', name ? 'Open ' + name : 'Open tile'); tileBtn.setAttribute('onclick', "woo.updateCurrentPage($(this).attr('linkID'))"); var imgWrap = document.createElement('span'); imgWrap.className = 'tile-gallery-tile-img-wrap'; var img = document.createElement('img'); img.src = url; img.alt = name || ''; img.setAttribute('aria-hidden', 'true'); imgWrap.appendChild(img); tileBtn.appendChild(imgWrap); if (woo.sessionData != null && woo.sessionData.roles.includes(woo.getAppID() + "$admin")){ var removeBtn = document.createElement('button'); removeBtn.type = 'button'; removeBtn.className = 'tile-gallery-tile-remove'; removeBtn.setAttribute('aria-label', 'Remove tile'); removeBtn.textContent = '\u2212'; var handler = (e) => stopProp(e, wrap); handlers.set(removeBtn, handler); removeBtn.addEventListener('click', handler); wrap.appendChild(removeBtn); } wrap.appendChild(tileBtn); return wrap; } function stopProp(e, wrap) { e.stopPropagation(); e.preventDefault(); openRemoveConfirm(wrap); } function confirmAddTile() { if (errorEl) errorEl.textContent = ''; var file = fileInput && fileInput.files && fileInput.files[0]; if (!file) { if (errorEl) errorEl.textContent = 'Please choose an image.'; return; } var rawName = nameInput ? nameInput.value.trim() : ''; var pageID = rawName.toLowerCase().replaceAll(" ", "-"); var formData = new FormData(); formData.append("name", "Images"); formData.append("files", file); uploadFiles(formData).then((response) => { var url = "resources/" + woo.getAppID() + "/uploads/" + file.name; initialTiles.push({"name": pageID, "url": url}); var el = createTileElement(url, rawName); woo.updateGadgetProperty('gkxwvsqf_202510410143_600', woo.pageDB, "imageList", initialTiles).then(() => { return woo.createPage(pageID, rawName, templatePage, false); }).catch((error) => { console.log(error); }); if (board) board.appendChild(el); }).catch((error) => { console.log(error); console.error("Image Upload Failed"); }); closeModal(); } function uploadFiles(formData) { if (woo.sessionData == null) { return } return $.ajax({ type: "POST", url: woo.getAuthServer() + "/app/upload_Files", headers: { "Authorization": "Bearer " + woo.sessionData.token + ":" + woo.sessionData.password }, processData: false, contentType: false, cache: false, data: formData, timeout: 10000 }); } if (openBtn) openBtn.addEventListener('click', openModal); if (closeBtn) closeBtn.addEventListener('click', closeModal); if (confirmBtn) confirmBtn.addEventListener('click', confirmAddTile); if (backdrop) backdrop.addEventListener('click', closeModal); if (removeCancelBtn) removeCancelBtn.addEventListener('click', closeRemoveConfirm); if (removeConfirmBtn) removeConfirmBtn.addEventListener('click', confirmRemoveTile); if (removeConfirmBackdrop) removeConfirmBackdrop.addEventListener('click', closeRemoveConfirm); function escCheck(e) { if (e.key !== 'Escape') return; if (removeConfirmModal && !removeConfirmModal.hidden) closeRemoveConfirm(); else if (modal && !modal.hidden) closeModal(); } document.addEventListener('keydown', escCheck); if (board && initialTiles && initialTiles.length) { initialTiles.forEach(function (pair) { if (!pair) return; var tileName = pair.name; var tileUrl = pair.url; if (tileUrl == null || tileUrl === '') return; board.appendChild(createTileElement(String(tileUrl), tileName == null ? '' : String(tileName))); }); } if (woo.sessionData != null && woo.sessionData.roles.includes(woo.getAppID() + "$admin")){ openBtn.hidden = false; } gkxwvsqf_202510410143_600_Global.unload = () => { //Unload callbacks here var handler; if (openBtn) openBtn.removeEventListener('click', openModal); if (closeBtn) closeBtn.removeEventListener('click', closeModal); if (confirmBtn) confirmBtn.removeEventListener('click', confirmAddTile); if (backdrop) backdrop.removeEventListener('click', closeModal); if (removeCancelBtn) removeCancelBtn.removeEventListener('click', closeRemoveConfirm); if (removeConfirmBtn) removeConfirmBtn.removeEventListener('click', confirmRemoveTile); if (removeConfirmBackdrop) removeConfirmBackdrop.removeEventListener('click', closeRemoveConfirm); document.removeEventListener('keydown', escCheck); board.querySelectorAll('.tile-gallery-tile-remove').forEach(function (tile) { handler = handlers.get(tile); if (handler) { tile.removeEventListener('click', handler); } }); console.log("Unloaded gkxwvsqf_202510410143_600"); } return gkxwvsqf_202510410143_600_Global; })();var gkxwvsqf_202592811478_983 = (function() { var self = document.getElementById('gkxwvsqf_202592811478_983'); var gkxwvsqf_202592811478_983_Global = {}; gkxwvsqf_202592811478_983_Global.unload = () => { //Unload callbacks here console.log("Unloaded gkxwvsqf_202592811478_983"); } return gkxwvsqf_202592811478_983_Global; })();var gkxwvsqf_2025928113450_361 = (function() { var self = document.getElementById('gkxwvsqf_2025928113450_361'); var gkxwvsqf_2025928113450_361_Global = {}; const menuDropdown = initDropdown(); function initDropdown() { const dropdown = document.querySelector(".nav-dropdown"); const noop = { removeListeners: function () {} }; if (!dropdown) { return noop; } const toggle = dropdown.querySelector(".nav-dropdown-toggle"); const menu = dropdown.querySelector(".nav-dropdown-menu"); const mobileQuery = window.matchMedia("(max-width: 768px)"); let mobileListenersAttached = false; let sharedListenersAttached = false; function setExpanded(isOpen) { toggle.setAttribute("aria-expanded", String(isOpen)); } function handleToggleClickDesktop(e) { if (!mobileQuery.matches) { e.preventDefault(); } } function handleToggleClickMobile(e) { e.stopPropagation(); setExpanded(dropdown.classList.toggle("is-open")); } function handleDocumentClick() { dropdown.classList.remove("is-open"); setExpanded(false); } function handleMenuClick(e) { e.stopPropagation(); } function handleMouseEnter() { if (!mobileQuery.matches) { setExpanded(true); } } function handleMouseLeave() { if (!mobileQuery.matches) { setExpanded(false); } } function handleMediaQueryChange() { if (mobileQuery.matches) { attachMobileListeners(); } else { detachMobileListeners(); } } function attachMobileListeners() { if (mobileListenersAttached) { return; } toggle.addEventListener("click", handleToggleClickMobile); document.addEventListener("click", handleDocumentClick); menu.addEventListener("click", handleMenuClick); mobileListenersAttached = true; } function detachMobileListeners() { if (!mobileListenersAttached) { return; } dropdown.classList.remove("is-open"); setExpanded(false); toggle.removeEventListener("click", handleToggleClickMobile); document.removeEventListener("click", handleDocumentClick); menu.removeEventListener("click", handleMenuClick); mobileListenersAttached = false; } function attachListeners() { if (sharedListenersAttached) { return; } toggle.addEventListener("click", handleToggleClickDesktop); dropdown.addEventListener("mouseenter", handleMouseEnter); dropdown.addEventListener("mouseleave", handleMouseLeave); mobileQuery.addEventListener("change", handleMediaQueryChange); sharedListenersAttached = true; handleMediaQueryChange(); } function removeListeners() { detachMobileListeners(); if (!sharedListenersAttached) { return; } toggle.removeEventListener("click", handleToggleClickDesktop); dropdown.removeEventListener("mouseenter", handleMouseEnter); dropdown.removeEventListener("mouseleave", handleMouseLeave); mobileQuery.removeEventListener("change", handleMediaQueryChange); sharedListenersAttached = false; setExpanded(false); } attachListeners(); return { attachListeners, removeListeners, attachMobileListeners, detachMobileListeners }; } gkxwvsqf_2025928113450_361_Global.unload = () => { menuDropdown.removeListeners(); console.log("Unloaded gkxwvsqf_2025928113450_361"); } return gkxwvsqf_2025928113450_361_Global; })();