Extra Shop Filters+

Extra Shop Filters+

Jul 16, 2026

Bookmarklet features:

  • Additional invertible filters (click to include those items, ctrl+click to exclude those items):

    image

  • (Improved) Category filters: invertible options, with a Textures section, auto-updating counts, injected into every page.

  • (Improved) Artist filters: invertible options, alphabetical sort, and selections keep their position in the list.

  • Ability to reorder the Filters panels as you please.

  • Adds a Wishlist % Off sort option, bringing your wishlisted items to the top of the page, and sorting by best discount.

  • Ability to view your owned an unowned interactive/3d print licenses (options appear when "Only Owned" filter is enabled):

    image

  • Ability to copy all product ids on a page (click to copy ids post-filtering, ctrl+click to copy all ids).

    image

  • Ability to copy product ids of all items in your cart. Just run the bookmarklet on your cart page (lets you easily restore your cart by using the IDs filter.

  • Bundle missing item counts, and interactive license highlighting.

    • Bundles show [X/Total], where X is the number of items you don't own (0 means you own everything).

    • Colors show whether an item does or doesn't offer an interactive license. Green = offers an interactive license, Red = no interactive license, Blue = you already own an interactive license.

      image

This bookmarklet only works on desktop browsers.

To set up the bookmarklet:

  1. Create a bookmark for any page, give it whatever name you want.

  2. Copy the code below. If you want to have everything enabled, just replace the bookmark's URL with the below code, and you're done. Then, simply click the bookmark when you're on any shop page. To customize the functionality/options, continue to step 3:

javascript:(()=>{const e={

filterPanelOrder: ["Category", "Artists", "Quick Filters", "Genre", "Compatible Figures", "File Formats", "Price"],
highlightLicenses: 1,
useCategories: 1,
categoriesHeight: 300,
useArtists: 1,
artistsHeight: 300,
updateCounts: 1,
wishlistDiscountSort: 1,
autoSortWishlist: 1,
saveOptions: 1,
enableCopyIds: 1,
showBundleInfo: 1,
showCartInfo: 1,
defaultPriceRange: "",
defaultIdRange: "",
textboxWidth: 100,
filterOpts: [
  ["owned", "dazPlus", "wishlist", "bundles", "pa", "do"],
  ["ids", "price", "new", "figure", "outlet"],
  ["cart", "interactive", "3dprint"],
]

};if("www.daz3d.com"===location.host)try{const{filters:t,sorts:n,rawCategories:i,hasLoaded:s}=daz?.filter||{};if(s){const s=(e,t={},n="")=>{const i=document.createElement(e);for(let e in t)i.style[e]=t[e];return i.className=n,i},o=(e,t)=>t.forEach(t=>{console.log(t),e?.style.setProperty(...t)}),a=e=>e?.toLocaleString?.(),r=e=>[].slice.call(e||[]),c=(e,t=document)=>t.querySelector(`[id=${e}]`),l=(e,t=document)=>r(t?.getElementsByClassName(e)),d=(e,t=document)=>r(t?.getElementsByTagName(e)),p=()=>{const e={set:void 0,inverted:!1,filter:t=>e.set.has(t)!==e.inverted};return e},u=(e,t)=>e.localeCompare(t),h=e=>{const t=e.join(", "),n=`${a(e.length)} IDs copied!`,i=document.createElement("textarea");i.value=t,document.body.appendChild(i),i.select(),setTimeout(()=>{document.execCommand("copy"),setTimeout(()=>{document.body.removeChild(i),alert(n),X()},10)},10)},{compat_figures:f,compat_software:g,shopCategories:m={},vendor:y,owned:b}=t,{highlightLicenses:w,useCategories:k,categoriesHeight:v=0,useArtists:C,artistsHeight:x,updateCounts:_,filterPanelOrder:E,wishlistDiscountSort:S,autoSortWishlist:z,saveOptions:I,enableCopyIds:O,showBundleInfo:A,showCartInfo:L,textboxWidth:D,defaultIdRange:T,defaultPriceRange:$,filterOpts:N}=e,P=e=>{let t;return()=>t||(t=new Set(J(e)))};const F=P(b),j=P(y["Daz Originals"]),B=P(t.platClub.yes),W=14548,H=[48381,86858],R=Object.keys(dazPricing),M=e=>d("input",e)?.[0],J=e=>Array.isArray(e)?e:"object"==typeof e?Object.keys(e).map(e=>parseInt(e)):DazFilter.prototype.unpackBuffer(e),q=(e={})=>{const{subProductIDs:t}=e;if(!t?.length)return"";let n=0;for(let e=0;e<t.length;e++)b[t[e]]||n++;return`${n}/${t.length}`},K=(e,t)=>{if(!e?.length)return!1;for(let n=0;n<e.length;n++)if(!t.includes(e[n]))return!1;return!0},G=e=>e?.licenses?.includes("interactive")||!1,V=e=>window.loadedSlabs[`${e}:${DazProductSlab.slabApiCacheVersion}`],Q=(e,t)=>window.loadedSlabs[`${e}:${DazProductSlab.slabApiCacheVersion}`]=t,U=()=>Object.keys(window.loadedSlabs).map(e=>e.split(":")[0]),Z=(e,t)=>{const n=V(e);n?n.then(e=>{e?t(G(e),e?.subProductIDs):t(null)}):t(null)},X=()=>{l("custom-alert-button")[0]?.focus()},Y=(e,t,n)=>{const i=l("slab-shell",e)[0]||l("icon-row",e)[0];i&&(i.style.backgroundColor=n?"rgba(0,0,255,0.25)":t?"rgba(0,255,0,0.05)":"rgba(255,0,0,0.25)")},{interactive:ee=[]}=daz.api.data["License/owned"].licensed,te=e=>{const t=c("slabs-container")||l("wishlist-grid")[0],n=t?t.children:d("li"),{interactive:i=[]}=daz.api.data["License/owned"].licensed;r(n).forEach(t=>{if(t.hasAttribute("data-productid")){const n=t.getAttribute("data-productid"),s=e.get(n);if(w&&Z(n,(e,s)=>{null!==e&&Y(t,e,i.includes(parseInt(n))||K(s,i))}),s){const e=d("h2",t),n=`[${s}]`;e.forEach(e=>{e.innerText.startsWith(n)||(e.innerText=`${n} ${e.innerText}`)})}}})};if(w){const e=()=>{const e=d("li");r(e).forEach(e=>{if(e.hasAttribute("data-productid")){const t=e.getAttribute("data-productid");Z(t,(n,i)=>{null!==n&&Y(e,n,ee.includes(parseInt(t))||K(i,ee))})}})};e()}if(A&&!DazProductSlab.prepareRenderDataOrig){const e=new Map;let t;DazProductSlab.prepareRenderDataOrig=DazProductSlab.prepareRenderData,DazProductSlab.prepareRenderData=function(...n){const i=n[0],{id:s}=i;return e.has(s)||e.set(s,q(i)),clearTimeout(t),t=setTimeout(()=>{window._updateBundleInfo().then(e=>{te(e)})},200),DazProductSlab.prepareRenderDataOrig(...n)},window._updateBundleInfo=async()=>{const t=U().filter(t=>!e.has(t)),n=await Promise.all(t.map(V));return t.forEach((t,i)=>{e.set(t,q(n[i]))}),e}}const ne=l("sku_number ")[0]?.innerText;if(ne){if(w){const e=l("product_information").map(e=>r(e?.children||[]).filter(e=>"bundle_info"===e.id)).filter(e=>e.length>0)[0]||[];if(e.length>0){const t=(e,t,n)=>{const i=s("input",{float:"right",position:"relative",zIndex:"989",marginTop:"15px",marginRight:"10px",marginBottom:"-50px",pointerEvents:"none"});i.type="checkbox",i.checked=n,e.insertBefore(i,e.firstChild)},{interactive:n}=daz.api.data["License/owned"].licensed;e.forEach(e=>{d("li",e).forEach(e=>{const i=e.getAttribute("data-productid");if(null!==i){const s=parseInt(i),o=l("product-image",e)[0]||l("slab-link-img",e)[0];b[s]?n.includes(s)?(o.style.opacity=.25,t(e,o,!0)):Z(i,n=>{if(n)t(e,o,!1),o.style.opacity=.45;else{const t=l("slab-copy",e)[0];o.style.opacity=.4,t.style.backgroundColor="red"}}):Z(i,n=>{if(n)t(e,o,!1);else{l("slab-copy",e)[0].style.backgroundColor="rgba(255,0,0,0.5)"}})}})})}}}else{const e="/wishlist"===location.pathname,g="/checkout/cart"===location.pathname,b=window.innerWidth<992,w=e?c(b?"collapsible-product-filters-container":"collapsible-product-display-container"):document;if(w&&!g){let g,A;if(e)A=c("large_owned",w)?.parentNode,g=A.parentNode;else{const e=c("slabs-container");e&&(g=s("div",{width:"100%",marginLeft:"3%"}),e.parentNode.insertBefore(g,e))}const P=e?"large_owned":"owned_check",q=e?"large_wishlist":"wishlist_check",K=e?"large_bundle":"bundle_check";if(g){let G,U=()=>{};L&&!DazCart.prototype.productAddedOrig&&(G=()=>{const e=daz.cart.cart?.products,t=e=>1===e?`${e} item`:`${e} items`;if(void 0===e)U(`In Cart (${t(daz.api.data["Cart/contents"].products.length)})`);else{let n=0,i=0,s=0,o=0,a=0;e.forEach(({id:e,price:t=0})=>{H.includes(e)?o+=t:e===W?a+=t:B().has(e)?n+=t:j().has(e)?i+=t:s+=t});const r=[];i&&r.push(["DO",i]),n&&r.push(["Daz+",n]),s&&r.push(["PA",s]),a&&r.push(["GiftCard",a]),o&&r.push(["License",o]),(r.length>1||0===r.length&&e.length>0)&&r.push(["Total",i+n+s+o+a]);const c=r.map(([e,t])=>`${e}: $${(t/100).toFixed(2)}`);c.length>0&&c.unshift(""),U(`In Cart (${t(e.length)}${c.join(", ")})`)}},DazCart.prototype.productAddedOrig=DazCart.prototype.productAdded,DazCart.prototype.productAdded=function(...e){const t=this.productAddedOrig(...e);return G(),t});if(!c("show_owned_only")){const o=e?daz.wishlistdisplay:daz.catalog,r=(e,t,n)=>{t.state=0,t.label=e;const i=[!1,!0,null];t.callback=()=>{n&&n(i[t.state])},e.addEventListener("contextmenu",e=>{e.preventDefault(),t.state=2===t.state?0:2,t.checked=!1,t.indeterminate=2===t.state,X(),t.callback()}),t.addEventListener("click",e=>{e.ctrlKey||e.metaKey?t.state=2===t.state?0:2:t.state=t.state?0:1,t.checked=1===t.state,t.indeterminate=2===t.state,X(),t.callback()})},E=[];if(e){const e=s("div"),t=g;t.insertBefore(e,A),t.style.height="auto",t.style.marginBottom="20px",e.setAttribute("style",A.getAttribute("style")),A.removeAttribute("style"),e.appendChild(A),e.style.display="flex",e.style.flexDirection="column",l("desktop-sort-by")[0].style.marginLeft="auto",E.push(A)}const L=(e,t)=>{e&&e.checked!==t&&(e.checked=t,e.dispatchEvent(new Event("change")))},H=()=>{const t=e?E[0].parentNode:g,n=s("div",e&&b?{}:{marginBottom:"6px"},e?E[0].className:void 0);return e?t.insertBefore(n,E.at(-1).nextSibling):t.appendChild(n),E.push(n),n};let G=0;const Z={},X=()=>{if(I){const e={};Object.keys(Z).forEach(t=>{const[n,i]=Z[t];e[t]=[n.indeterminate?2:n.checked?1:0],i&&e[t].push(i?.value)}),sessionStorage.setItem(`filters:${location.pathname}`,JSON.stringify({checks:e,sort:o.sortOrderSettings}))}},Y=(e,t=[],n=[],i)=>{const o=s("label",...t),r=s("input"),c=s("span",...n);let l;if(o.appendChild(r),o.appendChild(c),c.innerText=` ${e}`,r.type="checkbox",i){const e=s("span",{},"filter_count");l=t=>e.innerText=` ( ${a(t)} )`,c.appendChild(e)}return{label:o,span:c,input:r,setCount:l}},ee=(t,n,i,o=null,a,c)=>{G++;const l=s("span",e?{}:{marginRight:"1em"},"cursor-pointer filter-checkbox");l.id=t;const{input:d,span:p,label:u}=Y(n);let h;if(l.appendChild(u),c?r(u,d,()=>i(d.checked,d.indeterminate)):(d.onchange=()=>i(d.checked,!1),u.addEventListener("contextmenu",e=>{e.preventDefault(),d.click()})),o||(o=E.at(-1)),o.appendChild(l),Z[t]=[d],a){let e,n;if("object"==typeof a){const{label:t,size:i=100}=a;n=s("sup",{margin:"1em 0.5em"}),n.innerText=t,n.onclick=()=>{h.style.display="block",n.style.display="none"},l.appendChild(n),e=`${i}px`}else e="number"==typeof a?`${a}px`:"100px";h=s("input",{width:e,minWidth:"auto",marginTop:"-2px",marginBottom:"-4px",marginLeft:"6px",height:"28px",display:n?"none":""}),n&&(h.onkeydown=e=>{"Enter"===e.key&&(h.style.display="none",n.style.display="block")}),l.appendChild(h),l.style.display="inline-flex",Z[t].push(h)}return{cb:l,input:d,textField:h,setText:e=>p.innerText=` ${e}`}},te=o?.productList?.map(e=>parseInt(e));let ne;if(O){const e=s("sup",{margin:"1em 0.5em",cursor:"pointer"});e.innerText="[copy ids]",e.onclick=e=>{const t=(e.ctrlKey?te:o.ordered).slice().sort((e,t)=>e-t);h(t)};const t=l("amount_container")[0];t.style.display="flex",t.appendChild(e)}let ie=[],se=null,oe=null;const ae=(e,t=!0)=>{const n=new Set;if("Set"===e?.constructor?.name)return t?new Set(R.map(e=>parseInt(e))).difference(e):e;const i=Array.isArray(e)?e:[e];let s={};return i.forEach(e=>{if(Array.isArray(e)||"object"!=typeof e){J(e).forEach(e=>{s[e]=!0})}else s={...s,...e}}),t?R.forEach(e=>{s[e]||n.add(parseInt(e))}):R.forEach(e=>{s[e]&&n.add(parseInt(e))}),n},re=(e=0)=>{if(ne=te,ie.forEach(({filter:e})=>{ne=ne.filter(e)}),_)if(oe&&se){let t=2!==e&&ne.slice();ne=ne.filter(oe.filter),1!==e&&ve?.(ne),ne=ne.filter(se.filter),2!==e&&(t=t.filter(se.filter),ke?.(t))}else 1===e||oe||ve?.(ne),2===e||se||ke?.(ne),se&&(ne=ne.filter(se.filter)),oe&&(ne=ne.filter(oe.filter)),1!==e&&oe&&ve?.(ne),2!==e&&se&&ke?.(ne);else oe&&(ne=ne.filter(oe.filter)),se&&(ne=ne.filter(se.filter));o.productList=ne,o.applyFilters(!0)},ce=e=>{ie=ie.filter(t=>t!==e)},le=t=>e?de(t):l(t)[0],de=e=>M(c(e,w));let pe=!0;const ue=(e,t,n,i,s=p(),o=void 0,a=[],r=!1,l=!1,d=[])=>{const u=s;let h=!1;l&&(u.updateFilter?u.updateFilterAlt=(e,t)=>{const n=u.updateFilter(e,t);return e=>!n(e)}:h=!u.update);let f=[];const{cb:g,textField:m,input:y,setText:b}=ee(e,t,async(e,t)=>{let s=pe;var l;pe=!1,l=e,d.forEach(e=>{const t=c(e);if(t){if(!l){const e=M(t);(e?.checked||e?.indeterminate)&&e.click()}t.style.display=l?"":"none"}});const p=async()=>{u.inverted=!0===(t&&h),await(u.update?.(t)),e||t?(f=[],a.forEach(e=>{const t=e.endsWith("_check")?le(e):de(e);t?.checked&&(r&&f.push(t),L(t,!1))}),ie.push(u)):(f.forEach(e=>L(e,!0)),ce(u)),re(),s&&(X(),pe=!0)};i?"function"==typeof n?n(e=>{u.set=e,p()},m.value):(u.filter=await u["updateFilter"+(t?"Alt":"")](m?.value,e||t),p()):(u.set||("function"==typeof n?n(e=>{u.set=e}):u.set=ae(n,o)),p())},void 0,i,l);return{cb:g,textField:m,input:y,setText:b}},he=J(t.bundle.yes),fe=n=>{const i=e=>{let t,n;return e.includes("-")?([t,n]=e.split("-").map(e=>parseInt(e)),isNaN(t)&&(t=0),isNaN(n)&&(n=1/0)):t=n=parseInt(e),e=>e>=t&&e<=n},s=e=>{const t=[],n=[],s=new Set,o=new Set;e.split(",").forEach(e=>{const i=(e=e.replace(/\s/g,"")).startsWith("!");if(i&&(e=e.slice(1)),e.includes("-"))(i?n:t).push(e);else{const t=parseInt(e);isNaN(t)||(i?o:s).add(t)}});const a=[];if(t.length>0||s.size>0){const e=t.map(i);s.size>0&&e.unshift(e=>s.has(e)),a.push(t=>e.some(e=>e(t)))}if(n.length>0||o.size>0){const e=n.map(e=>i(e));o.size>0&&e.unshift(e=>o.has(e)),a.push(t=>e.every(e=>!e(t)))}return e=>a.every(t=>t(e))};switch(n){case"owned":ue("show_owned_only","Only Owned",F(),!1,void 0,!1,[P,q,"show_wishlist"],!0,void 0,["owned_interactive_license","owned_3dprint_license"]);break;case"wishlist":e||ue("show_wishlist","Wishlist",daz.filter.filters.inWishlist,!1,void 0,!1,["show_owned_only"],!0,!0);break;case"dazPlus":ue("daz_plus","Daz+",B(),!1,void 0,!1,void 0,void 0,!0);break;case"pa":ue("hide_daz_original","PA Only",j(),!1,void 0,void 0,["only_daz_original"]);break;case"do":ue("only_daz_original","DO Only",j(),!1,void 0,!1,["hide_daz_original"]);break;case"bundles":ue("show_bundles","Bundles",[he],!1,void 0,!1,void 0,void 0,!0);break;case"figure":ue("show_figure","Figure",[].concat(...Object.keys(f).map(e=>f[e])),!1,void 0,!1,void 0,void 0,!0);break;case"new":ue("only_new","New Items",t.new.yes,!1,void 0,!1,void 0,void 0,!0);break;case"interactive":{const{interactive:e=[]}=window.daz?.api?.data?.["License/owned"]?.licensed;if(e.length>0){const t=new Set(e),n=F().difference(t),i=p();i.update=e=>i.set=e?n:t,ue("owned_interactive_license","Own Interactive",null,!1,i,!1,void 0,!0,!0).cb.style.display="none"}break}case"3dprint":{const{"3dprinting":e=[]}=window.daz?.api?.data?.["License/owned"]?.licensed;if(e.length>0){const t=new Set(e),n=F().difference(t),i=p();i.update=e=>i.set=e?n:t,ue("owned_3dprint_license","Own 3DPrint",null,!1,i,!1,void 0,!0,!0).cb.style.display="none"}break}case"cart":{const e=p();e.update=()=>{const t=daz.cart.cart?.products?.map(({id:e})=>e)||daz.api.data["Cart/contents"].products;e.set=new Set(t)},e.update(),U=ue("in_cart","In Cart",null,!1,e,!1).setText;break}case"outlet":{const e=p();let t=!1;e.update=async()=>{if(!t){const n=async e=>{const t=(await fetch(e).then(e=>e.text())).match(/catalogData = \[([0-9,]+)]/);return t?new Set(t[1].split(",").map(e=>parseInt(e))):new Set},i=await n("/outlet"),s=await n("/quick-grab");e.set=i.union(s),t=!0}e.inverted=!0},ue("no_outlet","No Outlet",null,!1,e);break}case"ids":{const{textField:e}=ue("custom_id_range","IDs",null,D,{updateFilter:(t,n)=>{0===e.value.length&&n&&(e.value=t=T);const i=s(t);return e=>i(e)}},void 0,void 0,void 0,!0);break}case"price":{const{textField:e}=ue("custom_price_range","Price",null,D,{updateFilter:(t,n)=>{0===e.value.length&&n&&(e.value=t=$);const i=s(t);return e=>{const t=dazPricing[e];return i(t)}}},void 0,void 0,void 0,!0);break}}},ge=e=>{const t=localStorage.getItem(e);return t&&JSON.parse(t)},me=ge("__fullPrices")||{};e?N.forEach((e,t,n)=>{e.forEach(e=>fe(e)),t!==n.length-1&&H()}):N.forEach((e,t,n)=>{e.length>0&&(H(),e.forEach(e=>fe(e)))});const ye=(e,t,n,i)=>{const s=le(e);s&&(void 0!==n&&(s.checked=n),s.addEventListener("click",()=>{t.forEach(e=>{L(de(e),!1)}),i&&X(),e===P&&(ve||ke)&&re()}),i&&s&&(Z[i]=[s]))};ye(P,["show_owned_only"],o.filterSettings.owned,"hide_owned"),ye(q,["show_owned_only"],void 0),ye(K,["show_bundles"]);const be=async e=>{const i=document.querySelector("select[name=sort-by]");if(i){if(S){const a={};window.__discount=a;let r=!1;const c=async e=>{if(e==W)return void(a[e]=-1);const t=dazPricing[e];let n=V(e);if(!n){if(void 0!==me[e])return void(a[e]=me[e]?Math.round(1e3*(1-t/me[e])):1);n=fetch(`/dazApi/slab/${e}`).then(e=>e.json()),Q(e,n)}const i=await n;if(i){const{prices:n,isDisabled:s}=i;if(!n||s)a[e]=-2;else{const i=parseInt(n.USD.replace(".",""));r||=me[e]!==i,me[e]=i,a[e]=Math.round(1e3*(1-t/me[e]))}}},l=J(t.inWishlist),d=new Set(te),p=l.filter(e=>d.has(e)),u=new Set(p);if(p.length){const t=s("option");t.setAttribute("data-sortdata","wlpercentoff"),t.setAttribute("data-sortdir","1"),t.innerText="Wishlist % Off",i.appendChild(t);const[l,d]=o.sortOrderSettings,h=n[l]||n[Object.keys(n)[0]];await Promise.all(p.map(e=>c(e))),r&&(localStorage.setItem("__fullPrices",JSON.stringify(me)),r=!1);const f=e=>void 0!==h[e]?h[e]:999999999-e*d,g=1==d?(e,t)=>f(e)-f(t):(e,t)=>f(t)-f(e),m=p.sort((e,t)=>a[t]-a[e]||g(e,t)),y=te.filter(e=>!u.has(e)).sort(g),b={};[...m,...y].forEach((e,t)=>{b[e]=t}),n.wlpercentoff=b,z&&(e=e||["wlpercentoff",1])}}if(e){const t=d("option",i).findIndex(t=>t.getAttribute("data-sortdata")==e[0]&&t.getAttribute("data-sortdir")==e[1]);t>=0&&(i.selectedIndex=t,i.dispatchEvent(new Event("change")))}i.onchange=X}},we=e=>{let t=new Set(e);const n=le(P);return n?.checked?t.difference(F()):t},ke=k?(()=>{let t,n,o=m;if(Object.keys(o).length>0&&"/shop"===location.pathname)localStorage.setItem("__shopCategories",JSON.stringify(o,(e,t)=>["children","products"].includes(e)?void 0:t));else if(o=ge("__shopCategories"),!o)return;const a=c("shopCategoriesList"),p=l("scroll-container",a)?.[0];if(p){n=s(p.tagName,{},p.className),p.hasAttribute("style")&&n.setAttribute("style",p.getAttribute("style")),p.replaceWith(n),a.style.borderBottom="1px solid #dfe8ec";const e=l("filter-show-more",a)[0];e&&e.parentNode.removeChild(e)}else{const i=e?l("product-filter-section")[0]:l("product-filter-section").find(e=>"artists"===e.getAttribute("data-filter-group"));if(!i)return;const o=s(i.tagName,{},i.className);o.innerHTML=i.innerHTML,i.parentNode.insertBefore(o,i),[t,n]=o.children,e?d("h4",t)[0].innerText="Category":l("filter-section-title",t)[0].innerText="Category";let a=!1;t.onclick=()=>{const[e,i]=a?["none","block"]:["block","none"];l("fd-plus",t)[0].style.display=i,n.style.display=l("fd-minus",t)[0].style.display=e,a=!a},n.id="__CustomCategories",n.innerText=""}const u=s("ul",{minHeight:v?`${v}px`:void 0,maxHeight:`${Math.max(v,300)}px`,overflow:"auto"});n.appendChild(u);let h,f,g=!1,y=[],b=[];const w=e=>{let t=e[0];for(let n=1;n<e.length;n++)t=t.union(e[n]);return t},k={filter:e=>(!h||h.has(e))&&(!f||!f.has(e))},C={},x=(e,t)=>{if(C[e])return C[e];const{products:n=[],children:s=[]}=i[e]||{};let o=new Set(J(n));return s.forEach(e=>{o=o.union(x(e))}),t&&(o=o.difference(t)),C[e]=o,o},_=(e,t,n,i,o)=>{const a=s("li",{},"filter_visible js-filter-option-container"+(i?"":" bs5-ps-3")),{label:c,input:l,span:d,setCount:p}=Y(t,[{},"cursor-pointer item-label"],[{},"idx"],!0);return a.appendChild(c),l.id=e,Z[e]=[l],p(n),r(c,l,t=>{const n=x(e);t?(y.push(n),h=w(y)):null===t?(y=y.filter(e=>e!==n),h=w(y),b.push(n),f=w(b)):(y=y.filter(e=>e!==n),h=w(y),b=b.filter(e=>e!==n),f=w(b)),h||f?g||(g=!0,oe=k):(g=!1,oe=null),re(2)}),o.appendChild(a),{li:a,check:l,setCount:p}};let E=-100;const S={id:E},z=[];i[E]={children:z};const I=new Set(he),O=[];Object.keys(i).forEach(e=>{const{name:t}=i[e];/texture/i.test(t)&&(i[--E]=i[e],z.push(E),O.push({id:E,name:t}),x(E,I))}),S.childrenInfo=O.sort((e,t)=>e.name.localeCompare(t.name));let A=new Set(te);const L=(e,t=A)=>t.intersection(x(e)).size,D=[],T=(e,{id:t,childrenInfo:n=[]})=>{const i=L(t);if(i){const{li:s,check:o,setCount:a}=_(t,e,i,!0,u);D.push({id:t,li:s,check:o,setCount:a}),n.forEach(({id:e,name:t,products:n})=>{const i=n||L(e);if(i){const{li:n,check:o,setCount:a}=_(e,t,i,!1,s);D.push({id:e,li:n,check:o,setCount:a})}})}};let $=!1;return Object.keys(o).forEach(e=>{e>"Textures"&&!$&&($=!0,T("Textures",S)),T(e,o[e])}),e=>{const t=we(e);D.forEach(({id:e,li:n,check:i,setCount:s})=>{const o=L(e,t);o>0||i.checked||i.indeterminate?(s(o),n.style.display=""):n.style.display="none"})}})():null,ve=C?(()=>{const t=c("vendorList");t.innerHTML="";let n,i,o=!1,a=[],l=[];const d=e=>{let t=e[0];for(let n=1;n<e.length;n++)t=t.union(e[n]);return t},p={filter:e=>(!n||n.has(e))&&(!i||!i.has(e))},h={},f={},g=new Map,m=(e,t)=>{if(h[e])return h[e];const n=y[e]||{};let i=new Set(J(n));return t&&(i=i.difference(t)),h[e]=i,i};let b=new Set(te);const w=(e,t=b)=>t.intersection(m(e)).size,k=s("div",{display:"flex",whiteSpace:"nowrap",flexDirection:"row",alignItems:"center"}),v=s("input",{minWidth:"auto"},e?"":"filter_search filterSearch");v.placeholder="Filter Artist",k.appendChild(v);const C=s("div",{width:"auto",marginLeft:"5px"}),_=[{display:"flex",padding:"0px",minHeight:"22px"},"item-label"],E=[{marginLeft:e?"":"-4px"}],{label:S,input:z,span:I}=Y("Selected (0)",_,E),{label:O,input:A}=Y("Sort A-Z",_,E);C.appendChild(S),C.appendChild(O),k.appendChild(C),t.appendChild(k);const L=()=>$.sort(({name:e,lc:t},{name:n,lc:i})=>f[n]-f[e]||u(t,i)),D=e=>{$.forEach(({li:t,check:n})=>{t.parentNode&&(t.style.display=e||n.checked||n.indeterminate?"":"none")})};z.onchange=()=>{D(!z.checked)},A.onchange=()=>{A.checked?$.sort(({lc:e},{lc:t})=>u(e,t)):L(),$.forEach(({li:e})=>{e.parentNode&&(e.parentNode.removeChild(e),T.appendChild(e))}),D(!z.checked)};const T=s("ul",{minHeight:x?`${x}px`:void 0,maxHeight:`${Math.max(x,300)}px`,overflow:"auto",paddingLeft:"5px",marginLeft:"-5px"});t.appendChild(T);const $=[];Object.keys(y).forEach(e=>{const t=w(e);if(t){const{li:c,check:u,setCount:h}=((e,t)=>{const c=s("li",{},"filter_visible js-filter-option-container"),{label:u,input:h,span:y,setCount:b}=Y(e,[{},"cursor-pointer item-label"],[{},"idx"],!0);c.appendChild(u),h.id=e;const w=t=>{f[e]=t,b(t)};return w(t),Z[e]=[h],r(u,h,t=>{const s=m(e);t?(g.set(e,!0),a.push(s),n=d(a)):null===t?(g.set(e,!1),a=a.filter(e=>e!==s),n=d(a),l.push(s),i=d(l)):(g.delete(e),a=a.filter(e=>e!==s),n=d(a),l=l.filter(e=>e!==s),i=d(l)),I.innerText=`Selected (${g.size})`,n||i?o||(o=!0,se=p):(o=!1,se=null),re(1)}),{li:c,check:h,setCount:w}})(e,t);$.push({name:e,lc:e.toLowerCase(),li:c,check:u,setCount:h})}}),L(),$.forEach(({li:e})=>T.appendChild(e));const N=e=>{const t=v.value.trim().toLowerCase();e&&($.forEach(({name:t,lc:n,li:i,check:s,setCount:o})=>{o(w(t,e))}),A.checked||L()),$.forEach(({name:e,lc:n,li:i,check:s})=>{s.checked||s.indeterminate||n.includes(t)&&f[e]>0?T.appendChild(i):i.parentNode&&i.parentNode.removeChild(i)}),D(!z.checked)};return v.addEventListener("input",e=>{N()}),e=>{N(we(e))}})():null;let Ce,xe;if(l("hideable-product-filters").forEach(e=>e.classList.contains("filter-checkboxes")?Ce=e:xe=e),Ce&&xe){const e=()=>{window.innerWidth<992?(Ce.style.setProperty("display","block","important"),xe.style.marginTop=`${26+Ce.clientHeight}px`,Ce.style.display=""):xe.style.marginTop=""};["max-width:576","min-width:992"].forEach(t=>window.matchMedia(`(${t}px)`).addEventListener("change",e)),e()}const _e=I&&sessionStorage.getItem(`filters:${location.pathname}`);let Ee;if(_e){const{checks:e,sort:t}=JSON.parse(_e);Ee=t,Object.keys(Z).forEach(t=>{const[n,i]=Z[t],[s=0,o=""]=e[t]||[];if(n.state=s,i&&(i.value=o),2===s)n.indeterminate=!0;else{const e=1===s;if(e===n.checked)return;n.checked=e}n.dispatchEvent(new Event("change")),n.callback?.()})}const Se=le(P);Se&&Se.checked&&(ve||ke)&&re();const ze=e=>{const t=c(e,w);t.parentNode.removeChild(t)},Ie=(t,n)=>{const i=le(t),s=de(n);if(i&&s){if(e)return void ze(t);i.checked&&L(i,!1),i.addEventListener("click",e=>{e.preventDefault(),e.stopImmediatePropagation(),s.click(),setTimeout(()=>{i.checked=s.checked},0)},!0),s.addEventListener("click",()=>{i.checked=s.checked}),s.label&&s.label.addEventListener("contextmenu",()=>{i.checked=s.checked}),i.checked=s.checked}};e?(ze(K),ze(q),ze("large_platClub")):(Ie(K,"show_bundles"),Ie(q,"show_wishlist"),Ie("platClub_check","daz_plus")),be(Ee)}if(G?.(),E?.length>0){const e=c("category-filter-panel")||l("hideable-product-filters")[0];if(e){o(e,[["display","flex","important"],["flex-direction","column"]]);const t={},n=r(e.children);let i=!1,s=-n.length;n.map((e,n)=>{const o=l("filter-section-title",e)[0]?.innerText;o?(i=!0,t[o.toLowerCase()]=e):i||(e.style.order=s++)});const a=["compatible figures","figure"];E.forEach(e=>{const n=e.toLowerCase(),i=a.includes(n)?t[a.find(e=>t[e])]:t[n];i&&(i.style.order=s++)})}}}}else if(O&&g){const e=c("items-container"),t=l("item-container",e).map(e=>l("item-image",e)[0].src.match(/\.com\/p\/(\d+)\//)[1]);t?.length>0&&h(t.sort((e,t)=>e-t))}}}}catch(e){console.log("error",e)}})();

3. To configure the appearance, you will need to adjust these settings in the above code. Set any value to 0 to disable the feature:

filterPanelOrder: ["Category", "Artists", "Quick Filters", "Genre", "Compatible Figures", "File Formats", "Price"],
highlightLicenses: 1,
useCategories: 1,
categoriesHeight: 300,
useArtists: 1,
artistsHeight: 300,
updateCounts: 1,
wishlistDiscountSort: 1,
autoSortWishlist: 1,
saveOptions: 1,
enableCopyIds: 1,
showBundleInfo: 1,
showCartInfo: 1,
defaultPriceRange: "",
defaultIdRange: "",
textboxWidth: 100,
  • filterPanelOrder - the ordering of the filter panel. To change, adjust the order of the quoted text, and make sure to keep each item separated by commas.

  • highlightLicenses - whether to highlight interactive licenses

  • useCategories - whether to replace and inject the Category filters section into every page (note: you'll need to run the bookmarklet on the homepage once for this to work on other pages)

  • categoriesHeight - if useCategories is enabled, controls the pixel height of the categories section. This ensures the height doesn't bounce around as the counts change. Set to 0 to disable using a fixed height

  • useArtists - whether to replace the Artists filters section with the invertible version

  • artistsHeight - if useArtists is enabled, controls the pixel height of the artists section. Set to 0 to disable using a fixed height

  • updateCounts - whether the Category and Artists filter sections should update their counts each time you change your filters

  • wishlistDiscountSort - whether to add the Wishlist % off sort option

  • autoSortWishlist - whether to automatically set the sort to Wishlist % off. If this option is disabled, the sort will be added, but it won't automatically change the sort setting

  • saveOptions - whether to save your filtering and sort options (to sessionStorage) so that when you return to the same page in the same tab, your previous settings will be restored

  • enableCopyIds - adds a button to copy all ids on the current page. Regular click copies just the filtered ids, ctrl+click copies all ids, including the filtered ones

  • showBundleInfo - whether to show [X/Total] on every bundle

  • showCartInfo - whether the In Cart filter shows cart price info

  • defaultPriceRange - lets you assign default price filter text to use if you enable the filter without typing anything

  • defaultIdRange - lets you assign default id filter text to use if you enable the filter without typing anything

4. To change which filter options appear, or their order, you want to edit these lines:

filterOpts: [
  ["owned", "dazPlus", "wishlist", "bundles", "pa", "do"],
  ["ids", "price", "new", "figure", "outlet"],
  ["cart", "interactive", "3dprint"],
]

To remove a filter option, you can just delete it. To change the order, just change the sequence of the comma-separated values. Make sure each value remains in quotes, they're separated by commas, and don't change the capitalization. Description of each:

  • "owned" - Only show owned items

  • "dazPlus" - Show/Hide Daz+ (invertible using ctrl+click)

  • "wishlist" - Show/Hide wishlist items (invertible using ctrl+click)

  • "bundles" - Show/Hide bundles (invertible using ctrl+click)

  • "pa" - Published Artist items only (i.e. non-Daz Originals)

  • "do" - Daz Original items only (no PA items)

  • "ids" - Lets you filter using a min/max product id range, or an exact id (invertible using ctrl+click). You can add multiples ids or ranges if you separate with a comma. Examples: 20000-50000, 100000-, 98765

  • "price" - Lets you filter using a min/max price range, or an exact price (uses the sale price, not the full price). Prices should be specified in cents, no dollar sign (invertible using ctrl+click). Exclamation point will exclude the price. Can add multiple prices/ranges by separating with a comma. Examples: 500-1000 ($5-$10), 0 (free items), 0-600 (everything under $6), !199 (all items except those for $1.99)

  • "new" - Show/Hide new items (invertible using ctrl+click)

  • "figure" - Show/Hide figure items (those assigned to any of the Figure categories), (invertible using ctrl+click)

  • "outlet" - Hide outlet and quickgrab items

  • "cart" - Show items in your cart (with a count). After you add an item to your cart, it will also show a summary of the prices of the items in your cart.

  • "interactive" - shows items you own an interactive license for. Only available when viewing your owned items. Ctrl+click shows items you own but don't have a license for

  • "3dprint" - shows items you own a 3d print license for. Only available when viewing your owned items. Ctrl+click shows items you own but don't have a license for

5. Once configured to your liking, copy the full text to your bookmark's URL, and run on any shop page.

Enjoy!

Enjoy this post?

Buy Utiltarian a coffee

More from Utiltarian

PrivacyTermsReport