summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2016-02-11 22:36:29 +0100
committerBernhard Posselt <dev@bernhard-posselt.com>2016-02-11 22:36:29 +0100
commit13e6e80281a0c7ddc980006ae39ae3bae4cb03d1 (patch)
tree767d7556cb419ab48bbb75e2563eeb1623ebd225
parentc191ea52765c2515560eee01c62c61485b1ff6af (diff)
migrate js build system to gulp
-rw-r--r--.travis.yml13
-rw-r--r--css/news.min.css2
-rw-r--r--css/news.min.css.map1
-rw-r--r--db/newsmapper.php2
-rw-r--r--js/.jshintignore3
-rw-r--r--js/.jshintrc3
-rw-r--r--js/Gruntfile.js241
-rw-r--r--js/README.md43
-rw-r--r--js/app/App.js2
-rw-r--r--js/app/Config.js3
-rw-r--r--js/build/app.js3178
-rw-r--r--js/build/app.min.js6
-rw-r--r--js/build/app.min.js.map1
-rw-r--r--js/controller/AppController.js2
-rw-r--r--js/gui/ExternSubscription.js2
-rw-r--r--js/gulpfile.js93
-rw-r--r--js/karma.conf.js5
-rw-r--r--js/package.json24
-rw-r--r--js/tests/unit/controller/AppControllerSpec.js2
-rw-r--r--phpunit.integration.xml2
-rw-r--r--phpunit.xml2
-rw-r--r--templates/index.php11
22 files changed, 146 insertions, 3495 deletions
diff --git a/.travis.yml b/.travis.yml
index 04ff6422c..a857a6c44 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -61,18 +61,19 @@ before_script:
- cd apps/news/js
# install test deps
- npm install --deps # npm install needs to run before sudo npm install because otherwise it fails because a tmp file exists in the home dir
- - sudo npm -g install grunt-cli protractor
+ - sudo npm -g install gulp-cli protractor
+ - cd ..
- wget https://scrutinizer-ci.com/ocular.phar
script:
# unit tests
- - grunt php-unit
+ - phpunit
- php ocular.phar code-coverage:upload --format=php-clover ../coverage.clover
- - grunt js-unit
- # integration tests
- - grunt php-integration
+ - phpunit -c phpunit.integration.xml
+ - cd js
+ - gulp karma
# acceptance tests
- - webdriver-manager update
+ # - webdriver-manager update
- sudo chown -R www-data:www-data ../../../data
- sudo chmod -R a+rwx ../../../data
#- grunt acceptance --verbose
diff --git a/css/news.min.css b/css/news.min.css
deleted file mode 100644
index 42615b5a5..000000000
--- a/css/news.min.css
+++ /dev/null
@@ -1,2 +0,0 @@
-#app-content #searchresults,#undo{display:none}#app-content .body a,#app-content .body h3,#app-content .heading a:hover,#app-content .subtitle a:hover,#app-settings-content a,#explore .explore-footer a,#explore h1 a:hover,#notification a,#undo a:hover{text-decoration:underline}#global-loading{width:100%;height:100%}#undo-container{position:fixed;top:0;width:100%;text-align:center;z-index:101;line-height:1.2}#undo{z-index:101;background-color:#fc4;border:0;padding:0 .7em .3em;position:relative;top:0;border-bottom-left-radius:1em;border-bottom-right-radius:1em}#undo a{font-weight:700}#searchbox{display:block!important}#app-content .no-feeds-available{text-align:center;color:#333;font-size:16pt;min-height:100%;height:100%;width:100%;display:table}#app-content .no-feeds-available p{vertical-align:middle;display:table-cell}#app-content-wrapper,#articles{height:100%}#app-content .podcast{height:30px;z-index:10000;background-color:#111}#app-content .podcast audio{display:block;float:left;width:calc(100% - 60px);height:30px;border-radius:0}#app-content .podcast a,#app-content .podcast button{display:block;float:left;height:30px;width:30px;border:0;border-radius:0;margin:0;background-color:transparent;background-repeat:no-repeat;background-position:center}#app-content .podcast-close{background-size:25px;background-image:url(../img/close.svg)}#app-content .podcast-download{transform:rotate(270deg);background-size:20px;background-image:url(../img/arrow-white.svg)}#app-content .podcast audio::-webkit-media-controls-enclosure{max-width:inherit}#app-content .podcast.fixed{position:absolute;right:0;left:0}#notification a{color:#00f}#notification li{display:block}#app-content.loading-content{background:url(../img/loading.gif) calc(50% - 16px) calc(50% - 16px) no-repeat;transition:none!important;-webkit-transition:none!important;-moz-webkit-transition:none!important}#app-content.loading-content #app-content-wrapper{display:none}#app-content:not(.explore) #articles:after{content:'';display:block;height:100%;background-repeat:no-repeat}#app-content .autopaging: #articles:after{content:'';background-image:url(../img/loading.gif);background-position:calc(50% - 16px) calc(50% - 16px);transition:none!important;-webkit-transition:none!important;-moz-webkit-transition:none!important}#app-content .finished-auto-paging #articles:after{background-image:-o-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:-moz-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:-webkit-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:-ms-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:linear-gradient(to top,#eee 0,#FEFEFE 100%)}.pull-to-refresh{height:0;overflow:hidden;text-align:center;background-image:-moz-linear-gradient(top,#eee 0,#fefefe 100%);background-image:-webkit-linear-gradient(top,#eee 0,#fefefe 100%);background-image:-ms-linear-gradient(top,#eee 0,#fefefe 100%);background-image:linear-gradient(top,#eee 0,#fefefe 100%)}.pull-to-refresh.show-pull-to-refresh{transition:all .5s ease;padding-top:10px;height:44px}#app-content .only-in-expanded{display:block}#app-content .compact .only-in-expanded,#app-content .only-in-compact{display:none}#app-content .compact .only-in-compact{display:block}#app-content .item{cursor:default;border-bottom:1px solid #eee;background-image:linear-gradient(top,#f8f8f8 0,#fff 84px)}#app-content .item:last-child{border-bottom:0}#app-content .utils{width:100%;line-height:52px;box-sizing:border-box;padding:15px 50px 0 15px}#app-content .compact .utils{cursor:pointer;padding-top:0}#app-content .utils ul{height:40px;list-style-type:none;display:flex;margin:0;padding:0}#app-content .open .utils ul{height:auto}#app-content .utils ul>li{min-width:0}#app-content .util-spacer{width:20px}#app-content .compact .util-spacer{width:19px}#app-content .utils li{line-height:40px;vertical-align:middle}#app-content .utils>ul>li:last-child{padding-right:0}#app-content .utils>ul>li:first-child{padding-left:0}#app-content .utils .util{padding:0 6px}#app-content .utils .external,#app-content .utils button{padding:0;margin:0;height:40px;width:40px;border:0;float:left;background-color:transparent;background-repeat:no-repeat;background-size:25px;background-position:center}#app-content .utils .external,#app-content .utils .icon-toggle,#app-content .utils .menu button{display:inline-block;opacity:.3}#app-content .utils .external:hover,#app-content .utils .icon-toggle.keep-unread,#app-content .utils .icon-toggle:hover,#app-content .utils .menu button:hover{opacity:1}#app-content .utils .star{background-image:url(../img/inactive_star.svg)}#app-content .utils .star:hover,#app-content .utils .starred{background-image:url(../img/active_star.svg)}#app-content .utils .more button{opacity:.3}#app-content .utils .more button:hover{opacity:1}#app-content .utils .more{position:relative}#app-content .article-actions{display:none;filter:drop-shadow(0 0 5px rgba(150, 150, 150, .75));-webkit-filter:drop-shadow(0 0 5px rgba(150, 150, 150, .75));-moz-filter:drop-shadow(0 0 5px rgba(150, 150, 150, .75));position:absolute;top:40px;border-radius:3px;z-index:1000;border:1px solid transparent;background-color:#fff;margin:0;padding:0}#app-content .article-actions ul{display:flex;float:left}#app-content .article-actions li{float:left;width:52px!important}#app-content #articles:not(.compact) .article-actions{left:6px}#app-content #articles:not(.compact) .article-actions:after,#app-content #articles:not(.compact) .article-actions:before{left:20px}#app-content #articles.compact .article-actions{right:-10px}#app-content #articles.compact .article-actions:after,#app-content #articles.compact .article-actions:before{right:9px}#app-content .article-actions:after,#app-content .article-actions:before{bottom:100%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#app-content .article-actions:after{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:5px;margin-left:-5px}#app-content .article-actions:before{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:9px;margin-left:-9px}#app-content .utils .title{width:100%;padding-left:45px;background-position:10px 10px;background-size:20px 20px;background-repeat:no-repeat}#app-content .feed-view .utils .title{background:0 0!important;padding-left:10px}#app-content .utils .title h1 a{white-space:nowrap;overflow:hidden;width:100%;display:inline-block;color:#222;font-weight:700;font-size:16px;line-height:1.5;padding-top:8px;min-height:40px}#app-content .read .utils .title h1 a,#app-content .title .intro{font-weight:400;color:#777}#app-content .open .title .intro{display:none}#app-content .title .intro{font-size:10pt;margin-left:20px}#app-content .open .utils .title h1 a{overflow:auto;white-space:normal}#app-content .utils .date{padding:0 15px;margin-right:25px}#app-content .heading{padding:25px 0 10px}#app-content .heading h1{font-size:19px;max-width:770px;word-wrap:break-word}#app-content .heading a{font-weight:700;color:#222}#app-content .heading .date{float:right;display:inline-block;font-size:15px;padding:0 10px}#app-content .compact .article,#app-content .feed-view .source{display:none}#app-content .read .heading a{font-weight:400!important;color:#777}#app-content .article{min-height:69px;padding:0 50px 50px}#app-content .open .article{display:block}#app-content .subtitle{color:#777;font-size:15px;max-width:770px;padding-bottom:25px}#app-content .subtitle a{color:#777}#app-content .date{color:#777;white-space:nowrap}#app-content .author{color:#777;font-size:15px}#app-content .author a{color:inherit}#app-content .author a:hover{text-decoration:underline}#app-content .enclosure{padding:20px 0;max-width:770px;margin-bottom:15px}#app-content .enclosure audio,#app-content .enclosure img,#app-content .enclosure video{width:100%}#app-content .enclosure video{background-color:#000;margin-bottom:20px}#app-content .enclosure-error{line-height:1.5;height:40px}#app-content .body{max-width:770px;font-size:14px;clear:both;overflow-x:auto}#app-content .body p{line-height:1.5;margin:7px 0 14px}#app-content .body img,#app-content .body table{max-width:100%;height:auto;overflow:auto;word-wrap:break-word;white-space:normal}#app-content .body>div>:first-child>img:first-child,#app-content .body>div>img:first-child{padding:0 14px 0 0;float:left}#app-content .body h1,#app-content .body h2{font-size:17px;font-weight:700;color:#222;margin:21px 0 0}#app-content .body h3{font-size:15px;font-weight:700;color:#222;margin:21px 0 0}#app-content .body h4,#app-content .body h5,#app-content .body h6{font-weight:700}#app-content .body>div{margin:7px 0}#app-content .body a{color:#00f}#app-content .body ul{margin:7px 0;padding-left:14px;list-style-type:disc}#app-content .body ol{margin:7px 0;padding-left:21px}#app-content .body ul li{cursor:default;line-height:21px}#app-content .body pre{padding:7px 7px 7px 14px;background-color:#dadada;border:1px solid #ccc;margin:7px 0 14px;overflow-y:auto}#app-content .body pre::-webkit-scrollbar{height:10px}#app-content .body pre::-webkit-scrollbar-thumb{background:#333}#app-content .body pre::-webkit-scrollbar-track-piece{background:#ddd}#app-content .body code,#app-content .body pre{font-family:monospace;font-size:16px}#app-content .body blockquote{border-left:1px solid #d2d2d2;margin:25px 0;padding:0 0 0 15px;font-style:italic}#app-content .body em{font-style:italic;opacity:1}#app-content [dir=rtl]{text-align:right}#app-content .custom-heise-de .body p>span:first-child{display:inline-block;float:left;margin-right:10px;padding:6px 0}#app-content .custom-slashdot-org .body div>i{display:block;border-left:1px solid #d2d2d2;margin:25px 0;padding:0 0 0 15px}#app-content .custom-sueddeutsche-de .body img{float:none!important}#app-shortcuts table{border-collapse:collapse;width:100%;white-space:normal}#app-shortcuts tr:first-child{background-color:#f5f5f5}#app-shortcuts td,#app-shortcuts th{padding:10px}#app-shortcuts td{padding-right:15px}#app-shortcuts th{font-weight:700}#app-shortcuts td:first-child,#app-shortcuts th:first-child{text-align:right;font-weight:700;width:140px;-moz-box-sizing:content-box;box-sizing:content-box}@media (max-width:770px){#app-content .utils .date{display:none}#app-shortcuts th:first-child{padding-left:44px}}@media (max-width:600px){#app-content .article-actions ul{max-width:164px}#app-content .heading .date{display:none}#app-content .heading h1{margin-right:0}#app-content .utils{padding-right:15px}#app-content .article{padding-right:15px;padding-left:44px}}@media (max-width:340px){#app-content .article-actions{max-width:82px}}- #app-navigation .add-new .heading{height:44px;width:100%}#app-navigation .add-new .heading:hover{background-color:#ccc}#app-navigation .add-new .heading button{padding:0 0 0 44px;line-height:44px;width:100%;border:0;margin:0;text-align:left;font-weight:400;background-color:transparent;background-position:14px center}#app-navigation .add-new-popup{display:none;padding:10px;box-shadow:inset 0 0 10px #dedede;border-top:1px solid #dedede;border-bottom:1px solid #dedede}#app-navigation input.ng-invalid{border:1px solid #d14}#app-navigation .add-new-popup input,#app-navigation .add-new-popup select{width:100%;height:36px;padding:5px;margin-right:0}#app-navigation #new-feed [name=folderName],#app-navigation .add-new-popup select{width:calc(100% - 36px);border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;float:left}#app-navigation .add-new-popup .add-new-folder-primary{float:right;border-bottom-left-radius:0;border-top-left-radius:0;width:36px;height:36px;margin-left:0;margin-right:0}#app-navigation .add-new-popup .error{padding:0 0 10px}#app-navigation .icon-starred{background-image:url(../img/starred.png)}.icon-rss{background-image:url(../img/rss.svg)!important}.icon-full-text-enabled{background-image:url(../img/fulltext.svg);background-size:50%;opacity:.5}.icon-full-text-disabled{background-image:url(../img/nonfulltext.svg);background-size:50%;opacity:.5}#app-navigation .unread>a{font-weight:700}#app-navigation .entry-loading{background-image:url(../img/loading.gif)!important}#app-navigation input.entry-loading{background-size:20px}#app-navigation p.error{line-height:25px}#app-navigation .folder-rename-error{height:auto}#app-navigation .error-message{padding:15px;background-color:#DE1212;color:#fff;position:relative}#app-navigation .ui-state-disabled{opacity:1}#app-navigation .error-message .title{font-weight:700;padding-right:30px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#app-navigation .error-message button{top:0;right:0;position:absolute;margin:0;height:44px;width:44px;padding:15px;border:0;background-size:25px;background-color:transparent;background-image:url(../img/close.svg);background-repeat:no-repeat;background-position:right 5px top 5px;opacity:.9}#app-navigation .animate-show,#app-navigation .error-message button:hover{opacity:1}#app-navigation .animate-show.ng-hide-add,#app-navigation .animate-show.ng-hide-remove{transition:0s linear opacity}#app-navigation .animate-show.ng-hide-add-active,#app-navigation .animate-show.ng-hide-remove-active{transition:.2s linear opacity}#app-navigation .animate-show.ng-hide{opacity:0}#app-navigation .feed-no-ordering{transform:rotate(270deg)}#app-navigation .feed-reverse-ordering{transform:rotate(180deg)}#app-navigation .icon-pinned{background-image:url(../img/pinned.svg)}#app-navigation .icon-unpinned{background-image:url(../img/unpinned.svg)}#app-navigation .icon-updatemode-default{background-image:url(../img/updatemodedefault.svg)}#app-navigation .icon-updatemode-unread{background-image:url(../img/updatemodeunread.svg)}#app-navigation .updateerror a{background-color:orange!important}#app-navigation .add-new button,#app-navigation li a{opacity:1!important;color:#000!important}#app-navigation .active,#app-navigation .active a,#app-navigation li>a:hover{background-color:#ddd}#app-settings input[type=file]{position:absolute;left:-30000px}#app-settings .opened:hover{background-color:transparent!important}#app-settings-content{padding-bottom:25px}#app-settings-content h3{padding:5px 0;font-weight:700}#app-settings-content a{color:#00F}#app-settings-content p{padding:2px 2px 2px 10px}#app-settings-content label{display:block;padding-left:18px}#app-settings-content label input[type=checkbox]{margin-left:-18px;max-width:16px}.button-icon-label{background-position:10px center;background-size:16px;padding-left:25px}#app-settings .import-export h3{padding-top:15px;padding-bottom:5px}#app-settings .import-export a,#app-settings .import-export button{width:113px;height:30px;margin:0;vertical-align:middle;background-position:center}#explore,.explore #app-content-wrapper{height:100%}#app-settings .import-export a{display:inline-block}#app-settings .disabled{color:#aaa}#explore{width:100%;padding:45px 0 45px 45px}#explore .grid-item{float:left;width:300px;border-collapse:collapse;border:1px solid #ccc;margin:0 25px 25px 0}#explore h1{font-size:13pt;background-repeat:no-repeat;background-size:24px 24px;padding:5px 0 0 35px;background-position:0 center}#explore h1 a{word-wrap:break-word}#explore .category-wrapper{text-align:center}#explore .category{font-size:10pt;color:#fff;background-color:#1d2d44;padding:10px;font-weight:700}#explore .grid-item-content{padding:30px}#explore .explore-logo{text-align:center;margin-top:25px}#explore .explore-logo img{width:100%}#explore .explore-subscribe{padding-top:15px;text-align:right}#explore .explore-content{padding-top:25px}#explore .explore-filter{text-align:right;padding:0 30px 30px}#explore .explore-filter input,#explore .explore-filter select{margin-left:10px;display:inline-block}#explore .explore-filter input{width:200px}#explore .explore-footer{clear:both;margin:75px 0;text-align:center}#explore .explore-footer a{font-size:11pt;color:#00A}
-/*# sourceMappingURL=news.min.css.map */ \ No newline at end of file
diff --git a/css/news.min.css.map b/css/news.min.css.map
deleted file mode 100644
index cdd407c15..000000000
--- a/css/news.min.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../css/content.css","../css/app.css","../css/settings.css","../css/explore.css","../css/custom.css","../css/shortcuts.css","../css/mobile.css","../css/navigation.css"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/db/newsmapper.php b/db/newsmapper.php
index fd0408f77..feef949e8 100644
--- a/db/newsmapper.php
+++ b/db/newsmapper.php
@@ -69,4 +69,4 @@ abstract class NewsMapper extends Mapper {
return $this->findEntities($sql, $search, $limit, $offset);
}
-} \ No newline at end of file
+}
diff --git a/js/.jshintignore b/js/.jshintignore
new file mode 100644
index 000000000..eb5a16ccc
--- /dev/null
+++ b/js/.jshintignore
@@ -0,0 +1,3 @@
+build/
+node_modules/
+vendor/
diff --git a/js/.jshintrc b/js/.jshintrc
index 7835a8760..19894c5ea 100644
--- a/js/.jshintrc
+++ b/js/.jshintrc
@@ -47,6 +47,7 @@
"News": true,
"t": true,
"url": true,
- "navigator": true
+ "navigator": true,
+ "oc_requesttoken": true
}
}
diff --git a/js/Gruntfile.js b/js/Gruntfile.js
deleted file mode 100644
index 19a2967d8..000000000
--- a/js/Gruntfile.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/**
- * ownCloud - News
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later. See the COPYING file.
- *
- * @author Bernhard Posselt <dev@bernhard-posselt.com>
- * @copyright Bernhard Posselt 2012, 2014
- */
-module.exports = function (grunt) {
- 'use strict';
-
- // load needed modules
- grunt.loadNpmTasks('grunt-php');
- grunt.loadNpmTasks('grunt-contrib-concat');
- grunt.loadNpmTasks('grunt-contrib-watch');
- grunt.loadNpmTasks('grunt-contrib-connect');
- grunt.loadNpmTasks('grunt-contrib-jshint');
- grunt.loadNpmTasks('grunt-contrib-uglify');
- grunt.loadNpmTasks('grunt-contrib-cssmin');
- grunt.loadNpmTasks('grunt-phpunit');
- grunt.loadNpmTasks('grunt-wrap');
- grunt.loadNpmTasks('grunt-karma');
- grunt.loadNpmTasks('grunt-ng-annotate');
- grunt.loadNpmTasks('grunt-protractor-runner');
- grunt.loadNpmTasks('grunt-protractor-webdriver');
-
- grunt.initConfig({
- meta: {
- pkg: grunt.file.readJSON('package.json'),
- version: '<%= meta.pkg.version %>',
- production: 'build/'
- },
- concat: {
- options: {
- // remove license headers
- stripBanners: true
- },
- dist: {
- src: [
- 'app/App.js',
- 'app/Config.js',
- 'app/Run.js',
- 'controller/**/*.js',
- 'filter/**/*.js',
- 'service/**/*.js',
- 'gui/**/*.js',
- 'plugin/**/*.js',
- 'utility/**/*.js',
- 'directive/**/*.js'
- ],
- dest: '<%= meta.production %>app.js'
- }
- },
- ngAnnotate: {
- app: {
- src: ['<%= meta.production %>app.js'],
- dest: '<%= meta.production %>app.js'
- }
- },
- uglify: {
- app: {
- files: {
- '<%= meta.production %>app.min.js': [
- '<%= meta.production %>app.js'
- ]
- }
- },
- options: {
- sourceMap: true
- }
- },
- cssmin: {
- options: {
- sourceMap: true
- },
- news: {
- files: {
- '../css/news.min.css': [
- '../css/app.css',
- '../css/content.css',
- '../css/custom.css',
- '../css/shortcuts.css',
- '../css/mobile.css',
- '../css/navigation.css',
- '../css/settings.css',
- '../css/explore.css'
- ]
- }
- }
- },
- wrap: {
- basic: {
- src: ['<%= meta.production %>app.js'],
- dest: '<%= meta.production %>app.js',
- options: {
- wrapper: [
- '(function(navigator, window, document, angular, $, ' +
- 'OC, csrfToken, url, undefined){' +
- '\n\n\'use strict\';\n\n',
-
- '\n})(navigator, window, document, angular, jQuery, ' +
- ' OC, oc_requesttoken, url);'
- ]
- }
- }
- },
- jshint: {
- app: {
- src: [
- 'Gruntfile.js',
- 'app/App.js',
- 'app/Config.js',
- 'app/Run.js',
- 'filter/**/*.js',
- 'service/**/*.js',
- 'controller/**/*.js',
- 'directive/**/*.js',
- 'tests/**/*.js',
- 'gui/**/*.js',
- 'plugin/**/*.js',
- 'admin/**/*.js'
- ]
- },
- options: {
- jshintrc: true
- }
- },
- watch: {
- concat: {
- files: [
- '../css/*.css',
- '!../css/*.min.css',
- 'admin/**/*.js',
- 'tests/**/*.js',
- 'app/**/*.js',
- 'controller/**/*.js',
- 'utility/**/*.js',
- 'directive/**/*.js',
- 'filter/**/*.js',
- 'service/**/*.js',
- 'gui/**/*.js',
- 'plugin/**/*.js',
- '../templates/**/*.php'
- ],
- tasks: ['default'],
- options: {
- livereload: true
- }
- },
- phpunit: {
- files: [
- '../**/*.php'
- ],
- tasks: ['phpunit:unit']
- },
- phpintegration: {
- files: [
- '../**/*.php'
- ],
- tasks: ['phpunit:integration']
- }
- },
- karma: {
- unit: {
- configFile: 'karma.conf.js',
- autoWatch: true
- },
- continuous: {
- configFile: 'karma.conf.js',
- browsers: ['Firefox'],
- singleRun: true,
- }
- },
- phpunit: {
- unit: {
- options: {
- colors: true,
- configuration: '../phpunit.xml'
- }
- },
- coverage: {
- options: {
- colors: true,
- configuration: '../phpunit.xml',
- coverageClover: '../coverage.clover'
- }
- },
- integration: {
- options: {
- colors: true,
- configuration: '../phpunit.integration.xml'
- }
- },
- },
- /* jshint camelcase: false */
- protractor_webdriver: {
- app: {}
- },
- protractor: {
- firefox: {
- options: {
- configFile: 'protractor.conf.js'
- }
- },
- },
- connect: {
- server: {
- options: {
- base: 'tests/static/'
- }
- }
- },
- php: {
- dist: {
- options: {
- port: 8080,
- keepalive: true,
- open: true,
- base: '../../../'
- }
- }
- }
- });
-
- // make tasks available under simpler commands
- grunt.registerTask('default', ['jshint', 'concat', 'wrap', 'ngAnnotate',
- 'uglify', 'cssmin']);
- grunt.registerTask('dev', ['watch:concat']);
- grunt.registerTask('dev-js-unit', ['karma:unit']);
- grunt.registerTask('dev-php-unit', ['watch:phpunit']);
- grunt.registerTask('dev-php-integration', ['watch:phpintegration']);
-
- grunt.registerTask('js-unit', ['karma:continuous']);
- grunt.registerTask('php-unit', ['phpunit:coverage']);
- grunt.registerTask('php-integration', ['phpunit:integration']);
-
- grunt.registerTask('acceptance', ['protractor_webdriver', 'connect',
- 'protractor']);
-
-};
diff --git a/js/README.md b/js/README.md
index c03621fdc..2c25ce4ed 100644
--- a/js/README.md
+++ b/js/README.md
@@ -1,40 +1,17 @@
-# JavaScript && CSS Development
-Before starting, install nodejs and grunt-cli:
+# JavaScript
+Before starting, install nodejs and gulp-cli:
- sudo npm -g install grunt-cli
+ sudo npm -g install gulp-cli
then run:
npm install
+## Tasks
+The following tasks are available:
-## Building
-This sets up a watcher on file change and compiles CSS and JS:
-
- grunt dev
-
-If you don't want a watcher, just run:
-
- grunt
-
-## Testing
-Watch mode:
-
- grunt php
- grunt test
-
-Single run mode:
-
- grunt phpunit
- grunt ci-unit
-
-### Running e2e tests
-Install protractor and set up selenium:
-
- sudo npm install -g protractor
- sudo webdriver-manager update
-
-then the tests can be started with:
-
- grunt e2e
-
+* **Build the JavaScript**: gulp
+* **Watch for changes and build JavaScript**: gulp watch
+* **Run JavaScript unit tests**: gulp karma
+* **Watch for changes and run JavaScript unit tests**: gulp watch-karma
+* **Watch for changes and run PHP unit tests**: gulp watch-phpuni
diff --git a/js/app/App.js b/js/app/App.js
index 2c8e71419..37266a438 100644
--- a/js/app/App.js
+++ b/js/app/App.js
@@ -9,4 +9,4 @@
*/
/* jshint unused: false */
-var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); \ No newline at end of file
+var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']);
diff --git a/js/app/Config.js b/js/app/Config.js
index df7cc60e5..8c9c09290 100644
--- a/js/app/Config.js
+++ b/js/app/Config.js
@@ -37,7 +37,8 @@ app.config(function ($routeProvider, $provide, $httpProvider) {
$window.location.href.split($window.location.pathname)[0];
if (config.url.indexOf(BASE_URL) === 0 ||
config.url.indexOf(domain) === 0) {
- config.headers.requesttoken = csrfToken;
+ /*jshint camelcase: false */
+ config.headers.requesttoken = oc_requesttoken;
}
return config || $q.when(config);
diff --git a/js/build/app.js b/js/build/app.js
deleted file mode 100644
index 1520622d5..000000000
--- a/js/build/app.js
+++ /dev/null
@@ -1,3178 +0,0 @@
-(function(navigator, window, document, angular, $, OC, csrfToken, url, undefined){
-
-'use strict';
-
-
-/* jshint unused: false */
-var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']);
-app.config(["$routeProvider", "$provide", "$httpProvider", function ($routeProvider, $provide, $httpProvider) {
- 'use strict';
-
- var feedType = {
- FEED: 0,
- FOLDER: 1,
- STARRED: 2,
- SUBSCRIPTIONS: 3,
- SHARED: 4,
- EXPLORE: 5
- };
-
- // constants
- $provide.constant('REFRESH_RATE', 60); // seconds
- $provide.constant('ITEM_BATCH_SIZE', 40); // how many items should be
- // fetched initially
- $provide.constant('ITEM_AUTO_PAGE_SIZE', 20);
- $provide.constant('BASE_URL', OC.generateUrl('/apps/news'));
- $provide.constant('FEED_TYPE', feedType);
- $provide.constant('MARK_READ_TIMEOUT', 0.5);
- $provide.constant('SCROLL_TIMEOUT', 0.1);
-
- // make sure that the CSRF header is only sent to the ownCloud domain
- $provide.factory('CSRFInterceptor', ["$q", "BASE_URL", "$window", function ($q, BASE_URL, $window) {
- return {
- request: function (config) {
- var domain =
- $window.location.href.split($window.location.pathname)[0];
- if (config.url.indexOf(BASE_URL) === 0 ||
- config.url.indexOf(domain) === 0) {
- config.headers.requesttoken = csrfToken;
- }
-
- return config || $q.when(config);
- }
- };
- }]);
- var errorMessages = {
- 0: t('news', 'Request failed, network connection unavailable!'),
- 401: t('news', 'Request unauthorized. Are you logged in?'),
- 403: t('news', 'Request forbidden. Are you an admin?'),
- 412: t('news', 'Token expired or app not enabled! Reload the page!'),
- 500: t('news', 'Internal server error! Please check your ' +
- 'data/owncloud.log file for additional ' +
- 'information!'),
- 503: t('news', 'Request failed, ownCloud is in currently ' +