/* global FastClick, smoothScroll */ angular.module('ui.bootstrap.demo', ['ui.bootstrap', 'plunker', 'ngTouch', 'ngAnimate', 'ngSanitize'], function($httpProvider){ FastClick.attach(document.body); delete $httpProvider.defaults.headers.common['X-Requested-With']; }).run(['$location', function($location){ //Allows us to navigate to the correct element on initialization if ($location.path() !== '' && $location.path() !== '/') { smoothScroll(document.getElementById($location.path().substring(1)), 500, function(el) { location.replace('#' + el.id); }); } }]).factory('buildFilesService', function ($http, $q) { var moduleMap; var rawFiles; return { getModuleMap: getModuleMap, getRawFiles: getRawFiles, get: function () { return $q.all({ moduleMap: getModuleMap(), rawFiles: getRawFiles() }); } }; function getModuleMap() { return moduleMap ? $q.when(moduleMap) : $http.get('assets/module-mapping.json') .then(function (result) { moduleMap = result.data; return moduleMap; }); } function getRawFiles() { return rawFiles ? $q.when(rawFiles) : $http.get('assets/raw-files.json') .then(function (result) { rawFiles = result.data; return rawFiles; }); } }) .controller('MainCtrl', MainCtrl) .controller('SelectModulesCtrl', SelectModulesCtrl) .controller('DownloadCtrl', DownloadCtrl); function MainCtrl($scope, $http, $document, $uibModal, orderByFilter) { // Grab old version docs $http.get('/versions-mapping.json') .then(function(result) { $scope.oldDocs = result.data; }); $scope.showBuildModal = function() { var modalInstance = $uibModal.open({ templateUrl: 'buildModal.html', controller: 'SelectModulesCtrl', resolve: { modules: function(buildFilesService) { return buildFilesService.getModuleMap() .then(function (moduleMap) { return Object.keys(moduleMap); }); } } }); }; $scope.showDownloadModal = function() { var modalInstance = $uibModal.open({ templateUrl: 'downloadModal.html', controller: 'DownloadCtrl' }); }; } function SelectModulesCtrl($scope, $uibModalInstance, modules, buildFilesService) { $scope.selectedModules = []; $scope.modules = modules; $scope.selectedChanged = function(module, selected) { if (selected) { $scope.selectedModules.push(module); } else { $scope.selectedModules.splice($scope.selectedModules.indexOf(module), 1); } }; $scope.downloadBuild = function () { $uibModalInstance.close($scope.selectedModules); }; $scope.cancel = function () { $uibModalInstance.dismiss(); }; $scope.isOldBrowser = function () { return isOldBrowser; }; $scope.build = function (selectedModules, version) { /* global JSZip, saveAs */ var moduleMap, rawFiles; buildFilesService.get().then(function (buildFiles) { moduleMap = buildFiles.moduleMap; rawFiles = buildFiles.rawFiles; generateBuild(); }); function generateBuild() { var srcModuleNames = selectedModules .map(function (module) { return moduleMap[module]; }) .reduce(function (toBuild, module) { addIfNotExists(toBuild, module.name); module.dependencies.forEach(function (depName) { addIfNotExists(toBuild, depName); }); return toBuild; }, []); var srcModules = srcModuleNames .map(function (moduleName) { return moduleMap[moduleName]; }); var srcModuleFullNames = srcModules .map(function (module) { return module.moduleName; }); var srcJsContent = srcModules .reduce(function (buildFiles, module) { return buildFiles.concat(module.srcFiles); }, []) .map(getFileContent) .join('\n') ; var jsFile = createNoTplFile(srcModuleFullNames, srcJsContent); var tplModuleNames = srcModules .reduce(function (tplModuleNames, module) { return tplModuleNames.concat(module.tplModules); }, []); var tplJsContent = srcModules .reduce(function (buildFiles, module) { return buildFiles.concat(module.tpljsFiles); }, []) .map(getFileContent) .join('\n') ; var jsTplFile = createWithTplFile(srcModuleFullNames, srcJsContent, tplModuleNames, tplJsContent); var cssContent = srcModules .map(function (module) { return module.css; }) .filter(function (css) { return css; }) .join('\n') ; var cssJsContent = srcModules .map(function (module) { return module.cssJs; }) .filter(function (cssJs) { return cssJs; }) .join('\n') ; var footer = cssJsContent; var zip = new JSZip(); zip.file('ui-bootstrap-custom-' + version + '.js', rawFiles.banner + jsFile + footer); zip.file('ui-bootstrap-custom-' + version + '.min.js', rawFiles.banner + uglify(jsFile + footer)); zip.file('ui-bootstrap-custom-tpls-' + version + '.js', rawFiles.banner + jsTplFile + footer); zip.file('ui-bootstrap-custom-tpls-' + version + '.min.js', rawFiles.banner + uglify(jsTplFile + footer)); zip.file('ui-bootstrap-custom-tpls-' + version + '.min.js', rawFiles.banner + uglify(jsTplFile + footer)); if (cssContent) { zip.file('ui-bootstrap-custom-' + version + '-csp.css', rawFiles.cssBanner + cssContent); } saveAs(zip.generate({type: 'blob'}), 'ui-bootstrap-custom-build.zip'); } function createNoTplFile(srcModuleNames, srcJsContent) { return 'angular.module("ui.bootstrap", [' + srcModuleNames.join(',') + ']);\n' + srcJsContent; } function createWithTplFile(srcModuleNames, srcJsContent, tplModuleNames, tplJsContent) { var depModuleNames = srcModuleNames.slice(); depModuleNames.unshift('"ui.bootstrap.tpls"'); return 'angular.module("ui.bootstrap", [' + depModuleNames.join(',') + ']);\n' + 'angular.module("ui.bootstrap.tpls", [' + tplModuleNames.join(',') + ']);\n' + srcJsContent + '\n' + tplJsContent; } function addIfNotExists(array, element) { if (array.indexOf(element) == -1) { array.push(element); } } function getFileContent(fileName) { return rawFiles.files[fileName]; } function uglify(js) { /* global UglifyJS */ var ast = UglifyJS.parse(js); ast.figure_out_scope(); var compressor = UglifyJS.Compressor(); var compressedAst = ast.transform(compressor); compressedAst.figure_out_scope(); compressedAst.compute_char_frequency(); compressedAst.mangle_names(); var stream = UglifyJS.OutputStream(); compressedAst.print(stream); return stream.toString(); } }; } function DownloadCtrl($scope, $uibModalInstance) { $scope.options = { minified: true, tpls: true }; $scope.download = function (version) { var options = $scope.options; var downloadUrl = ['ui-bootstrap-']; if (options.tpls) { downloadUrl.push('tpls-'); } downloadUrl.push(version); if (options.minified) { downloadUrl.push('.min'); } downloadUrl.push('.js'); return downloadUrl.join(''); }; $scope.cancel = function () { $uibModalInstance.dismiss(); }; } /* * The following compatibility check is from: * * Bootstrap Customizer (http://getbootstrap.com/customize/) * Copyright 2011-2014 Twitter, Inc. * * Licensed under the Creative Commons Attribution 3.0 Unported License. For * details, see http://creativecommons.org/licenses/by/3.0/. */ var isOldBrowser; (function () { var supportsFile = (window.File && window.FileReader && window.FileList && window.Blob); function failback() { isOldBrowser = true; } /** * Based on: * Blob Feature Check v1.1.0 * https://github.com/ssorallen/blob-feature-check/ * License: Public domain (http://unlicense.org) */ var url = window.URL; var svg = new Blob( [''], { type: 'image/svg+xml;charset=utf-8' } ); var objectUrl = url.createObjectURL(svg); if (/^blob:/.exec(objectUrl) === null || !supportsFile) { // `URL.createObjectURL` created a URL that started with something other // than "blob:", which means it has been polyfilled and is not supported by // this browser. failback(); } else { angular.element('') .on('load', function () { isOldBrowser = false; }) .on('error', failback) .attr('src', objectUrl); } })();