From a738998c2cf09733e136095ccdee13148af320eb Mon Sep 17 00:00:00 2001 From: Jai A Date: Mon, 11 May 2020 22:53:08 -0700 Subject: [PATCH] Badges + Refactoring --- src/main.rs | 27 ++++++- static/css/main.css | 49 +++++++++++++ static/css/multiselect.css | 122 ------------------------------- static/css/search.css | 102 ++++++++++++++++++++++++++ static/css/style.css | 48 ------------ static/images/icon/adventure.svg | 1 + static/images/icon/download.svg | 2 + static/images/icon/fabric.png | Bin 0 -> 5867 bytes static/images/icon/forge.jpg | Bin 0 -> 5557 bytes static/images/icon/magic.svg | 94 ++++++++++++++++++++++++ static/images/icon/tech.svg | 2 + static/images/icon/util.svg | 1 + static/js/multiselect.min.js | 44 ----------- templates/search.hbs | 79 +++++++++++++++----- 14 files changed, 337 insertions(+), 234 deletions(-) create mode 100644 static/css/main.css delete mode 100644 static/css/multiselect.css create mode 100644 static/css/search.css delete mode 100644 static/css/style.css create mode 100644 static/images/icon/adventure.svg create mode 100644 static/images/icon/download.svg create mode 100644 static/images/icon/fabric.png create mode 100644 static/images/icon/forge.jpg create mode 100644 static/images/icon/magic.svg create mode 100644 static/images/icon/tech.svg create mode 100644 static/images/icon/util.svg delete mode 100644 static/js/multiselect.min.js diff --git a/src/main.rs b/src/main.rs index 39b95bebf..d04e1c96b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,16 +2,34 @@ extern crate serde_json; use actix_web::{web, web::Data, App, HttpRequest, HttpResponse, HttpServer, Responder, get, post}; -use handlebars::Handlebars; +use handlebars::*; use meilisearch_sdk::{document::*, indexes::*, client::*, search::*}; use serde::{Serialize, Deserialize}; use actix_files as fs; +#[derive(Clone, Copy)] +struct ContainsHelper; + +impl HelperDef for ContainsHelper { + fn call<'reg: 'rc, 'rc>(&self, h: &Helper<'reg, 'rc>, r: &'reg Handlebars<'_>, ctx: &'rc Context, rc: &mut RenderContext<'reg, 'rc>, out: &mut dyn Output) -> HelperResult { + let array = h.param(0).map(|v| serde_json::from_value::>(v.value().clone()).unwrap()).ok_or(RenderError::new("Parameter not found!"))?; + let mut value = h.param(1).map(|v| v.value().as_str().unwrap()).ok_or(RenderError::new("Parameter not found!"))?; + + let tmpl = if array.contains(&String::from(value)) { h.template() } else { h.inverse() }; + + match tmpl { + Some(ref t) => t.render(r, ctx, rc, out), + None => Ok(()), + } + } +} + #[derive(Serialize, Deserialize, Debug)] struct Mod { mod_id: usize, title: String, description: String, + keywords: Vec, } impl Document for Mod { @@ -90,9 +108,12 @@ async fn index(hb: web::Data>) -> HttpResponse { async fn main() -> std::io::Result<()> { //Handlebars let mut handlebars = Handlebars::new(); + + handlebars.register_helper("contains", Box::new(ContainsHelper)); handlebars .register_templates_directory(".hbs", "./templates") .unwrap(); + let handlebars_ref = web::Data::new(handlebars); //Search @@ -105,21 +126,25 @@ async fn main() -> std::io::Result<()> { mod_id: 0, title: String::from("Magic Mod"), description: String::from("An illustrious magic mod for magical wizards"), + keywords: vec![String::from("Fabric"), String::from("Magic")], }, Mod { mod_id: 1, title: String::from("Tech Mod"), description: String::from("An technological mod for complete NERDS"), + keywords: vec![String::from("Fabric"), String::from("Utility"), String::from("Technology")], }, Mod { mod_id: 2, title: String::from("Hood Mod"), description: String::from("A hood mod to roleplay as if you were a real street person. Some adventure stuff too"), + keywords: vec![String::from("Forge"), String::from("Adventure"), String::from("Technology")] }, Mod { mod_id: 3, title: String::from("Adventure Mod"), description: String::from("An epic gamer adventure mod for epic adventure gamers"), + keywords: vec![String::from("Forge"), String::from("Magic"), String::from("Adventure")] }, ], Some("mod_id")).unwrap(); diff --git a/static/css/main.css b/static/css/main.css new file mode 100644 index 000000000..58f4ad02d --- /dev/null +++ b/static/css/main.css @@ -0,0 +1,49 @@ +@import url('https://fonts.googleapis.com/css?family=Montserrat:400,600'); + +body { + margin: 0; + font-family: 'Montserrat', sans-serif; +} + +.temp-circle-logo { + height: 50px; + width: 50px; + background-color: white; + border-radius: 50%; + display: inline-block; + margin-left: 20%; +} + +.site-header { + position: sticky; + background-color: black; + width: 100%; + height: 75px; + margin-bottom: 10px; + display: flex; + align-items: center; +} + +.site-header h2 { + color: white; + font-weight: bolder; + padding: 0 20px 0 10px; +} + +.links-container { + margin: 0 auto; +} +.links-container a { + color: white; + padding: 0 30px; + text-decoration: none; +} + +.rounded-border { + border-radius: 10px; + border: 1px; +} + +.gray-border { + border: 1px solid darkgray; +} \ No newline at end of file diff --git a/static/css/multiselect.css b/static/css/multiselect.css deleted file mode 100644 index 5d9c5f5e5..000000000 --- a/static/css/multiselect.css +++ /dev/null @@ -1,122 +0,0 @@ -.multiselect-wrapper { - width: 180px; - display: inline-block; - white-space: nowrap; - font-size: 12px; - font-family: "Segoe UI", Verdana, Helvetica, Sans-Serif; -} - -.multiselect-wrapper .multiselect-input { - width: 100%; - padding-right: 50px; -} - -.multiselect-wrapper label { - display: block; - font-size: 12px; - font-weight : 600; -} - -.multiselect-wrapper .multiselect-list { - z-index: 1; - position: absolute; - display: none; - background-color: white; - border: 1px solid grey; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - margin-top: -2px; -} - -.multiselect-wrapper .multiselect-list.active { - display: block; -} - -.multiselect-wrapper .multiselect-list > span { - font-weight: bold; -} - -.multiselect-wrapper .multiselect-list .multiselect-checkbox { - margin-right: 2px; -} - -.multiselect-wrapper .multiselect-list > span, -.multiselect-wrapper .multiselect-list li { - cursor: default; -} - -.multiselect-wrapper .multiselect-list { - padding: 5px; - min-width: 200px; -} - -.multiselect-wrapper ul { - list-style: none; - display: block; - position: relative; - padding: 0px; - margin: 0px; - max-height: 200px; - overflow-y: auto; - overflow-x: hidden; -} - -.multiselect-wrapper ul li { - padding-right: 20px; - display: block; -} - -.multiselect-wrapper ul li.active { - background-color: rgb(0, 102, 255); - color: white; -} - -.multiselect-wrapper ul li:hover { - background-color: rgb(0, 102, 255); - color: white; -} - -.multiselect-input-div { - height: 34px; -} - -.multiselect-input-div input{ - border: 1px solid #ababab; - background : #fff; - margin: 5px 0 6px 0; - padding: 5px; - vertical-align:middle; -} - -.multiselect-count { - position: relative; - text-align: center; - border-radius: 2px; - background-color: lightblue; - display: inline-block !important; - padding: 2px 7px; - left: -45px; -} - -.multiselect-wrapper.disabled .multiselect-dropdown-arrow { - border-top: 5px solid lightgray; -} - -.multiselect-wrapper.disabled .multiselect-count { - background-color: lightgray; -} - -.multiselect-dropdown-arrow { - width: 0; - height: 0; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid black; - position: absolute; - line-height: 20px; - text-align: center; - display: inline-block !important; - margin-top: 17px; - margin-left: -42px; -} - diff --git a/static/css/search.css b/static/css/search.css new file mode 100644 index 000000000..498608039 --- /dev/null +++ b/static/css/search.css @@ -0,0 +1,102 @@ +.search-container { + width: 100%; + display: flex; + align-content: center; +} + +.search-bar { + margin: 0 auto; + width: 56.25%; + height: 2em; +} + +.results { + width: 75%; + margin: auto; +} + +.result { + display: flex; + height: 100px; + margin: 30px auto; + padding: 5px; + width: 75%; + flex-direction: row; + align-items: center; +} + +.result img { + padding: 0 10px 0 5px; +} + +.result-info { + display: flex; + flex-direction: column; +} + +.result-info * { + padding: 0 5px 0 0; + margin: 0; +} + +.result-badges { + margin: 0 1em 20px auto; + align-self: center; + height: 75px; + display: flex; + flex-direction: column; +} + +.result-badge { + display: flex; + flex-direction: row; + align-items: center; + height: 25px; + margin: 2px 0; + padding: 2px 5px; + width: 155px; +} + +.result-badge img { + height: 23px; +} + +.result-badge p { + margin: 0 auto; + font-weight: bolder; +} + +.download-badge { + background-color: limegreen; + color: white; +} + +.forge-badge { + color: #e1a15a; + background-color: #1e2d44; +} + +.fabric-badge { + color: #585849; + background-color: #fffdd0; +} + +.tech-badge { + color: white; + background-color: red; +} + +.adventure-badge { + color: white; + background-color: saddlebrown; +} + +.magic-badge { + color: white; + background-color: rebeccapurple; +} + +.utility-badge { + color: white; + background-color: orangered; +} \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css deleted file mode 100644 index 83aac1803..000000000 --- a/static/css/style.css +++ /dev/null @@ -1,48 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Montserrat:400,600'); - -body { - margin: 0; - font-family: 'Montserrat', sans-serif; -} - -#categories_multiSelect { - width: 200px; -} - -.results { - width: 75%; - margin: auto; -} - -.result { - display: flex; - height: 100px; - margin: 30px auto; - padding: 5px; - width: 75%; - flex-direction: row; - align-items: center; -} - -.result img { - padding: 0 10px 0 0; -} - -.result-info { - display: flex; - flex-direction: column; -} - -.result-info * { - padding: 0 5px 0 0; - margin: 0; -} - -.rounded-border { - border-radius: 10px; - border: 1px; -} - -.gray-border { - border: 1px solid darkgray; -} \ No newline at end of file diff --git a/static/images/icon/adventure.svg b/static/images/icon/adventure.svg new file mode 100644 index 000000000..5599a1491 --- /dev/null +++ b/static/images/icon/adventure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/images/icon/download.svg b/static/images/icon/download.svg new file mode 100644 index 000000000..05d7c9bbf --- /dev/null +++ b/static/images/icon/download.svg @@ -0,0 +1,2 @@ + + diff --git a/static/images/icon/fabric.png b/static/images/icon/fabric.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab8370ff4b4de7b4ab665a6628e07b3f94cb44d GIT binary patch literal 5867 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 BTp|Df literal 0 HcmV?d00001 diff --git a/static/images/icon/forge.jpg b/static/images/icon/forge.jpg new file mode 100644 index 0000000000000000000000000000000000000000..749dba107d601a6ba0f1d94a664b17cdaf3bf7a8 GIT binary patch literal 5557 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 Io{RqeACYPi3IG5A literal 0 HcmV?d00001 diff --git a/static/images/icon/magic.svg b/static/images/icon/magic.svg new file mode 100644 index 000000000..c13c657ed --- /dev/null +++ b/static/images/icon/magic.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icon/tech.svg b/static/images/icon/tech.svg new file mode 100644 index 000000000..9f9a73ee5 --- /dev/null +++ b/static/images/icon/tech.svg @@ -0,0 +1,2 @@ + + diff --git a/static/images/icon/util.svg b/static/images/icon/util.svg new file mode 100644 index 000000000..0e4f2830d --- /dev/null +++ b/static/images/icon/util.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/js/multiselect.min.js b/static/js/multiselect.min.js deleted file mode 100644 index b2bf236e4..000000000 --- a/static/js/multiselect.min.js +++ /dev/null @@ -1,44 +0,0 @@ -if(!m_helper) -{var m_helper={removeNode:function(id){var el=document.getElementById(id);if(el){el.parentNode.removeChild(el)}},insertAfter:function(item,target){var parent=target.parentNode;if(target.nextElementSibling){parent.insertBefore(item,target.nextElementSibling)}else{parent.appendChild(item)}},hide:function(element){element.style.display='none'},hideAll:function(array){for(var i=0;i-1){window.multiselects._items.splice(index,1);window.multiselects.splice(index,1)}},select:function(val){this._toggle(val,!0)},deselect:function(val){this._toggle(val,!1)},setIsEnabled(isEnabled){if(this._isEnabled===isEnabled)return;var wrapperItem=document.getElementById(this._getIdentifier());if(isEnabled){wrapperItem.classList.remove('disabled')}else{wrapperItem.classList.add('disabled')} - m_helper.setDisabled(this._item,!isEnabled);m_helper.setDisabled(document.getElementById(this._getInputFieldIdentifier()),!isEnabled);this._isEnabled=isEnabled},_toggle:function(val,setCheck){var self=this;if(val){m_helper.each(document.getElementById(this._getIdentifier()).querySelectorAll('.multiselect-checkbox'),function(e){if(e.dataset.val==val){if(setCheck&&!e.checked){m_helper.check(e);self._onCheckBoxChange(e,self)}else if(!setCheck&&e.checked){m_helper.uncheck(e);self._onCheckBoxChange(e,self)}}});self._updateText(self)}},selectAll:function(val){var selectAllChkBox=document.querySelector('#'+this._getIdentifier()+' .multiselect-checkbox');m_helper.check(selectAllChkBox);this._onCheckBoxChange(selectAllChkBox,this);this._updateText(this)},deselectAll:function(){var selectAllChkBox=document.querySelector('#'+this._getIdentifier()+' .multiselect-checkbox');m_helper.uncheck(selectAllChkBox);this._onCheckBoxChange(selectAllChkBox,this);this._updateText(this)},_checkboxClickEvents:{},setCheckBoxClick(id,handler){if(typeof handler==="function"){this._checkboxClickEvents[id]=handler}else{console.error("Checkbox click handler for checkbox value="+id+" is not a function")} - return this},_appendEvents:function(){var self=this;document.getElementById(self._getInputFieldIdentifier()).addEventListener('focus',function(event){self._showList(self);document.getElementById(self._getInputFieldIdentifier()).value='';m_helper.each(window.multiselects,function(e){if(document.getElementById(e._getItemListIdentifier()).offsetParent&&m_helper.parent(event.target,e._getIdentifier())){e._hideList(self)}})});document.getElementById(self._getInputFieldIdentifier()).addEventListener('click',function(){self._showList(self);document.getElementById(self._getInputFieldIdentifier()).value=''});document.getElementById(self._getIdentifier()).addEventListener('click',function(event){event=event||window.event;var target=event.target||event.srcElement;if(m_helper.parent(target,self._getIdentifier())){event.stopPropagation()}});document.getElementById(self._getItemListIdentifier()).addEventListener('mouseover',function(){self._showList(self)});m_helper.each(document.getElementById(self._getIdentifier()).querySelectorAll('.multiselect-checkbox'),function(e){e.addEventListener('change',function(event){self._onCheckBoxChange(e,self,event)})});var onInput=function(){var text=this.value.toLowerCase();if(!text||text==''){m_helper.show(document.querySelector('#'+self._getItemListIdentifier()+' > span'));m_helper.show(document.querySelector('#'+self._getItemListIdentifier()+' > hr'));m_helper.showAll(document.querySelectorAll('#'+self._getItemListIdentifier()+' li'))}else{m_helper.hide(document.querySelector('#'+self._getItemListIdentifier()+' > span'));m_helper.hide(document.querySelector('#'+self._getItemListIdentifier()+' > hr'));var array=Array.prototype.filter.call(document.querySelectorAll('#'+self._getItemListIdentifier()+' li span'),function(obj){return obj.innerHTML.toLowerCase().indexOf(text)>-1});m_helper.hideAll(document.querySelectorAll('#'+self._getItemListIdentifier()+' li'));m_helper.each(array,function(e){m_helper.show(e.parentElement.parentElement)})}} - document.getElementById(self._getInputFieldIdentifier()).addEventListener('propertychange',onInput);document.getElementById(self._getInputFieldIdentifier()).addEventListener('input',onInput)},_onCheckBoxChange:function(checkbox,self,event){if(!checkbox.dataset.multiselectElement){var checkedState=self._performSelectAll(checkbox,self);if(typeof self._checkboxClickEvents.checkboxAll==="function"){self._checkboxClickEvents.checkboxAll(checkbox,{checked:checkedState})}} - else{var checkedState=self._performSelectItem(checkbox,self);if(typeof self._checkboxClickEvents[checkedState.id]==="function"){self._checkboxClickEvents[checkedState.id](checkbox,checkedState)} - self._updateSelectAll(self)} - self._forceUpdate()},_performSelectItem:function(checkbox,self){var item=JSON.parse(checkbox.dataset.multiselectElement);if(checkbox.checked){self._itemCounter++;m_helper.select(this._item.options[item.index]);m_helper.setActive(checkbox.parentElement.parentElement);return{id:item.id,checked:!0}} - self._itemCounter--;m_helper.deselect(this._item.options[item.index]);m_helper.setUnactive(checkbox.parentElement.parentElement);return{id:item.id,checked:!1}},_performSelectAll:function(checkbox,self){var items=self._getItems();if(checkbox.checked){self._itemCounter=items.length;m_helper.each(items,function(e){m_helper.setActive(e.multiselectElement.parentElement.parentElement);m_helper.select(self._item.options[e.index]);m_helper.check(e.multiselectElement)});return!0} - self._itemCounter=0;m_helper.each(items,function(e){e.multiselectElement.parentElement.parentElement.classList.remove('active');m_helper.deselect(self._item.options[e.index]);m_helper.uncheck(e.multiselectElement)});return!1},_updateSelectAll:function(self){var allChkBox=document.getElementById(self._getItemListIdentifier()).querySelector('input[type=checkbox]');if(self._itemCounter==self._getItems().length){allChkBox.checked=!0} - else if(allChkBox.checked){allChkBox.checked=!1}},_hideList:function(context,event){m_helper.setUnactive(document.getElementById(context._getItemListIdentifier()));m_helper.show(document.getElementById(context._getItemListIdentifier()).querySelector('span'));m_helper.show(document.getElementById(context._getItemListIdentifier()).querySelector('hr'));m_helper.showAll(document.getElementById(context._getItemListIdentifier()).querySelectorAll('li'));context._updateText(context);if(event) - event.stopPropagation()},_updateText:function(context){var activeItems=document.getElementById(context._getItemListIdentifier()).querySelectorAll('ul .active');if(activeItems.length>0){var val='';for(var i=0;i<(activeItems.length<5?activeItems.length:5);i++){val+=activeItems[i].innerText+", "} - val=val.substr(0,val.length-2);if(val.length>20){val=val.substr(0,17)+'...'}} - if(activeItems.length==document.getElementById(context._getItemListIdentifier()).querySelectorAll('ul li').length){val='All selected'} - document.getElementById(context._getInputFieldIdentifier()).value=val?val:''},_showList:function(context){m_helper.setActive(document.getElementById(context._getItemListIdentifier()))},_forceUpdate:function(){var badge=document.getElementById(this._getInputBadgeIdentifier());badge.style.visibility='hidden';if(this._itemCounter!=0){badge.innerHTML=this._itemCounter;badge.style.visibility='visible';var ddArrow=badge.nextElementSibling;if(this._itemCounter<10){badge.style.left='-45px';ddArrow.style.marginLeft='-42px'} - else if(this._itemCounter<100){badge.style.left='-50px';ddArrow.style.marginLeft='-47px'} - else if(this._itemCounter<1000){badge.style.left='-55px';ddArrow.style.marginLeft='-52px'} - else if(this._itemCounter<10000){badge.style.left='-60px';ddArrow.style.marginLeft='-57px'}}},_items:undefined,_itemCounter:0,_isEnabled:!0,_getItems:function(){if(this._items==undefined){var result=[];var opts=this._item.options;for(var i=0;i - - - - + + Search -

Test Mod Search

-
- - + + +
+
+ +
+ + +
-
{{#each results}}
@@ -37,14 +43,49 @@

{{this.title}}

{{this.description}}

+
+ {{#contains this.keywords "Technology"}} +
+ tech +

TECH

+
+ {{/contains}} + {{#contains this.keywords "Adventure"}} +
+ adventure +

ADVENTURE

+
+ {{/contains}} + {{#contains this.keywords "Magic"}} +
+ magic +

MAGIC

+
+ {{/contains}} + {{#contains this.keywords "Utility"}} +
+ util +

UTILITY

+
+ {{/contains}} + {{#contains this.keywords "Forge"}} +
+ forge +

FORGE

+
+ {{/contains}} + {{#contains this.keywords "Fabric"}} +
+ fabric +

FABRIC

+
+ {{/contains}} +
{{/each}} -