app.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. /* global FastClick, smoothScroll */
  2. angular.module('ui.bootstrap.demo', ['ui.bootstrap', 'plunker', 'ngTouch', 'ngAnimate', 'ngSanitize'], function($httpProvider){
  3. FastClick.attach(document.body);
  4. delete $httpProvider.defaults.headers.common['X-Requested-With'];
  5. }).run(['$location', function($location){
  6. //Allows us to navigate to the correct element on initialization
  7. if ($location.path() !== '' && $location.path() !== '/') {
  8. smoothScroll(document.getElementById($location.path().substring(1)), 500, function(el) {
  9. location.replace('#' + el.id);
  10. });
  11. }
  12. }]).factory('buildFilesService', function ($http, $q) {
  13. var moduleMap;
  14. var rawFiles;
  15. return {
  16. getModuleMap: getModuleMap,
  17. getRawFiles: getRawFiles,
  18. get: function () {
  19. return $q.all({
  20. moduleMap: getModuleMap(),
  21. rawFiles: getRawFiles()
  22. });
  23. }
  24. };
  25. function getModuleMap() {
  26. return moduleMap ? $q.when(moduleMap) : $http.get('assets/module-mapping.json')
  27. .then(function (result) {
  28. moduleMap = result.data;
  29. return moduleMap;
  30. });
  31. }
  32. function getRawFiles() {
  33. return rawFiles ? $q.when(rawFiles) : $http.get('assets/raw-files.json')
  34. .then(function (result) {
  35. rawFiles = result.data;
  36. return rawFiles;
  37. });
  38. }
  39. })
  40. .controller('MainCtrl', MainCtrl)
  41. .controller('SelectModulesCtrl', SelectModulesCtrl)
  42. .controller('DownloadCtrl', DownloadCtrl);
  43. function MainCtrl($scope, $http, $document, $uibModal, orderByFilter) {
  44. // Grab old version docs
  45. $http.get('/versions-mapping.json')
  46. .then(function(result) {
  47. $scope.oldDocs = result.data;
  48. });
  49. $scope.showBuildModal = function() {
  50. var modalInstance = $uibModal.open({
  51. templateUrl: 'buildModal.html',
  52. controller: 'SelectModulesCtrl',
  53. resolve: {
  54. modules: function(buildFilesService) {
  55. return buildFilesService.getModuleMap()
  56. .then(function (moduleMap) {
  57. return Object.keys(moduleMap);
  58. });
  59. }
  60. }
  61. });
  62. };
  63. $scope.showDownloadModal = function() {
  64. var modalInstance = $uibModal.open({
  65. templateUrl: 'downloadModal.html',
  66. controller: 'DownloadCtrl'
  67. });
  68. };
  69. }
  70. function SelectModulesCtrl($scope, $uibModalInstance, modules, buildFilesService) {
  71. $scope.selectedModules = [];
  72. $scope.modules = modules;
  73. $scope.selectedChanged = function(module, selected) {
  74. if (selected) {
  75. $scope.selectedModules.push(module);
  76. } else {
  77. $scope.selectedModules.splice($scope.selectedModules.indexOf(module), 1);
  78. }
  79. };
  80. $scope.downloadBuild = function () {
  81. $uibModalInstance.close($scope.selectedModules);
  82. };
  83. $scope.cancel = function () {
  84. $uibModalInstance.dismiss();
  85. };
  86. $scope.isOldBrowser = function () {
  87. return isOldBrowser;
  88. };
  89. $scope.build = function (selectedModules, version) {
  90. /* global JSZip, saveAs */
  91. var moduleMap, rawFiles;
  92. buildFilesService.get().then(function (buildFiles) {
  93. moduleMap = buildFiles.moduleMap;
  94. rawFiles = buildFiles.rawFiles;
  95. generateBuild();
  96. });
  97. function generateBuild() {
  98. var srcModuleNames = selectedModules
  99. .map(function (module) {
  100. return moduleMap[module];
  101. })
  102. .reduce(function (toBuild, module) {
  103. addIfNotExists(toBuild, module.name);
  104. module.dependencies.forEach(function (depName) {
  105. addIfNotExists(toBuild, depName);
  106. });
  107. return toBuild;
  108. }, []);
  109. var srcModules = srcModuleNames
  110. .map(function (moduleName) {
  111. return moduleMap[moduleName];
  112. });
  113. var srcModuleFullNames = srcModules
  114. .map(function (module) {
  115. return module.moduleName;
  116. });
  117. var srcJsContent = srcModules
  118. .reduce(function (buildFiles, module) {
  119. return buildFiles.concat(module.srcFiles);
  120. }, [])
  121. .map(getFileContent)
  122. .join('\n')
  123. ;
  124. var jsFile = createNoTplFile(srcModuleFullNames, srcJsContent);
  125. var tplModuleNames = srcModules
  126. .reduce(function (tplModuleNames, module) {
  127. return tplModuleNames.concat(module.tplModules);
  128. }, []);
  129. var tplJsContent = srcModules
  130. .reduce(function (buildFiles, module) {
  131. return buildFiles.concat(module.tpljsFiles);
  132. }, [])
  133. .map(getFileContent)
  134. .join('\n')
  135. ;
  136. var jsTplFile = createWithTplFile(srcModuleFullNames, srcJsContent, tplModuleNames, tplJsContent);
  137. var cssContent = srcModules
  138. .map(function (module) {
  139. return module.css;
  140. })
  141. .filter(function (css) {
  142. return css;
  143. })
  144. .join('\n')
  145. ;
  146. var cssJsContent = srcModules
  147. .map(function (module) {
  148. return module.cssJs;
  149. })
  150. .filter(function (cssJs) {
  151. return cssJs;
  152. })
  153. .join('\n')
  154. ;
  155. var footer = cssJsContent;
  156. var zip = new JSZip();
  157. zip.file('ui-bootstrap-custom-' + version + '.js', rawFiles.banner + jsFile + footer);
  158. zip.file('ui-bootstrap-custom-' + version + '.min.js', rawFiles.banner + uglify(jsFile + footer));
  159. zip.file('ui-bootstrap-custom-tpls-' + version + '.js', rawFiles.banner + jsTplFile + footer);
  160. zip.file('ui-bootstrap-custom-tpls-' + version + '.min.js', rawFiles.banner + uglify(jsTplFile + footer));
  161. zip.file('ui-bootstrap-custom-tpls-' + version + '.min.js', rawFiles.banner + uglify(jsTplFile + footer));
  162. if (cssContent) {
  163. zip.file('ui-bootstrap-custom-' + version + '-csp.css', rawFiles.cssBanner + cssContent);
  164. }
  165. saveAs(zip.generate({type: 'blob'}), 'ui-bootstrap-custom-build.zip');
  166. }
  167. function createNoTplFile(srcModuleNames, srcJsContent) {
  168. return 'angular.module("ui.bootstrap", [' + srcModuleNames.join(',') + ']);\n' +
  169. srcJsContent;
  170. }
  171. function createWithTplFile(srcModuleNames, srcJsContent, tplModuleNames, tplJsContent) {
  172. var depModuleNames = srcModuleNames.slice();
  173. depModuleNames.unshift('"ui.bootstrap.tpls"');
  174. return 'angular.module("ui.bootstrap", [' + depModuleNames.join(',') + ']);\n' +
  175. 'angular.module("ui.bootstrap.tpls", [' + tplModuleNames.join(',') + ']);\n' +
  176. srcJsContent + '\n' + tplJsContent;
  177. }
  178. function addIfNotExists(array, element) {
  179. if (array.indexOf(element) == -1) {
  180. array.push(element);
  181. }
  182. }
  183. function getFileContent(fileName) {
  184. return rawFiles.files[fileName];
  185. }
  186. function uglify(js) {
  187. /* global UglifyJS */
  188. var ast = UglifyJS.parse(js);
  189. ast.figure_out_scope();
  190. var compressor = UglifyJS.Compressor();
  191. var compressedAst = ast.transform(compressor);
  192. compressedAst.figure_out_scope();
  193. compressedAst.compute_char_frequency();
  194. compressedAst.mangle_names();
  195. var stream = UglifyJS.OutputStream();
  196. compressedAst.print(stream);
  197. return stream.toString();
  198. }
  199. };
  200. }
  201. function DownloadCtrl($scope, $uibModalInstance) {
  202. $scope.options = {
  203. minified: true,
  204. tpls: true
  205. };
  206. $scope.download = function (version) {
  207. var options = $scope.options;
  208. var downloadUrl = ['ui-bootstrap-'];
  209. if (options.tpls) {
  210. downloadUrl.push('tpls-');
  211. }
  212. downloadUrl.push(version);
  213. if (options.minified) {
  214. downloadUrl.push('.min');
  215. }
  216. downloadUrl.push('.js');
  217. return downloadUrl.join('');
  218. };
  219. $scope.cancel = function () {
  220. $uibModalInstance.dismiss();
  221. };
  222. }
  223. /*
  224. * The following compatibility check is from:
  225. *
  226. * Bootstrap Customizer (http://getbootstrap.com/customize/)
  227. * Copyright 2011-2014 Twitter, Inc.
  228. *
  229. * Licensed under the Creative Commons Attribution 3.0 Unported License. For
  230. * details, see http://creativecommons.org/licenses/by/3.0/.
  231. */
  232. var isOldBrowser;
  233. (function () {
  234. var supportsFile = (window.File && window.FileReader && window.FileList && window.Blob);
  235. function failback() {
  236. isOldBrowser = true;
  237. }
  238. /**
  239. * Based on:
  240. * Blob Feature Check v1.1.0
  241. * https://github.com/ssorallen/blob-feature-check/
  242. * License: Public domain (http://unlicense.org)
  243. */
  244. var url = window.URL;
  245. var svg = new Blob(
  246. ['<svg xmlns=\'http://www.w3.org/2000/svg\'></svg>'],
  247. { type: 'image/svg+xml;charset=utf-8' }
  248. );
  249. var objectUrl = url.createObjectURL(svg);
  250. if (/^blob:/.exec(objectUrl) === null || !supportsFile) {
  251. // `URL.createObjectURL` created a URL that started with something other
  252. // than "blob:", which means it has been polyfilled and is not supported by
  253. // this browser.
  254. failback();
  255. } else {
  256. angular.element('<img/>')
  257. .on('load', function () {
  258. isOldBrowser = false;
  259. })
  260. .on('error', failback)
  261. .attr('src', objectUrl);
  262. }
  263. })();