diff --git a/make-release.sh b/make-release.sh index 8d4459fc9f159622d276c1978b0866eb3ac6a92e..2d85f1f62fd75a31c8bcd8ffac6857d4b6fc9ea6 100755 --- a/make-release.sh +++ b/make-release.sh @@ -25,6 +25,7 @@ cp -r $DIR/vipra-cmd/target/lib $REL/vipra-cmd/lib cp -r $DIR/vipra-ui/public $REL/vipra-ui cp $DIR/vipra $REL/vipra-cmd/vipra cp $DIR/LICENSE $DIR/README.md $REL +cp $DIR/scripts/* $REL tar zcf $REL_NAME.tar.gz $REL_NAME rm -rf $REL diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100644 index 0000000000000000000000000000000000000000..cc1f786e84631faabc68d86a3aefffbd1ae03a06 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1 @@ +#!/bin/bash \ No newline at end of file diff --git a/scripts/uninstall.sh b/scripts/uninstall.sh new file mode 100644 index 0000000000000000000000000000000000000000..cc1f786e84631faabc68d86a3aefffbd1ae03a06 --- /dev/null +++ b/scripts/uninstall.sh @@ -0,0 +1 @@ +#!/bin/bash \ No newline at end of file diff --git a/vipra-ui/app/html/articles/index.html b/vipra-ui/app/html/articles/index.html index 53f8ff372fefc95e3b39cf4219d89191582f0424..88ca1fd8df6ef85e5528a00d36a40fa8b2dea596 100644 --- a/vipra-ui/app/html/articles/index.html +++ b/vipra-ui/app/html/articles/index.html @@ -1,44 +1,46 @@ -<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'articles'"> - <div class="row"> - <div class="col-md-12 text-center"> +<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> - </div> - <div class="row"> - <div class="col-md-12"> - <div class="panel panel-default"> - <div class="panel-heading"> - Found - <ng-pluralize count="articlesTotal||0" when="{0:'no articles',1:'1 article',other:'{} articles'}"></ng-pluralize> in the database. - <span ng-show="articlesTotal" 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> - <table class="table table-hover table-condensed"> - <tbody> - <tr ng-repeat="article in articles"> - <td> - <article-link article="::article"/> - </td> - </tr> - </tbody> - </table> - <div class="panel-footer"> - Page <span ng-bind="articlesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </menu-affix> + <div class="container"> + <div class="row"> + <div class="col-md-12"> + <div class="panel panel-default"> + <div class="panel-heading"> + 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> + <table class="table table-hover table-condensed"> + <tbody> + <tr ng-repeat="article in articles"> + <td> + <article-link article="::article"/> + </td> + </tr> + </tbody> + </table> + <div class="panel-footer"> + Page <span ng-bind="articlesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> </div> </div> - </div> - <div class="row"> - <div class="col-md-12 text-center"> - <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" /> + <div class="row"> + <div class="col-md-12 text-center"> + <pagination total="articlesTotal" page="articlesIndexModels.page" limit="articlesIndexModels.limit" /> + </div> </div> </div> </div> diff --git a/vipra-ui/app/html/entities/index.html b/vipra-ui/app/html/entities/index.html index 464c3510d431a27b1e723a818ecfc4f5e31450cf..2554c3f2d484dc5c29d5653365a8821fef76e22c 100644 --- a/vipra-ui/app/html/entities/index.html +++ b/vipra-ui/app/html/entities/index.html @@ -1,41 +1,43 @@ -<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'entities'"> - <div class="row"> - <div class="col-md-12 text-center"> +<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> - </div> - <div class="row"> - <div class="col-md-12"> - <div class="panel panel-default"> - <div class="panel-heading"> - Found - <ng-pluralize count="entitiesTotal||0" when="{0:'no entities',1:'1 entity',other:'{} entities'}"></ng-pluralize> in the database. - <span ng-show="entitiesTotal" 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> - <table class="table table-hover table-condensed"> - <tbody> - <tr ng-repeat="entity in entities"> - <td> - <entity-link entity="::entity" /> - </td> - </tr> - </tbody> - </table> - <div class="panel-footer"> - Page <span ng-bind="entitiesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </menu-affix> + <div class="container"> + <div class="row"> + <div class="col-md-12"> + <div class="panel panel-default"> + <div class="panel-heading"> + 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> + <table class="table table-hover table-condensed"> + <tbody> + <tr ng-repeat="entity in entities"> + <td> + <entity-link entity="::entity" /> + </td> + </tr> + </tbody> + </table> + <div class="panel-footer"> + Page <span ng-bind="entitiesIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> </div> </div> - </div> - <div class="row"> - <div class="col-md-12 text-center"> - <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" /> + <div class="row"> + <div class="col-md-12 text-center"> + <pagination total="entitiesTotal" page="entitiesIndexModels.page" limit="entitiesIndexModels.limit" /> + </div> </div> </div> </div> diff --git a/vipra-ui/app/html/entities/show.html b/vipra-ui/app/html/entities/show.html index 0b019785b96a496cf641cd08a7f73efd6867ac2c..d3f32700398e4d290104d4e55d9ed369d0b3d48c 100644 --- a/vipra-ui/app/html/entities/show.html +++ b/vipra-ui/app/html/entities/show.html @@ -1 +1,6 @@ +<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'entities.show'"> + <div class="page-header no-border"> + <h1 ng-bind="::entity.id"></h1> + </div> +</div> <div ng-cloak ui-view></div> \ No newline at end of file diff --git a/vipra-ui/app/html/topics/index.html b/vipra-ui/app/html/topics/index.html index ee2f178ce88de82bdf076957dbae1fa9c4aef6a8..8d7c207d90629580346c406529651d40c539ffe1 100644 --- a/vipra-ui/app/html/topics/index.html +++ b/vipra-ui/app/html/topics/index.html @@ -1,43 +1,45 @@ -<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'topics'"> - <div class="row"> - <div class="col-md-12 text-center"> +<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> - </div> - <div class="row"> - <div class="col-md-12"> - <div class="panel panel-default"> - <div class="panel-heading"> - 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> - <table class="table table-hover table-condensed"> - <tbody> - <tr ng-repeat="topic in topics"> - <td> - <topic-link topic="::topic" /> - </td> - </tr> - </tbody> - </table> - <div class="panel-footer"> - Page <span ng-bind="topicsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </menu-affix> + <div class="container"> + <div class="row"> + <div class="col-md-12"> + <div class="panel panel-default"> + <div class="panel-heading"> + 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> + <table class="table table-hover table-condensed"> + <tbody> + <tr ng-repeat="topic in topics"> + <td> + <topic-link topic="::topic" /> + </td> + </tr> + </tbody> + </table> + <div class="panel-footer"> + Page <span ng-bind="topicsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> </div> </div> - </div> - <div class="row"> - <div class="col-md-12 text-center"> - <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" /> + <div class="row"> + <div class="col-md-12 text-center"> + <pagination total="topicsTotal" page="topicsIndexModels.page" limit="topicsIndexModels.limit" /> + </div> </div> </div> </div> diff --git a/vipra-ui/app/html/words/index.html b/vipra-ui/app/html/words/index.html index 6aa755fd97570a4df305552214f290dd04ff5733..60ca039549f28621b042debb5dfca62bf2afcc3c 100644 --- a/vipra-ui/app/html/words/index.html +++ b/vipra-ui/app/html/words/index.html @@ -1,41 +1,43 @@ -<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'words'"> - <div class="row"> - <div class="col-md-12 text-center"> +<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> - </div> - <div class="row"> - <div class="col-md-12"> - <div class="panel panel-default"> - <div class="panel-heading"> - Found - <ng-pluralize count="wordsTotal||0" when="{0:'no words',1:'1 word',other:'{} words'}"></ng-pluralize> in the database. - <span ng-show="wordsTotal" 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> - <table class="table table-hover table-condensed"> - <tbody> - <tr ng-repeat="word in words"> - <td> - <word-link word="::word" /> - </td> - </tr> - </tbody> - </table> - <div class="panel-footer"> - Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </menu-affix> + <div class="container"> + <div class="row"> + <div class="col-md-12"> + <div class="panel panel-default"> + <div class="panel-heading"> + 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> + <table class="table table-hover table-condensed"> + <tbody> + <tr ng-repeat="word in words"> + <td> + <word-link word="::word" /> + </td> + </tr> + </tbody> + </table> + <div class="panel-footer"> + Page <span ng-bind="wordsIndexModels.page||1"></span> of <span ng-bind="maxPage||1"></span> + </div> </div> </div> </div> - </div> - <div class="row"> - <div class="col-md-12 text-center"> - <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" /> + <div class="row"> + <div class="col-md-12 text-center"> + <pagination total="wordsTotal" page="wordsIndexModels.page" limit="wordsIndexModels.limit" /> + </div> </div> </div> </div> diff --git a/vipra-ui/app/html/words/show.html b/vipra-ui/app/html/words/show.html index 0b019785b96a496cf641cd08a7f73efd6867ac2c..b9dcd52cb647569fb4273f68279fd4e9199e55b3 100644 --- a/vipra-ui/app/html/words/show.html +++ b/vipra-ui/app/html/words/show.html @@ -1 +1,6 @@ +<div class="container" ng-cloak ng-hide="!rootModels.topicModel || state.name !== 'words.show'"> + <div class="page-header no-border"> + <h1 ng-bind="::word.id"></h1> + </div> +</div> <div ng-cloak ui-view></div> \ No newline at end of file diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js index 0b589b064ca8af23715c4e27d03cb691193b7e08..f9e77c957d414bf133148452973a606dcbb68625 100644 --- a/vipra-ui/app/js/controllers.js +++ b/vipra-ui/app/js/controllers.js @@ -884,8 +884,8 @@ /** * Topic Show route */ - app.controller('TopicsShowController', ['$scope', '$state', '$stateParams', '$timeout', 'hotkeys', 'TopicFactory', 'SequenceFactory', - function($scope, $state, $stateParams, $timeout, hotkeys, TopicFactory, SequenceFactory) { + app.controller('TopicsShowController', ['$scope', '$state', '$stateParams', '$timeout', 'TopicFactory', 'SequenceFactory', + function($scope, $state, $stateParams, $timeout, TopicFactory, SequenceFactory) { $scope.topicsShowModels = { relSeqstyle: 'absolute', @@ -1150,9 +1150,20 @@ } ]); - app.controller('EntitiesShowController', [ - function() { - // TODO implement + app.controller('EntitiesShowController', ['$scope', '$stateParams', 'EntityFactory', + function($scope, $stateParams, EntityFactory) { + + EntityFactory.get({ + id: $stateParams.id + }, function(data) { + $scope.entity = data; + $scope.entityCreated = Vipra.formatDateTime($scope.entity.created); + $scope.entityModified = Vipra.formatDateTime($scope.entity.modified); + + // take entity model from entity + if (!angular.isObject($scope.rootModels.topicModel)) + $scope.rootModels.topicModel = data.topicModel; + }); } ]); @@ -1227,9 +1238,18 @@ } ]); - app.controller('WordsShowController', [ - function() { - // TODO implement + app.controller('WordsShowController', ['$scope', '$stateParams', 'WordFactory', + function($scope, $stateParams, WordFactory) { + + WordFactory.get({ + id: $stateParams.id + }, function(data) { + $scope.word = data; + + // take word model from word + if (!angular.isObject($scope.rootModels.topicModel)) + $scope.rootModels.topicModel = data.topicModel; + }); } ]); @@ -1392,7 +1412,6 @@ $scope.changePage = function(page) { $scope.page = page; - window.scrollTo(0, 0); }; $scope.toPage = function() { diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js index ce763602453c5b77a3664dcd0a758083249272a1..b2e77c97973da39873e9cad5e34b8bf1d7cea57a 100644 --- a/vipra-ui/app/js/directives.js +++ b/vipra-ui/app/js/directives.js @@ -426,4 +426,29 @@ }; }]); + app.directive('menuAffix', [function() { + return { + transclude: true, + template: '<div class="menu-affix" ng-transclude></div><div class="affix-after"></div>', + link: function($scope, $elem) { + var elem = $elem.find('.menu-affix'), + after = $elem.find('.affix-after'); + + elem.affix({ + offset: { + top: elem.offset().top - 50 + } + }); + + elem.on('affix.bs.affix', function() { + after.css('height', elem.height()); + }); + + elem.on('affix-top.bs.affix', function() { + after.css('height', 0); + }); + } + }; + }]); + })(); \ No newline at end of file diff --git a/vipra-ui/app/js/factories.js b/vipra-ui/app/js/factories.js index b9195e4e164d984a216ce33093a628bff0a36881..7cb747e7f32322a41c4b79ad658d589c391df14c 100644 --- a/vipra-ui/app/js/factories.js +++ b/vipra-ui/app/js/factories.js @@ -69,7 +69,11 @@ }]); app.factory('TopicModelFactory', ['$myResource', function($myResource) { - return $myResource(Vipra.config.restUrl + '/topicmodels/:id'); + return $myResource(Vipra.config.restUrl + '/topicmodels/:id', {}, { + query: { + cache: false + } + }); }]); app.factory('WordFactory', ['$myResource', function($myResource) { diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less index 83d3a28de35fe97ede348a79a378ed0d6b5bae13..48c80f79ef3a3a1f406cd1660101ff5bca991073 100644 --- a/vipra-ui/app/less/app.less +++ b/vipra-ui/app/less/app.less @@ -506,6 +506,24 @@ entity-menu { } } +.menu-affix { + width: 100%; + top: 50px; + left: 0; + right: 0; + background: #fff; + z-index: 1030; + line-height: 0; + + &.affix { + border-bottom: 1px solid #ddd; + } + + .pagination { + margin: 10px 0; + } +} + @-moz-keyframes spin { 100% { -moz-transform: rotateY(360deg);