diff --git a/vipra-ui/app/html/articles/index.html b/vipra-ui/app/html/articles/index.html index 6479cf27dd8575314c1e14c93a66a095e84aa670..2037f1dfd28452ecff1125f5f20dd54a8a79bef1 100644 --- a/vipra-ui/app/html/articles/index.html +++ b/vipra-ui/app/html/articles/index.html @@ -1,37 +1,21 @@ <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'articles'"> - <menu-affix> - <div class="text-center"> - <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" /> - </div> - </menu-affix> <div class="container"> - <div class="row row-spaced"> - <div class="col-md-8 text-center"> - <char-selector ng-model="articlesIndexModels.startChar"/> - </div> - <div class="col-md-4"> - <div class="btn-group btn-group-justified"> - <input type="text" class="form-control" ng-model="articlesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> - <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="articlesIndexModels.contains=''" analytics-on analytics-event="Articles Filter (clear)" analytics-category="Filter actions"></span> + <div class="row"> + <div class="col-sm-12 hidden-md hidden-lg"> + <div class="text-center"> + <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" /> </div> </div> </div> <div class="row"> - <div class="col-md-12"> + <div class="col-md-9 col-sm-12"> <div class="panel panel-default"> - <div class="panel-heading"> + <div class="panel-heading clearfix"> Found <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database. - <span ng-show="articlesTotal > 0" ng-cloak> - Sort by - <ol class="nya-bs-select nya-bs-condensed" ng-model="articlesIndexModels.sortkey"> - <li value="title" class="nya-bs-option"><a>Title</a></li> - <li value="date" class="nya-bs-option"><a>Date</a></li> - <li value="created" class="nya-bs-option"><a>Added</a></li> - <li value="topicsCount" class="nya-bs-option"><a># of topics</a></li> - </ol> - <sort-dir ng-model="articlesIndexModels.sortdir" /> - </span> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> <table class="table table-hover table-condensed table-fixed"> <tbody> @@ -48,8 +32,44 @@ </tr> </tbody> </table> - <div class="panel-footer"> - Page <span ng-bind="articlesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + <div class="panel-footer clearfix"> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> + </div> + </div> + </div> + <div class="col-md-3 hidden-sm"> + <div class="sidebar-affix"> + <div> + <div class="form-group"> + <pagination-full total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" /> + </div> + <hr> + <div class="form-group"> + <div class="btn-group btn-group-justified"> + <input type="text" class="form-control" ng-model="articlesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> + <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="articlesIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span> + </div> + </div> + <div class="form-group"> + <label for="initial">Initial letter</label> + <char-selector id="initial" ng-model="articlesIndexModels.startChar"/> + </div> + <div class="form-group"> + <label>Sort by</label> + <div class="input-group"> + <select class="form-control" ng-model="articlesIndexModels.sortkey"> + <option value="title">Title</option> + <option value="date">Date</option> + <option value="created">Added</option> + <option value="topicsCount"># of topics</option> + </select> + <span class="input-group-btn"> + <sort-dir ng-model="articlesIndexModels.sortdir" /> + </span> + </div> + </div> </div> </div> </div> diff --git a/vipra-ui/app/html/directives/char-selector.html b/vipra-ui/app/html/directives/char-selector.html index e557178b19dcf7994f0c5508e0792628b7a30823..7747f99edcecdf38489776e512b28db21bf7663b 100644 --- a/vipra-ui/app/html/directives/char-selector.html +++ b/vipra-ui/app/html/directives/char-selector.html @@ -1,29 +1,29 @@ -<div class="char-selector"> - <a ng-class="{selected:!ngModel}" data-char="" analytics-on analytics-event="Char selector ()" analytics-category="Filter actions">All</a> - <a ng-class="{selected:ngModel==='A'}" data-char="A" analytics-on analytics-event="Char selector (A)" analytics-category="Filter actions">A</a> - <a ng-class="{selected:ngModel==='B'}" data-char="B" analytics-on analytics-event="Char selector (B)" analytics-category="Filter actions">B</a> - <a ng-class="{selected:ngModel==='C'}" data-char="C" analytics-on analytics-event="Char selector (C)" analytics-category="Filter actions">C</a> - <a ng-class="{selected:ngModel==='D'}" data-char="D" analytics-on analytics-event="Char selector (D)" analytics-category="Filter actions">D</a> - <a ng-class="{selected:ngModel==='E'}" data-char="E" analytics-on analytics-event="Char selector (E)" analytics-category="Filter actions">E</a> - <a ng-class="{selected:ngModel==='F'}" data-char="F" analytics-on analytics-event="Char selector (F)" analytics-category="Filter actions">F</a> - <a ng-class="{selected:ngModel==='G'}" data-char="G" analytics-on analytics-event="Char selector (G)" analytics-category="Filter actions">G</a> - <a ng-class="{selected:ngModel==='H'}" data-char="H" analytics-on analytics-event="Char selector (H)" analytics-category="Filter actions">H</a> - <a ng-class="{selected:ngModel==='I'}" data-char="I" analytics-on analytics-event="Char selector (I)" analytics-category="Filter actions">I</a> - <a ng-class="{selected:ngModel==='J'}" data-char="J" analytics-on analytics-event="Char selector (J)" analytics-category="Filter actions">J</a> - <a ng-class="{selected:ngModel==='K'}" data-char="K" analytics-on analytics-event="Char selector (K)" analytics-category="Filter actions">K</a> - <a ng-class="{selected:ngModel==='L'}" data-char="L" analytics-on analytics-event="Char selector (L)" analytics-category="Filter actions">L</a> - <a ng-class="{selected:ngModel==='M'}" data-char="M" analytics-on analytics-event="Char selector (M)" analytics-category="Filter actions">M</a> - <a ng-class="{selected:ngModel==='N'}" data-char="N" analytics-on analytics-event="Char selector (N)" analytics-category="Filter actions">N</a> - <a ng-class="{selected:ngModel==='O'}" data-char="O" analytics-on analytics-event="Char selector (O)" analytics-category="Filter actions">O</a> - <a ng-class="{selected:ngModel==='P'}" data-char="P" analytics-on analytics-event="Char selector (P)" analytics-category="Filter actions">P</a> - <a ng-class="{selected:ngModel==='Q'}" data-char="Q" analytics-on analytics-event="Char selector (Q)" analytics-category="Filter actions">Q</a> - <a ng-class="{selected:ngModel==='R'}" data-char="R" analytics-on analytics-event="Char selector (R)" analytics-category="Filter actions">R</a> - <a ng-class="{selected:ngModel==='S'}" data-char="S" analytics-on analytics-event="Char selector (S)" analytics-category="Filter actions">S</a> - <a ng-class="{selected:ngModel==='T'}" data-char="T" analytics-on analytics-event="Char selector (T)" analytics-category="Filter actions">T</a> - <a ng-class="{selected:ngModel==='U'}" data-char="U" analytics-on analytics-event="Char selector (U)" analytics-category="Filter actions">U</a> - <a ng-class="{selected:ngModel==='V'}" data-char="V" analytics-on analytics-event="Char selector (V)" analytics-category="Filter actions">V</a> - <a ng-class="{selected:ngModel==='W'}" data-char="W" analytics-on analytics-event="Char selector (W)" analytics-category="Filter actions">W</a> - <a ng-class="{selected:ngModel==='X'}" data-char="X" analytics-on analytics-event="Char selector (X)" analytics-category="Filter actions">X</a> - <a ng-class="{selected:ngModel==='Y'}" data-char="Y" analytics-on analytics-event="Char selector (Y)" analytics-category="Filter actions">Y</a> - <a ng-class="{selected:ngModel==='Z'}" data-char="Z" analytics-on analytics-event="Char selector (Z)" analytics-category="Filter actions">Z</a> -</div> \ No newline at end of file +<select class="form-control"> + <option value="" analytics-on analytics-event="Char selector ()" analytics-category="Filter actions">All</option> + <option value="A" analytics-on analytics-event="Char selector (A)" analytics-category="Filter actions">A</option> + <option value="B" analytics-on analytics-event="Char selector (B)" analytics-category="Filter actions">B</option> + <option value="C" analytics-on analytics-event="Char selector (C)" analytics-category="Filter actions">C</option> + <option value="D" analytics-on analytics-event="Char selector (D)" analytics-category="Filter actions">D</option> + <option value="E" analytics-on analytics-event="Char selector (E)" analytics-category="Filter actions">E</option> + <option value="F" analytics-on analytics-event="Char selector (F)" analytics-category="Filter actions">F</option> + <option value="G" analytics-on analytics-event="Char selector (G)" analytics-category="Filter actions">G</option> + <option value="H" analytics-on analytics-event="Char selector (H)" analytics-category="Filter actions">H</option> + <option value="I" analytics-on analytics-event="Char selector (I)" analytics-category="Filter actions">I</option> + <option value="J" analytics-on analytics-event="Char selector (J)" analytics-category="Filter actions">J</option> + <option value="K" analytics-on analytics-event="Char selector (K)" analytics-category="Filter actions">K</option> + <option value="L" analytics-on analytics-event="Char selector (L)" analytics-category="Filter actions">L</option> + <option value="M" analytics-on analytics-event="Char selector (M)" analytics-category="Filter actions">M</option> + <option value="N" analytics-on analytics-event="Char selector (N)" analytics-category="Filter actions">N</option> + <option value="O" analytics-on analytics-event="Char selector (O)" analytics-category="Filter actions">O</option> + <option value="P" analytics-on analytics-event="Char selector (P)" analytics-category="Filter actions">P</option> + <option value="Q" analytics-on analytics-event="Char selector (Q)" analytics-category="Filter actions">Q</option> + <option value="R" analytics-on analytics-event="Char selector (R)" analytics-category="Filter actions">R</option> + <option value="S" analytics-on analytics-event="Char selector (S)" analytics-category="Filter actions">S</option> + <option value="T" analytics-on analytics-event="Char selector (T)" analytics-category="Filter actions">T</option> + <option value="U" analytics-on analytics-event="Char selector (U)" analytics-category="Filter actions">U</option> + <option value="V" analytics-on analytics-event="Char selector (V)" analytics-category="Filter actions">V</option> + <option value="W" analytics-on analytics-event="Char selector (W)" analytics-category="Filter actions">W</option> + <option value="X" analytics-on analytics-event="Char selector (X)" analytics-category="Filter actions">X</option> + <option value="Y" analytics-on analytics-event="Char selector (Y)" analytics-category="Filter actions">Y</option> + <option value="Z" analytics-on analytics-event="Char selector (Z)" analytics-category="Filter actions">Z</option> +</select> \ No newline at end of file diff --git a/vipra-ui/app/html/directives/pagination-full.html b/vipra-ui/app/html/directives/pagination-full.html new file mode 100644 index 0000000000000000000000000000000000000000..c206067bc1b9845808ffa04d42266adccc64547b --- /dev/null +++ b/vipra-ui/app/html/directives/pagination-full.html @@ -0,0 +1,35 @@ +<div> + <div class="btn-group btn-group-justified"> + <div class="btn-group"> + <button class="btn btn-default" title="First" ng-click="changePage(1)" ng-disabled="page==1" analytics-on analytics-event="Paginator (first)" analytics-category="Filter actions"> + <i class="fa fa-angle-double-left"></i> + </button> + </div> + <div class="btn-group"> + <button class="btn btn-default" title="Previous" ng-click="changePage(page-1)" ng-disabled="page==1" analytics-on analytics-event="Paginator (prev)" analytics-category="Filter actions"> + <i class="fa fa-angle-left"></i> + </button> + </div> + <div class="btn-group"> + <button class="btn btn-default" title="Go to page" ng-click="toPage()" analytics-on analytics-event="Paginator (n)" analytics-category="Filter actions"> + … + </button> + </div> + <div class="btn-group"> + <button class="btn btn-default" title="Next" ng-click="changePage(page+1)" ng-disabled="page>=maxPage" analytics-on analytics-event="Paginator (next)" analytics-category="Filter actions"> + <i class="fa fa-angle-right"></i> + </button> + </div> + <div class="btn-group"> + <button class="btn btn-default" title="Last" ng-click="changePage(maxPage)" ng-disabled="page>=maxPage" analytics-on analytics-event="Paginator (last)" analytics-category="Filter actions"> + <i class="fa fa-angle-double-right"></i> + </button> + </div> + </div> + + <div class="btn-group btn-group-justified"> + <div class="btn-group" ng-repeat="p in pages"> + <button class="btn btn-default" ng-class="{active:page==p}" ng-attr-title="{{'Page ' + p}}" ng-click="changePage(p)" ng-disabled="page==p" analytics-on analytics-event="Paginator (i)" analytics-category="Filter actions" ng-bind="p"></button> + </div> + </div> +</div> \ No newline at end of file diff --git a/vipra-ui/app/html/directives/sort-dir.html b/vipra-ui/app/html/directives/sort-dir.html index f8dc9ab7f40e2530ed2818bcf10d5c82c7a91c3c..8ef9475570ad86f0896e9667e309b128bcff5f22 100644 --- a/vipra-ui/app/html/directives/sort-dir.html +++ b/vipra-ui/app/html/directives/sort-dir.html @@ -1,3 +1,3 @@ -<a tabindex="0"> - <i class="pointer fa" ng-class="{'fa-sort-amount-desc':ngModel,'fa-sort-amount-asc':!ngModel}" ng-click="ngModel=!ngModel; $event.stopPropagation()" analytics-on analytics-event="Sort direction" analytics-category="Filter actions"></i> -</a> \ No newline at end of file +<button class="btn btn-default" type="button" tabindex="0" ng-click="ngModel=!ngModel; $event.stopPropagation()" analytics-on analytics-event="Sort direction" analytics-category="Filter actions"> + <i class="fa" ng-class="{'fa-sort-amount-desc':ngModel,'fa-sort-amount-asc':!ngModel}"></i> +</button> \ No newline at end of file diff --git a/vipra-ui/app/html/directives/topic-link.html b/vipra-ui/app/html/directives/topic-link.html index 5782551b36acc19385329085760830211bc6fd7c..f0653ba543bd26a181edff09f6a666ffd5072ed8 100644 --- a/vipra-ui/app/html/directives/topic-link.html +++ b/vipra-ui/app/html/directives/topic-link.html @@ -1,6 +1,6 @@ <div class="link-wrapper"> <span class="menu-padding ellipsis"> - <span class="badge pull-right" ng-bind="::topic.articlesCount" ng-attr-title="{{::topic.articlesCount}} article(s)" ng-if="::showBadge"></span> + <a ui-sref="topics.show.articles({id:topic.id})" class="badge pull-right" ng-bind="::topic.articlesCount" ng-attr-title="{{::topic.articlesCount}} article(s)" ng-if="::showBadge"></a> <a class="topic-link" ui-sref="topics.show({id:topic.id})" ng-attr-title="{{::topic.name}}"> <span ng-bind="topic.name"></span> <ng-transclude/> diff --git a/vipra-ui/app/html/entities/index.html b/vipra-ui/app/html/entities/index.html index 5bc4a38b80475c233ee4ab7794139c877993c6fe..d15346a1489ab25187f96290069b6ecca352be55 100644 --- a/vipra-ui/app/html/entities/index.html +++ b/vipra-ui/app/html/entities/index.html @@ -1,34 +1,21 @@ <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'entities'"> - <menu-affix> - <div class="text-center"> - <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" /> - </div> - </menu-affix> <div class="container"> - <div class="row row-spaced"> - <div class="col-md-8 text-center"> - <char-selector ng-model="entitiesIndexModels.startChar"/> - </div> - <div class="col-md-4"> - <div class="btn-group btn-group-justified"> - <input type="text" class="form-control" ng-model="entitiesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> - <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="entitiesIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span> + <div class="row"> + <div class="col-sm-12 hidden-md hidden-lg"> + <div class="text-center"> + <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" /> </div> </div> </div> <div class="row"> - <div class="col-md-12"> + <div class="col-md-9 col-sm-12"> <div class="panel panel-default"> - <div class="panel-heading"> + <div class="panel-heading clearfix"> Found <ng-pluralize count="entitiesTotal||0" when="{0:'no entities',1:'1 entity',other:'{} entities'}"></ng-pluralize> in the database. - <span ng-show="entitiesTotal > 0" ng-cloak> - Sort by - <ol class="nya-bs-select nya-bs-condensed" ng-model="entitiesIndexModels.sortkey"> - <li value="id" class="nya-bs-option"><a>Entity</a></li> - </ol> - <sort-dir ng-model="entitiesIndexModels.sortdir" /> - </span> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> <table class="table table-hover table-condensed table-fixed"> <tbody> @@ -45,8 +32,41 @@ </tr> </tbody> </table> - <div class="panel-footer"> - Page <span ng-bind="entitiesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + <div class="panel-footer clearfix"> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> + </div> + </div> + </div> + <div class="col-md-3 hidden-sm"> + <div class="sidebar-affix"> + <div> + <div class="form-group"> + <pagination-full total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" /> + </div> + <hr> + <div class="form-group"> + <div class="btn-group btn-group-justified"> + <input type="text" class="form-control" ng-model="entitiesIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> + <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="entitiesIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span> + </div> + </div> + <div class="form-group"> + <label for="initial">Initial letter</label> + <char-selector id="initial" ng-model="entitiesIndexModels.startChar"/> + </div> + <div class="form-group"> + <label>Sort by</label> + <div class="input-group"> + <select class="form-control" ng-model="entitiesIndexModels.sortkey"> + <option value="id">Entity</option> + </select> + <span class="input-group-btn"> + <sort-dir ng-model="entitiesIndexModels.sortdir" /> + </span> + </div> + </div> </div> </div> </div> diff --git a/vipra-ui/app/html/index.html b/vipra-ui/app/html/index.html index 4d959af5956b19dc2d9988f434645beea39f382d..08e17e3b6a66ef785d4c5193f5a87ccb274982a7 100644 --- a/vipra-ui/app/html/index.html +++ b/vipra-ui/app/html/index.html @@ -42,21 +42,11 @@ </div> <div class="row latest-items" ng-hide="search"> <br> - <div class="col-md-8 text-center"> - <h4>Latest articles</h4> - <ul class="list-unstyled"> - <article-link article="::article" badge="false" menu="false" details="false" ng-repeat="article in latestArticles"/> - </ul> - <p class="text-center" ng-if="!latestArticles">Loading...</p> - <p class="text-center" ng-if="latestArticles&&!latestArticles.length">No Articles</p> - </div> - <div class="col-md-4 text-center"> - <h4>Latest topics</h4> - <ul class="list-unstyled"> - <topic-link topic="::topic" badge="false" menu="false" ng-repeat="topic in latestTopics"/> - </ul> - <p class="text-center" ng-if="!latestTopics">Loading...</p> - <p class="text-center" ng-if="latestTopics&&!latestTopics.length">No Topics</p> + <div class="text-center stats-badges"> + <a ui-sref="articles" class="badge" ng-bind="rootModels.topicModel.articleCount || 0"></a> <ng-pluralize count="rootModels.topicModel.articleCount || 0" when="{'1':'article','other':'articles'}"></ng-pluralize> + <a ui-sref="topics" class="badge" ng-bind="rootModels.topicModel.topicCount || 0"></a> <ng-pluralize count="rootModels.topicModel.topicCount || 0" when="{'1':'topic','other':'topics'}"></ng-pluralize> + <a ui-sref="entities" class="badge" ng-bind="rootModels.topicModel.entityCount || 0"></a> <ng-pluralize count="rootModels.topicModel.entityCount || 0" when="{'1':'entity','other':'entities'}"></ng-pluralize> + <a ui-sref="words" class="badge" ng-bind="rootModels.topicModel.wordCount || 0"></a> <ng-pluralize count="rootModels.topicModel.wordCount || 0" when="{'1':'word','other':'words'}"></ng-pluralize> </div> </div> </div> diff --git a/vipra-ui/app/html/topics/index.html b/vipra-ui/app/html/topics/index.html index aeefbc3a78234797e3bc53e488992b00dce556e8..4653d18eef437674b6a6229ce70f6583c262bb14 100644 --- a/vipra-ui/app/html/topics/index.html +++ b/vipra-ui/app/html/topics/index.html @@ -1,36 +1,21 @@ <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'topics'"> - <menu-affix> - <div class="text-center"> - <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" /> - </div> - </menu-affix> <div class="container"> - <div class="row row-spaced"> - <div class="col-md-8 text-center"> - <char-selector ng-model="topicsIndexModels.startChar"/> - </div> - <div class="col-md-4"> - <div class="btn-group btn-group-justified"> - <input type="text" class="form-control" ng-model="topicsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> - <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="topicsIndexModels.contains=''" analytics-on analytics-event="Topics Filter (clear)" analytics-category="Filter actions"></span> + <div class="row"> + <div class="col-sm-12 hidden-md hidden-lg"> + <div class="text-center"> + <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" /> </div> </div> </div> <div class="row"> - <div class="col-md-12"> + <div class="col-md-9 col-sm-12"> <div class="panel panel-default"> - <div class="panel-heading"> + <div class="panel-heading clearfix"> Found <ng-pluralize count="topicsTotal||0" when="{0:'no topics',1:'1 topic',other:'{} topics'}"></ng-pluralize> in the database. - <span ng-show="topicsTotal > 0" ng-cloak> - Sort by - <ol class="nya-bs-select nya-bs-condensed" ng-model="topicsIndexModels.sortkey"> - <li value="name" class="nya-bs-option"><a>Name</a></li> - <li value="created" class="nya-bs-option"><a>Added</a></li> - <li value="articlesCount" class="nya-bs-option"><a># of articles</a></li> - </ol> - <sort-dir ng-model="topicsIndexModels.sortdir" /> - </span> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> <table class="table table-hover table-condensed table-fixed"> <tbody> @@ -47,8 +32,43 @@ </tr> </tbody> </table> - <div class="panel-footer"> - Page <span ng-bind="topicsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + <div class="panel-footer clearfix"> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> + </div> + </div> + </div> + <div class="col-md-3 hidden-sm"> + <div class="sidebar-affix"> + <div> + <div class="form-group"> + <pagination-full total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" /> + </div> + <hr> + <div class="form-group"> + <div class="btn-group btn-group-justified"> + <input type="text" class="form-control" ng-model="topicsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> + <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="topicsIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span> + </div> + </div> + <div class="form-group"> + <label for="initial">Initial letter</label> + <char-selector id="initial" ng-model="topicsIndexModels.startChar"/> + </div> + <div class="form-group"> + <label>Sort by</label> + <div class="input-group"> + <select class="form-control" ng-model="topicsIndexModels.sortkey"> + <option value="name">Name</option> + <option value="created">Added</option> + <option value="articlesCount"># of articles</option> + </select> + <span class="input-group-btn"> + <sort-dir ng-model="topicsIndexModels.sortdir" /> + </span> + </div> + </div> </div> </div> </div> diff --git a/vipra-ui/app/html/words/index.html b/vipra-ui/app/html/words/index.html index 33be9812ed3ef443bcfb1c24155b68681a587d44..0fbe33ede0746081dcbda4e5975ff217c4cfeb80 100644 --- a/vipra-ui/app/html/words/index.html +++ b/vipra-ui/app/html/words/index.html @@ -1,34 +1,21 @@ <div ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'words'"> - <menu-affix> - <div class="text-center"> - <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" /> - </div> - </menu-affix> <div class="container"> - <div class="row row-spaced"> - <div class="col-md-8 text-center"> - <char-selector ng-model="wordsIndexModels.startChar"/> - </div> - <div class="col-md-4"> - <div class="btn-group btn-group-justified"> - <input type="text" class="form-control" ng-model="wordsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> - <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="wordsIndexModels.contains=''" analytics-on analytics-event="Words Filter (clear)" analytics-category="Filter actions"></span> + <div class="row"> + <div class="col-sm-12 hidden-md hidden-lg"> + <div class="text-center"> + <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" /> </div> </div> </div> <div class="row"> - <div class="col-md-12"> + <div class="col-md-9 col-sm-12"> <div class="panel panel-default"> - <div class="panel-heading"> + <div class="panel-heading clearfix"> Found <ng-pluralize count="wordsTotal||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize> in the database. - <span ng-show="wordsTotal > 0" ng-cloak> - Sort by - <ol class="nya-bs-select nya-bs-condensed" ng-model="wordsIndexModels.sortkey"> - <li value="id" class="nya-bs-option"><a>Word</a></li> - </ol> - <sort-dir ng-model="wordsIndexModels.sortdir" /> - </span> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> <table class="table table-hover table-condensed table-fixed"> <tbody> @@ -45,8 +32,41 @@ </tr> </tbody> </table> - <div class="panel-footer"> - Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + <div class="panel-footer clearfix"> + <div class="pull-right"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> + </div> + </div> + </div> + <div class="col-md-3 hidden-sm"> + <div class="sidebar-affix"> + <div> + <div class="form-group"> + <pagination-full total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" /> + </div> + <hr> + <div class="form-group"> + <div class="btn-group btn-group-justified"> + <input type="text" class="form-control" ng-model="wordsIndexModels.contains" placeholder="Filter..." ng-model-options="{debounce:300}"> + <span class="glyphicon glyphicon-remove-circle searchclear" ng-click="wordsIndexModels.contains=''" analytics-on analytics-event="Entities Filter (clear)" analytics-category="Filter actions"></span> + </div> + </div> + <div class="form-group"> + <label for="initial">Initial letter</label> + <char-selector id="initial" ng-model="wordsIndexModels.startChar"/> + </div> + <div class="form-group"> + <label>Sort by</label> + <div class="input-group"> + <select class="form-control" ng-model="wordsIndexModels.sortkey"> + <option value="id">Word</option> + </select> + <span class="input-group-btn"> + <sort-dir ng-model="wordsIndexModels.sortdir" /> + </span> + </div> + </div> </div> </div> </div> diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html index cf072fde2ade401475f1f8eb470269d0f1b171e1..a3a8d83bcefe53ed027bd7c5598537d9a4df3ff2 100644 --- a/vipra-ui/app/index.html +++ b/vipra-ui/app/index.html @@ -54,7 +54,7 @@ </form> <ul class="nav navbar-nav navbar-right"> <li ng-class="{'text-italic active':rootModels.topicModel}"> - <a tabindex="0" ng-click="chooseTopicModel()" ng-bind-template="{{rootModels.topicModel ? rootModels.topicModel.name : 'Models'}}" ng-attr-title="{{rootModels.topicModel.modelConfig.description}}" analytics-on analytics-event="Menu Item (Topic Models)" analytics-category="Menu actions"></a> + <a class="active-topicmodel" tabindex="0" ng-click="chooseTopicModel()" ng-bind-template="{{rootModels.topicModel ? rootModels.topicModel.name : 'Models'}}" ng-attr-title="{{rootModels.topicModel.name}} {{rootModels.topicModel.modelConfig.description}}" analytics-on analytics-event="Menu Item (Topic Models)" analytics-category="Menu actions"></a> </li> <li title="Keyboard cheatsheet"> <a tabindex="0" ng-click="showCheatSheet()" analytics-on analytics-event="Menu Item (Cheatsheet)" analytics-category="Menu actions"> diff --git a/vipra-ui/app/js/app.js b/vipra-ui/app/js/app.js index d0d60338f6a11fefbb3b1e9b8109df2ad2178acb..1fc95a68654349207aed4a66e162111aa1335331 100644 --- a/vipra-ui/app/js/app.js +++ b/vipra-ui/app/js/app.js @@ -208,7 +208,7 @@ prepend: false, merge: true }, { - fadeAfter: 0 + fadeAfter: 10000 }); } @@ -237,14 +237,6 @@ $rootScope.$on('$stateChangeStart', function() { $rootScope.alerts = []; }); - - $rootScope.handleWSMessage = function(data) { - Alerter.showInfo(null, data.message, {fadeAfter: 7000}); - }; - - $rootScope.showMessage = function(msg) { - Alerter.showInfo(null, msg, {fadeAfter: 7000}); - }; }]); $(document).on('change', '.btn-file :file', function() { diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js index b66a6f1d301689b4ccbbae6b9acd09efe4c7df4a..c9000674e51d89042933b7d28e0ac93e1d14ecec 100644 --- a/vipra-ui/app/js/controllers.js +++ b/vipra-ui/app/js/controllers.js @@ -395,7 +395,7 @@ var topicNode = function(topic, x, y) { topic = topic.topic || topic; - return newNode(topic.name, 'topic', 'topics.show', topic.id, $scope.colors.topics, 'triangle', $scope.loadTopic, x, y); + return newNode(topic.name, 'topic', 'topics.show', topic.id, topic.color, 'triangle', $scope.loadTopic, x, y); }; var articleNode = function(article, x, y) { diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js index b3b0665114f3f7695e8996ec55c4b1d0f6663a5f..1c1aec18a9b004241ff60123e1fe69ef20d62987 100644 --- a/vipra-ui/app/js/directives.js +++ b/vipra-ui/app/js/directives.js @@ -114,6 +114,21 @@ }; }]); + app.directive('paginationFull', [function() { + return { + restrict: 'E', + replace: true, + scope: { + total: '=', + page: '=', + limit: '=', + change: '&' + }, + controller: 'PaginationController', + templateUrl: 'html/directives/pagination-full.html' + }; + }]); + app.directive('highcharts', [function() { return { scope: { @@ -463,7 +478,7 @@ app.directive('menuAffix', [function() { return { transclude: true, - template: '<div class="menu-affix" ng-transclude></div><div class="affix-after"></div>', + template: '<div class="menu-affix hidden-md" ng-transclude></div><div class="affix-after"></div>', link: function($scope, $elem) { var elem = $elem.find('.menu-affix'), after = $elem.find('.affix-after'); @@ -513,14 +528,6 @@ scope: { ngModel: '=' }, - link: function($scope, $elem) { - $elem.on('click', 'a', function() { - var c = $(this).data('char'); - $scope.$apply(function() { - $scope.ngModel = c; - }); - }); - }, templateUrl: 'html/directives/char-selector.html' }; }]); diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less index f344e314bcf5f5d651bae313a2c20ed4d6a52b83..620308628311a387d215594bbeb4d87db63ccaa8 100644 --- a/vipra-ui/app/less/app.less +++ b/vipra-ui/app/less/app.less @@ -972,6 +972,29 @@ entity-menu { text-shadow: 1px 1px 1px #888, 1px -1px 1px #888, -1px 1px 1px #888, -1px -1px 1px #888; } +.sidebar-affix { + position: fixed; +} + +.active-topicmodel { + max-width: 120px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.stats-badges { + font-size: 18px; +} + +[ng\:cloak], [ng-cloak], .ng-cloak { + display: none !important; +} + +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide { + display: none !important; +} + @keyframes spin { 100% { -webkit-transform: rotateY(360deg); @@ -1015,12 +1038,60 @@ entity-menu { } } -[ng\:cloak], [ng-cloak], .ng-cloak { - display: none !important; +@media (min-width: 1200px) { + .sidebar-affix { + width: 262.5px; + } } -[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide { - display: none !important; +@media (max-width: 1050px) { + .search-form { + display: none; + } +} + +@media (min-width: 992px) { + .sidebar-affix { + width: 212.5px; + } +} + +@media (max-width: 920px) { + .navbar-header { + float: none; + } + .navbar-toggle { + display: block; + } + .navbar-collapse { + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + } + .navbar-collapse.collapse { + display: none!important; + } + .navbar-nav { + float: none!important; + margin: 7.5px -15px; + } + .navbar-nav>li { + float: none; + } + .navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + } + .navbar-text { + float: none; + margin: 15px 0; + } + /* since 3.1.0 */ + .navbar-collapse.collapse.in { + display: block!important; + } + .collapsing { + overflow: hidden!important; + } } @media screen and (max-width: 900px) {