From 988e94877d31fe0b3ae09f528df648d5009c41e3 Mon Sep 17 00:00:00 2001 From: Jeff Cross Date: Thu, 4 Dec 2014 16:58:01 -0800 Subject: [PATCH 001/141] chore: update text for 1.3 branch Closes #144 --- src/js/download-data.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/download-data.js b/src/js/download-data.js index b2e337c78..a89ba4733 100644 --- a/src/js/download-data.js +++ b/src/js/download-data.js @@ -24,8 +24,8 @@ angular.module('download-data', []) "
"+ "
Legacy 1.2.x
"+ "
This branch is in maintenance mode. It is stable and the API will not undergo any further changes. New releases will only contain bug-fixes.
"+ - "
Latest 1.3.x
"+ - "
This branch is being actively developed. The API's are subject to change without any prior notice. Use if you want to have access to the most recent features.
"+ + "
Stable 1.3.x
"+ + "
This is the latest stable branch, with regular bug fixes, performance improvements and small features added.
"+ "
", buildsInfo: From 326332f01f08e4d42c575d92b582f758e1253a5a Mon Sep 17 00:00:00 2001 From: Jeff Cross Date: Mon, 29 Dec 2014 15:51:19 -0800 Subject: [PATCH 002/141] chore(protractor): upgrade protractor version And add a test for project list --- package.json | 2 +- protractorConf.js | 2 +- test/angularjs.org.spec.js | 72 ++++++++++++++++++++++---------------- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 7351e579b..123cdd58b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "devDependencies": { "http-server": "*", - "protractor": "~0.24", + "protractor": "~1.5", "selenium-webdriver": "~2.40.0" } } \ No newline at end of file diff --git a/protractorConf.js b/protractorConf.js index e785d88c8..37f0ae4cb 100644 --- a/protractorConf.js +++ b/protractorConf.js @@ -1,5 +1,5 @@ exports.config = { - seleniumServerJar: './node_modules/protractor/selenium/selenium-server-standalone-2.42.0.jar', + seleniumServerJar: './node_modules/protractor/selenium/selenium-server-standalone-2.44.0.jar', seleniumArgs: [], baseUrl: process.env.ANGULAR_HOME_HOST || 'http://angularjs.org', capabilities: { diff --git a/test/angularjs.org.spec.js b/test/angularjs.org.spec.js index b77cce42c..c6d6a80c6 100644 --- a/test/angularjs.org.spec.js +++ b/test/angularjs.org.spec.js @@ -1,26 +1,25 @@ describe('Angularjs.org', function () { var protractor = require('protractor') - , tractor = protractor.getInstance() , protractorConfig = require('../protractorConf.js') , webdriver = require('selenium-webdriver'); describe('App', function () { beforeEach(function () { - tractor.get(''); + browser.get(''); }); it('should have the correct version of angularjs loaded', function() { //This only runs if an environment variable tells us to check if (process.env.CHECK_SCRIPT_TAG !== 'true') return; - var scriptTag = tractor.findElement(protractor.By.css('script#angularScript')); + var scriptTag = browser.findElement(protractor.By.css('script#angularScript')); expect(scriptTag.getAttribute('src')). toContain(process.env.ANGULAR_VERSION); }) it('should load the web page', function () { - var body = tractor.findElement(protractor.By.css('body')); + var body = browser.findElement(protractor.By.css('body')); expect(body.getAttribute('ng-controller')).toEqual('AppCtrl'); }); @@ -30,10 +29,10 @@ describe('Angularjs.org', function () { downloadVersions = process.env.ANGULAR_DOWNLOAD_VERSIONS.split(' '); beforeEach(function () { - var downloadBtn = tractor.findElement(protractor.By.css('.hero-unit .btn-primary')), done; + var downloadBtn = browser.findElement(protractor.By.css('.hero-unit .btn-primary')), done; downloadBtn.click(); - tractor.driver.sleep(500); - cdnInput = tractor.findElement(protractor.By.css('#cdnURL')); + browser.driver.sleep(500); + cdnInput = browser.findElement(protractor.By.css('#cdnURL')); cdnInput.getAttribute('value') cdnInput.getText().then(function (text) { stableVersion = text.toString().split('/').splice(-2,1)[0]; @@ -41,15 +40,15 @@ describe('Angularjs.org', function () { }); it('should open a modal prompting for download configuration', function () { - var downloadModal = tractor.findElement(protractor.By.css('.download-modal')) + var downloadModal = browser.findElement(protractor.By.css('.download-modal')) expect(downloadModal.getCssValue('display')).toEqual('block'); }); it('should change the CDN url based on user selection of stable or unstable', function () { var okay; - var unstableButton = tractor.findElement(protractor.By.css(".branch-btns button:nth-child(1)")); - tractor.driver.sleep(500); + var unstableButton = browser.findElement(protractor.By.css(".branch-btns button:nth-child(1)")); + browser.driver.sleep(500); unstableButton.click(); cdnInput.getAttribute('value').then(function (val) { var unstableVersion = val.split('/').splice(-2,1)[0]; @@ -71,7 +70,7 @@ describe('Angularjs.org', function () { replace(/\./g, '-'). replace(/\*/g, 'x'), - branchBtn = tractor.findElement( + branchBtn = browser.findElement( protractor.By.css(branchBtnSelector)); branchBtn.click(); @@ -83,7 +82,7 @@ describe('Angularjs.org', function () { it('should allow downloading uncompressed angular', function () { - var uncompressedBtn = tractor.findElement( + var uncompressedBtn = browser.findElement( protractor.By.css( '.download-modal .modal-body > dl button.uncompressed')); uncompressedBtn.click() @@ -94,23 +93,23 @@ describe('Angularjs.org', function () { describe('The Basics', function () { it('should show the code example', function () { - var hello = tractor.findElement(protractor.By.css('[app-source="hello.html"]')); + var hello = browser.findElement(protractor.By.css('[app-source="hello.html"]')); expect(hello.getText()).toContain('{{yourName}}'); }); it('should have a hoverable region called ng-app', function () { - var noCode = tractor.findElement(protractor.By.css('[popover-title="ng-app"]')) + var noCode = browser.findElement(protractor.By.css('[popover-title="ng-app"]')) expect(noCode.getText()).toEqual('ng-app'); }); it('should update the Hello text after entering a name', function () { - var el = tractor.findElement(protractor.By.model('yourName')); + var el = browser.findElement(protractor.By.model('yourName')); el.click() el.sendKeys('Jeff') - var bound = tractor.findElement(protractor.By.css('[app-run="hello.html"] h1')); + var bound = browser.findElement(protractor.By.css('[app-run="hello.html"] h1')); expect(bound.getText()).toEqual('Hello Jeff!'); }); }); @@ -118,28 +117,28 @@ describe('Angularjs.org', function () { describe('Add Some Control', function () { it('should strike out a todo when clicked', function () { - var el = tractor.findElement(protractor.By.css('[ng-controller="TodoController"] ul >li:nth-child(2) input')); + var el = browser.findElement(protractor.By.css('[ng-controller="TodoController"] ul >li:nth-child(2) input')); el.click(); expect(el.getAttribute('value')).toBe('on'); }); it('should add a new todo when added through text field', function () { - var el = tractor.findElement(protractor.By.model('todoText')); + var el = browser.findElement(protractor.By.model('todoText')); el.click(); el.sendKeys('Write tests!'); el.sendKeys(webdriver.Key.RETURN); - var lastTodo = tractor.findElement(protractor.By.css('[ng-repeat="todo in todos"]:nth-child(3) span')); + var lastTodo = browser.findElement(protractor.By.css('[ng-repeat="todo in todos"]:nth-child(3) span')); expect(lastTodo.getText()).toEqual('Write tests!'); }); it('should show a secondary tab when selected', function () { - var todoJsTab = tractor.findElement(protractor.By.css('[annotate="todo.annotation"] ul.nav-tabs li:nth-child(2) a')); + var todoJsTab = browser.findElement(protractor.By.css('[annotate="todo.annotation"] ul.nav-tabs li:nth-child(2) a')); todoJsTab.click() - tractor.driver.sleep(500); - var todojs = tractor.findElement(protractor.By.css('[annotate="todo.annotation"] .tab-pane:nth-child(2)')); + browser.driver.sleep(500); + var todojs = browser.findElement(protractor.By.css('[annotate="todo.annotation"] .tab-pane:nth-child(2)')); expect(todojs.getCssValue('display')).toEqual('block'); }); }); @@ -147,18 +146,29 @@ describe('Angularjs.org', function () { describe('Wire up a Backend', function () { it('should show a secondary tab when selected', function () { - var listBtn = tractor.findElement(protractor.By.css('[annotate="project.annotation"] ul.nav-tabs li:nth-child(2) a')); + var listBtn = browser.findElement(protractor.By.css('[annotate="project.annotation"] ul.nav-tabs li:nth-child(2) a')); listBtn.click(); - tractor.driver.sleep(500); - var listTab = tractor.findElement(protractor.By.css('[module="project"] .tab-pane:nth-child(2)')); + browser.driver.sleep(500); + var listTab = browser.findElement(protractor.By.css('[module="project"] .tab-pane:nth-child(2)')); expect(listTab.getCssValue('display')).toEqual('block'); }); + + + it('should search the list of projects', function() { + browser.driver.sleep(2000); + var list = element.all(by.repeater('project in projects')); + element(by.id('projects_search')).sendKeys('Ang'); + browser.driver.sleep(50); + expect(list.count()).toBe(1); + expect(list.get(0).getText()).toContain('AngularJS'); + browser.driver.sleep(5000); + }); }); describe('Create Components', function () { it('should show the US localization of date', function () { - var dateText = tractor.findElement(protractor.By.css('[module="app-us"] .tab-content > .tab-pane > span:first-child')); + var dateText = browser.findElement(protractor.By.css('[module="app-us"] .tab-content > .tab-pane > span:first-child')); var text = dateText.getText(); expect(text).toMatch(/^Date: [A-Za-z]*, [A-Za-z]+ [0-9]{1,2}, [0-9]{4}$/); @@ -166,19 +176,19 @@ describe('Angularjs.org', function () { /*it('should show the US pluralization of beer', function () { - var pluralTabLink = tractor.findElement(protractor.By.css('[module="app-us"] .nav-tabs > li:nth-child(2) a')); + var pluralTabLink = browser.findElement(protractor.By.css('[module="app-us"] .nav-tabs > li:nth-child(2) a')); pluralTabLink.click() - var pluralTab = tractor.findElement(protractor.By.css('[module="app-us"] [ng-controller="BeerCounter"] > div > ng-pluralize')); + var pluralTab = browser.findElement(protractor.By.css('[module="app-us"] [ng-controller="BeerCounter"] > div > ng-pluralize')); expect(pluralTab.getText()).toEqual('no beers'); }); it('should show the Slovak pluralization of beer', function () { - var pluralTabLink = tractor.findElement(protractor.By.css('[module="app-sk"] .nav-tabs > li:nth-child(2) a')); + var pluralTabLink = browser.findElement(protractor.By.css('[module="app-sk"] .nav-tabs > li:nth-child(2) a')); pluralTabLink.click(); - var pluralTab = tractor.findElement(protractor.By.css('[module="app-sk"] [ng-controller="BeerCounter"] > div > ng-pluralize')); + var pluralTab = browser.findElement(protractor.By.css('[module="app-sk"] [ng-controller="BeerCounter"] > div > ng-pluralize')); expect(pluralTab.getText()).toEqual('žiadne pivo'); });*/ }); @@ -186,7 +196,7 @@ describe('Angularjs.org', function () { describe('Embed and Inject', function () { it('should have some content under and "Embeddable" heading', function () { - var embedAndInject = tractor.findElement(protractor.By.css('#embed-and-inject')) + var embedAndInject = browser.findElement(protractor.By.css('#embed-and-inject')) expect(embedAndInject.getText()).toEqual('Embed and Inject'); }); }); From 551685c5aa6fab64937c4489217c543070490723 Mon Sep 17 00:00:00 2001 From: Jeff Cross Date: Mon, 29 Dec 2014 15:53:07 -0800 Subject: [PATCH 003/141] fix(projects): sandbox projects list backend --- src/index.html | 105 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 9 deletions(-) diff --git a/src/index.html b/src/index.html index 7068da930..fbf0dc726 100644 --- a/src/index.html +++ b/src/index.html @@ -558,20 +558,107 @@

