diff --git a/cmd/serve.go b/cmd/serve.go index 745fda7d..dd45f521 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -153,12 +153,17 @@ func apiLogin(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { } func apiGetBookmarks(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Get query parameter + keyword := r.URL.Query().Get("keyword") + strTags := r.URL.Query().Get("tags") + tags := strings.Fields(strTags) + // Check token err := checkAPIToken(r) checkError(err) // Fetch all bookmarks - bookmarks, err := DB.GetBookmarks(false) + bookmarks, err := DB.SearchBookmarks(keyword, tags...) checkError(err) err = json.NewEncoder(w).Encode(&bookmarks) diff --git a/view/css/stylesheet.css b/view/css/stylesheet.css index f7628e97..07cdca73 100644 --- a/view/css/stylesheet.css +++ b/view/css/stylesheet.css @@ -1 +1 @@ -.header-link{border-right:1px solid #E5E5E5;color:#000;cursor:pointer;font-size:.9em;line-height:70px;overflow:hidden;padding:0 16px}.header-link:hover{color:#F44336}*{border-width:0;box-sizing:border-box;font-family:"Source Sans Pro",sans-serif;margin:0;padding:0;text-decoration:none}.spacer{-webkit-box-flex:1;flex:1 0}#login-page{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center;height:100vh;background-color:#F5F5F5;-webkit-box-pack:center;justify-content:center}#login-page>.error-message{width:100%;margin:16px 16px 0;max-width:400px;background-color:#FFF;border:1px solid #E5E5E5;padding:16px;text-align:center}#login-page #login-box{width:100%;margin:16px;max-width:400px;background-color:#FFF;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;border:1px solid #E5E5E5}#login-page #login-box #logo-area{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;padding:16px;border-bottom:1px solid #E5E5E5}#login-page #login-box #logo-area #logo{font-size:3em;font-weight:100;color:#F44336}#login-page #login-box #logo-area #logo span{margin-right:8px}#login-page #login-box #logo-area #tagline{font-weight:100;color:#F44336}#login-page #login-box #input-area{padding:8px;border-bottom:1px solid #E5E5E5}#login-page #login-box #input-area .input-field{display:-webkit-box;display:flex;-webkit-box-align:baseline;align-items:baseline;padding:8px}#login-page #login-box #input-area .input-field p{color:#6F757A;font-size:.9em;margin-right:16px;min-width:65px}#login-page #login-box #input-area .input-field input{color:#000;padding:8px;border:1px solid #E5E5E5;-webkit-box-flex:1;flex:1 0;font-size:.9em}#login-page #login-box #input-area .input-field a{display:block;cursor:pointer;color:#6F757A;text-align:center;font-size:.9em;-webkit-box-flex:1;flex:1 0}#login-page #login-box #input-area .input-field a i{margin-right:8px;color:#6F757A}#login-page #login-box #input-area .input-field a:hover{color:#F44336}#login-page #login-box #button-area{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:16px}#login-page #login-box #button-area a{color:#535A60;text-transform:uppercase;background-color:#FFF;-webkit-box-flex:1;flex:1 0;text-align:center}#login-page #login-box #button-area a.button{cursor:pointer}#login-page #login-box #button-area a.button:hover{color:#F44336}#main-page{background-color:#F5F5F5;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;height:auto;min-height:100vh}#main-page #header{background-color:#FFF;box-shadow:0 0 3px rgba(0,0,0,0.3);left:0;position:fixed;right:0;top:0;z-index:99;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap}#main-page #header #n-selected{line-height:70px;font-size:1.3em;color:#6F757A;-webkit-box-flex:1;flex:1 0;border-right:1px solid #E5E5E5;padding:0 32px}#main-page #header #logo{border-left:1px solid #E5E5E5;cursor:default;flex-shrink:0;border-right:1px solid #E5E5E5;color:#000;cursor:pointer;font-size:.9em;overflow:hidden;padding:0 16px;line-height:70px;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;font-size:1.5em;font-weight:100;color:#F44336}#main-page #header #logo:hover{color:#F44336}#main-page #header #logo span{margin-right:8px}#main-page #header #logo:hover{background-color:#F5F5F5}#main-page #header #search-box{-webkit-box-align:center;align-items:center;border-right:1px solid #E5E5E5;display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1 0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:16px;width:100%}#main-page #header #search-box .button,#main-page #header #search-box input{background-color:#FFF;border:1px solid #E5E5E5;color:#000;font-size:.9em;padding:8px}#main-page #header #search-box .button{cursor:pointer;color:#535A60}#main-page #header #search-box .button:hover{color:#F44336}#main-page #header #search-box input{border-right:0;-webkit-box-flex:1;flex:1 0;padding:8px 16px}#main-page #header #header-menu{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap}#main-page #header #header-menu a{line-height:70px;padding:0 16px;color:#535A60;font-size:.9em;cursor:pointer}#main-page #header #header-menu a:not(:last-child){border-right:1px solid #E5E5E5}#main-page #header #header-menu a i{margin-right:4px}#main-page #header #header-menu a:hover{color:#F44336;background-color:#F5F5F5}#main-page #main{margin-top:70px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap}#main-page #main #input-bookmark{align-self:center;max-width:600px;width:100%;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;margin:32px 8px 20px;background-color:#FFF;outline:1px solid #E5E5E5}#main-page #main #input-bookmark>p{color:#000;font-weight:600;text-transform:uppercase;padding:16px}#main-page #main #input-bookmark>p.error-message{color:#F44336;font-size:.9em;border-bottom:1px solid #E5E5E5;font-weight:500;text-transform:none}#main-page #main #input-bookmark input[type=text],#main-page #main #input-bookmark textarea{outline:1px solid #E5E5E5;color:#000;font-size:.9em;padding:12px 16px}#main-page #main #input-bookmark textarea{resize:vertical;min-height:4em;max-height:10em}#main-page #main #input-bookmark .button-area{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:8px}#main-page #main #input-bookmark .button-area a{color:#535A60;text-transform:uppercase;padding:8px;background-color:#FFF;font-size:.9em}#main-page #main #input-bookmark .button-area a.button{cursor:pointer}#main-page #main #input-bookmark .button-area a.button:hover{color:#F44336}#main-page #main #grid{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row;padding:4px}#main-page #main #grid>.column{-webkit-box-flex:1;flex:1 0;padding:12px}#main-page #main #grid>.column>*:not(:last-child){margin-bottom:24px}#main-page #main #message-bar{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column;-webkit-box-align:center;align-items:center;padding:32px;-webkit-box-pack:center;justify-content:center;position:absolute;top:50%;left:0;width:100%;margin-top:-60px;height:120px}#main-page #main #message-bar i{color:#6F757A;font-size:3em}#cache-page{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center}#cache-page a{color:#F44336}#cache-page a:visited{color:#F44336}#cache-page a:hover{text-decoration:underline}#cache-page>*{width:100%;max-width:864px}#cache-page #menu{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;max-width:864px;border-bottom:1px solid #E5E5E5}#cache-page #menu a{-webkit-box-flex:1;flex:1 0;font-size:.9em;text-align:center;color:#535A60;padding:16px;cursor:pointer}#cache-page #menu a i{margin-right:4px}#cache-page #menu a:not(:last-child){border-right:1px solid #E5E5E5}#cache-page #menu a:visited{color:#535A60}#cache-page #menu a:hover{color:#F44336;text-decoration:none}#cache-page #metadata{padding:32px;border-bottom:1px solid #E5E5E5}#cache-page #metadata a{font-size:.9em;display:block}#cache-page #metadata h3{font-size:2em;margin:8px 0}#cache-page #metadata p{font-size:.9em;color:#000}#cache-page #content{padding:16px 32px 32px}#cache-page #content *{margin-top:16px;line-height:180%;overflow:auto}#cache-page #content pre,#cache-page #content code{font-family:'Ubuntu Mono','Courier New',Courier,monospace}#cache-page.dark-mode{background-color:#222;color:white}#cache-page.dark-mode #menu a{color:white}#cache-page.dark-mode #menu a:visited{color:white}#cache-page.dark-mode #menu a:hover{color:#F44336;text-decoration:none}#cache-page.dark-mode #metadata p{color:white}#dialog-overlay{position:fixed;z-index:101;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column;background-color:rgba(0,0,0,0.5);top:0;left:0;right:0;bottom:0;overflow:hidden;-webkit-box-pack:center;justify-content:center;padding:32px}#dialog-overlay #dialog{display:-webkit-box;display:flex;background-color:#FFF;align-self:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column;border:1px solid #E5E5E5;max-width:500px}#dialog-overlay #dialog #dialog-title{color:#000;font-weight:600;text-transform:uppercase;padding:16px;font-size:1em;border-bottom:1px solid #E5E5E5}#dialog-overlay #dialog #dialog-content{padding:16px}#dialog-overlay #dialog #dialog-button{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:8px;border-top:1px solid #E5E5E5}#dialog-overlay #dialog #dialog-button a{color:#535A60;text-transform:uppercase;padding:8px;background-color:#FFF}#dialog-overlay #dialog #dialog-button a.button{cursor:pointer}#dialog-overlay #dialog #dialog-button a.button:not(:last-child){margin-right:16px}#dialog-overlay #dialog #dialog-button a.button:hover{color:#F44336}.error-message{color:#F44336 !important;font-size:.9em}.error-message::before{content:"\f071";font-weight:900;margin-right:8px;font-family:"Font Awesome 5 Free"}.bookmark{background-color:#FFF;border:1px solid #E5E5E5;position:relative}.bookmark .checkbox{z-index:9;right:0;opacity:0;position:absolute;outline:1px solid #E5E5E5;color:#535A60;background-color:#FFF;width:32px;line-height:32px;text-align:center;display:block;cursor:pointer;font-size:.9em}.bookmark .checkbox:hover{color:#F44336 !important}.bookmark .bookmark-metadata{padding:16px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;border-bottom:1px solid #E5E5E5}.bookmark .bookmark-metadata .bookmark-time{color:#6F757A;font-size:.9em;margin-bottom:8px}.bookmark .bookmark-metadata .bookmark-title{color:#000;font-size:1.3em;font-weight:600}.bookmark .bookmark-metadata .bookmark-url{color:#6F757A;font-size:.9em;margin-bottom:8px;margin-bottom:0;margin-top:8px;max-height:2.6em;line-height:1.3em;text-overflow:ellipsis;overflow:hidden}.bookmark .bookmark-metadata.has-image{min-height:250px;background-position:center;background-repeat:no-repeat;background-size:cover;-webkit-box-pack:end;justify-content:flex-end;position:relative}.bookmark .bookmark-metadata.has-image::before{content:"";background-color:rgba(0,0,0,0.5);position:absolute;top:0;left:0;right:0;bottom:0;z-index:0}.bookmark .bookmark-metadata.has-image .bookmark-time,.bookmark .bookmark-metadata.has-image .bookmark-url{z-index:2;color:white;text-shadow:1px 1px 1px rgba(0,0,0,0.5)}.bookmark .bookmark-metadata.has-image .bookmark-title{z-index:2;color:white;text-shadow:1px 1px 1px rgba(0,0,0,0.5)}.bookmark .bookmark-metadata:hover .bookmark-title{text-decoration:underline}.bookmark .bookmark-excerpt{padding:16px 16px 0;color:#000}.bookmark .bookmark-tags{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;padding:12px 12px 0;margin-bottom:-4px}.bookmark .bookmark-tags a{cursor:pointer;font-size:.9em;padding:4px;color:#F44336 !important}.bookmark .bookmark-tags a::before{content:"#"}.bookmark .bookmark-tags a:hover{text-decoration:underline}.bookmark .bookmark-menu{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;border-top:1px solid #E5E5E5;visibility:hidden;margin-top:16px}.bookmark .bookmark-menu a{cursor:pointer;display:block;-webkit-box-flex:1;flex:1 0;color:#535A60 !important;padding:8px;font-size:.9em;text-align:center}.bookmark .bookmark-menu a i{margin-right:4px}.bookmark .bookmark-menu a:not(:last-child){border-right:1px solid #E5E5E5}.bookmark .bookmark-menu a:hover{color:#F44336 !important}.bookmark:hover .checkbox{opacity:1}.bookmark:hover .bookmark-menu{visibility:visible}.bookmark.checked{border:1px solid #9E9E9E;outline:6px solid #9E9E9E}.bookmark.checked .checkbox{opacity:1;outline:0;background-color:#9E9E9E;color:white} \ No newline at end of file +.header-link{border-right:1px solid #E5E5E5;color:#000;cursor:pointer;font-size:.9em;line-height:70px;overflow:hidden;padding:0 16px}.header-link:hover{color:#F44336}*{border-width:0;box-sizing:border-box;font-family:"Source Sans Pro",sans-serif;margin:0;padding:0;text-decoration:none}.spacer{-webkit-box-flex:1;flex:1 0}#login-page{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center;height:100vh;background-color:#F5F5F5;-webkit-box-pack:center;justify-content:center}#login-page>.error-message{width:100%;margin:16px 16px 0;max-width:400px;background-color:#FFF;border:1px solid #E5E5E5;padding:16px;text-align:center}#login-page #login-box{width:100%;margin:16px;max-width:400px;background-color:#FFF;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;border:1px solid #E5E5E5}#login-page #login-box #logo-area{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;padding:16px;border-bottom:1px solid #E5E5E5}#login-page #login-box #logo-area #logo{font-size:3em;font-weight:100;color:#F44336}#login-page #login-box #logo-area #logo span{margin-right:8px}#login-page #login-box #logo-area #tagline{font-weight:100;color:#F44336}#login-page #login-box #input-area{padding:8px;border-bottom:1px solid #E5E5E5}#login-page #login-box #input-area .input-field{display:-webkit-box;display:flex;-webkit-box-align:baseline;align-items:baseline;padding:8px}#login-page #login-box #input-area .input-field p{color:#6F757A;font-size:.9em;margin-right:16px;min-width:65px}#login-page #login-box #input-area .input-field input{color:#000;padding:8px;border:1px solid #E5E5E5;-webkit-box-flex:1;flex:1 0;font-size:.9em}#login-page #login-box #input-area .input-field a{display:block;cursor:pointer;color:#6F757A;text-align:center;font-size:.9em;-webkit-box-flex:1;flex:1 0}#login-page #login-box #input-area .input-field a i{margin-right:8px;color:#6F757A}#login-page #login-box #input-area .input-field a:hover{color:#F44336}#login-page #login-box #button-area{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:16px}#login-page #login-box #button-area a{color:#535A60;text-transform:uppercase;background-color:#FFF;-webkit-box-flex:1;flex:1 0;text-align:center}#login-page #login-box #button-area a.button{cursor:pointer}#login-page #login-box #button-area a.button:hover{color:#F44336}#main-page{background-color:#F5F5F5;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;height:auto;min-height:100vh}#main-page #header{background-color:#FFF;box-shadow:0 0 3px rgba(0,0,0,0.3);left:0;position:fixed;right:0;top:0;z-index:99;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap}#main-page #header #n-selected{line-height:70px;font-size:1.3em;color:#6F757A;-webkit-box-flex:1;flex:1 0;border-right:1px solid #E5E5E5;padding:0 32px}#main-page #header #logo{border-left:1px solid #E5E5E5;cursor:default;flex-shrink:0;border-right:1px solid #E5E5E5;color:#000;cursor:pointer;font-size:.9em;overflow:hidden;padding:0 16px;line-height:70px;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;font-size:1.5em;font-weight:100;color:#F44336}#main-page #header #logo:hover{color:#F44336}#main-page #header #logo span{margin-right:8px}#main-page #header #logo:hover{background-color:#F5F5F5}#main-page #header #search-box{-webkit-box-align:center;align-items:center;border-right:1px solid #E5E5E5;display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1 0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:16px;width:100%}#main-page #header #search-box .button,#main-page #header #search-box input{background-color:#FFF;border:1px solid #E5E5E5;color:#000;font-size:.9em;padding:8px}#main-page #header #search-box .button{cursor:pointer;color:#535A60}#main-page #header #search-box .button:hover{color:#F44336}#main-page #header #search-box input{border-right:0;-webkit-box-flex:1;flex:1 0;padding:8px 16px}#main-page #header #header-menu{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap}#main-page #header #header-menu a{line-height:70px;padding:0 16px;color:#535A60;font-size:.9em;cursor:pointer}#main-page #header #header-menu a:not(:last-child){border-right:1px solid #E5E5E5}#main-page #header #header-menu a i{margin-right:4px}#main-page #header #header-menu a:hover{color:#F44336;background-color:#F5F5F5}#main-page #main{margin-top:70px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap}#main-page #main #input-bookmark{align-self:center;max-width:600px;width:100%;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;margin:32px 8px 20px;background-color:#FFF;outline:1px solid #E5E5E5}#main-page #main #input-bookmark>p{color:#000;font-weight:600;text-transform:uppercase;padding:16px}#main-page #main #input-bookmark>p.error-message{color:#F44336;font-size:.9em;border-bottom:1px solid #E5E5E5;font-weight:500;text-transform:none}#main-page #main #input-bookmark input[type=text],#main-page #main #input-bookmark textarea{outline:1px solid #E5E5E5;color:#000;font-size:.9em;padding:12px 16px}#main-page #main #input-bookmark textarea{resize:vertical;min-height:4em;max-height:10em}#main-page #main #input-bookmark .button-area{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:8px}#main-page #main #input-bookmark .button-area a{color:#535A60;text-transform:uppercase;padding:8px;background-color:#FFF;font-size:.9em}#main-page #main #input-bookmark .button-area a.button{cursor:pointer}#main-page #main #input-bookmark .button-area a.button:hover{color:#F44336}#main-page #main #search-parameter{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;padding:0 8px}#main-page #main #search-parameter a{display:block;margin:8px;padding:8px;font-size:.9em;background-color:#6F757A;color:white;border-radius:16px;cursor:pointer}#main-page #main #search-parameter a:hover{background-color:#F44336;text-decoration:line-through}#main-page #main #grid{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row;padding:4px}#main-page #main #grid>.column{-webkit-box-flex:1;flex:1 0;padding:12px}#main-page #main #grid>.column>*:not(:last-child){margin-bottom:24px}#main-page #main #message-bar{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column;-webkit-box-align:center;align-items:center;padding:32px;-webkit-box-pack:center;justify-content:center;position:absolute;top:50%;left:0;width:100%;margin-top:-60px;height:120px}#main-page #main #message-bar i{color:#6F757A;font-size:3em}#cache-page{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center;height:auto;min-height:100vh}#cache-page a{color:#F44336}#cache-page a:visited{color:#F44336}#cache-page a:hover{text-decoration:underline}#cache-page>*{width:100%;max-width:864px}#cache-page #menu{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;max-width:864px;border-bottom:1px solid #E5E5E5}#cache-page #menu a{-webkit-box-flex:1;flex:1 0;font-size:.9em;text-align:center;color:#535A60;padding:16px;cursor:pointer}#cache-page #menu a i{margin-right:4px}#cache-page #menu a:not(:last-child){border-right:1px solid #E5E5E5}#cache-page #menu a:visited{color:#535A60}#cache-page #menu a:hover{color:#F44336;text-decoration:none}#cache-page #metadata{padding:32px;border-bottom:1px solid #E5E5E5}#cache-page #metadata a{font-size:.9em;display:block}#cache-page #metadata h3{font-size:2em;margin:8px 0}#cache-page #metadata p{font-size:.9em;color:#000}#cache-page #content{padding:16px 32px 32px}#cache-page #content *{margin-top:16px;line-height:180%;overflow:auto}#cache-page #content pre,#cache-page #content code{font-family:'Ubuntu Mono','Courier New',Courier,monospace}#cache-page.dark-mode{background-color:#222;color:white}#cache-page.dark-mode #menu a{color:white}#cache-page.dark-mode #menu a:visited{color:white}#cache-page.dark-mode #menu a:hover{color:#F44336;text-decoration:none}#cache-page.dark-mode #metadata p{color:white}#dialog-overlay{position:fixed;z-index:101;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column;background-color:rgba(0,0,0,0.5);top:0;left:0;right:0;bottom:0;overflow:hidden;-webkit-box-pack:center;justify-content:center;padding:32px}#dialog-overlay #dialog{display:-webkit-box;display:flex;background-color:#FFF;align-self:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column;border:1px solid #E5E5E5;max-width:500px}#dialog-overlay #dialog #dialog-title{color:#000;font-weight:600;text-transform:uppercase;padding:16px;font-size:1em;border-bottom:1px solid #E5E5E5}#dialog-overlay #dialog #dialog-content{padding:16px}#dialog-overlay #dialog #dialog-button{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:8px;border-top:1px solid #E5E5E5}#dialog-overlay #dialog #dialog-button a{color:#535A60;text-transform:uppercase;padding:8px;background-color:#FFF}#dialog-overlay #dialog #dialog-button a.button{cursor:pointer}#dialog-overlay #dialog #dialog-button a.button:not(:last-child){margin-right:16px}#dialog-overlay #dialog #dialog-button a.button:hover{color:#F44336}.error-message{color:#F44336 !important;font-size:.9em}.error-message::before{content:"\f071";font-weight:900;margin-right:8px;font-family:"Font Awesome 5 Free"}.bookmark{background-color:#FFF;border:1px solid #E5E5E5;position:relative}.bookmark .checkbox{z-index:9;right:0;opacity:0;position:absolute;outline:1px solid #E5E5E5;color:#535A60;background-color:#FFF;width:32px;line-height:32px;text-align:center;display:block;cursor:pointer;font-size:.9em}.bookmark .checkbox:hover{color:#F44336 !important}.bookmark .bookmark-metadata{padding:16px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;border-bottom:1px solid #E5E5E5}.bookmark .bookmark-metadata .bookmark-time{color:#6F757A;font-size:.9em;margin-bottom:8px}.bookmark .bookmark-metadata .bookmark-title{color:#000;font-size:1.3em;font-weight:600}.bookmark .bookmark-metadata .bookmark-url{color:#6F757A;font-size:.9em;margin-bottom:8px;margin-bottom:0;margin-top:8px;max-height:2.6em;line-height:1.3em;text-overflow:ellipsis;overflow:hidden}.bookmark .bookmark-metadata.has-image{min-height:250px;background-position:center;background-repeat:no-repeat;background-size:cover;-webkit-box-pack:end;justify-content:flex-end;position:relative}.bookmark .bookmark-metadata.has-image::before{content:"";background-color:rgba(0,0,0,0.5);position:absolute;top:0;left:0;right:0;bottom:0;z-index:0}.bookmark .bookmark-metadata.has-image .bookmark-time,.bookmark .bookmark-metadata.has-image .bookmark-url{z-index:2;color:white;text-shadow:1px 1px 1px rgba(0,0,0,0.5)}.bookmark .bookmark-metadata.has-image .bookmark-title{z-index:2;color:white;text-shadow:1px 1px 1px rgba(0,0,0,0.5)}.bookmark .bookmark-metadata:hover .bookmark-title{text-decoration:underline}.bookmark .bookmark-excerpt{padding:16px 16px 0;color:#000}.bookmark .bookmark-tags{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;padding:12px 12px 0;margin-bottom:-4px}.bookmark .bookmark-tags a{cursor:pointer;font-size:.9em;padding:4px;color:#F44336 !important}.bookmark .bookmark-tags a::before{content:"#"}.bookmark .bookmark-tags a:hover{text-decoration:underline}.bookmark .bookmark-menu{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;border-top:1px solid #E5E5E5;visibility:hidden;margin-top:16px}.bookmark .bookmark-menu a{cursor:pointer;display:block;-webkit-box-flex:1;flex:1 0;color:#535A60 !important;padding:8px;font-size:.9em;text-align:center}.bookmark .bookmark-menu a i{margin-right:4px}.bookmark .bookmark-menu a:not(:last-child){border-right:1px solid #E5E5E5}.bookmark .bookmark-menu a:hover{color:#F44336 !important}.bookmark:hover .checkbox{opacity:1}.bookmark:hover .bookmark-menu{visibility:visible}.bookmark.checked{border:1px solid #9E9E9E;outline:6px solid #9E9E9E}.bookmark.checked .checkbox{opacity:1;outline:0;background-color:#9E9E9E;color:white} \ No newline at end of file diff --git a/view/index.html b/view/index.html index e409bc28..2d391b9c 100644 --- a/view/index.html +++ b/view/index.html @@ -21,13 +21,13 @@
- + Reload @@ -75,6 +75,10 @@
+
+ {{search.keyword}} + #{{tag}} +
@@ -142,10 +146,15 @@ data: { windowWidth: 0, error: "", - loading: true, + loading: false, bookmarks: [], checkedBookmarks: [], showImage: true, + search: { + query: "", + keyword: "", + tags: [] + }, inputBookmark: { index: -1, id: -1, @@ -169,10 +178,40 @@ } }, methods: { + removeSearchParam: function (param) { + if (this.loading) return; + this.search.query = this.search.query.replace(param, ' ').trim().replace(/\s+/g, ' '); + this.loadData(); + }, + reloadData: function () { + if (this.loading) return; + this.search.query = ''; + this.loadData(); + }, loadData: function () { + if (this.loading) return; + + // Parse search query + var rxTags = /(^|\s+)#(\S+)/g, + tags = []; + + while ((result = rxTags.exec(this.search.query)) !== null) { + tags.push(result[2]); + } + + var keyword = this.search.query.replace(/(^|\s+)#(\S+)/g, ' ').trim().replace(/\s+/g, ' '); + + // Fetch data this.error = ''; this.loading = true; - instance.get('/api/bookmarks') + this.search.tags = tags; + this.search.keyword = keyword; + instance.get('/api/bookmarks', { + params: { + keyword: this.search.keyword, + tags: this.search.tags.join(" ") + } + }) .then(function (response) { app.loading = false; app.bookmarks = response.data; @@ -460,7 +499,7 @@ } return finalContent; - } + }, }, watch: { 'inputBookmark.url': function (newURL) { diff --git a/view/less/stylesheet.less b/view/less/stylesheet.less index 246d9461..912bd195 100644 --- a/view/less/stylesheet.less +++ b/view/less/stylesheet.less @@ -263,6 +263,25 @@ } } } + #search-parameter { + display: flex; + flex-flow: row wrap; + padding: 0 8px; + a { + display: block; + margin: 8px; + padding: 8px; + font-size: 0.9em; + background-color: @fontLightColor; + color: white; + border-radius: 16px; + cursor: pointer; + &:hover { + background-color: @main; + text-decoration: line-through; + } + } + } #grid { display: flex; flex-flow: row; @@ -299,6 +318,8 @@ display: flex; flex-flow: column nowrap; align-items: center; + height: auto; + min-height: 100vh; a { color: @main; &:visited { diff --git a/view/login.html b/view/login.html index 3200b5cf..e9a33ba8 100644 --- a/view/login.html +++ b/view/login.html @@ -31,7 +31,7 @@

Password:

- +