theme search

add a button to search in the theme settings

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         theme search
// @version      0.1
// @description  add a button to search in the theme settings
// @author       Rutger Valk-van de Klundert / Ruben @ Lightspeed HQ
// @run-at       document-end
// @match        https://*.webshopapp.com/admin/*

// @match        https://*.shoplightspeed.com/admin/theme/preview/*
// @namespace https://greasyfork.org/users/428438
// ==/UserScript==
var $jscomp = $jscomp||{};
$jscomp.scope = {};
$jscomp.createTemplateTagFirstArg = function(r){
    return r.raw=r
};
$jscomp.createTemplateTagFirstArgWithRaw = function(r,u){
    r.raw=u;return r
};
var themeSearchFn = function(){
    !function(q){
        var h = Function("return this")()||eval("this");
        "function" == typeof define&&define.amd ? define(["jsonq"],function(e){return h.jsonQ=q()}) : "object"==typeof module&&module.exports ? module.exports=q() : h.jsonQ=q()
    }(function(q){
        function h(a){
            var b=a.keyAdded||[],
            c=a.json,
            d=a.path,
            f=a.newJson;
            return e.each(c,function(a,e){
                var g=d ? JSON.parse(JSON.stringify(d)):[];g.push(a);"object"==p(c)&&(-1==b.indexOf(a)&&(b.push(a),f.jsonQ_path[a]=[]),f.jsonQ_path[a].push({path:g}));var k=p(e);"object"!=k&&"array"!=k||h({json:e,newJson:f,path:g,keyAdded:b})
            }),
            f
        }
        var e=function(a){
            return new e.fn.init(a)
        },
        v=JSON.stringify,
        r=JSON.parse;
        e.settings={
            sort:{order:"ASC",logic:function(a){return a},caseIgnore:!0,allLevel:!0}
        };
        var u={
            topLevel:function(a){
                var b=this.jsonQ_current,
                c=this.cloneObj(e()),
                d=c.jsonQ_current=[],
                f="",
                g=a.key;
                a=a.method;
                for(var k=0,m=b.length;k<m;k++){
                    var n=!1,l=b[k].path.concat([]);
                    if("parent"==a)0===l.length?n=!0:l.pop();
                    else{var p=l.lastIndexOf(g);-1==p?n=!0:l=l.slice(0,p+1)}
                    f==(f=JSON.stringify(l))||n||d.push({path:l})
                }
                return c.length=d.length,c.selector.push({method:a,key:g}),c
            },
            qualTrv:function(a){
                var b=this.jsonQ_current,
                c=this.cloneObj(e()),
                d=c.jsonQ_current=[],
                f=a.key,
                g=e.clone(this.jsonQ_path[f])||[],
                k=a.qualifier,
                m=p(k);
                a=a.method;
                for(var n="find"==a,l=0,y=b.length;l<y;l++){
                    var h=b[l].path,
                    r=[],
                    v=!1;
                    if(!n){
                        if(0===h.length)continue;(r=h.concat([])).pop()
                    }
                    for(var w=0;w<g.length;w++){
                        var t=g[w].path;if(n){var q=t;q=(new RegExp("^"+h.join("~~"),"i")).test(q.join("~~"))}else q=t.concat([]),q.pop(),q=r.join()==q.join();if(q)u.qTest.call(this,m,k,t,d)&&(g.splice(w,1),w--),v=!0;else if(v)break
                    }
                }
                return"string"==m&&(c=this.filter.call(c,k)),
                c.length=c.jsonQ_current.length,
                c.selector.push({method:a,key:f,qualifier:k}),
                c
            },
            qTest:function(a,b,c,d){
                a="function"==a?b.call(this.pathValue(c)):"object"!=a||e.checkKeyValue(this.pathValue(c),b);return a&&d.push({path:c}),a
            }
        },
        t={
            baseConv:function(a,b,c){
                if("string"==a){if(c.caseIgnore)return b.toLowerCase()}else{if("array"==a)return b.join();if("object"==a)return v(e.order(b))}return b
            },
            sortAry:function(a,b,c){
                return a.sort(function(a,c){var d=b(a),e=b(c);return d<e?-1:e<d?1:0}),"desc"==c.order.toLowerCase()&&a.reverse(),a
            }
        };
        e.fn=e.prototype={
            init:function(a){
                var b;
                if(!a)return this;
                if("string"==(b=p(a)))try{a=JSON.parse(a)}catch(c){throw"Not a valid json string.";}else if("object"!=b&&"array"!=b)throw"Not a valid json object.";
                return this.jsonQ_root=a,this.jsonQ_path={},this.jsonQ_current=[{path:[]}],h({json:a,newJson:this,refresh:!0}),this.length=this.jsonQ_current.length,this.selector=[],this
            },
            pathValue:function(a){
                return e.pathValue(this.jsonQ_root,a)
            },
            setPathValue:function(a,b){
                return e.setPathValue(this.jsonQ_root,a,b),this
            },
            clone:function(){
                return r(v(this.jsonQ_current))
            },
            cloneObj:function(a){
                return a=a||{},e.each(this,function(b,c){a[b]=c}),a.selector=e.merge([],a.selector),a
            },
            value:function(a,b){
                var c=this.jsonQ_current;if(b=!1!==b,a){for(var d=p(a),f=0,g=c.length;f<g;f++){var k=c[f].path;if("function"==d){var m=this.pathValue(k);m=b?e.clone(a(m)):a(m)}else m=b?e.clone(a):a;this.setPathValue(k,m)}return this}var n=[];
                return this.each(function(a,b,c){n.push(c)}),n
            },
            append:function(a,b){
                return this.appendAt("last",a,b)
            },
            prepend:function(a,b){
                return this.appendAt("first",a,b)
            },
            appendAt:function(a,b,c){
                var d=this.jsonQ_current;if(isNaN(a)&&"first"!=a&&"last"!=a)throw a+"is not a valid index.";for(var f=0,g=d.length;f<g;f++){var k=d[f].path.concat([]),m=k.pop();k=this.pathValue(k);var n=p(k[m]),l=k[m].length,h=0>a||"first"==a?0:l<a||"last"==a?l:a;"array"==n?(b=c?e.clone(b):b,k[m].splice(h,0,b)):"string"==n&&(n=k[m],k[m]=n.substring(0,h)+b+n.substring(h,l))}
                return this
            },
            filter:function(a){
                var b=this.jsonQ_current,c=this.cloneObj(e()),d=c.jsonQ_current=[],f=p(a);if(!a)return this;for(var g=0,k=b.length;g<k;g++)u.qTest.call(this,f,a,b[g].path,d);"string"==f&&(d=(d=/(nth|eq)\((.+)\)/.exec(a))?e.nthElm(b,d[2],!0):e.nthElm(b,a,!0),c.jsonQ_current=d);
                return c.length=d.length,c.selector.push({method:"filter",qualifier:a}),c
            },
            find:function(a,b){
                return u.qualTrv.call(this,{method:"find",key:a,qualifier:b})
            },
            sibling:function(a,b){
                return u.qualTrv.call(this,{method:"sibling",key:a,qualifier:b})
            },
            parent:function(){
                return u.topLevel.call(this,{method:"parent"})
            },
            closest:function(a){
                return u.topLevel.call(this,{method:"closest",key:a})
            },
            path:function(){
                return this.jsonQ_current[0].path
            },
            firstElm:function(){
                return this.pathValue(this.jsonQ_current[0].path)
            },
            lastElm:function(){
                return this.pathValue(this.jsonQ_current[this.length-1].path)
            },
            nthElm:function(a,b){
                return e.nthElm(this.value(),a,b)
            },
            index:function(a,b){
                return e.index(this.value(),a,b)
            },
            createXML:function(){
                return e.createXML(this.value())
            },
            sort:function(a,b){
                b=e.merge({},e.settings.sort,b);var c,d=this.find(a),f=d.clone(),g=[],k=[],m=p(d.pathValue(f[0].path)),n=function(a){for(;0!==a.length;){var b=a.pop();if(!isNaN(b)&&(b=d.pathValue(a),"array"==p(b)))return b}return null};var l=0;for(c=f.length;l<c;l++)g.push({pathHolder:f[l].path.concat([]),current:f[l].path.concat([])});for(c=function(a){return g.splice(a,1),--a};0!==g.length;)for(0,l=0;l<g.length;l++){f=g[l].current;var h=g[l].pathHolder,q=n(f),r=f.join();if(0===f.length||-1!=k.indexOf(r))l=c(l);else{var v=h.slice(f.length+1,h.length);t.sortAry(q,function(a){a=e.pathValue(a,v);return a=t.baseConv(m,a,b),b.logic(a)},b);b.allLevel?(h[f.length]=0,k.push(r)):l=c(l)}}
                return e(d.jsonQ_root).find(a)
            },
            each:function(a){
                for(var b=this.jsonQ_current,c=0,d=b.length;c<d;c++)a(c,b[c].path,this.pathValue(b[c].path));
                return this
            },
            unique:function(){
                return e.unique(this.value())
            },
            refresh:function(){
                for(var a=this.selector,b=e(this.jsonQ_root),c=0,d=a.length;c<d;c++){var f=a[c],g=[];f.key&&g.push(f.key);f.qualifier&&g.push(f.qualifier);b=b[f.method].apply(b,g)}
                return this.cloneObj.call(b,this),this
            },
            prettify:function(a){
                return e.prettify(this.value(),a)
            }
        };
        e.each=function(a,b){
            for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])
        };
        var p=e.objType=(x={"[object Array]":"array","[object Object]":"object","[object String]":"string","[object Number]":"number","[object Boolean]":"boolean","[object Null]":"null","[object Function]":"function"},
        function(a){
            a=Object.prototype.toString.call(a);return x[a]
        }),x;
        return e.merge=function(){
            var a=arguments,b=p(a[0]),c=1,d=a.length,f=!1,g=a[0];if(0!==d&&("boolean"!=b||1!=d)){"boolean"==b&&(g=a[1],c=2,f=a[0]);for(b=function(a,b){var c=p(b),d=p(g[a]);!f||"array"!=c&&"object"!=c?g[a]=b:(g[a]=c!=d||"array"!=d&&"object"!=d?"array"==c?[]:{}:g[a],e.merge(f,g[a],b))};c<d;c++)e.each(a[c],b);return g}
        },
        e.merge(e,{
            sort:function(a,b){
                if(b=e.merge({},e.settings.sort,b),"array"==p(a))return t.sortAry(a,function(a){var c=p(a);return a=t.baseConv(c,a,b),b.logic(a)},b);throw"Only array is allowed to sort";
            },
            order:function(a){
                if("object"!=typeof a)return a;var b=function(a){return isNaN(a)||(a=parseInt(a)),a},c=function(a){var d=p(a),e=Object.keys(a);"object"==d&&e.sort(function(a,c){var d=b(a),e=b(c);return d<e?-1:e<d?1:0});for(var k=0,m=e.length;k<m;k++){var n=e[k],l=a[n],h=p(l);"object"!=h&&"array"!=h||c(l);"object"==d&&(delete a[n],a[n]=l)}};
                return c(a),a
            },
            clone:function(a){
                var b=p(a);
                return"object"==b||"array"==b?r(v(a)):a
            },
            index:function(a,b,c){
                var d=p(b),f=a.length,g="object"==d||"array"==d||"function"==d;if("function"==d&&(c=!0),g&&!c)var k=v(e.order(b));for(var m=0;m<f;m++){var n=a[m];if(g){var l=p(n);if(l==d||c)if(c){if("function"==d)var h=b.call(n);else if("object"==d&&"object"==l)h=e.checkKeyValue(n,b);else if("array"==l)if("array"==d){l=0;for(var q=b.length;l<q&&(h=-1!=e.index(n,b[l]));l++);}else h=-1!=e.index(n,b);if(h)return m}else if(v(e.order(n))==k)return m}else if(b==n)return m}return-1
            },
            contains:function(a,b,c){
                return-1!=e.index(a,b,c)
            },
            checkKeyValue:function(a,b){
                for(var c in b)if(b.hasOwnProperty(c)&&!e.identical(b[c],a[c]))return!1;return!0
            },
            nthElm:function(a,b,c){
                if(a[b])var d=a[b];else if("last"==b)d=a[a.length-1];else if("first"==b)d=a[0];else if("random"==b)d=a[Math.floor(Math.random()*a.length)];else if("even"==b)d=e.nthElm(a,"2n");else if("odd"==b)d=e.nthElm(a,"2n+1");else try{var f=[],g=a.length;if(!b.match(/^[0-9n*+-\/]+$/))throw"";b=b.replace(/([0-9])n/g,function(a,b){return b?b+"*n":a});for(var k=0;k<g;k++){var m=eval(b);if(g-1<m)break;f.push(a[m])}d=f}catch(n){d=a}return d=d||a,"array"!=p(d)&&c?[d]:d
            },
            prettify:function(a,b){
                if("object"!=typeof a)throw"Only valid json object is allowed.";return b?JSON.stringify(a,null,"\t").replace(/\n/g,"</br>").replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"):JSON.stringify(a,null,3)
            },
            identical:function(a,b){
                function c(a){return"object"!=typeof a||null===a?a:Object.keys(a).sort().map(function(b){return{key:b,value:c(a[b])}})}return JSON.stringify(c(a))===JSON.stringify(c(b))
            },
            union:function(){
                for(var a=arguments,b=[],c=a.length,d=0;d<c;d++)for(var f=a[d].length,g=0;g<f;g++){var k=a[d][g];-1==e.index(b,k)&&b.push(k)}return b
            },
            intersection:function(){
                var a,b=arguments,c=[],d=b.length;if(1==d)c=b[0];else for(var f=0,g=b[0].length;f<g;f++){for(var k=b[0][f],m=a=1;m<d;m++)if(-1==e.index(b[m],k)){a=0;break}1==a&&c.push(k)}return c
            },
            shuffle:function(a){
                for(var b=1,c=a.length;b<c;b++){var d=Math.floor(Math.random()*(b+1)),e=a[b];a[b]=a[d];a[d]=e}return a
            },
            suffle:function(a){
                console.error("This method is deprecated. It was a miss spell of shuffle. Use jsonQ.shuffle instead.");e.shuffle(a)
            },
            unique:function(a){
                for(var b=a.length,c=[],d=0;d<b;d++)-1==e.index(c,a[d])&&c.push(a[d]);return c
            },
            pathValue:function(a,b){
                var c=0,d=b.length;if(null===a)return null;for(;c<d;){if(null===a[b[c]])return;a=a[b[c]];c+=1}return a
            },
            setPathValue:function(a,b,c){
                var d=0,e=a,g=b.length;if(null===a)return null;for(;d<g;)"object"!=typeof e[b[d]]&&(e[b[d]]="number"==p(b[d+1])?[]:{}),d==b.length-1&&(e[b[d]]=c),e=e[b[d]],d+=1;return a
            },
            createXML:function(a){
                var b=function(a,d){var c=0===(d=d||[]).length,g=p(a);return c&&d.push('<?xml version="1.0" encoding="ISO-8859-1"?><jsonXML>'),e.each(a,function(a,c){var e="array"==g?"arrayItem":a,f=p(c);d.push("<"+e+' type="'+f+'">');"object"==f||"array"==f?b(c,d):d.push("<![CDATA["+c+"]]\x3e");d.push("</"+e+">")}),c?(d.push("</jsonXML>"),d.join("")):d};return b(a)
            },
            append:function(a,b,c){
                return e.appendAt(a,"last",b,c)
            },
            prepend:function(a,b,c){
                return e.appendAt(a,"first",b,c)
            },
            appendAt:function(a,b,c,d){
                if(!isNaN(b)||"first"==b||"last"==b){var f=p(a),g=a.length;b=0>b||"first"==b?0:g<b||"last"==b?g:b;return"array"==f?(c=d?e.clone(c):c,a.splice(b,0,c)):"string"==f&&(a=a.substring(0,b)+c+a.substring(b,g)),a}throw b+"is not a valid index.";
            }
        }),
        e.fn.init.prototype=e.fn,e
    });
    0<document.querySelectorAll("#themeSearch").length&&document.querySelectorAll("#themeSearch").forEach(function(q){
        q.remove()
    });
    var r = document.getElementById('searchbar').value,
    u,
    t=new XMLHttpRequest;
    r&&0<r.length&&t.open("GET",location.origin+"/admin/theme/preview/settings.json",!1);
    t.onload=function(){
        if(200<=t.status&&400>t.status){
            console.log(JSON.parse(t.responseText).theme_settings);
            u=jsonQ(JSON.parse(t.responseText).theme_settings);
            var q=u.find("settings").jsonQ_current.map(function(h){
                return[h.path.slice(0,-2).join("/")+"/"+h.path.slice(0,-1).reduce(function(e,h){
                    return e[h]
                },u.jsonQ_root).key,h.path.reduce(function(e,h){
                    return e[h]
                },u.jsonQ_root).map(function(e,h){
                    return e.title.toLowerCase()
                }),
                h.path.reduce(function(e,h){
                    return e[h]
                },u.jsonQ_root).map(function(e,h){
                    return e.key
                })]
            }).filter(function(h){
                return 0<=h[1].findIndex(function(e){
                    return e.includes(r.toLowerCase())
                })
            });
            console.log(q);
            q='<div class="modal bg-visible dialog-visible" id="themeSearch"><div class="dialog small"><header><h2>Search results for "'+r+'":</h2><a class="close" href="#" onclick="document.body.removeChild(themeSearch)"></a></header><div id="modal-content"><div class="body" style="overflow-y: scroll;">'+q.map(function(h){return'<a href="#" onclick="Turbolinks.visit(\'/admin/theme/preview/'+h[0]+"', { action: 'replace' })\">/"+h[0]+"</a>"}).filter(function(h){return h}).join("<br>")+'</div><div class="buttons"><a class="btn close" href="#" title="search" onclick="themeSearchFn()">Search again</a><a class="btn close" href="#" title="close" onclick="document.body.removeChild(themeSearch)">Close</a></div></div></div></div>';
            document.getElementsByTagName("body")[0].insertAdjacentHTML("beforeend",q)
        } else alert("Theme settings could not be retrieved!")
    };
    t.send()
};
//themeSearchFn();
function search_(){
    let search = document.createElement('input');
    search.type = ('text'),
    search.placeholder = ('theme search'),
    search.id = ('searchbar');
    document.querySelectorAll('h1.ItemsCenter')[0].appendChild(search);
    let butt = document.createElement('button');
    butt.type = 'button',
    butt.setAttribute('onclick','themeSearchFn()'),
    butt.innerHTML = 'search';
    document.querySelectorAll('h1.ItemsCenter')[0].appendChild(butt);
};
//search_();
document.addEventListener("load", search_);  //calls function when loaded