Todo

padding: 0 .25em; } + - + @@ -780,7 +780,7 @@

JavaScript Projects

, "$asArray": "A method that returns data from Firebase in the form of a synchronized array." , "config": "You use config() to configure existing services. Here, we’re configuring the $routeProvider responsible for mapping URL paths to partials." , "controller": "Define a controller function that can be attached to the DOM using ng-controller or to a view template by specifying it in the route configuration." - , "'/'": "When the URL is / it will load list.html into the view and attach the ListCtrl controller. You can instantly get an overview of an app's structure by reading the route definitions." + , "'/'": "When the URL is / it will load list.html into the view and attach the ProjectListController controller. You can instantly get an overview of an app's structure by reading the route definitions." , "/edit/:projectId": "This route definition has a colon ':' in it. You use colons to make a component of the URL available to your controller. So now, EditCtrl can refer to the projectId property which tells it which project to edit." , "otherwise": "The otherwise route specifies which view to display when the URL doesn’t match any of the explicit routes. It’s the default." , "Projects": "Projects is an instance of $firebase, and is defined in the projects module. It exposes method to add, remove and update projects in the collection. Its purpose is to abstract the server communication. This lets the controller focus on the behavior rather than the complexities of server access." @@ -801,7 +801,7 @@

JavaScript Projects

