Added search bar
This commit is contained in:
parent
a9dd23a52c
commit
a4ab7b6442
5 changed files with 111 additions and 13 deletions
|
|
@ -65,3 +65,16 @@ body{
|
||||||
.check.small{
|
.check.small{
|
||||||
font-size:17px;
|
font-size:17px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type="text"], input[type="password"]{
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
background: #222;
|
||||||
|
color: white;
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
font-size: 1.1em;
|
||||||
|
padding: 2px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -149,4 +149,21 @@ header #new-file .btn-svg svg {
|
||||||
.file-type[data-type="CSS"]{
|
.file-type[data-type="CSS"]{
|
||||||
color: #15a0dc
|
color: #15a0dc
|
||||||
}
|
}
|
||||||
|
.file.filtered{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search-bar-container{
|
||||||
|
margin: 8px;
|
||||||
|
}
|
||||||
|
#search-bar{
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#result-number-container{
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 20px;
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,16 +4,3 @@ main{
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"], input[type="password"]{
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
background: #222;
|
|
||||||
color: white;
|
|
||||||
outline: none;
|
|
||||||
border: none;
|
|
||||||
font-size: 1.1em;
|
|
||||||
padding: 2px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,13 @@
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</header>
|
</header>
|
||||||
|
<div id="search-bar-container">
|
||||||
|
<input id="search-bar" type="text" placeholder="Filter... term / :type / @site.tld"></input>
|
||||||
|
</div>
|
||||||
<section id="files"></section>
|
<section id="files"></section>
|
||||||
|
<div id="result-number-container">
|
||||||
|
<span id="result-number"></span>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
<script src="js/storage.js"></script>
|
<script src="js/storage.js"></script>
|
||||||
<script src="js/file.js"></script>
|
<script src="js/file.js"></script>
|
||||||
|
|
|
||||||
75
js/index.js
75
js/index.js
|
|
@ -20,6 +20,21 @@ function createFileEntry(fileObject, element){
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
function setDataset(){
|
||||||
|
file.dataset.id = info.id;
|
||||||
|
file.dataset.type = info.type;
|
||||||
|
file.dataset.enabled = info.enabled;
|
||||||
|
file.dataset.name = info.name;
|
||||||
|
file.dataset.links = info.links ? file.dataset.links = info.links.map(url => {
|
||||||
|
try{
|
||||||
|
return (new URL(url)).hostname;
|
||||||
|
}catch(exc){
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}).join(" ") : "";
|
||||||
|
}
|
||||||
|
setDataset();
|
||||||
|
|
||||||
let fileName = file.querySelector(".file-name");
|
let fileName = file.querySelector(".file-name");
|
||||||
let fileType = file.querySelector(".file-type");
|
let fileType = file.querySelector(".file-type");
|
||||||
let fileEnable = file.querySelector("input");
|
let fileEnable = file.querySelector("input");
|
||||||
|
|
@ -50,6 +65,7 @@ function createFileEntry(fileObject, element){
|
||||||
fileObject.onChange = function(info){
|
fileObject.onChange = function(info){
|
||||||
fileEnable.checked = info.enabled;
|
fileEnable.checked = info.enabled;
|
||||||
fileName.textContent = info.name;
|
fileName.textContent = info.name;
|
||||||
|
setDataset();
|
||||||
}
|
}
|
||||||
|
|
||||||
function edit(){
|
function edit(){
|
||||||
|
|
@ -67,6 +83,7 @@ File.loadAll().then(function(files){
|
||||||
for(let i=0;i<files.length;i++){
|
for(let i=0;i<files.length;i++){
|
||||||
createFileEntry(files[i], filesElement);
|
createFileEntry(files[i], filesElement);
|
||||||
}
|
}
|
||||||
|
updateSearchBarResults(searchBar.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
let newFileJS = document.getElementById("new-js");
|
let newFileJS = document.getElementById("new-js");
|
||||||
|
|
@ -147,3 +164,61 @@ inputFile.addEventListener("change", () => {
|
||||||
|
|
||||||
let newFileUp = document.getElementById("new-up");
|
let newFileUp = document.getElementById("new-up");
|
||||||
newFileUp.addEventListener("click", () => { inputFile.click(); });
|
newFileUp.addEventListener("click", () => { inputFile.click(); });
|
||||||
|
|
||||||
|
const resultNumberSpan = document.querySelector("#result-number");
|
||||||
|
function updateSearchBarResults(query){
|
||||||
|
let q = query.toLowerCase();
|
||||||
|
let siteFilters = [];
|
||||||
|
let typeFilters = [];
|
||||||
|
function parseTag(regex){
|
||||||
|
const match = q.match(regex);
|
||||||
|
if(match){
|
||||||
|
q = q.replace(regex, "").trim();
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
do{
|
||||||
|
var siteFilter = parseTag(/\B@((\w+\.)*\w+\.\w+)\b/g).pop();
|
||||||
|
if(siteFilter)
|
||||||
|
siteFilters.push(siteFilter.slice(1));
|
||||||
|
var typeFilter = parseTag(/\B:(JS|CSS)\b/i).pop();
|
||||||
|
if(typeFilter)
|
||||||
|
typeFilters.push(typeFilter);
|
||||||
|
} while(siteFilter || typeFilter);
|
||||||
|
|
||||||
|
fileLoop: for(file of filesElement.querySelectorAll(".file")){
|
||||||
|
file.classList.remove("filtered");
|
||||||
|
if(query.length > 0){
|
||||||
|
const links = file.dataset.links.toLowerCase();
|
||||||
|
const type = file.dataset.type.toLowerCase();
|
||||||
|
for(siteFilter of siteFilters){
|
||||||
|
if(!links.includes(siteFilter)){
|
||||||
|
file.classList.add("filtered");
|
||||||
|
continue fileLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(typeFilter of typeFilters){
|
||||||
|
if(type !== typeFilter){
|
||||||
|
file.classList.add("filtered");
|
||||||
|
continue fileLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!file.dataset.name.toLowerCase().includes(q))
|
||||||
|
file.classList.add("filtered");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const nHidden = filesElement.querySelectorAll(".file.filtered").length;
|
||||||
|
const nVisible = filesElement.querySelectorAll(".file:not(.filtered)").length;
|
||||||
|
if(nVisible == 0 && nHidden == 0)
|
||||||
|
resultNumberSpan.innerText = "Nothing here ¯\_(ツ)_/¯";
|
||||||
|
else if(nHidden > 0)
|
||||||
|
resultNumberSpan.innerText = `( ${nHidden} filtered )`;
|
||||||
|
else
|
||||||
|
resultNumberSpan.innerText = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchBar = document.querySelector("#search-bar");
|
||||||
|
searchBar.addEventListener("input", ev => updateSearchBarResults(searchBar.value));
|
||||||
|
chrome.storage.onChanged.addListener(() => updateSearchBarResults(searchBar.value));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue