mobile-config-firefox/html_resources/selector.js

210 lines
5.6 KiB
JavaScript
Raw Normal View History

2020-06-01 17:24:22 +00:00
'use strict';
let DB = null;
function initDB(obj){
DB = obj;
Object.defineProperty(DB,"query",{value:function (q,list){
let nlist = [];
for(let key of list || this.keys){
2020-06-01 17:24:22 +00:00
if(this[key].includes(q)){
nlist.push(key)
}
}
return nlist
}});
Object.defineProperty(DB,"keys",{value:(Object.keys(DB).sort())});
2020-07-18 05:39:34 +00:00
2020-07-18 05:45:02 +00:00
Object.defineProperty(DB,"getTagsForFile",{value:function(name){return this[name]}});
2020-07-18 05:39:34 +00:00
2020-06-01 17:24:22 +00:00
return true
}
function fetchWithType(url){
return new Promise((resolve,reject)=>{
const ext = url.substring(url.lastIndexOf(".")+1);
let expected = (ext === "json") ? "application/json" : (ext === "css") ? "text/css" : null;
if(!expected){
reject("unsupported file extension");
}
fetch(url)
.then(response =>{
const contentType = response.headers.get('content-type');
if (!contentType || !contentType.includes(expected)) {
reject(`Oops, we got ${contentType} but expected ${expected}`);
}
if(ext === "json"){
response.json()
.then(r=>resolve(r))
}else{
response.text()
.then(r=>resolve(r))
}
},except => reject(except))
});
}
2020-06-01 17:24:22 +00:00
let previousCategory = new (function(){
let current = null;
2020-07-18 06:12:30 +00:00
this.fileNames = null;
this.set = function(t,secondary){
2020-06-01 17:24:22 +00:00
current&&current.classList.remove("currentCategory");
current = t;
current.classList.add("currentCategory");
2020-07-18 06:17:15 +00:00
this.fileNames = DB.query(t.textContent,secondary?this.fileNames:null);
2020-06-01 17:24:22 +00:00
};
return this
})()
function getText(node){
return `${node.childNodes[0].textContent}.css`
2020-06-01 17:24:22 +00:00
}
2020-07-18 05:39:34 +00:00
function getSecondaryCategories(list){
let a = [];
2020-07-18 05:45:02 +00:00
for (let file of list){
a.push(DB.getTagsForFile(file));
2020-07-18 05:39:34 +00:00
}
a = a.flat();
2020-07-18 05:39:34 +00:00
a.sort();
let ret = [];
let i = 0;
ret[0] = a[0];
for(let f of a){
if(ret[i] != f){
ret[++i] = f
}
}
return ret
}
async function onCategoryClicked(categoryNode,isSecondary = false){
2020-06-01 17:24:22 +00:00
previousCategory.set(categoryNode,isSecondary);
2020-07-18 05:39:34 +00:00
// Using textContent is bad but meh
//let names = DB.query(categoryNode.textContent);
2020-07-18 05:39:34 +00:00
let secondaryCategoriesNode = document.querySelector("#secondaryCategories");
if(!isSecondary){
2020-07-18 05:39:34 +00:00
if(previousCategory.fileNames.length > 9){
let matchingSecondaries = getSecondaryCategories(previousCategory.fileNames);
for(let child of Array.from(secondaryCategories.children)){
matchingSecondaries.includes(child.textContent) ? child.classList.remove("hidden") : child.classList.add("hidden")
}
secondaryCategoriesNode.classList.remove("hidden");
}else{
secondaryCategoriesNode.classList.add("hidden");
2020-07-18 05:39:34 +00:00
}
}
2020-06-01 17:24:22 +00:00
for(let c of Array.from(document.querySelectorAll(".target"))){
previousCategory.fileNames.includes(getText(c)) ? c.classList.remove("hidden") : c.classList.add("hidden");
2020-06-01 17:24:22 +00:00
}
}
async function onTargetClicked(targetNode){
const codeBlock = document.querySelector("pre");
fetchWithType(`chrome/${getText(targetNode)}`)
.then(text => (codeBlock.textContent = text))
.catch(e => console.log(e))
2020-06-01 17:24:22 +00:00
}
function onSomeClicked(e){
let cl = e.target.parentNode.id;
switch(cl){
case "categories":
onCategoryClicked(e.target);
break;
2020-07-18 05:39:34 +00:00
case "secondaryCategories":
onCategoryClicked(e.target,true/* isSecondary */);
break;
2020-06-01 17:24:22 +00:00
case "targets":
onTargetClicked(e.target);
break;
default:
break;
}
}
function createCategories(){
const CAT_PARENT = document.getElementById("categories");
2020-07-18 05:39:34 +00:00
const CAT_SECOND = document.getElementById("secondaryCategories");
CAT_PARENT.addEventListener("click",onSomeClicked);
CAT_SECOND.addEventListener("click",onSomeClicked);
2020-06-01 17:24:22 +00:00
const TAR_PARENT = document.getElementById("targets");
TAR_PARENT.addEventListener("click",onSomeClicked);
const createNode = function(name,type){
let node = document.createElement("div");
node.classList.add(type);
if(type === "target"){
2020-06-05 10:01:30 +00:00
node.textContent = name.substring(0,name.lastIndexOf("."));
2020-06-01 17:24:22 +00:00
let link = node.appendChild(document.createElement("a"));
node.classList.add("hidden");
link.href = `https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/${name}`;
link.title = "See on Github";
2020-06-05 10:38:27 +00:00
link.target = "_blank";
2020-06-05 10:01:30 +00:00
}else{
2020-06-06 10:43:26 +00:00
node.textContent = name.name;
2020-07-18 05:45:02 +00:00
name.value > 0 && node.setAttribute("data-value",name.value);
2020-06-01 17:24:22 +00:00
}
return node;
}
const createCategory = name => createNode(name,"category");
const createTarget = name => createNode(name,"target");
const CAT_NAMES = (function(){
let list = [];
for(let key of Object.keys(DB)){
TAR_PARENT.appendChild(createNode(key,"target"));
let things = DB[key];
for(let t of things){
list.push(t)
}
}
list.sort();
let ret = [];
let ns = [0];
ret[0] = list[0];
let i = 0;
for(let item of list){
if(ret[i]!=item){
ret[++i]=item;
ns[i]=0;
}else{
2020-06-05 06:48:56 +00:00
ns[i] += (item === "legacy" ? -1 : 1);
2020-06-01 17:24:22 +00:00
}
}
2020-07-18 05:45:02 +00:00
let map = ret.map((a,i)=>({name:a,value:ns[i]+1}))
2020-06-06 10:43:26 +00:00
return map
//return map.sort((a,b)=>(a.value > b.value?-1:a.value < b.value ? 1:0))
2020-06-01 17:24:22 +00:00
})();
for(let cat of CAT_NAMES){
2020-06-06 10:43:26 +00:00
// CAT_PARENT.appendChild(createCategory(cat.name))
2020-07-18 05:39:34 +00:00
CAT_PARENT.appendChild(createNode(cat,"category"));
CAT_SECOND.appendChild(createNode(cat,"category"));
2020-06-01 17:24:22 +00:00
}
}
document.onreadystatechange = (function () {
if (document.readyState === "complete") {
fetchWithType("html_resources/tagmap.json")
.then(response=>(initDB(response)))
.then(()=>createCategories())
.catch(e=>{console.log(e);document.getElementById("ui").textContent = "FAILURE, Database could not be loaded"});
2020-06-01 17:24:22 +00:00
}
});