, "ng-repeat": "Use ng-repeat to unroll a collection. Here, for every project in projects, AngularJS will create new copy of the <tr> element." , "filter": "The filter uses the search to return only a subset of items in the projects array. As you enter text into the search box, the filter will narrow down the list according to your criteria. ng-repeat will then add or remove items from the table." , "orderBy": "Returns the project list ordered by name property." - , "#/edit/{{project._id.$oid}}": "Creates individual edit links, by embedding the project id into the URL. The embedded project id serves the purpose of deep-linking, back button, as well as a way to communicate to EditCtrl which project should be edited." + , "#/edit/{{project._id.$oid}}": "Creates individual edit links, by embedding the project id into the URL. The embedded project id serves the purpose of deep-linking, back button, as well as a way to communicate to EditProjectController which project should be edited." } , "detail.html": { "myForm": "Create a form named myForm. We will declare form validation rules here which we'll use to show input errors and disable buttons." @@ -858,8 +858,8 @@

JavaScript Projects

restrict: 'E', transclude: true, scope: { title: '@' }, - link: function(scope, element, attrs, tabsCtrl) { - tabsCtrl.addPane(scope); + link: function(scope, element, attrs, tabsController) { + tabsController.addPane(scope); }, template: '
' + diff --git a/src/js/homepage.js b/src/js/homepage.js index 48aed5967..0feaa2a2a 100644 --- a/src/js/homepage.js +++ b/src/js/homepage.js @@ -313,7 +313,7 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) }; }) - .controller('AppCtrl', function($scope, $modal, BRANCHES) { + .controller('AppController', function($scope, $modal, BRANCHES) { $scope.BRANCHES = BRANCHES; $scope.showDownloadModal = function() { @@ -336,7 +336,7 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) }) - .controller('DownloadCtrl', function($scope, BRANCHES, BUILDS, DOWNLOAD_INFO) { + .controller('DownloadController', function($scope, BRANCHES, BUILDS, DOWNLOAD_INFO) { function getRelativeUrl(branch, build) { switch (build.name) { @@ -442,7 +442,7 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) angular.module('Group', ['ngResource']); -function GroupCtrl($scope, $resource) +function GroupController($scope, $resource) { $scope.featuredGroups = $resource('groups/index/getfeatured'); $scope.featuredGroups.get(); diff --git a/src/partials/download-modal.html b/src/partials/download-modal.html index 5c93ec7de..f35f41e49 100644 --- a/src/partials/download-modal.html +++ b/src/partials/download-modal.html @@ -1,4 +1,4 @@ -
+
+ - - -

Embed and Inject

+

Testability Built-in

-
-

Embeddable

-

- AngularJS works great with other technologies. Add as much or as little of AngularJS to - an existing page as you like. Many other frameworks require full commitment. This page - has multiple AngularJS applications embedded in it. Because AngularJS has no global - state multiple apps can run on a single page without the use of iframes. We - encourage you to view-source and look around. -

-
-
+

Injectable

The dependency injection in AngularJS allows you to declaratively describe how your @@ -405,7 +369,7 @@

Injectable

replaced.

-
+

Testable

AngularJS was designed from ground up to be testable. It encourages behavior-view @@ -418,6 +382,51 @@

Testable

+ + +

Back to top

From 785566f6c68ed42a833d224d5330d092f965f9e4 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 29 Jun 2015 21:59:05 +0100 Subject: [PATCH 025/141] fix(index): update id and tests for new testability content --- src/index.html | 2 +- test/angularjs.org.spec.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/index.html b/src/index.html index e53ca2d49..554d03f43 100644 --- a/src/index.html +++ b/src/index.html @@ -357,7 +357,7 @@

Locale: SK

-

Testability Built-in

+

Testability Built-in

Injectable

diff --git a/test/angularjs.org.spec.js b/test/angularjs.org.spec.js index b36520755..0b8e8c3eb 100644 --- a/test/angularjs.org.spec.js +++ b/test/angularjs.org.spec.js @@ -193,10 +193,10 @@ describe('Angularjs.org', function () { }); - describe('Embed and Inject', function () { - it('should have some content under and "Embeddable" heading', function () { - var embedAndInject = browser.findElement(protractor.By.css('#embed-and-inject')) - expect(embedAndInject.getText()).toEqual('Embed and Inject'); + describe('Testability Built-in', function () { + it('should have some content under and "Testability Built-in" heading', function () { + var testability = browser.findElement(protractor.By.css('#testability')) + expect(testability.getText()).toEqual('Testability Built-in'); }); }); }); From 7b95f75916087f2dd8508df1ed6fc8b8fe232449 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 2 Jul 2015 12:49:44 +0100 Subject: [PATCH 026/141] chore(version): update to Angular 1.4 Upgraded the website to run off latest Angular 1.4 release rather than 1.3; Changed the download modal to reference 1.4 (latest) and 1.2 (legacy). This will encourage people to move away from 1.3. --- build.sh | 8 ++++---- src/index.html | 12 ++++++------ src/js/download-data.js | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.sh b/build.sh index 7bb2f70ab..20899516c 100755 --- a/build.sh +++ b/build.sh @@ -21,14 +21,14 @@ function replaceInFile { } function getCdnVersions { - CDN_VERSION_1_3=$(./get-cdn-version.sh 1.3) + CDN_VERSION_1_2=$(./get-cdn-version.sh 1.2) CDN_VERSION_1_4=$(./get-cdn-version.sh 1.4) } function replaceCdnVersionInFiles { for FILE in "${CDN_REPLACE_FILES[@]}" do - replaceInFile $FILE '${CDN_VERSION_1_3}' $CDN_VERSION_1_3 + replaceInFile $FILE '${CDN_VERSION_1_2}' $CDN_VERSION_1_2 replaceInFile $FILE '${CDN_VERSION_1_4}' $CDN_VERSION_1_4 done } @@ -37,8 +37,8 @@ function replaceCdnVersionInFiles { function testBuildResult { export ANGULAR_HOME_HOST='http://localhost:8100'; - export ANGULAR_DOWNLOAD_VERSIONS="$CDN_VERSION_1_3:1.3.x $CDN_VERSION_1_4:1.4.x" - export ANGULAR_VERSION="$CDN_VERSION_1_3" + export ANGULAR_DOWNLOAD_VERSIONS="$CDN_VERSION_1_2:1.2.x $CDN_VERSION_1_4:1.4.x" + export ANGULAR_VERSION="$CDN_VERSION_1_4" export CHECK_SCRIPT_TAG="true" function killServer () { diff --git a/src/index.html b/src/index.html index 554d03f43..8be9cbf86 100644 --- a/src/index.html +++ b/src/index.html @@ -20,8 +20,8 @@ - - + + \n' + - ' \n'; - } + bootstrapStylesheet = 'http://netdna.bootstrapcdn.com/twitter-bootstrap/2.0.4/css/bootstrap-combined.min.css', + plnkrFiles = []; + + angular.forEach(ctrl.files.split(' '), function(filename, index) { + var content; + + if (index === 0) { + var head = templateBuilder.createLocalDependencies(ctrl.files); + + head.push(' \n'); + content = templateBuilder.getIndexTemplate({resource: ctrl.resource, route: ctrl.route, firebase: ctrl.firebase}); + content = content. + replace('__MODULE__', ctrl.module ? '="' + ctrl.module + '"' : ''). + replace('__HEAD__', head.join('')). + replace('__BODY__', fetchCode(filename, 4)); } else { - fields[fileType] += fetchCode(file) + '\n'; + content = fetchCode(filename); } + + plnkrFiles.push({ + name: index === 0 ? 'index.html' : filename, // plnkr expects an index.html + content: content + }); }); - fields.html += '
\n'; - fields.html += - '

\n' + - 'Copyright 2016 Google Inc. All Rights Reserved.
\n' + - 'Use of this source code is governed by an MIT-style license that can be found in the LICENSE file at http://angular.io/license\n' + - '

'; - element.html( - '
' + - hiddenField('title', 'AngularJS Example: ' + name) + - hiddenField('css', ' \n' + - stylesheet + - script.angular + - (attr.resource ? script.resource : '') + - (attr.route ? script.route : '') + - (attr.firebase ? script.firebase : '') + - ' - + - - + diff --git a/src/js/homepage.js b/src/js/homepage.js index f84a5979e..5e4ae8e09 100644 --- a/src/js/homepage.js +++ b/src/js/homepage.js @@ -216,10 +216,10 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) }; }) - .directive('appSource', function(fetchCode, escape, $compile, $timeout, templateBuilder) { + .directive('appSource', function(fetchCode, escape, $compile, $timeout, templateBuilder, $sce) { return { terminal: true, - scope: true, + scope: {}, link: function(scope, element, attrs) { var tabs = [], annotation = attrs.annotate && angular.fromJson(fetchCode(attrs.annotate)) || {}; @@ -251,19 +251,22 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) counter = 0; angular.forEach(annotation[filename], function(text, key) { + counter++; text = text.replace('{{', '{{').replace('}}', '}}'); var regexp = new RegExp('(\\W|^)(' + key.replace(/([\W\-])/g, '\\$1') + ')(\\W|$)'); + scope['popover' + index + counter] = $sce.trustAsHtml(text); + content = content.replace(regexp, function(_, before, token, after) { - token = "__" + (counter++) + "__"; + token = "__" + (counter) + "__"; popovers[token] = '' + escape(key) + '' + + ' uib-popover-html="popover' + index + counter + '">' + escape(key) + '' + ''; return before + token + after; }); @@ -274,22 +277,21 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) }); tabs.push( - '\n' + + '\n' + '
' + content +'
\n' + - '
\n' + '\n' ); }); element.html( - '' + + '' + tabs.join('') + - ''); - // element.find('[rel=popover]').popover().pulse(); + ''); // Compile up the HTML to get the directives to kick-in $compile(element.children())(scope); $timeout(function() { - var annotationElements = element.find('span[popover-html-unsafe]'); + var annotationElements = element.find('span[uib-popover-html]'); $compile(annotationElements)(scope); }, 0); } @@ -368,23 +370,23 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) .directive('hint', function() { return { template: 'Hint: Click ' + - 'me.' + 'me.' }; }) - .controller('AppController', function($scope, $modal, BRANCHES) { + .controller('AppController', function($scope, $uibModal, BRANCHES) { $scope.BRANCHES = BRANCHES; $scope.showDownloadModal = function() { - $modal.open({ + $uibModal.open({ templateUrl: 'partials/download-modal.html', windowClass: 'download-modal' }); }; $scope.showVideo = function(videoUrl) { - $modal.open({ + $uibModal.open({ templateUrl: 'partials/video-modal.html', windowClass: 'video-modal', controller: 'VideoController', @@ -458,36 +460,6 @@ angular.module('homepage', ['ngAnimate', 'ui.bootstrap', 'download-data']) }) - -// Angular UI Bootstrap provide some excellent directives, but the popover didn't allow for HTML content -// The popoverHtmlUnsafe and popoverHtmlUnsafePopup implement this on top of the AngularUI Bootstrap's $tooltip service -.directive( 'popoverHtmlUnsafePopup', function ($templateCache) { - - $templateCache.put("template/popover/popover-html-unsafe-popup.html", - "
\n" + - "
\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - ""); - - return { - restrict: 'EA', - replace: true, - scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/popover/popover-html-unsafe-popup.html' - }; -}) - -.directive( 'popoverHtmlUnsafe', [ '$compile', '$timeout', '$parse', '$window', '$tooltip', function ( $compile, $timeout, $parse, $window, $tooltip ) { - return $tooltip( 'popoverHtmlUnsafe', 'popover', 'click' ); -}]) - - - .run(function($rootScope, startPulse){ $rootScope.version = angular.version; From ea0ae6e0f829ad5f285bc450fc3b0a8915f3c164 Mon Sep 17 00:00:00 2001 From: Jacques Crocker Date: Mon, 29 Feb 2016 14:02:23 -0800 Subject: [PATCH 057/141] feat(index): add angularattack 2016 Closes #192 --- src/img/angularattack-logo.png | Bin 0 -> 17002 bytes src/index.html | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/img/angularattack-logo.png diff --git a/src/img/angularattack-logo.png b/src/img/angularattack-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..103b3aa60067d3cfa46098ca9e0860d35fbadbb0 GIT binary patch literal 17002 zcmV)>K!d-DP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001|YNkl6uApGQFLCc6;C7A7|1aWfC9^Fzb2tlgXJgbN1~0 z-QV?HYrSi|LTk<8u>RBMGv!PvoY5iHeBm1U&wT~a-fj?LN}O641Vp3JOIwMj=VkJIHYu^aD$c!kFnIh~q{he5Qv@)c=aEh(Khe_Me5?@Ss>AhQPXp!v z=Eo8=cC8~_8b>6O7@j*N&Pxc9GfneYv<4xL1lCN6XYBb77&nz8w`mQHYagPPZGtKC zBm?JZVB%~(J!MGw`3@Lmm{{c^Ef4$^ZJIDOJQ4z4w;Ooh3?!xjGZk)(R(Q!2nN4em z4)+r}k*RQ6S>QE~du{nNV5W*&N@mG)t|PZ$6}3#$R5+!}m~cnCiQS8)0W($Hl4)X< z3p77`FWNAs!YREEc)Xr^3*bxxW=gmvO%RQd>RgADA48eeGkH4a0E_nWdIEUIG+?HP z1(5{N(LtR2@H4Gr-Zv3fvzK`7-P3@XBId{9B)d10-Sil>Od~?8XW}#>z^nH2{iA`! z(}0;0YEB{ppVkNNLWTiaJ|marqrff^r8QdX$4B}fn+D8OFs-TPT4;UXPSRcLsODOp z36^>7BsI=7V5WqQiN=YJ4A61wjrg$yS{(MvQ{E}WVV8#4v%VEh17^xZONvTU8w+mw z2`ww{q1-wfp$;p{R3`DB(llVERJ0Vw@Tx5S%@2@X4Q1KS2*cF9q-HNw>hd&TrV`7j zkVvXAX&NxkR`U{RV#B>G{?+&K%oNHvENjgw(|~yvYngKMOgiqm zkvR|DOgTFn@$^Tu)k(a^od(Plwa|_bDvPDV-z9EzW(9wyHT(w^(Td<{6Tp*UkLkqSRJTAxF)6dqyB@*Pw1#w78Z@P+2vpO6nS@1v6A+w))(zT!>hoIyMMX9< zGyDtfJU~8dM``1!EFJ8@9{VUhP6OsiSdMy=*DryszyoOR)1lfXEb~V?2#bi1+m0i&U=fD zI;*r7eD0}cnVL!Qh*@^ zX2eAIj}Q)w5qsrnh?w&wHCFsR@(_Dq^%G@^6pCt?06)VKxqErTylYsLT*J86fPQkl zw$lr!og+EQj?zoLIM#QW`?7@kM+oflxvX}MGvEAKxju=IMUSq|#xI3m9f5iK;HmjM;w zjMo1lY2_*TsY7*5E(fkgPivS1*jc~|pka4racoJorr6wBVRL7N@o}FZP$;GG0?oEQ zm#(#=)P8d(;l^%cECNz|2Usu(p@Jxd5I1lyZ${-zsO-B^Eri1NGT8PAXEfhNs14Mi zUD_H4PTo!DVfJGw;0|`{Db^aIj-*-(S-Y{s@TiAvOB_dH7@{PlSZkSLI2tkNFB=RF zd$>3Kjap|vW-5l(eDlD7sk4iJVUFOeG_v0Z;{e)3D3q6Dc4`$f<6RW}^r5hfI|)Ec zyQKZtPxj19fNe`$PqC@9f>N4T)Y#F5@iAaFuoRdj1Q*$sSkXW16W9*5P~uhtEK{7g z-%m6JqQ@mXI);Bi7TM!Y`YMIm1QD_zv6fJqhvJm{1Gt=U+9mDVUIkpZJ6J4JAOvjb zs!*#bB97dVW_daA4Pb0H+Wxg^iW6$C`dPK6F-^(Ph=*Z{W?<$%!P4(RT;hIo20CFP ziU+f3N~3}l3(}9!7VW0!XAhQTf&&1;n|4Wiw^fJkH~SUv{) z@8dOy?`vu`h3AErj*j~q5($H1IV7L=F->v&-mZig4ZsrAu9$_IA4T@M2X;k|rvPPx zQRTSoKTuj8ik7Jzz-3J{%o8Oick{SeD7Gyb8T08Ibcr}S+mG*_V3s|vs;fw+Ogd&q z>6jfOoiaWyr2wrN%LkZ-Xn*3fs}aQz_k%MCPe~%T9XwceuuSM@nUz_|{M1_V-a)fW z?Erb2XOv;4;uOuRC$z{O2+|rx$9;qlNU<}Q_L?V%0AJJGU^8cS6hjKM)`Uv`MJeq{ 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 N002ovPDHLkV1nrhtM>o^ literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index a05283aea..124e768f7 100644 --- a/src/index.html +++ b/src/index.html @@ -155,6 +155,26 @@

HTML enhanced for web apps!

+ + +
From c2d33ef7443c988b4d12bd73a7218cffae978d21 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 3 Mar 2016 09:54:36 +0000 Subject: [PATCH 058/141] feat(index): add angularattack 2016 (Fix the link) Closes #192 --- src/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.html b/src/index.html index 124e768f7..6ce25d9a6 100644 --- a/src/index.html +++ b/src/index.html @@ -159,7 +159,7 @@

HTML enhanced for web apps!

- + From 8aa40a2bb80d554041a532c275b78433967354c6 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 9 Nov 2016 10:00:01 +0000 Subject: [PATCH 072/141] chore(build): fix protractor version --- package.json | 4 ++-- protractorConf.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f4114a823..c7f0a15c7 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "build": "node scripts/build" }, "devDependencies": { + "eslint": "^3.9.1", "http-server": "*", - "protractor": "~2.5", - "selenium-webdriver": "~2.47.0" + "protractor": "^4.0.10" } } diff --git a/protractorConf.js b/protractorConf.js index 4ba3093dd..03c9730dc 100644 --- a/protractorConf.js +++ b/protractorConf.js @@ -1,10 +1,9 @@ exports.config = { - seleniumServerJar: './node_modules/protractor/selenium/selenium-server-standalone-2.47.1.jar', - seleniumArgs: [], baseUrl: process.env.ANGULAR_HOME_HOST || 'http://angularjs.org', capabilities: { 'browserName': 'chrome' }, + directConnect: true, specs: [ 'test/angularjs.org.spec.js', ], From e360d7c54b71c96cab149d77ba83de7126d4b33a Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 9 Nov 2016 10:00:40 +0000 Subject: [PATCH 073/141] chore(nvm): set expected node version to 6 --- .nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..0e2c60cef --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +6.6 \ No newline at end of file From 78f5c8b2325cdd85ec24ec08a18ce67730602f6a Mon Sep 17 00:00:00 2001 From: Alex Wachira Date: Thu, 3 Nov 2016 18:27:40 -0500 Subject: [PATCH 074/141] docs(index): fix typos and grammar for better readability Closes #208 --- src/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/index.html b/src/index.html index fada538c9..e47b35442 100644 --- a/src/index.html +++ b/src/index.html @@ -262,16 +262,16 @@

Wire up a Backend

Deep Linking

- A deep link reflects where the user is in the app, this is useful so users can bookmark - and email links to locations within apps. Round trip apps get this automatically, but - AJAX apps by their nature do not. AngularJS combines the benefits of deep link with + A deep link reflects where the user is in the app. This is useful so users can bookmark + and email links to locations within the app. Round trip apps get this automatically, but + AJAX apps by their nature do not. AngularJS combines the benefits of deep linking with desktop app-like behavior.

Form Validation

- Client-side form validation is an important part of great user experience. + Client-side form validation is an important part of a great user experience. AngularJS lets you declare the validation rules of the form without having to write JavaScript code. Write less code, go have beer sooner.

@@ -309,7 +309,7 @@

Create Components

Directives

- Directives is a unique and powerful feature available only in Angular. Directives let + Directives are a unique and powerful feature available only in Angular. Directives let you invent new HTML syntax, specific to your application.

From edc7f077cee6774fce1653e7965f6839ce63bb07 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 23 Nov 2016 19:05:45 +0000 Subject: [PATCH 075/141] chore(version): update to Angular 1.6 Changed the download modal to reference 1.6 (release-candidate). --- scripts/build.js | 2 +- src/js/download-data.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/build.js b/scripts/build.js index f602e72fe..92cf927d4 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -12,7 +12,7 @@ const utils = require('./utils'); const ROOT_DIR = '.'; const DST_DIR = 'build'; const SRC_DIR = 'src'; -const CDN_VERSIONS = ['1.2', '1.5']; +const CDN_VERSIONS = ['1.2', '1.5', '1.6']; const CDN_REPLACE_FILES = ['index.html', 'js/download-data.js']; const GIT_BRANCH_DIST = 'dist'; const PTOR_CONF = 'protractorConf.js'; diff --git a/src/js/download-data.js b/src/js/download-data.js index 1f96b477e..78764c86c 100644 --- a/src/js/download-data.js +++ b/src/js/download-data.js @@ -1,6 +1,12 @@ angular.module('download-data', []) .value('BRANCHES', [ + { + branch: '1.6.*', version: '${CDN_VERSION_1_6}', + title: '1.6.x (release candidate)', + cssClass: 'branch-1-6-x', + showOnButton: true + }, { branch: '1.5.*', version: '${CDN_VERSION_1_5}', title: '1.5.x (stable)', From f31012d7cf89f99af5dd1bd896d01563ee650842 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 23 Nov 2016 19:32:13 +0000 Subject: [PATCH 076/141] chore(version): update to run off 1.6.0-rc.0 --- src/index.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/index.html b/src/index.html index e47b35442..84663d1cb 100644 --- a/src/index.html +++ b/src/index.html @@ -21,8 +21,8 @@ - - + +  - +
- +
-
-
- -
-
-

HTML enhanced for web apps!

- - Download AngularJS
-
- - ({{branch.version}}{{ !$last ? ' / ' : '' }}) - -
  - - Try the new Angular
- -
+
+

AngularJSBy Google

-
- +
+ +
+
-

Why AngularJS?

-

+

Why AngularJS?

+

HTML is great for declaring static documents, but it falters when we try to use it for declaring dynamic views in web-applications. AngularJS lets you extend HTML vocabulary for your application. The resulting environment is extraordinarily expressive, readable, and quick to develop.

+
-

Alternatives

-

+

Alternatives

+

Other frameworks deal with HTML’s shortcomings by either abstracting away HTML, CSS, and/or JavaScript or by providing an imperative way for manipulating the DOM. Neither of these address the root problem that HTML was not designed for dynamic views.

+
-

Extensibility

-

+

Extensibility

+

AngularJS is a toolset for building the framework most suited to your application development. It is fully extensible and works well with other libraries. Every feature can be modified or replaced to suit your unique development workflow and feature needs. @@ -184,12 +170,18 @@

Extensibility

+
+ + + Shaping up with Angular.js + Learn Angular in your browser for free! +
-

The Basics

+

The Basics

@@ -206,27 +198,27 @@

Watch as we build this app

-

Add Some Control

+

Add Some Control

-

Data Binding

-

+

Data Binding

+

Data-binding is an automatic way of updating the view whenever the model changes, as well as updating the model whenever the view changes. This is awesome because it eliminates DOM manipulation from the list of things you have to worry about.

-

Controller

-

+

Controller

+

Controllers are the behavior behind the DOM elements. AngularJS lets you express the behavior in a clean readable form without the usual boilerplate of updating the DOM, registering callbacks or watching model changes.

-

Plain JavaScript

-

+

Plain JavaScript

+

Unlike other frameworks, there is no need to inherit from proprietary types in order to wrap the model in accessors methods. AngularJS models are plain old JavaScript objects. This makes your code easy to test, maintain, reuse, and again free from boilerplate. @@ -240,7 +232,7 @@

Plain JavaScript

-

Watch as we build this app

+

Watch as we build this app

@@ -250,18 +242,18 @@

Watch as we build this app

-

Wire up a Backend

+

Wire up a Backend

-

Deep Linking

-

+

Deep Linking

+

A deep link reflects where the user is in the app. This is useful so users can bookmark and email links to locations within the app. Round trip apps get this automatically, but AJAX apps by their nature do not. AngularJS combines the benefits of deep linking with @@ -269,16 +261,16 @@

Deep Linking

-

Form Validation

-

+

Form Validation

+

Client-side form validation is an important part of a great user experience. AngularJS lets you declare the validation rules of the form without having to write JavaScript code. Write less code, go have beer sooner.

-

Server Communication

-

+

Server Communication

+

AngularJS provides built-in services on top of XHR as well as various other backends using third party libraries. Promises further simplify your code by handling asynchronous return of data. In this example, we use the AngularFire @@ -304,26 +296,26 @@

Server Communication

-

Create Components

+

Create Components

-

Directives

-

+

Directives

+

Directives are a unique and powerful feature available in AngularJS. Directives let you invent new HTML syntax, specific to your application.

-

Reusable Components

-

+

Reusable Components

+

We use directives to create reusable components. A component allows you to hide complex DOM structure, CSS, and behavior. This lets you focus either on what the application does or how the application looks separately.

-

Localization

-

+

Localization

+

An important part of serious apps is localization. AngularJS's locale aware filters and stemming directives give you building blocks to make your application available in all locales. @@ -344,11 +336,11 @@

Locale: SK

-

Testability Built-in

+

Testability Built-in

-

Injectable

-

+

Injectable

+

The dependency injection in AngularJS allows you to declaratively describe how your application is wired. This means that your application needs no main() method which is usually an unmaintainable mess. Dependency injection is also a core to @@ -357,8 +349,8 @@

Injectable

-

Testable

-

+

Testable

+

AngularJS was designed from ground up to be testable. It encourages behavior-view separation, comes pre-bundled with mocks, and takes full advantage of dependency injection. It also comes with end-to-end scenario runner which eliminates test flakiness @@ -371,7 +363,7 @@

Testable

-

Previous Conferences

+

Previous Conferences