diff --git a/.bowerrc b/.bowerrc index 6e57b2ec9d..3f8ac64455 100644 --- a/.bowerrc +++ b/.bowerrc @@ -1,3 +1,3 @@ { - "directory" : "www/assets" + "directory" : "assets" } diff --git a/.gitignore b/.gitignore index 56f96c7332..533fa65a97 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ composer.phar behat.yml /datas /www/assets +/assets /www/skins/build diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000000..7945faff60 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,228 @@ +module.exports = function(grunt) { + grunt.initConfig({ + clean: { + "assets": ["assets", "www/assets"], + }, + bower: { + install: { + options: { + "copy": false + } + } + }, + bower_postinst: { + dist: { + options: { + components: { + "jquery.ui": ["npm", {"grunt": "build"}], + "bootstrap": ["npm", {"make": "bootstrap"}] + } + } + } + }, + copy: { + "backbone": { + "expand": true, + "src": [ + "assets/backbone-amd/LICENSE", + "assets/backbone-amd/backbone.js" + ], + "dest": "www/assets/backbone-amd/", + "flatten": true + }, + "blueimp": { + "expand": true, + "src": ["js/load-image.js", "css/jquery.fileupload-ui.css"], + "dest": "www/assets/blueimp-load-image/", + "cwd": "assets/blueimp-load-image" + }, + "bootstrap": { + "expand": true, + "cwd": "assets/bootstrap", + "src": [ + "bootstrap/css/*", + "bootstrap/js/*", + "bootstrap/img/*", + "LICENSE" + ], + "rename": function(dest, src) { + return dest + src.replace("bootstrap", ""); + }, + "dest": "www/assets/bootstrap/" + }, + "bootstrap-multiselect": { + "expand": true, + "cwd": "assets/bootstrap-multiselect", + "src": [ + "css/bootstrap-multiselect.css", + "js/bootstrap-multiselect.js", + ], + "dest": "www/assets/bootstrap-multiselect/" + }, + "chai": { + "expand": true, + "src": "assets/chai/chai.js", + "dest": "www/assets/chai/", + "flatten": true + }, + "font-awesome": { + "expand": true, + "cwd": "assets/font-awesome", + "src": ["css/*", "font/*"], + "dest": "www/assets/font-awesome/" + }, + "geonames-server-jquery-plugin": { + "expand": true, + "flatten": true, + "src": [ + "assets/geonames-server-jquery-plugin/LICENSE", + "assets/geonames-server-jquery-plugin/jquery.geonames.js" + ], + "dest": "www/assets/geonames-server-jquery-plugin" + } + , + "humane-js": { + "expand": true, + "src": ["humane.js", "themes/libnotify.css"], + "dest": "www/assets/humane-js/", + "cwd": "assets/humane-js/" + }, + "i18next": { + "expand": true, + "src": "assets/i18next/release/i18next.amd-1.6.3.js", + "dest": "www/assets/i18next/", + "flatten": true + }, + "jquery": { + "expand": true, + "src": "assets/jquery/jquery.js", + "dest": "www/assets/jquery/", + "flatten": true + }, + "jquery-file-upload": { + "expand": true, + "src": [ + "assets/jquery-file-upload/js/jquery.fileupload.js", + "assets/jquery-file-upload/js/jquery.iframe-transport.js" + ], + "dest": "www/assets/jquery-file-upload/", + "flatten": true + }, + "jquery-ui": { + "expand": true, + "cwd": "assets/jquery.ui/dist", + "src": [ + "i18n/*", + "images/*", + "themes/*", + "jquery-ui.css", + "jquery-ui.js" + ], + "dest": "www/assets/jquery.ui/" + }, + "js-fixture": { + "expand": true, + "src": [ + "assets/js-fixtures/LICENSE", + "assets/js-fixtures/fixtures.js" + ], + "dest": "www/assets/js-fixture/", + "flatten": true + }, + "json3": { + "expand": true, + "src": [ + "assets/json3/LICENSE", + "assets/json3/lib/json3.js" + ], + "dest": "www/assets/json3/", + "flatten": true + }, + "mocha": { + "expand": true, + "src": [ + "assets/mocha/LICENSE", + "assets/mocha/mocha.js", + "assets/mocha/mocha.css" + ], + "dest": "www/assets/mocha/", + "flatten": true + }, + "modernizr": { + "expand": true, + "src": "assets/modernizr/modernizr.js", + "dest": "www/assets/modernizr/", + "flatten": true + }, + "normalize": { + "expand": true, + "src": [ + "assets/normalize-css/normalize.css", + "assets/normalize-css/LICENSE.md" + ], + "dest": "www/assets/normalize-css/", + "flatten": true + }, + "qunit": { + "expand": true, + "src": [ + "assets/qunit/qunit/qunit.css", + "assets/qunit/qunit/qunit.js" + ], + "dest": "www/assets/qunit/", + "flatten": true + }, + "requirejs": { + "expand": true, + "src": [ + "assets/requirejs/LICENSE", + "assets/requirejs/require.js" + ], + "dest": "www/assets/requirejs/", + "flatten": true + }, + "underscore": { + "expand": true, + "src": [ + "assets/underscore-amd/LICENSE", + "assets/underscore-amd/underscore.js" + ], + "dest": "www/assets/underscore-amd/", + "flatten": true + }, + "zxcvbn": { + "expand": true, + "src": [ + "assets/zxcvbn/LICENSE.txt", + "assets/zxcvbn/zxcvbn-async.js" + ], + "dest": "www/assets/zxcvbn", + "flatten": true + } + }, + less: { + login: { + options: { + paths: ["www/skins/login/less"], + }, + files: { + "www/assets/build/login.css": "www/skins/login/less/login.less" + } + }, + account: { + options: { + paths: ["www/skins/account"], + }, + files: { + "www/assets/build/account.css": "www/skins/account/account.less" + } + }, + } + }); + + grunt.loadNpmTasks("grunt-contrib"); + grunt.loadNpmTasks("grunt-bower-task"); + grunt.loadNpmTasks("grunt-bower-postinst"); + + grunt.registerTask("build-assets", ["clean:assets", "bower", "bower_postinst", "copy", "less"]); +}; diff --git a/bower.json b/bower.json index 6755db22a7..2e4aa507e3 100644 --- a/bower.json +++ b/bower.json @@ -6,7 +6,6 @@ "jquery": "~1.8.3", "jquery.ui": "~1.10.0", "font-awesome": "~3.0.2", - "underscore": "~1.4.4", "modernizr": "~2.6.2", "normalize-css" : "~2.1.0", "json3" : "3.2.4", @@ -20,8 +19,6 @@ "mocha": "~1.9", "chai" : "~1.6", "i18next": "~1.6", - "sinon": "~1.7", - "sinon-chai": "~2.4", "js-fixtures": "https://github.com/badunk/js-fixtures/archive/master.zip", "bootstrap-multiselect": "https://github.com/davidstutz/bootstrap-multiselect.git", "zxcvbn" : "https://github.com/lowe/zxcvbn.git", diff --git a/builder.php b/builder.php index b7e401ef47..b926eb41e2 100755 --- a/builder.php +++ b/builder.php @@ -93,6 +93,7 @@ $finder ->name('sinon-chai') ->name('js-fixtures') ->name('node_modules') + ->name('assets') ->ignoreDotFiles(false) ->ignoreVCS(false) ->in(__DIR__); diff --git a/lib/conf.d/minifyGroupsConfig.php b/lib/conf.d/minifyGroupsConfig.php index 983ce92163..6cb5e73d92 100644 --- a/lib/conf.d/minifyGroupsConfig.php +++ b/lib/conf.d/minifyGroupsConfig.php @@ -46,9 +46,9 @@ $groups = array( , '//include/jquery.common.js' , '//include/jquery.tooltip.js' , '//include/jslibs/jquery.contextmenu_scroll.js' - , '//assets/blueimp-load-image/js/load-image.js' - , '//assets/jquery-file-upload/js/jquery.iframe-transport.js' - , '//assets/jquery-file-upload/js/jquery.fileupload.js' + , '//assets/blueimp-load-image/load-image.js' + , '//assets/jquery-file-upload/jquery.iframe-transport.js' + , '//assets/jquery-file-upload/jquery.fileupload.js' ), 'report' => array( '//include/jslibs/jquery-ui-1.10.3/jquery-ui-i18n.js' @@ -76,9 +76,9 @@ $groups = array( , '//include/jslibs/jquery.cookie.js' , '//include/jquery.common.js' , '//assets/humane-js/humane.js' - , '//assets/blueimp-load-image/js/load-image.js' - , '//assets/jquery-file-upload/js/jquery.iframe-transport.js' - , '//assets/jquery-file-upload/js/jquery.fileupload.js' + , '//assets/blueimp-load-image/load-image.js' + , '//assets/jquery-file-upload/jquery.iframe-transport.js' + , '//assets/jquery-file-upload/jquery.fileupload.js' , '//include/jslibs/jquery.form.2.49.js' , '//include/jslibs/jquery.vertical.buttonset.js' , '//include/js/jquery.Selection.js' diff --git a/package.json b/package.json index 93c8319518..b60722df6b 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,10 @@ "mocha-phantomjs": ">=2.0 <3.0", "recess": ">=1.1.0 <1.1.7", "uglify-js": "latest", - "phantomjs": "latest" + "phantomjs": "latest", + "grunt": "~0.4.1", + "grunt-contrib": "latest", + "grunt-bower-task": "latest", + "grunt-bower-postinst": "latest" } } diff --git a/templates/web/common/index_bootstrap.html.twig b/templates/web/common/index_bootstrap.html.twig index e27232ceb0..fca7cafab7 100644 --- a/templates/web/common/index_bootstrap.html.twig +++ b/templates/web/common/index_bootstrap.html.twig @@ -12,7 +12,7 @@ diff --git a/templates/web/login/layout/base-layout.html.twig b/templates/web/login/layout/base-layout.html.twig index 96a9badeff..18724e83c9 100644 --- a/templates/web/login/layout/base-layout.html.twig +++ b/templates/web/login/layout/base-layout.html.twig @@ -36,7 +36,7 @@ {% block header_javascript %} {# include backbone templates #} diff --git a/www/skins/account/account.less b/www/skins/account/account.less index b2d346b460..1e45359942 100644 --- a/www/skins/account/account.less +++ b/www/skins/account/account.less @@ -1,61 +1,61 @@ // CSS Reset -@import "../../assets/bootstrap/less/reset.less"; +@import "../../../assets/bootstrap/less/reset.less"; // Core variables and mixins -@import "../../assets/bootstrap/less/variables.less"; +@import "../../../assets/bootstrap/less/variables.less"; @import "variables.less"; @import "../../../plugins/account.less"; -@import "../../assets/bootstrap/less/mixins.less"; +@import "../../../assets/bootstrap/less/mixins.less"; // Grid system and page structure -@import "../../assets/bootstrap/less/scaffolding.less"; -@import "../../assets/bootstrap/less/grid.less"; -@import "../../assets/bootstrap/less/layouts.less"; +@import "../../../assets/bootstrap/less/scaffolding.less"; +@import "../../../assets/bootstrap/less/grid.less"; +@import "../../../assets/bootstrap/less/layouts.less"; // Base CSS -@import "../../assets/bootstrap/less/type.less"; -@import "../../assets/bootstrap/less/code.less"; -@import "../../assets/bootstrap/less/forms.less"; -@import "../../assets/bootstrap/less/tables.less"; +@import "../../../assets/bootstrap/less/type.less"; +@import "../../../assets/bootstrap/less/code.less"; +@import "../../../assets/bootstrap/less/forms.less"; +@import "../../../assets/bootstrap/less/tables.less"; // Components: common -@import "../../assets/bootstrap/less/sprites.less"; -@import "../../assets/bootstrap/less/dropdowns.less"; -@import "../../assets/bootstrap/less/wells.less"; -@import "../../assets/bootstrap/less/component-animations.less"; -@import "../../assets/bootstrap/less/close.less"; +@import "../../../assets/bootstrap/less/sprites.less"; +@import "../../../assets/bootstrap/less/dropdowns.less"; +@import "../../../assets/bootstrap/less/wells.less"; +@import "../../../assets/bootstrap/less/component-animations.less"; +@import "../../../assets/bootstrap/less/close.less"; // Components: Buttons & Alerts -@import "../../assets/bootstrap/less/buttons.less"; -@import "../../assets/bootstrap/less/button-groups.less"; -@import "../../assets/bootstrap/less/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less +@import "../../../assets/bootstrap/less/buttons.less"; +@import "../../../assets/bootstrap/less/button-groups.less"; +@import "../../../assets/bootstrap/less/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less // Components: Nav -@import "../../assets/bootstrap/less/navs.less"; -@import "../../assets/bootstrap/less/navbar.less"; -@import "../../assets/bootstrap/less/breadcrumbs.less"; -@import "../../assets/bootstrap/less/pagination.less"; -@import "../../assets/bootstrap/less/pager.less"; +@import "../../../assets/bootstrap/less/navs.less"; +@import "../../../assets/bootstrap/less/navbar.less"; +@import "../../../assets/bootstrap/less/breadcrumbs.less"; +@import "../../../assets/bootstrap/less/pagination.less"; +@import "../../../assets/bootstrap/less/pager.less"; // Components: Popovers -@import "../../assets/bootstrap/less/modals.less"; -@import "../../assets/bootstrap/less/tooltip.less"; -@import "../../assets/bootstrap/less/popovers.less"; +@import "../../../assets/bootstrap/less/modals.less"; +@import "../../../assets/bootstrap/less/tooltip.less"; +@import "../../../assets/bootstrap/less/popovers.less"; // Components: Misc -@import "../../assets/bootstrap/less/thumbnails.less"; -@import "../../assets/bootstrap/less/media.less"; -@import "../../assets/bootstrap/less/labels-badges.less"; -@import "../../assets/bootstrap/less/progress-bars.less"; -@import "../../assets/bootstrap/less/accordion.less"; -@import "../../assets/bootstrap/less/carousel.less"; -@import "../../assets/bootstrap/less/hero-unit.less"; +@import "../../../assets/bootstrap/less/thumbnails.less"; +@import "../../../assets/bootstrap/less/media.less"; +@import "../../../assets/bootstrap/less/labels-badges.less"; +@import "../../../assets/bootstrap/less/progress-bars.less"; +@import "../../../assets/bootstrap/less/accordion.less"; +@import "../../../assets/bootstrap/less/carousel.less"; +@import "../../../assets/bootstrap/less/hero-unit.less"; // Utility classes -@import "../../assets/bootstrap/less/utilities.less"; // Has to be last to override when necessary +@import "../../../assets/bootstrap/less/utilities.less"; // Has to be last to override when necessary // Responsive -@import "../../assets/bootstrap/less/responsive.less"; +@import "../../../assets/bootstrap/less/responsive.less"; @import "variables.less"; @import "../../../plugins/account.less"; diff --git a/www/skins/login/less/login.less b/www/skins/login/less/login.less index 51a0246475..9fe8f61674 100644 --- a/www/skins/login/less/login.less +++ b/www/skins/login/less/login.less @@ -1,63 +1,63 @@ // CSS Reset -@import "../../../assets/bootstrap/less/reset.less"; +@import "../../../../assets/bootstrap/less/reset.less"; // Core variables and mixins -@import "../../../assets/bootstrap/less/variables.less"; +@import "../../../../assets/bootstrap/less/variables.less"; @import "variables.less"; @import "../../../../plugins/login.less"; -@import "../../../assets/bootstrap/less/mixins.less"; +@import "../../../../assets/bootstrap/less/mixins.less"; // Grid system and page structure -@import "../../../assets/bootstrap/less/scaffolding.less"; -@import "../../../assets/bootstrap/less/grid.less"; -@import "../../../assets/bootstrap/less/layouts.less"; +@import "../../../../assets/bootstrap/less/scaffolding.less"; +@import "../../../../assets/bootstrap/less/grid.less"; +@import "../../../../assets/bootstrap/less/layouts.less"; // Base CSS -@import "../../../assets/bootstrap/less/type.less"; -@import "../../../assets/bootstrap/less/code.less"; -@import "../../../assets/bootstrap/less/forms.less"; -@import "../../../assets/bootstrap/less/tables.less"; +@import "../../../../assets/bootstrap/less/type.less"; +@import "../../../../assets/bootstrap/less/code.less"; +@import "../../../../assets/bootstrap/less/forms.less"; +@import "../../../../assets/bootstrap/less/tables.less"; // Components: common -@import "../../../assets/bootstrap/less/sprites.less"; -@import "../../../assets/bootstrap/less/dropdowns.less"; -@import "../../../assets/bootstrap/less/wells.less"; -@import "../../../assets/bootstrap/less/component-animations.less"; -@import "../../../assets/bootstrap/less/close.less"; +@import "../../../../assets/bootstrap/less/sprites.less"; +@import "../../../../assets/bootstrap/less/dropdowns.less"; +@import "../../../../assets/bootstrap/less/wells.less"; +@import "../../../../assets/bootstrap/less/component-animations.less"; +@import "../../../../assets/bootstrap/less/close.less"; // Components: Buttons & Alerts -@import "../../../assets/bootstrap/less/buttons.less"; -@import "../../../assets/bootstrap/less/button-groups.less"; -@import "../../../assets/bootstrap/less/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less +@import "../../../../assets/bootstrap/less/buttons.less"; +@import "../../../../assets/bootstrap/less/button-groups.less"; +@import "../../../../assets/bootstrap/less/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less // Components: Nav -@import "../../../assets/bootstrap/less/navs.less"; -@import "../../../assets/bootstrap/less/navbar.less"; -@import "../../../assets/bootstrap/less/breadcrumbs.less"; -@import "../../../assets/bootstrap/less/pagination.less"; -@import "../../../assets/bootstrap/less/pager.less"; +@import "../../../../assets/bootstrap/less/navs.less"; +@import "../../../../assets/bootstrap/less/navbar.less"; +@import "../../../../assets/bootstrap/less/breadcrumbs.less"; +@import "../../../../assets/bootstrap/less/pagination.less"; +@import "../../../../assets/bootstrap/less/pager.less"; // Components: Popovers -@import "../../../assets/bootstrap/less/modals.less"; -@import "../../../assets/bootstrap/less/tooltip.less"; -@import "../../../assets/bootstrap/less/popovers.less"; +@import "../../../../assets/bootstrap/less/modals.less"; +@import "../../../../assets/bootstrap/less/tooltip.less"; +@import "../../../../assets/bootstrap/less/popovers.less"; // Components: Misc -@import "../../../assets/bootstrap/less/thumbnails.less"; -@import "../../../assets/bootstrap/less/media.less"; -@import "../../../assets/bootstrap/less/labels-badges.less"; -@import "../../../assets/bootstrap/less/progress-bars.less"; -@import "../../../assets/bootstrap/less/accordion.less"; -@import "../../../assets/bootstrap/less/carousel.less"; -@import "../../../assets/bootstrap/less/hero-unit.less"; +@import "../../../../assets/bootstrap/less/thumbnails.less"; +@import "../../../../assets/bootstrap/less/media.less"; +@import "../../../../assets/bootstrap/less/labels-badges.less"; +@import "../../../../assets/bootstrap/less/progress-bars.less"; +@import "../../../../assets/bootstrap/less/accordion.less"; +@import "../../../../assets/bootstrap/less/carousel.less"; +@import "../../../../assets/bootstrap/less/hero-unit.less"; // Utility classes -@import "../../../assets/bootstrap/less/utilities.less"; // Has to be last to override when necessary +@import "../../../../assets/bootstrap/less/utilities.less"; // Has to be last to override when necessary // Responsive -@import "../../../assets/bootstrap/less/responsive.less"; +@import "../../../../assets/bootstrap/less/responsive.less"; @import "variables.less"; @import "../../../../plugins/login.less";