diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 08fb518e773..781e7248abb 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -1,11 +1,6 @@ //= require ./miq_global //= require ./jquery_overrides //= require ./i18n -//= require patternfly -//= require bower_components/angular-drag-and-drop-lists/angular-drag-and-drop-lists -//= require bower_components/angular-patternfly/dist/angular-patternfly -//= require bower_components/angular-bootstrap/ui-bootstrap -//= require bower_components/angular-bootstrap/ui-bootstrap-tpls //= require ./cable //= require ./gettextCatalog //= require ./miq_api @@ -15,8 +10,6 @@ //= require_tree ./directives/ //= require_tree ./components/ //= require_tree ./services/ -//= require bower_components/d3/d3 -//= require bower_components/c3/c3 //= require kubernetes-topology-graph/dist/topology-graph //= require ./miq_browser_detect //= require ./miq_application @@ -27,13 +20,6 @@ //= require ./automate_import_export //= require ./dialog_field_refresh //= require ./miq_c3_config -//= require bower_components/bootstrap/dist/js/bootstrap -//= require bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker -//= require bower_components/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min -//= require bower_components/bootstrap-select/js/bootstrap-select -//= require bootstrap-switch/dist/js/bootstrap-switch -//= require bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin -//= require angular-bootstrap-switch/dist/angular-bootstrap-switch //= require ./miq_ujs_bindings //= require ./miq_tree //= require codemirror/lib/codemirror diff --git a/app/assets/javascripts/miq_angular_application.js b/app/assets/javascripts/miq_angular_application.js index 3b47879ccd2..70058cc9111 100644 --- a/app/assets/javascripts/miq_angular_application.js +++ b/app/assets/javascripts/miq_angular_application.js @@ -1,7 +1,7 @@ ManageIQ.angular.app = angular.module('ManageIQ', [ 'ManageIQ.fonticonPicker', 'angular.validators', // FIXME: require('angular.validators'), - 'frapontillo.bootstrap-switch', + 'frapontillo.bootstrap-switch', // FIXME: require('angular-bootstrap-switch'), 'gettext', // FIXME: require('angular-gettext'), 'kubernetesUI', 'miq.api', diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index f0281e66ea6..5fcf9567819 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,12 +1,12 @@ /* - *= require bower_components/c3/c3 + *= require c3/c3 *= require patternfly-bootstrap-treeview/dist/bootstrap-treeview.min *= require main *= require ./automate_import_export *= require ./dialog_fields *= require angular *= require ./notifications - *= require bower_components/angular-patternfly/dist/styles/angular-patternfly + *= require angular-patternfly/dist/styles/angular-patternfly *= require ./schedule_editor *= require ./miq_tree *= require codemirror/lib/codemirror diff --git a/app/assets/stylesheets/pdf/_fontawesome.scss b/app/assets/stylesheets/pdf/_fontawesome.scss index 0d812980a00..6b4ae8a1a53 100644 --- a/app/assets/stylesheets/pdf/_fontawesome.scss +++ b/app/assets/stylesheets/pdf/_fontawesome.scss @@ -4,7 +4,7 @@ @font-face { font-family: 'FontAwesome'; - src: asset_url("bower_components/font-awesome/fonts/fontawesome-webfont.ttf"); + src: asset_url("font-awesome/fonts/fontawesome-webfont.ttf"); font-weight: normal; font-style: normal; } diff --git a/app/javascript/packs/globals.js b/app/javascript/packs/globals.js index f0633954b40..d3d6ce745f0 100644 --- a/app/javascript/packs/globals.js +++ b/app/javascript/packs/globals.js @@ -3,26 +3,38 @@ // and the only pack loaded before the asset pipeline window.$ = window.jQuery = require('jquery'); +require('bootstrap'); +require('bootstrap-datepicker'); +require('bootstrap-filestyle'); +require('bootstrap-select'); +require('bootstrap-switch'); +require('bootstrap-touchspin'); +require('eonasdan-bootstrap-datetimepicker'); require('jquery-ui'); require('jquery-ui/ui/widgets/draggable'); require('jquery-ui/ui/widgets/droppable'); require('jquery-ui/ui/widgets/sortable'); require('jquery-ujs'); require('jquery.observe_field'); -require('bootstrap-filestyle'); require('patternfly-bootstrap-treeview'); +require('patternfly/dist/js/patternfly.min'); window.angular = require('angular'); +require('angular-ui-bootstrap'); require('angular-gettext'); require('angular-sanitize'); require('angular.validators'); require('ng-annotate-loader!angular-ui-codemirror'); require('angular-dragdrop'); // ngDragDrop, used by ui-components require('angular-ui-sortable'); // ui.sortable, used by ui-components +require('angular-patternfly'); +require('angular-bootstrap-switch'); window._ = require('lodash'); window.numeral = require('numeral'); window.sprintf = require('sprintf-js').sprintf; +window.c3 = require('c3'); +window.d3 = require('d3'); window.moment = require('moment'); require("moment-strftime"); diff --git a/bower.json b/bower.json index 90acfb5ce6a..71a91d9adff 100644 --- a/bower.json +++ b/bower.json @@ -18,16 +18,7 @@ "tests" ], "dependencies": { - "angular-patternfly": "~3.26.0", "manageiq-ui-components": "bower-dev", "patternfly-timeline": "~1.0.5" - }, - "resolutions": { - "d3": "~3.5.0", - "jquery": "~2.2.4", - "bootstrap-select": "~1.12.2", - "font-awesome-sass": "~4.7.0", - "angular": "1.6.9", - "bootstrap-switch": "~3.3.4" } } diff --git a/config/webpack/loaders.js b/config/webpack/loaders.js index 8c68a9399a1..11979b56983 100644 --- a/config/webpack/loaders.js +++ b/config/webpack/loaders.js @@ -7,6 +7,9 @@ const babelrc = require('../../.babelrc.js'); let base = {}; if (env.WEBPACK_EXCLUDE_NODE_MODULES) { base.exclude = /node_modules/; +} else { + // FIXME: won't be needed with d3 4+ + base.exclude = /node_modules\/d3/; } module.exports = [ @@ -20,6 +23,15 @@ module.exports = [ }], }), + { + test: require.resolve('bootstrap-datepicker'), + use: 'imports-loader?exports=>undefined,define=>undefined', + }, + { + test: require.resolve('bootstrap-select'), + use: 'imports-loader?module=>undefined,define=>undefined,this=>window', + }, + { test: /\.(ts|tsx)$/, loader: 'awesome-typescript-loader', diff --git a/package.json b/package.json index f075bf23bbc..8a22658e0c9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,9 @@ "angular-bootstrap-switch": "~0.5.2", "angular-dragdrop": "~1.0.13", "angular-gettext": "^2.4.1", + "angular-patternfly": "~3.26.0", "angular-sanitize": "~1.6.6", + "angular-ui-bootstrap": "~2.5.6", "angular-ui-codemirror": "~0.3.0", "angular-ui-sortable": "~0.16.1", "angular.validators": "~4.4.3", @@ -37,6 +39,7 @@ "bootstrap-switch": "~3.3.4", "codemirror": "~5.19.0", "connected-react-router": "^4.3.0", + "eonasdan-bootstrap-datetimepicker": "~4.17.47", "es6-shim": "~0.35.3", "graphiql": "^0.11.11", "graphql": "~0.12.0", diff --git a/spec/javascripts/globals_pack_spec.js b/spec/javascripts/globals_pack_spec.js new file mode 100644 index 00000000000..222acfbf566 --- /dev/null +++ b/spec/javascripts/globals_pack_spec.js @@ -0,0 +1,49 @@ +describe('packs/global.js', function() { + context("jquery modules", function() { + it('loads bootstrap', function() { + expect($.fn.modal).toBeDefined(); + }); + + it('loads bootstrap-datepicker', function() { + expect($.fn.datepicker).toBeDefined(); + }); + + it('loads bootstrap-select', function() { + expect($.fn.selectpicker).toBeDefined(); + }); + + it('loads bootstrap-switch', function() { + expect($.fn.bootstrapSwitch).toBeDefined(); + }); + + it('loads bootstrap-touchspin', function() { + expect($.fn.TouchSpin).toBeDefined(); + }); + + it('loads c3', function() { + expect(window.c3).toBeDefined(); + }); + + it('loads d3', function() { + expect(window.d3).toBeDefined(); + }); + + it('loads eonasdan-bootstrap-datetimepicker', function() { + expect($.fn.datetimepicker).toBeDefined(); + }); + }); + + context('angular modules', function() { + it('loads angular-bootstrap-switch', function() { + expect(angular.module('frapontillo.bootstrap-switch')).toBeDefined(); + }); + + it('loads angular-patternfly', function() { + expect(angular.module('patternfly')).toBeDefined(); + }); + + it('loads angular-ui-bootstrap', function() { + expect(angular.module('ui.bootstrap')).toBeDefined(); + }); + }); +});