diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace index ab22af651f5f4fde3e73eedba2a754c90b49bbb6..e7e2fa383ec69f429e95d1be2613a518f6eface1 100644 --- a/ma-impl.sublime-workspace +++ b/ma-impl.sublime-workspace @@ -279,6 +279,30 @@ }, "buffers": [ + { + "file": "vipra-ui/app/templates/index.hbs", + "settings": + { + "buffer_size": 1530, + "line_ending": "Unix" + } + }, + { + "file": "vipra-ui/app/styles/app.scss", + "settings": + { + "buffer_size": 914, + "line_ending": "Unix" + } + }, + { + "file": "vipra-ui/app/adapters/application.js", + "settings": + { + "buffer_size": 506, + "line_ending": "Unix" + } + } ], "build_system": "", "build_system_choices": @@ -462,33 +486,48 @@ "/home/eike/repos/master/ma-impl/vipra-ui/app", "/home/eike/repos/master/ma-impl/vipra-ui/app/adapters", "/home/eike/repos/master/ma-impl/vipra-ui/app/components", - "/home/eike/repos/master/ma-impl/vipra-ui/app/helpers", + "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/articles", + "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/topics", + "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words", + "/home/eike/repos/master/ma-impl/vipra-ui/app/models", "/home/eike/repos/master/ma-impl/vipra-ui/app/routes", - "/home/eike/repos/master/ma-impl/vipra-ui/app/templates" + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words", + "/home/eike/repos/master/ma-impl/vipra-ui/app/styles", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words" ], "file_history": [ + "/home/eike/repos/master/ma-impl/vipra-ui/app/models/search.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/index.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/index.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/components/debounced-input.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/articles/index.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/application.hbs", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/index.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words/index.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words/index.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/index.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs", + "/home/eike/repos/master/ma-impl/vipra-ui/app/models/word.js", "/home/eike/Downloads/files.txt", - "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/application.hbs", "/home/eike/repos/master/ma-impl/vipra-ui/app/components/pagination-bar.js", "/home/eike/.cache/.fr-kZOCSD/META-INF/MANIFEST.MF", "/home/eike/repos/master/ma-impl/Vagrantfile", - "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/index.js", - "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words/index.js", - "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/index.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/index.hbs", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/index.hbs", "/home/eike/repos/master/ma-impl/vipra-ui/app/components/items-list.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/items-list.hbs", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words/index.hbs", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/pagination-bar.hbs", - "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words/index.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/adapters/application.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.scss", "/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/is-empty.js", - "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/index.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/models/import.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/router.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/styles/sticky-footer.scss", @@ -515,7 +554,6 @@ "/home/eike/repos/master/ma-impl/vipra-ui/app/index.html", "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words/show.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words/show.hbs", - "/home/eike/repos/master/ma-impl/vipra-ui/app/models/word.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words", "/home/eike/repos/master/ma-impl/vipra-ui/app/models/topic.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/models/article.js", @@ -591,11 +629,7 @@ "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/articles/list.hbs", "/home/eike/Repositories/fu/ss15/ma/impl/vm/bootstrap.sh", "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/adapters/application.js", - "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/routes/articles/list.js", - "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/articles/show.hbs", - "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/components/filter-text.js", - "/home/eike/Repositories/fu/ss15/ma/impl/vm/webapps/test/index.html", - "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/controllers/articles/list.js" + "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/routes/articles/list.js" ], "find": { @@ -919,8 +953,99 @@ "groups": [ { + "selected": 1, "sheets": [ + { + "buffer": 0, + "file": "vipra-ui/app/templates/index.hbs", + "semi_transient": false, + "settings": + { + "buffer_size": 1530, + "regions": + { + }, + "selection": + [ + [ + 1352, + 1352 + ] + ], + "settings": + { + "syntax": "Packages/Handlebars/grammars/Handlebars.tmLanguage", + "tab_size": 2, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 1, + "type": "text" + }, + { + "buffer": 1, + "file": "vipra-ui/app/styles/app.scss", + "semi_transient": false, + "settings": + { + "buffer_size": 914, + "regions": + { + }, + "selection": + [ + [ + 681, + 681 + ] + ], + "settings": + { + "syntax": "Packages/SCSS/SCSS.tmLanguage", + "tab_size": 2, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 0, + "type": "text" + }, + { + "buffer": 2, + "file": "vipra-ui/app/adapters/application.js", + "semi_transient": false, + "settings": + { + "buffer_size": 506, + "regions": + { + }, + "selection": + [ + [ + 119, + 119 + ] + ], + "settings": + { + "syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage", + "tab_size": 2, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 2, + "type": "text" + } ] } ], diff --git a/vipra-cmd.sh b/vipra similarity index 100% rename from vipra-cmd.sh rename to vipra diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/Options.java b/vipra-cmd/src/main/java/de/vipra/cmd/Options.java new file mode 100644 index 0000000000000000000000000000000000000000..8f1da6be38abfb6abfe3efbe7923ba65579c9f10 --- /dev/null +++ b/vipra-cmd/src/main/java/de/vipra/cmd/Options.java @@ -0,0 +1,5 @@ +package de.vipra.cmd; + +public class Options { + +} diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java index e4f8a2b8744292e85985ce575156f4a79d294217..f760797f6d2c27c8d8ab09bcaab58c608e87afc8 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java +++ b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java @@ -5,7 +5,10 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.util.ArrayList; +import java.util.Date; import java.util.List; +import java.util.Map; import javax.servlet.ServletContext; import javax.ws.rs.Consumes; @@ -26,12 +29,18 @@ import org.bson.types.ObjectId; import org.ehcache.Cache; import org.ehcache.CacheManager; import org.ehcache.config.CacheConfigurationBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; import de.vipra.rest.APIMediaType; import de.vipra.rest.Messages; import de.vipra.rest.model.APIError; import de.vipra.rest.model.Wrapper; import de.vipra.util.Config; +import de.vipra.util.ESClient; import de.vipra.util.MongoUtils; import de.vipra.util.StringUtils; import de.vipra.util.ex.ConfigException; @@ -47,6 +56,7 @@ public class ArticleResource { final Cache<String, ArticleFull> cache; final DatabaseService<ArticleFull, ObjectId> service; + final TransportClient client; public ArticleResource(@Context ServletContext servletContext) throws ConfigException, IOException { Config config = Config.getConfig(); @@ -58,12 +68,22 @@ public class ArticleResource { articleCache = manager.createCache("articlecache", CacheConfigurationBuilder.newCacheConfigurationBuilder() .buildConfig(String.class, ArticleFull.class)); this.cache = articleCache; + + client = ESClient.getClient(config); } @GET @Produces(APIMediaType.APPLICATION_JSONAPI) public Response getArticles(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit, - @QueryParam("sort") @DefaultValue("date") String sortBy, @QueryParam("fields") String fields) { + @QueryParam("sort") @DefaultValue("date") String sortBy, @QueryParam("fields") String fields, + @QueryParam("query") String query) { + if (query == null) + return getArticlesFromDb(skip, limit, sortBy, fields); + else + return getArticlesFromIndex(skip, limit, query); + } + + private Response getArticlesFromDb(Integer skip, Integer limit, String sortBy, String fields) { Wrapper<List<ArticleFull>> res = new Wrapper<>(); if (skip != null && limit != null) @@ -87,6 +107,40 @@ public class ArticleResource { } } + private Response getArticlesFromIndex(Integer skip, Integer limit, String query) { + Wrapper<List<ArticleFull>> res = new Wrapper<>(); + + if (skip == null || skip < 0) + skip = 0; + + if (limit == null || limit < 0) + limit = 20; + + SearchResponse response = null; + try { + response = client.prepareSearch("articles").setQuery(QueryBuilders.multiMatchQuery(query, "_all")) + .setFrom(skip).setSize(limit).execute().actionGet(); + } catch (Exception e) { + res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage())); + return res.badRequest(); + } + + SearchHits hits = response.getHits(); + List<ArticleFull> articles = new ArrayList<>(10); + for (SearchHit hit : hits) { + Map<String, Object> source = hit.getSource(); + ArticleFull article = new ArticleFull(); + article.setId(MongoUtils.objectId(hit.getId())); + article.setTitle(source.get("title").toString()); + article.setText(StringUtils.ellipsize(source.get("text").toString(), 150)); + articles.add(article); + } + + res.addMeta("total", articles.size()); + + return res.ok(articles); + } + @GET @Produces(APIMediaType.APPLICATION_JSONAPI) @Consumes(APIMediaType.APPLICATION_JSONAPI) diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/SearchResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/SearchResource.java deleted file mode 100644 index 3f7c24a61640c5de4ca98cf6057839560e7345e1..0000000000000000000000000000000000000000 --- a/vipra-rest/src/main/java/de/vipra/rest/resource/SearchResource.java +++ /dev/null @@ -1,86 +0,0 @@ -package de.vipra.rest.resource; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletContext; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.search.SearchType; -import org.elasticsearch.client.transport.TransportClient; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; - -import de.vipra.rest.APIMediaType; -import de.vipra.rest.model.APIError; -import de.vipra.rest.model.Wrapper; -import de.vipra.util.Config; -import de.vipra.util.ESClient; -import de.vipra.util.MongoUtils; -import de.vipra.util.StringUtils; -import de.vipra.util.ex.ConfigException; -import de.vipra.util.model.ArticleFull; - -@Path("search") -public class SearchResource { - - @Context - UriInfo uri; - - final TransportClient client; - - public SearchResource(@Context ServletContext servletContext) throws IOException, ConfigException { - Config config = Config.getConfig(); - client = ESClient.getClient(config); - } - - @GET - @Produces(APIMediaType.APPLICATION_JSONAPI) - public Response search(@QueryParam("query") String query, @QueryParam("skip") Integer skip, - @QueryParam("limit") Integer limit, @QueryParam("excerpt") Integer excerpt) { - Wrapper<List<ArticleFull>> res = new Wrapper<>(); - - if (skip == null || skip < 0) - skip = 0; - - if (limit == null || limit < 0) - limit = 20; - - SearchResponse response = null; - try { - response = client.prepareSearch("articles").setSearchType(SearchType.QUERY_AND_FETCH) - .setQuery(QueryBuilders.multiMatchQuery(query, "_all")).setFrom(skip).setSize(limit).execute() - .actionGet(); - } catch (Exception e) { - res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage())); - return res.badRequest(); - } - - SearchHits hits = response.getHits(); - List<ArticleFull> articles = new ArrayList<>(10); - for (SearchHit hit : hits) { - Map<String, Object> source = hit.getSource(); - ArticleFull article = new ArticleFull(); - article.setId(MongoUtils.objectId(hit.getId())); - article.setTitle(source.get("title").toString()); - if (excerpt != null && excerpt > 0) - article.setText(StringUtils.ellipsize(source.get("text").toString(), excerpt)); - articles.add(article); - } - - res.addMeta("total", articles.size()); - - return res.ok(articles); - } - -} diff --git a/vipra-rest/src/main/resources/log4j2.xml b/vipra-rest/src/main/resources/log4j2.xml index 871334005580a7821f2a6e7f7c2517ab454b2e17..f45f0f9e28f912ba4ff52186952326c16d08ae7e 100644 --- a/vipra-rest/src/main/resources/log4j2.xml +++ b/vipra-rest/src/main/resources/log4j2.xml @@ -6,9 +6,8 @@ </Console> </Appenders> <Loggers> - <Root level="ALL"> + <Root level="DEBUG"> <AppenderRef ref="Console" /> </Root> - <Logger name="org.mongodb" level="INFO"/> </Loggers> </Configuration> \ No newline at end of file diff --git a/vipra-ui/app/adapters/application.js b/vipra-ui/app/adapters/application.js index c14dc91b50c796761e9b28c764ce301880937f35..0d442b61c170d4fa40db3aae849cc2e0cc783dc3 100644 --- a/vipra-ui/app/adapters/application.js +++ b/vipra-ui/app/adapters/application.js @@ -1,7 +1,7 @@ import DS from 'ember-data'; export default DS.JSONAPIAdapter.extend({ - host: `http://${window.location.hostname}:8000`, + host: `http://${window.location.hostname}:8080`, namespace: 'vipra-rest', updateRecord(store, type, snapshot) { var data = {}; diff --git a/vipra-ui/app/components/debounced-input.js b/vipra-ui/app/components/debounced-input.js index 5eee646f9195d06d4092541d6033baffb6dc641c..ba23db7e352f89169776916bb0eb698a7a6fe40d 100644 --- a/vipra-ui/app/components/debounced-input.js +++ b/vipra-ui/app/components/debounced-input.js @@ -5,7 +5,12 @@ export default Ember.TextField.extend({ fireAtStart: false, _elementValueDidChange() { - Ember.run.debounce(this, this._setValue, this.debounce, this.fireAtStart); + let val = this.$().val(); + if(val) { + Ember.run.debounce(this, this._setValue, this.debounce, this.fireAtStart); + } else { + this._setValue(); + } }, _setValue() { diff --git a/vipra-ui/app/controllers/articles/index.js b/vipra-ui/app/controllers/articles/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f73630c178935d15174a8ed30314d996e113320a --- /dev/null +++ b/vipra-ui/app/controllers/articles/index.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + + queryParams: 'page', + page: 1 + +}); diff --git a/vipra-ui/app/controllers/index.js b/vipra-ui/app/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..faf5a820e1f079474c77da2a85a741d33ed1e89a --- /dev/null +++ b/vipra-ui/app/controllers/index.js @@ -0,0 +1,16 @@ +export default Ember.Controller.extend({ + + queryParams: 'q', + q: '', + + search: Ember.computed('q', function() { + let query = this.get('q'); + if(query) { + return this.store.query('article', { + query: query, + limit: 10 + }); + } + }) + +}); \ No newline at end of file diff --git a/vipra-ui/app/controllers/topics/index.js b/vipra-ui/app/controllers/topics/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d215b2d1a223f15ecdca82eb2a3bf67583b80cf7 --- /dev/null +++ b/vipra-ui/app/controllers/topics/index.js @@ -0,0 +1,6 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + queryParams: 'page', + page: 1 +}); diff --git a/vipra-ui/app/controllers/words/index.js b/vipra-ui/app/controllers/words/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d215b2d1a223f15ecdca82eb2a3bf67583b80cf7 --- /dev/null +++ b/vipra-ui/app/controllers/words/index.js @@ -0,0 +1,6 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + queryParams: 'page', + page: 1 +}); diff --git a/vipra-ui/app/models/search.js b/vipra-ui/app/models/search.js new file mode 100644 index 0000000000000000000000000000000000000000..fc38e0953d2df40b7c1ca83dec430ed494561ed0 --- /dev/null +++ b/vipra-ui/app/models/search.js @@ -0,0 +1,17 @@ +import DS from 'ember-data'; + +export default DS.Model.extend({ + title: DS.attr(), + text: DS.attr(), + url: DS.attr(), + date: DS.attr('date'), + stats: DS.attr(), + topics: DS.attr(), + created: DS.attr('date'), + modified: DS.attr('date'), + + _name: function() { + var title = this.get('title'); + return title ? title : this.get('id'); + }.property('title') +}); diff --git a/vipra-ui/app/models/word.js b/vipra-ui/app/models/word.js index a18091a143581c6708b00d29aa9b69fac1f6e813..4d7296307825dd836622dc1f00a831baccf3da70 100644 --- a/vipra-ui/app/models/word.js +++ b/vipra-ui/app/models/word.js @@ -1,8 +1,6 @@ import DS from 'ember-data'; export default DS.Model.extend({ - word: DS.attr(), - _name: function() { return this.get('id'); }.property('id') diff --git a/vipra-ui/app/routes/articles/index.js b/vipra-ui/app/routes/articles/index.js index 7fcaffd1badd98bfcdc6e8cc685533b92ca3b374..b5920fb2470e2885b03b1a7467f212074d4ba34e 100644 --- a/vipra-ui/app/routes/articles/index.js +++ b/vipra-ui/app/routes/articles/index.js @@ -76,6 +76,12 @@ export default Ember.Route.extend({ name: 'Articles', data: data }]; + }, + + resetController(controller, isExiting, transition) { + if(isExiting) { + controller.set('page', 1); + } } }); diff --git a/vipra-ui/app/routes/index.js b/vipra-ui/app/routes/index.js index 2e701b60f2b940458aab4ec826c146e69550775c..bfef9997950853bfa1b6c05635c92a736f5f79a6 100644 --- a/vipra-ui/app/routes/index.js +++ b/vipra-ui/app/routes/index.js @@ -1,6 +1,7 @@ import Ember from 'ember'; export default Ember.Route.extend({ + model() { return { latestarticles: this.store.query('article', {limit: 5, sort: '-created'}), @@ -8,4 +9,5 @@ export default Ember.Route.extend({ latestwords: this.store.query('word', {limit: 5, sort: '-created'}), }; } + }); \ No newline at end of file diff --git a/vipra-ui/app/routes/topics/index.js b/vipra-ui/app/routes/topics/index.js index ce1a47c4c8f5f13488d0cd5d1bf966c4217c1454..1540346be4cfb40bb3489809f242ae14778e0d8d 100644 --- a/vipra-ui/app/routes/topics/index.js +++ b/vipra-ui/app/routes/topics/index.js @@ -26,6 +26,12 @@ export default Ember.Route.extend({ limit: limit, topics: this.store.query('topic', query) }); + }, + + resetController(controller, isExiting, transition) { + if(isExiting) { + controller.set('page', 1); + } } }); \ No newline at end of file diff --git a/vipra-ui/app/routes/words/index.js b/vipra-ui/app/routes/words/index.js index 52c996460a468ae3f4620628e765130d91a1ddc4..c714a5d180fa36b400621c5ec3558b96f42aa269 100644 --- a/vipra-ui/app/routes/words/index.js +++ b/vipra-ui/app/routes/words/index.js @@ -27,6 +27,12 @@ export default Ember.Route.extend({ limit: limit, words: this.store.query('word', query) }); + }, + + resetController(controller, isExiting, transition) { + if(isExiting) { + controller.set('page', 1); + } } }); \ No newline at end of file diff --git a/vipra-ui/app/styles/app.scss b/vipra-ui/app/styles/app.scss index 34d181cb99b44a717de2fb0d2f0e84007f8eacb0..418dbba8db7c112b3437da8c7770f0c10fd16777 100644 --- a/vipra-ui/app/styles/app.scss +++ b/vipra-ui/app/styles/app.scss @@ -41,6 +41,11 @@ body { text-overflow: ellipsis; } +.search-result { + padding: 5px; + margin-bottom: 5px; +} + .navbar-default { .collapse:not(.in) { .navbar-nav > .active { diff --git a/vipra-ui/app/templates/application.hbs b/vipra-ui/app/templates/application.hbs index e7aa4f457199f2be941f802142730f4b802f475a..6e2bf2f7d4cc0d5814c144da332641dabf30ef4b 100644 --- a/vipra-ui/app/templates/application.hbs +++ b/vipra-ui/app/templates/application.hbs @@ -14,9 +14,9 @@ <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="vipra-navbar-collapse-1"> <ul class="nav navbar-nav"> - {{#link-to 'articles' tagName='li'}}{{link-to 'Articles' 'articles'}}{{/link-to}} - {{#link-to 'topics' tagName='li'}}{{link-to 'Topics' 'topics'}}{{/link-to}} - {{#link-to 'words' tagName='li'}}{{link-to 'Words' 'words'}}{{/link-to}} + {{#link-to 'articles' tagName='li'}}{{link-to 'Articles' 'articles' (query-params page=1)}}{{/link-to}} + {{#link-to 'topics' tagName='li'}}{{link-to 'Topics' 'topics' (query-params page=1)}}{{/link-to}} + {{#link-to 'words' tagName='li'}}{{link-to 'Words' 'words' (query-params page=1)}}{{/link-to}} {{outlet 'menu-left'}} <div id="testi"></div> </ul> diff --git a/vipra-ui/app/templates/index.hbs b/vipra-ui/app/templates/index.hbs index 88012faac4bedf188a3c00753216ab04fd3c3b28..5332d1397014f5c682b540f64ca4a870810bdf28 100644 --- a/vipra-ui/app/templates/index.hbs +++ b/vipra-ui/app/templates/index.hbs @@ -6,7 +6,7 @@ </div> <br> - {{debounced-input class='form-control input-lg' placeholder='Search...' value=filter debounce='500'}} + {{debounced-input value=q class="form-control input-lg" placeholder="Search..."}} </div> </div> @@ -38,8 +38,18 @@ </div> </div> - <div class="row"> - {{filter}} - </div> + {{#if search}} + <hr> + <h4>Search results</h4> + <ol> + {{#each search as |article|}} + <li class="search-result"> + {{link-to article.title 'articles.show' article.id}}<br> + └ <small>{{article.text}}</small> + </li> + {{/each}} + </ol> + + {{/if}} </div> \ No newline at end of file