From 758608466f39a84e2a48df356fa16f91558b75a1 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Thu, 16 Jun 2016 18:58:16 -0700 Subject: [PATCH 001/577] I noticed that because the file editor isn't loaded on creation, the rootDir folder wasn't getting fetched/ Now the delete's will fetch beforehand, if they need to --- .../formFiles/containerFilesController.js | 77 ++++++++----------- .../containerFilesController.unit.js | 14 ++-- 2 files changed, 41 insertions(+), 50 deletions(-) diff --git a/client/directives/environment/modals/forms/formFiles/containerFilesController.js b/client/directives/environment/modals/forms/formFiles/containerFilesController.js index b734ffe60..286340815 100644 --- a/client/directives/environment/modals/forms/formFiles/containerFilesController.js +++ b/client/directives/environment/modals/forms/formFiles/containerFilesController.js @@ -3,6 +3,7 @@ require('app').controller('ContainerFilesController', ContainerFilesController); function ContainerFilesController( + $q, loadingPromises, promisify, errs, @@ -161,25 +162,37 @@ function ContainerFilesController( }, deleteFile: function (containerFile) { $rootScope.$broadcast('close-popovers'); - - var file = containerFile.fileModel || self.state.contextVersion.rootDir.contents.models.find(function (fileModel) { - return fileModel.attrs.name === containerFile.name; - }); - if (file) { - var containerIndex = self.state.containerFiles.indexOf(containerFile); - if (containerIndex > -1) { - self.state.containerFiles.splice(containerIndex, 1); - } - - return loadingPromises.add('editServerModal', - promisify(file, 'destroy')() + return loadingPromises.add( + 'editServerModal', + $q(function (resolve) { + if (containerFile.fileModel) { + return resolve(containerFile.fileModel); + } + return promisify(self.state.contextVersion.rootDir.contents, 'fetch')() .then(function () { - return updateDockerfileFromState(self.state); - }) - .catch(errs.handler) - ); - } - + var file = self.state.contextVersion.rootDir.contents.models.find(function (fileModel) { + return fileModel.attrs.name === containerFile.name; + }); + resolve(file); + }); + }) + .then(function (file) { + var containerIndex = self.state.containerFiles.indexOf(containerFile); + if (containerIndex > -1) { + self.state.containerFiles.splice(containerIndex, 1); + } + if (file) { + return promisify(file, 'destroy')() + .then(function () { + return promisify(self.state.contextVersion.rootDir.contents, 'fetch')(); + }); + } + }) + .then(function () { + return updateDockerfileFromState(self.state); + }) + .catch(errs.handler) + ); } }, data: {} @@ -233,33 +246,7 @@ function ContainerFilesController( ); $rootScope.$broadcast('close-popovers'); }, - remove: function (sshKeyFile) { - var file = sshKeyFile.fileModel || self.state.contextVersion.rootDir.contents.models.find(function (fileModel) { - return fileModel.attrs.name === sshKeyFile.name; - }); - var containerIndex = self.state.containerFiles.indexOf(sshKeyFile); - if (containerIndex > -1) { - self.state.containerFiles.splice(containerIndex, 1); - } - - if (file) { - loadingPromises.add( - 'editServerModal', - promisify(file, 'destroy')() - .then(function () { - return promisify(self.state.contextVersion.rootDir.contents, 'fetch')(); - }) - .then(function () { - return updateDockerfileFromState(self.state); - }) - .catch(errs.handler) - ); - } else { - loadingPromises.add('editServerModal', updateDockerfileFromState(self.state)) - .catch(errs.handler); - } - $rootScope.$broadcast('close-popovers'); - } + remove: this.fileUpload.actions.deleteFile } }, getFileDate: function (sshKeyFile) { diff --git a/test/unit/controllers/containerFilesController.unit.js b/test/unit/controllers/containerFilesController.unit.js index bcd2e2424..594cacc19 100644 --- a/test/unit/controllers/containerFilesController.unit.js +++ b/test/unit/controllers/containerFilesController.unit.js @@ -38,6 +38,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { $provide.factory('promisify', function ($q) { promisifyMock = sinon.spy(function (obj, key) { return function () { + console.log('obj', obj, key); return $q.when(obj[key].apply(obj, arguments)); }; }); @@ -84,7 +85,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { rootDir: { contents: { create: sinon.spy(), - fetch: sinon.spy() + fetch: sinon.stub().returns() } } } @@ -448,7 +449,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { sinon.assert.calledOnce(closePopoverSpy); }); }); - describe('deleteFile', function () { + describe.only('deleteFile', function () { it('should delete a file when the file model is on the container file', function () { var containerFile = { id: Math.random(), @@ -521,8 +522,10 @@ describe('ContainerFilesController'.bold.underline.blue, function () { } }; CFC.state.containerFiles = []; + $rootScope.$digest(); CFC.fileUpload.actions.deleteFile(containerFile); + $rootScope.$digest(); sinon.assert.calledOnce(closePopoverSpy); sinon.assert.calledOnce(containerFile.fileModel.destroy); }); @@ -583,7 +586,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { sinon.assert.calledOnce(loadingPromises.add); sinon.assert.calledWith(loadingPromises.add, 'editServerModal'); sinon.assert.calledOnce(sshKey.fileModel.destroy); - sinon.assert.calledOnce(CFC.state.contextVersion.rootDir.contents.fetch); + sinon.assert.calledTwice(CFC.state.contextVersion.rootDir.contents.fetch); sinon.assert.calledOnce(updateDockerfileFromStateMock); sinon.assert.calledOnce(closePopoverSpy); expect(CFC.state.containerFiles.length).to.equal(1); @@ -609,7 +612,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { sinon.assert.calledOnce(loadingPromises.add); sinon.assert.calledWith(loadingPromises.add, 'editServerModal'); sinon.assert.calledOnce(fileModel.destroy); - sinon.assert.calledOnce(CFC.state.contextVersion.rootDir.contents.fetch); + sinon.assert.calledTwice(CFC.state.contextVersion.rootDir.contents.fetch); sinon.assert.calledOnce(updateDockerfileFromStateMock); sinon.assert.calledOnce(closePopoverSpy); expect(CFC.state.containerFiles.length).to.equal(1); @@ -629,6 +632,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { sinon.assert.calledOnce(loadingPromises.add); sinon.assert.calledWith(loadingPromises.add, 'editServerModal'); + sinon.assert.calledOnce(CFC.state.contextVersion.rootDir.contents.fetch); sinon.assert.calledOnce(updateDockerfileFromStateMock); sinon.assert.calledOnce(closePopoverSpy); expect(CFC.state.containerFiles.length).to.equal(1); @@ -654,7 +658,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { sinon.assert.calledOnce(loadingPromises.add); sinon.assert.calledWith(loadingPromises.add, 'editServerModal'); sinon.assert.calledOnce(fileModel.destroy); - sinon.assert.calledOnce(CFC.state.contextVersion.rootDir.contents.fetch); + sinon.assert.calledTwice(CFC.state.contextVersion.rootDir.contents.fetch); sinon.assert.calledOnce(updateDockerfileFromStateMock); sinon.assert.calledOnce(closePopoverSpy); expect(CFC.state.containerFiles.length).to.equal(1); From 367b053df0e1b9777b481093048d058a2a699f55 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 17 Jun 2016 11:56:01 -0700 Subject: [PATCH 002/577] Left the only on fixed last test --- test/unit/controllers/containerFilesController.unit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/controllers/containerFilesController.unit.js b/test/unit/controllers/containerFilesController.unit.js index 594cacc19..8b8aadfb6 100644 --- a/test/unit/controllers/containerFilesController.unit.js +++ b/test/unit/controllers/containerFilesController.unit.js @@ -449,7 +449,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { sinon.assert.calledOnce(closePopoverSpy); }); }); - describe.only('deleteFile', function () { + describe('deleteFile', function () { it('should delete a file when the file model is on the container file', function () { var containerFile = { id: Math.random(), @@ -586,7 +586,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { sinon.assert.calledOnce(loadingPromises.add); sinon.assert.calledWith(loadingPromises.add, 'editServerModal'); sinon.assert.calledOnce(sshKey.fileModel.destroy); - sinon.assert.calledTwice(CFC.state.contextVersion.rootDir.contents.fetch); + sinon.assert.calledOnce(CFC.state.contextVersion.rootDir.contents.fetch); sinon.assert.calledOnce(updateDockerfileFromStateMock); sinon.assert.calledOnce(closePopoverSpy); expect(CFC.state.containerFiles.length).to.equal(1); From c55458897b4cac798bdbcb39158375b23d5015ca Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 17 Jun 2016 15:04:49 -0700 Subject: [PATCH 003/577] Jorge's comments --- .../formFiles/containerFilesController.js | 32 ++++++++++--------- .../containerFilesController.unit.js | 2 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/client/directives/environment/modals/forms/formFiles/containerFilesController.js b/client/directives/environment/modals/forms/formFiles/containerFilesController.js index 286340815..c73e35b60 100644 --- a/client/directives/environment/modals/forms/formFiles/containerFilesController.js +++ b/client/directives/environment/modals/forms/formFiles/containerFilesController.js @@ -164,23 +164,19 @@ function ContainerFilesController( $rootScope.$broadcast('close-popovers'); return loadingPromises.add( 'editServerModal', - $q(function (resolve) { - if (containerFile.fileModel) { - return resolve(containerFile.fileModel); - } - return promisify(self.state.contextVersion.rootDir.contents, 'fetch')() - .then(function () { - var file = self.state.contextVersion.rootDir.contents.models.find(function (fileModel) { - return fileModel.attrs.name === containerFile.name; + $q.when() + .then(function () { + if (containerFile.fileModel) { + return containerFile.fileModel; + } + return promisify(self.state.contextVersion.rootDir.contents, 'fetch')() + .then(function () { + return self.state.contextVersion.rootDir.contents.models.find(function (fileModel) { + return fileModel.attrs.name === containerFile.name; + }); }); - resolve(file); - }); - }) + }) .then(function (file) { - var containerIndex = self.state.containerFiles.indexOf(containerFile); - if (containerIndex > -1) { - self.state.containerFiles.splice(containerIndex, 1); - } if (file) { return promisify(file, 'destroy')() .then(function () { @@ -188,6 +184,12 @@ function ContainerFilesController( }); } }) + .then(function () { + var containerIndex = self.state.containerFiles.indexOf(containerFile); + if (containerIndex > -1) { + self.state.containerFiles.splice(containerIndex, 1); + } + }) .then(function () { return updateDockerfileFromState(self.state); }) diff --git a/test/unit/controllers/containerFilesController.unit.js b/test/unit/controllers/containerFilesController.unit.js index 8b8aadfb6..a61f17c65 100644 --- a/test/unit/controllers/containerFilesController.unit.js +++ b/test/unit/controllers/containerFilesController.unit.js @@ -84,7 +84,7 @@ describe('ContainerFilesController'.bold.underline.blue, function () { }, rootDir: { contents: { - create: sinon.spy(), + create: sinon.stub().returns(), fetch: sinon.stub().returns() } } From 957084d65ca1efc672310c45300a247671afc564 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 17 Aug 2016 16:01:29 -0700 Subject: [PATCH 004/577] Initial pass done on milestone 1, beginning work on milestone 2 --- .../styles/scss/layout/instance-header.scss | 20 +++++++ .../components/ahaGuide/AhaGuideController.js | 57 +++++++++++++++++++ .../components/ahaGuide/ahaGuideDirective.js | 25 ++++++++ .../components/ahaGuide/ahaGuideView.jade | 10 ++-- .../components/createSandboxGuideView.jade | 17 +++--- .../components/setUpRepositoryGuideView.jade | 9 ++- .../environmentBody/viewCardGrid.jade | 2 +- .../chooseOrganizationModalView.jade | 8 +-- .../newContainerModalView.jade | 4 -- client/services/featureFlagService.js | 10 ++-- client/services/serviceAhaGuide.js | 37 ++++++++++++ client/templates/viewInstance.jade | 17 +++++- 12 files changed, 178 insertions(+), 38 deletions(-) create mode 100644 client/directives/components/ahaGuide/AhaGuideController.js create mode 100644 client/directives/components/ahaGuide/ahaGuideDirective.js create mode 100644 client/services/serviceAhaGuide.js diff --git a/client/assets/styles/scss/layout/instance-header.scss b/client/assets/styles/scss/layout/instance-header.scss index f4100b12d..a552e577d 100644 --- a/client/assets/styles/scss/layout/instance-header.scss +++ b/client/assets/styles/scss/layout/instance-header.scss @@ -4,6 +4,26 @@ flex: 0 0 auto; position: relative; z-index: $z-views-header; + + // add config button + button.btn-md.green { + display: table; + margin: 0 auto; + top: 12px; + + &.scale { + animation: scale .4s ease; + } + + .icons-add { + background: $white; + border-radius: $input-border-radius; + color: $green; + height: 18px; + margin: 10px 9px 0 0; + width: 18px; + } + } } .instance-header-title { diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js new file mode 100644 index 000000000..3849667db --- /dev/null +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -0,0 +1,57 @@ +'use strict'; + +require('app') + .controller('AhaGuideController', AhaGuideController); + +function AhaGuideController( + $scope, + $rootScope, + serviceAhaGuide +) { + + var AHA = this; + + // initialize this with the value passed in from the directive + $scope.stepIndex = $scope.stepIndex || 0; + // this should remain undefined for the first step, which will update when the animated panel loads + $scope.subStepIndex = $scope.subStepIndex; + + // retain this for now. TODO remove state object + AHA.state = $scope.state || { + mainStep: $scope.stepIndex, + subStep: $scope.subStepIndex, + hideMenu: true + }; + + // get steps from service + AHA.state.steps = serviceAhaGuide.getSteps(); + + // update steps and initiate digest loop + function updateStep() { + AHA.state.title = AHA.state.steps[AHA.state.mainStep].title; + AHA.state.caption = AHA.state.steps[AHA.state.mainStep].subStepCaptions[AHA.state.subStep]; + } + + updateStep(); + + // handle the panel event + function incrementStep(e, panel) { + if (AHA.state.subStep !== undefined) { + AHA.state.subStep++; + } else { + console.log('reset subStep'); + AHA.state.subStep = 0; + } + if (AHA.state.subStep >= AHA.state.steps[AHA.state.mainStep].subStepCaptions.length) { + animatedPanelListener(); + return; + } + updateStep(); + } + + var animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { + console.log(e, panel); + incrementStep(e, panel); + }) + +}; diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js new file mode 100644 index 000000000..223f8c725 --- /dev/null +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -0,0 +1,25 @@ +'use strict'; + +require('app') + .directive('ahaGuideDirective', ahaGuideDirective); + +/** + * @ngInject + */ +function ahaGuideDirective( + $window +) { + return { + restrict: 'A', + templateUrl: 'ahaGuideView', + controller: 'AhaGuideController', + controllerAs: 'AHA', + scope: { + stepIndex: '=', + subStepIndex: '=' + }, + link: function ($scope) { + console.log('link function run', $scope); + } + }; +} diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 8e4a2d806..ca96dc633 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -1,26 +1,26 @@ .grid-block.align-center( - ng-if = "state.showStep === 0" + ng-if = "AHA.state.mainStep === 0" ng-include = "'createSandboxGuideView'" ) .grid-block.align-center( - ng-if = "state.showStep === 1" + ng-if = "AHA.state.mainStep === 1" ng-include = "'setUpRepositoryGuideView'" ) .grid-block.align-center( - ng-if = "state.showStep === 2" + ng-if = "AHA.state.mainStep === 2" ng-include = "'addBranchGuideView'" ) .grid-block.align-center( - ng-if = "state.showStep === 3" + ng-if = "AHA.state.mainStep === 3" ng-include = "'setUpRunnabotGuideView'" ) button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!state.hideMenu" + ng-if = "!AHA.state.hideMenu" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index 297abb972..397c2a3b4 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -1,22 +1,19 @@ .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-33': $root.featureFlags.aha0 && state.showSubStep === 0,\ - 'aha-meter-66': $root.featureFlags.aha0 && state.showSubStep === 1,\ - 'aha-meter-100': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3\ + 'aha-meter-33': $root.featureFlags.aha0 && AHA.state.subStep === 0,\ + 'aha-meter-66': $root.featureFlags.aha0 && AHA.state.subStep === 1,\ + 'aha-meter-100': $root.featureFlags.aha0 && AHA.state.subStep === 2\ }" ) svg.iconnables use( - ng-if = "$root.featureFlags.aha0" + ng-if = "$root.featureFlags.aha0 && AHA.state.subStep < 2" xlink:href = "#icons-cog" ) use( - ng-if = "$root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3" + ng-if = "$root.featureFlags.aha0 && AHA.state.subStep === 2" xlink:href = "#icons-check" ) .grid-block.vertical - p.p.strong Create your Sandbox - p.p - {{state.showSubStep === 0 ? 'Choose an organization to create your sandbox for.' : ''}} - {{state.showSubStep === 1 ? 'Hang tight!' : ''}} - {{state.showSubStep === 2 ? 'Continue to start configuring your project.' : ''}} + p.p.strong {{ AHA.state.title }} + p.p {{ AHA.state.caption }} diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index b54c5754b..4598d0d49 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -1,20 +1,19 @@ .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-13': $root.featureFlags.aha1,\ + 'aha-meter-13': AHA.state.subStep === 0,\ 'aha-meter-100': $root.featureFlags.aha2 || $root.featureFlags.aha3\ }" ) svg.iconnables use( - ng-if = "$root.featureFlags.aha1 && (!$root.featureFlags.aha2 || !$root.featureFlags.aha3)" + ng-if = "AHA.state.subStep === 0" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "$root.featureFlags.aha2 || $root.featureFlags.aha3" + ng-if = "AHA.state.subStep > 0" xlink:href = "#icons-check" ) .grid-block.vertical p.p.strong Add your First Repository p.p - | {{state.showSubStep === 0 ? 'Click ‘Add Configuration’ to start adding your repository.' : ''}} - | {{state.showSubStep === 1 ? 'Select a repository to set up.' : ''}} + | {{AHA.state.caption}} diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index 41013a64d..509fdd9e1 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -10,7 +10,7 @@ //- empty state .card.gray.disabled.load.empty( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length" + ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length" //&& !$root.featureFlags.aha" ) svg.iconnables( ng-click = "EC.triggerModal.newContainer()" diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 6bf0f6aa1..afc723e64 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -13,13 +13,9 @@ }" ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( + aha-guide-directive ng-if = "$root.featureFlags.aha" - ng-include = "'ahaGuideView'" - ng-init = "\ - state.showStep = 0;\ - state.showSubStep = 0;\ - state.hideMenu = true;\ - " + step-index = 0 ) animated-panel-container animated-panel.modal-body.grid-block.vertical.padding-sm( diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 3d819d078..72fc2070c 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,10 +2,6 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( ng-if = "$root.featureFlags.aha" ng-include = "'ahaGuideView'" - ng-init = "\ - state.showStep = 1;\ - state.showSubStep = 1;\ - " ) .modal-dialog.modal-lg animated-panel-container.modal-servers diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 67bc1b250..ce8e37590 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -7,11 +7,11 @@ function featureFlags( $localStorage ) { var defaultFeatureFlags = { - aha: false, - aha0: false, // step 1: create sandbox - aha1: false, // step 2: working repo config - aha2: false, // step 3: add branch - aha3: false, // step 4: runnabot + aha: true, + aha0: true, // step 1: create sandbox + aha1: true, // step 2: working repo config + aha2: true, // step 3: add branch + aha3: true, // step 4: runnabot ahaSidebar: false, // toggle sidebar allowIsolatedUpdate: false, autoIsolation: false, diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js new file mode 100644 index 000000000..dc612696f --- /dev/null +++ b/client/services/serviceAhaGuide.js @@ -0,0 +1,37 @@ +'use strict'; + +require('app') + .factory('serviceAhaGuide', serviceAhaGuide); + +function serviceAhaGuide( + +) { + + var _steps = [ + { + title: 'Create your Sandbox', + subStepCaptions: [ + 'Choose an organization to create your sandbox for.', + 'Hang tight!', + 'Continue to start configuring your project.' + ] + }, + { + title: 'Add your first Repository', + subStepCaptions: [ + 'Add your repository by clicking \'Add Configuration\'.', + 'Select a repository to configure', + 'How would you like to configure your repo?', + 'Give your repo a name.' + ] + } + ] + + function getSteps() { + return _steps; + } + + return { + getSteps: getSteps + }; +} diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index 84e7057b2..077766b22 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -11,6 +11,18 @@ .grid-block.shrink.vertical.instance-header( ng-if = "$root.featureFlags.aha2" ) + + //- new server button + button.grid-block.shrink.btn.btn-md.green( + ng-click = "EC.triggerModal.newContainer()" + ng-class = "{'scale': helpCards.getActiveCard().targets.newContainer}" + ) + svg.iconnables.icons-add.float-left + use( + xlink:href = "#icons-add" + ) + | Add Configuration + button.grid-block.shrink.btn.btn-sm.gray.btn-aha( ng-click = "$root.featureFlags.ahaSidebar = true" ng-if = "$root.featureFlags.aha && !$root.featureFlags.ahaSidebar" @@ -29,8 +41,9 @@ ) .modal-body.grid-block.vertical.padding-sm .grid-block.align-center.aha-guide( - ng-include = "'ahaGuideView'" - ng-init = "state.showStep = 2" + aha-guide-directive + step-index = 1 + sub-step-index = 0 ) .grid-block.vertical( From ef5fb5bb15d699b0574a66fab84c949bfbd728e1 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 17 Aug 2016 17:28:50 -0700 Subject: [PATCH 005/577] Added terminal window to edit server modal logs panel --- .../activePanel/tabs/logs/termController.js | 11 +++++++++++ .../modals/forms/formLogs/viewFormLogs.jade | 18 ++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/client/directives/activePanel/tabs/logs/termController.js b/client/directives/activePanel/tabs/logs/termController.js index 22518e048..88168709d 100644 --- a/client/directives/activePanel/tabs/logs/termController.js +++ b/client/directives/activePanel/tabs/logs/termController.js @@ -11,6 +11,17 @@ function TermController( $timeout, WatchOnlyOnce ) { + if (!$scope.tabItem) { + $scope.tabItem = { + attrs: { + terminalId: null + }, + state: { + saveState: function() {return null;} + } + } + } + var terminalId = keypather.get($scope.tabItem, 'attrs.terminalId'); var termOnFn; var watchOnlyOnce = new WatchOnlyOnce($scope); $scope.termOpts = { diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 95f265862..fda9faee1 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -23,6 +23,11 @@ ng-click = "SMC.page = 'run'" ng-disabled = "!SMC.instance.containers.models.length" ) CMD Logs + button.btn.btn-xs.white( + ng-class = "{'active': SMC.page === 'terminal'}" + ng-click = "SMC.page = 'terminal'" + instance = "SMC.instance" + ) Terminal //- logs pre.pre.log-wrapper( @@ -45,7 +50,7 @@ pre.pre.log-wrapper( .build-log-wrapper( build-logs scroll-glue - instance = 'SMC.instance' + instance = "SMC.instance" ng-if = "SMC.instance" ng-show = "SMC.page === 'build'" ng-style = "($root.featureFlags.themeToggle || $root.featureFlags.fullScreenToggle) && {'padding-right': '42px'}" @@ -53,11 +58,20 @@ pre.pre.log-wrapper( //- cmd logs page .term-js.term-log( controller = "BoxLogController" - instance = 'SMC.instance' + instance = "SMC.instance" log-term ng-if = "SMC.instance.containers.models.length" ng-show = "SMC.page === 'run'" ) + //- terminal + .term-js( + controller = "TermController" + debug-container = "debugContainer" + instance = "SMC.instance" + tab-item = "item" + log-term + ng-show = "SMC.page === 'terminal'" + ) .floating-controls( ng-include = "'viewFloatingControls'" From 593a781ebfbad1f41c5ad3a3ac5b7163c86c0f01 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 17 Aug 2016 18:14:49 -0700 Subject: [PATCH 006/577] Preparing branch for PR --- .../styles/scss/layout/instance-header.scss | 20 ------------------- .../components/ahaGuide/AhaGuideController.js | 15 +++++++++----- .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../chooseOrganizationModalView.jade | 1 - client/services/serviceAhaGuide.js | 2 +- client/templates/viewInstance.jade | 11 ---------- 6 files changed, 12 insertions(+), 39 deletions(-) diff --git a/client/assets/styles/scss/layout/instance-header.scss b/client/assets/styles/scss/layout/instance-header.scss index a552e577d..f4100b12d 100644 --- a/client/assets/styles/scss/layout/instance-header.scss +++ b/client/assets/styles/scss/layout/instance-header.scss @@ -4,26 +4,6 @@ flex: 0 0 auto; position: relative; z-index: $z-views-header; - - // add config button - button.btn-md.green { - display: table; - margin: 0 auto; - top: 12px; - - &.scale { - animation: scale .4s ease; - } - - .icons-add { - background: $white; - border-radius: $input-border-radius; - color: $green; - height: 18px; - margin: 10px 9px 0 0; - width: 18px; - } - } } .instance-header-title { diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 3849667db..66b69f892 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -8,7 +8,7 @@ function AhaGuideController( $rootScope, serviceAhaGuide ) { - + var AHA = this; // initialize this with the value passed in from the directive @@ -22,10 +22,13 @@ function AhaGuideController( subStep: $scope.subStepIndex, hideMenu: true }; - + // get steps from service AHA.state.steps = serviceAhaGuide.getSteps(); + // get the bound of the caption array so we know when to stop + var captionLimit = AHA.state.steps[AHA.state.mainStep].subStepCaptions.length; + // update steps and initiate digest loop function updateStep() { AHA.state.title = AHA.state.steps[AHA.state.mainStep].title; @@ -39,10 +42,13 @@ function AhaGuideController( if (AHA.state.subStep !== undefined) { AHA.state.subStep++; } else { - console.log('reset subStep'); AHA.state.subStep = 0; } - if (AHA.state.subStep >= AHA.state.steps[AHA.state.mainStep].subStepCaptions.length) { + + // if either the dockLoaded is fired or we've reached the end + if (panel === 'dockLoaded' || AHA.state.subStep >= captionLimit) { + AHA.state.subStep = captionLimit - 1; + updateStep(); animatedPanelListener(); return; } @@ -50,7 +56,6 @@ function AhaGuideController( } var animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { - console.log(e, panel); incrementStep(e, panel); }) diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 223f8c725..2fc1bc912 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -19,7 +19,7 @@ function ahaGuideDirective( subStepIndex: '=' }, link: function ($scope) { - console.log('link function run', $scope); + } }; } diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index afc723e64..20abb7e11 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -98,7 +98,6 @@ button.grid-block.align-center.justify-center.btn.btn-md.green( ng-click = "\ actions.createOrCheckDock(data.selectedOrgName, goToPanel);\ - state.showSubStep = 1;\ " ng-disabled = "!data.selectedOrgName" ) Create Sandbox diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index dc612696f..1b74c7ad3 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -4,7 +4,7 @@ require('app') .factory('serviceAhaGuide', serviceAhaGuide); function serviceAhaGuide( - + ) { var _steps = [ diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index 077766b22..f0cb6025d 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -11,17 +11,6 @@ .grid-block.shrink.vertical.instance-header( ng-if = "$root.featureFlags.aha2" ) - - //- new server button - button.grid-block.shrink.btn.btn-md.green( - ng-click = "EC.triggerModal.newContainer()" - ng-class = "{'scale': helpCards.getActiveCard().targets.newContainer}" - ) - svg.iconnables.icons-add.float-left - use( - xlink:href = "#icons-add" - ) - | Add Configuration button.grid-block.shrink.btn.btn-sm.gray.btn-aha( ng-click = "$root.featureFlags.ahaSidebar = true" From 1ae270234cefb658bc4d90ef5d85a087402e7f66 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 17 Aug 2016 18:27:18 -0700 Subject: [PATCH 007/577] Added wordpress icon. --- .../assets/images/logos/logo-icon-wordpress.svg | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 client/assets/images/logos/logo-icon-wordpress.svg diff --git a/client/assets/images/logos/logo-icon-wordpress.svg b/client/assets/images/logos/logo-icon-wordpress.svg new file mode 100644 index 000000000..bb75e02a0 --- /dev/null +++ b/client/assets/images/logos/logo-icon-wordpress.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + From 754e8149012a7e4f836d40c73058d1f3edb8dab1 Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 17 Aug 2016 19:07:09 -0700 Subject: [PATCH 008/577] update wordpress icon --- .../assets/images/logos/logo-icon-wordpress.svg | 15 --------------- .../assets/images/logos/logo-icons-wordpress.svg | 1 + 2 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 client/assets/images/logos/logo-icon-wordpress.svg create mode 100644 client/assets/images/logos/logo-icons-wordpress.svg diff --git a/client/assets/images/logos/logo-icon-wordpress.svg b/client/assets/images/logos/logo-icon-wordpress.svg deleted file mode 100644 index bb75e02a0..000000000 --- a/client/assets/images/logos/logo-icon-wordpress.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/assets/images/logos/logo-icons-wordpress.svg b/client/assets/images/logos/logo-icons-wordpress.svg new file mode 100644 index 000000000..cfbb01a9b --- /dev/null +++ b/client/assets/images/logos/logo-icons-wordpress.svg @@ -0,0 +1 @@ +icons-wordpress \ No newline at end of file From a7629467e794028a58234aead2783b477f581624 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 15:06:52 -0700 Subject: [PATCH 009/577] rename uses of autoIsolation feature flag to addBranches --- .../instanceNavigationInternalsView.jade | 10 +++++----- .../instanceNavigationPopoverView.jade | 4 ++-- client/services/featureFlagService.js | 1 + client/templates/instances/viewInstances.jade | 2 +- client/templates/instances/viewInstancesList.jade | 10 +++++----- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade b/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade index 87608f684..e351d48c6 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade @@ -13,18 +13,18 @@ a.grid-block.align-center.a-sref( ) //- show repo names for repo containers in the master cluster span( - ng-if = "INC.instance.attrs.masterPod && INC.instance.getBranchName() && $root.featureFlags.autoIsolation" + ng-if = "INC.instance.attrs.masterPod && INC.instance.getBranchName() && $root.featureFlags.addBranches" ) {{INC.instance.getName()}}/ //- branch name or service name | {{getNavigationName()}} .grid-block.shrink.btn.btn-xxs.btn-badge( - ng-if = "INC.instance.attrs.isIsolationGroupMaster && !$root.featureFlags.autoIsolation" + ng-if = "INC.instance.attrs.isIsolationGroupMaster && !$root.featureFlags.addBranches" ) Isolated svg.grid-block.shrink.iconnables.icons-overflow( ng-class = "{'active': INC.popoverShown}" - ng-if = "!$root.featureFlags.autoIsolation && ((INC.masterInstance !== INC.instance && INC.instance.getBranchName()) || (!INC.instance.attrs.isIsolationGroupMaster && INC.instance.attrs.isolated))" + ng-if = "!$root.featureFlags.addBranches && ((INC.masterInstance !== INC.instance && INC.instance.getBranchName()) || (!INC.instance.attrs.isIsolationGroupMaster && INC.instance.attrs.isolated))" pop-over pop-over-active = "INC.popoverShown" pop-over-controller = "INC" @@ -42,7 +42,7 @@ a.grid-block.align-center.a-sref( pop-over-controller = "INC" pop-over-options = "{\"verticallyCentered\":true,\"left\":28}" pop-over-template = "instanceNavigationPopoverView" - ng-if = "$root.featureFlags.autoIsolation" + ng-if = "$root.featureFlags.addBranches" ) svg.iconnables //- if this container's configuration is *not* modified @@ -57,7 +57,7 @@ a.grid-block.align-center.a-sref( //- config button for non-repo containers (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( ng-click="INC.editInstance($event)" - ng-if = "$root.featureFlags.editAnyInstance || INC.instance.attrs.masterPod && !INC.instance.getBranchName() && !INC.instance.attrs.isolated && !$root.featureFlags.autoIsolation" + ng-if = "$root.featureFlags.editAnyInstance || INC.instance.attrs.masterPod && !INC.instance.getBranchName() && !INC.instance.attrs.isolated && !$root.featureFlags.addBranches" title = "Configure" ) use( diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index 390700048..b366bf1f6 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -4,7 +4,7 @@ ) .arrow.white .popover-content( - ng-if = "$root.featureFlags.autoIsolation" + ng-if = "$root.featureFlags.addBranches" ) ul.list.popover-list @@ -49,7 +49,7 @@ | Remove Branch .popover-content( - ng-if = "!$root.featureFlags.autoIsolation" + ng-if = "!$root.featureFlags.addBranches" ) //- menu items: - for an isolated branch: diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index f4eea2f91..f05ca6fef 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -7,6 +7,7 @@ function featureFlags( $localStorage ) { var defaultFeatureFlags = { + addBranches: false, aha: false, aha0: false, // step 1: create sandbox aha1: false, // step 2: working repo config diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 5e1620072..cb5967560 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -1,7 +1,7 @@ //- instance list .grid-block.shrink.list-instances( ng-class = "{\ - 'deprecated': !$root.featureFlags.autoIsolation,\ + 'deprecated': !$root.featureFlags.addBranches,\ 'in': !CIS.$storage.instanceListIsClosed\ }" ng-if = "CIS.instancesByPod" diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index d20ae562a..76571ec6f 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -13,7 +13,7 @@ p.p.text-center.text-gray-light.padding-sm( //- master cluster .list-clusters.master-cluster( - ng-if = "$root.featureFlags.autoIsolation" + ng-if = "$root.featureFlags.addBranches" ) .list-item-cluster @@ -49,7 +49,7 @@ p.p.text-center.text-gray-light.padding-sm( //- '+' button for adding branches and configuring clusters button.grid-block.shrink.btn.btn-xs.btn-icon.gray( ng-class = "{'active': state.active}" - ng-if = "$root.featureFlags.autoIsolation" + ng-if = "$root.featureFlags.addBranches" pop-over pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" pop-over-template = "branchMenuPopoverView" @@ -63,7 +63,7 @@ p.p.text-center.text-gray-light.padding-sm( //- repo config button (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( ng-click = "CIS.editInstance(masterInstance)" - ng-if = "!$root.featureFlags.autoIsolation" + ng-if = "!$root.featureFlags.addBranches" title = "Configure" ) use( @@ -76,7 +76,7 @@ p.p.text-center.text-gray-light.padding-sm( instance = "masterInstance" instance-navigation master-instance = "masterInstance" - ng-if = "!$root.featureFlags.autoIsolation && CIS.filterMasterInstance(masterInstance)" + ng-if = "!$root.featureFlags.addBranches && CIS.filterMasterInstance(masterInstance)" ) //- wraps auto-isolated clusters @@ -99,7 +99,7 @@ p.p.text-center.text-gray-light.padding-sm( //- non-repo containers (pre auto-isolation) .list-clusters( - ng-if = "!$root.featureFlags.autoIsolation" + ng-if = "!$root.featureFlags.addBranches" ng-show = "nonRepoInstances.length" ) .list-item-cluster( From 3be3895ecdc21352ce639c5446a4a06edb20a0cc Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 15:12:06 -0700 Subject: [PATCH 010/577] skip branch menu panel --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index f40d6c0af..f050540c4 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -18,8 +18,8 @@ animated-panel-container.popover-views( ng-if = "!$root.featureFlags.autoIsolationSetup" ) + //- this should be the default panel with auto-isolation is implemented animated-panel( - default = "true" name = "branchMenu" ) .popover-view @@ -62,6 +62,7 @@ ) | Include Containers… animated-panel( + default = "true" name = "addBranch" ) .popover-view.fade( @@ -71,6 +72,7 @@ svg.btn.btn-sm.iconnables.icons-arrow-backward( ng-class = "{'in': isActivePanel()}" ng-click = "goToPanel('branchMenu', 'back');" + ng-if = "$root.featureFlags.autoIsolation" ) use( xlink:href = "#icons-arrow-down" From 49f417c87db37464fbf1b0ac352004fb1c5df528 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 15:33:23 -0700 Subject: [PATCH 011/577] add title to template containers list --- client/templates/instances/viewInstancesList.jade | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 76571ec6f..15fbd9cdf 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -16,6 +16,8 @@ p.p.text-center.text-gray-light.padding-sm( ng-if = "$root.featureFlags.addBranches" ) + .grid-block.align-center.list-item-cluster.list-clusters-heading + span.grid-block.text-overflow Template Containers .list-item-cluster .grid-block.list-containers.vertical.text-overflow.open //- master repository containers From 42b88a6ddb8abbe11bf195aa0a02c4048ea60e19 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 15:37:55 -0700 Subject: [PATCH 012/577] fix text-overflow on repository names --- client/assets/styles/scss/layout/instances-list.scss | 1 + client/templates/instances/viewInstancesList.jade | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 3c2ea5b99..848503da7 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -107,6 +107,7 @@ // '+' button .btn-xs { line-height: initial; + margin-left: auto; overflow: hidden; width: $input-xs; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 15fbd9cdf..d814cad68 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -17,7 +17,7 @@ p.p.text-center.text-gray-light.padding-sm( ) .grid-block.align-center.list-item-cluster.list-clusters-heading - span.grid-block.text-overflow Template Containers + span.text-overflow Template Containers .list-item-cluster .grid-block.list-containers.vertical.text-overflow.open //- master repository containers @@ -45,7 +45,7 @@ p.p.text-center.text-gray-light.padding-sm( //- cluster list heading .grid-block.align-center.list-item-cluster.list-clusters-heading //- repository name - span.grid-block.text-overflow( + span.text-overflow( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} //- '+' button for adding branches and configuring clusters From 9a68441a2d553f71b8dfc53926a3c0a183506a91 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 17:02:27 -0700 Subject: [PATCH 013/577] new branch container popover --- .../deprecated/popover-container-menu.scss | 42 +++--- .../instanceNavigationPopoverView.jade | 125 +++++++++++++++--- 2 files changed, 131 insertions(+), 36 deletions(-) diff --git a/client/assets/styles/scss/deprecated/popover-container-menu.scss b/client/assets/styles/scss/deprecated/popover-container-menu.scss index b0af5a60e..ad684589b 100644 --- a/client/assets/styles/scss/deprecated/popover-container-menu.scss +++ b/client/assets/styles/scss/deprecated/popover-container-menu.scss @@ -1,26 +1,38 @@ //- ************************ //- deprecated file, delete with $root.featureFlags.autoIsolation -.popover-container-menu .disabled { +.popover-container-menu { - .p { - color: $gray; + .well { font-size: 13px; - font-weight: $weight-bold; - margin: 9px 15px 15px; - } + margin-bottom: 6px; - .list { - margin: 0 15px; - padding: 0; + .list-item { + margin-top: 6px; + } } - .list-item + .list-item { - margin-top: 6px; - } + .disabled { + + .p { + color: $gray; + font-size: 13px; + font-weight: $weight-bold; + margin: 9px 15px 15px; + } + + .list { + margin: 0 15px; + padding: 0; + } + + .list-item + .list-item { + margin-top: 6px; + } - .btn-block { - margin: 15px auto; - position: static; + .btn-block { + margin: 15px auto; + position: static; + } } } //- end deprecated file diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index b366bf1f6..911ff41b1 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -4,21 +4,27 @@ ) .arrow.white .popover-content( - ng-if = "$root.featureFlags.addBranches" + ng-if = "$root.featureFlags.autoIsolation" ) - ul.list.popover-list - - //- if this is a container in the master cluster - //- li.list-item.popover-list-item.multi-line + ul.list.popover-list( + ng-if = "INC.instance.attrs.masterPod" + ) + li.list-item.popover-list-item.multi-line( + ng-click = "INC.editInstance($event)" + ) svg.iconnables.icons-gear use( xlink:href = "#icons-gear" ) | Configure - .small Affects all [config-name] containers. + .small Affects all [repo-name] containers. - //- if this is a container that is not part of the master cluster - li.list-item.popover-list-item.multi-line + ul.list.popover-list( + ng-if = "!INC.instance.attrs.masterPod" + ) + li.list-item.popover-list-item.multi-line( + ng-click = "INC.editInstance($event)" + ) svg.iconnables.icons-gear use( xlink:href = "#icons-gear-modified" @@ -37,11 +43,13 @@ | Discard Configuration .small Restores master configuration. - //- if this is the primary container of an isolated cluster - //- li.list-item.popover-list-item.divider - //- li.list-item.popover-list-item( - //- internal-modal-helper = "confirmBranchRemoveView" - //- ) + li.list-item.popover-list-item.divider( + ng-if = "INC.instance.attrs.isIsolationGroupMaster" + ) + li.list-item.popover-list-item( + internal-modal-helper = "confirmBranchRemoveView" + ng-if = "INC.instance.attrs.isIsolationGroupMaster" + ) svg.iconnables use( xlink:href = "#icons-delete" @@ -49,7 +57,85 @@ | Remove Branch .popover-content( - ng-if = "!$root.featureFlags.addBranches" + ng-if = "$root.featureFlags.addBranches && !$root.featureFlags.autoIsolation" + ) + ul.list.popover-list( + ng-if = "INC.instance.attrs.masterPod" + ) + li.list-item.popover-list-item.multi-line( + ng-click = "INC.editInstance($event)" + ) + svg.iconnables.icons-gear + use( + xlink:href = "#icons-gear" + ) + | Configure + .small Affects all non-isolated [repo-name] containers. + + ul.list.popover-list( + ng-if = "!INC.instance.attrs.masterPod" + ) + .well.gray.padding-xs( + ng-if = "!INC.instance.attrs.isolated" + ) Isolating a branch allows you to… + ul.list.list-bulleted + li.list-item Create a separate stack of your containers to use with this branch. + li.list-item Configure this branch differently from your default. + li.list-item.popover-list-item( + ng-click = "INC.setupIsolation()" + ng-if = "!INC.instance.attrs.isolated" + ) + svg.iconnables.icons-gear + use( + xlink:href = "#icons-gear-modified" + ) + | Enter Isolation + span( + ng-if = "INC.shouldShowSetupModal" + ) … + + li.list-item.popover-list-item.multi-line( + ng-click = "INC.editInstance($event)" + ng-if = "INC.instance.attrs.isolated" + ) + svg.iconnables.icons-gear + use( + xlink:href = "#icons-gear-modified" + ) + | Configure + .small Affects only this container. + + li.divider + li.list-item.popover-list-item( + ng-click = "INC.disableIsolation()" + ng-if = "INC.instance.attrs.isIsolationGroupMaster" + ) + svg.iconnables + use( + xlink:href = "#icons-delete" + ) + | Disable Isolation + li.list-item.popover-list-item( + ng-click = "INC.deleteContainer()" + ng-if = "INC.instance.attrs.isolated && !INC.instance.attrs.isIsolationGroupMaster" + ) + svg.iconnables + use( + xlink:href = "#icons-isolation-disable" + ) + | Delete Container from Isolation + li.list-item.popover-list-item( + internal-modal-helper = "confirmBranchRemoveView" + ng-if = "!INC.instance.attrs.isolated" + ) + svg.iconnables + use( + xlink:href = "#icons-delete" + ) + | Delete Branch + + .popover-content( + ng-if = "!$root.featureFlags.addBranches && !$root.featureFlags.autoIsolation" ) //- menu items: - for an isolated branch: @@ -62,8 +148,8 @@ - Configure Container ul.list.popover-list li.list-item.popover-list-item( - ng-if = "INC.instance.attrs.isolated" ng-click = "INC.editInstance($event)" + ng-if = "INC.instance.attrs.isolated" ) svg.iconnables use( @@ -78,10 +164,7 @@ ) p.p Isolating a branch allows you to… ul.list.list-bulleted.small - //- while we can only isolate with service containers: - li.list-item Copy your service containers to use with this branch. - //- once we can isolate with service containers and repo containers: - - li.list-item Create a separate stack of your containers to use with this branch. + li.list-item Create a separate stack of your containers to use with this branch. li.list-item Configure this branch differently from your default. .btn.btn-sm.btn-block.green( ng-click = "INC.setupIsolation()" @@ -94,8 +177,8 @@ ng-if = "INC.shouldShowSetupModal" ) … li.list-item.popover-list-item( - ng-if = "INC.instance.attrs.isIsolationGroupMaster" ng-click = "INC.disableIsolation()" + ng-if = "INC.instance.attrs.isIsolationGroupMaster" ) svg.iconnables use( @@ -103,8 +186,8 @@ ) | Disable Isolation li.list-item.popover-list-item( - ng-if = "INC.instance.attrs.isolated && !INC.instance.attrs.isIsolationGroupMaster" ng-click = "INC.deleteContainer()" + ng-if = "INC.instance.attrs.isolated && !INC.instance.attrs.isIsolationGroupMaster" ) svg.iconnables use( From e1f074c98ab162324fb4f28a2c10280858e70444 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 17:05:34 -0700 Subject: [PATCH 014/577] fix alignment of gear icon --- client/assets/styles/scss/deprecated/instances-list.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/client/assets/styles/scss/deprecated/instances-list.scss b/client/assets/styles/scss/deprecated/instances-list.scss index 87a129b66..89fc3ccaf 100644 --- a/client/assets/styles/scss/deprecated/instances-list.scss +++ b/client/assets/styles/scss/deprecated/instances-list.scss @@ -5,6 +5,7 @@ padding: 0 7px 0 29px; .icons-gear { + margin-left: auto; margin-right: 4px; } } From 613bd863396311e677799134414d120f7039389e Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 17:33:59 -0700 Subject: [PATCH 015/577] show gear-modified icons where appropriate --- .../instanceNavigationInternalsView.jade | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade b/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade index e351d48c6..fbfc8465b 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade @@ -45,14 +45,14 @@ a.grid-block.align-center.a-sref( ng-if = "$root.featureFlags.addBranches" ) svg.iconnables - //- if this container's configuration is *not* modified use( + ng-if = "$root.featureFlags.addBranches && !INC.instance.attrs.isIsolationGroupMaster" xlink:href = "#icons-gear" ) - //- if this container's configuration *is* modified - //- use( - //- xlink:href = "#icons-gear-modified" - //- ) + use( + ng-if = "$root.featureFlags.addBranches && INC.instance.attrs.isIsolationGroupMaster || INC.instance.attrs.isolated" + xlink:href = "#icons-gear-modified" + ) //- config button for non-repo containers (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( From 667a8627f2f9c7c1157f415be12dbb108cf67dd5 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 17:53:20 -0700 Subject: [PATCH 016/577] update placeholder for clarity --- .../instanceNavigtion/instanceNavigationPopoverView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index 911ff41b1..e387793ff 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -17,7 +17,7 @@ xlink:href = "#icons-gear" ) | Configure - .small Affects all [repo-name] containers. + .small Affects all [config-name] containers. ul.list.popover-list( ng-if = "!INC.instance.attrs.masterPod" @@ -70,7 +70,7 @@ xlink:href = "#icons-gear" ) | Configure - .small Affects all non-isolated [repo-name] containers. + .small Affects all non-isolated [config-name] containers. ul.list.popover-list( ng-if = "!INC.instance.attrs.masterPod" From cfa2c4c247e1b8685d3406b1e98ee391610e8501 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 18 Aug 2016 18:49:50 -0700 Subject: [PATCH 017/577] add well describing auto-deploy behavior --- client/assets/styles/scss/popover/popover-branch-menu.scss | 4 ++++ .../instance/branchMenuPopover/branchMenuPopoverView.jade | 1 + 2 files changed, 5 insertions(+) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 4b4a8021d..4f51ac9e0 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -7,6 +7,10 @@ margin-bottom: 6px; } + .input-search { + margin-top: 9px; + } + .popover-content.popover-content { max-height: 330px; min-height: 90px; diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index f050540c4..c9ac9d927 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -93,6 +93,7 @@ .padding-xxs( ng-if = "state.branchesLoaded" ) + .well.gray.small.padding-xxs.text-center We auto-add branches when you push to this repo, but you can do it manually here. input.input.input-xs.input-search( placeholder = "Filter" required From 286c48aa17ea52bca4e279fa3d162ab249ff31f9 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 19 Aug 2016 11:21:20 +0100 Subject: [PATCH 018/577] add github integration buttons --- .../viewPopoverAccountMenu.jade | 9 ++++++++ .../settingsModal/settingsModalView.jade | 22 ++++++++++++++----- client/services/featureFlagService.js | 1 + client/templates/svg/svgDefs.jade | 4 ++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade index 9467bd12e..70dbd9962 100644 --- a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade +++ b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade @@ -57,6 +57,15 @@ | Settings //- $root.featureFlags.billing //- ***************** + li.list-item.popover-list-item( + ng-click = "actions.openSettingsModal('gitHubIntegration')" + ng-if = "$root.featureFlags.gitHubIntegration" + ) + svg.iconnables + use( + xlink:href = "#icons-github" + ) + | GitHub Integration li.list-item.popover-list-item( ng-click = "actions.openSettingsModal('slackIntegration')" ) diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index ac00ccba3..68e2fa2be 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -29,20 +29,26 @@ .btn-text.grid-content Billing button.btn.btn-radio.grid-block.vertical( ng-class = "{'active': SEMC.currentTab === 'teamManagement'}" - ng-click = "\ - SEMC.currentTab = 'teamManagement';\ - " + ng-click = "SEMC.currentTab = 'teamManagement'" ) svg.iconnables.grid-content use( xlink:href = "#icons-team" ) .btn-text.grid-content Teammates + button.btn.btn-radio.grid-block.vertical( + ng-class = "{'active': SEMC.currentTab === 'gitHubIntegration'}" + ng-click = "SEMC.currentTab = 'gitHubIntegration'" + ng-if = "$root.featureFlags.gitHubIntegration" + ) + svg.iconnables.grid-content + use( + xlink:href = "#icons-github" + ) + .btn-text.grid-content GitHub Integration button.btn.btn-radio.grid-block.vertical( ng-class = "{'active': SEMC.currentTab === 'slackIntegration'}" - ng-click = "\ - SEMC.currentTab = 'slackIntegration';\ - " + ng-click = "SEMC.currentTab = 'slackIntegration'" ) img.img.iconnables.grid-content( height = "24" @@ -62,6 +68,10 @@ ng-if = "SEMC.currentTab === 'teamManagement'" ) + div( + ng-if = "SEMC.currentTab === 'gitHubIntegration'" + ) + slack-integration-form( ng-if = "SEMC.currentTab === 'slackIntegration'" ) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index b40b2fe37..77df44478 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -32,6 +32,7 @@ function featureFlags( emptyFolder: false, // shows empty folder markup fullScreen: false, // toggles full screen fullScreenToggle: false, // toggles the button that toggles full screen + gitHubIntegration: false, gracePeriod: false, // if user enters the grace period during the preview gracePeriodPayment: false, // if the user enters the grace period because of a payment error gracePeriodTrial: false, // if the user enters the grace period because of trial expiring diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index c26a9f3b8..ccb155b62 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -159,8 +159,8 @@ svg(xmlns='http://www.w3.org/2000/svg') path(d='M8.4,9.1c0.1,0,0.3,0,0.4,0.1c0.2,0.2,0.2,0.5,0,0.7l-4,4H8c0.3,0,0.5,0.2,0.5,0.5S8.3,15,8,15H3.5h0c0,0,0,0,0,0h0c0,0,0,0,0,0l0,0c0,0,0,0,0,0l0,0c-0.1,0-0.2,0-0.3-0.1c0,0,0,0,0,0v0c0,0,0,0-0.1-0.1C3,14.7,3,14.6,3,14.5c0,0,0,0,0,0V10c0-0.3,0.2-0.5,0.5-0.5S4,9.7,4,10v3.3l4-4C8.1,9.2,8.2,9.1,8.4,9.1z') symbol#icons-fat-check(viewBox='0 0 30 30') path(d='M24.3,9.2c-0.6-0.6-1.5-0.6-2.1,0l-8.5,8.5l-4.3-4.3c-0.6-0.6-1.5-0.6-2.1,0c-0.6,0.6-0.6,1.5,0,2.1l5.4,5.4c0.3,0.3,0.6,0.4,1.1,0.4c0.4,0,0.8-0.2,1.1-0.4l9.6-9.6C24.8,10.8,24.8,9.8,24.3,9.2z') - symbol#icons-github(viewBox='0 0 30 30') - path(d='M22.4,7.8c2,2,3,4.5,3.1,7.4c0,2.4-0.7,4.4-2,6.2c-1.3,1.8-3,3-5.1,3.8c-0.3,0-0.4,0-0.6-0.1c-0.1-0.1-0.2-0.2-0.2-0.4l0-2.9c0-0.5-0.1-0.9-0.2-1.2c-0.1-0.3-0.3-0.6-0.5-0.7c1.2-0.1,2.3-0.5,3.3-1.2c1-0.7,1.5-2,1.5-4c0-0.6-0.1-1.1-0.3-1.6c-0.2-0.5-0.4-0.9-0.8-1.3c0.1-0.1,0.2-0.5,0.2-0.9c0.1-0.5,0-1.1-0.3-1.8c0,0-0.2,0-0.7,0c-0.5,0.1-1.2,0.4-2.2,1.1C16.8,10,15.9,9.8,15,9.8c-0.9,0-1.8,0.1-2.6,0.3c-1-0.6-1.7-1-2.2-1.1c-0.5-0.1-0.7-0.1-0.7,0C9.2,9.8,9.1,10.5,9.2,11c0.1,0.5,0.1,0.8,0.2,0.9c-0.3,0.4-0.6,0.8-0.8,1.3c-0.2,0.5-0.3,1-0.3,1.6c0.1,2,0.6,3.3,1.5,4c1,0.7,2.1,1.1,3.3,1.2c-0.2,0.1-0.3,0.3-0.4,0.6c-0.1,0.2-0.2,0.5-0.3,0.9c-0.3,0.2-0.8,0.3-1.4,0.3c-0.6,0-1.2-0.4-1.7-1.1c0,0-0.1-0.2-0.4-0.5c-0.3-0.3-0.7-0.5-1.2-0.6c-0.1,0-0.2,0-0.4,0.1c-0.2,0.1-0.1,0.3,0.3,0.6c0,0,0.1,0.1,0.4,0.3c0.3,0.2,0.5,0.6,0.8,1.2c0,0.1,0.2,0.4,0.7,0.9c0.5,0.5,1.4,0.6,2.9,0.4l0,1.9c0,0.2-0.1,0.3-0.2,0.4c-0.1,0.1-0.3,0.2-0.6,0.1c-2.1-0.7-3.8-2-5.1-3.8c-1.3-1.8-2-3.8-2-6.2c0.1-3,1.1-5.5,3.1-7.4c2-2,4.5-3,7.4-3.1C18,4.8,20.5,5.8,22.4,7.8z') + symbol#icons-github(viewBox='0 0 18 18') + path(fill='#333333', d='M15.372,2.85a9.009,9.009,0,0,1,.889,11.68,9.066,9.066,0,0,1-4.413,3.234,0.516,0.516,0,0,1-.475-0.1,0.484,0.484,0,0,1-.14-0.343l0.017-2.461a2.876,2.876,0,0,0-.192-1.046,1.683,1.683,0,0,0-.422-0.624,5.246,5.246,0,0,0,2.8-1.011q1.239-.9,1.309-3.436a3.846,3.846,0,0,0-.253-1.336,3.453,3.453,0,0,0-.677-1.073,2.51,2.51,0,0,0,.176-0.809,3.732,3.732,0,0,0-.263-1.582,1.3,1.3,0,0,0-.6.027,5.543,5.543,0,0,0-1.882.905,8.613,8.613,0,0,0-4.5,0,5.555,5.555,0,0,0-1.881-.905,1.3,1.3,0,0,0-.6-0.027A3.7,3.7,0,0,0,4.008,5.53a2.439,2.439,0,0,0,.176.809,3.431,3.431,0,0,0-.676,1.073,3.834,3.834,0,0,0-.255,1.336q0.07,2.531,1.3,3.436a5.224,5.224,0,0,0,2.812,1.011A1.464,1.464,0,0,0,7,13.669a2.555,2.555,0,0,0-.22.739,2.492,2.492,0,0,1-1.2.22,1.816,1.816,0,0,1-1.424-.975,1.985,1.985,0,0,0-.352-0.44,1.69,1.69,0,0,0-1.02-.492,0.834,0.834,0,0,0-.342.071q-0.256.088,0.272,0.491a1.46,1.46,0,0,1,.343.264,3.006,3.006,0,0,1,.659,1.037,1.566,1.566,0,0,0,.571.738,2.924,2.924,0,0,0,2.452.335l0.017,1.669a0.487,0.487,0,0,1-.141.343,0.515,0.515,0,0,1-.475.1A9.042,9.042,0,0,1,0,9.222,9.011,9.011,0,0,1,15.372,2.85Z', transform='translate(0 -0.222)') symbol#icons-help(viewBox='0 0 16.4 16.8') path(d='M0,14.6c0-1.3,0.9-2.2,2.2-2.2c1.3,0,2.1,0.9,2.1,2.2c0,1.3-0.8,2.2-2.1,2.2C0.9,16.8,0,15.8,0,14.6z M0.8,11.2L0.2,0.3h3.8L3.5,11.2H0.8z') path(d='M9.9,11.3l0-0.6c-0.1-1.2,0.3-2.5,1.4-3.8c0.8-0.9,1.4-1.7,1.4-2.5c0-0.8-0.6-1.4-1.8-1.4c-0.8,0-1.8,0.3-2.4,0.7L7.8,1c0.9-0.5,2.3-1,4-1c3.2,0,4.6,1.8,4.6,3.8c0,1.8-1.1,3-2,4.1c-0.9,1-1.3,1.9-1.2,3v0.4H9.9z M9.3,14.6c0-1.3,0.9-2.2,2.1-2.2c1.3,0,2.1,0.9,2.2,2.2c0,1.3-0.9,2.2-2.2,2.2C10.2,16.8,9.3,15.8,9.3,14.6z') From ec6d0570f0886586e220320bb1b095b0f2fb07dc Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 19 Aug 2016 12:01:18 +0100 Subject: [PATCH 019/577] add github form --- .../styles/scss/forms/forms-github.scss | 28 +++++++++++++++ client/assets/styles/scss/globals/var.scss | 2 +- client/assets/styles/scss/index.scss | 1 + .../forms/gitHubForm/gitHubForm.jade | 35 +++++++++++++++++++ .../settingsModal/settingsModalView.jade | 1 + 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 client/assets/styles/scss/forms/forms-github.scss create mode 100644 client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade diff --git a/client/assets/styles/scss/forms/forms-github.scss b/client/assets/styles/scss/forms/forms-github.scss new file mode 100644 index 000000000..c91434ea5 --- /dev/null +++ b/client/assets/styles/scss/forms/forms-github.scss @@ -0,0 +1,28 @@ +.form-github { + + .well { + padding-bottom: 0; + } + + .ol { + font-size: 14px; + list-style-type: decimal; + padding-left: 24px; + + + .link { + border-top: 1px solid $gray-lighter; + line-height: 1.2; + margin-top: 15px; + + .iconnables { + height: 18px; + margin-right: 6px; + width: 18px; + } + } + } + + .li + .li { + margin-top: 6px; + } +} diff --git a/client/assets/styles/scss/globals/var.scss b/client/assets/styles/scss/globals/var.scss index 335ef36e2..c1ef02e9d 100755 --- a/client/assets/styles/scss/globals/var.scss +++ b/client/assets/styles/scss/globals/var.scss @@ -188,4 +188,4 @@ $input-xs: 24px; $input-line-height-xs: $input-xs - ($input-border * 2); $input-xxs: 18px; -$input-line-height-xxs: $input-xxs - ($input-border * 2); +$input-line-height-xxs: $input-xxs - 2px; diff --git a/client/assets/styles/scss/index.scss b/client/assets/styles/scss/index.scss index 2c197ac9e..22dd48cc4 100755 --- a/client/assets/styles/scss/index.scss +++ b/client/assets/styles/scss/index.scss @@ -106,6 +106,7 @@ // form specific @import "forms/forms-billing"; +@import "forms/forms-github"; @import "forms/forms-payment"; @import "forms/forms-plan"; @import "forms/forms-trial"; diff --git a/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade b/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade new file mode 100644 index 000000000..4759ff00b --- /dev/null +++ b/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade @@ -0,0 +1,35 @@ +.modal-form.form-github + + //- .spinner-wrapper.spinner-md.spinner-gray.in( + //- ng-include = "'spinner'" + //- ) + + label.label.clearfix + .grid-block.align-center + .grid-block.shrink.label-col Enable PR Comments + + .grid-block.justify-right.input-col + input.toggle-input( + type = "checkbox" + ) + .toggle-group.toggle-sm + small.small.padding-xxs Runnabot will comment on your pull requests with your container url and status. + .well.gray.padding-sm + .label-col.full-width Powering Up Runnabot + ol.ol.padding-xxs + li.li Go to + a.link( + href = "https://github.com/orgs/CodeNow/people" + target = "_blank" + ) your team on GitHub + |, and click on “Invite member”. + li.li Look for “Runnabot” and add our bot as a member to your org. + a.grid-block.link.small.padding-xxs( + href = "https://support.runnable.com/hc/en-us/articles/210294023-How-do-I-invite-Runnabot-to-my-GitHub-Organization-" + target = "_blank" + ) + svg.grid-content.shrink.iconnables + use( + xlink:href = "#icons-life-preserver" + ) + | I need help (with pictures)! diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index 68e2fa2be..1c0977c30 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -70,6 +70,7 @@ div( ng-if = "SEMC.currentTab === 'gitHubIntegration'" + ng-include = "'gitHubForm'" ) slack-integration-form( From 39e8b1e628970e836c4cb45062ebf7bc0c7de600 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 19 Aug 2016 12:09:12 +0100 Subject: [PATCH 020/577] add feature flag to settings modal tab --- client/directives/modals/settingsModal/settingsModalView.jade | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index 1c0977c30..201ea3969 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -49,6 +49,7 @@ button.btn.btn-radio.grid-block.vertical( ng-class = "{'active': SEMC.currentTab === 'slackIntegration'}" ng-click = "SEMC.currentTab = 'slackIntegration'" + ng-if = "$root.featureFlags.gitHubIntegration" ) img.img.iconnables.grid-content( height = "24" From 7ebe918d120b1fa36caea8ad9b0c16ec9ac5db11 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 19 Aug 2016 12:12:46 +0100 Subject: [PATCH 021/577] fix input disappearing @ xs --- client/assets/styles/scss/forms/forms-github.scss | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/client/assets/styles/scss/forms/forms-github.scss b/client/assets/styles/scss/forms/forms-github.scss index c91434ea5..e0f579427 100644 --- a/client/assets/styles/scss/forms/forms-github.scss +++ b/client/assets/styles/scss/forms/forms-github.scss @@ -1,5 +1,17 @@ .form-github { + .label-col { + @include media(xs) { + width: auto; + } + } + + .input-col { + @include media(xs) { + padding-right: 15px; + } + } + .well { padding-bottom: 0; } From 9e4c4a9d936b0e073cee9ee5cb365b7417f63363 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 19 Aug 2016 16:05:28 -0700 Subject: [PATCH 022/577] Cleaned up and added new features including proper error and success states --- .../activePanel/tabs/logs/termController.js | 1 + .../components/ahaGuide/AhaGuideController.js | 39 +++++++++++-------- .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../components/setUpRepositoryGuideView.jade | 4 +- .../mirrorDockerfileView.jade | 7 ++-- .../modals/forms/formLogs/viewFormLogs.jade | 1 + .../setupMirrorServerModalView.jade | 1 + client/services/serviceAhaGuide.js | 14 +++++-- client/services/tabVisibilityService.js | 1 - 9 files changed, 44 insertions(+), 26 deletions(-) diff --git a/client/directives/activePanel/tabs/logs/termController.js b/client/directives/activePanel/tabs/logs/termController.js index 7977e928b..ec77b025a 100644 --- a/client/directives/activePanel/tabs/logs/termController.js +++ b/client/directives/activePanel/tabs/logs/termController.js @@ -21,6 +21,7 @@ function TermController( } } } + var termOnFn; var watchOnlyOnce = new WatchOnlyOnce($scope); $scope.termOpts = { diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 669a319c8..a8b1f0ad0 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -10,22 +10,39 @@ function AhaGuideController( serviceAhaGuide ) { + // TODO : use the watchonce service where warranted + var AHA = this; var previousTab; var buildLogListener; var tabListener = $scope.$on('updatedTab', function(event, tabName) { - if (tabName === 'logs') { + if (AHA.state.subStepIndex > 5) { tabListener(); + } else { + updateCaption(tabName); + } + }); + + var alertListener = $scope.$on('alert', function(event, alert) { + // alerts on container creation success + if (alert.type === 'success') { + updateCaption('logs'); + alertListener(); + buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { + console.log(buildStatus); if (buildStatus === 'failed' || buildStatus === 'buildFailed') { AHA.state.showError = true; + buildLogListener(); + } else if (buildStatus === 'success') { + updateCaption(buildStatus); + buildLogListener(); } updateBuildStatus(buildStatus); - }) + }); } - updateCaption(tabName); }); AHA.state = { @@ -54,6 +71,7 @@ function AhaGuideController( if (status === 'dockLoaded') { $rootScope.animatedPanelListener(); } + AHA.state.subStepIndex++; AHA.state.subStep = status; AHA.state.caption = currentMilestone.subSteps[status].caption; AHA.state.className = currentMilestone.subSteps[status].className @@ -64,19 +82,8 @@ function AhaGuideController( AHA.state.caption = currentMilestone.buildStatus[buildStatus]; } - // handle the panel event - function incrementStep(panel) { - // AHA.state.subStep = currentMilestone.panelSteps[panel]; - - // if (AHA.state.subStep === undefined) { - // AHA.state.subStep = 0; - // } - - // if either the dockLoaded is fired or we've reached the end - - - } - + // we need to unregister this animated panel listener if it exists + // to avoid duplication if ($rootScope.animatedPanelListener) { $rootScope.animatedPanelListener(); } diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 83d514bc8..4eb0f6b69 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -20,7 +20,7 @@ function ahaGuideDirective( subStepIndex: '=' }, link: function ($scope, elem, attrs) { - console.log($scope, elem, attrs); + // console.log($scope, elem, attrs); } }; } diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index d613f875b..0157b59bc 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -12,11 +12,11 @@ ng-if = "!AHA.state.showError" ) use( - ng-if = "$root.featureFlags.aha1 && AHA.state.subStep !== 'logs'" + ng-if = "$root.featureFlags.aha1 && AHA.state.subStep !== 'success'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AHA.state.subStep === 'logs'" + ng-if = "AHA.state.subStep === 'success'" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index d08dc9380..597856434 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -45,7 +45,7 @@ small.small.text-gray.padding-xxs.label-from( ng-if = "$root.featureFlags.blankDockerfile" ) label.grid-block.list-item( - ng-class = "{'active': MDC.state.dockerfile === false}" + ng-class = "{'active': MDC.state.configurationMethod === 'blank'}" ng-disabled = "$root.isLoading[MDC.name + 'SingleRepo']" ) svg.grid-content.shrink.iconnables.icons-dockerfile @@ -56,7 +56,8 @@ small.small.text-gray.padding-xxs.label-from( //- if there is only one, [check] by default input.checkbox( ng-disabled = "$root.isLoading[MDC.name + 'SingleRepo']" - ng-value = "false" + ng-model = "MDC.state.configurationMethod" + value = "blank" type = "radio" ) button.btn.btn-xs.btn-icon.btn-add @@ -71,9 +72,9 @@ small.small.text-gray.padding-xxs.label-from( //- 'thisDockerfile' should be the name of the Dockerfile (ie. 'Dockerfile.prod', or 'Dockerfile.staging') to suppot multiple dockerfiles //- add .disabled class to the not selected item if loading label.grid-block.list-item( + ng-class="{'active': MDC.state.configurationMethod === 'dockerfile'}" ng-disabled = "$root.isLoading[MDC.name + 'SingleRepo']" ng-repeat = "dockerfile in MDC.state.repo.dockerfiles" - ng-class="{'active': MDC.state.configurationMethod === 'dockerfile'}" ) svg.grid-content.shrink.iconnables.icons-dockerfile use( diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index f0e1101c2..69bce6ab0 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -88,6 +88,7 @@ pre.pre.log-wrapper( instance = "SMC.instance" tab-item = "item" log-term + ng-if = "SMC.instance.containers.models.length" ng-show = "SMC.page === 'terminal'" ) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade index 78d8899bc..6cadfa5be 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade @@ -3,6 +3,7 @@ aha-guide-directive step-index = 1 sub-step-index = 6 + sub-step = "files" ng-if = "$root.featureFlags.aha1" " ) diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index c2352e572..8114328a4 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -98,21 +98,28 @@ function serviceAhaGuide( className: 'aha-meter-70' }, logs: { - caption: 'Now building. Build times varies depending on your configuration', + caption: 'Now building. Build time varies depending on your configuration', className: 'aha-meter-80' + }, + success: { + caption: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', + className: 'aha-meter-90' } - }, + buildStatus: { running: 'Verifying configuration... ', + success: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', faileda: 'Your container failed to run. Inspect your CMD logs for more information.', failed: 'Your build failed. Inspect your build logs for more information.' }, + panelSteps: { containerSelection: 1, dockerfileMirroring: 2, nameContainer: 3 }, + tabSteps: { repository: 4, commands: 5, @@ -122,7 +129,8 @@ function serviceAhaGuide( files: 6, ports: 6, translation: 6, - logs: 7 + logs: 7, + success: 8 } } ] diff --git a/client/services/tabVisibilityService.js b/client/services/tabVisibilityService.js index 1a06e4a36..84c0947fe 100644 --- a/client/services/tabVisibilityService.js +++ b/client/services/tabVisibilityService.js @@ -21,7 +21,6 @@ require('app') advanced: true, basic: true, mirror: true, - featureFlagName: 'whitelist', nonRepo: true, step: 3 }, From f60b1750eb5f871b582da6b60e83766f6461925d Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 19 Aug 2016 16:14:57 -0700 Subject: [PATCH 023/577] use grid-content instead of margin-left to position icons --- client/assets/styles/scss/deprecated/instances-list.scss | 3 +-- client/assets/styles/scss/layout/instances-list.scss | 1 - client/templates/instances/viewInstancesList.jade | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/client/assets/styles/scss/deprecated/instances-list.scss b/client/assets/styles/scss/deprecated/instances-list.scss index 89fc3ccaf..6170bc7ad 100644 --- a/client/assets/styles/scss/deprecated/instances-list.scss +++ b/client/assets/styles/scss/deprecated/instances-list.scss @@ -5,8 +5,7 @@ padding: 0 7px 0 29px; .icons-gear { - margin-left: auto; - margin-right: 4px; + margin: 0 4px; } } diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 848503da7..3c2ea5b99 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -107,7 +107,6 @@ // '+' button .btn-xs { line-height: initial; - margin-left: auto; overflow: hidden; width: $input-xs; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index d814cad68..0f6b04122 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -17,7 +17,7 @@ p.p.text-center.text-gray-light.padding-sm( ) .grid-block.align-center.list-item-cluster.list-clusters-heading - span.text-overflow Template Containers + span.grid-content.text-overflow Template Containers .list-item-cluster .grid-block.list-containers.vertical.text-overflow.open //- master repository containers @@ -45,7 +45,7 @@ p.p.text-center.text-gray-light.padding-sm( //- cluster list heading .grid-block.align-center.list-item-cluster.list-clusters-heading //- repository name - span.text-overflow( + span.grid-content.text-overflow( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} //- '+' button for adding branches and configuring clusters From bb4df99d48750201ae1c1028896775f6d62efbad Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 19 Aug 2016 16:26:20 -0700 Subject: [PATCH 024/577] add auto-launch toggle back in --- .../branchMenuPopoverView.jade | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index c9ac9d927..431197dc2 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -18,7 +18,7 @@ animated-panel-container.popover-views( ng-if = "!$root.featureFlags.autoIsolationSetup" ) - //- this should be the default panel with auto-isolation is implemented + //- this should be the default panel when auto-isolation is implemented animated-panel( name = "branchMenu" ) @@ -93,7 +93,22 @@ .padding-xxs( ng-if = "state.branchesLoaded" ) - .well.gray.small.padding-xxs.text-center We auto-add branches when you push to this repo, but you can do it manually here. + .grid-block.shrink.align-center.well.gray.padding-xxs( + ng-if = "!$root.featureFlags.autoIsolation" + ) + .grid-content + .small Automatically add branches as they’re updated on GitHub. + button.btn.btn-xs.btn-permissions( + internal-modal-helper = "inviteAdminModalView" + ng-if = "$root.featureFlags.webhooks" + ng-include = "'permissionsButtonView'" + ) + label.grid-content.shrink.toggle-wrapper + input.toggle-input( + ng-disabled = "$root.featureFlags.webhooks" + type = "checkbox" + ) + .toggle-group.toggle-sm input.input.input-xs.input-search( placeholder = "Filter" required From 9b42f28fcaaa842619ba9a29a0d0ceacadd31106 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 19 Aug 2016 18:11:39 -0700 Subject: [PATCH 025/577] update terminology --- .../ahaGuide/components/setUpRepositoryGuideView.jade | 2 +- .../environment/environmentHeader/viewEnvironmentHeader.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 270e4752d..aac0e19eb 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -79,7 +79,7 @@ p.p.small.text-gray-light Add your First Repository p.p( ng-if = "state.showSubStep === 0 && !state.showError && !state.showVerification" - ) Add your repository by clicking ‘Add Configuration’. + ) Add your repository by clicking ‘Add Template. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 1 && !state.showError && !state.showVerification" diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 9389432ce..f1c5bbce7 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -61,7 +61,7 @@ button.grid-block.shrink.btn.btn-md.green( use( xlink:href = "#icons-add" ) - | Add Configuration + | Add Template button.grid-block.shrink.btn.btn-sm.gray.btn-aha( ng-click = "$root.featureFlags.ahaSidebar = true" From 74964cd1ee675a1fdb1f727ba751d3ae4a2ca1f2 Mon Sep 17 00:00:00 2001 From: henrymollman Date: Sun, 21 Aug 2016 15:07:00 -0700 Subject: [PATCH 026/577] WIP initial commit --- .../mirrorDockerfileView.jade | 5 +- .../setupServerModalController.js | 7 ++- .../modals/serverModalController.js | 2 +- .../newContainerModalController.js | 46 +++++++++++++------ client/services/featureFlagService.js | 8 ++-- client/services/tabVisibilityService.js | 3 +- 6 files changed, 46 insertions(+), 25 deletions(-) diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index d08dc9380..d5022942d 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -45,7 +45,7 @@ small.small.text-gray.padding-xxs.label-from( ng-if = "$root.featureFlags.blankDockerfile" ) label.grid-block.list-item( - ng-class = "{'active': MDC.state.dockerfile === false}" + ng-class = "{'active': MDC.state.dockerfile === 'blank'}" ng-disabled = "$root.isLoading[MDC.name + 'SingleRepo']" ) svg.grid-content.shrink.iconnables.icons-dockerfile @@ -56,8 +56,9 @@ small.small.text-gray.padding-xxs.label-from( //- if there is only one, [check] by default input.checkbox( ng-disabled = "$root.isLoading[MDC.name + 'SingleRepo']" - ng-value = "false" + ng-model = 'MDC.state.configurationMethod' type = "radio" + value = "blankDockerfile" ) button.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-check diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index cc6e68d4c..de0d49ec0 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -12,6 +12,7 @@ function SetupServerModalController( cardInfoTypes, createAndBuildNewContainer, createBuildFromContextVersionId, + dockerfileType, errs, eventTracking, fetchDockerfileFromSource, @@ -60,6 +61,7 @@ function SetupServerModalController( }); var mainRepoContainerFile = new cardInfoTypes.MainRepository(); + var isBlankDockerfile = dockerfileType === 'blankDockerfile' ? dockerfileType : false; // Set initial state angular.extend(SMC, { name: 'setupServerModal', @@ -116,7 +118,7 @@ function SetupServerModalController( acv: build.contextVersion.getMainAppCodeVersion(), branch: masterBranch, repoSelected: true, - advanced: false + advanced: isBlankDockerfile }); SMC.state.mainRepoContainerFile.name = repo.attrs.name; SMC.state.promises.contextVersion = $q.when(SMC.state.contextVersion); @@ -329,6 +331,9 @@ function SetupServerModalController( }; SMC.isPrimaryButtonDisabled = function (serverFormInvalid) { + if (SMC.state.advanced === 'blankDockerfile') { + return false; + } return ( (SMC.state.step === 2 && SMC.repositoryForm && SMC.repositoryForm.$invalid) || $filter('selectedStackInvalid')(SMC.state.selectedStack) diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 02f54013e..2b7c98d71 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -362,7 +362,7 @@ function ServerModalController( var SMC = this; var errorMessage = ''; errorMessage += '# There was an error retrieving the Dockerfile from your repo'; - errorMessage += '# This error occured when disabling mirrorring your Dockerfile'; + errorMessage += '# This error occured when disabling mirroring your Dockerfile'; var dockerfileBody = keypather.get(state, 'dockerfile.attrs.body') || errorMessage; return loadingPromises.add(SMC.name, promisify(state.contextVersion, 'update')({ advanced: true, diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index 221cd81e5..0841ade89 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -178,21 +178,17 @@ function NewContainerModalController( }); }; - NCMC.createBuildAndGoToNewRepoModal = function (instanceName, repo, dockerfile, configurationMethod) { - loading(NCMC.name + 'SingleRepo', true); - return createNewBuildAndFetchBranch(currentOrg.github, repo, keypather.get(dockerfile, 'path')) - .then(function (repoBuildAndBranch) { - repoBuildAndBranch.instanceName = instanceName; - if (configurationMethod === 'dockerfile' && dockerfile) { - NCMC.newMirrorRepositoryContainer(repoBuildAndBranch); - } else { - NCMC.newRepositoryContainer(repoBuildAndBranch); - } - }) - .finally(function () { - loading(NCMC.name + 'SingleRepo', false); - }); - }; + NCMC.createBuildAndGoToNewRepoModal = function (instanceName, repo, + dockerfile, configurationMethod) { loading(NCMC.name + 'SingleRepo', true); + return createNewBuildAndFetchBranch(currentOrg.github, repo, + keypather.get(dockerfile, 'path')) .then(function (repoBuildAndBranch) { + repoBuildAndBranch.instanceName = instanceName; if (configurationMethod === + 'dockerfile' && dockerfile) { + NCMC.newMirrorRepositoryContainer(repoBuildAndBranch); } else if + (configurationMethod === 'blankDockerfile') { + NCMC.newBlankRepositoryContainer(repoBuildAndBranch); } else { + NCMC.newRepositoryContainer(repoBuildAndBranch); } }) .finally(function () { + loading(NCMC.name + 'SingleRepo', false); }); }; NCMC.createBuildFromTemplate = function (instanceName, sourceInstance) { NCMC.close(); @@ -208,6 +204,7 @@ function NewContainerModalController( controllerAs: 'SMC', templateUrl: 'setupServerModalView', inputs: angular.extend({ + dockerfileType: null, instanceName: null, repo: null, build: null, @@ -216,6 +213,24 @@ function NewContainerModalController( }); }; + NCMC.newBlankRepositoryContainer = function(inputs) { + if (NCMC.state.closed) { return; } + NCMC.close(); + ModalService.showModal({ + controller: 'SetupServerModalController', + controllerAs: 'SMC', + templateUrl: 'setupServerModalView', + inputs: angular.extend({ + dockerfileType: NCMC.state.configurationMethod, + instanceName: null, + build: null, + masterBranch: null, + repo: null + }, inputs) + }); + }; + + NCMC.newMirrorRepositoryContainer = function (inputs) { if (NCMC.state.closed) { return; } NCMC.close(); @@ -224,6 +239,7 @@ function NewContainerModalController( controllerAs: 'SMC', templateUrl: 'setupMirrorServerModalView', inputs: angular.extend({ + dockerfileType: NCMC.state.configurationMethod, instanceName: null, repo: null, build: null, diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index b40b2fe37..802001e09 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -7,9 +7,9 @@ function featureFlags( $localStorage ) { var defaultFeatureFlags = { - aha: false, - aha0: false, // step 1: create sandbox - aha1: false, // step 2: working repo config + aha: true, + aha0: true, // step 1: create sandbox + aha1: true, // step 2: working repo config aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config aha2: false, // step 3: add branch aha3: false, // step 4: runnabot @@ -19,7 +19,7 @@ function featureFlags( autoIsolation: false, autoIsolationSetup: false, backup: false, - blankDockerfile: false, // allows users to skip the verification flow + blankDockerfile: true, // allows users to skip the verification flow billing: false, billingDiscounted: false, billingExpired: false, diff --git a/client/services/tabVisibilityService.js b/client/services/tabVisibilityService.js index 1a06e4a36..c1e561c85 100644 --- a/client/services/tabVisibilityService.js +++ b/client/services/tabVisibilityService.js @@ -21,7 +21,6 @@ require('app') advanced: true, basic: true, mirror: true, - featureFlagName: 'whitelist', nonRepo: true, step: 3 }, @@ -47,8 +46,8 @@ require('app') step: 3 }, buildfiles: { - basic: true, advanced: true, + basic: true, mirror: true, nonRepo: true, step: 3 From 41b99f1cef13d7a608d537b9bab20e36e05c6ecb Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 21 Aug 2016 23:15:25 -0700 Subject: [PATCH 027/577] Added update on dockerfile edit --- .../modalSetupServer/setupServerModalController.js | 4 +++- .../environment/modals/serverModalController.js | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index de0d49ec0..fe0131e67 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -239,6 +239,8 @@ function SetupServerModalController( loadingPromises.clear(SMC.name); if (!SMC.state.advanced) { return updateDockerfileFromState(SMC.state, false, true); + } else if (SMC.state.advanced === 'blankDockerfile') { + // populateStuff? } return true; }) @@ -252,7 +254,7 @@ function SetupServerModalController( } }) .then(function () { - return SMC.state; + return SMC.state; // should have updated dockerfile body //smc.state.dockerfile.attrs.body }); function instanceSetHandler (instance) { if (instance) { diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 2b7c98d71..db1afd2d2 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -42,13 +42,14 @@ function ServerModalController( }; this.openDockerfile = function (state, openItems) { + // this is where things go wrong, also lines 277 var SMC = this; return fetchDockerfileForContextVersion(state.contextVersion) .then(function (dockerfile) { - if (keypather.get(SMC, 'instance.hasDockerfileMirroring()') && !SMC.instance.mirroredDockerfile) { + if (keypather.get(SMC, 'instance.hasDockerfileMirroring()') && !SMC.instance.mirroredDockerfile && SMC.state.advanced !== 'blankDockerfile') { SMC.instance.mirroredDockerfile = dockerfile; } - if (state.dockerfile) { + if (state.dockerfile || SMC.state.advanced === 'blankDockerfile') { openItems.remove(state.dockerfile); } if (dockerfile) { @@ -95,7 +96,7 @@ function ServerModalController( toRedeploy = !toRebuild && rebuildOrRedeploy === 'update'; loadingPromises.clear(SMC.name); - if (!SMC.openItems.isClean()) { + if (!SMC.openItems.isClean() || SMC.state.advanced === 'blankDockerfile') { return SMC.openItems.updateAllFiles(); } }) @@ -272,12 +273,17 @@ function ServerModalController( }; this.resetStateContextVersion = function (contextVersion, shouldParseDockerfile) { + // also problems here along with lines 45 + // can check that there is a SMC.state.advanced property which = blankDockerfile var SMC = this; - if (keypather.get(contextVersion, 'attrs.buildDockerfilePath')) { + if (SMC.state.advanced === 'blankDockerfile') { + + } else if (keypather.get(contextVersion, 'attrs.buildDockerfilePath')) { SMC.state.advanced = 'isMirroringDockerfile'; } else { SMC.state.advanced = !!keypather.get(contextVersion, 'attrs.advanced'); } + SMC.state.promises.contextVersion = loadingPromises.start( SMC.name, promisify(contextVersion, 'deepCopy')() From df383849b90dcf2413b9b689503abd1f69ed8233 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 22 Aug 2016 15:04:09 -0700 Subject: [PATCH 028/577] Fixed SAN-4792 open dockerfile issue --- .../setupServerModalController.js | 16 ++++----- .../modals/serverModalController.js | 9 +++-- .../newContainerModalController.js | 35 +++++++++++++------ client/services/featureFlagService.js | 8 ++--- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index fe0131e67..363b45e95 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -112,13 +112,13 @@ function SetupServerModalController( // If a repo is passed into this controller, select that repo angular.extend(SMC.state, { - repo: repo, - build: build, - contextVersion: build.contextVersion, acv: build.contextVersion.getMainAppCodeVersion(), + advanced: isBlankDockerfile, branch: masterBranch, - repoSelected: true, - advanced: isBlankDockerfile + build: build, + contextVersion: build.contextVersion, + repo: repo, + repoSelected: true }); SMC.state.mainRepoContainerFile.name = repo.attrs.name; SMC.state.promises.contextVersion = $q.when(SMC.state.contextVersion); @@ -237,10 +237,8 @@ function SetupServerModalController( var createPromise = loadingPromises.finished(SMC.name) .then(function () { loadingPromises.clear(SMC.name); - if (!SMC.state.advanced) { + if (!SMC.state.advanced || SMC.state.advanced === 'blankDockerfile') { return updateDockerfileFromState(SMC.state, false, true); - } else if (SMC.state.advanced === 'blankDockerfile') { - // populateStuff? } return true; }) @@ -254,7 +252,7 @@ function SetupServerModalController( } }) .then(function () { - return SMC.state; // should have updated dockerfile body //smc.state.dockerfile.attrs.body + return SMC.state; }); function instanceSetHandler (instance) { if (instance) { diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index db1afd2d2..6d3ef1bac 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -42,14 +42,13 @@ function ServerModalController( }; this.openDockerfile = function (state, openItems) { - // this is where things go wrong, also lines 277 var SMC = this; return fetchDockerfileForContextVersion(state.contextVersion) .then(function (dockerfile) { - if (keypather.get(SMC, 'instance.hasDockerfileMirroring()') && !SMC.instance.mirroredDockerfile && SMC.state.advanced !== 'blankDockerfile') { + if (keypather.get(SMC, 'instance.hasDockerfileMirroring()') && !SMC.instance.mirroredDockerfile) { SMC.instance.mirroredDockerfile = dockerfile; } - if (state.dockerfile || SMC.state.advanced === 'blankDockerfile') { + if (state.dockerfile) { openItems.remove(state.dockerfile); } if (dockerfile) { @@ -276,8 +275,8 @@ function ServerModalController( // also problems here along with lines 45 // can check that there is a SMC.state.advanced property which = blankDockerfile var SMC = this; - if (SMC.state.advanced === 'blankDockerfile') { - + if (SMC.state.advanced === 'blankDockerfile' || !SMC.state.advanced) { + console.log('keep it going'); } else if (keypather.get(contextVersion, 'attrs.buildDockerfilePath')) { SMC.state.advanced = 'isMirroringDockerfile'; } else { diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index 0841ade89..ac816023d 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -178,17 +178,30 @@ function NewContainerModalController( }); }; - NCMC.createBuildAndGoToNewRepoModal = function (instanceName, repo, - dockerfile, configurationMethod) { loading(NCMC.name + 'SingleRepo', true); - return createNewBuildAndFetchBranch(currentOrg.github, repo, - keypather.get(dockerfile, 'path')) .then(function (repoBuildAndBranch) { - repoBuildAndBranch.instanceName = instanceName; if (configurationMethod === - 'dockerfile' && dockerfile) { - NCMC.newMirrorRepositoryContainer(repoBuildAndBranch); } else if - (configurationMethod === 'blankDockerfile') { - NCMC.newBlankRepositoryContainer(repoBuildAndBranch); } else { - NCMC.newRepositoryContainer(repoBuildAndBranch); } }) .finally(function () { - loading(NCMC.name + 'SingleRepo', false); }); }; + NCMC.createBuildAndGoToNewRepoModal = function (instanceName, repo, dockerfile, configurationMethod) { + var dockerfilePath; + loading(NCMC.name + 'SingleRepo', true); + + if (configurationMethod === 'dockerfile') { + dockerfilePath = keypather.get(dockerfile, 'path'); + } else { + dockerfilePath = ''; + } + return createNewBuildAndFetchBranch(currentOrg.github, repo, dockerfilePath) + .then(function (repoBuildAndBranch) { + repoBuildAndBranch.instanceName = instanceName; + if (configurationMethod === 'dockerfile' && dockerfile) { + NCMC.newMirrorRepositoryContainer(repoBuildAndBranch); + } else if (configurationMethod === 'blankDockerfile') { + NCMC.newBlankRepositoryContainer(repoBuildAndBranch); + } else { + NCMC.newRepositoryContainer(repoBuildAndBranch); + } + }) + .finally(function () { + loading(NCMC.name + 'SingleRepo', false); + }); + }; NCMC.createBuildFromTemplate = function (instanceName, sourceInstance) { NCMC.close(); diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 802001e09..b40b2fe37 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -7,9 +7,9 @@ function featureFlags( $localStorage ) { var defaultFeatureFlags = { - aha: true, - aha0: true, // step 1: create sandbox - aha1: true, // step 2: working repo config + aha: false, + aha0: false, // step 1: create sandbox + aha1: false, // step 2: working repo config aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config aha2: false, // step 3: add branch aha3: false, // step 4: runnabot @@ -19,7 +19,7 @@ function featureFlags( autoIsolation: false, autoIsolationSetup: false, backup: false, - blankDockerfile: true, // allows users to skip the verification flow + blankDockerfile: false, // allows users to skip the verification flow billing: false, billingDiscounted: false, billingExpired: false, From 1d0238b2231b0576ced7593c40758708915cb2a1 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 22 Aug 2016 18:08:47 -0700 Subject: [PATCH 029/577] Auto open blank dockerfile on dockerfile tab open --- .../explorer/fileTreeDirDirective.js | 1 - .../setupServerModalController.js | 9 ++++++- .../modals/serverModalController.js | 15 +++++------ .../newContainerModalController.js | 26 +++---------------- 4 files changed, 18 insertions(+), 33 deletions(-) diff --git a/client/directives/components/explorer/fileTreeDirDirective.js b/client/directives/components/explorer/fileTreeDirDirective.js index e7794e600..d810c696c 100755 --- a/client/directives/components/explorer/fileTreeDirDirective.js +++ b/client/directives/components/explorer/fileTreeDirDirective.js @@ -37,7 +37,6 @@ function fileTreeDir( link: function ($scope, element) { var actions = $scope.actions = {}; - $scope.data = {}; var inputElement = element[0].querySelector('input.tree-input'); $scope.editFolderName = false; diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 363b45e95..1e78e3bf2 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -61,7 +61,6 @@ function SetupServerModalController( }); var mainRepoContainerFile = new cardInfoTypes.MainRepository(); - var isBlankDockerfile = dockerfileType === 'blankDockerfile' ? dockerfileType : false; // Set initial state angular.extend(SMC, { name: 'setupServerModal', @@ -110,6 +109,14 @@ function SetupServerModalController( return errs.handler(new Error('Repo, build, and masterBranch must be set')); } + // if the blank docker file is chosen, we need to load it because it is already available + if (dockerfileType === 'blankDockerfile') { + var isBlankDockerfile = dockerfileType; + SMC.openDockerfile({contextVersion: build.contextVersion}, SMC.openItems); + } else { + var isBlankDockerfile = false; + } + // If a repo is passed into this controller, select that repo angular.extend(SMC.state, { acv: build.contextVersion.getMainAppCodeVersion(), diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 6d3ef1bac..5570ed570 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -272,15 +272,14 @@ function ServerModalController( }; this.resetStateContextVersion = function (contextVersion, shouldParseDockerfile) { - // also problems here along with lines 45 - // can check that there is a SMC.state.advanced property which = blankDockerfile var SMC = this; - if (SMC.state.advanced === 'blankDockerfile' || !SMC.state.advanced) { - console.log('keep it going'); - } else if (keypather.get(contextVersion, 'attrs.buildDockerfilePath')) { - SMC.state.advanced = 'isMirroringDockerfile'; - } else { - SMC.state.advanced = !!keypather.get(contextVersion, 'attrs.advanced'); + + if (SMC.state.advanced !== 'blankDockerfile') { + if (keypather.get(contextVersion, 'attrs.buildDockerfilePath')) { + SMC.state.advanced = 'isMirroringDockerfile'; + } else { + SMC.state.advanced = !!keypather.get(contextVersion, 'attrs.advanced'); + } } SMC.state.promises.contextVersion = loadingPromises.start( diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index ac816023d..e342c1b27 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -192,10 +192,8 @@ function NewContainerModalController( repoBuildAndBranch.instanceName = instanceName; if (configurationMethod === 'dockerfile' && dockerfile) { NCMC.newMirrorRepositoryContainer(repoBuildAndBranch); - } else if (configurationMethod === 'blankDockerfile') { - NCMC.newBlankRepositoryContainer(repoBuildAndBranch); } else { - NCMC.newRepositoryContainer(repoBuildAndBranch); + NCMC.newRepositoryContainer(repoBuildAndBranch, configurationMethod); } }) .finally(function () { @@ -209,7 +207,7 @@ function NewContainerModalController( .catch(errs.handler); }; - NCMC.newRepositoryContainer = function (inputs) { + NCMC.newRepositoryContainer = function (inputs, configurationMethod) { if (NCMC.state.closed) { return; } NCMC.close(); ModalService.showModal({ @@ -217,7 +215,7 @@ function NewContainerModalController( controllerAs: 'SMC', templateUrl: 'setupServerModalView', inputs: angular.extend({ - dockerfileType: null, + dockerfileType: configurationMethod, instanceName: null, repo: null, build: null, @@ -226,24 +224,6 @@ function NewContainerModalController( }); }; - NCMC.newBlankRepositoryContainer = function(inputs) { - if (NCMC.state.closed) { return; } - NCMC.close(); - ModalService.showModal({ - controller: 'SetupServerModalController', - controllerAs: 'SMC', - templateUrl: 'setupServerModalView', - inputs: angular.extend({ - dockerfileType: NCMC.state.configurationMethod, - instanceName: null, - build: null, - masterBranch: null, - repo: null - }, inputs) - }); - }; - - NCMC.newMirrorRepositoryContainer = function (inputs) { if (NCMC.state.closed) { return; } NCMC.close(); From 1a3dac2627330c1df0563160c5b56afbd8e07021 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 22 Aug 2016 18:32:02 -0700 Subject: [PATCH 030/577] Fixed bug that displayed blank dockerfile to mirror when option does not make sense in specific post-repo selection modal --- .../components/mirrorDockerfile/mirrorDockerfileView.jade | 2 +- .../modals/modalSetupServer/setupServerModalController.js | 2 +- .../modals/modalNewContainer/newContainerModalController.js | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index d5022942d..cce78400f 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -42,7 +42,7 @@ small.small.text-gray.padding-xxs.label-from( ) Advanced Configuration .grid-content.shrink.list.list-bordered( - ng-if = "$root.featureFlags.blankDockerfile" + ng-if = "$root.featureFlags.blankDockerfile && MDC.state.tabName === 'repos'" ) label.grid-block.list-item( ng-class = "{'active': MDC.state.dockerfile === 'blank'}" diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 1e78e3bf2..aac22740b 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -338,7 +338,7 @@ function SetupServerModalController( }; SMC.isPrimaryButtonDisabled = function (serverFormInvalid) { - if (SMC.state.advanced === 'blankDockerfile') { + if (SMC.state.advanced === 'blankDockerfile' || SMC.state.advanced === 'isMirroringDockerfile') { return false; } return ( diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index e342c1b27..6a3c82ea8 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -232,7 +232,6 @@ function NewContainerModalController( controllerAs: 'SMC', templateUrl: 'setupMirrorServerModalView', inputs: angular.extend({ - dockerfileType: NCMC.state.configurationMethod, instanceName: null, repo: null, build: null, From 1f059ab7c66e9718fccbe325d3c9bd7743628fe8 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 22 Aug 2016 19:09:51 -0700 Subject: [PATCH 031/577] Tests pass! --- .../controllers/setupServerModalController.unit.js | 2 ++ .../modals/newContainerModalController.unit.js | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/test/unit/controllers/setupServerModalController.unit.js b/test/unit/controllers/setupServerModalController.unit.js index aec1c22c3..0b22b1d77 100644 --- a/test/unit/controllers/setupServerModalController.unit.js +++ b/test/unit/controllers/setupServerModalController.unit.js @@ -206,6 +206,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { $scope = $rootScope.$new(); SMC = $controller('SetupServerModalController', { $scope: $scope, + dockerfileType: {}, instanceName: opts.instanceName || instanceName, repo: opts.repo || repo, build: opts.build || newBuild, @@ -344,6 +345,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { beforeEach(function (done) { initializeValues(); initState({ + dockerfileType: 'blankDockerfile', instanceName: 'instanceName', repo: repo, build: newBuild, diff --git a/test/unit/directives/modals/newContainerModalController.unit.js b/test/unit/directives/modals/newContainerModalController.unit.js index 675323e30..5847b098c 100644 --- a/test/unit/directives/modals/newContainerModalController.unit.js +++ b/test/unit/directives/modals/newContainerModalController.unit.js @@ -182,14 +182,16 @@ describe('NewContainerModalController'.bold.underline.blue, function () { describe('createBuildAndGoToNewRepoModal', function () { it('should create a build and fetch the branch', function () { var repo = {}; + var dockerfile = null; + var configurationMethod = 'new'; sinon.stub(NCMC, 'newRepositoryContainer'); - NCMC.createBuildAndGoToNewRepoModal(instanceName, repo); + NCMC.createBuildAndGoToNewRepoModal(instanceName, repo, dockerfile, configurationMethod); $scope.$digest(); sinon.assert.calledOnce(createNewBuildAndFetchBranch); sinon.assert.calledWith(createNewBuildAndFetchBranch, mockCurrentOrg.github, repo); sinon.assert.calledOnce(NCMC.newRepositoryContainer); - sinon.assert.calledWithExactly(NCMC.newRepositoryContainer, repoBuildAndBranch); + sinon.assert.calledWithExactly(NCMC.newRepositoryContainer, repoBuildAndBranch, configurationMethod); expect(repoBuildAndBranch.instanceName).to.equal(instanceName); }); @@ -213,8 +215,9 @@ describe('NewContainerModalController'.bold.underline.blue, function () { describe('newRepositoryContainer', function () { it('should close the modal and call the new modal', function () { + var dockerfileType = 'blankDockerfile'; repoBuildAndBranch.instanceName = instanceName; - NCMC.newRepositoryContainer(repoBuildAndBranch); + NCMC.newRepositoryContainer(repoBuildAndBranch, dockerfileType); $scope.$digest(); sinon.assert.calledOnce(closeStub); sinon.assert.calledOnce(showModalStub); @@ -223,6 +226,7 @@ describe('NewContainerModalController'.bold.underline.blue, function () { controllerAs: 'SMC', templateUrl: 'setupServerModalView', inputs: { + dockerfileType: dockerfileType, instanceName: instanceName, repo: repoBuildAndBranch.repo, build: repoBuildAndBranch.build, From ceb5a63597769c3edf10ccbd8a8150d2142724ae Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 23 Aug 2016 09:58:39 -0700 Subject: [PATCH 032/577] Fixed styling issue --- .../ahaGuide/components/setUpRepositoryGuideView.jade | 2 +- client/directives/environment/environmentView.jade | 2 +- .../modals/modalNewContainer/newContainerModalView.jade | 4 +++- client/services/serviceAhaGuide.js | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 0157b59bc..8117e3d0c 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -67,7 +67,7 @@ ) Next p.p.small.text-gray-light {{ AHA.state.title }} p.p( - ng-class = "{'p-slide js-animate': AHA.state.subStepIndex}" + ng-class = "{'p-slide js-animate': AHA.state.subStepIndex > 0}" ng-if = "$root.featureFlags.aha1 && !state.showError && !state.showVerification" ) {{ AHA.state.caption }} p.p( diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index b8ef934bb..ec53c86b0 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -101,7 +101,7 @@ aha-guide-directive step-index = 1 sub-step = "addRepository" - sub-step-index = 1 + sub-step-index = 0 ) .grid-block.card-grid.clearfix( diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 5219d48bf..0a0ac6c4e 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -1,9 +1,11 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha1" aha-guide-directive + ng-class = "{'p-slide js-animate': AHA.state.subStepIndex > 0}" + ng-if = "$root.featureFlags.aha1" step-index = 1 sub-step = "containerSelection" + sub-step-index = 1 ) .modal-dialog.modal-lg animated-panel-container.modal-servers diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index 8114328a4..573184d85 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -36,7 +36,7 @@ function serviceAhaGuide( } }, { - title: 'Add your first Repository', + title: 'Add your First Repository', subStepCaptions: [ 'Add your repository by clicking \'Add Configuration\'.', 'Select a repository to configure', @@ -54,7 +54,7 @@ function serviceAhaGuide( className: 'aha-meter-10' }, containerSelection: { - caption: 'Select a repository to configure', + caption: 'Select a repository to configure.', className: 'aha-meter-20' }, dockerfileMirroring: { From 88076d5428a168f070aa5410f9ae08e143b82e5b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 23 Aug 2016 13:35:45 -0700 Subject: [PATCH 033/577] Should pass prod linting now... --- client/directives/activePanel/tabs/logs/termController.js | 2 +- client/directives/components/ahaGuide/AhaGuideController.js | 6 +++--- .../directives/components/buildLogs/buildLogsController.js | 2 +- .../modals/modalSetupServer/setupServerModalController.js | 5 ++--- .../modals/modalNewContainer/newContainerModalController.js | 1 - client/services/serviceAhaGuide.js | 6 +++--- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/client/directives/activePanel/tabs/logs/termController.js b/client/directives/activePanel/tabs/logs/termController.js index ec77b025a..97d9a60c4 100644 --- a/client/directives/activePanel/tabs/logs/termController.js +++ b/client/directives/activePanel/tabs/logs/termController.js @@ -19,7 +19,7 @@ function TermController( state: { saveState: function() {return null;} } - } + }; } var termOnFn; diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index e213e283c..7fcab478f 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -58,7 +58,7 @@ function AhaGuideController( AHA.state.title = currentMilestone.title; AHA.state.caption = currentMilestone.subSteps[AHA.state.subStep].caption; - AHA.state.className = currentMilestone.subSteps[AHA.state.subStep].className + AHA.state.className = currentMilestone.subSteps[AHA.state.subStep].className; // update steps and initiate digest loop function updateCaption(status) { @@ -71,7 +71,7 @@ function AhaGuideController( AHA.state.subStep = status; AHA.state.subStepIndex = currentMilestone.subSteps[status].step; AHA.state.caption = currentMilestone.subSteps[status].caption; - AHA.state.className = currentMilestone.subSteps[status].className + AHA.state.className = currentMilestone.subSteps[status].className; } function updateBuildStatus(buildStatus) { @@ -89,5 +89,5 @@ function AhaGuideController( updateCaption(panel); }); -}; +} diff --git a/client/directives/components/buildLogs/buildLogsController.js b/client/directives/components/buildLogs/buildLogsController.js index afd7bbd95..7e55eae2f 100644 --- a/client/directives/components/buildLogs/buildLogsController.js +++ b/client/directives/components/buildLogs/buildLogsController.js @@ -39,7 +39,7 @@ function BuildLogsController( BLC.buildStatus = 'success'; BLC.buildLogsRunning = false; } - $rootScope.$broadcast('buildStatusUpdated', BLC.buildStatus) + $rootScope.$broadcast('buildStatusUpdated', BLC.buildStatus); } var failCount = 0; diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index aac22740b..630c776c0 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -111,16 +111,15 @@ function SetupServerModalController( // if the blank docker file is chosen, we need to load it because it is already available if (dockerfileType === 'blankDockerfile') { - var isBlankDockerfile = dockerfileType; SMC.openDockerfile({contextVersion: build.contextVersion}, SMC.openItems); } else { - var isBlankDockerfile = false; + dockerfileType = false; } // If a repo is passed into this controller, select that repo angular.extend(SMC.state, { acv: build.contextVersion.getMainAppCodeVersion(), - advanced: isBlankDockerfile, + advanced: dockerfileType, branch: masterBranch, build: build, contextVersion: build.contextVersion, diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index cfe784aab..79a9d0f06 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -195,7 +195,6 @@ function NewContainerModalController( }) .finally(function () { loading(NCMC.name + 'SingleRepo', false); - $rootScope.$broadcast('openedRepoModal'); }); }; diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index cb4f12e8e..c84a7f4c9 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -58,12 +58,12 @@ function serviceAhaGuide( caption: 'Select a repository to configure.', className: 'aha-meter-20', step: 1 - }, + }, dockerfileMirroring: { caption: 'How would you like to configure your repo?', className: 'aha-meter-30', step: 2 - }, + }, nameContainer: { caption: 'Give your configuration a name.', className: 'aha-meter-40', @@ -133,7 +133,7 @@ function serviceAhaGuide( failed: 'Your build failed. Inspect your build logs for more information.' } } - ] + ]; function getSteps() { return _steps; From c74bb43e048990bddc4900e27eab8c9d54fc9687 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 23 Aug 2016 17:32:52 -0700 Subject: [PATCH 034/577] Worked out tabs and ordering for separate dockerfile paths --- .../components/ahaGuide/AhaGuideController.js | 6 ++++++ .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../modalSetupServer/setupServerModalController.js | 14 +++++++------- .../modalSetupServer/setupServerModalView.jade | 12 +++++++++--- .../newContainerModalController.js | 4 +++- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 7fcab478f..d01579485 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -84,6 +84,12 @@ function AhaGuideController( if ($rootScope.animatedPanelListener) { $rootScope.animatedPanelListener(); } + + $scope.$on('$destroy', function() { + if ($rootScope.animatedPanelListener) { + $rootScope.animatedPanelListener(); + } + }); $rootScope.animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { updateCaption(panel); diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 4eb0f6b69..83d514bc8 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -20,7 +20,7 @@ function ahaGuideDirective( subStepIndex: '=' }, link: function ($scope, elem, attrs) { - // console.log($scope, elem, attrs); + console.log($scope, elem, attrs); } }; } diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 630c776c0..cadb5ab28 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -109,13 +109,6 @@ function SetupServerModalController( return errs.handler(new Error('Repo, build, and masterBranch must be set')); } - // if the blank docker file is chosen, we need to load it because it is already available - if (dockerfileType === 'blankDockerfile') { - SMC.openDockerfile({contextVersion: build.contextVersion}, SMC.openItems); - } else { - dockerfileType = false; - } - // If a repo is passed into this controller, select that repo angular.extend(SMC.state, { acv: build.contextVersion.getMainAppCodeVersion(), @@ -126,6 +119,13 @@ function SetupServerModalController( repo: repo, repoSelected: true }); + + // if the blank docker file is chosen, we need to load it because it is already available + if (dockerfileType === 'blankDockerfile') { + SMC.openDockerfile({contextVersion: build.contextVersion}, SMC.openItems); + SMC.changeTab('buildfiles'); + } + SMC.state.mainRepoContainerFile.name = repo.attrs.name; SMC.state.promises.contextVersion = $q.when(SMC.state.contextVersion); diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade index 0c043708f..0bb61249b 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade @@ -1,12 +1,18 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-if = "$root.featureFlags.aha1" + ng-if = "!SMC.state.advanced" step-index = 1 sub-step = "repository" - sub-step-index = status.configurationMethod === 'blankDockerfile' ? 6 : 4 + sub-step-index = 4 + ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + aha-guide-directive + ng-if = "SMC.state.advanced === 'blankDockerfile'" + step-index = 1 + sub-step = "buildfiles" + sub-step-index = 6 ) - form.modal-dialog.modal-edit( name = "SMC.serverForm" ng-if = "SMC.state.repo" diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index 79a9d0f06..57cc90ac8 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -189,8 +189,10 @@ function NewContainerModalController( repoBuildAndBranch.instanceName = instanceName; if (configurationMethod === 'dockerfile' && dockerfile) { NCMC.newMirrorRepositoryContainer(repoBuildAndBranch); - } else { + } else if (configurationMethod === 'blankDockerfile'){ NCMC.newRepositoryContainer(repoBuildAndBranch, configurationMethod); + } else { + NCMC.newRepositoryContainer(repoBuildAndBranch, false); } }) .finally(function () { From b70b67d9001411bba1cd1f6e6654b914986d2934 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 23 Aug 2016 17:44:38 -0700 Subject: [PATCH 035/577] "enter isolation" -> "isolate branch" --- .../instanceNavigtion/instanceNavigationPopoverView.jade | 2 +- .../isolationConfiguration/isolationConfigurationModalView.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index e387793ff..914080cc0 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -89,7 +89,7 @@ use( xlink:href = "#icons-gear-modified" ) - | Enter Isolation + | Isolate Branch span( ng-if = "INC.shouldShowSetupModal" ) … diff --git a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade index c98ecebf4..50246fc34 100644 --- a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade +++ b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade @@ -100,4 +100,4 @@ button.btn.btn-md.green.float-right( ng-disabled = "$root.isLoading.createIsolation" ng-click = "ICMC.createIsolation()" - ) {{$root.isLoading.createIsolation ? 'Isolating...' : 'Enter Isolation'}} + ) {{$root.isLoading.createIsolation ? 'Isolating...' : 'Isolate Branch'}} From d55efb4225bba2a2150c80637dee97c61c182973 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 24 Aug 2016 15:17:05 -0700 Subject: [PATCH 036/577] Fixed tests, added 5 second timer and top bar UI for cmd page. Also now open cmd page by default when container transitions to running --- .../toolbar/webViewToolbarView.jade | 4 +- .../components/ahaGuide/AhaGuideController.js | 52 ++++++++++++++----- .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../components/setUpRepositoryGuideView.jade | 4 +- .../buildLogs/buildLogsController.js | 3 +- .../setupMirrorServerModalController.js | 12 +++++ .../setupServerModalController.js | 12 +++++ .../setupServerModalView.jade | 2 +- client/services/serviceAhaGuide.js | 9 +++- .../setupServerModalController.unit.js | 2 +- .../buildLogs/buildLogsController.unit.js | 1 + .../newContainerModalController.unit.js | 2 +- 12 files changed, 82 insertions(+), 23 deletions(-) diff --git a/client/directives/activePanel/toolbar/webViewToolbarView.jade b/client/directives/activePanel/toolbar/webViewToolbarView.jade index 51e0af583..c76cb76f0 100644 --- a/client/directives/activePanel/toolbar/webViewToolbarView.jade +++ b/client/directives/activePanel/toolbar/webViewToolbarView.jade @@ -1,8 +1,8 @@ small.small.sans-serif.label-url.hidden-xxxs URL: a.p.monospace.text-overflow( - href = "//praful-staging-codenow.runnableapp.com" + ng-href = "http://{{SMC.state.instance.getContainerHostname()}}" target = "_blank" -) praful-staging-codenow.runnableapp.com +) {{ SMC.state.instance.getContainerHostname() }} svg.iconnables.icons-external use( xlink:href = "#icons-link-external" diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index d01579485..aeb717dec 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -7,12 +7,11 @@ require('app') function AhaGuideController( $scope, $rootScope, + $timeout, serviceAhaGuide ) { var AHA = this; - - var previousTab; var buildLogListener; var tabListener = $scope.$on('updatedTab', function(event, tabName) { @@ -30,23 +29,18 @@ function AhaGuideController( alertListener(); buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { - console.log(buildStatus); - if (buildStatus === 'failed' || buildStatus === 'buildFailed') { - AHA.state.showError = true; - } else if (buildStatus === 'success') { - updateCaption(buildStatus); - buildLogListener(); - } - updateBuildStatus(buildStatus); + handleBuildUpdate(buildStatus); }); } }); AHA.state = { + hideMenu: false, + isBuildSuccessful: false, mainStep: $scope.stepIndex, subStep: $scope.subStep, subStepIndex: $scope.subStepIndex, - hideMenu: false + showError: false }; // get steps from service @@ -74,9 +68,43 @@ function AhaGuideController( AHA.state.className = currentMilestone.subSteps[status].className; } + function handleBuildUpdate(update) { // building, running, starting + console.log(update); + var buildStatus = update.status; + AHA.state.containerHostname = update.containerHostname; + if (buildStatus === 'failed' || buildStatus === 'buildFailed') { + AHA.state.showError = true; + } else if (buildStatus === 'starting') { + addVerificationListeners(); + } + updateBuildStatus(buildStatus); + } + function updateBuildStatus(buildStatus) { AHA.state.buildStatus = buildStatus; - AHA.state.caption = currentMilestone.buildStatus[buildStatus]; + AHA.state.caption = currentMilestone.buildStatus[buildStatus] || AHA.state.caption; + console.log(AHA.state.caption); + } + + function addVerificationListeners() { + if (!$rootScope.doneListener) { + $rootScope.doneListener = $rootScope.$on('close-popovers', function() { + $rootScope.doneListener(); + updateCaption('complete'); + $rootScope.featureFlags.aha1 = false; + $rootScope.featureFlags.aha2 = true; + }) + } + + $timeout(function() { + if (AHA.state.showError === false && !AHA.state.isBuildSuccesful) { + AHA.state.isBuildSuccessful = true; + buildLogListener(); + updateCaption('success'); + } else { + AHA.state.isBuildSuccessful = false; + } + }, 5000); } // we need to unregister this animated panel listener if it exists diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 83d514bc8..4eb0f6b69 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -20,7 +20,7 @@ function ahaGuideDirective( subStepIndex: '=' }, link: function ($scope, elem, attrs) { - console.log($scope, elem, attrs); + // console.log($scope, elem, attrs); } }; } diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 8117e3d0c..3f8bc88a9 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -12,11 +12,11 @@ ng-if = "!AHA.state.showError" ) use( - ng-if = "$root.featureFlags.aha1 && AHA.state.subStep !== 'success'" + ng-if = "$root.featureFlags.aha1 && AHA.state.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AHA.state.subStep === 'success'" + ng-if = "AHA.state.subStep === 'complete'" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( diff --git a/client/directives/components/buildLogs/buildLogsController.js b/client/directives/components/buildLogs/buildLogsController.js index 7e55eae2f..6e03c0a11 100644 --- a/client/directives/components/buildLogs/buildLogsController.js +++ b/client/directives/components/buildLogs/buildLogsController.js @@ -39,7 +39,6 @@ function BuildLogsController( BLC.buildStatus = 'success'; BLC.buildLogsRunning = false; } - $rootScope.$broadcast('buildStatusUpdated', BLC.buildStatus); } var failCount = 0; @@ -50,7 +49,7 @@ function BuildLogsController( stream.end(); } if (BLC.instance) { - BLC.instance.off('update', handleUpdate); + // BLC.instance.off('update', handleUpdate); } BLC.buildLogsRunning = false; } diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 7ef90175e..6986d76ef 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -182,6 +182,18 @@ function SetupMirrorServerModalController( if (instance) { SMC.instance = instance; SMC.state.instance = instance; + SMC.state.instance.on('update', function() { + var buildStatus = SMC.state.instance.status(); + var containerHostname = SMC.state.instance.getContainerHostname(); + $rootScope.$broadcast('buildStatusUpdated', { + status: buildStatus, + containerHostname: containerHostname + }); + if (buildStatus === 'running') { + console.log(SMC.page); + SMC.page = 'run'; + } + }); // Reset the opts, in the same way as `EditServerModalController` SMC.state.opts = { env: keypather.get(instance, 'attrs.env') || [], diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index cadb5ab28..f697c5bfe 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -264,6 +264,18 @@ function SetupServerModalController( if (instance) { SMC.instance = instance; SMC.state.instance = instance; + SMC.state.instance.on('update', function() { + var buildStatus = SMC.state.instance.status(); + var containerHostname = SMC.state.instance.getContainerHostname(); + $rootScope.$broadcast('buildStatusUpdated', { + status: buildStatus, + containerHostname: containerHostname + }); + if (buildStatus === 'running') { + console.log(SMC.page); + SMC.page = 'run'; + } + }); // Reset the opts, in the same way as `EditServerModalController` SMC.state.opts = { env: keypather.get(instance, 'attrs.env') || [], diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade index 0bb61249b..5228e1817 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade @@ -1,7 +1,7 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-if = "!SMC.state.advanced" + ng-if = "SMC.state.advanced !== 'blankDockerfile'" step-index = 1 sub-step = "repository" sub-step-index = 4 diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index c84a7f4c9..ef7aacd59 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -123,11 +123,18 @@ function serviceAhaGuide( caption: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', className: 'aha-meter-90', step: 8 + }, + complete: { + caption: 'Add more containers if your project requires it. Once you\'re done, head to to your containers to start adding branches.', + className: 'aha-meter-100', + step: 9 } }, buildStatus: { - running: 'Verifying configuration... ', + building: 'Now building. Build time varies depending on your configuration', + running: 'Verifying configuration... ', + starting: 'Now building. Build time varies depending on your configuration', success: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', faileda: 'Your container failed to run. Inspect your CMD logs for more information.', failed: 'Your build failed. Inspect your build logs for more information.' diff --git a/test/unit/controllers/setupServerModalController.unit.js b/test/unit/controllers/setupServerModalController.unit.js index 0b22b1d77..38f6f43b7 100644 --- a/test/unit/controllers/setupServerModalController.unit.js +++ b/test/unit/controllers/setupServerModalController.unit.js @@ -206,7 +206,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { $scope = $rootScope.$new(); SMC = $controller('SetupServerModalController', { $scope: $scope, - dockerfileType: {}, + dockerfileType: false, instanceName: opts.instanceName || instanceName, repo: opts.repo || repo, build: opts.build || newBuild, diff --git a/test/unit/directives/components/buildLogs/buildLogsController.unit.js b/test/unit/directives/components/buildLogs/buildLogsController.unit.js index a9653c589..e46c60522 100644 --- a/test/unit/directives/components/buildLogs/buildLogsController.unit.js +++ b/test/unit/directives/components/buildLogs/buildLogsController.unit.js @@ -27,6 +27,7 @@ describe('BuildLogsController'.bold.underline.blue, function () { on: sinon.spy(), off: sinon.spy(), id: sinon.stub().returns('instanceID'), + getContainerHostname: sinon.spy(), attrs: { contextVersion: { _id: 'ctxId', diff --git a/test/unit/directives/modals/newContainerModalController.unit.js b/test/unit/directives/modals/newContainerModalController.unit.js index 5847b098c..e6597ba77 100644 --- a/test/unit/directives/modals/newContainerModalController.unit.js +++ b/test/unit/directives/modals/newContainerModalController.unit.js @@ -183,7 +183,7 @@ describe('NewContainerModalController'.bold.underline.blue, function () { it('should create a build and fetch the branch', function () { var repo = {}; var dockerfile = null; - var configurationMethod = 'new'; + var configurationMethod = false; sinon.stub(NCMC, 'newRepositoryContainer'); NCMC.createBuildAndGoToNewRepoModal(instanceName, repo, dockerfile, configurationMethod); From 8ecd0c5c2c0521e94c0a4a5d53d1aee17f20ab47 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 24 Aug 2016 15:39:38 -0700 Subject: [PATCH 037/577] Removed bad flag on ng-if --- client/directives/environment/environmentBody/viewCardGrid.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index 314ee51d2..cc1b8a98c 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -10,7 +10,7 @@ //- empty state .card.gray.disabled.load.empty( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length" //&& !$root.featureFlags.aha" + ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length" ) svg.iconnables( ng-click = "EC.triggerModal.newContainer()" From d6620ace505c41b35f413158c4238223258b01e0 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 25 Aug 2016 10:30:29 -0700 Subject: [PATCH 038/577] Added localStorage for aha step completion and aha-guide sidebar directive --- .../components/ahaGuide/AhaGuideController.js | 24 +++++++-- .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../components/ahaGuide/ahaGuideView.jade | 7 ++- .../components/ahaGuide/ahaPopoverView.jade | 9 ++-- .../ahaGuide/ahaSidebarController.js | 13 +++++ .../ahaGuide/ahaSidebarDirective.js | 21 ++++++++ .../buildLogs/buildLogsController.js | 2 +- .../environment/environmentView.jade | 2 +- .../setupMirrorServerModalController.js | 1 - client/services/serviceAhaGuide.js | 53 +++++++++++++++++-- 10 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 client/directives/components/ahaGuide/ahaSidebarController.js create mode 100644 client/directives/components/ahaGuide/ahaSidebarDirective.js diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index aeb717dec..53c80d83a 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -61,6 +61,7 @@ function AhaGuideController( } if (status === 'dockLoaded') { $rootScope.animatedPanelListener(); + serviceAhaGuide.isComplete('aha0', true); } AHA.state.subStep = status; AHA.state.subStepIndex = currentMilestone.subSteps[status].step; @@ -68,14 +69,15 @@ function AhaGuideController( AHA.state.className = currentMilestone.subSteps[status].className; } - function handleBuildUpdate(update) { // building, running, starting + function handleBuildUpdate(update) { console.log(update); var buildStatus = update.status; AHA.state.containerHostname = update.containerHostname; if (buildStatus === 'failed' || buildStatus === 'buildFailed') { AHA.state.showError = true; } else if (buildStatus === 'starting') { - addVerificationListeners(); + AHA.state.showError = false; + addVerificationListeners(AHA.state.containerHostname); } updateBuildStatus(buildStatus); } @@ -86,21 +88,33 @@ function AhaGuideController( console.log(AHA.state.caption); } - function addVerificationListeners() { + function addVerificationListeners(containerHostname) { + var url = 'http://' + containerHostname; if (!$rootScope.doneListener) { $rootScope.doneListener = $rootScope.$on('close-popovers', function() { $rootScope.doneListener(); updateCaption('complete'); $rootScope.featureFlags.aha1 = false; $rootScope.featureFlags.aha2 = true; - }) + }); } $timeout(function() { + if (serviceAhaGuide.pendingRequest) { + return; + } if (AHA.state.showError === false && !AHA.state.isBuildSuccesful) { AHA.state.isBuildSuccessful = true; buildLogListener(); - updateCaption('success'); + serviceAhaGuide.checkContainerStatus(url) + .then(function(isRunning) { + if (isRunning) { + updateCaption('success'); + serviceAhaGuide.isComplete('aha1', true); + } else { + AHA.state.showBindingMSG = true; + } + }); } else { AHA.state.isBuildSuccessful = false; } diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 4eb0f6b69..a7d40241b 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -7,7 +7,7 @@ require('app') * @ngInject */ function ahaGuideDirective( - $window + ) { return { restrict: 'A', diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 4d1a73974..4352b483b 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -6,8 +6,6 @@ .grid-block.align-center( ng-if = "AHA.state.mainStep === 1" ng-include = "'setUpRepositoryGuideView'" - ng-mouseenter = "state.showControls = true" - ng-mouseleave = "state.showControls = false" ) .grid-block.align-center( @@ -20,6 +18,11 @@ ng-include = "'setUpRunnabotGuideView'" ) +.grid-block.align-center( + ng-if = "state.addRepo" + ng-include = "'setUpRepositoryGuideView'" +) + button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" ng-if = "!AHA.state.hideMenu" diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 13702aa13..54e8b1cb0 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -1,8 +1,11 @@ .arrow.white .popover-content .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-include = "'ahaGuideView'" - ng-init = "state.showStep = 1" + aha-guide-directive + step-index = 1 + sub-step = 'complete' ) .grid-block.justify-right.popover-footer - button.grid-block.shrink.btn.btn-sm.green Got It + button.grid-block.shrink.btn.btn-sm.green( + ng-click = "$root.featureFlags.aha2 = false" +) Got It diff --git a/client/directives/components/ahaGuide/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebarController.js new file mode 100644 index 000000000..fb9060f84 --- /dev/null +++ b/client/directives/components/ahaGuide/ahaSidebarController.js @@ -0,0 +1,13 @@ + +'use strict'; + +require('app') + .controller('AhaSidebarController', AhaSidebarController); + +function AhaSidebarController( + $scope, + $rootScope, + serviceAhaGuide +) { + console.log('instantiated'); +} diff --git a/client/directives/components/ahaGuide/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebarDirective.js new file mode 100644 index 000000000..a98c84905 --- /dev/null +++ b/client/directives/components/ahaGuide/ahaSidebarDirective.js @@ -0,0 +1,21 @@ +'use strict'; + +require('app') + .directive('ahaSidebarDirective', ahaSidebarDirective); + +/** + * @ngInject + */ +function ahaSidebarDirective( + +) { + return { + restrict: 'A', + templateUrl: 'ahaSidebarView', + controller: 'AhaSidebarController', + controllerAs: 'ASA', + link: function ($scope, elem, attrs) { + console.log($scope, elem, attrs); + } + }; +} diff --git a/client/directives/components/buildLogs/buildLogsController.js b/client/directives/components/buildLogs/buildLogsController.js index 6e03c0a11..f99d58e65 100644 --- a/client/directives/components/buildLogs/buildLogsController.js +++ b/client/directives/components/buildLogs/buildLogsController.js @@ -49,7 +49,7 @@ function BuildLogsController( stream.end(); } if (BLC.instance) { - // BLC.instance.off('update', handleUpdate); + BLC.instance.off('update', handleUpdate); } BLC.buildLogsRunning = false; } diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index ec53c86b0..f59691ef9 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -124,6 +124,6 @@ | to help you set up your stack. .grid-block.vertical.aha-sidebar.padding-sm.js-animate( - ng-include = "'ahaSidebarView'" + aha-sidebar-directive ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar" ) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 6986d76ef..0680b3616 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -190,7 +190,6 @@ function SetupMirrorServerModalController( containerHostname: containerHostname }); if (buildStatus === 'running') { - console.log(SMC.page); SMC.page = 'run'; } }); diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index ef7aacd59..cbac46fb3 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -4,9 +4,26 @@ require('app') .factory('serviceAhaGuide', serviceAhaGuide); function serviceAhaGuide( - + $http, + $localStorage, + keypather ) { + var ahaService = this; + var ahaMilestonesComplete; + + if (!keypather.get($localStorage, 'ahaMilestonesComplete')) { + ahaMilestonesComplete = { + aha0: false, + aha1: false, + aha2: false, + aha3: false + }; + keypather.set($localStorage, 'ahaMilestonesComplete', ahaMilestonesComplete); + } else { + ahaMilestonesComplete = keypather.get($localStorage, 'ahaMilestonesComplete'); + } + var _steps = [ { title: 'Create your Sandbox', @@ -125,7 +142,7 @@ function serviceAhaGuide( step: 8 }, complete: { - caption: 'Add more containers if your project requires it. Once you\'re done, head to to your containers to start adding branches.', + caption: 'Add more containers if your project requires it. Once you\'re done, head to your containers to start adding branches.', className: 'aha-meter-100', step: 9 } @@ -146,7 +163,37 @@ function serviceAhaGuide( return _steps; } + function checkContainerStatus(url) { + ahaService.pendingRequest = true; + return $http({ + method: 'GET', + url: url + }) + .then(function(data) { + ahaService.pendingRequest = false; + if (data.statusCode >= 200 && data.statusCode < 300) { + return true; + } + return false; + }) + .catch(function(err) { + console.log(err); + }); + } + + function isComplete(step, bool) { + if (bool === true) { + keypather.set($localStorage, 'ahaMilestonesComplete.' + step, true); + keypather.set($localStorage, 'hasDismissedTrialNotification.' + currentOrg.github.attrs.id, true); + ahaMilestonesComplete[step] = bool; + } else { + return keypather.get($localStorage, 'ahaMilestonesComplete.' + step); + } + } + return { - getSteps: getSteps + getSteps: getSteps, + checkContainerStatus: checkContainerStatus, + isComplete: isComplete }; } From 7699152eb61eeff8b2927b778442d8b360512679 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 25 Aug 2016 10:48:41 -0700 Subject: [PATCH 039/577] Addressed PR comments --- .../modals/modalSetupServer/setupServerModalController.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index aac22740b..48f6844da 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -33,6 +33,7 @@ function SetupServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.helpCards = helpCards; + var blankDockerfile = false; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { @@ -111,16 +112,14 @@ function SetupServerModalController( // if the blank docker file is chosen, we need to load it because it is already available if (dockerfileType === 'blankDockerfile') { - var isBlankDockerfile = dockerfileType; + blankDockerfile = dockerfileType; SMC.openDockerfile({contextVersion: build.contextVersion}, SMC.openItems); - } else { - var isBlankDockerfile = false; } // If a repo is passed into this controller, select that repo angular.extend(SMC.state, { acv: build.contextVersion.getMainAppCodeVersion(), - advanced: isBlankDockerfile, + advanced: blankDockerfile, branch: masterBranch, build: build, contextVersion: build.contextVersion, From 9cc164b199e88943dce2148a1563784da1d49f5c Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 25 Aug 2016 13:49:47 -0700 Subject: [PATCH 040/577] remove runnabot from aha sidebar --- .../components/ahaGuide/ahaSidebarView.jade | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 2123f5f67..ff1376284 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -56,7 +56,7 @@ ) svg.iconnables use( - ng-if = "$root.featureFlags.aha1 && (!$root.featureFlags.aha2 || !$root.featureFlags.aha3)" + ng-if = "!$root.featureFlags.aha2 && !$root.featureFlags.aha3" xlink:href = "#icons-octicons-repo" ) use( @@ -88,21 +88,3 @@ .grid-block.vertical.aha-text p.p.strong Add your First Branch p.small Your branches will update on every commit you make. - - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha2}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{'aha-meter-50': $root.featureFlags.aha3}" - ) - svg.iconnables - use( - xlink:href = "#icons-runnabot" - ) - //- if complete - //- use( - //- xlink:href = "#icons-check" - //- ) - .grid-block.vertical.aha-text - p.p.strong Set Up Runnabot - p.small Receive notifications on pull requests when your container is ready. From f03b28a2bab16699c4b50796b44015dac4be3f08 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 25 Aug 2016 13:51:39 -0700 Subject: [PATCH 041/577] add aha completed message --- .../components/ahaGuide/ahaSidebarView.jade | 13 ++++++++++++- .../branchMenuPopover/branchMenuPopoverView.jade | 12 ++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index ff1376284..85edf0e5f 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,11 +1,12 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( ng-click = "$root.featureFlags.ahaSidebar = false" - ng-if = "!$root.featureFlags.ahaOverview" + ng-if = "!$root.featureFlags.ahaOverview && !$root.featureFlags.aha3" ) use( xlink:href = "#icons-close" ) + .grid-block.vertical.shrink.justify-center.text-center.aha-overview( ng-if = "$root.featureFlags.ahaOverview" ) @@ -17,6 +18,16 @@ $root.featureFlags.ahaSidebar = false;\ " ) Get Started + +.grid-block.vertical.shrink.justify-center.text-center.aha-overview( + ng-if = "$root.featureFlags.aha3" +) + .grid-content.strong Well done! + | You’ve finished setting up. Give yourself a pat on the back! + button.grid-content.btn.btn-sm.green( + ng-click = "$root.featureFlags.ahaRunnabot = true" + ) I Feel Great About This + .grid-block.vertical .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 431197dc2..c9401ef47 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -122,13 +122,21 @@ .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( ng-include = "'spinner'" ) - li.list-item.popover-list-item SAN-4377-Cant-add-files + li.list-item.popover-list-item( + ng-click = "$root.featureFlags.ahaSidebar = true" + ) SAN-4377-Cant-add-files + //- ng-click = "$root.featureFlags.aha2Complete = true" button.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-add use( xlink:href = "#icons-add" ) - li.list-item.popover-list-item SAN-4342-auto-isolation-setup + li.list-item.popover-list-item( + ng-click = "\ + $root.featureFlags.ahaSidebar = true;\ + $root.featureFlags.ahaComplete = true;\ + " + ) SAN-4342-auto-isolation-setup button.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-add use( From 292bd21e287d917bebab0fa184d0ae15f3e21932 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 24 Aug 2016 14:09:56 -0700 Subject: [PATCH 042/577] Pass intercom app id in environment for Grunt build instead of hardcoded. --- Gruntfile.js | 1 + client/services/serviceEventTracking.js | 9 ++------- layout.jade | 11 +++-------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 81fed5af8..e3b261c17 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -287,6 +287,7 @@ module.exports = function(grunt) { var locals = { version: version, env: require('./client/config/json/environment.json').environment, + intercom_app_id: process.env.INTERCOM_APP_ID || 'xs5g95pd', commitHash: require('./client/config/json/commit.json').commitHash, commitTime: require('./client/config/json/commit.json').commitTime, apiHost: require('./client/config/json/api.json').host diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 90507ea67..b21d3934e 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -25,14 +25,9 @@ function EventTracking( $stateParams, $window, assign, - keypather, - configEnvironment + keypather ) { - if (configEnvironment === 'production') { - INTERCOM_APP_ID = 'wqzm3rju'; // production ID - } else { - INTERCOM_APP_ID = 'xs5g95pd'; // test ID - } + INTERCOM_APP_ID = process.env.INTERCOM_APP_ID || 'xs5g95pd'; _keypather = keypather; _$location = $location; diff --git a/layout.jade b/layout.jade index 1138b2ac8..fe655b0d5 100644 --- a/layout.jade +++ b/layout.jade @@ -204,11 +204,6 @@ html( ) Dismiss //- Intercom - if env === 'production' - script( - src = "https://widget.intercom.io/widget/wqzm3rju" - ) - else - script( - src = "https://widget.intercom.io/widget/xs5g95pd" - ) + script( + src = "https://widget.intercom.io/widget/" + intercom_app_id + ) From 320ea25ce56cec76d86d6472b72c8fb74badc8e1 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 24 Aug 2016 14:28:09 -0700 Subject: [PATCH 043/577] Fix variable to camelCase. --- Gruntfile.js | 2 +- layout.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index e3b261c17..0f217df60 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -287,7 +287,7 @@ module.exports = function(grunt) { var locals = { version: version, env: require('./client/config/json/environment.json').environment, - intercom_app_id: process.env.INTERCOM_APP_ID || 'xs5g95pd', + intercomAppId: process.env.INTERCOM_APP_ID || 'xs5g95pd', commitHash: require('./client/config/json/commit.json').commitHash, commitTime: require('./client/config/json/commit.json').commitTime, apiHost: require('./client/config/json/api.json').host diff --git a/layout.jade b/layout.jade index fe655b0d5..2920c5351 100644 --- a/layout.jade +++ b/layout.jade @@ -205,5 +205,5 @@ html( //- Intercom script( - src = "https://widget.intercom.io/widget/" + intercom_app_id + src = "https://widget.intercom.io/widget/" + intercomAppId ) From 021579b8766c3bec62f435cde5bdc2077d3482c9 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 24 Aug 2016 15:56:19 -0700 Subject: [PATCH 044/577] Source config from file as process.env is unavailable. --- Gruntfile.js | 5 +++-- client/services/configs/serviceIntercomAppId.js | 4 ++++ client/services/serviceEventTracking.js | 7 +++---- 3 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 client/services/configs/serviceIntercomAppId.js diff --git a/Gruntfile.js b/Gruntfile.js index 0f217df60..afbb8c1ca 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -287,7 +287,7 @@ module.exports = function(grunt) { var locals = { version: version, env: require('./client/config/json/environment.json').environment, - intercomAppId: process.env.INTERCOM_APP_ID || 'xs5g95pd', + intercomAppId: require('./client/config/json/environment.json').intercomAppId, commitHash: require('./client/config/json/commit.json').commitHash, commitTime: require('./client/config/json/commit.json').commitTime, apiHost: require('./client/config/json/api.json').host @@ -478,7 +478,8 @@ module.exports = function(grunt) { }, function (cb) { var configObj = { - environment: environment || process.env.NODE_ENV || 'development' + environment: environment || process.env.NODE_ENV || 'development', + intercomAppId: process.env.INTERCOM_APP_ID || 'xs5g95pd' }; var configJSON = JSON.stringify(configObj); fs.writeFile(path.join(clientPath, 'config', 'json', 'environment.json'), configJSON, function () { diff --git a/client/services/configs/serviceIntercomAppId.js b/client/services/configs/serviceIntercomAppId.js new file mode 100644 index 000000000..234b58cf7 --- /dev/null +++ b/client/services/configs/serviceIntercomAppId.js @@ -0,0 +1,4 @@ +'use strict'; + +require('app') + .value('intercomAppId', require('config/environment').intercomAppId); diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index b21d3934e..bceb4e086 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -11,7 +11,6 @@ require('app') var User = require('@runnable/api-client/lib/models/user'); var _keypather; var _$location; -var INTERCOM_APP_ID; /** * EventTracking @@ -25,9 +24,9 @@ function EventTracking( $stateParams, $window, assign, - keypather + keypather, + intercomAppId ) { - INTERCOM_APP_ID = process.env.INTERCOM_APP_ID || 'xs5g95pd'; _keypather = keypather; _$location = $location; @@ -122,7 +121,7 @@ EventTracking.prototype.boot = function (user, opts) { name: user.oauthName(), email: user.attrs.email, created_at: new Date(user.attrs.created) / 1000 || 0, - app_id: INTERCOM_APP_ID + app_id: intercomAppId }; if (opts.orgName) { data.company = { From dcd669d5406b6405e23200082f261c3efa0aa1f3 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 24 Aug 2016 16:02:46 -0700 Subject: [PATCH 045/577] Revert setting of variable as done before. --- client/services/serviceEventTracking.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index bceb4e086..12149d48c 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -11,6 +11,7 @@ require('app') var User = require('@runnable/api-client/lib/models/user'); var _keypather; var _$location; +var INTERCOM_APP_ID; /** * EventTracking @@ -27,6 +28,7 @@ function EventTracking( keypather, intercomAppId ) { + INTERCOM_APP_ID = intercomAppId; _keypather = keypather; _$location = $location; @@ -121,7 +123,7 @@ EventTracking.prototype.boot = function (user, opts) { name: user.oauthName(), email: user.attrs.email, created_at: new Date(user.attrs.created) / 1000 || 0, - app_id: intercomAppId + app_id: INTERCOM_APP_ID }; if (opts.orgName) { data.company = { From 178f9510be918194259e520a11cf3224287100d6 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 25 Aug 2016 15:22:05 -0700 Subject: [PATCH 046/577] add step for inviting runnabot --- client/assets/images/runnabot-comment.png | Bin 0 -> 16161 bytes .../styles/scss/components/aha-sidebar.scss | 15 ++ .../components/ahaGuide/ahaSidebarView.jade | 214 ++++++++++-------- 3 files changed, 139 insertions(+), 90 deletions(-) create mode 100644 client/assets/images/runnabot-comment.png diff --git a/client/assets/images/runnabot-comment.png b/client/assets/images/runnabot-comment.png new file mode 100644 index 0000000000000000000000000000000000000000..41fcb1f2a560b1ae70d1854c265a24d4be45915c GIT binary patch literal 16161 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 V`#pwlAXDD~c^MVy;@2jD{|i7mxi0_! literal 0 HcmV?d00001 diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index e6db79d31..f442afcdc 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -83,4 +83,19 @@ margin-top: 15px; } } + + .aha-runnabot { + + .grid-content { + margin-top: 45px; + } + + .img { + align-self: center; + } + + .link { + margin-top: 15px; + } + } } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 85edf0e5f..ae951e450 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,101 +1,135 @@ -.grid-block.shrink.align-center.justify-right - svg.iconnables.icons-close( - ng-click = "$root.featureFlags.ahaSidebar = false" - ng-if = "!$root.featureFlags.ahaOverview && !$root.featureFlags.aha3" +animated-panel-container + animated-panel( + default = "true" + name = "ahaSteps" ) - use( - xlink:href = "#icons-close" + .grid-block.shrink.align-center.justify-right( + ng-if = "!$root.featureFlags.ahaOverview && !$root.featureFlags.aha3" ) + svg.iconnables.icons-close( + ng-click = "$root.featureFlags.ahaSidebar = false" + ) + use( + xlink:href = "#icons-close" + ) -.grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.ahaOverview" -) - .grid-content.strong Welcome to your Sandbox! 👋 - | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! - button.grid-content.btn.btn-sm.green( - ng-click = "\ - $root.featureFlags.ahaOverview = false;\ - $root.featureFlags.ahaSidebar = false;\ - " - ) Get Started - -.grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.aha3" -) - .grid-content.strong Well done! - | You’ve finished setting up. Give yourself a pat on the back! - button.grid-content.btn.btn-sm.green( - ng-click = "$root.featureFlags.ahaRunnabot = true" - ) I Feel Great About This + .grid-block.vertical.shrink.justify-center.text-center.aha-overview( + ng-if = "$root.featureFlags.ahaOverview" + ) + .grid-content.strong Welcome to your Sandbox! 👋 + | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! + button.grid-content.btn.btn-sm.green( + ng-click = "\ + $root.featureFlags.ahaOverview = false;\ + $root.featureFlags.ahaSidebar = false;\ + " + ) Get Started -.grid-block.vertical - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-meter-50': $root.featureFlags.aha0,\ - 'aha-meter-100': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3\ - }" + .grid-block.vertical.shrink.justify-center.text-center.aha-overview( + ng-if = "$root.featureFlags.aha3" ) - svg.iconnables - use( - ng-if = "$root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3" - xlink:href = "#icons-check" + .grid-content.strong Well done! + | You’ve finished setting up. Give yourself a pat on the back! + button.grid-content.btn.btn-sm.green( + ng-click = "goToPanel('runnabotStep')" + ) I Feel Great About This + + .grid-block.vertical + .grid-block.shrink.align-center.padding-sm.aha-guide( + ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" + ) + .grid-block.shrink.aha-meter( + ng-class = "{\ + 'aha-meter-50': $root.featureFlags.aha0,\ + 'aha-meter-100': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3\ + }" ) - .grid-block.vertical.aha-text - p.p.strong Create your Sandbox - p.small This is the first step to success. + svg.iconnables + use( + ng-if = "$root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3" + xlink:href = "#icons-check" + ) + .grid-block.vertical.aha-text + p.p.strong Create your Sandbox + p.small This is the first step to success. - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-error': state.showError,\ - 'aha-meter-10': state.showSubStep === 0,\ - 'aha-meter-20': state.showSubStep === 1,\ - 'aha-meter-30': state.showSubStep === 2,\ - 'aha-meter-40': state.showSubStep === 3,\ - 'aha-meter-50': state.showSubStep === 4,\ - 'aha-meter-60': state.showSubStep === 5,\ - 'aha-meter-70': state.showSubStep === 6,\ - 'aha-meter-80': state.showSubStep === 7,\ - 'aha-meter-90': state.showSubStep === 8,\ - 'aha-meter-100': $root.featureFlags.aha2 || $root.featureFlags.aha3\ - }" - ) - svg.iconnables - use( - ng-if = "!$root.featureFlags.aha2 && !$root.featureFlags.aha3" - xlink:href = "#icons-octicons-repo" + .grid-block.shrink.align-center.padding-sm.aha-guide( + ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" + ) + .grid-block.shrink.aha-meter( + ng-class = "{\ + 'aha-error': state.showError,\ + 'aha-meter-10': state.showSubStep === 0,\ + 'aha-meter-20': state.showSubStep === 1,\ + 'aha-meter-30': state.showSubStep === 2,\ + 'aha-meter-40': state.showSubStep === 3,\ + 'aha-meter-50': state.showSubStep === 4,\ + 'aha-meter-60': state.showSubStep === 5,\ + 'aha-meter-70': state.showSubStep === 6,\ + 'aha-meter-80': state.showSubStep === 7,\ + 'aha-meter-90': state.showSubStep === 8,\ + 'aha-meter-100': $root.featureFlags.aha2 || $root.featureFlags.aha3\ + }" ) - use( - ng-if = "$root.featureFlags.aha2 || $root.featureFlags.aha3" - xlink:href = "#icons-check" + svg.iconnables + use( + ng-if = "!$root.featureFlags.aha2 && !$root.featureFlags.aha3" + xlink:href = "#icons-octicons-repo" + ) + use( + ng-if = "$root.featureFlags.aha2 || $root.featureFlags.aha3" + xlink:href = "#icons-check" + ) + .grid-block.vertical.aha-text + p.p.strong Add your First Repository + p.small Configure your project and get it running! + + .grid-block.shrink.align-center.padding-sm.aha-guide( + ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha3}" + ) + .grid-block.shrink.aha-meter( + ng-class = "{\ + 'aha-meter-33': $root.featureFlags.aha2,\ + 'aha-meter-100': $root.featureFlags.aha3\ + }" ) - .grid-block.vertical.aha-text - p.p.strong Add your First Repository - p.small Configure your project and get it running! + svg.iconnables + use( + ng-if = "!$root.featureFlags.aha3" + xlink:href = "#icons-octicons-branch" + ) + use( + ng-if = "$root.featureFlags.aha3" + xlink:href = "#icons-check" + ) + .grid-block.vertical.aha-text + p.p.strong Add your First Branch + p.small Your branches will update on every commit you make. - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha3}" + animated-panel( + name = "runnabotStep" ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-meter-33': $root.featureFlags.aha2,\ - 'aha-meter-100': $root.featureFlags.aha3\ - }" - ) - svg.iconnables - use( - ng-if = "!$root.featureFlags.aha3" - xlink:href = "#icons-octicons-branch" - ) - use( - ng-if = "$root.featureFlags.aha3" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Add your First Branch - p.small Your branches will update on every commit you make. + .grid-block.vertical.shrink.justify-center.align-center.text-center.aha-runnabot + .grid-content + .strong One more thing… + | Now you can get super helpful comments + br + | on your pull requests. Like this one: + img.grid-content.img( + height = "116" + src = "/build/images/runnabot-comment.png" + width = "328" + ) + .grid-content Just invite Runnabot to your GitHub org. + br + | This may increase your GitHub bill. + a.link Details + button.grid-content.btn.btn-sm.green( + ng-click = "\ + $root.featureFlags.ahaOverview = false;\ + $root.featureFlags.ahaSidebar = false;\ + " + ) Invite Runnabot + a.link.small.text-gray( + ng-click = "$root.featureFlags.ahaSidebar = false" + ) Not now, thanks From a49a476d14e67debee6f83785490b3fff3556971 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 25 Aug 2016 15:55:19 -0700 Subject: [PATCH 047/577] Added sift-science tracking to angular. --- Gruntfile.js | 1 + .../services/configs/siftApiConfigService.js | 4 ++++ client/services/serviceEventTracking.js | 19 ++++++++++++++++++- layout.jade | 16 ++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100755 client/services/configs/siftApiConfigService.js diff --git a/Gruntfile.js b/Gruntfile.js index 81fed5af8..7cccd6636 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -438,6 +438,7 @@ module.exports = function(grunt) { configObj.userContentDomain = process.env.USER_CONTENT_DOMAIN || 'runnableapp.com'; configObj.corporateUrl = process.env.MARKETING_URL || 'https://runnable.io'; configObj.stripeToken = process.env.STRIPE_TOKEN || 'pk_test_sHr5tQaPtgwiE2cpW6dQkzi8'; + configObj.siftApiKey = process.env.SIFT_API_KEY || 'eea9746dff'; if (configObj.host.charAt(configObj.host.length - 1) === '/') { configObj.host = configObj.host.substr(0, configObj.host.length - 1); diff --git a/client/services/configs/siftApiConfigService.js b/client/services/configs/siftApiConfigService.js new file mode 100755 index 000000000..9e015a6b0 --- /dev/null +++ b/client/services/configs/siftApiConfigService.js @@ -0,0 +1,4 @@ +'use strict'; + +require('app') + .value('siftApiConfig', require('config/api').siftApiKey); diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 90507ea67..214031c0a 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -9,9 +9,11 @@ require('app') .service('eventTracking', EventTracking); var User = require('@runnable/api-client/lib/models/user'); +var UUID = require('node-uuid'); var _keypather; var _$location; var INTERCOM_APP_ID; +var SIFT_API_KEY; /** * EventTracking @@ -26,8 +28,11 @@ function EventTracking( $window, assign, keypather, - configEnvironment + configEnvironment, + siftApiConfig ) { + SIFT_API_KEY = siftApiConfig; + if (configEnvironment === 'production') { INTERCOM_APP_ID = 'wqzm3rju'; // production ID } else { @@ -115,6 +120,18 @@ EventTracking.prototype.boot = function (user, opts) { if (user.attrs._beingModerated) { user = new User(user.attrs._beingModerated, { noStore: true }); } else { + var session = window.sessionStorage.getItem('sessionId'); + if (!session) { + session = UUID.v4(); + window.sessionStorage.setItem('sessionId', session); + } + + var _sift = window._sift = window._sift || []; + _sift.push(['_setAccount', SIFT_API_KEY]); + _sift.push(['_setUserId', user.name]); + _sift.push(['_setSessionId', session]); + _sift.push(['_trackPageview']); + if (this.$window.fbq) { this.$window.fbq('track', 'ViewContent', { action: 'LoggedIn' diff --git a/layout.jade b/layout.jade index 1138b2ac8..52302a6db 100644 --- a/layout.jade +++ b/layout.jade @@ -72,6 +72,22 @@ html( src = "https://d2zah9y47r7bi2.cloudfront.net/releases/current/tracker.js" ) + //- SiftScience + script. + (function() { + function ls() { + var e = document.createElement('script'); + e.src = 'https://cdn.siftscience.com/s.js'; + document.body.appendChild(e); + } + if (window.attachEvent) { + window.attachEvent('onload', ls); + } else { + window.addEventListener('load', ls, false); + } + })(); + + if env === 'production' //- Facebook Events script. From 874f09bb61700923ad9c43e76c2bda8e4b96e0d0 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 25 Aug 2016 16:06:25 -0700 Subject: [PATCH 048/577] Added all exited early handlers and broadcasted event for other aha directives --- client/controllers/controllerApp.js | 6 ++ client/controllers/indexController.js | 1 + .../components/ahaGuide/AhaGuideController.js | 57 ++++++++++++------ .../components/ahaGuide/ahaGuideDirective.js | 3 +- .../ahaGuide/ahaSidebarController.js | 26 ++++++++ .../ahaGuide/ahaSidebarDirective.js | 4 +- .../components/ahaGuide/ahaSidebarView.jade | 8 +-- .../components/setUpRepositoryGuideView.jade | 9 +-- .../viewEnvironmentHeader.jade | 6 +- .../environment/environmentView.jade | 19 +++--- .../chooseOrganizationModalView.jade | 2 +- client/services/serviceAhaGuide.js | 60 +++++++++++++------ client/templates/viewInstance.jade | 2 +- 13 files changed, 138 insertions(+), 65 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index db58e0f89..f5386a216 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -89,6 +89,12 @@ function ControllerApp( $rootScope.featureFlags = featureFlags.flags; $rootScope.resetFeatureFlags = featureFlags.reset; this.featureFlagsChanged = featureFlags.changed; + $rootScope.ahaGuide = { + completedMilestones: $localStorage.completedMilestones, + showSidebar: true, + showOverview: true, + exitedEarly: false + }; $scope.$watch(function () { return errs.errors.length; diff --git a/client/controllers/indexController.js b/client/controllers/indexController.js index e2ccf25cb..98d81e2d2 100755 --- a/client/controllers/indexController.js +++ b/client/controllers/indexController.js @@ -4,6 +4,7 @@ require('app') .controller('IndexController', IndexController); function IndexController( + $localStorage, $ocLazyLoad, $rootScope, $scope, diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 53c80d83a..9cf2246e1 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -12,25 +12,33 @@ function AhaGuideController( ) { var AHA = this; - var buildLogListener; - var tabListener = $scope.$on('updatedTab', function(event, tabName) { - if (AHA.state.subStepIndex > 5) { - tabListener(); - } else { - updateCaption(tabName); - } - }); + $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); var alertListener = $scope.$on('alert', function(event, alert) { // alerts on container creation success if (alert.type === 'success') { updateCaption('logs'); alertListener(); + } + }); - buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { - handleBuildUpdate(buildStatus); - }); + var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { + handleBuildUpdate(buildStatus); + }); + + var exitedEarlyListener = $scope.$on('exitedEarly', function() { + exitedEarlyListener(); + AHA.state.showError = true; + updateCaption('exitedEarly'); + $rootScope.featureFlags.aha1 = false; + }); + + var tabListener = $scope.$on('updatedTab', function(event, tabName) { + if (AHA.state.subStepIndex > 5) { + tabListener(); + } else { + updateCaption(tabName); } }); @@ -40,7 +48,7 @@ function AhaGuideController( mainStep: $scope.stepIndex, subStep: $scope.subStep, subStepIndex: $scope.subStepIndex, - showError: false + showError: $scope.errorState }; // get steps from service @@ -61,7 +69,6 @@ function AhaGuideController( } if (status === 'dockLoaded') { $rootScope.animatedPanelListener(); - serviceAhaGuide.isComplete('aha0', true); } AHA.state.subStep = status; AHA.state.subStepIndex = currentMilestone.subSteps[status].step; @@ -73,7 +80,7 @@ function AhaGuideController( console.log(update); var buildStatus = update.status; AHA.state.containerHostname = update.containerHostname; - if (buildStatus === 'failed' || buildStatus === 'buildFailed') { + if (buildStatus === 'buildFailed') { AHA.state.showError = true; } else if (buildStatus === 'starting') { AHA.state.showError = false; @@ -85,11 +92,9 @@ function AhaGuideController( function updateBuildStatus(buildStatus) { AHA.state.buildStatus = buildStatus; AHA.state.caption = currentMilestone.buildStatus[buildStatus] || AHA.state.caption; - console.log(AHA.state.caption); } function addVerificationListeners(containerHostname) { - var url = 'http://' + containerHostname; if (!$rootScope.doneListener) { $rootScope.doneListener = $rootScope.$on('close-popovers', function() { $rootScope.doneListener(); @@ -99,10 +104,11 @@ function AhaGuideController( }); } + var url = 'http://' + containerHostname; $timeout(function() { if (serviceAhaGuide.pendingRequest) { return; - } + } if (AHA.state.showError === false && !AHA.state.isBuildSuccesful) { AHA.state.isBuildSuccessful = true; buildLogListener(); @@ -110,8 +116,10 @@ function AhaGuideController( .then(function(isRunning) { if (isRunning) { updateCaption('success'); - serviceAhaGuide.isComplete('aha1', true); + $rootScope.ahaGuide.exitedEarly = false; } else { + updateBuildStatus('cmdFailed'); + AHA.state.showError = true; AHA.state.showBindingMSG = true; } }); @@ -131,6 +139,19 @@ function AhaGuideController( if ($rootScope.animatedPanelListener) { $rootScope.animatedPanelListener(); } + if ($rootScope.doneListener) { + $rootScope.doneListener(); + } + if (AHA.state.subStep === 'dockLoaded') { + $rootScope.ahaGuide.completedMilestones.aha0 = true; + } + if (AHA.state.subStepIndex === 7 && !AHA.state.isBuildSuccessful) { + $rootScope.ahaGuide.exitedEarly = true; + $rootScope.ahaGuide.completedMilestones.aha1 = true; + $rootScope.$broadcast('exitedEarly'); + } else if (AHA.state.subStep === 'success') { + $rootScope.ahaGuide.completedMilestones.aha1 = true; + } }); $rootScope.animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index a7d40241b..64ce65124 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -17,7 +17,8 @@ function ahaGuideDirective( scope: { stepIndex: '=', subStep: '@', - subStepIndex: '=' + subStepIndex: '=', + errorState: '=?' }, link: function ($scope, elem, attrs) { // console.log($scope, elem, attrs); diff --git a/client/directives/components/ahaGuide/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebarController.js index fb9060f84..c2038d380 100644 --- a/client/directives/components/ahaGuide/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebarController.js @@ -10,4 +10,30 @@ function AhaSidebarController( serviceAhaGuide ) { console.log('instantiated'); + var ASC = this; + var showOverview; + $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); + + ASC.toggleOverview = function() { + ASC.state.showOverview = !ASC.state.showOverview; + $rootScope.ahaGuide.showOverview = ASC.state.showOverview; + ASC.toggleSidebar(); + }; + + ASC.toggleSidebar = function() { + ASC.state.showSidebar = !ASC.state.showSidebar; + $rootScope.ahaGuide.showSidebar = ASC.state.showSidebar; + }; + + console.log($rootScope.ahaGuide.completedMilestones); + if ($rootScope.ahaGuide.completedMilestones.aha1) { + showOverview = false; + } else { + showOverview = true; + } + ASC.state = { + showOverview: showOverview, + showSidebar: true + }; + } diff --git a/client/directives/components/ahaGuide/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebarDirective.js index a98c84905..4675449cc 100644 --- a/client/directives/components/ahaGuide/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebarDirective.js @@ -13,9 +13,9 @@ function ahaSidebarDirective( restrict: 'A', templateUrl: 'ahaSidebarView', controller: 'AhaSidebarController', - controllerAs: 'ASA', + controllerAs: 'ASC', link: function ($scope, elem, attrs) { - console.log($scope, elem, attrs); + // console.log($scope, elem, attrs); } }; } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index a1c8f4b84..97c61a982 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,20 +1,20 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( ng-click = "$root.featureFlags.ahaSidebar = false" - ng-if = "!$root.featureFlags.ahaOverview" + ng-if = "!$root.ahaGuide.showOverview" ) use( xlink:href = "#icons-close" ) .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.ahaOverview" + ng-if = "$root.featureFlags.ahaOverview && $root.ahaGuide.showOverview" ) .grid-content.strong Welcome to your Sandbox! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.btn.btn-sm.green( ng-click = "\ - $root.featureFlags.ahaOverview = false;\ - $root.featureFlags.ahaSidebar = false;\ + ASC.toggleOverview();\ + $root.ahaGuide.completedMilestones.aha1 = false;\ " ) Get Started .grid-block.vertical diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 3f8bc88a9..4b7744e98 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -68,15 +68,12 @@ p.p.small.text-gray-light {{ AHA.state.title }} p.p( ng-class = "{'p-slide js-animate': AHA.state.subStepIndex > 0}" - ng-if = "$root.featureFlags.aha1 && !state.showError && !state.showVerification" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.exitedEarly && !state.showError && !state.showVerification" ) {{ AHA.state.caption }} p.p( ng-class = "{'p-slide js-animate': AHA.state.subStepIndex}" - ng-if = "AHA.state.subStep === 6 && !state.showError && !state.showVerification" - ) - | {{!state.fromMirroring ? 'If your app needs additional configuration…' : ''}} - | {{state.fromMirroring ? 'We‘ve imported your dockerfile, click ‘Save & Build’ to build it!' : ''}} - //- | FROM BLANK DOCKERFILE: When you‘re done editing your dockerfile, click ‘Save & Build’ to build it! + ng-if = "$root.featureFlags.aha && $root.ahaGuide.exitedEarly && !state.showError && !state.showVerification" + ) {{ AHA.state.caption }} p.p( ng-class = "{'p-slide js-animate': AHA.state.subStepIndex}" ng-if = "AHA.state.subStep === 7" diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 9389432ce..1f67e4b7b 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -55,7 +55,7 @@ button.grid-block.shrink.btn.btn-md.green( 'scale-in-modal': $root.featureFlags.aha1\ }" ng-click = "EC.triggerModal.newContainer()" - ng-if = "!$root.featureFlags.ahaOverview" + ng-if = "!$root.ahaGuide.showOverview || $root.ahaGuide.completedMilestones.aha1" ) svg.iconnables.icons-add.float-left use( @@ -64,8 +64,8 @@ button.grid-block.shrink.btn.btn-md.green( | Add Configuration button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "$root.featureFlags.ahaSidebar = true" - ng-if = "$root.featureFlags.aha && !$root.featureFlags.ahaSidebar" + ng-click = "$root.ahaGuide.showSidebar = true" + ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" ) diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index f782e5ecb..c00739f88 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,7 +42,7 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha1}" + ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1}" ) header.grid-block.align-center.environment-header( @@ -51,13 +51,12 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha1ExitedEarly" - ng-include = "'ahaGuideView'" - ng-init = "\ - state.showStep = 1;\ - state.showSubStep = 7;\ - state.showError = true;\ - state.showErrorType = 'exitedEarly';\ + ng-if = "$root.featureFlags.aha1ExitedEarly && $root.ahaGuide.exitedEarly" + aha-guide-directive + step-index = 1 + sub-step = 'exitedEarly' + sub-step-index = 7 + error-state = "true" " ) @@ -99,7 +98,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha1 && !$root.featureFlags.ahaOverview" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.showOverview && !$root.ahaGuide.exitedEarly" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive @@ -129,5 +128,5 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar-directive - ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar" + ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar && $root.ahaGuide.showSidebar" ) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 3233cece5..610952ea9 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -14,7 +14,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( aha-guide-directive - ng-if = "$root.featureFlags.aha" + ng-if = "$root.featureFlags.aha && !$root.ahaGuideMilestones.aha0" step-index = 0 sub-step = "orgSelection" sub-step-index = 0 diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index cbac46fb3..7b8882a53 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -11,18 +11,9 @@ function serviceAhaGuide( var ahaService = this; var ahaMilestonesComplete; + var _state; - if (!keypather.get($localStorage, 'ahaMilestonesComplete')) { - ahaMilestonesComplete = { - aha0: false, - aha1: false, - aha2: false, - aha3: false - }; - keypather.set($localStorage, 'ahaMilestonesComplete', ahaMilestonesComplete); - } else { - ahaMilestonesComplete = keypather.get($localStorage, 'ahaMilestonesComplete'); - } + ahaMilestonesComplete = getAhaMilestones(); var _steps = [ { @@ -136,6 +127,12 @@ function serviceAhaGuide( className: 'aha-meter-80', step: 7 }, + exitedEarly: { + caption: 'Your container isn\'t running yet! Check the logs to debug any issues. If you\'re stumped, ask our engineers!', + className: 'aha-meter-80', + step: 7, + errorState: true + }, success: { caption: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', className: 'aha-meter-90', @@ -150,11 +147,11 @@ function serviceAhaGuide( buildStatus: { building: 'Now building. Build time varies depending on your configuration', - running: 'Verifying configuration... ', + running: 'Verifying configuration... ', starting: 'Now building. Build time varies depending on your configuration', success: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', - faileda: 'Your container failed to run. Inspect your CMD logs for more information.', - failed: 'Your build failed. Inspect your build logs for more information.' + cmdFailed: 'Your container failed to run. Inspect your CMD logs for more information.', + buildFailed: 'Your build failed. Inspect your build logs for more information.' } } ]; @@ -171,29 +168,54 @@ function serviceAhaGuide( }) .then(function(data) { ahaService.pendingRequest = false; - if (data.statusCode >= 200 && data.statusCode < 300) { + if (data.status >= 200 && data.status < 300) { return true; } return false; }) .catch(function(err) { console.log(err); + return new Error(err); }); } function isComplete(step, bool) { if (bool === true) { - keypather.set($localStorage, 'ahaMilestonesComplete.' + step, true); - keypather.set($localStorage, 'hasDismissedTrialNotification.' + currentOrg.github.attrs.id, true); + keypather.set($localStorage, 'completedMilestones.' + step, true); ahaMilestonesComplete[step] = bool; } else { - return keypather.get($localStorage, 'ahaMilestonesComplete.' + step); + return keypather.get($localStorage, 'completedMilestones.' + step); } } + function getAhaMilestones() { + var ahaMilestones = keypather.get($localStorage, 'completedMilestones'); + if (!ahaMilestones) { + ahaMilestones = { + aha0: false, + aha1: false, + aha2: false, + aha3: false + }; + keypather.set($localStorage, 'completedMilestones', ahaMilestones); + } + + return ahaMilestones; + } + + function setState(state) { + _state = angular.extend({}, state); + return _state; + } + + function getState() { + return _state; + } + return { - getSteps: getSteps, checkContainerStatus: checkContainerStatus, + getAhaMilestones: getAhaMilestones, + getSteps: getSteps, isComplete: isComplete }; } diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index 88999dbd5..11b078e0f 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -88,6 +88,6 @@ ) .grid-block.vertical.aha-sidebar.padding-sm.js-animate( - ng-include = "'ahaSidebarView'" + aha-sidebar-directive ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar" ) From 66c7893db4a7f540d758f4a39e06160d9575d4c3 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 25 Aug 2016 16:10:46 -0700 Subject: [PATCH 049/577] Spacing. --- layout.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layout.jade b/layout.jade index 52302a6db..b2eefba86 100644 --- a/layout.jade +++ b/layout.jade @@ -83,7 +83,7 @@ html( if (window.attachEvent) { window.attachEvent('onload', ls); } else { - window.addEventListener('load', ls, false); + window.addEventListener('load', ls, false); } })(); From 5051dcb837a5c4225e27ad1cfb62d67f5cd4a25d Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 25 Aug 2016 16:52:17 -0700 Subject: [PATCH 050/577] 4.18.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59a61e3e6..7d110a945 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.17.0", + "version": "4.18.0", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 2de6cc850e5050340c8a52cfcf10bd3f7d734a67 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 25 Aug 2016 17:02:43 -0700 Subject: [PATCH 051/577] Added proper ng-if logic for modal --- .../modals/modalSetupServer/setupServerModalView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade index 5228e1817..ec8a0312a 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade @@ -8,7 +8,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-if = "SMC.state.advanced === 'blankDockerfile'" + ng-if = "$root.featureFlags.aha && $root.featureFlags.aha1 && SMC.state.advanced === 'blankDockerfile'" step-index = 1 sub-step = "buildfiles" sub-step-index = 6 From f88c16ba4a750ceb6592d9685b07bc2b288f571b Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 26 Aug 2016 10:50:50 -0700 Subject: [PATCH 052/577] add a wrapper around list-instances --- .../styles/scss/layout/instances-list.scss | 14 ++++++++----- client/templates/instances/viewInstances.jade | 21 +++++++++---------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 3c2ea5b99..7974255d8 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -1,5 +1,4 @@ -// instances list -.list-instances { +.list-instances-wrapper { background: $gray-lighterest; border-right: 1px solid $gray-lighter; color: $gray; @@ -7,13 +6,18 @@ font-size: 15px; height: 100vh; overflow-y: auto; - padding: 0 12px 45px; - position: relative; width: $instance-list-width; &.in { - display: block; + display: flex; } +} + +// instances list +.list-instances { + padding: 0 12px 45px; + position: relative; + width: 100%; // search .label-search { diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index cb5967560..674c77bc5 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -1,21 +1,20 @@ //- instance list -.grid-block.shrink.list-instances( - ng-class = "{\ - 'deprecated': !$root.featureFlags.addBranches,\ - 'in': !CIS.$storage.instanceListIsClosed\ - }" +.list-instances-wrapper.grid-block.shrink.align-start( + ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "CIS.instancesByPod" - ng-include = "'viewInstancesList'" - scroll-offset = "200" - scroll-to = "a.a-sref.active" ) + .list-instances( + ng-class = "{'deprecated': !$root.featureFlags.addBranches}" + ng-include = "'viewInstancesList'" + scroll-offset = "200" + scroll-to = "a.a-sref.active" + ) -.grid-block.shrink.list-instances( +.list-instances-wrapper.grid-block.shrink.align-center.justify-center( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" ) - - .spinner-wrapper.spinner-md.spinner-gray.spinner-center.in( + .spinner-wrapper.spinner-md.spinner-gray.in( ng-include = "'spinner'" ) From 0878d7d23f8a244bd61067be5828bf20b43e1cb8 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 26 Aug 2016 11:08:55 -0700 Subject: [PATCH 053/577] add a bottom border to .list-clusters --- client/assets/styles/scss/layout/instances-list.scss | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 7974255d8..c3cdb6bed 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -90,12 +90,8 @@ // wraps the master cluster and each repository section .list-clusters { + border-bottom: 1px solid $gray-lighter; padding: 15px 0; - - + .list-clusters, - .well + & { - border-top: 1px solid $gray-lighter; - } } .list-clusters-heading { From 3b71aeac28a003eb51abe966ec00998c35002bb7 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 26 Aug 2016 11:22:21 -0700 Subject: [PATCH 054/577] add guide popover for adding branches + remove instance empy state guide --- .../styles/scss/components/aha-popover.scss | 11 +++++++ .../styles/scss/layout/instances-list.scss | 4 ++- .../components/addBranchGuideView.jade | 2 +- client/directives/navBar/viewNav.jade | 8 ++--- client/templates/instances/viewInstances.jade | 32 +++++++++++++++++-- client/templates/viewInstance.jade | 28 +--------------- 6 files changed, 50 insertions(+), 35 deletions(-) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 19b8fb652..99a44046c 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -24,4 +24,15 @@ .popover-content { @extend %padding-sm; } + + &.popover-aha-2 { + left: -60px; + position: relative; + top: -30px; + + .arrow { + left: auto; + right: 110px; + } + } } diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index c3cdb6bed..ed48baf5a 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -5,7 +5,7 @@ display: none; font-size: 15px; height: 100vh; - overflow-y: auto; + overflow: visible; width: $instance-list-width; &.in { @@ -15,6 +15,8 @@ // instances list .list-instances { + max-height: 100vh; + overflow-y: auto; padding: 0 12px 45px; position: relative; width: 100%; diff --git a/client/directives/components/ahaGuide/components/addBranchGuideView.jade b/client/directives/components/ahaGuide/components/addBranchGuideView.jade index 6680148e8..c8f9e556b 100644 --- a/client/directives/components/ahaGuide/components/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/components/addBranchGuideView.jade @@ -15,4 +15,4 @@ ) .grid-block.vertical.aha-text p.p.small.text-gray-light Add your First Branch - p.p You can start adding branches by clicking the + button next to the name of the repository. + p.p Add a branch by clicking the + button next to a repository name. diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 1dbf2171b..376a56559 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -5,10 +5,10 @@ ) //- aha menu -.popover.right.in.popover-aha( - ng-if = "$root.featureFlags.aha2 && !$root.featureFlags.aha1ExitedEarly" - ng-include = "'ahaPopoverView'" -) +//- .popover.right.in.popover-aha( +//- ng-if = "$root.featureFlags.aha2 && !$root.featureFlags.aha1ExitedEarly" +//- ng-include = "'ahaPopoverView'" +//- ) a.a( ui-sref = "base.config({ userName: CA.activeAccount.oauthName() })" diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 674c77bc5..7c4d0bb82 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -1,5 +1,5 @@ //- instance list -.list-instances-wrapper.grid-block.shrink.align-start( +.list-instances-wrapper.grid-block.vertical.shrink.align-start( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "CIS.instancesByPod" ) @@ -10,6 +10,35 @@ scroll-to = "a.a-sref.active" ) + .popover.bottom.in.popover-aha.popover-aha-2( + ng-if = "$root.featureFlags.aha2" + ) + .arrow.white + .popover-content + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide + .grid-block.align-center + .grid-block.shrink.aha-meter.aha-meter-33 + svg.iconnables + use( + xlink:href = "#icons-octicons-branch" + ) + .grid-block.vertical.aha-text + p.p.small.text-gray-light Add your First Branch + p.p Add a branch by clicking the + button next to a repository name. + button.btn.btn-xs.white.btn-menu( + ng-class = "{'active': ahaMenuGuidePopover.data.show}" + ng-if = "!state.hideMenu" + pop-over + pop-over-active = "ahaMenuGuidePopover.data.show" + pop-over-options = "{\"centered\":true,\"top\":36}" + pop-over-template = "ahaGuideMenuPopoverView" + ) + svg.iconnables + use( + xlink:href = "#icons-overflow" + ) + + .list-instances-wrapper.grid-block.shrink.align-center.justify-center( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" @@ -19,6 +48,5 @@ ) .grid-block.vertical.instance-wrapper( - ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha2}" ui-view ) diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index 4222e2ec3..f0a977751 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -7,33 +7,7 @@ .grid-block.vertical.instance( ng-if = "!isLoading.main" ) - - .grid-block.shrink.vertical.instance-header( - ng-if = "$root.featureFlags.aha2" - ) - button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "$root.featureFlags.ahaSidebar = true" - ng-if = "$root.featureFlags.aha && !$root.featureFlags.ahaSidebar" - tooltip = "Setup Guide" - tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" - ) - svg.iconnables - use( - xlink:href = "#icons-help" - ) - - .grid-block.align-center.justify-center( - ng-if = "$root.featureFlags.aha2" - ) - .modal-dialog.modal-sm - .grid-block.align-center.aha-guide.padding-md( - ng-include = "'ahaGuideView'" - ng-init = "state.showStep = 2" - ) - - .grid-block.vertical( - ng-if = "!$root.featureFlags.aha2" - ) + .grid-block.vertical //- show if server build is being swapped out - orange when build is updating or has failed - green if build is successfully built From 4e967631494ab58402532646161323faadc16ddc Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 26 Aug 2016 11:22:51 -0700 Subject: [PATCH 055/577] fix adding branch behavior --- .../branchMenuPopover/branchMenuPopoverView.jade | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index c9401ef47..d869bd850 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -123,7 +123,11 @@ ng-include = "'spinner'" ) li.list-item.popover-list-item( - ng-click = "$root.featureFlags.ahaSidebar = true" + ng-click = "\ + $root.featureFlags.ahaSidebar = true;\ + $root.featureFlags.aha2 = false;\ + $root.featureFlags.aha3 = true;\ + " ) SAN-4377-Cant-add-files //- ng-click = "$root.featureFlags.aha2Complete = true" button.btn.btn-xs.btn-icon.btn-add @@ -134,7 +138,8 @@ li.list-item.popover-list-item( ng-click = "\ $root.featureFlags.ahaSidebar = true;\ - $root.featureFlags.ahaComplete = true;\ + $root.featureFlags.aha2 = false;\ + $root.featureFlags.aha3 = true;\ " ) SAN-4342-auto-isolation-setup button.btn.btn-xs.btn-icon.btn-add From ea28771e50387f8ed81bcb5235ff4d541b9d00db Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 26 Aug 2016 12:43:48 -0700 Subject: [PATCH 056/577] update popover copy --- client/templates/instances/viewInstances.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 7c4d0bb82..be7c94af1 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -24,7 +24,7 @@ ) .grid-block.vertical.aha-text p.p.small.text-gray-light Add your First Branch - p.p Add a branch by clicking the + button next to a repository name. + p.p Almost done! Click the + button next to a repo name to add a branch. button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" ng-if = "!state.hideMenu" From 6a9cffc251b33d0c24bfa4cb91d6d68b7b87c0e3 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 26 Aug 2016 14:17:51 -0700 Subject: [PATCH 057/577] Fixed feature flag integration --- client/directives/components/ahaGuide/AhaGuideController.js | 2 ++ .../environment/environmentHeader/viewEnvironmentHeader.jade | 2 +- client/directives/environment/environmentView.jade | 2 +- client/directives/navBar/viewNav.jade | 2 +- client/services/serviceAhaGuide.js | 1 + 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 9cf2246e1..5c2f99580 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -85,6 +85,8 @@ function AhaGuideController( } else if (buildStatus === 'starting') { AHA.state.showError = false; addVerificationListeners(AHA.state.containerHostname); + } else if (buildStatus === 'stopped') { + AHA.state.showError = true; } updateBuildStatus(buildStatus); } diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 1f67e4b7b..e3acb732f 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -55,7 +55,7 @@ button.grid-block.shrink.btn.btn-md.green( 'scale-in-modal': $root.featureFlags.aha1\ }" ng-click = "EC.triggerModal.newContainer()" - ng-if = "!$root.ahaGuide.showOverview || $root.ahaGuide.completedMilestones.aha1" + ng-if = "!$root.featureFlags.aha1 || !$root.ahaGuide.showOverview || $root.ahaGuide.completedMilestones.aha1" ) svg.iconnables.icons-add.float-left use( diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index c00739f88..f030070e1 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -109,7 +109,7 @@ .grid-block.card-grid.clearfix( ng-class = "{'padding-top': helpCards.getActiveCard().helpTop}" - ng-if = "!$root.featureFlags.aha1" + ng-if = "!$root.featureFlags.aha1 || $root.ahaGuide.completedMilestones.aha1" ng-include = "'viewCardGrid'" ) diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 1dbf2171b..a63053501 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -6,7 +6,7 @@ //- aha menu .popover.right.in.popover-aha( - ng-if = "$root.featureFlags.aha2 && !$root.featureFlags.aha1ExitedEarly" + ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.exitedEarly" ng-include = "'ahaPopoverView'" ) diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index 7b8882a53..47067b7ca 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -150,6 +150,7 @@ function serviceAhaGuide( running: 'Verifying configuration... ', starting: 'Now building. Build time varies depending on your configuration', success: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', + stopped: 'Your container failed to run. Inspect your CMD logs for more information.', cmdFailed: 'Your container failed to run. Inspect your CMD logs for more information.', buildFailed: 'Your build failed. Inspect your build logs for more information.' } From 17336eb456c3da4ac2015abd926c636c6af24b41 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 26 Aug 2016 22:49:24 -0700 Subject: [PATCH 058/577] clean up aha sidebar --- client/assets/images/runnabear-waving-1.png | Bin 0 -> 7884 bytes client/assets/images/runnabot-comment.png | Bin 16161 -> 17137 bytes .../styles/scss/components/aha-sidebar.scss | 50 +++++++++++------- .../components/ahaGuide/ahaSidebarView.jade | 47 ++++++++-------- 4 files changed, 57 insertions(+), 40 deletions(-) create mode 100644 client/assets/images/runnabear-waving-1.png diff --git a/client/assets/images/runnabear-waving-1.png b/client/assets/images/runnabear-waving-1.png new file mode 100644 index 0000000000000000000000000000000000000000..105906b296842841b04cf565e1cda84cbc69b925 GIT binary patch literal 7884 zcmd^khd0~b|39jB%~&;>C_%-ZL8(+#>`lxfqDpHkMHQh`tRS}5Zc!~!yGCm7t!9l{ zjjh&O@yqA?Z~R{8yk6(rd!F}s?|D2P&*$^r*NrtYczlcQHXRum*)6!XrU@At`2gvq zq@g196hEPKAS2^Xfop1*1(I*KOOun4F;IM9x4jm;D%romNHY2V;d%2dWJaZ5IeRp%Z^ha|W_+QP>&8R8xNO&y%wC^In4oO1OD(4h%Er+Eu&zn^T+KPO`ud&P zPCuJiD65SAGrghOjhDUcHc{4MxM1Ul5-(Dta2RHW(ZKK6qYuaExY3kUXZ9)6Z<%2t z17)&2W0AafH-lOmurOG zNqQY|BG2{h3)M}XGGRR@gY_**{E*KSv-^*H!MVE!H&^SQOdf+%B5dNq#TES9k1%B| zw!+)6&|LuxN(HMN@bkalzdh`|WVrZRol6u?s>>Jk$QAR{_)en;ol?8ezYg7aG z29xrK1nVmH^cGrPSOwl_O=PGctOx?Y#WQg~IXopg$J~b@-@uGcqbqWevtJ`pA_oj& zwQumT+4>?4lgKK$tHm$tTd3Px@9u3p6jQLNsnX2Fg9LZN<^%xXPK2e+ivNMXHDXQV ztTw(a{!RSSDnsfRGeitLST&~lvKgynQT>Ci=BvPYEOaSGxJ?&bW(fx7NNV?6a~#eD0a(vXZlRV0p1+** z$}gZvz50*bJvQ2<&UnCBC4Gci6Gg z5Yc<_^nPlE@M*QxA+4luf^0{L2V8jVhv*w zy9Mxv3X6#`?69P9H7v3?>FL78w#mzhiEmrxViu&hWk70q%tYKTDvo$5+wPN)Fa*?x z>ePNbdG;B?d{5Z~o8Q%A@aV(07?abH(15MiGVF#Eq*dR<_gACz$}|;XdIXPS@2oq8 zA+2aD$&;P&UOP$NkN6mNZJHiZW60? zrhbp@U)=S>ZC%gmkr6Y;Pd8WmsFQs+AoJH|;0Zgac$OmIQ~u-lBm$qe+GA;QoDXh>NN zkTs;Vp_Gtimd%EE(ef2rQLmuM9$~9yRIj~8tOF+l?AAy2{zv{;Een_;o=!Ekvmtod z>s~u2B94fOQc|g(0SNci!{5^r@GlYr8T-8lxWh?tP8n&PCDZNR8SY};7xby260cB>VEJl$M8n5%`!~97*`*fd&)w>8tQ_W_ze_iS1E_Pe2ynB+`#|ui5qkr{4xbmf% zrCVOpAEeaE7>f+tN+vJ!6Xe_1wVdH+Bt}h4-Fbaez%o?-ZW*gEvn05djd@s9%T3z_ zl<`QCX1qPFBl|fM?^-c`&(+d|K`@}?<=TISdh#f@D!9h`Vk<)2gV_=}JHBHVpV8TD z3TMc-!w<66?pI!4U9aj7WFu-t@hIc2mw`o`wNG+HbV&s2uw~j8cx(RsSvs$57;$IH zURiuiqf6wJ?j}yQmJTgNF2tRD+?h*;=3d;45p+<4A+QGo!6NA$?kJkW&2~;ulO{*R zhj*q@nmt(pE;Sb%c@8Tj@q3yyY?&L`?Tb-tsz957xmf$`*aX`GyAZGE#xD5~+9>#n zQM!B<*%;iYpffM00hunKgG?+D)Tfhc*Y2Q!YtgZ_^ZtsI+i{p{c^Gk^84?ivWdHsf zV%!er!5OAn?}8OF%P4$Cl8)elXKg87pRz^J)z!XkIUIuTr!1&}f-!`Ni+^A;K1uB% zI4-tIFK%$c+wM33^Mq?`|M=>vuk`whnv()DTF`l3k=8hyM{rm{+Fs5P#;oIZGE9#?|PAG$?)eRl3kpZS;y~RQXs)`J4(B=;4Y`4+o($7pH}d%3!2KeF^H2GPL5F@+XMU7zQH#1i2cSUnDb7rl6J;3dC9#q>wKl`8Xq16ov6bsm7<^C` z<(g*PW8qQ)G3M8lT5LGcCYRNr2r6KZ$lSn9CK5f^-si^*y*gx??Lm))HtA$DKWR3J zw;9qLDU=e`!-m$1+7R_w^El>e=F-S9$sn4$DWVz{aPKk<+j~ARonyuL2|lGZ+{4G# zhTGymTLQw(Ld#*8LCU~N*{{xHMfH*ItMh!z#^xHk{g^v2dX)AUa}(_~@?z^=g<_c} zmpMPJ9-2ezzuCo9?N+NTFXqalMu$jofqdif*;RYIk(VB*g)tWp8_jfqcZSOpEdu!Y zXeoo)&Y?wbh+F-i?#ehrKli%nK=1>k` zJq$}okRJy9#OWl7=o0mpOK%Ev`g-3Dz(aHq_Xc`ZZ#d6r4~ld$y7(9+kl-6LGrj)Y z)%Mjx14(;;`>j+KJ9lb#{)0MlF#83qHRn8g%@^X+{rmqI5)r$n2lGj#woLpNH<5QK z=x9xsw)cT|&*E2GvtulG ziQ<yz8A*3x!6_|p&R7lg* zC|ZxXO_uF#gFOJTl7FKc_}wgM9mkm*mB8j&QqXbn?bp>1zx;BkE+T<%d^`GY+a?iJ zb&^ypMOzF_S_5;(JFKxbColJOF;E~+h6-D08lX47gtJOi8~9R}P~_MP^xwBFJdNcu z!J;=Du`**!;S)0Svos?;3SCGw1D%@n1Q{-0&GQLn8}JIcNLD0r^?u_0C{4z++Fyg+ z|9O_BZK;uJHV7~A=w=OI@c8|@^b-jgJLfPP3zMsy3|8ysnz^ei zHZ}7-swdc`(ULSudv2Kv#{ueKPYWutE1BRCTKQq}bPsd+k%Dna za1@E(zjg+-8e|E)Ex)_>nQo>j&}%H(ptzod~~M?*rWG83Fzs`egRUxy)Ggo~)P z928+FnoKHTL!B7t>rA{9i0;ygXi{NsDe81DPVOK`scCmK(LbSiF?L6tAN|~$_cFn9%P)UNC!{9rbzG>mqtCkwo)WYdtU9&SYyFI z3ba#5%OiL+*hjwoz;q5`UUesSYemLFKBYTV@lwj#2q$+DpX9J(rw^;Y?}~)as!!=Z z{&Tq30C2K3+hKKJN|ie}_EZcLo5E4c|KJoE$hZEpe1oe=4{Ha*CS|3-+1 zADDd@++ZiK^hQ-ME|UH+V@W7GT73FOC`?2ThM2<0C)&ReqWA8W0O^Q^J*zycy3u~6 zyUW0+zW;}{^_m#=3LAEH5ymud{dYL*c;Oe~zuYD!)!2=Z;cR3&sAusMV(R&HG(u1x zGq$bgO%jlc38(6PmKG5COeqlJPM18`DIOd#r=VUV*mQllcdh;?CQ|)s&J-=u{MXEo z-nZdb_bSjS*W1Zf?q0uKw@fG`H*!~oupKLPKL#XQz!% z_Vg<+kBugj4cbyx2dMbj@gB#D5_Z*4fHlgjzbB6zCCb~~snK^d!RjZs`vA*fP;JJs zPOfCs{Q43dCF&o4-i=}Q$$gtg9)H!SoI?1$WfW7Lb%AJH1LqLA|)-(VO>nRw?_775$5sb?w z3xD3w^-DBKX+t$<|L!zjN>Bl#zXTd0sTBG+RmxvsdrhgNxy~>rSW6LLK9{k1W0rd_ zWb$?j{2ebyC0+LI!N0&WK6A~8}giTQ(LvYakZpjCBHu@%dI`n>gZ59jUo8q46js&w zHYV8p3OH;37T?q~Jgk0H-X3{zXV@HP`LCyC={(pWK}c`=_V2k3m)9>gDqATED&7vD zn$r)BI$2|?0h55Ory~FHuF6IAR``6RTIjbbAY|lMumfH}Q_ZP-PV!yDIelV<@(W)E zMB2Ij!evW=wx{m|36EL?l?g1lxByo#KI9L%Jvy=IbBvMZc8wzxL9)BH4q8$R(677N zVO<@~JoHV+ht$sS&Cd_j*?3>vVUqZ-#V)h|u(o{9?$wS1^j~%?I@X}zTGj=hCZzo3 zj7Mj2OX_V%<0Ri)k(7#Z`Cl&{#r$l?5`HpDx?wbJLkD)`3*Y5VG300@-jLe0;yFrr zl)4)Ib@fG80$h(hLzMnDqJJ#q7HD5>zyt4K?q-4;tG`^_p{!AQIOU|$Wg&W5ozs~WqCTlLVP?ZVI~^2Z$0}+eg~BRl7I~k2qdj~EgoM1?l?t?vn&ank z`dJY>l4=*kz~^+Pmeli>2w+0ESy@PG@taACNh~;Ors5r>IHzC=aZBl;f{J5=<(*gV zaFpS~Yc9N{Y5H1x`eN(`bYyEQ1yo*;=18OGLS0)|hg4J=WS6dpUdsX8|avpo3i)%;;FbD(iXBB-1YJbWRf$Te~Upak{8LfFNhz^zO%fJfP&x#DG7} z++%+1u3t?_nHqH8B!g@Qs7bxNg<<32!`RfFkE>4-W_5Z+G$M*g|ChXg10|gaPt;uZ z#p%YGUbUn-iF5d_QoWQO|13J4LBOOxFUX-g&qS0q=bg*$uUvj9W39Na6xumGtpDI7 zedR2)+llkeFJ1hPL)T0IYN7WWV{7VCRfHy_-eLp}t-fsK64k?mJH5BQm_812Z;mMz zI^i~&tNVsy3^03UoUvBo{427uqNcG2V?9k6Y4&-q9`a7qCt1LIv?$wa35O%vpfB^yZT1`#9L z3H(urdl>(4KuNzef5VhLooRX&P|g7@`eoeqRNHOtf&>?=>0Q~!pE$bUXHfWxfynRP zb7lZ)bjy5)lKg{fIoR&uam%cE>-DjN?CB?vEPN!TJOohEQu&sV_Xw8ppa02=r0-#& zIV9%p&HK%+HI>XfS%{Ttn7JQ?_+3~6w4E2B`A;-azHtCO;>C7~4m)g;P-CXs$EVPn zI=J&V`nbU@2+gGAlWxEIL#*~4Wiv;~;0yKAFrr~aHtN1&v`dVd5U@HFvL)w~kX z``46;Ca+64qi&y?J%HQe-zyHOkpw2Xcbk` zhz_CJrAKDco+fu*ZaQ&PL)EMW9R*5^GF&thRjd>WCe~14u%^&N3(wfPKoY8QSfMjp zDmV;K7`)ouN+gtE!5!=`W%wwG1z5C@VH8%%DX}9piThWQWb-O@>m_DSmQilVE9qfh~PUR-MX z7}f*XWy*DP8n|ecE7OiHcW=pYvHr~CbDJDSrurEa-=sIKjZ)63vW$It9M zR@9UGCnx-Gb6auH$3spe-S&KzDXe?uPMf^U88X;4;!i!}P2-+y>LW~5mEtJ<)}w!U zC#^B-4=9f(V*v=Am=p?w#7tj*B4b*!q;Pkb)Vh$G7$6IfBankw;WeA?nw zq(we83yg+w3 zuRAwUey_=AJ3$^y#EA{t40pMouvd(z&%@`A~M`!BMNie0~J&HMf7Ovk*@Yt1^l7g#YS z2ps9Pg&V}(Lf37-tG`qf!KA^yjz_>%*!sfCGL^OD-)DyDxrr}1EG@75VfE^jy>dE%XcJ@6hmPylyy#5hHC2!{t zjY~@97}v|}@lURjerTa`E;?ubDbxM#Iyg%U>T#c091$&Ve9sblhy6<25ttJcN}_U4 zrX2WDM>A!~yb76~#p=A^YZNZyleV<}E23Rk2>0V^6||c7S~6+x%7nt1M4vs>73k`@ zwD(FalhUmeo{TZIr*}D|3S&|~Th6d5`|znM+16M97o#*T@uHmN3&+6Dq4oK?r1hZN z*Sq$&H+9amay7pidXMxk0_hW1+qeR}H=Yhmj&|EQ?o0lriO{lqxl}Q1?bqFd!}Kd9?UlJG5B>0xqZL+H6-S31{rQs`(r6}=f9U|D$xj~L%r@4Vluifu6XNivIR7L z9L{z+Y%)Sa6qrCIvAJ!wc;|)fy1!h`U9#IWO{{o>zMmquU`wgC=l+Hb-6#9kM z*-U-u)>So`-5G;`ZPQi0WdmVXc8p7d%wF2pCt3M2B269jfmK#nO>G5G1%(OKv<;^0 zo8lSMcAyie^MhrLKZ-oRyD};t{6_Kpc=36&_KCIJ1>wU#5ni^_$LOHOPr2dJLqfl! zjXMp{9wPs`a!LsY+sLY#C-y$qP~^S3#gza@Ocl*b?&X|EF_H;4$I1VzW_mzzd`$P6 uF-N*fb=%kYv2b~pmajs)To;$~fWvCmWMtg$9*h6oKf@mxXja0WMEpNwS&D4{ literal 0 HcmV?d00001 diff --git a/client/assets/images/runnabot-comment.png b/client/assets/images/runnabot-comment.png index 41fcb1f2a560b1ae70d1854c265a24d4be45915c..a7a300daa66fc263c3db87ca6015c37ea36954dd 100644 GIT binary patch literal 17137 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 a241hbuk$Gfxe$_1fV_;dblGc&|NjEbvp>`T literal 16161 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 V`#pwlAXDD~c^MVy;@2jD{|i7mxi0_! diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index f442afcdc..8f9061456 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -46,14 +46,41 @@ } .aha-overview { - animation: slide-left .45s ease-in-out forwards; - border-bottom: 1px solid $gray-lightest; - margin-bottom: 15px; - padding: 32px 0 42px; + + .strong { + border-bottom: 1px solid $gray-lightest; + font-size: 18px; + padding: 6px 0 18px; + } + + .grid-content + .grid-content { + margin-top: 30px; + } .btn { align-self: center; + margin-top: 15px; } + + .btn-bear { + margin: 90px 0 15px; + position: relative; + + .img { + left: 0; + margin: 0 auto; + pointer-events: none; + position: absolute; + right: 0; + top: -120px; + } + } + } + + .aha-guide-wrapper { + border-top: 1px solid $gray-lightest; + margin-top: 30px; + padding-top: 15px; } .aha-guide { @@ -83,19 +110,4 @@ margin-top: 15px; } } - - .aha-runnabot { - - .grid-content { - margin-top: 45px; - } - - .img { - align-self: center; - } - - .link { - margin-top: 15px; - } - } } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index ae951e450..cd52fb28f 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -28,13 +28,13 @@ animated-panel-container .grid-block.vertical.shrink.justify-center.text-center.aha-overview( ng-if = "$root.featureFlags.aha3" ) - .grid-content.strong Well done! - | You’ve finished setting up. Give yourself a pat on the back! - button.grid-content.btn.btn-sm.green( + .grid-content.strong You did it! + p.p.grid-content You’re all set up and ready to go. Give yourself a pat on the back! + button.btn.btn-md.green( ng-click = "goToPanel('runnabotStep')" ) I Feel Great About This - .grid-block.vertical + .grid-block.vertical.aha-guide-wrapper .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" ) @@ -109,27 +109,32 @@ animated-panel-container animated-panel( name = "runnabotStep" ) - .grid-block.vertical.shrink.justify-center.align-center.text-center.aha-runnabot - .grid-content - .strong One more thing… - | Now you can get super helpful comments - br - | on your pull requests. Like this one: - img.grid-content.img( - height = "116" + .grid-block.vertical.text-center.aha-overview.aha-runnabot + .grid-content.strong Get Runnable on Your PRs + p.p.grid-content Now you can get super helpful comments on your pull requests. Like this one: + img.img.grid-content( + height = "146" src = "/build/images/runnabot-comment.png" - width = "328" + width = "358" ) - .grid-content Just invite Runnabot to your GitHub org. - br - | This may increase your GitHub bill. + p.p.grid-content All it takes is one click. Note that this may increase your GitHub bill. a.link Details - button.grid-content.btn.btn-sm.green( + button.btn.btn-md.green.btn-spinner.btn-bear( + ng-click = "$root.featureFlags.ahaOverview = false" + ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to CodeNow'}} + img.img( + height = "130" + src = "/build/images/runnabear-waving-1.png" + width = "230" + ) + //- if inviting Runnabot + //- .spinner-wrapper.spinner-sm.spinner-white.in( + //- ng-include = "'spinner'" + //- ) + .link.small.text-gray( ng-click = "\ - $root.featureFlags.ahaOverview = false;\ + $root.featureFlags.aha = false;\ + $root.featureFlags.aha3 = false;\ $root.featureFlags.ahaSidebar = false;\ " - ) Invite Runnabot - a.link.small.text-gray( - ng-click = "$root.featureFlags.ahaSidebar = false" ) Not now, thanks From 55d3ab5fd2a4892657618032a77fd4113783fb1f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Sat, 27 Aug 2016 14:26:34 -0700 Subject: [PATCH 059/577] combine completed message and runnabot step --- client/assets/images/runnabot-comment.png | Bin 17137 -> 16369 bytes .../styles/scss/components/aha-sidebar.scss | 22 +- .../components/ahaGuide/ahaSidebarView.jade | 241 +++++++++--------- 3 files changed, 129 insertions(+), 134 deletions(-) diff --git a/client/assets/images/runnabot-comment.png b/client/assets/images/runnabot-comment.png index a7a300daa66fc263c3db87ca6015c37ea36954dd..01c464ff026af4aa0adca0193f2cd9f776177512 100644 GIT binary patch literal 16369 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 literal 17137 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 a241hbuk$Gfxe$_1fV_;dblGc&|NjEbvp>`T diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 8f9061456..38fccaa58 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -47,23 +47,32 @@ .aha-overview { - .strong { + .h4 { border-bottom: 1px solid $gray-lightest; - font-size: 18px; padding: 6px 0 18px; } - .grid-content + .grid-content { - margin-top: 30px; + .p { + margin: 42px 0; + } + + .small { + margin: 9px 0; + } + + .img-comment { + border-bottom: 1px solid $gray-lightest; + height: auto; + padding-bottom: 24px; } .btn { align-self: center; - margin-top: 15px; + margin-top: 18px; } .btn-bear { - margin: 90px 0 15px; + margin-top: 96px; position: relative; .img { @@ -79,7 +88,6 @@ .aha-guide-wrapper { border-top: 1px solid $gray-lightest; - margin-top: 30px; padding-top: 15px; } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index cd52fb28f..6b5f39ab8 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,140 +1,127 @@ -animated-panel-container - animated-panel( - default = "true" - name = "ahaSteps" +.grid-block.shrink.align-center.justify-right( + ng-if = "!$root.featureFlags.ahaOverview && !$root.featureFlags.aha3" +) + svg.iconnables.icons-close( + ng-click = "$root.featureFlags.ahaSidebar = false" ) - .grid-block.shrink.align-center.justify-right( - ng-if = "!$root.featureFlags.ahaOverview && !$root.featureFlags.aha3" + use( + xlink:href = "#icons-close" ) - svg.iconnables.icons-close( - ng-click = "$root.featureFlags.ahaSidebar = false" - ) - use( - xlink:href = "#icons-close" - ) - .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.ahaOverview" - ) - .grid-content.strong Welcome to your Sandbox! 👋 - | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! - button.grid-content.btn.btn-sm.green( - ng-click = "\ - $root.featureFlags.ahaOverview = false;\ - $root.featureFlags.ahaSidebar = false;\ - " - ) Get Started +.grid-block.vertical.shrink.justify-center.text-center.aha-overview( + ng-if = "$root.featureFlags.ahaOverview" +) + h4.h4.strong Welcome to your Sandbox! 👋 + p.p It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! + button.grid-content.btn.btn-md.green( + ng-click = "\ + $root.featureFlags.ahaOverview = false;\ + $root.featureFlags.ahaSidebar = false;\ + " + ) Get Started - .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.aha3" +.grid-block.vertical.text-center.aha-overview( + ng-if = "$root.featureFlags.aha3" +) + h4.h4.strong You did it! + p.p You finished setting up! Now you can get helpful comments from Runnabot on your pull requests, like this one: + img.img.img-comment( + height = "116" + src = "/build/images/runnabot-comment.png" + width = "358" + ) + button.btn.btn-md.green.btn-spinner.btn-bear( + ng-click = "$root.featureFlags.ahaOverview = false" + ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to CodeNow'}} + img.img( + height = "130" + src = "/build/images/runnabear-waving-1.png" + width = "230" ) - .grid-content.strong You did it! - p.p.grid-content You’re all set up and ready to go. Give yourself a pat on the back! - button.btn.btn-md.green( - ng-click = "goToPanel('runnabotStep')" - ) I Feel Great About This + //- if inviting Runnabot + //- .spinner-wrapper.spinner-sm.spinner-white.in( + //- ng-include = "'spinner'" + //- ) + .small.text-gray This may affect your GitHub bill. + a.link Details + .link.small.text-gray( + ng-click = "\ + $root.featureFlags.aha = false;\ + $root.featureFlags.aha3 = false;\ + $root.featureFlags.ahaSidebar = false;\ + " + ) Not now, thanks - .grid-block.vertical.aha-guide-wrapper - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-meter-50': $root.featureFlags.aha0,\ - 'aha-meter-100': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3\ - }" +.grid-block.vertical.aha-guide-wrapper( + ng-if = "!$root.featureFlags.aha3" +) + .grid-block.shrink.align-center.padding-sm.aha-guide( + ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" + ) + .grid-block.shrink.aha-meter( + ng-class = "{\ + 'aha-meter-50': $root.featureFlags.aha0,\ + 'aha-meter-100': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3\ + }" + ) + svg.iconnables + use( + ng-if = "$root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3" + xlink:href = "#icons-check" ) - svg.iconnables - use( - ng-if = "$root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Create your Sandbox - p.small This is the first step to success. + .grid-block.vertical.aha-text + p.p.strong Create your Sandbox + p.small This is the first step to success. - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-error': state.showError,\ - 'aha-meter-10': state.showSubStep === 0,\ - 'aha-meter-20': state.showSubStep === 1,\ - 'aha-meter-30': state.showSubStep === 2,\ - 'aha-meter-40': state.showSubStep === 3,\ - 'aha-meter-50': state.showSubStep === 4,\ - 'aha-meter-60': state.showSubStep === 5,\ - 'aha-meter-70': state.showSubStep === 6,\ - 'aha-meter-80': state.showSubStep === 7,\ - 'aha-meter-90': state.showSubStep === 8,\ - 'aha-meter-100': $root.featureFlags.aha2 || $root.featureFlags.aha3\ - }" + .grid-block.shrink.align-center.padding-sm.aha-guide( + ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" + ) + .grid-block.shrink.aha-meter( + ng-class = "{\ + 'aha-error': state.showError,\ + 'aha-meter-10': state.showSubStep === 0,\ + 'aha-meter-20': state.showSubStep === 1,\ + 'aha-meter-30': state.showSubStep === 2,\ + 'aha-meter-40': state.showSubStep === 3,\ + 'aha-meter-50': state.showSubStep === 4,\ + 'aha-meter-60': state.showSubStep === 5,\ + 'aha-meter-70': state.showSubStep === 6,\ + 'aha-meter-80': state.showSubStep === 7,\ + 'aha-meter-90': state.showSubStep === 8,\ + 'aha-meter-100': $root.featureFlags.aha2 || $root.featureFlags.aha3\ + }" + ) + svg.iconnables + use( + ng-if = "!$root.featureFlags.aha2 && !$root.featureFlags.aha3" + xlink:href = "#icons-octicons-repo" ) - svg.iconnables - use( - ng-if = "!$root.featureFlags.aha2 && !$root.featureFlags.aha3" - xlink:href = "#icons-octicons-repo" - ) - use( - ng-if = "$root.featureFlags.aha2 || $root.featureFlags.aha3" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Add your First Repository - p.small Configure your project and get it running! - - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-meter-33': $root.featureFlags.aha2,\ - 'aha-meter-100': $root.featureFlags.aha3\ - }" + use( + ng-if = "$root.featureFlags.aha2 || $root.featureFlags.aha3" + xlink:href = "#icons-check" ) - svg.iconnables - use( - ng-if = "!$root.featureFlags.aha3" - xlink:href = "#icons-octicons-branch" - ) - use( - ng-if = "$root.featureFlags.aha3" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Add your First Branch - p.small Your branches will update on every commit you make. + .grid-block.vertical.aha-text + p.p.strong Add your First Repository + p.small Configure your project and get it running! - animated-panel( - name = "runnabotStep" + .grid-block.shrink.align-center.padding-sm.aha-guide( + ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha3}" ) - .grid-block.vertical.text-center.aha-overview.aha-runnabot - .grid-content.strong Get Runnable on Your PRs - p.p.grid-content Now you can get super helpful comments on your pull requests. Like this one: - img.img.grid-content( - height = "146" - src = "/build/images/runnabot-comment.png" - width = "358" - ) - p.p.grid-content All it takes is one click. Note that this may increase your GitHub bill. - a.link Details - button.btn.btn-md.green.btn-spinner.btn-bear( - ng-click = "$root.featureFlags.ahaOverview = false" - ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to CodeNow'}} - img.img( - height = "130" - src = "/build/images/runnabear-waving-1.png" - width = "230" + .grid-block.shrink.aha-meter( + ng-class = "{\ + 'aha-meter-33': $root.featureFlags.aha2,\ + 'aha-meter-100': $root.featureFlags.aha3\ + }" + ) + svg.iconnables + use( + ng-if = "!$root.featureFlags.aha3" + xlink:href = "#icons-octicons-branch" + ) + use( + ng-if = "$root.featureFlags.aha3" + xlink:href = "#icons-check" ) - //- if inviting Runnabot - //- .spinner-wrapper.spinner-sm.spinner-white.in( - //- ng-include = "'spinner'" - //- ) - .link.small.text-gray( - ng-click = "\ - $root.featureFlags.aha = false;\ - $root.featureFlags.aha3 = false;\ - $root.featureFlags.ahaSidebar = false;\ - " - ) Not now, thanks + .grid-block.vertical.aha-text + p.p.strong Add your First Branch + p.small Your branches will update on every commit you make. From b64e5de8c90e2998a3e5f98ea40d3c56e2d53017 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Sun, 28 Aug 2016 14:25:52 -0700 Subject: [PATCH 060/577] clean up popover-add-branches --- .../styles/scss/components/aha-popover.scss | 2 +- client/templates/instances/viewInstances.jade | 28 ++----------------- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 99a44046c..10ddd9160 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -25,7 +25,7 @@ @extend %padding-sm; } - &.popover-aha-2 { + &.popover-add-branches { left: -60px; position: relative; top: -30px; diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index be7c94af1..c83b0fe99 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -10,34 +10,10 @@ scroll-to = "a.a-sref.active" ) - .popover.bottom.in.popover-aha.popover-aha-2( + .popover.bottom.in.popover-aha.popover-add-branches( ng-if = "$root.featureFlags.aha2" + ng-include = "'ahaPopoverView'" ) - .arrow.white - .popover-content - .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide - .grid-block.align-center - .grid-block.shrink.aha-meter.aha-meter-33 - svg.iconnables - use( - xlink:href = "#icons-octicons-branch" - ) - .grid-block.vertical.aha-text - p.p.small.text-gray-light Add your First Branch - p.p Almost done! Click the + button next to a repo name to add a branch. - button.btn.btn-xs.white.btn-menu( - ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!state.hideMenu" - pop-over - pop-over-active = "ahaMenuGuidePopover.data.show" - pop-over-options = "{\"centered\":true,\"top\":36}" - pop-over-template = "ahaGuideMenuPopoverView" - ) - svg.iconnables - use( - xlink:href = "#icons-overflow" - ) - .list-instances-wrapper.grid-block.shrink.align-center.justify-center( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" From 27c3a33de0534f4338690e5f8e0d4a80305e2d5e Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Sun, 28 Aug 2016 14:33:32 -0700 Subject: [PATCH 061/577] add exit transition to popover-add-branches --- client/assets/styles/scss/components/aha-popover.scss | 11 +++++++++++ client/templates/instances/viewInstances.jade | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 10ddd9160..4bd8d6d1a 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -29,6 +29,17 @@ left: -60px; position: relative; top: -30px; + transition: opacity .075s ease-in, transform .075s ease-in; + + &.ng-leave { + opacity: 1; + transform: scale3d(1,1,1); + } + + &.ng-leave-active { + opacity: 0; + transform: scale3d(.9,.9,1); + } .arrow { left: auto; diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index c83b0fe99..683706571 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -10,7 +10,7 @@ scroll-to = "a.a-sref.active" ) - .popover.bottom.in.popover-aha.popover-add-branches( + .popover.bottom.in.popover-aha.popover-add-branches.js-animate( ng-if = "$root.featureFlags.aha2" ng-include = "'ahaPopoverView'" ) From 633d32c40f462be13f36a02904b27973925b4d76 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Sun, 28 Aug 2016 17:13:01 -0700 Subject: [PATCH 062/577] clean up --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 1 - client/directives/navBar/viewNav.jade | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index d869bd850..cf88eb58c 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -129,7 +129,6 @@ $root.featureFlags.aha3 = true;\ " ) SAN-4377-Cant-add-files - //- ng-click = "$root.featureFlags.aha2Complete = true" button.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-add use( diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 376a56559..1dbf2171b 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -5,10 +5,10 @@ ) //- aha menu -//- .popover.right.in.popover-aha( -//- ng-if = "$root.featureFlags.aha2 && !$root.featureFlags.aha1ExitedEarly" -//- ng-include = "'ahaPopoverView'" -//- ) +.popover.right.in.popover-aha( + ng-if = "$root.featureFlags.aha2 && !$root.featureFlags.aha1ExitedEarly" + ng-include = "'ahaPopoverView'" +) a.a( ui-sref = "base.config({ userName: CA.activeAccount.oauthName() })" From c6452f69e0011f10f0ceb42ad662295f0f33c714 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Sun, 28 Aug 2016 23:43:50 -0700 Subject: [PATCH 063/577] apply updated auto-isolation UI --- .../repository-details-content.scss | 8 ++- .../scss/deprecated/btn-auto-deploy.scss | 53 ------------------- client/assets/styles/scss/index.scss | 1 - .../styles/scss/layout/instance-sidebar.scss | 1 - .../editRepoCommit/editRepoCommitView.jade | 35 +----------- .../branchCommitSelectorView.jade | 2 +- 6 files changed, 9 insertions(+), 91 deletions(-) delete mode 100644 client/assets/styles/scss/deprecated/btn-auto-deploy.scss diff --git a/client/assets/styles/scss/components/repository-details-content.scss b/client/assets/styles/scss/components/repository-details-content.scss index c00d08535..9b1c289ad 100644 --- a/client/assets/styles/scss/components/repository-details-content.scss +++ b/client/assets/styles/scss/components/repository-details-content.scss @@ -2,6 +2,10 @@ display: flex; flex-direction: column; + &.modal-body { + padding-bottom: 0; + } + > .label { display: table; margin: 0 auto 12px; @@ -16,7 +20,10 @@ .list-servers.list-servers { flex: 1 1 auto; + max-height: calc(100vh - 300px); min-height: 90px; + overflow-y: auto; + padding: 15px 0; position: relative; > .spinner-wrapper { @@ -91,7 +98,6 @@ border-bottom: 1px solid $gray-lighter; flex: 0 0 auto; font-size: 15px; - margin-bottom: 9px; padding-right: 48px; &:not(:first-child) { diff --git a/client/assets/styles/scss/deprecated/btn-auto-deploy.scss b/client/assets/styles/scss/deprecated/btn-auto-deploy.scss deleted file mode 100644 index c4deb7d21..000000000 --- a/client/assets/styles/scss/deprecated/btn-auto-deploy.scss +++ /dev/null @@ -1,53 +0,0 @@ -.btn-repository.main-btn.deprecated { - min-height: 127px; - padding-bottom: ($input-sm + 6px); - - .icons-arrow-forward { - height: calc(100% - 36px); - } -} - -.btn-auto-deploy-deprecated { - background: $gray-lightest; - border-radius: 0; - border-top: 1px solid $gray-lighter; - bottom: 0; - color: $gray; - cursor: default; - font-size: 13px; - height: $input-sm; - left: 0; - margin: 2px; - padding: 0 9px; - position: absolute; - right: 0; - z-index: 1; - - .icons-launch { - filter: grayscale(100%); - height: 100%; - margin: 0 6px 0 -3px; - opacity: .75; - text-align: center; - width: 18px; - - @include retina() { - margin-left: 0; - width: 15px; - } - } - - .underline { - line-height: 1.2; - margin-top: 8px; - } - - .toggle-wrapper { - top: 9px; - - &.disabled { - cursor: not-allowed; - opacity: .5; - } - } -} diff --git a/client/assets/styles/scss/index.scss b/client/assets/styles/scss/index.scss index 2c197ac9e..010474793 100755 --- a/client/assets/styles/scss/index.scss +++ b/client/assets/styles/scss/index.scss @@ -192,7 +192,6 @@ @import "pages/server-selection"; //deprecated -@import "deprecated/btn-auto-deploy"; @import "deprecated/card-status"; @import "deprecated/connections"; @import "deprecated/deleted-commit"; diff --git a/client/assets/styles/scss/layout/instance-sidebar.scss b/client/assets/styles/scss/layout/instance-sidebar.scss index d0e99d6f1..236794dce 100644 --- a/client/assets/styles/scss/layout/instance-sidebar.scss +++ b/client/assets/styles/scss/layout/instance-sidebar.scss @@ -16,7 +16,6 @@ font-size: 15px; font-weight: $weight-normal; min-height: 118px; - padding-right: 24px; text-align: left; &.grid-block { diff --git a/client/directives/components/editRepoCommit/editRepoCommitView.jade b/client/directives/components/editRepoCommit/editRepoCommitView.jade index d4d8e1055..c3ef721e8 100644 --- a/client/directives/components/editRepoCommit/editRepoCommitView.jade +++ b/client/directives/components/editRepoCommit/editRepoCommitView.jade @@ -3,7 +3,6 @@ ng-class = "{\ 'grid-block align-center justify-center': !activeCommit.attrs.commit.message,\ 'main-btn': !acv.attrs.additionalRepo,\ - 'deprecated': !acv.attrs.additionalRepo && !$root.featureFlags.testingFeature\ }" ng-click = "actions.openRepoDetailsModal()" ) @@ -66,7 +65,7 @@ //- show alternate text in autoDeployTooltip.jade if disabled .btn.btn-xs.btn-auto-deploy( ng-class = "{'btn-permissions': autoDeploy()}" - ng-if = "!acv.attrs.additionalRepo && $root.featureFlags.testingFeature" + ng-if = "!acv.attrs.additionalRepo" pop-over pop-over-hover-trigger pop-over-options = "{\"top\":30,\"centered\":true}" @@ -83,35 +82,3 @@ xlink:href = "#icons-alert-alt" ) | {{autoDeploy() ? 'Auto-Deploy Disabled' : 'Auto-Deploying'}} - -//- auto-deploy w/o commit syncing -.btn.btn-sm.btn-auto-deploy-deprecated( - ng-if = "!acv.attrs.additionalRepo && !$root.featureFlags.testingFeature" -) - .iconnables.icons-launch.float-left 🚀 - span.underline.float-left( - tooltip = "Automatically rebuild your container when new commits are made." - tooltip-options = "{\"class\":\"bottom center text-center tooltip-definition\",\"left\":-85,\"top\":18}" - ) Auto-Deploy - button.btn.btn-xs.btn-permissions.float-right( - internal-modal-helper = "inviteAdminModalView" - ng-if = "$root.featureFlags.webhooks" - ) - svg.iconnables.icons-alert.float-left - use( - xlink:href = "#icons-alert-alt" - ) - | Permissions - label.toggle-wrapper.float-right - //- this would not be enabled when an webhooks admin is not present - input.toggle-input( - ng-disabled = "$root.isLoading.autoDeploy || $root.featureFlags.webhooks" - ng-false-value = "true" - ng-model = "autoDeploy" - ng-model-options = "{getterSetter: true}" - ng-true-value = "false" - type = "checkbox" - ) - .toggle-group.toggle-xs( - ng-if = "!$root.featureFlags.webhooks || $root.featureFlags.webhooksAdminPresent" - ) diff --git a/client/directives/components/lists/branchCommitSelector/branchCommitSelectorView.jade b/client/directives/components/lists/branchCommitSelector/branchCommitSelectorView.jade index 5ca6ed0cd..aebf69d08 100644 --- a/client/directives/components/lists/branchCommitSelector/branchCommitSelectorView.jade +++ b/client/directives/components/lists/branchCommitSelector/branchCommitSelectorView.jade @@ -26,7 +26,7 @@ label.toggle-wrapper( .toggle-group.toggle-sm label.toggle-wrapper( - ng-if = "$root.featureFlags.testingFeature && BCSC.data.acv && !BCSC.data.acv.attrs.additionalRepo" + ng-if = "BCSC.data.acv && !BCSC.data.acv.attrs.additionalRepo" ) .strong Auto-Deploy .small Rebuild when new commits are pushed to GitHub. From 77a1356cb4826cf00b95983605f6ec7dbc3eef59 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 29 Aug 2016 11:07:57 -0700 Subject: [PATCH 064/577] responsive fixes --- client/assets/styles/scss/components/aha-sidebar.scss | 1 + client/directives/components/ahaGuide/ahaSidebarView.jade | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 38fccaa58..38c477466 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -63,6 +63,7 @@ .img-comment { border-bottom: 1px solid $gray-lightest; height: auto; + max-width: 100%; padding-bottom: 24px; } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 6b5f39ab8..77787349b 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -32,7 +32,7 @@ ) button.btn.btn-md.green.btn-spinner.btn-bear( ng-click = "$root.featureFlags.ahaOverview = false" - ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to CodeNow'}} + ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to Your Org'}} img.img( height = "130" src = "/build/images/runnabear-waving-1.png" From 1049e4cbedb5dcb8f80b346cae9b12ccce2529f5 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 29 Aug 2016 11:19:07 -0700 Subject: [PATCH 065/577] Cleaned up DOM conditionals and other non-feature flags --- client/controllers/controllerApp.js | 5 ++-- .../components/ahaGuide/AhaGuideController.js | 21 +++++++++------- .../components/ahaGuide/ahaPopoverView.jade | 2 +- .../ahaGuide/ahaSidebarController.js | 19 +++++---------- .../components/ahaGuide/ahaSidebarView.jade | 24 +++++++++---------- .../components/setUpRepositoryGuideView.jade | 4 ---- .../environment/environmentView.jade | 2 +- .../chooseOrganizationModalView.jade | 2 +- .../newContainerModalView.jade | 2 +- client/directives/navBar/viewNav.jade | 6 ++--- client/services/serviceAhaGuide.js | 1 + 11 files changed, 42 insertions(+), 46 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index f5386a216..997e4b33d 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -23,7 +23,6 @@ function ControllerApp( ModalService, pageName, currentOrg, - user, orgs, activeAccount @@ -91,9 +90,11 @@ function ControllerApp( this.featureFlagsChanged = featureFlags.changed; $rootScope.ahaGuide = { completedMilestones: $localStorage.completedMilestones, + showError: false, showSidebar: true, showOverview: true, - exitedEarly: false + exitedEarly: false, + showPopover: false }; $scope.$watch(function () { diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 5c2f99580..339d86ea5 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -12,6 +12,9 @@ function AhaGuideController( ) { var AHA = this; + if (!$rootScope.ahaGuide) { + $rootScope.ahaGuide = {}; + } $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); @@ -31,7 +34,8 @@ function AhaGuideController( exitedEarlyListener(); AHA.state.showError = true; updateCaption('exitedEarly'); - $rootScope.featureFlags.aha1 = false; + // $rootScope.featureFlags.aha1 = false; + $rootScope.ahaGuide.completedMilestones.aha1 = true; }); var tabListener = $scope.$on('updatedTab', function(event, tabName) { @@ -80,13 +84,11 @@ function AhaGuideController( console.log(update); var buildStatus = update.status; AHA.state.containerHostname = update.containerHostname; - if (buildStatus === 'buildFailed') { + if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { AHA.state.showError = true; } else if (buildStatus === 'starting') { - AHA.state.showError = false; - addVerificationListeners(AHA.state.containerHostname); - } else if (buildStatus === 'stopped') { - AHA.state.showError = true; + AHA.state.showError = false; + addVerificationListeners(AHA.state.containerHostname); } updateBuildStatus(buildStatus); } @@ -101,8 +103,9 @@ function AhaGuideController( $rootScope.doneListener = $rootScope.$on('close-popovers', function() { $rootScope.doneListener(); updateCaption('complete'); - $rootScope.featureFlags.aha1 = false; - $rootScope.featureFlags.aha2 = true; + $rootScope.ahaGuide.completedMilestones.aha1 = true; + $rootScope.ahaGuide.exitedEarly = false; + $rootScope.ahaGuide.showPopover = true; }); } @@ -123,10 +126,12 @@ function AhaGuideController( updateBuildStatus('cmdFailed'); AHA.state.showError = true; AHA.state.showBindingMSG = true; + $rootScope.ahaGuide.showError = AHA.state.showError; } }); } else { AHA.state.isBuildSuccessful = false; + $rootScope.ahaGuide.showError = AHA.state.showError; } }, 5000); } diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 54e8b1cb0..67caf5116 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -7,5 +7,5 @@ ) .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( - ng-click = "$root.featureFlags.aha2 = false" + ng-click = "$root.ahaGuide.showPopover = false" ) Got It diff --git a/client/directives/components/ahaGuide/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebarController.js index c2038d380..254b9e3db 100644 --- a/client/directives/components/ahaGuide/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebarController.js @@ -9,31 +9,24 @@ function AhaSidebarController( $rootScope, serviceAhaGuide ) { - console.log('instantiated'); + var ASC = this; - var showOverview; $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); + console.log($rootScope.ahaGuide); ASC.toggleOverview = function() { - ASC.state.showOverview = !ASC.state.showOverview; - $rootScope.ahaGuide.showOverview = ASC.state.showOverview; + $rootScope.ahaGuide.showOverview = !$rootScope.ahaGuide.showOverview; ASC.toggleSidebar(); }; ASC.toggleSidebar = function() { - ASC.state.showSidebar = !ASC.state.showSidebar; - $rootScope.ahaGuide.showSidebar = ASC.state.showSidebar; + $rootScope.ahaGuide.showSidebar = !$rootScope.ahaGuide.showSidebar; }; - console.log($rootScope.ahaGuide.completedMilestones); if ($rootScope.ahaGuide.completedMilestones.aha1) { - showOverview = false; + $rootScope.ahaGuide.showOverview = false; } else { - showOverview = true; + $rootScope.ahaGuide.showOverview = true; } - ASC.state = { - showOverview: showOverview, - showSidebar: true - }; } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 97c61a982..9b08d15b6 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,6 +1,6 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( - ng-click = "$root.featureFlags.ahaSidebar = false" + ng-click = "$root.ahaGuide.showSidebar = false" ng-if = "!$root.ahaGuide.showOverview" ) use( @@ -19,7 +19,7 @@ ) Get Started .grid-block.vertical .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" + ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha0}" ) .grid-block.shrink.aha-meter( ng-class = "{\ @@ -37,22 +37,22 @@ p.small This is the first step to success. .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" + ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha1 || !$root.ahaGuide.completedMilestones.aha0}" ) .grid-block.shrink.aha-meter( - ng-class = "[{\ - 'aha-error': state.showError,\ - },\ - AHA.state.className\ - ]" + ng-class = "{\ + 'aha-error': $root.ahaGuide.showError,\ + 'aha-meter-70': $root.ahaGuide.exitedEarly,\ + 'aha-meter-100': $root.ahaGuide.completedMilestones.aha1,\ + }" ) svg.iconnables use( - ng-if = "$root.featureFlags.aha1 && AHA.state.subStep < 9" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AHA.state.subStep >= 9" + ng-if = "$root.ahaGuide.completedMilestones.aha1" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text @@ -60,7 +60,7 @@ p.small Configure your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha3}" + ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha2 || !$root.ahaGuide.completedMilestones.aha1}" ) .grid-block.shrink.aha-meter( ng-class = "{\ @@ -82,7 +82,7 @@ p.small Your branches will update on every commit you make. .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha2}" + ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha3 || !$root.ahaGuide.completedMilestones.aha2}" ) .grid-block.shrink.aha-meter( ng-class = "{'aha-meter-50': $root.featureFlags.aha3}" diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 4b7744e98..b9a9d408d 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -96,7 +96,3 @@ ng-if = "AHA.state.subStep === 8 && !state.showError && !state.showVerification" ) Your build is looking good! Check out its URL and click ‘Done’ if it looks good to you. - //- in the popover - p.p( - ng-if = "$root.featureFlags.aha2" - ) Add more containers if your project requires it. Once you’re done, head to your containers to start adding branches. diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index f030070e1..6c3871b7f 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -98,7 +98,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.showOverview && !$root.ahaGuide.exitedEarly" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1 && !$root.ahaGuide.showOverview && !$root.ahaGuide.exitedEarly" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 610952ea9..61e3e3bc2 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -14,7 +14,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( aha-guide-directive - ng-if = "$root.featureFlags.aha && !$root.ahaGuideMilestones.aha0" + ng-if = "$root.featureFlags.aha && $root.featureFlags.aha0 && !$root.ahaGuide.completedMilestones.aha0" step-index = 0 sub-step = "orgSelection" sub-step-index = 0 diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 0a0ac6c4e..a4ee18786 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive ng-class = "{'p-slide js-animate': AHA.state.subStepIndex > 0}" - ng-if = "$root.featureFlags.aha1" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index a63053501..72daeddaa 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -6,7 +6,7 @@ //- aha menu .popover.right.in.popover-aha( - ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.exitedEarly" + ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.exitedEarly && $root.ahaGuide.showPopover" ng-include = "'ahaPopoverView'" ) @@ -21,7 +21,7 @@ a.a( | Configure a.a.disabled( - ng-if = "(dataApp.state.includes('base.config') && CA.instancesByPod && !CA.instancesByPod.models.length) || $root.featureFlags.aha1 || $root.featureFlags.aha1ExitedEarly" + ng-if = "(dataApp.state.includes('base.config') && CA.instancesByPod && !CA.instancesByPod.models.length) || !$root.ahaGuide.completedMilestones.aha1 || $root.ahaGuide.exitedEarly" tooltip = "You don’t have any running containers yet!" tooltip-options = "{\"class\":\"right\",\"left\":75,\"top\":17}" ) @@ -32,7 +32,7 @@ a.a.disabled( | Containers a.a( - ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && !$root.featureFlags.aha1 && !$root.featureFlags.aha1ExitedEarly" + ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && $root.ahaGuide.completedMilestones.aha1 && !$root.ahaGuide.exitedEarly" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index 47067b7ca..452e3a320 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -152,6 +152,7 @@ function serviceAhaGuide( success: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', stopped: 'Your container failed to run. Inspect your CMD logs for more information.', cmdFailed: 'Your container failed to run. Inspect your CMD logs for more information.', + crashed: 'Your container failed to run. Inspect your CMD logs for more information.', buildFailed: 'Your build failed. Inspect your build logs for more information.' } } From d32db2b9c14ffa52ebcefc6214d4fb0abea8df2d Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 29 Aug 2016 13:30:00 -0700 Subject: [PATCH 066/577] Addressing PR comment --- .../modals/modalSetupServer/setupServerModalController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 48f6844da..ede9b33f4 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -112,7 +112,7 @@ function SetupServerModalController( // if the blank docker file is chosen, we need to load it because it is already available if (dockerfileType === 'blankDockerfile') { - blankDockerfile = dockerfileType; + blankDockerfile = 'blankDockerfile'; SMC.openDockerfile({contextVersion: build.contextVersion}, SMC.openItems); } From 3df1fd2722cb7ebbbd555bc87c105ef43de11de7 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 29 Aug 2016 14:26:11 -0700 Subject: [PATCH 067/577] support for non-admin users --- .../styles/scss/components/aha-sidebar.scss | 39 ++++++---- .../components/ahaGuide/ahaSidebarView.jade | 78 +++++++++++-------- 2 files changed, 68 insertions(+), 49 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 38c477466..258ad174e 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -36,7 +36,8 @@ .icons-close { color: $gray; cursor: pointer; - margin-bottom: 15px; + margin-bottom: 18px; + margin-top: 3px; pointer-events: auto; &:hover, @@ -45,26 +46,34 @@ } } - .aha-overview { + .h4 { + border-bottom: 1px solid $gray-lightest; + line-height: 30px; + padding-bottom: 15px; + position: relative; - .h4 { - border-bottom: 1px solid $gray-lightest; - padding: 6px 0 18px; + .icons-close { + margin-bottom: 0; + position: absolute; + right: 0; } + } + + .img-comment { + border-bottom: 1px solid $gray-lightest; + height: auto; + max-width: 100%; + padding-bottom: 18px; + } + + .aha-overview { .p { - margin: 42px 0; + margin: 45px 0; } .small { - margin: 9px 0; - } - - .img-comment { - border-bottom: 1px solid $gray-lightest; - height: auto; - max-width: 100%; - padding-bottom: 24px; + margin-top: 15px; } .btn { @@ -73,7 +82,7 @@ } .btn-bear { - margin-top: 96px; + margin-top: 105px; position: relative; .img { diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 77787349b..034732f34 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -11,8 +11,8 @@ .grid-block.vertical.shrink.justify-center.text-center.aha-overview( ng-if = "$root.featureFlags.ahaOverview" ) - h4.h4.strong Welcome to your Sandbox! 👋 - p.p It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! + h4.h4.strong Welcome to Runnable! 👋 + p.p It’ll take a few steps to get your environment set up. But don’t worry — we’re here to help! button.grid-content.btn.btn-md.green( ng-click = "\ $root.featureFlags.ahaOverview = false;\ @@ -20,38 +20,6 @@ " ) Get Started -.grid-block.vertical.text-center.aha-overview( - ng-if = "$root.featureFlags.aha3" -) - h4.h4.strong You did it! - p.p You finished setting up! Now you can get helpful comments from Runnabot on your pull requests, like this one: - img.img.img-comment( - height = "116" - src = "/build/images/runnabot-comment.png" - width = "358" - ) - button.btn.btn-md.green.btn-spinner.btn-bear( - ng-click = "$root.featureFlags.ahaOverview = false" - ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to Your Org'}} - img.img( - height = "130" - src = "/build/images/runnabear-waving-1.png" - width = "230" - ) - //- if inviting Runnabot - //- .spinner-wrapper.spinner-sm.spinner-white.in( - //- ng-include = "'spinner'" - //- ) - .small.text-gray This may affect your GitHub bill. - a.link Details - .link.small.text-gray( - ng-click = "\ - $root.featureFlags.aha = false;\ - $root.featureFlags.aha3 = false;\ - $root.featureFlags.ahaSidebar = false;\ - " - ) Not now, thanks - .grid-block.vertical.aha-guide-wrapper( ng-if = "!$root.featureFlags.aha3" ) @@ -125,3 +93,45 @@ .grid-block.vertical.aha-text p.p.strong Add your First Branch p.small Your branches will update on every commit you make. + +.grid-block.vertical.text-center.aha-overview( + ng-if = "$root.featureFlags.aha3" +) + h4.h4.strong One more thing… + svg.iconnables.icons-close( + ng-click = "\ + $root.featureFlags.aha = false;\ + $root.featureFlags.aha3 = false;\ + $root.featureFlags.ahaSidebar = false;\ + " + ) + use( + xlink:href = "#icons-close" + ) + p.p You finished setting up! Now you can get helpful comments from Runnabot on your pull requests, like this one: + img.img.img-comment( + height = "116" + src = "/build/images/runnabot-comment.png" + width = "358" + ) + button.btn.btn-md.green.btn-spinner.btn-bear( + ng-click = "$root.featureFlags.ahaOverview = false" + ng-class = "{'disabled' : if user isn’t an admin}" + ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to Your Org'}} + img.img( + height = "130" + src = "/build/images/runnabear-waving-1.png" + width = "230" + ) + //- if inviting Runnabot + //- .spinner-wrapper.spinner-sm.spinner-white.in( + //- ng-include = "'spinner'" + //- ) + + //- if the user is an admin + .small This may affect your GitHub bill. + a.link Details + + //- if the user is not an admin + //- .small Sorry, you need to be an admin of your org to invite Runnabot. + a.link Learn more From 3a41158321e9b160c1a8eeeb1eddbb0f670788da Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 29 Aug 2016 14:27:26 -0700 Subject: [PATCH 068/577] add entrance transistion for add-branches popover --- client/assets/styles/scss/components/aha-popover.scss | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 4bd8d6d1a..1c023d579 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -31,6 +31,16 @@ top: -30px; transition: opacity .075s ease-in, transform .075s ease-in; + &.ng-enter { + opacity: 0; + transform: scale3d(.9,.9,1); + } + + &.ng-enter-active { + opacity: 1; + transform: scale3d(1,1,1); + } + &.ng-leave { opacity: 1; transform: scale3d(1,1,1); From 3390e2b77e276950b2e2a6adcab98055cdba42b7 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 29 Aug 2016 14:33:12 -0700 Subject: [PATCH 069/577] remove "add branch" header --- client/assets/styles/scss/popover/popover-branch-menu.scss | 2 +- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 4f51ac9e0..2cb2af5fc 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -1,6 +1,6 @@ .popover-branch-menu { max-width: 330px; - min-height: 150px; + min-height: 90px; width: 100%; .well { diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index cf88eb58c..b47b70df1 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -68,11 +68,12 @@ .popover-view.fade( ng-class = "{'in': isActivePanel()}" ) - .popover-header + .popover-header( + ng-if = "$root.featureFlags.autoIsolation" + ) svg.btn.btn-sm.iconnables.icons-arrow-backward( ng-class = "{'in': isActivePanel()}" ng-click = "goToPanel('branchMenu', 'back');" - ng-if = "$root.featureFlags.autoIsolation" ) use( xlink:href = "#icons-arrow-down" From 57eb0c42dc06f9903554e7fa081edf0a9612f001 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 14:33:48 -0700 Subject: [PATCH 070/577] Update terminology - Change references from config to template - Change references from Sandbox to environment - More consistent usage of container --- .../components/ahaGuide/ahaSidebarView.jade | 6 ++-- .../components/createSandboxGuideView.jade | 6 ++-- .../components/setUpRepositoryGuideView.jade | 16 +++++----- .../components/setUpRunnabotGuideView.jade | 2 +- .../components/buildLogs/buildLogsView.jade | 4 +-- .../containerStatusOptionsPopoverView.jade | 12 +++---- .../dnsConfigurationPopoverView.jade | 2 +- .../editRepoCommit/autoDeployTooltip.jade | 2 +- .../editRepoCommit/editRepoCommitView.jade | 2 +- .../confirmBranchRemoveView.jade | 6 ++-- .../confirmConfigDiscardView.jade | 6 ++-- .../instanceNavigationInternalsView.jade | 2 +- .../instanceNavigationPopoverView.jade | 32 +++++++++---------- .../isolationConfigurationModalView.jade | 12 +++---- .../mirrorDockerfileView.jade | 4 +-- .../confirmRollbackModalView.jade | 2 +- .../confirmSwitchToSimpleModeView.jade | 4 +-- .../readOnlySwitch/readOnlySwitchView.jade | 2 +- .../serverOptionsCardPopover.jade | 4 +-- .../environmentBody/viewCardGrid.jade | 2 +- .../modals/confirmDeleteServerView.jade | 6 ++-- .../modals/confirmDiscardServerView.jade | 2 +- .../modals/forms/formStack/viewFormStack.jade | 2 +- .../modals/forms/guideForm/guideFormView.jade | 2 +- .../whitelistForm/whitelistFormView.jade | 2 +- .../modals/modalRename/viewModalRename.jade | 6 ++-- .../nameNonRepoContainerView.jade | 8 ++--- .../popovers/viewPopoverFilesUpload.jade | 2 +- .../popovers/viewPopoverRenameContainer.jade | 6 ++-- .../directives/environment/newUserPrompt.jade | 2 +- .../tooltips/viewTooltipTools.jade | 2 +- client/directives/help/viewHelpPopover.jade | 2 +- .../branchMenuPopover/includesModalView.jade | 4 +-- .../branchSetupModal/branchSetupListView.jade | 2 +- .../branchSetupModalView.jade | 6 ++-- .../forms/pausedSandboxView.jade | 4 +-- .../forms/paymentDueView.jade | 2 +- .../gracePeriodModal/forms/trialEndView.jade | 2 +- .../chooseOrganizationModalView.jade | 10 +++--- .../viewModalDeleteSandbox.jade | 8 ----- .../modalGeneric/viewModalDeleteBox.jade | 4 +-- .../newContainerModalView.jade | 12 +++---- .../tooltips/viewCountainerTooltip.jade | 2 +- .../planSummary/planSummaryView.jade | 2 +- .../confirmationForm/confirmationForm.jade | 2 +- .../planStatus/planStatusForm.jade | 10 +++--- .../billingForm/trialForm/trialForm.jade | 4 +-- .../teamManagementFormView.jade | 2 +- client/directives/navBar/viewNav.jade | 2 +- .../viewMoreContainersPopover.jade | 2 +- .../viewPopoverFilesRepositoryOptions.jade | 2 +- .../instances/viewInstancesList.jade | 4 +-- client/templates/viewBranchSelection.jade | 28 ---------------- 53 files changed, 124 insertions(+), 160 deletions(-) delete mode 100644 client/directives/modals/modalDeleteSandbox/viewModalDeleteSandbox.jade delete mode 100644 client/templates/viewBranchSelection.jade diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 2123f5f67..d6835541a 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -9,7 +9,7 @@ .grid-block.vertical.shrink.justify-center.text-center.aha-overview( ng-if = "$root.featureFlags.ahaOverview" ) - .grid-content.strong Welcome to your Sandbox! 👋 + .grid-content.strong Let‘s get running! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.btn.btn-sm.green( ng-click = "\ @@ -33,7 +33,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Create your Sandbox + p.p.strong Choose an Organization p.small This is the first step to success. .grid-block.shrink.align-center.padding-sm.aha-guide( @@ -65,7 +65,7 @@ ) .grid-block.vertical.aha-text p.p.strong Add your First Repository - p.small Configure your project and get it running! + p.small Set up your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha3}" diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index dac339141..18c597adf 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -15,8 +15,8 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Create your Sandbox + p.p.small.text-gray-light Create your Environment p.p - {{state.showSubStep === 0 ? 'Choose an organization to create your sandbox for.' : ''}} + {{state.showSubStep === 0 ? 'Choose an organization to use on Runnable.' : ''}} {{state.showSubStep === 1 ? 'Hang tight!' : ''}} - {{state.showSubStep === 2 ? 'Continue to start configuring your project.' : ''}} + {{state.showSubStep === 2 ? 'Continue to set up your project.' : ''}} diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index aac0e19eb..6771df5b7 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -83,15 +83,15 @@ p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 1 && !state.showError && !state.showVerification" - ) Select a repository to configure. + ) Select a repository to set up. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 2 && !state.showError && !state.showVerification" - ) How would you like to configure your repo? + ) How would you like to set up your repo? p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 3 && !state.showError && !state.showVerification" - ) Give your configuration a name. + ) Give your template a name. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 4 && !state.showError && !state.showVerification" @@ -104,18 +104,18 @@ ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 6 && !state.showError && !state.showVerification" ) - | {{!state.fromMirroring ? 'If your app needs additional configuration…' : ''}} + | {{!state.fromMirroring ? 'If your app needs additional set up…' : ''}} | {{state.fromMirroring ? 'We‘ve imported your dockerfile, click ‘Save & Build’ to build it!' : ''}} //- | FROM BLANK DOCKERFILE: When you‘re done editing your dockerfile, click ‘Save & Build’ to build it! p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 7" ) - | {{!state.showError && !state.showVerification ? 'Now building. Build time varies depending on your configuration.' : ''}} - | {{state.showVerification ? 'Verifying Configuration…' : ''}} + | {{!state.showError && !state.showVerification ? 'Now building. Build time varies depending on your template.' : ''}} + | {{state.showVerification ? 'Verifying Template…' : ''}} | {{state.showErrorType === 'build' && state.showError ? 'Your build failed. Inspect your build logs for more information.' : ''}} | {{state.showErrorType === 'CMD' && state.showError ? 'Your container failed to run. Inspect your CMD logs for more information.' : ''}} - //- | IF DETENTION ERROR: Your container is running! But it looks like something is misconfigured. + //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. span.span( ng-if = "state.showErrorType === 'exitedEarly'" ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, @@ -132,4 +132,4 @@ //- in the popover p.p( ng-if = "$root.featureFlags.aha2" - ) Add more containers if your project requires it. Once you’re done, head to your containers to start adding branches. + ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. diff --git a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade index 6d7575e11..688aa4067 100644 --- a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade @@ -11,4 +11,4 @@ //- ) .grid-block.vertical.aha-text p.p.small.text-gray-light Set Up Runnabot - p.p Set up auto-branching before configuring Runnabot. + p.p Set up auto-branching before booting up Runnabot. diff --git a/client/directives/components/buildLogs/buildLogsView.jade b/client/directives/components/buildLogs/buildLogsView.jade index 89404ad7d..b1dadb311 100644 --- a/client/directives/components/buildLogs/buildLogsView.jade +++ b/client/directives/components/buildLogs/buildLogsView.jade @@ -11,11 +11,11 @@ ) p.p( ng-if = "!BLC.showNoDockerfileError" - ) Sorry, we ran into an issue trying to build your container. + ) Sorry, we ran into an issue while building. p.p( ng-if = "BLC.showNoDockerfileError" ) - | We couldn't find a Dockerfile to build your container with. + | We couldn't find a Dockerfile to build. | Does it exist in your repository? button.btn.btn-sm.purple( ng-click = "BLC.actions.rebuildWithoutCache()" diff --git a/client/directives/components/containerStatusButton/containerStatusOptionsPopoverView.jade b/client/directives/components/containerStatusButton/containerStatusOptionsPopoverView.jade index 0891951c9..755511ba1 100644 --- a/client/directives/components/containerStatusButton/containerStatusOptionsPopoverView.jade +++ b/client/directives/components/containerStatusButton/containerStatusOptionsPopoverView.jade @@ -31,7 +31,7 @@ ng-if = "!CSBC.instance.isMigrating() && !CSBC.isTesting() && ['running', 'stopped', 'crashed'].includes(CSBC.instance.status())" ) - //- rebuild without cache when no new config exists for this container + //- rebuild without cache when no new template exists for this container li.popover-list-item.multi-line( ng-click = "\ (!CSBC.instance.attrs.isolated && !CSBC.doesMatchMasterPod()) ? \ @@ -43,19 +43,19 @@ | {{CSBC.isTesting() ? 'Rerun Test' : 'Rebuild'}} .small {{CSBC.isTesting() ? 'Will rerun tests without cache.' : 'Will rebuild without cache.'}} - //- rebuild without cache when no new config exists for this container + //- rebuild without cache when no new template exists for this container li.popover-list-item.multi-line( ng-if = "$root.featureFlags.allowIsolatedUpdate && CSBC.instance.attrs.isolated && !CSBC.doesMatchMasterPod()" ng-click = "actions.updateConfigToMatchMaster()" ) .icons-status.orange - | Update Config and Rebuild - .small Will rebuild and update the configuration. + | Update Template and Rebuild + .small Will rebuild and update the template. .well.well-popover.orange.text-center.padding-xxs.small( ng-if = "(!CSBC.instance.attrs.isolated || $root.featureFlags.allowIsolatedUpdate) && !CSBC.doesMatchMasterPod()" - ) This container’s configuration has been changed. Rebuild to update. + ) This container’s template has been changed. Rebuild to update. - //- only show if the configuration has not been changed + //- only show if the template has not been changed .well.well-popover.orange.text-center.padding-xxs.small( ng-if = "['buildFailed', 'neverStarted'].includes(CSBC.instance.status()) && CSBC.doesMatchMasterPod()" ) Having build problems? Some errors can be resolved by rebuilding. diff --git a/client/directives/components/dnsConfiguration/dnsConfigurationPopoverView.jade b/client/directives/components/dnsConfiguration/dnsConfigurationPopoverView.jade index d4c0cce5b..316affea6 100644 --- a/client/directives/components/dnsConfiguration/dnsConfigurationPopoverView.jade +++ b/client/directives/components/dnsConfiguration/dnsConfigurationPopoverView.jade @@ -99,7 +99,7 @@ ul.list.popover-list( ng-if = "isActivePanel() && DCC.nonRepoDependencies.length !== 0" ) - li.list-item.small Service Containers + li.list-item.small Non-repository Containers li.list-item.popover-list-item.multi-line.disabled.grid-block.vertical.align-start( ng-repeat = "dependency in DCC.nonRepoDependencies" ) diff --git a/client/directives/components/editRepoCommit/autoDeployTooltip.jade b/client/directives/components/editRepoCommit/autoDeployTooltip.jade index 9f0f4e580..c928f143a 100644 --- a/client/directives/components/editRepoCommit/autoDeployTooltip.jade +++ b/client/directives/components/editRepoCommit/autoDeployTooltip.jade @@ -4,4 +4,4 @@ ) .arrow //- if disabled: Enable auto-deploy to automatically rebuild your container when new commits are pushed to GitHub. - .small.text-center Your container will rebuild when new commits are pushed to GitHub. + .small.text-center Will rebuild when new commits are pushed to GitHub. diff --git a/client/directives/components/editRepoCommit/editRepoCommitView.jade b/client/directives/components/editRepoCommit/editRepoCommitView.jade index d4d8e1055..6c310fc5a 100644 --- a/client/directives/components/editRepoCommit/editRepoCommitView.jade +++ b/client/directives/components/editRepoCommit/editRepoCommitView.jade @@ -90,7 +90,7 @@ ) .iconnables.icons-launch.float-left 🚀 span.underline.float-left( - tooltip = "Automatically rebuild your container when new commits are made." + tooltip = "Automatically rebuild when new commits are made." tooltip-options = "{\"class\":\"bottom center text-center tooltip-definition\",\"left\":-85,\"top\":18}" ) Auto-Deploy button.btn.btn-xs.btn-permissions.float-right( diff --git a/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade b/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade index 36f0a51bb..f53e99c66 100644 --- a/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade +++ b/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade @@ -1,8 +1,8 @@ .modal-backdrop.in .modal-dialog.modal-sm.modal-alert header.modal-body - p.p.strong Are you sure you want to remove this branch from your sandbox? - p.p You can add this branch again later, but any configuration changes will not be saved. + p.p.strong Are you sure you want to remove this branch from Runnable? + p.p You can add this branch again later, but any changes made to this template will not be saved. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left Cancel - button.btn.btn-sm.red.float-right Delete Branch \ No newline at end of file + button.btn.btn-sm.red.float-right Remove Branch diff --git a/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade b/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade index f68f8b8b9..7d3cc4227 100644 --- a/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade +++ b/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade @@ -1,8 +1,8 @@ .modal-backdrop.in .modal-dialog.modal-sm.modal-alert header.modal-body - p.p.strong Are you sure you want to discard this configuration? - p.p You will lose any changes you have made, and this container will rebuild using the master configuration. + p.p.strong Are you sure you want to discard this template? + p.p You will lose any changes you have made, and this container will rebuild with the master template. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left Cancel - button.btn.btn-sm.red.float-right Discard Configuration \ No newline at end of file + button.btn.btn-sm.red.float-right Discard Template diff --git a/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade b/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade index fbfc8465b..5997439a0 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationInternalsView.jade @@ -58,7 +58,7 @@ a.grid-block.align-center.a-sref( svg.grid-block.shrink.iconnables.icons-gear( ng-click="INC.editInstance($event)" ng-if = "$root.featureFlags.editAnyInstance || INC.instance.attrs.masterPod && !INC.instance.getBranchName() && !INC.instance.attrs.isolated && !$root.featureFlags.addBranches" - title = "Configure" + title = "Configure Template" ) use( xlink:href = "#icons-gear" diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index 914080cc0..c824395b7 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -16,7 +16,7 @@ use( xlink:href = "#icons-gear" ) - | Configure + | Configure Template .small Affects all [config-name] containers. ul.list.popover-list( @@ -29,10 +29,10 @@ use( xlink:href = "#icons-gear-modified" ) - | Configure + | Configure Template .small Affects only this container. - //- if this container has a modified configuration + //- if this container has a modified template //- li.list-item.popover-list-item.multi-line( //- internal-modal-helper = "confirmConfigDiscardView" //- ) @@ -40,8 +40,8 @@ use( xlink:href = "#icons-gear-delete" ) - | Discard Configuration - .small Restores master configuration. + | Discard Template Changes + .small To restore master template li.list-item.popover-list-item.divider( ng-if = "INC.instance.attrs.isIsolationGroupMaster" @@ -69,7 +69,7 @@ use( xlink:href = "#icons-gear" ) - | Configure + | Configure Template .small Affects all non-isolated [config-name] containers. ul.list.popover-list( @@ -79,8 +79,8 @@ ng-if = "!INC.instance.attrs.isolated" ) Isolating a branch allows you to… ul.list.list-bulleted - li.list-item Create a separate stack of your containers to use with this branch. - li.list-item Configure this branch differently from your default. + li.list-item Create a separate stack of your templates to use with this branch. + li.list-item Configure this branch independently from your master template. li.list-item.popover-list-item( ng-click = "INC.setupIsolation()" ng-if = "!INC.instance.attrs.isolated" @@ -102,7 +102,7 @@ use( xlink:href = "#icons-gear-modified" ) - | Configure + | Configure Template .small Affects only this container. li.divider @@ -123,7 +123,7 @@ use( xlink:href = "#icons-isolation-disable" ) - | Delete Container from Isolation + | Delete Template from Isolation li.list-item.popover-list-item( internal-modal-helper = "confirmBranchRemoveView" ng-if = "!INC.instance.attrs.isolated" @@ -139,13 +139,13 @@ ) //- menu items: - for an isolated branch: - - Configure Container + - Configure Template - (divider) - Add Container to Isolation - (divider) - Hide - for an isolated branch's containers: - - Configure Container + - Configure Template ul.list.popover-list li.list-item.popover-list-item( ng-click = "INC.editInstance($event)" @@ -155,7 +155,7 @@ use( xlink:href = "#icons-gear" ) - | Configure Container + | Configure Template li.divider( ng-if = "INC.instance.attrs.isolated" ) @@ -164,8 +164,8 @@ ) p.p Isolating a branch allows you to… ul.list.list-bulleted.small - li.list-item Create a separate stack of your containers to use with this branch. - li.list-item Configure this branch differently from your default. + li.list-item Create a separate stack of your templates to use with this branch. + li.list-item Configure this branch independently from your master template. .btn.btn-sm.btn-block.green( ng-click = "INC.setupIsolation()" ) Enter Isolation @@ -193,7 +193,7 @@ use( xlink:href = "#icons-isolation-disable" ) - | Delete Container from Isolation + | Delete Template from Isolation //- navListFilter li.divider( diff --git a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade index 50246fc34..b415069d3 100644 --- a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade +++ b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade @@ -11,7 +11,7 @@ section.modal-body .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm //- while we can only isolate with service containers: - | Select containers to create and isolate with + | Select templates to create and isolate with //- once we can isolate with service containers and repo containers: - | Selected containers will be isolated with .text-overflow( @@ -20,7 +20,7 @@ h4.grid-block.shrink.h4.text-gray.small.padding-xs( ng-if = "ICMC.repoInstances.length" - ) Repository Containers + ) Repository Templates .grid-block.vertical.shrink.list.list-bordered( ng-if = "ICMC.repoInstances.length" ) @@ -56,7 +56,7 @@ ) | {{instance.getMasterPodName()}} - //- this should get the class 'modded' if the selected branch uses a modified configuration + //- this should get the class 'modded' if the selected branch uses a modified template //- selecting this should automatically check the checkbox fancy-select.btn-xs.gray( value = "ICMC.instanceBranchMapping[instance.attrs.contextVersion.context]" @@ -70,12 +70,12 @@ ng-repeat = "child in $parent.instance.children.models" value = "child" ) {{$parent.child.getBranchName()}} - //- this element should only appear if the selected branch uses a modified configuration - //- small.small Branch uses a modified configuration + //- this element should only appear if the selected branch uses a modified template + //- small.small Branch uses a modified template h4.grid-block.shrink.h4.text-gray.small.padding-xs( ng-if = "ICMC.nonRepoInstances.length" - ) Non-Repository Containers + ) Non-Repository Templates .grid-block.vertical.shrink.list.list-bordered( ng-if = "ICMC.nonRepoInstances.length" ) diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index d08dc9380..3b3e9ae3f 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -21,7 +21,7 @@ use( xlink:href = "#icons-file-new" ) - .grid-content Configure with Runnable + .grid-content Set up with Runnable //- if there is only one, [check] by default input.checkbox( name = "dockerfile" @@ -39,7 +39,7 @@ small.small.text-gray.padding-xxs.label-from( ng-if = "!$root.isLoading.mirrorDockerfile && MDC.state.repo.dockerfiles.length > 0" -) Advanced Configuration +) Advanced Setup .grid-content.shrink.list.list-bordered( ng-if = "$root.featureFlags.blankDockerfile" diff --git a/client/directives/components/readOnlySwitch/confirmRollbackModalView.jade b/client/directives/components/readOnlySwitch/confirmRollbackModalView.jade index 885a7d469..3c81f3f0b 100644 --- a/client/directives/components/readOnlySwitch/confirmRollbackModalView.jade +++ b/client/directives/components/readOnlySwitch/confirmRollbackModalView.jade @@ -2,7 +2,7 @@ .modal-dialog.modal-sm.modal-alert header.modal-body p.p.strong Disable Dockerfile editing? - p.p Changes made to your Dockerfile will be discarded and your configuration will be restored to the state it was in before Dockerfile editing was enabled. + p.p Changes made to your Dockerfile will be discarded and your template will be restored to the state it was in before Dockerfile editing was enabled. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left( ng-click = "CMC.actions.cancel()" diff --git a/client/directives/components/readOnlySwitch/confirmSwitchToSimpleModeView.jade b/client/directives/components/readOnlySwitch/confirmSwitchToSimpleModeView.jade index 19ead6c79..6040d3f2d 100644 --- a/client/directives/components/readOnlySwitch/confirmSwitchToSimpleModeView.jade +++ b/client/directives/components/readOnlySwitch/confirmSwitchToSimpleModeView.jade @@ -7,8 +7,8 @@ use( xlink:href = "#icons-close" ) - p.p.strong.popover-title Disable editing and restore past configuration? - p.p Disabling will restore your container’s configuration from when editing was initially enabled. You can’t undo this action. + p.p.strong.popover-title Disable editing and restore past template? + p.p Disabling will restore your template from when editing was initially enabled. You can’t undo this action. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left( ng-click = "CMC.actions.cancel()" diff --git a/client/directives/components/readOnlySwitch/readOnlySwitchView.jade b/client/directives/components/readOnlySwitch/readOnlySwitchView.jade index 6f0a33690..0d21a8f50 100644 --- a/client/directives/components/readOnlySwitch/readOnlySwitchView.jade +++ b/client/directives/components/readOnlySwitch/readOnlySwitchView.jade @@ -7,6 +7,6 @@ input.toggle-input( .toggle-group.toggle-sm( tooltip tooltip-disabled = "!ROSC.state.instance || !ROSC.readOnly() || (ROSC.state.repo && ROSC.state.instance.attrs.lastBuiltSimpleContextVersion)" - tooltip-eval = "ROSC.state.repo ? 'We’re unable to disable editing. To resolve this, delete and re-create your container.' : 'Editing is always enabled on non-repository containers.'" + tooltip-eval = "ROSC.state.repo ? 'We’re unable to disable editing. To resolve this, delete and re-create your template.' : 'Editing is always enabled on non-repository templates.'" tooltip-options = "{\"class\":\"bottom bottom-arrow-right\",\"right\":0,\"top\":21}" ) diff --git a/client/directives/environment/environmentBody/serverCards/popoverServerOptions/serverOptionsCardPopover.jade b/client/directives/environment/environmentBody/serverCards/popoverServerOptions/serverOptionsCardPopover.jade index 4de4a76a4..7a877ce53 100644 --- a/client/directives/environment/environmentBody/serverCards/popoverServerOptions/serverOptionsCardPopover.jade +++ b/client/directives/environment/environmentBody/serverCards/popoverServerOptions/serverOptionsCardPopover.jade @@ -31,7 +31,7 @@ use( xlink:href = "#icons-server-modify" ) - | Rename Container + | Rename Template //- trigger delete confirm modal li.list-item.popover-list-item( ng-click = "actions.deleteServer()" @@ -40,4 +40,4 @@ use( xlink:href = "#icons-server-delete" ) - | Delete Container + | Delete Template diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index cc1b8a98c..de4d53537 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -18,7 +18,7 @@ use( xlink:href = "#icons-new-repository-server" ) - p.p Add your first repository container to get started. + p.p Add your first repository template to get started. //- server card .card.gray.disabled.load( diff --git a/client/directives/environment/modals/confirmDeleteServerView.jade b/client/directives/environment/modals/confirmDeleteServerView.jade index fd09b74dd..f2d1078a9 100644 --- a/client/directives/environment/modals/confirmDeleteServerView.jade +++ b/client/directives/environment/modals/confirmDeleteServerView.jade @@ -1,12 +1,12 @@ .modal-backdrop.in .modal-dialog.modal-sm.modal-alert header.modal-body - p.p.strong Are you sure you want to delete this container? - p.p Deleting this container cannot be undone. + p.p.strong Are you sure you want to delete this template? + p.p Deleting this template cannot be undone. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left( ng-click = "CMC.actions.cancel()" ) Cancel button.btn.btn-sm.red.float-right( ng-click = "CMC.actions.confirm()" - ) Delete Container \ No newline at end of file + ) Delete Template \ No newline at end of file diff --git a/client/directives/environment/modals/confirmDiscardServerView.jade b/client/directives/environment/modals/confirmDiscardServerView.jade index f78c038fd..f4939cd69 100644 --- a/client/directives/environment/modals/confirmDiscardServerView.jade +++ b/client/directives/environment/modals/confirmDiscardServerView.jade @@ -1,7 +1,7 @@ .modal-backdrop.in .modal-dialog.modal-sm.modal-alert header.modal-body - p.p.strong Are you sure you want to discard this container? + p.p.strong Are you sure you want to discard this template? footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left( ng-click = "CMC.actions.cancel()" diff --git a/client/directives/environment/modals/forms/formStack/viewFormStack.jade b/client/directives/environment/modals/forms/formStack/viewFormStack.jade index 9173ef411..99b578486 100644 --- a/client/directives/environment/modals/forms/formStack/viewFormStack.jade +++ b/client/directives/environment/modals/forms/formStack/viewFormStack.jade @@ -19,7 +19,7 @@ ) .grid-block.shrink.align-center.well.well-600.gray.padding-sm .grid-content - .strong.text-gray-dark This is a test container. + .strong.text-gray-dark This is a test template. small.small We’ll report your test results on your pull-requests on GitHub. label.toggle-wrapper.shrink input.toggle-input( diff --git a/client/directives/environment/modals/forms/guideForm/guideFormView.jade b/client/directives/environment/modals/forms/guideForm/guideFormView.jade index 229b434da..890a0c53f 100644 --- a/client/directives/environment/modals/forms/guideForm/guideFormView.jade +++ b/client/directives/environment/modals/forms/guideForm/guideFormView.jade @@ -1,4 +1,4 @@ -p.p.grid-content.shrink.text-center.text-gray.padding-sm You have the basic parts of your application configured! Many applications require additional configuration. Use our tools to configure options specific to your application before building. +p.p.grid-content.shrink.text-center.text-gray.padding-sm You have the basic parts of your application set up! Many applications require additional configuration. Use our tools to change options specific to your application before building. a.grid-content.shrink.link.small.text-gray( href = "#" ) View Setup Guide diff --git a/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade b/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade index 7864ca67e..bf1112192 100644 --- a/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade +++ b/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.well.well-600.gray.padding-sm .grid-content .strong.text-gray-dark Block External Access - small.small Prevents external access to this container. Internal access between containers is still allowed. + small.small Prevents external access to this template. Internal access between containers are still allowed. label.grid-content.toggle-wrapper.shrink input.toggle-input( ng-disabled = "WFC.isIsolationGroupMaster" diff --git a/client/directives/environment/modals/modalRename/viewModalRename.jade b/client/directives/environment/modals/modalRename/viewModalRename.jade index 61022489b..16ff2ff31 100644 --- a/client/directives/environment/modals/modalRename/viewModalRename.jade +++ b/client/directives/environment/modals/modalRename/viewModalRename.jade @@ -11,7 +11,7 @@ name = "rename" ) label.label.clearfix - .label-col Rename Container + .label-col Rename Template .input-col div( ng-class = "{\ @@ -32,7 +32,7 @@ ) ul.list.list-bulleted.list-validation - li.list-item Choose a unique name in your Sandbox + li.list-item Choose a unique name for this template li.list-item( ng-class = "{'ng-invalid': rename.$error.pattern}" ) Use letters, numbers, and hyphens (-) @@ -55,4 +55,4 @@ ) Cancel button.btn.btn-md.green.float-right( ng-disabled = "!rename.newName.$viewValue.length || rename.$invalid" - ) Rename Container \ No newline at end of file + ) Rename Template diff --git a/client/directives/environment/modals/nameNonRepoContainer/nameNonRepoContainerView.jade b/client/directives/environment/modals/nameNonRepoContainer/nameNonRepoContainerView.jade index 470f60b1c..5df5fa1c3 100644 --- a/client/directives/environment/modals/nameNonRepoContainer/nameNonRepoContainerView.jade +++ b/client/directives/environment/modals/nameNonRepoContainer/nameNonRepoContainerView.jade @@ -1,7 +1,7 @@ .modal-backdrop .modal-dialog.modal-sm.modals-rename header.modal-header - h1.modal-heading.text-overflow Create Container + h1.modal-heading.text-overflow Create Template svg.iconnables.icons-close( ng-click = "MC.actions.cancel()" ) @@ -13,7 +13,7 @@ name = "nameForm" ) label.label.clearfix - .label-col Container Name + .label-col Template Name .input-col div( ng-attr-data-length = "{{19 - nameForm.newName.$viewValue.length}}" @@ -38,7 +38,7 @@ ul.list.list-bulleted.list-validation li.list-item( ng-class = "{'ng-invalid': nameForm.$error.unique}" - ) Choose a unique name in your Sandbox + ) Choose a unique name for this template li.list-item( ng-class = "{'ng-invalid': nameForm.$error.pattern || nameForm.$error.noDoubleDash}" ) Use letters, numbers, and single hyphens (-) @@ -58,4 +58,4 @@ ng-include = "'spinner'" ng-if = "MC.saving" ) - span Create Container + span Create Template diff --git a/client/directives/environment/modals/popovers/viewPopoverFilesUpload.jade b/client/directives/environment/modals/popovers/viewPopoverFilesUpload.jade index 13744709a..aa6658361 100644 --- a/client/directives/environment/modals/popovers/viewPopoverFilesUpload.jade +++ b/client/directives/environment/modals/popovers/viewPopoverFilesUpload.jade @@ -49,7 +49,7 @@ ng-model = "data.commands" spellcheck = "false" ) - small.small Add scripts to be run before your container is started. + small.small Add scripts to run before your container is started. .popover-footer.clearfix button.btn.btn-sm.green( diff --git a/client/directives/environment/modals/popovers/viewPopoverRenameContainer.jade b/client/directives/environment/modals/popovers/viewPopoverRenameContainer.jade index 212fbd529..5b0031f90 100644 --- a/client/directives/environment/modals/popovers/viewPopoverRenameContainer.jade +++ b/client/directives/environment/modals/popovers/viewPopoverRenameContainer.jade @@ -4,7 +4,7 @@ ng-class = "{'in': active}" ) .popover-content - h3.popover-title Rename Container + h3.popover-title Rename Template //- wrapper for validation div( @@ -26,7 +26,7 @@ ) ul.list.list-bulleted.list-validation - li.list-item Choose a unique name in your Sandbox + li.list-item Choose a unique name for this template li.list-item( ng-class = "{'ng-invalid': rename.$error.pattern}" ) Use letters, numbers, and hyphens (-) @@ -44,7 +44,7 @@ .popover-footer.clearfix button.btn.btn-sm.green( ng-disabled = "!rename.newName.$viewValue.length || rename.$invalid" - ) Rename Container + ) Rename Template button.btn.btn-sm.gray.btn-cancel( ng-click = "actions.cancel()" ) Cancel \ No newline at end of file diff --git a/client/directives/environment/newUserPrompt.jade b/client/directives/environment/newUserPrompt.jade index f62b73258..db6159008 100644 --- a/client/directives/environment/newUserPrompt.jade +++ b/client/directives/environment/newUserPrompt.jade @@ -5,7 +5,7 @@ svg.iconnables.icons-close( xlink:href = "#icons-close" ) h1.grid-content.h1.justify-center.text-center Welcome to Runnable! -p.p.text-center You made it to the configuration page, where you set up your app. We’ve got guides for common stacks to help you get started. +p.p.text-center You made it to the template page, where you set up your app. We’ve got guides for common stacks to help you get started. .grid-block a.grid-content.shrink.btn.btn-xs.purple( href = "https://runnable.zendesk.com/hc/en-us/articles/208383313-Node-js-" diff --git a/client/directives/environment/tooltips/viewTooltipTools.jade b/client/directives/environment/tooltips/viewTooltipTools.jade index a611c309a..995b0582c 100644 --- a/client/directives/environment/tooltips/viewTooltipTools.jade +++ b/client/directives/environment/tooltips/viewTooltipTools.jade @@ -29,4 +29,4 @@ xlink:href = "#icons-keys-files" ) | Files & SSH Keys - small.p.small Your configuration is saved when you enable editing and will be restored if you disable editing in the future. + small.p.small Your template is saved when you enable editing and will be restored if you disable editing in the future. diff --git a/client/directives/help/viewHelpPopover.jade b/client/directives/help/viewHelpPopover.jade index 05011b5a6..ace638f94 100644 --- a/client/directives/help/viewHelpPopover.jade +++ b/client/directives/help/viewHelpPopover.jade @@ -42,7 +42,7 @@ a.link( target = "_blank" href = "https://runnable.zendesk.com/hc/en-us/articles/205184275-How-can-containers-in-my-Runnable-Sandbox-communicate-with-each-other-" - ) Connect two containers together + ) Connect two templates together svg.iconnables.icons-link-external use( xlink:href = "#icons-link-external" diff --git a/client/directives/instances/instance/branchMenuPopover/includesModalView.jade b/client/directives/instances/instance/branchMenuPopover/includesModalView.jade index 9100d0fbc..065347c23 100644 --- a/client/directives/instances/instance/branchMenuPopover/includesModalView.jade +++ b/client/directives/instances/instance/branchMenuPopover/includesModalView.jade @@ -1,14 +1,14 @@ .modal-backdrop.in .modal-dialog.modal-sm.modal-includes header.modal-header - h1.modal-heading Select Containers + h1.modal-heading Select Templates svg.iconnables.icons-close use( xlink:href = "#icons-close" ) section.modal-body - .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm Select containers from your sandbox to be included with each branch. Changes will apply to all branches of repository-name. + .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm Select templates from your environment to be included with each branch. Changes will apply to all branches of repository-name. .grid-block.vertical.shrink( ng-include = "'branchSetupListView'" ) diff --git a/client/directives/instances/instance/branchSetupModal/branchSetupListView.jade b/client/directives/instances/instance/branchSetupModal/branchSetupListView.jade index 472bc5869..259223ec6 100644 --- a/client/directives/instances/instance/branchSetupModal/branchSetupListView.jade +++ b/client/directives/instances/instance/branchSetupModal/branchSetupListView.jade @@ -2,7 +2,7 @@ .empty.well.gray.padding-md( ng-if = "containers.length === 0" ) - .small.empty.text-center.text-gray Your sandbox doesn’t have any other containers yet, but you can continue and add containers later. + .small.empty.text-center.text-gray You don’t have any other templates yet, but you can continue and add more templates later. .grid-block.vertical.shrink.list.list-bordered .list-item.padding-xs diff --git a/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade b/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade index 45e14f9f9..820c7b865 100644 --- a/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade +++ b/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade @@ -45,7 +45,7 @@ .empty.well.gray.padding-md( ng-if = "branches.length === 0" ) - .small.empty.text-center.text-gray We couldn’t find any branches for this container, but you can continue and add branches later. + .small.empty.text-center.text-gray We couldn’t find any branches, but you can continue and add branches later. //- hide this on initial load, but show when paginating h4.grid-block.shrink.align-center.h4.text-gray.small.padding-xs @@ -106,7 +106,7 @@ ) h1.modal-heading.fade( ng-class = "{'in': isActivePanel()}" - ) Select Containers + ) Select Templates svg.iconnables.icons-close.fade( ng-class = "{'in': isActivePanel()}" ) @@ -120,7 +120,7 @@ //- do not show this if there are no containers .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm( ng-if = "containers.length > 0" - ) Select containers from your sandbox to be included with each branch. + ) Select templates to be included with each branch. .grid-block.vertical.shrink( ng-include = "'branchSetupListView'" diff --git a/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade b/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade index dcd894b9f..f14d646e1 100644 --- a/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade +++ b/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade @@ -12,13 +12,13 @@ span( title = "paws’d" ) paused - | your containers due to inactivity. Give us the go ahead and we’ll get you back up and running. + | your environment due to inactivity. Give us the go ahead and we’ll get you back up and running. footer.grid-block.vertical.modal-footer button.grid-content.btn.btn-md.green.icons-intercom( ng-click = "WBC.openIntercom()" ) Chat Now a.grid-content.link.text-gray.text-center( - href = "mailto:support@runnable.com?subject=I’m back! Please get my sandbox back up and running." + href = "mailto:support@runnable.com?subject=I’m back! Please get my environments back up and running." ) Email Support .grid-block.justify-center.modal-outer-footer( grace-period-footer diff --git a/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade b/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade index 670588c9e..9395cfe24 100644 --- a/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade +++ b/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade @@ -15,7 +15,7 @@ ng-if = "EAC.activeAccount.isInGrace()" ) strong.strong Note: - | Your containers will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. + | Your environment will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. hr.hr .grid-block.vertical.form-payment.fade( ng-class = "{'in': isActivePanel()}" diff --git a/client/directives/modals/gracePeriodModal/forms/trialEndView.jade b/client/directives/modals/gracePeriodModal/forms/trialEndView.jade index 2172c89a1..3bad71b46 100644 --- a/client/directives/modals/gracePeriodModal/forms/trialEndView.jade +++ b/client/directives/modals/gracePeriodModal/forms/trialEndView.jade @@ -17,7 +17,7 @@ | . small.grid-content.small.text-center.text-gray strong.strong Note: - | Your containers will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. + | Your environment will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. hr.hr .grid-block.vertical.form-payment.fade( ng-class = "{'in': isActivePanel()}" diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index e828f4709..e97832eaa 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -30,7 +30,7 @@ p.p.padding-xs.text-center.fade( ng-class = "{'in': isActivePanel()}" ng-if = "!$root.featureFlags.aha" - ) Choose an organization for your Sandbox. If you don’t see your organization, check if you’ve granted access + ) Choose an organization to use on Runnable. If you don’t see your organization, check if you’ve granted access a.link( href = "https://github.com/settings/connections/applications/d42d6634d4070c9d9bf9" target = "_blank" @@ -105,7 +105,7 @@ state.showSubStep = 1;\ " ng-disabled = "!data.selectedOrgName" - ) Create Sandbox + ) Confirm Organization animated-panel.modal-body.grid-block.vertical( name = "dockLoading" @@ -114,7 +114,7 @@ ng-class = "{'in': isActivePanel()}" ) //- dock spinning up - p.p.text-gray.padding-xs.text-center We’re spinning up a sandbox for your org. It’ll take about + p.p.text-gray.padding-xs.text-center We’re spinning up infrastructure for your org. It’ll take about strong.strong 10 minutes | . We’ll email you and update this page when it’s ready. .grid-block.align-center.justify-center.padding-sm @@ -129,7 +129,7 @@ ng-class = "{'in': isActivePanel()}" ) //- dock spun up - p.p.text-gray.padding-xs.text-center Your sandbox is ready for you now. + p.p.text-gray.padding-xs.text-center Thanks for waiting, we‘re ready for you now. //- show this button when done waiting footer.grid-block.vertical.modal-footer.fade( @@ -137,7 +137,7 @@ ) button.grid-block.align-center.justify-center.btn.btn-md.green( ng-click = "actions.selectAccount(data.selectedOrgName)" - ) Go to your Sandbox! + ) Go to Runnable .grid-block.justify-center.modal-outer-footer( grace-period-footer hide-choose-org = "true" diff --git a/client/directives/modals/modalDeleteSandbox/viewModalDeleteSandbox.jade b/client/directives/modals/modalDeleteSandbox/viewModalDeleteSandbox.jade deleted file mode 100644 index 58589d2e0..000000000 --- a/client/directives/modals/modalDeleteSandbox/viewModalDeleteSandbox.jade +++ /dev/null @@ -1,8 +0,0 @@ -.modal-dialog.modal-sm.modal-alert - section.modal-body - p.p.strong Are you sure you want to delete your private Sandbox? - footer.modal-footer.clearfix - button.btn.btn-sm.gray.float-left( - ng-click = "defaultActions.close()" - ) Cancel - button.btn.btn-sm.red.float-right Delete Private Sandbox \ No newline at end of file diff --git a/client/directives/modals/modalGeneric/viewModalDeleteBox.jade b/client/directives/modals/modalGeneric/viewModalDeleteBox.jade index c172213b1..ea169cddb 100755 --- a/client/directives/modals/modalGeneric/viewModalDeleteBox.jade +++ b/client/directives/modals/modalGeneric/viewModalDeleteBox.jade @@ -2,7 +2,7 @@ ng-click = "$event.stopPropagation()" ) header.modal-header - h1.modal-heading Delete Container + h1.modal-heading Delete Template svg.iconnables.icons-close( ng-click = "defaultActions.cancel()" ) @@ -22,4 +22,4 @@ actions.deleteInstance(data.deleteLinked);\ defaultActions.cancel();\ " - ) Delete Container \ No newline at end of file + ) Delete Template diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 0b6471925..255359cc2 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -74,7 +74,7 @@ ) h1.modal-heading( ng-if = "!$root.featureFlags.aha1" - ) Configuration Method + ) Set Up Method svg.iconnables.icons-close( ng-click = "MC.close()" ) @@ -155,7 +155,7 @@ ul.list.list-bulleted.list-validation li.list-item( ng-class = "{'ng-invalid': MC.nameForm.$error.unique}" - ) Choose a unique name in your Sandbox + ) Choose a unique name for your template li.list-item( ng-class = "{'ng-invalid': MC.nameForm.$error.pattern || MC.nameForm.$error.noDoubleDash}" ) Use letters, numbers, and single hyphens (-) @@ -174,15 +174,15 @@ MC.createBuildFromTemplate(MC.state.instanceName, MC.state.templateSource) \ " ) - //- should say "Next Step: Configure" if a repository container - //- should say "Create Container" if its a non-repository container + //- should say "Next Step: Setup" if a repository container + //- should say "Create Template" if its a non-repository container .spinner-wrapper.spinner-white.spinner-sm.in( ng-include = "'spinner'" ng-if = "$root.isLoading[MC.name + 'SingleRepo']" ) span( ng-if = "MC.state.repo" - ) Next Step: Configure + ) Next Step: Setup span( ng-if = "MC.state.templateSource" - ) Create Container + ) Create Template diff --git a/client/directives/modals/modalNewContainer/tooltips/viewCountainerTooltip.jade b/client/directives/modals/modalNewContainer/tooltips/viewCountainerTooltip.jade index 1d91a3e5b..7edc089ce 100644 --- a/client/directives/modals/modalNewContainer/tooltips/viewCountainerTooltip.jade +++ b/client/directives/modals/modalNewContainer/tooltips/viewCountainerTooltip.jade @@ -5,4 +5,4 @@ .arrow .small.text-center This repo already exists br - | in your sandbox + | in your environment diff --git a/client/directives/modals/settingsModal/forms/billingForm/components/planSummary/planSummaryView.jade b/client/directives/modals/settingsModal/forms/billingForm/components/planSummary/planSummaryView.jade index 7f7e71902..d0fc96d53 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/components/planSummary/planSummaryView.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/components/planSummary/planSummaryView.jade @@ -2,7 +2,7 @@ ng-if = 'plan' ) p.strong {{plan.name}} Plan - small.small Up to {{plan.maxConfigurations}} configurations + small.small Up to {{plan.maxConfigurations}} templates .grid-block.shrink.p.align-baseline( ng-if = 'plan' ) diff --git a/client/directives/modals/settingsModal/forms/billingForm/confirmationForm/confirmationForm.jade b/client/directives/modals/settingsModal/forms/billingForm/confirmationForm/confirmationForm.jade index d5a33a958..c65266b9c 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/confirmationForm/confirmationForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/confirmationForm/confirmationForm.jade @@ -17,7 +17,7 @@ footer.modal-footer.clearfix button.btn.btn-md.btn-block.green( ng-if = "currentOrg.poppa.isInActivePeriod()" - ) Go to your sandbox! + ) Go to your Environment button.btn.btn-md.btn-block.white( ng-click = "goToPanel('billingForm', 'back');" ng-if = "currentOrg.poppa.isInTrial()" diff --git a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade index 0649eb315..8088e35ed 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade @@ -1,7 +1,7 @@ //- changing plans .padding-md .clearfix - .label-col.full-width.text-center Configurations Used + .label-col.full-width.text-center Templates Used .meter( ng-class = "getMeterClass()" ) @@ -47,7 +47,7 @@ | per month .grid-content.shrink.small Up to strong.strong 2 - | configurations. + | Templates. .grid-block.vertical.align-center.card.card-plan.disabled.padding-sm.text-center( ng-class = "{'active': PSFC.plan.id === 'runnable-standard'}" @@ -69,7 +69,7 @@ | per month .grid-content.shrink.small Up to strong.strong 7 - | configurations. + | Templates. .grid-block.vertical.align-center.card.card-plan.disabled.padding-sm.text-center( ng-class = "{'active': PSFC.plan.id === 'runnable-plus'}" @@ -91,7 +91,7 @@ | per month .grid-content.shrink.small Up to strong.strong 15 - | configurations. + | Templates. label.grid-block.align-center.padding-xs.well.well-plan.well-summary.disabled( ng-if = "PSFC.discount" @@ -100,7 +100,7 @@ discount = "PSFC.discount" ) - p.grid-content.p.text-gray.text-center.padding-sm Your plan is automatically determined based on number of configurations at the end of each billing cycle. + p.grid-content.p.text-gray.text-center.padding-sm Your plan is automatically determined based on number of templates at the end of each billing cycle. .grid-block.justify-center button.grid-block.shrink.btn.btn-md.green( diff --git a/client/directives/modals/settingsModal/forms/billingForm/trialForm/trialForm.jade b/client/directives/modals/settingsModal/forms/billingForm/trialForm/trialForm.jade index 9715ab510..c07dc0a39 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/trialForm/trialForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/trialForm/trialForm.jade @@ -21,11 +21,11 @@ ng-if = "currentOrg.poppa.trialDaysRemaining() > 3" ) You have strong.strong {{currentOrg.poppa.trialDaysRemaining()}} days - | left in your trial with unlimited configurations. + | left in your trial with unlimited templates. p.grid-content.small.text-gray( ng-if = "currentOrg.poppa.trialDaysRemaining() <= 3" - ) You only have {{currentOrg.poppa.trialDaysRemaining()}} days left in your trial! Add your payment info to ensure your team has uninterrupted access to their sandbox. + ) You only have {{currentOrg.poppa.trialDaysRemaining()}} days left in your trial! Add your payment info to ensure your team has uninterrupted access to Runnable. .grid-block.btn-wrapper( diff --git a/client/directives/modals/settingsModal/forms/teamManagementForm/teamManagementFormView.jade b/client/directives/modals/settingsModal/forms/teamManagementForm/teamManagementFormView.jade index f1e7c0107..764e95717 100644 --- a/client/directives/modals/settingsModal/forms/teamManagementForm/teamManagementFormView.jade +++ b/client/directives/modals/settingsModal/forms/teamManagementForm/teamManagementFormView.jade @@ -27,7 +27,7 @@ .p.text-gray.text-center.padding-xs( ng-if = "state.fromTrialEnd" - ) We’ll only create or update containers for the selected users. + ) We’ll only create and update containers for the selected users. ol.list.list-bordered.list-teammates li.list-item( diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 1dbf2171b..1e2bbff40 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -18,7 +18,7 @@ a.a( use( xlink:href = "#icons-gear-dark" ) - | Configure + | Templates a.a.disabled( ng-if = "(dataApp.state.includes('base.config') && CA.instancesByPod && !CA.instancesByPod.models.length) || $root.featureFlags.aha1 || $root.featureFlags.aha1ExitedEarly" diff --git a/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade b/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade index 2675a4408..80c6cc6e3 100644 --- a/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade +++ b/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade @@ -2,7 +2,7 @@ ng-class = "{in: active}" ng-style = "popoverStyle.getStyle()" ) - .popover-header api Containers + .popover-header api input.input.input-xs.input-search( ng-model = "data.repoFilter" placeholder = "Filter by branch name" diff --git a/client/directives/repositorySelector/views/viewPopoverFilesRepositoryOptions.jade b/client/directives/repositorySelector/views/viewPopoverFilesRepositoryOptions.jade index c90fcd2bd..eaab64423 100644 --- a/client/directives/repositorySelector/views/viewPopoverFilesRepositoryOptions.jade +++ b/client/directives/repositorySelector/views/viewPopoverFilesRepositoryOptions.jade @@ -69,7 +69,7 @@ ng-model = "repoSelector.data.commands" spellcheck = "false" ) - small.small Add scripts to be run before your container is started. + small.small Add scripts to run before your container is started. .popover-footer.clearfix.fade( ng-class = "{'in': isActivePanel()}" diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 0f6b04122..a86ad13c1 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -17,7 +17,7 @@ p.p.text-center.text-gray-light.padding-sm( ) .grid-block.align-center.list-item-cluster.list-clusters-heading - span.grid-content.text-overflow Template Containers + span.grid-content.text-overflow Templates .list-item-cluster .grid-block.list-containers.vertical.text-overflow.open //- master repository containers @@ -66,7 +66,7 @@ p.p.text-center.text-gray-light.padding-sm( svg.grid-block.shrink.iconnables.icons-gear( ng-click = "CIS.editInstance(masterInstance)" ng-if = "!$root.featureFlags.addBranches" - title = "Configure" + title = "Configure Template" ) use( xlink:href = "#icons-gear" diff --git a/client/templates/viewBranchSelection.jade b/client/templates/viewBranchSelection.jade deleted file mode 100644 index 18df07073..000000000 --- a/client/templates/viewBranchSelection.jade +++ /dev/null @@ -1,28 +0,0 @@ -main.home.server-selection - img.logo.float-left( - height = "45" - src = "/build/images/runnable-logo-gray.svg" - width = "240" - ) - - h3.h3.header-thin Choose a container to run… - a.block-quote( - href = "#" - target = "_blank" - ) {{ message }} - //- spinner - .spinner-wrapper.spinner-md.in( - ng-if = "loading" - ng-include = "'spinner'" - ) - ol.list.list-bordered( - ng-show = "!loading" - ) - li.list-item( - ng-class = "{active: data.listExpand}" - ng-repeat = "instance in instances.models" - ) - .list-item-row( - ng-click = "selectInstance(instance)" - ) - h4.h4.header-thin {{ instance.attrs.name }} From f0b27e1533c42f28e918831b517f4f133226c988 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 14:34:50 -0700 Subject: [PATCH 071/577] update email copy --- .../modals/inviteAdminModal/inviteAdminModalController.js | 2 +- test/unit/controllers/inviteAdminModalController.unit.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/modals/inviteAdminModal/inviteAdminModalController.js b/client/directives/modals/inviteAdminModal/inviteAdminModalController.js index ad5538bd1..d6c609011 100644 --- a/client/directives/modals/inviteAdminModal/inviteAdminModalController.js +++ b/client/directives/modals/inviteAdminModal/inviteAdminModalController.js @@ -2,7 +2,7 @@ require('app') .controller('InviteAdminModalController', InviteAdminModalController); -var DEFAULT_MESSAGE = 'Join my Sandbox on Runnable, where we can run the code in CodeNow\'s repositories on demand.\n\nI need your admin permissions to enable some features. Thanks!'; +var DEFAULT_MESSAGE = 'Join me on Runnable, where we can run the code in CodeNow\'s repositories on demand.\n\nI need your admin permissions to enable some features. Thanks!'; function InviteAdminModalController( $state, diff --git a/test/unit/controllers/inviteAdminModalController.unit.js b/test/unit/controllers/inviteAdminModalController.unit.js index c856d5d1c..7cd94a31b 100644 --- a/test/unit/controllers/inviteAdminModalController.unit.js +++ b/test/unit/controllers/inviteAdminModalController.unit.js @@ -10,7 +10,7 @@ var $elScope; var $controller; var $rootScope; var $templateCache; -var DEFAULT_MESSAGE = 'Join my Sandbox on Runnable, where we can run the code in CodeNow\'s repositories on demand.\n\nI need your admin permissions to enable some features. Thanks!'; +var DEFAULT_MESSAGE = 'Join me on Runnable, where we can run the code in CodeNow\'s repositories on demand.\n\nI need your admin permissions to enable some features. Thanks!'; describe('InviteAdminModalController'.bold.underline.blue, function () { var ctx; From 38c1d9c6d06962b4101cd7c4ec665aed78ffe341 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 14:50:13 -0700 Subject: [PATCH 072/577] fix set up -> setup --- .../ahaGuide/components/setUpRepositoryGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 6771df5b7..614bc586c 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -104,7 +104,7 @@ ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 6 && !state.showError && !state.showVerification" ) - | {{!state.fromMirroring ? 'If your app needs additional set up…' : ''}} + | {{!state.fromMirroring ? 'If your app needs additional setup…' : ''}} | {{state.fromMirroring ? 'We‘ve imported your dockerfile, click ‘Save & Build’ to build it!' : ''}} //- | FROM BLANK DOCKERFILE: When you‘re done editing your dockerfile, click ‘Save & Build’ to build it! p.p( From 80028deaac0d3d1e4574959f55ce577e9bcf4ee0 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 15:03:12 -0700 Subject: [PATCH 073/577] update env header and new container header --- client/assets/styles/scss/modals/modals-server-select.scss | 5 +++-- .../environment/environmentHeader/viewEnvironmentHeader.jade | 2 +- .../modals/modalNewContainer/newContainerModalView.jade | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index f3b774f6b..6f047970a 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -33,7 +33,7 @@ .btn { align-items: center; - border: $input-border solid transparent; + border: 1px solid transparent; border-radius: $input-border-radius-lg; display: flex; font-size: 15px; @@ -49,7 +49,7 @@ @include media(xxs) { flex: 1 1 50%; flex-direction: column; - height: 96px; + height: 94px; padding: 15px; white-space: normal; } @@ -61,6 +61,7 @@ &:active, &.active { border-color: currentColor; + box-shadow: inset 0 0 0 1px $purple-light; color: $purple; } diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index f1c5bbce7..cfcdc11f8 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -61,7 +61,7 @@ button.grid-block.shrink.btn.btn-md.green( use( xlink:href = "#icons-add" ) - | Add Template + | Create Template button.grid-block.shrink.btn.btn-sm.gray.btn-aha( ng-click = "$root.featureFlags.ahaSidebar = true" diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 255359cc2..17b98baa0 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -26,7 +26,7 @@ use( xlink:href = "#icons-new-repository-server" ) - .btn-text.grid-block Create from a repository + .btn-text.grid-block Repository Template //- disable this button when loading a repository .grid-block.shrink.btn( ng-disabled = "$root.isLoading[MC.name + 'SingleRepo']" @@ -42,7 +42,7 @@ use( xlink:href = "#icons-server-new" ) - .btn-text.grid-block.vertical.text-left Create from a template + .btn-text.grid-block.vertical.text-left Non-Repository Template small.small For services and databases svg.iconnables.icons-close( ng-click = "MC.close()" From 8ff9c48818ee286397ec4fd191931a925e1ec5b1 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 15:18:55 -0700 Subject: [PATCH 074/577] update nav popover --- .../confirmConfigDiscardView.jade | 6 +++--- .../instanceNavigationPopoverView.jade | 20 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade b/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade index 7d3cc4227..88e95b41c 100644 --- a/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade +++ b/client/directives/components/instanceNavigtion/confirmConfigDiscardView.jade @@ -1,8 +1,8 @@ .modal-backdrop.in .modal-dialog.modal-sm.modal-alert header.modal-body - p.p.strong Are you sure you want to discard this template? - p.p You will lose any changes you have made, and this container will rebuild with the master template. + p.p.strong Are you sure you want to discard your changes? + p.p You will lose any changes you‘ve made, and this container will rebuild with the template configuration. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left Cancel - button.btn.btn-sm.red.float-right Discard Template + button.btn.btn-sm.red.float-right Discard Changes diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index c824395b7..96c9c0154 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -29,7 +29,7 @@ use( xlink:href = "#icons-gear-modified" ) - | Configure Template + | Configure .small Affects only this container. //- if this container has a modified template @@ -40,8 +40,8 @@ use( xlink:href = "#icons-gear-delete" ) - | Discard Template Changes - .small To restore master template + | Discard Changes + .small To restore template configuration li.list-item.popover-list-item.divider( ng-if = "INC.instance.attrs.isIsolationGroupMaster" @@ -79,8 +79,8 @@ ng-if = "!INC.instance.attrs.isolated" ) Isolating a branch allows you to… ul.list.list-bulleted - li.list-item Create a separate stack of your templates to use with this branch. - li.list-item Configure this branch independently from your master template. + li.list-item Create a separate environment to use with this branch. + li.list-item Configure this branch independently from your template. li.list-item.popover-list-item( ng-click = "INC.setupIsolation()" ng-if = "!INC.instance.attrs.isolated" @@ -102,7 +102,7 @@ use( xlink:href = "#icons-gear-modified" ) - | Configure Template + | Configure .small Affects only this container. li.divider @@ -123,7 +123,7 @@ use( xlink:href = "#icons-isolation-disable" ) - | Delete Template from Isolation + | Delete from Isolation li.list-item.popover-list-item( internal-modal-helper = "confirmBranchRemoveView" ng-if = "!INC.instance.attrs.isolated" @@ -164,8 +164,8 @@ ) p.p Isolating a branch allows you to… ul.list.list-bulleted.small - li.list-item Create a separate stack of your templates to use with this branch. - li.list-item Configure this branch independently from your master template. + li.list-item Create a separate environment to use with this branch. + li.list-item Configure this branch independently from your template. .btn.btn-sm.btn-block.green( ng-click = "INC.setupIsolation()" ) Enter Isolation @@ -193,7 +193,7 @@ use( xlink:href = "#icons-isolation-disable" ) - | Delete Template from Isolation + | Delete from Isolation //- navListFilter li.divider( From 0f3dafd3997bce9fb0700f46c483873ac933dfeb Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 29 Aug 2016 16:37:39 -0700 Subject: [PATCH 075/577] update copy --- client/directives/components/ahaGuide/ahaSidebarView.jade | 2 +- .../ahaGuide/components/createSandboxGuideView.jade | 4 ++-- .../isolationConfigurationModalView.jade | 2 +- .../modals/forms/whitelistForm/whitelistFormView.jade | 2 +- .../instance/branchMenuPopover/includesModalView.jade | 2 +- .../instance/branchSetupModal/branchSetupModalView.jade | 2 +- .../modals/gracePeriodModal/forms/pausedSandboxView.jade | 2 +- .../modals/gracePeriodModal/forms/paymentDueView.jade | 2 +- .../modals/gracePeriodModal/forms/trialEndView.jade | 2 +- .../modals/modalNewContainer/newContainerModalView.jade | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index d6835541a..e03a40eaa 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -33,7 +33,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Choose an Organization + p.p.strong Choose your Organization p.small This is the first step to success. .grid-block.shrink.align-center.padding-sm.aha-guide( diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index 18c597adf..d8a37dafe 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -15,8 +15,8 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Create your Environment + p.p.small.text-gray-light Choose your Organization p.p - {{state.showSubStep === 0 ? 'Choose an organization to use on Runnable.' : ''}} + {{state.showSubStep === 0 ? 'Which org do you want to use on Runnable?' : ''}} {{state.showSubStep === 1 ? 'Hang tight!' : ''}} {{state.showSubStep === 2 ? 'Continue to set up your project.' : ''}} diff --git a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade index b415069d3..6e0cdda72 100644 --- a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade +++ b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade @@ -11,7 +11,7 @@ section.modal-body .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm //- while we can only isolate with service containers: - | Select templates to create and isolate with + | Selected templates will be used to create containers for each branch of //- once we can isolate with service containers and repo containers: - | Selected containers will be isolated with .text-overflow( diff --git a/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade b/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade index bf1112192..aa0b1fd2a 100644 --- a/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade +++ b/client/directives/environment/modals/forms/whitelistForm/whitelistFormView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.well.well-600.gray.padding-sm .grid-content .strong.text-gray-dark Block External Access - small.small Prevents external access to this template. Internal access between containers are still allowed. + small.small Prevents external access to this template. Internal access between containers is still allowed. label.grid-content.toggle-wrapper.shrink input.toggle-input( ng-disabled = "WFC.isIsolationGroupMaster" diff --git a/client/directives/instances/instance/branchMenuPopover/includesModalView.jade b/client/directives/instances/instance/branchMenuPopover/includesModalView.jade index 065347c23..dafc6ae3e 100644 --- a/client/directives/instances/instance/branchMenuPopover/includesModalView.jade +++ b/client/directives/instances/instance/branchMenuPopover/includesModalView.jade @@ -8,7 +8,7 @@ ) section.modal-body - .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm Select templates from your environment to be included with each branch. Changes will apply to all branches of repository-name. + .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm Selected templates will be used to create containers for each branch. Changes will apply to all branches of repository-name. .grid-block.vertical.shrink( ng-include = "'branchSetupListView'" ) diff --git a/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade b/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade index 820c7b865..107c408bc 100644 --- a/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade +++ b/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade @@ -120,7 +120,7 @@ //- do not show this if there are no containers .grid-block.vertical.shrink.text-center.well.gray.small.padding-sm( ng-if = "containers.length > 0" - ) Select templates to be included with each branch. + ) Selected templates will be used to create containers for each branch. .grid-block.vertical.shrink( ng-include = "'branchSetupListView'" diff --git a/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade b/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade index f14d646e1..48b30dd8b 100644 --- a/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade +++ b/client/directives/modals/gracePeriodModal/forms/pausedSandboxView.jade @@ -12,7 +12,7 @@ span( title = "paws’d" ) paused - | your environment due to inactivity. Give us the go ahead and we’ll get you back up and running. + | your environments due to inactivity. Give us the go ahead and we’ll get you back up and running. footer.grid-block.vertical.modal-footer button.grid-content.btn.btn-md.green.icons-intercom( ng-click = "WBC.openIntercom()" diff --git a/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade b/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade index 9395cfe24..e45cf9f39 100644 --- a/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade +++ b/client/directives/modals/gracePeriodModal/forms/paymentDueView.jade @@ -15,7 +15,7 @@ ng-if = "EAC.activeAccount.isInGrace()" ) strong.strong Note: - | Your environment will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. + | Your environments will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. hr.hr .grid-block.vertical.form-payment.fade( ng-class = "{'in': isActivePanel()}" diff --git a/client/directives/modals/gracePeriodModal/forms/trialEndView.jade b/client/directives/modals/gracePeriodModal/forms/trialEndView.jade index 3bad71b46..9d19b91ac 100644 --- a/client/directives/modals/gracePeriodModal/forms/trialEndView.jade +++ b/client/directives/modals/gracePeriodModal/forms/trialEndView.jade @@ -17,7 +17,7 @@ | . small.grid-content.small.text-center.text-gray strong.strong Note: - | Your environment will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. + | Your environments will be paused in {{EAC.activeAccount.graceHoursRemaining()}} hours if we cannot process a payment method. hr.hr .grid-block.vertical.form-payment.fade( ng-class = "{'in': isActivePanel()}" diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 17b98baa0..812e297fe 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -74,7 +74,7 @@ ) h1.modal-heading( ng-if = "!$root.featureFlags.aha1" - ) Set Up Method + ) Setup Method svg.iconnables.icons-close( ng-click = "MC.close()" ) From 76da0fe56bb09467a8fa1efeb0eaedcc3411989c Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 16:47:31 -0700 Subject: [PATCH 076/577] update milestone 4 state --- .../styles/scss/components/aha-sidebar.scss | 16 ---------- .../components/ahaGuide/ahaSidebarView.jade | 29 ++++++++----------- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 258ad174e..57b1fd88e 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -60,10 +60,8 @@ } .img-comment { - border-bottom: 1px solid $gray-lightest; height: auto; max-width: 100%; - padding-bottom: 18px; } .aha-overview { @@ -80,20 +78,6 @@ align-self: center; margin-top: 18px; } - - .btn-bear { - margin-top: 105px; - position: relative; - - .img { - left: 0; - margin: 0 auto; - pointer-events: none; - position: absolute; - right: 0; - top: -120px; - } - } } .aha-guide-wrapper { diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 034732f34..f0b4a991b 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -97,7 +97,7 @@ .grid-block.vertical.text-center.aha-overview( ng-if = "$root.featureFlags.aha3" ) - h4.h4.strong One more thing… + h4.h4.strong You did it! svg.iconnables.icons-close( ng-click = "\ $root.featureFlags.aha = false;\ @@ -108,30 +108,25 @@ use( xlink:href = "#icons-close" ) - p.p You finished setting up! Now you can get helpful comments from Runnabot on your pull requests, like this one: + p.p Invite Runnabot to your org to get helpful comments on your pull requests: img.img.img-comment( height = "116" src = "/build/images/runnabot-comment.png" width = "358" ) - button.btn.btn-md.green.btn-spinner.btn-bear( + button.btn.btn-md.green.btn-spinner( ng-click = "$root.featureFlags.ahaOverview = false" - ng-class = "{'disabled' : if user isn’t an admin}" - ) {{runnabot.inviting ? 'Inviting Runnabot' : 'Invite Runnabot to Your Org'}} - img.img( - height = "130" - src = "/build/images/runnabear-waving-1.png" - width = "230" - ) + ng-class = "{'disabled' : if user isn’t an admin || if loading}" + ) Invite Runnabot //- if inviting Runnabot //- .spinner-wrapper.spinner-sm.spinner-white.in( //- ng-include = "'spinner'" //- ) - //- if the user is an admin - .small This may affect your GitHub bill. - a.link Details - - //- if the user is not an admin - //- .small Sorry, you need to be an admin of your org to invite Runnabot. - a.link Learn more + .small.text-gray + //- if the user is an admin: + | This may affect your GitHub bill. + //- if the user is not an admin: + //- | Sorry, you need to be an admin of your org to invite Runnabot. + br + a.link More about Runnabot From 6b28bf0800dd6c1039af188a53631aa8c4d4544d Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 29 Aug 2016 17:35:31 -0700 Subject: [PATCH 077/577] fix capitalization --- .../forms/billingForm/planStatus/planStatusForm.jade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade index 8088e35ed..a80dbed15 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade @@ -47,7 +47,7 @@ | per month .grid-content.shrink.small Up to strong.strong 2 - | Templates. + | templates. .grid-block.vertical.align-center.card.card-plan.disabled.padding-sm.text-center( ng-class = "{'active': PSFC.plan.id === 'runnable-standard'}" @@ -69,7 +69,7 @@ | per month .grid-content.shrink.small Up to strong.strong 7 - | Templates. + | templates. .grid-block.vertical.align-center.card.card-plan.disabled.padding-sm.text-center( ng-class = "{'active': PSFC.plan.id === 'runnable-plus'}" @@ -91,7 +91,7 @@ | per month .grid-content.shrink.small Up to strong.strong 15 - | Templates. + | templates. label.grid-block.align-center.padding-xs.well.well-plan.well-summary.disabled( ng-if = "PSFC.discount" From 835fbb57a31812c65d085a583796e2e91741718b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 29 Aug 2016 17:46:07 -0700 Subject: [PATCH 078/577] Added AHA function to popover directive --- .../components/ahaGuide/AhaGuideController.js | 16 +++++++++++----- .../ahaGuide/ahaGuideMenuPopoverView.jade | 6 ++++-- .../components/ahaGuide/ahaGuideView.jade | 1 + .../components/ahaGuide/ahaPopoverView.jade | 2 +- client/directives/popovers/popOverDirective.js | 1 + 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 339d86ea5..90a1c458b 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -16,6 +16,8 @@ function AhaGuideController( $rootScope.ahaGuide = {}; } + AHA.exitingEarly = exitingEarly; + $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); var alertListener = $scope.$on('alert', function(event, alert) { @@ -31,11 +33,7 @@ function AhaGuideController( }); var exitedEarlyListener = $scope.$on('exitedEarly', function() { - exitedEarlyListener(); - AHA.state.showError = true; - updateCaption('exitedEarly'); - // $rootScope.featureFlags.aha1 = false; - $rootScope.ahaGuide.completedMilestones.aha1 = true; + exitingEarly(); }); var tabListener = $scope.$on('updatedTab', function(event, tabName) { @@ -136,6 +134,14 @@ function AhaGuideController( }, 5000); } + function exitingEarly() { + console.log('what'); + exitedEarlyListener(); + AHA.state.showError = true; + updateCaption('exitedEarly'); + $rootScope.ahaGuide.completedMilestones.aha1 = true; + } + // we need to unregister this animated panel listener if it exists // to avoid duplication if ($rootScope.animatedPanelListener) { diff --git a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade index 324ed00b4..aeac62750 100644 --- a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade @@ -6,6 +6,8 @@ .popover-content ul.list.popover-list li.list-item.popover-list-item( - ng-click = "$root.featureFlags.ahaSidebar = true" + ng-click = "$root.ahaGuide.showSidebar = true" ) View All - li.list-item.popover-list-item End Guide + li.list-item.popover-list-item( + ng-click = "$root.ahaGuide.completedMilestones.aha1 = true" + ) End Guide \ No newline at end of file diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 4352b483b..e5b542624 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -30,6 +30,7 @@ button.btn.btn-xs.white.btn-menu( pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" pop-over-template = "ahaGuideMenuPopoverView" + pop-over-func = "AHA.exitingEarly" ) svg.iconnables use( diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 67caf5116..4f0e18340 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -7,5 +7,5 @@ ) .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( - ng-click = "$root.ahaGuide.showPopover = false" + ng-click = "func()" ) Got It diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index fda8b35ab..7d5e805cd 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -14,6 +14,7 @@ var scopeVars = { noBroadcast: '=? popOverNoBroadcast', actions: '=? popOverActions', active: '=? popOverActive', + func: '=? popOverFunc', template: '= popOverTemplate', controller: '=? popOverController', controllerAs: '@? popOverControllerAs' From 94719ec085a8327a3df9b94b01a78449b86e3ea0 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 18:14:42 -0700 Subject: [PATCH 079/577] update sidebar --- .../styles/scss/components/aha-sidebar.scss | 49 +++++++------------ .../components/ahaGuide/ahaSidebarView.jade | 29 ++++++----- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 57b1fd88e..de64cd36c 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -33,12 +33,20 @@ transform: translate3d(100%,0,0); } + .aha-sidebar-header { + border-bottom: 1px solid $gray-lightest; + height: $input-md; + margin-bottom: 15px; + padding-bottom: 15px; + position: relative; + } + .icons-close { - color: $gray; + color: $gray-light; cursor: pointer; - margin-bottom: 18px; - margin-top: 3px; pointer-events: auto; + position: absolute; + right: 0; &:hover, &:active { @@ -46,45 +54,26 @@ } } - .h4 { - border-bottom: 1px solid $gray-lightest; - line-height: 30px; - padding-bottom: 15px; - position: relative; - - .icons-close { - margin-bottom: 0; - position: absolute; - right: 0; - } - } - - .img-comment { - height: auto; - max-width: 100%; - } - .aha-overview { + border-bottom: 1px solid $gray-lightest; + margin-bottom: 15px; .p { - margin: 45px 0; + margin-top: 30px; } - .small { - margin-top: 15px; + .img-comment { + height: auto; + margin: 30px 0; + max-width: 100%; } .btn { align-self: center; - margin-top: 18px; + margin-bottom: 30px; } } - .aha-guide-wrapper { - border-top: 1px solid $gray-lightest; - padding-top: 15px; - } - .aha-guide { animation: slide-left .45s ease-in-out forwards; background: $white; diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index f0b4a991b..d041e72d7 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,26 +1,30 @@ -.grid-block.shrink.align-center.justify-right( +.grid-block.shrink( ng-if = "!$root.featureFlags.ahaOverview && !$root.featureFlags.aha3" ) - svg.iconnables.icons-close( - ng-click = "$root.featureFlags.ahaSidebar = false" - ) - use( - xlink:href = "#icons-close" + header.grid-block.align-center.justify-center.aha-sidebar-header + h4.grid-content.strong.text-center.h4 Setup Guide + svg.grid-content.shrink.iconnables.icons-close( + ng-click = "$root.featureFlags.ahaSidebar = false" ) + use( + xlink:href = "#icons-close" + ) -.grid-block.vertical.shrink.justify-center.text-center.aha-overview( +.grid-block.shrink.vertical.aha-overview( ng-if = "$root.featureFlags.ahaOverview" ) - h4.h4.strong Welcome to Runnable! 👋 - p.p It’ll take a few steps to get your environment set up. But don’t worry — we’re here to help! - button.grid-content.btn.btn-md.green( + header.grid-block.vertical.shrink.align-center.justify-center.aha-sidebar-header + h4.grid-content.shrink.h4.text-center Welcome to Runnable! 👋 + .grid-block.shrink.vertical.padding-sm + p.grid-content.shrink.p.text-center It’ll take a few steps to get your environment set up. But don’t worry — we’re here to help! + button.grid-content.shrink.btn.btn-md.green( ng-click = "\ $root.featureFlags.ahaOverview = false;\ $root.featureFlags.ahaSidebar = false;\ " ) Get Started -.grid-block.vertical.aha-guide-wrapper( +.grid-block.shrink.vertical.aha-guide-wrapper( ng-if = "!$root.featureFlags.aha3" ) .grid-block.shrink.align-center.padding-sm.aha-guide( @@ -97,7 +101,8 @@ .grid-block.vertical.text-center.aha-overview( ng-if = "$root.featureFlags.aha3" ) - h4.h4.strong You did it! + header.grid-block.shrink.align-center.justify-center.aha-sidebar-header + h4.grid-content.shrink.strong.text-center.h4 You did it! svg.iconnables.icons-close( ng-click = "\ $root.featureFlags.aha = false;\ From 213e87fd86724f9422fd487bc4da915b99c4b98f Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 18:36:09 -0700 Subject: [PATCH 080/577] move & first --- .../styles/scss/components/aha-popover.scss | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 1c023d579..3345e3729 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -15,16 +15,6 @@ } } - .arrow { - @include media(xxs) { - display: none; - } - } - - .popover-content { - @extend %padding-sm; - } - &.popover-add-branches { left: -60px; position: relative; @@ -56,4 +46,14 @@ right: 110px; } } + + .arrow { + @include media(xxs) { + display: none; + } + } + + .popover-content { + @extend %padding-sm; + } } From f43bab1dd18af0545e31fc4de5cc2a6bd567d9ef Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 19:05:28 -0700 Subject: [PATCH 081/577] remove extra border - fix close button in firefox --- client/assets/styles/scss/components/aha-sidebar.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index de64cd36c..16b4be3f7 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -47,6 +47,7 @@ pointer-events: auto; position: absolute; right: 0; + top: 0; &:hover, &:active { @@ -58,6 +59,10 @@ border-bottom: 1px solid $gray-lightest; margin-bottom: 15px; + &:last-child { + border-bottom: 0; + } + .p { margin-top: 30px; } From b95537e6c9af98f6ae720299baf8fe821c2f4e25 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 19:11:26 -0700 Subject: [PATCH 082/577] fix collapsing of sidebar --- client/directives/components/ahaGuide/ahaSidebarView.jade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index d041e72d7..fb33fe4e2 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -113,13 +113,13 @@ use( xlink:href = "#icons-close" ) - p.p Invite Runnabot to your org to get helpful comments on your pull requests: - img.img.img-comment( + p.grid-content.shrink.p Invite Runnabot to your org to get helpful comments on your pull requests: + img.grid-content.shrink.img.img-comment( height = "116" src = "/build/images/runnabot-comment.png" width = "358" ) - button.btn.btn-md.green.btn-spinner( + button.grid-content.shrink.btn.btn-md.green.btn-spinner( ng-click = "$root.featureFlags.ahaOverview = false" ng-class = "{'disabled' : if user isn’t an admin || if loading}" ) Invite Runnabot From ae4c2fa52ede11272254bdc656bccc23f2496aca Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 29 Aug 2016 19:57:36 -0700 Subject: [PATCH 083/577] fix discount margin --- client/assets/styles/scss/forms/forms-plan.scss | 5 +++++ .../forms/billingForm/planStatus/planStatusForm.jade | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/client/assets/styles/scss/forms/forms-plan.scss b/client/assets/styles/scss/forms/forms-plan.scss index 2c4fb70e5..a13c3f056 100644 --- a/client/assets/styles/scss/forms/forms-plan.scss +++ b/client/assets/styles/scss/forms/forms-plan.scss @@ -319,4 +319,9 @@ top: 12px; } } + + // spacing after plans + .plans-wrapper + .well-summary { + margin-bottom: 15px; + } } diff --git a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade index 0649eb315..4f1f9704f 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade @@ -26,7 +26,7 @@ .tick .tick - .grid-block.align-center + .grid-block.align-center.plans-wrapper .grid-block.vertical.align-center.card.card-plan.disabled.padding-sm.text-center( ng-class = "{'active': PSFC.plan.id === 'runnable-starter'}" ng-mouseenter = "preview = 'runnable-starter'" From 55da49f9bb5abdf60f8430d3e9633f2322978f85 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 30 Aug 2016 10:41:57 -0700 Subject: [PATCH 084/577] add feature flag to clarify mockup of add branch step --- .../directives/components/ahaGuide/ahaPopoverView.jade | 10 +++++++++- client/directives/navBar/viewNav.jade | 2 +- client/services/featureFlagService.js | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 13702aa13..5e5921045 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -1,8 +1,16 @@ .arrow.white .popover-content .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "!$root.featureFlags.ahaInContainersView" ng-include = "'ahaGuideView'" ng-init = "state.showStep = 1" ) -.grid-block.justify-right.popover-footer + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.ahaInContainersView" + ng-include = "'ahaGuideView'" + ng-init = "state.showStep = 2" + ) +.grid-block.justify-right.popover-footer( + ng-if = "!$root.featureFlags.ahaInContainersView" +) button.grid-block.shrink.btn.btn-sm.green Got It diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 1dbf2171b..90a650861 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -6,7 +6,7 @@ //- aha menu .popover.right.in.popover-aha( - ng-if = "$root.featureFlags.aha2 && !$root.featureFlags.aha1ExitedEarly" + ng-if = "$root.featureFlags.aha2 && !$root.featureFlags.aha1ExitedEarly && !$root.featureFlags.ahaInContainersView" ng-include = "'ahaPopoverView'" ) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index a38888ba4..ee7a36d6c 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -14,7 +14,8 @@ function featureFlags( aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config aha2: false, // step 3: add branch aha3: false, // step 4: runnabot - ahaOverview: false, // toggle sidebar + ahaInContainersView: false, // used to represent when the user is in the containers view + ahaOverview: false, // toggle aha intro in sidebar ahaSidebar: false, // toggle sidebar allowIsolatedUpdate: false, autoIsolation: false, From dc0b9960d7f5be17548d17ab6427d71d44c6556a Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 30 Aug 2016 13:13:47 -0700 Subject: [PATCH 085/577] add aha guide inside branch menu --- .../directives/components/ahaGuide/ahaPopoverView.jade | 5 ++++- .../ahaGuide/components/addBranchGuideView.jade | 10 ++++++++-- .../branchMenuPopover/branchMenuPopoverView.jade | 8 ++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 5e5921045..1bfd94b82 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -8,7 +8,10 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( ng-if = "$root.featureFlags.ahaInContainersView" ng-include = "'ahaGuideView'" - ng-init = "state.showStep = 2" + ng-init = "\ + state.showStep = 2;\ + state.showSubStep = 1;\ + " ) .grid-block.justify-right.popover-footer( ng-if = "!$root.featureFlags.ahaInContainersView" diff --git a/client/directives/components/ahaGuide/components/addBranchGuideView.jade b/client/directives/components/ahaGuide/components/addBranchGuideView.jade index c8f9e556b..bd1a0e66b 100644 --- a/client/directives/components/ahaGuide/components/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/components/addBranchGuideView.jade @@ -1,6 +1,7 @@ .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-33': $root.featureFlags.aha2,\ + 'aha-meter-33': $root.featureFlags.aha2 && state.showSubStep === 1,\ + 'aha-meter-66': $root.featureFlags.aha2 && state.showSubStep === 2,\ 'aha-meter-100': $root.featureFlags.aha3\ }" ) @@ -15,4 +16,9 @@ ) .grid-block.vertical.aha-text p.p.small.text-gray-light Add your First Branch - p.p Add a branch by clicking the + button next to a repository name. + p.p( + ng-if = "state.showSubStep === 1" + ) Click the + button next to any repository name. + p.p( + ng-if = "state.showSubStep === 2" + ) Select a branch to add. diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index b47b70df1..acf69787e 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -2,6 +2,14 @@ ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha2" + ng-include = "'ahaGuideView'" + ng-init = "\ + state.showStep = 2;\ + state.showSubStep = 2;\ + " + ) .arrow.white .grid-block.vertical.popover-content.empty( ng-if = "$root.featureFlags.autoIsolationSetup" From 674e35775a74a26bff25df14f03feade6da82788 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 30 Aug 2016 13:19:18 -0700 Subject: [PATCH 086/577] change wording for clarity --- .../components/editRepoCommit/editRepoCommitView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/editRepoCommit/editRepoCommitView.jade b/client/directives/components/editRepoCommit/editRepoCommitView.jade index c3ef721e8..24c8e2b50 100644 --- a/client/directives/components/editRepoCommit/editRepoCommitView.jade +++ b/client/directives/components/editRepoCommit/editRepoCommitView.jade @@ -81,4 +81,4 @@ ng-if = "autoDeploy()" xlink:href = "#icons-alert-alt" ) - | {{autoDeploy() ? 'Auto-Deploy Disabled' : 'Auto-Deploying'}} + | {{autoDeploy() ? 'Auto-Deploy Disabled' : 'Auto-Deploy Enabled'}} From d11ef832857276b9ede9dc01f61ae9376db76873 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 30 Aug 2016 10:20:11 -0700 Subject: [PATCH 087/577] Added proper logic for sidebar --- client/controllers/controllerApp.js | 4 +-- .../components/ahaGuide/ahaPopoverView.jade | 2 +- .../ahaGuide/ahaSidebarController.js | 7 ---- .../components/ahaGuide/ahaSidebarView.jade | 21 ++++++----- client/services/serviceAhaGuide.js | 36 ++++++++++--------- client/templates/viewInstance.jade | 8 ++--- 6 files changed, 38 insertions(+), 40 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 997e4b33d..3d39e9894 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -91,11 +91,11 @@ function ControllerApp( $rootScope.ahaGuide = { completedMilestones: $localStorage.completedMilestones, showError: false, - showSidebar: true, - showOverview: true, exitedEarly: false, showPopover: false }; + $rootScope.ahaGuide.showOverview = !$rootScope.ahaGuide.completedMilestones.aha1; + $rootScope.ahaGuide.showSidebar = !$rootScope.ahaGuide.completedMilestones.aha1; $scope.$watch(function () { return errs.errors.length; diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 4f0e18340..67caf5116 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -7,5 +7,5 @@ ) .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( - ng-click = "func()" + ng-click = "$root.ahaGuide.showPopover = false" ) Got It diff --git a/client/directives/components/ahaGuide/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebarController.js index 254b9e3db..cc05f96ee 100644 --- a/client/directives/components/ahaGuide/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebarController.js @@ -22,11 +22,4 @@ function AhaSidebarController( ASC.toggleSidebar = function() { $rootScope.ahaGuide.showSidebar = !$rootScope.ahaGuide.showSidebar; }; - - if ($rootScope.ahaGuide.completedMilestones.aha1) { - $rootScope.ahaGuide.showOverview = false; - } else { - $rootScope.ahaGuide.showOverview = true; - } - } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 9b08d15b6..1f5befac7 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,20 +1,19 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( ng-click = "$root.ahaGuide.showSidebar = false" - ng-if = "!$root.ahaGuide.showOverview" + ng-if = "!$root.ahaGuide.showOverview || $root.ahaGuide.completedMilestones.aha1" ) use( xlink:href = "#icons-close" ) .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.ahaOverview && $root.ahaGuide.showOverview" + ng-if = "$root.featureFlags.ahaOverview && !$root.ahaGuide.completedMilestones.aha1 && $root.ahaGuide.showOverview" ) .grid-content.strong Welcome to your Sandbox! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.btn.btn-sm.green( ng-click = "\ ASC.toggleOverview();\ - $root.ahaGuide.completedMilestones.aha1 = false;\ " ) Get Started .grid-block.vertical @@ -23,15 +22,19 @@ ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-50': $root.featureFlags.aha0,\ - 'aha-meter-100': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3\ + 'aha-meter-0': !$root.ahaGuide.completedMilestones.aha0,\ + 'aha-meter-100': $root.ahaGuide.completedMilestones.aha0\ }" ) svg.iconnables use( - ng-if = "$root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3" + ng-if = "$root.ahaGuide.completedMilestones.aha0" xlink:href = "#icons-check" ) + use( + ng-if = "!$root.ahaGuide.completedMilestones.aha0" + xlink:href = "#icons-cog" + ) .grid-block.vertical.aha-text p.p.strong Create your Sandbox p.small This is the first step to success. @@ -43,7 +46,7 @@ ng-class = "{\ 'aha-error': $root.ahaGuide.showError,\ 'aha-meter-70': $root.ahaGuide.exitedEarly,\ - 'aha-meter-100': $root.ahaGuide.completedMilestones.aha1,\ + 'aha-meter-100': $root.ahaGuide.completedMilestones.aha1\ }" ) svg.iconnables @@ -64,8 +67,8 @@ ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-33': $root.featureFlags.aha2,\ - 'aha-meter-100': $root.featureFlags.aha3\ + 'aha-meter-0': !$root.ahaGuide.completedMilestones.aha2,\ + 'aha-meter-100': $root.ahaGuide.completedMilestones.aha2\ }" ) svg.iconnables diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index 452e3a320..96812f4d2 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -18,11 +18,6 @@ function serviceAhaGuide( var _steps = [ { title: 'Create your Sandbox', - subStepCaptions: [ - 'Choose an organization to create your sandbox for.', - 'Hang tight!', - 'Continue to start configuring your project.' - ], subSteps: { orgSelection: { caption: 'Choose an organization to create your sandbox for.', @@ -45,17 +40,6 @@ function serviceAhaGuide( }, { title: 'Add your First Repository', - subStepCaptions: [ - 'Add your repository by clicking \'Add Configuration\'.', - 'Select a repository to configure', - 'How would you like to configure your repo?', - 'Give your configuration a name.', - 'What does your repository run?', - 'Choose commands and packages', - 'If your app needs additional configuration...', - 'Now building. Build times varies depending on your configuration', - 'Your build is looking good! Check out its url and click \'Done\' if it looks good to you.' - ], subSteps: { addRepository: { caption: 'Add your repository by clicking \'Add Configuration\'.', @@ -144,7 +128,6 @@ function serviceAhaGuide( step: 9 } }, - buildStatus: { building: 'Now building. Build time varies depending on your configuration', running: 'Verifying configuration... ', @@ -155,6 +138,25 @@ function serviceAhaGuide( crashed: 'Your container failed to run. Inspect your CMD logs for more information.', buildFailed: 'Your build failed. Inspect your build logs for more information.' } + }, + { + title: 'Add your first branch', + subSteps: { + addBranch: { + caption: 'Almost done! Click the + button next to a repo name to add a branch.', + className: 'aha-meter-33' + }, + dockLoading: { + caption: 'Hang tight!', + className: 'aha-meter-66' + }, + dockLoaded: { + caption: 'Continue to start configuring your project.', + className: 'aha-meter-100' + }, + }, + panelSteps: { + } } ]; diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index 11b078e0f..da94d32b3 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -24,14 +24,14 @@ ) .grid-block.align-center.justify-center( - ng-if = "$root.featureFlags.aha2" + ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.completedMilestones.aha2" ) .modal-dialog.modal-sm( ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive - step-index = 1 - sub-step = "addRepository" + step-index = 2 + sub-step = "addBranch" sub-step-index = 0 ) @@ -89,5 +89,5 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar-directive - ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar" + ng-if = "$root.featureFlags.aha && $root.ahaGuide.showSidebar" ) From bf66de3a1c86fdb9dc887c46883efb5595a5e200 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 30 Aug 2016 16:57:58 -0700 Subject: [PATCH 088/577] fix margin --- client/assets/styles/scss/forms/forms-plan.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/forms/forms-plan.scss b/client/assets/styles/scss/forms/forms-plan.scss index a13c3f056..85d8a2624 100644 --- a/client/assets/styles/scss/forms/forms-plan.scss +++ b/client/assets/styles/scss/forms/forms-plan.scss @@ -322,6 +322,6 @@ // spacing after plans .plans-wrapper + .well-summary { - margin-bottom: 15px; + margin-top: 15px; } } From e9b467d54f5839f9fa26af5d24dfe923a063e147 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 31 Aug 2016 10:24:19 -0700 Subject: [PATCH 089/577] Some cleanup --- .../components/ahaGuide/AhaGuideController.js | 2 -- .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../ahaGuide/ahaSidebarController.js | 1 - .../components/ahaGuide/ahaSidebarDirective.js | 2 +- .../environment/environmentView.jade | 4 ++-- .../setupServerModalController.js | 1 - client/services/serviceAhaGuide.js | 18 +----------------- 7 files changed, 5 insertions(+), 25 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 90a1c458b..20fefec04 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -79,7 +79,6 @@ function AhaGuideController( } function handleBuildUpdate(update) { - console.log(update); var buildStatus = update.status; AHA.state.containerHostname = update.containerHostname; if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { @@ -135,7 +134,6 @@ function AhaGuideController( } function exitingEarly() { - console.log('what'); exitedEarlyListener(); AHA.state.showError = true; updateCaption('exitedEarly'); diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 64ce65124..ac935b17f 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -21,7 +21,7 @@ function ahaGuideDirective( errorState: '=?' }, link: function ($scope, elem, attrs) { - // console.log($scope, elem, attrs); + } }; } diff --git a/client/directives/components/ahaGuide/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebarController.js index cc05f96ee..29b407a9f 100644 --- a/client/directives/components/ahaGuide/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebarController.js @@ -12,7 +12,6 @@ function AhaSidebarController( var ASC = this; $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); - console.log($rootScope.ahaGuide); ASC.toggleOverview = function() { $rootScope.ahaGuide.showOverview = !$rootScope.ahaGuide.showOverview; diff --git a/client/directives/components/ahaGuide/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebarDirective.js index 4675449cc..e647183c3 100644 --- a/client/directives/components/ahaGuide/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebarDirective.js @@ -15,7 +15,7 @@ function ahaSidebarDirective( controller: 'AhaSidebarController', controllerAs: 'ASC', link: function ($scope, elem, attrs) { - // console.log($scope, elem, attrs); + } }; } diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 6c3871b7f..b5313b43b 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -98,7 +98,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1 && !$root.ahaGuide.showOverview && !$root.ahaGuide.exitedEarly" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1 && !$root.ahaGuide.showOverview && !$root.ahaGuide.exitedEarly && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive @@ -109,7 +109,7 @@ .grid-block.card-grid.clearfix( ng-class = "{'padding-top': helpCards.getActiveCard().helpTop}" - ng-if = "!$root.featureFlags.aha1 || $root.ahaGuide.completedMilestones.aha1" + ng-if = "!$root.featureFlags.aha1 || $root.ahaGuide.completedMilestones.aha1 || data.instances.models.length" ng-include = "'viewCardGrid'" ) diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index f697c5bfe..7b6dbc5ff 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -272,7 +272,6 @@ function SetupServerModalController( containerHostname: containerHostname }); if (buildStatus === 'running') { - console.log(SMC.page); SMC.page = 'run'; } }); diff --git a/client/services/serviceAhaGuide.js b/client/services/serviceAhaGuide.js index 96812f4d2..6c6fa6927 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/serviceAhaGuide.js @@ -9,11 +9,7 @@ function serviceAhaGuide( keypather ) { - var ahaService = this; - var ahaMilestonesComplete; - var _state; - - ahaMilestonesComplete = getAhaMilestones(); + var ahaMilestonesComplete = getAhaMilestones(); var _steps = [ { @@ -165,20 +161,17 @@ function serviceAhaGuide( } function checkContainerStatus(url) { - ahaService.pendingRequest = true; return $http({ method: 'GET', url: url }) .then(function(data) { - ahaService.pendingRequest = false; if (data.status >= 200 && data.status < 300) { return true; } return false; }) .catch(function(err) { - console.log(err); return new Error(err); }); } @@ -207,15 +200,6 @@ function serviceAhaGuide( return ahaMilestones; } - function setState(state) { - _state = angular.extend({}, state); - return _state; - } - - function getState() { - return _state; - } - return { checkContainerStatus: checkContainerStatus, getAhaMilestones: getAhaMilestones, From bd33383aed1732dc15b962469b97a11b544925e9 Mon Sep 17 00:00:00 2001 From: thejsj Date: Wed, 31 Aug 2016 11:41:32 -0700 Subject: [PATCH 090/577] 4.18.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d110a945..0d9750bc3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.18.0", + "version": "4.18.1", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 29f885fcd7962a0418a28a72376e1586a2748e41 Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 31 Aug 2016 15:15:13 -0700 Subject: [PATCH 091/577] add verification for cmd logs --- .../styles/scss/modals/modals-guide.scss | 13 ++++++- .../components/setUpRepositoryGuideView.jade | 3 +- .../modals/forms/formLogs/viewFormLogs.jade | 37 ++++++++++--------- client/templates/svg/svgDefs.jade | 11 +++--- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/client/assets/styles/scss/modals/modals-guide.scss b/client/assets/styles/scss/modals/modals-guide.scss index 1bc1c8491..b3f151f5a 100644 --- a/client/assets/styles/scss/modals/modals-guide.scss +++ b/client/assets/styles/scss/modals/modals-guide.scss @@ -16,5 +16,16 @@ .modal-edit .aha-tips { margin-left: auto; margin-right: auto; - max-width: 360px; + + @include media(xxxs) { + flex-direction: column; + } + + .grid-content + .grid-content { + @include media(xxxs) { + margin-left: 0; + margin-top: 9px; + text-align: center; + } + } } diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 614bc586c..a89dd2e28 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -113,8 +113,7 @@ ) | {{!state.showError && !state.showVerification ? 'Now building. Build time varies depending on your template.' : ''}} | {{state.showVerification ? 'Verifying Template…' : ''}} - | {{state.showErrorType === 'build' && state.showError ? 'Your build failed. Inspect your build logs for more information.' : ''}} - | {{state.showErrorType === 'CMD' && state.showError ? 'Your container failed to run. Inspect your CMD logs for more information.' : ''}} + | {{state.showErrorType === 'build' || state.showErrorType === 'CMD' && state.showError ? 'Looks like there was an error! Inspect your logs for debug info.' : ''}} //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. span.span( ng-if = "state.showErrorType === 'exitedEarly'" diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 669b5756d..2ca276884 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -1,20 +1,3 @@ -.grid-block.shrink.justify-center.align-center.padding-xs.well.gray.aha-tips( - ng-if = "\ - !$root.isLoading.setupServerModalIsBuilding && \ - !SMC.isDirty() && \ - SMC.instance.status() === 'buildFailed' \ - " -) - svg.grid-content.shrink.iconnables - use( - xlink:href = "#icons-life-preserver" - ) - .grid-content.vertical - small.grid-content.small Having build problems? Some errors can be resolved by rebuilding the container. - button.btn.btn-xxs.orange( - ng-click = "SMC.rebuild(true, true)" - ) Rebuild Without Cache - //- tabs .btn-group.btn-toggle.btn-toggle-xs( ng-hide = "$root.featureFlags.fullScreen" @@ -83,3 +66,23 @@ pre.pre.log-wrapper( .floating-controls( ng-include = "'viewFloatingControls'" ) + +.grid-block.shrink.justify-center.align-center.padding-xs.well.gray.aha-tips( + ng-if = "\ + !$root.isLoading.setupServerModalIsBuilding && \ + !SMC.isDirty() && \ + SMC.instance.status() === 'buildFailed' \ + " +) + svg.grid-content.shrink.iconnables + use( + xlink:href = "#icons-life-preserver" + ) + small.grid-content.small + //- If build error: + | Build problems? Sometimes rebuilding the container can resolve errors, otherwise inspect your build logs. + //- IF CMD error: + //- | Your container is having trouble running. Check the CMD Logs and your CMD Command. + button.grid-content.btn.btn-xs.orange( + ng-click = "SMC.rebuild(true, true)" + ) Rebuild diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index c26a9f3b8..96b07f561 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -222,11 +222,12 @@ svg(xmlns='http://www.w3.org/2000/svg') path(d='M3.059,11.928c0.479-0.479,0.522-1.071-0.436-2.029s-1.55-0.915-2.029-0.436c-1,1.052-0.436,2.9-0.436,2.9S2.033,12.954,3.059,11.928z') path(d='M12.523,0C10.605,0,9.009,0.668,5.8,2.565c-2.433-0.818-3.983-0.344-5.298,0.97l1.857,1.857c-1.385,1.385-1.15,1.679,0.972,3.8c1.945,1.945,2.249,2.249,3.663,0.835l1.994,1.994c1.358-1.358,1.814-2.947,0.891-5.528C11.734,3.311,12.523,2.102,12.523,0z') symbol#icons-life-preserver(viewBox='0 0 18 18') - path(d='M16,9a7,7,0,1,0-7,7A7,7,0,0,0,16,9ZM4.8,9A4.2,4.2,0,1,1,9,13.2,4.2,4.2,0,0,1,4.8,9Z', transform='translate(-1.5 -1.5)', fill='#ffffff', stroke='#c4c4c4', stroke-miterlimit='10') - path(d='M4.316,3.134H5.685a0.673,0.673,0,0,1,.673.673V6.191a0.675,0.675,0,0,1-.675.675H4.316a0.673,0.673,0,0,1-.673-0.673V3.807a0.673,0.673,0,0,1,.673-0.673Z', transform='translate(10.572 3.5) rotate(135)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') - path(d='M12.515,3.134h1.369a0.673,0.673,0,0,1,.673.673V6.191a0.675,0.675,0,0,1-.675.675H12.515a0.673,0.673,0,0,1-.673-0.673V3.807A0.673,0.673,0,0,1,12.515,3.134Z', transform='translate(5.902 -9.369) rotate(45)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') - path(d='M4.316,11.334H5.685a0.673,0.673,0,0,1,.673.673v2.384a0.675,0.675,0,0,1-.675.675H4.316a0.673,0.673,0,0,1-.673-0.673V12.007a0.673,0.673,0,0,1,.673-0.673Z', transform='translate(-2.297 24.569) rotate(-135)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') - path(d='M12.515,11.334h1.369a0.673,0.673,0,0,1,.673.673v2.384a0.675,0.675,0,0,1-.675.675H12.515a0.673,0.673,0,0,1-.673-0.673V12.007A0.673,0.673,0,0,1,12.515,11.334Z', transform='translate(-6.967 11.7) rotate(-45)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') + path(d='M16,9a7,7,0,1,0-7,7A7,7,0,0,0,16,9ZM4.8,9A4.2,4.2,0,1,1,9,13.2,4.2,4.2,0,0,1,4.8,9Z', transform='translate(0 0)', fill='#fff', stroke='#c4c4c4', stroke-miterlimit='10') + path(d='M4.316,3.134H5.685a0.673,0.673,0,0,1,.673.673V6.191a0.675,0.675,0,0,1-.675.675H4.316a0.673,0.673,0,0,1-.673-0.673V3.807a0.673,0.673,0,0,1,.673-0.673Z', transform='translate(12.072 5) rotate(135)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') + path(d='M12.515,3.134h1.369a0.673,0.673,0,0,1,.673.673V6.191a0.675,0.675,0,0,1-.675.675H12.515a0.673,0.673,0,0,1-.673-0.673V3.807a0.673,0.673,0,0,1,.673-0.673Z', transform='translate(7.402 -7.869) rotate(45)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') + path(d='M4.316,11.334H5.685a0.673,0.673,0,0,1,.673.673v2.384a0.675,0.675,0,0,1-.675.675H4.316a0.673,0.673,0,0,1-.673-0.673V12.007a0.673,0.673,0,0,1,.673-0.673Z', transform='translate(-0.797 26.07) rotate(-135)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') + path(d='M12.515,11.334h1.369a0.673,0.673,0,0,1,.673.673v2.384a0.675,0.675,0,0,1-.675.675H12.515a0.673,0.673,0,0,1-.673-0.673V12.007A0.673,0.673,0,0,1,12.515,11.334Z', transform='translate(-5.468 13.2) rotate(-45)', fill='#ef7883', stroke='#c14444', stroke-miterlimit='10') + rect(width='18', height='18', fill='none') symbol#icons-lightning(viewBox='0 0 10.692 17.006') path(d='M9.643,7.053C9.557,6.886,9.386,6.782,9.199,6.782l-2.144,0l2.604-6.084c0.065-0.155,0.05-0.332-0.043-0.472C9.524,0.084,9.367,0,9.199,0H2.355c-0.237,0-0.442,0.167-0.49,0.399L0.01,9.405c-0.03,0.147,0.007,0.3,0.102,0.417C0.208,9.938,0.35,10.006,0.5,10.006h1.731l-0.585,6.417c-0.039,0.229,0.086,0.456,0.302,0.545c0.062,0.025,0.127,0.038,0.191,0.038c0.158,0,0.312-0.075,0.407-0.21l7.059-9.224C9.714,7.419,9.729,7.219,9.643,7.053z') symbol#icons-link(viewBox='0 0 18 18') From 55da022e85944506c61159a9564080a5a19dae43 Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 31 Aug 2016 15:58:10 -0700 Subject: [PATCH 092/577] combine errors in the aha guide --- .../components/setUpRepositoryGuideView.jade | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index a89dd2e28..35fef1a45 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -48,19 +48,9 @@ ng-if = "state.showSubStep === 7" ) Verify a.grid-content.shrink.red.small.link( - ng-click = "\ - state.showError = !state.showError;\ - state.showErrorType = 'CMD';\ - " - ng-if = "state.showSubStep === 7" - ) CMDErr - a.grid-content.shrink.red.small.link( - ng-click = "\ - state.showError = !state.showError;\ - state.showErrorType = 'build';\ - " + ng-click = "state.showError = !state.showError" ng-if = "state.showSubStep === 7" - ) BuildErr + ) Error a.grid-content.shrink.red.small.link( ng-click = "\ $root.featureFlags.aha1 = false;\ @@ -111,12 +101,15 @@ ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 7" ) + //- During the build: | {{!state.showError && !state.showVerification ? 'Now building. Build time varies depending on your template.' : ''}} + //- During the verification timeout: | {{state.showVerification ? 'Verifying Template…' : ''}} - | {{state.showErrorType === 'build' || state.showErrorType === 'CMD' && state.showError ? 'Looks like there was an error! Inspect your logs for debug info.' : ''}} + //- If there's an error (build or cmd): + | {{state.showError ? 'Looks like there was an error! Inspect your logs for debug info.' : ''}} //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. span.span( - ng-if = "state.showErrorType === 'exitedEarly'" + ng-if = "state.showError" ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, //- this link should open in intercom with the prefilled message: "I’m having trouble getting my first container up and running." From c70ba6d7730224cbf036e414574d7dbcdb07662c Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 31 Aug 2016 16:08:05 -0700 Subject: [PATCH 093/577] remove verification step --- .../components/setUpRepositoryGuideView.jade | 37 +++++++------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 35fef1a45..b52e6f0ae 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -1,8 +1,3 @@ -.grid-block.align-center.shrink.spinner-wrapper.spinner-md.spinner-gray.in.js-animate( - ng-if = "state.showVerification" - ng-include = "'spinner'" -) - .grid-block.shrink.aha-meter.js-animate( ng-class = "{\ 'aha-error': state.showError,\ @@ -17,7 +12,6 @@ 'aha-meter-90': state.showSubStep === 8,\ 'aha-meter-100': $root.featureFlags.aha2 || $root.featureFlags.aha3\ }" - ng-if = "!state.showVerification" ) svg.iconnables( ng-if = "!state.showError" @@ -43,10 +37,6 @@ ng-show = "state.showControls" style = "position: absolute; right: 0; top: 0;" ) - a.grid-content.shrink.red.small.link( - ng-click = "state.showVerification = !state.showVerification" - ng-if = "state.showSubStep === 7" - ) Verify a.grid-content.shrink.red.small.link( ng-click = "state.showError = !state.showError" ng-if = "state.showSubStep === 7" @@ -68,45 +58,44 @@ ) Next p.p.small.text-gray-light Add your First Repository p.p( - ng-if = "state.showSubStep === 0 && !state.showError && !state.showVerification" + ng-if = "state.showSubStep === 0 && !state.showError" ) Add your repository by clicking ‘Add Template. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 1 && !state.showError && !state.showVerification" + ng-if = "state.showSubStep === 1 && !state.showError" ) Select a repository to set up. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 2 && !state.showError && !state.showVerification" + ng-if = "state.showSubStep === 2 && !state.showError" ) How would you like to set up your repo? p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 3 && !state.showError && !state.showVerification" + ng-if = "state.showSubStep === 3 && !state.showError" ) Give your template a name. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 4 && !state.showError && !state.showVerification" + ng-if = "state.showSubStep === 4 && !state.showError" ) What does your repository run? p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 5 && !state.showError && !state.showVerification" + ng-if = "state.showSubStep === 5 && !state.showError" ) Choose commands and packages. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 6 && !state.showError && !state.showVerification" + ng-if = "state.showSubStep === 6 && !state.showError" ) | {{!state.fromMirroring ? 'If your app needs additional setup…' : ''}} | {{state.fromMirroring ? 'We‘ve imported your dockerfile, click ‘Save & Build’ to build it!' : ''}} - //- | FROM BLANK DOCKERFILE: When you‘re done editing your dockerfile, click ‘Save & Build’ to build it! + //- If the user selected to start with a blank dockerfile: + //- | When you‘re done editing your dockerfile, click ‘Save & Build’ to build it! p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 7" ) //- During the build: - | {{!state.showError && !state.showVerification ? 'Now building. Build time varies depending on your template.' : ''}} - //- During the verification timeout: - | {{state.showVerification ? 'Verifying Template…' : ''}} + | {{!state.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} //- If there's an error (build or cmd): - | {{state.showError ? 'Looks like there was an error! Inspect your logs for debug info.' : ''}} + | {{state.showError ? 'Looks like there‘s an error! Inspect your logs for debug info.' : ''}} //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. span.span( ng-if = "state.showError" @@ -118,8 +107,8 @@ p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 8 && !state.showError && !state.showVerification" - ) Your build is looking good! Check out its URL and click ‘Done’ if it looks good to you. + ng-if = "state.showSubStep === 8 && !state.showError" + ) Your build is looking good! Check out the URL, then click ‘Done’ if it looks good to you. //- in the popover p.p( From f7b697093791ce3bc24925aea8907448c7768410 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 31 Aug 2016 16:23:42 -0700 Subject: [PATCH 094/577] move add branches popover + add auto-launch popover --- .../styles/scss/components/aha-popover.scss | 32 ------------------- client/assets/styles/scss/index.scss | 1 + .../scss/popover/popover-add-branches.scss | 7 ++++ .../scss/popover/popover-branch-menu.scss | 7 ++++ .../components/addBranchGuideView.jade | 2 +- .../addBranchAhaPopoverView.jade | 7 ++++ .../autoLaunchAhaPopoverView.jade | 8 +++++ client/templates/instances/viewInstances.jade | 5 --- 8 files changed, 31 insertions(+), 38 deletions(-) create mode 100644 client/assets/styles/scss/popover/popover-add-branches.scss create mode 100644 client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade create mode 100644 client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 3345e3729..19b8fb652 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -15,38 +15,6 @@ } } - &.popover-add-branches { - left: -60px; - position: relative; - top: -30px; - transition: opacity .075s ease-in, transform .075s ease-in; - - &.ng-enter { - opacity: 0; - transform: scale3d(.9,.9,1); - } - - &.ng-enter-active { - opacity: 1; - transform: scale3d(1,1,1); - } - - &.ng-leave { - opacity: 1; - transform: scale3d(1,1,1); - } - - &.ng-leave-active { - opacity: 0; - transform: scale3d(.9,.9,1); - } - - .arrow { - left: auto; - right: 110px; - } - } - .arrow { @include media(xxs) { display: none; diff --git a/client/assets/styles/scss/index.scss b/client/assets/styles/scss/index.scss index 2c197ac9e..f7a0c5d09 100755 --- a/client/assets/styles/scss/index.scss +++ b/client/assets/styles/scss/index.scss @@ -155,6 +155,7 @@ // popover specific @import "popover/popover-account-menu"; +@import "popover/popover-add-branches"; @import "popover/popover-add-tab"; @import "popover/popover-branch-menu"; @import "popover/popover-card-status"; diff --git a/client/assets/styles/scss/popover/popover-add-branches.scss b/client/assets/styles/scss/popover/popover-add-branches.scss new file mode 100644 index 000000000..95b5493b3 --- /dev/null +++ b/client/assets/styles/scss/popover/popover-add-branches.scss @@ -0,0 +1,7 @@ +.popover.popover-add-branches { + max-width: 330px; + + .btn-menu { + margin-left: 20px; + } +} diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 2cb2af5fc..799fc4efd 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -3,6 +3,13 @@ min-height: 90px; width: 100%; + .aha-guide { + padding-bottom: 21px; + border-bottom: 1px solid $gray-lighter; + font-size: 15px; + margin: 6px 6px 0; + } + .well { margin-bottom: 6px; } diff --git a/client/directives/components/ahaGuide/components/addBranchGuideView.jade b/client/directives/components/ahaGuide/components/addBranchGuideView.jade index bd1a0e66b..859c3ad25 100644 --- a/client/directives/components/ahaGuide/components/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/components/addBranchGuideView.jade @@ -18,7 +18,7 @@ p.p.small.text-gray-light Add your First Branch p.p( ng-if = "state.showSubStep === 1" - ) Click the + button next to any repository name. + ) Click the + button next to any repo name. p.p( ng-if = "state.showSubStep === 2" ) Select a branch to add. diff --git a/client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade b/client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade new file mode 100644 index 000000000..6fc125ee3 --- /dev/null +++ b/client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade @@ -0,0 +1,7 @@ +.popover.right.popover-add-branches( + ng-class = "{'in': active}" + ng-style = "popoverStyle.getStyle()" +) + .grid-block( + ng-include = "'ahaPopoverView'" + ) diff --git a/client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade b/client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade new file mode 100644 index 000000000..8591f5063 --- /dev/null +++ b/client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade @@ -0,0 +1,8 @@ +//- if the user just added Runnabot and no repos have auto-launch enabled + this should point to the first repo in instances-list that has had a branch +.popover.right.padding-sm.in( + ng-class = "{'in': active}" + ng-style = "popoverStyle.getStyle()" +) + .arrow.white + p.p Get the most out of Runnabot by adding branches automatically. diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 683706571..c5cde1154 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -10,11 +10,6 @@ scroll-to = "a.a-sref.active" ) - .popover.bottom.in.popover-aha.popover-add-branches.js-animate( - ng-if = "$root.featureFlags.aha2" - ng-include = "'ahaPopoverView'" - ) - .list-instances-wrapper.grid-block.shrink.align-center.justify-center( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" From 450223cddb926cc68356e12b626ffb094d4ddf3b Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 31 Aug 2016 16:28:10 -0700 Subject: [PATCH 095/577] update detention errors --- client/assets/styles/scss/views/views-toolbar.scss | 2 +- .../ahaGuide/components/setUpRepositoryGuideView.jade | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/client/assets/styles/scss/views/views-toolbar.scss b/client/assets/styles/scss/views/views-toolbar.scss index 8276c1150..cbe359918 100644 --- a/client/assets/styles/scss/views/views-toolbar.scss +++ b/client/assets/styles/scss/views/views-toolbar.scss @@ -133,9 +133,9 @@ // web error button .btn-web-state { - color: rgba($orange,.75); cursor: default; font-family: $sans-serif; + opacity: .5; padding: 0; .icons-alert { diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index b52e6f0ae..fa2687109 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -96,14 +96,8 @@ | {{!state.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} //- If there's an error (build or cmd): | {{state.showError ? 'Looks like there‘s an error! Inspect your logs for debug info.' : ''}} - //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. - span.span( - ng-if = "state.showError" - ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, - //- this link should open in intercom with the prefilled message: - "I’m having trouble getting my first container up and running." - a.link ask our engineers - | ! + //- If detention error: + //- | Your container is running! But it looks like something has not been set up correctly. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" From 8b48b248c8bfd94cec833ead950c425229c4b48f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 31 Aug 2016 16:28:32 -0700 Subject: [PATCH 096/577] remove pagination from branch menu --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 5 ----- 1 file changed, 5 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index acf69787e..d4f32e5e1 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -155,8 +155,3 @@ use( xlink:href = "#icons-add" ) - li.list-item.grid-block.justify-justified.list-pagination( - ) - //- ng-if = "paginated" - button.btn.btn-xs.gray.grid-content Last 50 - button.btn.btn-xs.gray.grid-content Next 50 From 321abae8b0655c4fe8c11182ce215149d4b0ca5a Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 31 Aug 2016 16:57:07 -0700 Subject: [PATCH 097/577] clarify non-admin state --- client/directives/components/ahaGuide/ahaSidebarView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index fb33fe4e2..178e60a72 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -119,9 +119,9 @@ src = "/build/images/runnabot-comment.png" width = "358" ) + //- add disabled attr if inviting runnabot, or if user isn't an admin button.grid-content.shrink.btn.btn-md.green.btn-spinner( ng-click = "$root.featureFlags.ahaOverview = false" - ng-class = "{'disabled' : if user isn’t an admin || if loading}" ) Invite Runnabot //- if inviting Runnabot //- .spinner-wrapper.spinner-sm.spinner-white.in( @@ -132,6 +132,6 @@ //- if the user is an admin: | This may affect your GitHub bill. //- if the user is not an admin: - //- | Sorry, you need to be an admin of your org to invite Runnabot. + //- | Sorry, you’ll need help from an admin of your org to invite Runnabot. br a.link More about Runnabot From 35b848b47668333d58284458ee3754cc5d1179ea Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 31 Aug 2016 18:15:00 -0700 Subject: [PATCH 098/577] add milestone verification --- client/assets/images/runnabear-working.png | Bin 0 -> 18640 bytes client/assets/styles/scss/index.scss | 1 + .../scss/modals/modals-confirm-setup.scss | 13 +++++++++++ .../isolationConfigurationModalView.jade | 2 +- .../environment/modals/confirmSetupView.jade | 21 ++++++++++++++++++ client/directives/navBar/viewNav.jade | 13 ++++++++++- 6 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 client/assets/images/runnabear-working.png create mode 100644 client/assets/styles/scss/modals/modals-confirm-setup.scss create mode 100644 client/directives/environment/modals/confirmSetupView.jade diff --git a/client/assets/images/runnabear-working.png b/client/assets/images/runnabear-working.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8329c7fffd353d4c0e1f67c35bf49edf462491 GIT binary patch literal 18640 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 .img { + height: auto; + position: relative; + width: 180px; + z-index: 1; + } + + .modal-dialog { + margin-top: -13px; + } +} diff --git a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade index 6e0cdda72..820fe60cc 100644 --- a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade +++ b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade @@ -92,7 +92,7 @@ ) | {{instance.getDisplayName()}} - section.modal-footer.clearfix + footer.modal-footer.clearfix button.btn.btn-md.white.float-left( ng-click = "ICMC.close()" ng-disabled = "$root.isLoading.createIsolation" diff --git a/client/directives/environment/modals/confirmSetupView.jade b/client/directives/environment/modals/confirmSetupView.jade new file mode 100644 index 000000000..3ab285299 --- /dev/null +++ b/client/directives/environment/modals/confirmSetupView.jade @@ -0,0 +1,21 @@ +.modal-backdrop.modal-confirm-setup + img.img( + src = "/build/images/runnabear-working.png" + ) + .modal-dialog.modal-sm + .modal-body + svg.iconnables.icons-close( + ng-click = "SMC.actions.close()" + ) + use( + xlink:href = "#icons-close" + ) + .grid-block.vertical.padding-md + h3.grid-content.h3.text-center Is your project running? + p.grid-content.p.text-center.text-gray We recommend finishing setup before continuing. If you need help getting your project running, + //- Opens Intercom chat, and starts with "I need help setting up!": + a.link chat with our devs + | . + footer.modal-footer.clearfix + button.btn.btn-md.white.float-left Go Back + button.btn.btn-md.green.float-right It‘s Running! diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 1e2bbff40..0131a4ed6 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -32,7 +32,7 @@ a.a.disabled( | Containers a.a( - ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && !$root.featureFlags.aha1 && !$root.featureFlags.aha1ExitedEarly" + ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && !$root.featureFlags.aha1 && !$root.featureFlags.aha1ExitedEarly && !$root.featureFlags.aha2" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) @@ -42,6 +42,17 @@ a.a( ) | Containers +a.a( + ng-if = "$root.featureFlags.aha2" + internal-modal-helper = "confirmSetupView" +) + svg.iconnables.icons-server-dark + use( + xlink:href = "#icons-server-dark" + ) + | Containers + + a.a.btn-docs( href = "https://support.runnable.com" target = "_blank" From 0322d5478a0ec0073d14b6dd46e66d743c21ac36 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 31 Aug 2016 18:19:35 -0700 Subject: [PATCH 099/577] clarify github-ness of runnabot invite --- client/assets/images/runnabot-comment.png | Bin 16369 -> 22689 bytes .../styles/scss/components/aha-sidebar.scss | 7 +++++++ .../components/ahaGuide/ahaSidebarView.jade | 13 +++++++++---- client/templates/svg/svgDefs.jade | 2 ++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/client/assets/images/runnabot-comment.png b/client/assets/images/runnabot-comment.png index 01c464ff026af4aa0adca0193f2cd9f776177512..dec4a408ba6aae00e300cf8a1c399135f4d84030 100644 GIT binary patch literal 22689 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 Wv2?Kbu?=9J1-h?gaJNhY8u>3MZIkc- literal 16369 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 diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 16b4be3f7..794ce90aa 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -76,6 +76,13 @@ .btn { align-self: center; margin-bottom: 30px; + + .iconnables { + height: 21px; + margin-right: 6px; + top: 4px; + width: 21px; + } } } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 178e60a72..77e50d35b 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -102,7 +102,7 @@ ng-if = "$root.featureFlags.aha3" ) header.grid-block.shrink.align-center.justify-center.aha-sidebar-header - h4.grid-content.shrink.strong.text-center.h4 You did it! + h4.grid-content.shrink.strong.text-center.h4 You finished setup! svg.iconnables.icons-close( ng-click = "\ $root.featureFlags.aha = false;\ @@ -113,16 +113,21 @@ use( xlink:href = "#icons-close" ) - p.grid-content.shrink.p Invite Runnabot to your org to get helpful comments on your pull requests: + p.grid-content.shrink.p Now invite Runnabot to your GitHub org to get helpful comments on your pull requests: img.grid-content.shrink.img.img-comment( - height = "116" + height = "206" src = "/build/images/runnabot-comment.png" width = "358" ) //- add disabled attr if inviting runnabot, or if user isn't an admin button.grid-content.shrink.btn.btn-md.green.btn-spinner( ng-click = "$root.featureFlags.ahaOverview = false" - ) Invite Runnabot + ) + svg.iconnables.icons-octicons-github + use( + xlink:href = "#icons-octicons-github" + ) + | Invite Runnabot //- if inviting Runnabot //- .spinner-wrapper.spinner-sm.spinner-white.in( //- ng-include = "'spinner'" diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index c26a9f3b8..4ef04fb29 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -606,6 +606,8 @@ svg(xmlns='http://www.w3.org/2000/svg') symbol#icons-octicons-branch(viewBox='0 0 18 18') circle(cx='9', cy='9', r='9', fill='none') path(d='M11.747,5.129a1.481,1.481,0,0,1,1.5,1.5,1.415,1.415,0,0,1-.205.756,1.549,1.549,0,0,1-.545.533V8.129a3.011,3.011,0,0,1-.937,2.062,3.011,3.011,0,0,1-2.063.938,1.624,1.624,0,0,0-.7.135,1.218,1.218,0,0,0-.445.346,1.5,1.5,0,1,1-2.6,1.02,1.415,1.415,0,0,1,.205-0.756A1.549,1.549,0,0,1,6.5,11.34V6.43A1.549,1.549,0,0,1,5.952,5.9a1.415,1.415,0,0,1-.205-0.756,1.5,1.5,0,1,1,3,0,1.415,1.415,0,0,1-.205.756A1.549,1.549,0,0,1,8,6.43V9.981a3.087,3.087,0,0,1,1.5-.34,1.613,1.613,0,0,0,1.5-1.5V7.93A1.549,1.549,0,0,1,10.452,7.4a1.415,1.415,0,0,1-.205-0.756,1.481,1.481,0,0,1,1.5-1.5V5.129ZM6.719,4.614a0.738,0.738,0,1,0,1.055,0A0.736,0.736,0,0,0,6.719,4.614Zm1.055,8.555a0.738,0.738,0,1,0-1.055,0A0.736,0.736,0,0,0,7.774,13.168Zm4.5-6a0.738,0.738,0,1,0-1.055,0A0.736,0.736,0,0,0,12.274,7.168Z') + symbol#icons-octicons-github(viewBox='0 0 18 18') + path(d='M15.372,2.628a9.007,9.007,0,0,1,.888,11.68,9.062,9.062,0,0,1-4.412,3.234,0.515,0.515,0,0,1-.475-0.1,0.486,0.486,0,0,1-.141-0.343l0.018-2.461a2.9,2.9,0,0,0-.193-1.046,1.664,1.664,0,0,0-.422-0.624,5.256,5.256,0,0,0,2.8-1.011q1.239-.905,1.31-3.436a3.844,3.844,0,0,0-.255-1.336,3.427,3.427,0,0,0-.677-1.072,2.44,2.44,0,0,0,.176-0.809,3.7,3.7,0,0,0-.264-1.582,1.289,1.289,0,0,0-.6.026,5.553,5.553,0,0,0-1.881.905,8.62,8.62,0,0,0-4.5,0A5.553,5.553,0,0,0,4.87,3.753a1.289,1.289,0,0,0-.6-0.026,3.7,3.7,0,0,0-.264,1.582,2.44,2.44,0,0,0,.176.809,3.429,3.429,0,0,0-.677,1.072,3.844,3.844,0,0,0-.255,1.336q0.07,2.531,1.3,3.436a5.232,5.232,0,0,0,2.812,1.011,1.45,1.45,0,0,0-.36.475,2.56,2.56,0,0,0-.22.738,2.487,2.487,0,0,1-1.2.22,1.815,1.815,0,0,1-1.424-.976,2.414,2.414,0,0,0-.484-0.562,1.325,1.325,0,0,0-.888-0.352q-0.527.018-.4,0.229a0.993,0.993,0,0,0,.413.352,1.937,1.937,0,0,1,.562.615,4.326,4.326,0,0,1,.352.65,1.648,1.648,0,0,0,.738.879,3.375,3.375,0,0,0,2.285.193L6.768,17.1a0.486,0.486,0,0,1-.141.343,0.515,0.515,0,0,1-.475.1A9.064,9.064,0,0,1,1.74,14.308,9,9,0,0,1,15.372,2.628Z') symbol#icons-octicons-repo(viewBox='0 0 18 18') circle(cx='9', cy='9', r='9', fill='none') path(d='M13.293,4.446v7.806a0.63,0.63,0,0,1-.213.457,0.761,0.761,0,0,1-.5.193H9v1.3l-1.073-.976L6.854,14.2V12.9H5.422a0.761,0.761,0,0,1-.5-0.193,0.629,0.629,0,0,1-.212-0.457V4.446a0.629,0.629,0,0,1,.212-0.457,0.761,0.761,0,0,1,.5-0.193h7.156a0.761,0.761,0,0,1,.5.193A0.63,0.63,0,0,1,13.293,4.446Zm-0.716,6.505H5.422v1.3H6.854V11.6H9v0.651h3.578v-1.3Zm0-6.505H6.138V10.3h6.44V4.446ZM7.569,5.1H6.854V5.748H7.569V5.1Zm0,1.3H6.854V7.048H7.569V6.4Zm0,1.3H6.854V8.349H7.569V7.7Zm0,1.951H6.854V9H7.569V9.651h0Z') From d048c61e750863e057a83308585f9396a9c53239 Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 31 Aug 2016 18:20:54 -0700 Subject: [PATCH 100/577] update copy for template --- .../components/ahaGuide/ahaSidebarView.jade | 2 +- .../ahaGuide/components/setUpRepositoryGuideView.jade | 4 ++-- .../environment/environmentBody/viewCardGrid.jade | 11 ++--------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index e03a40eaa..d613dfeaf 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -64,7 +64,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Add your First Repository + p.p.strong Create your First Template p.small Set up your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index fa2687109..c34513680 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -56,10 +56,10 @@ ng-click = "state.showSubStep = state.showSubStep + 1" ng-if = "state.showSubStep < 8" ) Next - p.p.small.text-gray-light Add your First Repository + p.p.small.text-gray-light Create your First Template p.p( ng-if = "state.showSubStep === 0 && !state.showError" - ) Add your repository by clicking ‘Add Template. + ) Add a repository by clicking ‘Create Template‘. p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 1 && !state.showError" diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index de4d53537..b3b35b25f 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -8,17 +8,10 @@ ) //- empty state -.card.gray.disabled.load.empty( +.card.gray.disabled.load.empty.p( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length" -) - svg.iconnables( - ng-click = "EC.triggerModal.newContainer()" - ) - use( - xlink:href = "#icons-new-repository-server" - ) - p.p Add your first repository template to get started. +) Create your first repository template to get started. //- server card .card.gray.disabled.load( From 82f816a4c072e677ca2d870585d86ed9a5555643 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 31 Aug 2016 21:49:46 -0700 Subject: [PATCH 101/577] Moving to stateless configuration --- client/controllers/controllerApp.js | 36 ++++++-- .../components/ahaGuide/AhaGuideController.js | 85 ++++++------------- .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../ahaGuide/ahaGuideMenuPopoverView.jade | 2 +- .../components/ahaGuide/ahaGuideView.jade | 11 ++- .../components/ahaGuide/ahaPopoverView.jade | 2 +- .../ahaGuide/ahaSidebarController.js | 7 +- .../components/ahaGuide/ahaSidebarView.jade | 29 ++----- .../components/createSandboxGuideView.jade | 10 +-- .../components/setUpRepositoryGuideView.jade | 55 ++++++------ .../environment/environmentController.js | 3 + .../viewEnvironmentHeader.jade | 4 +- .../environment/environmentView.jade | 10 +-- .../newContainerModalView.jade | 2 +- client/directives/navBar/viewNav.jade | 6 +- ...{serviceAhaGuide.js => ahaGuideService.js} | 41 ++++----- client/templates/viewInstance.jade | 2 +- 17 files changed, 134 insertions(+), 173 deletions(-) rename client/services/{serviceAhaGuide.js => ahaGuideService.js} (85%) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index de2e93cb4..b3499eb69 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -87,19 +87,37 @@ function ControllerApp( $rootScope.featureFlags = featureFlags.flags; $rootScope.resetFeatureFlags = featureFlags.reset; this.featureFlagsChanged = featureFlags.changed; - $rootScope.ahaGuide = { - completedMilestones: $localStorage.completedMilestones || { + $rootScope.ahaGuide = {}; + var completedMilestones = keypather.get($localStorage, 'ahaGuide.completedMilestones'); + var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); + + if (!completedMilestones) { + completedMilestones = { aha1: false, aha2: false, aha3: false, aha4: false - }, - showError: false, - exitedEarly: false, - showPopover: false - }; - $rootScope.ahaGuide.showOverview = !$rootScope.ahaGuide.completedMilestones.aha1; - $rootScope.ahaGuide.showSidebar = !$rootScope.ahaGuide.completedMilestones.aha1; + }; + keypather.set($localStorage, 'ahaGuide.completedMilestones', completedMilestones); + } + + if (!ahaGuideToggles) { + ahaGuideToggles = { + showAha: true, + showAha1: false, + showAha2: false, + showAha3: false, + exitedEarly: false, + showError: false, + showOverview: true, + showPopover: false, + showSidebar: false + }; + keypather.set($localStorage, 'ahaGuide.ahaGuideToggles', ahaGuideToggles); + } + + $rootScope.ahaGuide.completedMilestones = $localStorage.ahaGuide.completedMilestones; + $rootScope.ahaGuide.ahaGuideToggles = $localStorage.ahaGuide.ahaGuideToggles; $scope.$watch(function () { return errs.errors.length; diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 20fefec04..49215b9e2 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -8,17 +8,15 @@ function AhaGuideController( $scope, $rootScope, $timeout, - serviceAhaGuide + ahaGuide ) { - var AHA = this; + var AGC = this; if (!$rootScope.ahaGuide) { $rootScope.ahaGuide = {}; } - AHA.exitingEarly = exitingEarly; - - $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); + AGC.exitingEarly = exitingEarly; var alertListener = $scope.$on('alert', function(event, alert) { // alerts on container creation success @@ -37,14 +35,14 @@ function AhaGuideController( }); var tabListener = $scope.$on('updatedTab', function(event, tabName) { - if (AHA.state.subStepIndex > 5) { + if (AGC.state.subStepIndex > 5) { tabListener(); } else { updateCaption(tabName); } }); - AHA.state = { + AGC.state = { hideMenu: false, isBuildSuccessful: false, mainStep: $scope.stepIndex, @@ -54,15 +52,15 @@ function AhaGuideController( }; // get steps from service - AHA.state.steps = serviceAhaGuide.getSteps(); + AGC.state.steps = ahaGuide.getSteps(); // get the current milestone - var currentMilestone = AHA.state.steps[AHA.state.mainStep]; + var currentMilestone = AGC.state.steps[AGC.state.mainStep]; // get the bound of the caption array so we know when to stop - AHA.state.title = currentMilestone.title; - AHA.state.caption = currentMilestone.subSteps[AHA.state.subStep].caption; - AHA.state.className = currentMilestone.subSteps[AHA.state.subStep].className; + AGC.state.title = currentMilestone.title; + AGC.state.caption = currentMilestone.subSteps[AGC.state.subStep].caption; + AGC.state.className = currentMilestone.subSteps[AGC.state.subStep].className; // update steps and initiate digest loop function updateCaption(status) { @@ -72,27 +70,28 @@ function AhaGuideController( if (status === 'dockLoaded') { $rootScope.animatedPanelListener(); } - AHA.state.subStep = status; - AHA.state.subStepIndex = currentMilestone.subSteps[status].step; - AHA.state.caption = currentMilestone.subSteps[status].caption; - AHA.state.className = currentMilestone.subSteps[status].className; + AGC.state.subStep = status; + AGC.state.subStepIndex = currentMilestone.subSteps[status].step; + AGC.state.caption = currentMilestone.subSteps[status].caption; + AGC.state.className = currentMilestone.subSteps[status].className; } function handleBuildUpdate(update) { + console.log(update); var buildStatus = update.status; - AHA.state.containerHostname = update.containerHostname; + AGC.state.containerHostname = update.containerHostname; if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { - AHA.state.showError = true; + AGC.state.showError = true; } else if (buildStatus === 'starting') { - AHA.state.showError = false; - addVerificationListeners(AHA.state.containerHostname); + AGC.state.showError = false; + addVerificationListeners(AGC.state.containerHostname); } updateBuildStatus(buildStatus); } function updateBuildStatus(buildStatus) { - AHA.state.buildStatus = buildStatus; - AHA.state.caption = currentMilestone.buildStatus[buildStatus] || AHA.state.caption; + AGC.state.buildStatus = buildStatus; + AGC.state.caption = currentMilestone.buildStatus[buildStatus] || AGC.state.caption; } function addVerificationListeners(containerHostname) { @@ -100,42 +99,15 @@ function AhaGuideController( $rootScope.doneListener = $rootScope.$on('close-popovers', function() { $rootScope.doneListener(); updateCaption('complete'); - $rootScope.ahaGuide.completedMilestones.aha1 = true; - $rootScope.ahaGuide.exitedEarly = false; - $rootScope.ahaGuide.showPopover = true; + $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = false; + $rootScope.ahaGuide.ahaGuideToggles.showPopover = true; }); } - - var url = 'http://' + containerHostname; - $timeout(function() { - if (serviceAhaGuide.pendingRequest) { - return; - } - if (AHA.state.showError === false && !AHA.state.isBuildSuccesful) { - AHA.state.isBuildSuccessful = true; - buildLogListener(); - serviceAhaGuide.checkContainerStatus(url) - .then(function(isRunning) { - if (isRunning) { - updateCaption('success'); - $rootScope.ahaGuide.exitedEarly = false; - } else { - updateBuildStatus('cmdFailed'); - AHA.state.showError = true; - AHA.state.showBindingMSG = true; - $rootScope.ahaGuide.showError = AHA.state.showError; - } - }); - } else { - AHA.state.isBuildSuccessful = false; - $rootScope.ahaGuide.showError = AHA.state.showError; - } - }, 5000); } function exitingEarly() { exitedEarlyListener(); - AHA.state.showError = true; + AGC.state.showError = true; updateCaption('exitedEarly'); $rootScope.ahaGuide.completedMilestones.aha1 = true; } @@ -153,15 +125,12 @@ function AhaGuideController( if ($rootScope.doneListener) { $rootScope.doneListener(); } - if (AHA.state.subStep === 'dockLoaded') { + if (AGC.state.subStep === 'dockLoaded') { $rootScope.ahaGuide.completedMilestones.aha0 = true; } - if (AHA.state.subStepIndex === 7 && !AHA.state.isBuildSuccessful) { - $rootScope.ahaGuide.exitedEarly = true; - $rootScope.ahaGuide.completedMilestones.aha1 = true; + if (AGC.state.subStepIndex === 7 && !AGC.state.isBuildSuccessful) { + $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = true; $rootScope.$broadcast('exitedEarly'); - } else if (AHA.state.subStep === 'success') { - $rootScope.ahaGuide.completedMilestones.aha1 = true; } }); diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index ac935b17f..7557f2b3f 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -13,7 +13,7 @@ function ahaGuideDirective( restrict: 'A', templateUrl: 'ahaGuideView', controller: 'AhaGuideController', - controllerAs: 'AHA', + controllerAs: 'AGC', scope: { stepIndex: '=', subStep: '@', diff --git a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade index aeac62750..d93eb217d 100644 --- a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade @@ -6,7 +6,7 @@ .popover-content ul.list.popover-list li.list-item.popover-list-item( - ng-click = "$root.ahaGuide.showSidebar = true" + ng-click = "$scope.showSidebar = true" ) View All li.list-item.popover-list-item( ng-click = "$root.ahaGuide.completedMilestones.aha1 = true" diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index e5b542624..3d21b64eb 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -1,20 +1,20 @@ .grid-block.align-center( - ng-if = "AHA.state.mainStep === 0" + ng-if = "AGC.state.mainStep === 0" ng-include = "'createSandboxGuideView'" ) .grid-block.align-center( - ng-if = "AHA.state.mainStep === 1" + ng-if = "AGC.state.mainStep === 1" ng-include = "'setUpRepositoryGuideView'" ) .grid-block.align-center( - ng-if = "AHA.state.mainStep === 2" + ng-if = "AGC.state.mainStep === 2" ng-include = "'addBranchGuideView'" ) .grid-block.align-center( - ng-if = "AHA.state.mainStep === 3" + ng-if = "AGC.state.mainStep === 3" ng-include = "'setUpRunnabotGuideView'" ) @@ -25,12 +25,11 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!AHA.state.hideMenu" + ng-if = "!AGC.state.hideMenu" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" pop-over-template = "ahaGuideMenuPopoverView" - pop-over-func = "AHA.exitingEarly" ) svg.iconnables use( diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 67caf5116..6e9e0a055 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -7,5 +7,5 @@ ) .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( - ng-click = "$root.ahaGuide.showPopover = false" + ng-click = "$root.ahaGuide.ahaGuideToggles.showPopover = false" ) Got It diff --git a/client/directives/components/ahaGuide/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebarController.js index 29b407a9f..1cf325561 100644 --- a/client/directives/components/ahaGuide/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebarController.js @@ -7,18 +7,17 @@ require('app') function AhaSidebarController( $scope, $rootScope, - serviceAhaGuide + ahaGuide ) { var ASC = this; - $rootScope.ahaGuide.completedMilestones = serviceAhaGuide.getAhaMilestones(); ASC.toggleOverview = function() { - $rootScope.ahaGuide.showOverview = !$rootScope.ahaGuide.showOverview; + $rootScope.ahaGuide.ahaGuideToggles.showOverview = !$rootScope.ahaGuide.ahaGuideToggles.showOverview; ASC.toggleSidebar(); }; ASC.toggleSidebar = function() { - $rootScope.ahaGuide.showSidebar = !$rootScope.ahaGuide.showSidebar; + $rootScope.ahaGuide.ahaGuideToggles.showSidebar = !$rootScope.ahaGuide.ahaGuideToggles.showSidebar; }; } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index eacbf5809..22a9262c1 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,13 +1,13 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( - ng-click = "$root.ahaGuide.showSidebar = false" - ng-if = "!$root.ahaGuide.showOverview || $root.ahaGuide.completedMilestones.aha1" + ng-click = "$root.ahaGuide.ahaGuideToggles.showSidebar = false" + ng-if = "!$root.ahaGuide.ahaGuideToggles.showOverview || $root.ahaGuide.completedMilestones.aha1" ) use( xlink:href = "#icons-close" ) .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.ahaOverview && !$root.ahaGuide.completedMilestones.aha1 && $root.ahaGuide.showOverview" + ng-if = "$root.featureFlags.ahaOverview && !$root.ahaGuide.completedMilestones.aha1 && $root.ahaGuide.ahaGuideToggles.showOverview" ) .grid-content.strong Let‘s get running! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! @@ -17,35 +17,24 @@ " ) Get Started .grid-block.vertical - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha0}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-meter-0': !$root.ahaGuide.completedMilestones.aha0,\ - 'aha-meter-100': $root.ahaGuide.completedMilestones.aha0\ - }" + .grid-block.shrink.align-center.padding-sm.aha-guide.disabled + .grid-block.shrink.aha-meter.aha-meter-100( ) svg.iconnables use( - ng-if = "$root.ahaGuide.completedMilestones.aha0" xlink:href = "#icons-check" ) - use( - ng-if = "!$root.ahaGuide.completedMilestones.aha0" - xlink:href = "#icons-cog" - ) .grid-block.vertical.aha-text p.p.strong Choose your Organization p.small This is the first step to success. .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha1 || !$root.ahaGuide.completedMilestones.aha0}" + ng-class = "{'disabled': data.instances.models.length}" ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-error': $root.ahaGuide.showError,\ - 'aha-meter-70': $root.ahaGuide.exitedEarly,\ + 'aha-error': $root.ahaGuide.ahaGuideToggles.showError,\ + 'aha-meter-70': $root.ahaGuide.ahaGuideToggles.exitedEarly,\ 'aha-meter-100': $root.ahaGuide.completedMilestones.aha1\ }" ) @@ -63,7 +52,7 @@ p.small Set up your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha2 || !$root.ahaGuide.completedMilestones.aha1}" + ng-class = "{'disabled': !data.instances.models.length}" ) .grid-block.shrink.aha-meter( ng-class = "{\ diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index b0dc7b8a2..64c3ffc44 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -1,17 +1,17 @@ .grid-block.shrink.aha-meter( ng-class = "\ - AHA.state.className\ + AGC.state.className\ " ) svg.iconnables use( - ng-if = "$root.featureFlags.aha0 && AHA.state.subStep !== 'dockLoaded'" + ng-if = "$root.featureFlags.aha0 && AGC.state.subStep !== 'dockLoaded'" xlink:href = "#icons-cog" ) use( - ng-if = "$root.featureFlags.aha0 && AHA.state.subStep === 'dockLoaded'" + ng-if = "$root.featureFlags.aha0 && AGC.state.subStep === 'dockLoaded'" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.small.text-gray-light {{ AHA.state.title }} - p.p {{ AHA.state.caption }} + p.p.small.text-gray-light {{ AGC.state.title }} + p.p {{ AGC.state.caption }} diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 759ab9510..47212ca28 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -4,23 +4,23 @@ ) .grid-block.shrink.aha-meter.js-animate( - class = "{{ AHA.state.className }}" - ng-class = "{'aha-error': AHA.state.showError}" + class = "{{ AGC.state.className }}" + ng-class = "{'aha-error': AGC.state.showError}" ng-if = "!state.showVerification" ) svg.iconnables( - ng-if = "!AHA.state.showError" + ng-if = "!AGC.state.showError" ) use( - ng-if = "$root.featureFlags.aha1 && AHA.state.subStep !== 'complete'" + ng-if = "$root.featureFlags.aha1 && AGC.state.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AHA.state.subStep === 'complete'" + ng-if = "AGC.state.subStep === 'complete'" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( - ng-if = "AHA.state.showError" + ng-if = "AGC.state.showError" ) use( xlink:href = "#icons-alert-alt" @@ -34,49 +34,49 @@ ) a.grid-content.shrink.red.small.link( ng-click = "state.showVerification = !state.showVerification" - ng-if = "AHA.state.subStep === 7" + ng-if = "AGC.state.subStep === 7" ) Verify a.grid-content.shrink.red.small.link( ng-click = "\ state.showError = !state.showError;\ state.showErrorType = 'CMD';\ " - ng-if = "AHA.state.subStep === 7" + ng-if = "AGC.state.subStep === 7" ) CMDErr a.grid-content.shrink.red.small.link( ng-click = "\ state.showError = !state.showError;\ state.showErrorType = 'build';\ " - ng-if = "AHA.state.subStep === 7" + ng-if = "AGC.state.subStep === 7" ) BuildErr a.grid-content.shrink.red.small.link( ng-click = "\ $root.featureFlags.aha1 = false;\ $root.featureFlags.aha2 = true;\ " - ng-if = "AHA.state.subStep === 8" + ng-if = "AGC.state.subStep === 8" ) NextMile a.grid-content.shrink.red.small.link( - ng-click = "AHA.state.subStep = AHA.state.subStep - 1" - ng-if = "AHA.state.subStep < 9 && AHA.state.subStep > 1" + ng-click = "AGC.state.subStep = AGC.state.subStep - 1" + ng-if = "AGC.state.subStep < 9 && AGC.state.subStep > 1" ) Prev a.grid-content.shrink.red.small.link( - ng-click = "AHA.state.subStep = AHA.state.subStep + 1" - ng-if = "AHA.state.subStep < 8" + ng-click = "AGC.state.subStep = AGC.state.subStep + 1" + ng-if = "AGC.state.subStep < 8" ) Next - p.p.small.text-gray-light {{ AHA.state.title }} + p.p.small.text-gray-light {{ AGC.state.title }} p.p( - ng-class = "{'p-slide js-animate': AHA.state.subStepIndex > 0}" - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.exitedEarly && !state.showError && !state.showVerification" - ) {{ AHA.state.caption }} + ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.exitedEarly && !state.showError && !state.showVerification" + ) {{ AGC.state.caption }} p.p( - ng-class = "{'p-slide js-animate': AHA.state.subStepIndex}" - ng-if = "$root.featureFlags.aha && $root.ahaGuide.exitedEarly && !state.showError && !state.showVerification" - ) {{ AHA.state.caption }} + ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" + ng-if = "$root.featureFlags.aha && $root.ahaGuide.ahaGuideToggles.exitedEarly && !state.showError && !state.showVerification" + ) {{ AGC.state.caption }} p.p( - ng-class = "{'p-slide js-animate': AHA.state.subStepIndex}" - ng-if = "AHA.state.subStep === 7" + ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" + ng-if = "AGC.state.subStep === 7" ) | {{!state.showError && !state.showVerification ? 'Now building. Build time varies depending on your template.' : ''}} | {{state.showVerification ? 'Verifying Template…' : ''}} @@ -92,11 +92,6 @@ | ! p.p( - ng-class = "{'p-slide js-animate': AHA.state.subStepIndex}" - ng-if = "AHA.state.subStep === 8 && !state.showError && !state.showVerification" + ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" + ng-if = "AGC.state.subStep === 8 && !state.showError && !state.showVerification" ) Your build is looking good! Check out its URL and click ‘Done’ if it looks good to you. - - //- in the popover - p.p( - ng-if = "$root.featureFlags.aha2" - ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 041a3a3be..adec51f1c 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -88,6 +88,9 @@ function EnvironmentController( fetchInstancesByPod($state.userName) .then(function (instancesCollection) { $scope.data.instances = instancesCollection; + $rootScope.ahaGuide.ahaGuideToggles.showAha1 = !instancesCollection.models.length; + $rootScope.ahaGuide.ahaGuideToggles.showSidebar = !instancesCollection.models.length; + $rootScope.ahaGuide.ahaGuideToggles.showOverview = !instancesCollection.models.length; // Asynchronously fetch the Dockerfile instancesCollection.forEach(function (instance) { if (instance.hasDockerfileMirroring()) { diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 26b5b9e22..9354db916 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -55,7 +55,7 @@ button.grid-block.shrink.btn.btn-md.green( 'scale-in-modal': $root.featureFlags.aha1\ }" ng-click = "EC.triggerModal.newContainer()" - ng-if = "!$root.featureFlags.aha1 || !$root.ahaGuide.showOverview || $root.ahaGuide.completedMilestones.aha1" + ng-if = "!$root.featureFlags.aha1 || ($root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && $root.ahaGuide.ahaGuideToggles.showAha1)" ) svg.iconnables.icons-add.float-left use( @@ -64,7 +64,7 @@ button.grid-block.shrink.btn.btn-md.green( | Create Template button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "$root.ahaGuide.showSidebar = true" + ng-click = "$root.ahaGuide.ahaGuideToggles.showSidebar = true" ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index b5313b43b..9e1addf4f 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,7 +42,7 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1}" + ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha1 && $root.ahaGuide.ahaGuideToggles.showAha1}" ) header.grid-block.align-center.environment-header( @@ -51,7 +51,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha1ExitedEarly && $root.ahaGuide.exitedEarly" + ng-if = "$root.featureFlags.aha1ExitedEarly && $root.ahaGuide.ahaGuideToggles.exitedEarly" aha-guide-directive step-index = 1 sub-step = 'exitedEarly' @@ -98,7 +98,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1 && !$root.ahaGuide.showOverview && !$root.ahaGuide.exitedEarly && !data.instances.models.length" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && !$root.ahaGuide.ahaGuideToggles.exitedEarly && $root.ahaGuide.ahaGuideToggles.showAha1" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive @@ -109,7 +109,7 @@ .grid-block.card-grid.clearfix( ng-class = "{'padding-top': helpCards.getActiveCard().helpTop}" - ng-if = "!$root.featureFlags.aha1 || $root.ahaGuide.completedMilestones.aha1 || data.instances.models.length" + ng-if = "data.instances.models.length" ng-include = "'viewCardGrid'" ) @@ -128,5 +128,5 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar-directive - ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar && $root.ahaGuide.showSidebar" + ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar && $root.ahaGuide.ahaGuideToggles.showSidebar" ) diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 3f2961298..dd0d98e59 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -1,7 +1,7 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-class = "{'p-slide js-animate': AHA.state.subStepIndex > 0}" + ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1" step-index = 1 sub-step = "containerSelection" diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 0a4e50b60..8cd07bcad 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -6,7 +6,7 @@ //- aha menu .popover.right.in.popover-aha( - ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.exitedEarly && $root.ahaGuide.showPopover" + ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.ahaGuideToggles.exitedEarly && $root.ahaGuide.ahaGuideToggles.showPopover" ng-include = "'ahaPopoverView'" ) @@ -21,7 +21,7 @@ a.a( | Templates a.a.disabled( - ng-if = "(dataApp.state.includes('base.config') && CA.instancesByPod && !CA.instancesByPod.models.length) || !$root.ahaGuide.completedMilestones.aha1 || $root.ahaGuide.exitedEarly" + ng-if = "(dataApp.state.includes('base.config') && CA.instancesByPod && !CA.instancesByPod.models.length)" tooltip = "You don’t have any running containers yet!" tooltip-options = "{\"class\":\"right\",\"left\":75,\"top\":17}" ) @@ -32,7 +32,7 @@ a.a.disabled( | Containers a.a( - ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && $root.ahaGuide.completedMilestones.aha1 && !$root.ahaGuide.exitedEarly" + ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length)" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) diff --git a/client/services/serviceAhaGuide.js b/client/services/ahaGuideService.js similarity index 85% rename from client/services/serviceAhaGuide.js rename to client/services/ahaGuideService.js index 6c6fa6927..436fb59ca 100644 --- a/client/services/serviceAhaGuide.js +++ b/client/services/ahaGuideService.js @@ -1,16 +1,14 @@ 'use strict'; require('app') - .factory('serviceAhaGuide', serviceAhaGuide); + .factory('ahaGuide', ahaGuide); -function serviceAhaGuide( +function ahaGuide( $http, $localStorage, keypather ) { - var ahaMilestonesComplete = getAhaMilestones(); - var _steps = [ { title: 'Create your Sandbox', @@ -126,9 +124,8 @@ function serviceAhaGuide( }, buildStatus: { building: 'Now building. Build time varies depending on your configuration', - running: 'Verifying configuration... ', starting: 'Now building. Build time varies depending on your configuration', - success: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', + running: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', stopped: 'Your container failed to run. Inspect your CMD logs for more information.', cmdFailed: 'Your container failed to run. Inspect your CMD logs for more information.', crashed: 'Your container failed to run. Inspect your CMD logs for more information.', @@ -176,34 +173,26 @@ function serviceAhaGuide( }); } - function isComplete(step, bool) { - if (bool === true) { - keypather.set($localStorage, 'completedMilestones.' + step, true); - ahaMilestonesComplete[step] = bool; - } else { - return keypather.get($localStorage, 'completedMilestones.' + step); - } - } - function getAhaMilestones() { - var ahaMilestones = keypather.get($localStorage, 'completedMilestones'); - if (!ahaMilestones) { - ahaMilestones = { - aha0: false, - aha1: false, - aha2: false, - aha3: false + var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); + + if (!ahaGuideToggles) { + ahaGuideToggles = { + exitedEarly: false, + showError: false, + showOverview: false, + showPopover: false, + showSidebar: false }; - keypather.set($localStorage, 'completedMilestones', ahaMilestones); + keypather.set($localStorage, 'ahaGuide.toggles', ahaGuideToggles); } - return ahaMilestones; + return completedMilestones; } return { checkContainerStatus: checkContainerStatus, getAhaMilestones: getAhaMilestones, - getSteps: getSteps, - isComplete: isComplete + getSteps: getSteps }; } diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index da94d32b3..08b67fe24 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -89,5 +89,5 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar-directive - ng-if = "$root.featureFlags.aha && $root.ahaGuide.showSidebar" + ng-if = "$root.featureFlags.aha && $root.ahaGuide.ahaGuideToggles.showSidebar" ) From 99904609bfe8584b8d5a560b9ec339d694cee2b8 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 1 Sep 2016 00:06:35 -0700 Subject: [PATCH 102/577] Reworked stateless progression further --- .../styles/scss/components/aha-sidebar.scss | 4 +++ client/controllers/controllerApp.js | 4 +-- .../components/ahaGuide/AhaGuideController.js | 6 +++- .../components/ahaGuide/ahaSidebarView.jade | 8 +++-- .../viewEnvironmentHeader.jade | 2 +- .../environment/environmentView.jade | 2 +- .../newContainerModalView.jade | 2 +- client/templates/instances/viewInstances.jade | 1 - client/templates/viewInstance.jade | 29 ------------------- 9 files changed, 19 insertions(+), 39 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index e6db79d31..7552e53d1 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -79,6 +79,10 @@ } } + &.active { + cursor: pointer; + } + + .aha-guide { margin-top: 15px; } diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index b3499eb69..fd1f3c01c 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -93,10 +93,10 @@ function ControllerApp( if (!completedMilestones) { completedMilestones = { + aha0: false, aha1: false, aha2: false, - aha3: false, - aha4: false + aha3: false }; keypather.set($localStorage, 'ahaGuide.completedMilestones', completedMilestones); } diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 49215b9e2..1a72cdfd5 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -85,6 +85,10 @@ function AhaGuideController( } else if (buildStatus === 'starting') { AGC.state.showError = false; addVerificationListeners(AGC.state.containerHostname); + } else if (buildStatus === 'running') { + updateCaption('success'); + $rootScope.ahaGuide.exitedEarly = false; + $root.ahaGuide.ahaGuideToggles.showPopover = true; } updateBuildStatus(buildStatus); } @@ -101,6 +105,7 @@ function AhaGuideController( updateCaption('complete'); $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = false; $rootScope.ahaGuide.ahaGuideToggles.showPopover = true; + $rootScope.ahaGuide.ahaGuideToggles.showAha1 = false; }); } } @@ -139,4 +144,3 @@ function AhaGuideController( }); } - diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 22a9262c1..48ee5b9df 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -30,21 +30,23 @@ .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{'disabled': data.instances.models.length}" + ng-click = "!data.instances.models.length && ASC.toggleOverview()" + ng-class = "{active: !data.instances.models.length}" ) .grid-block.shrink.aha-meter( ng-class = "{\ 'aha-error': $root.ahaGuide.ahaGuideToggles.showError,\ 'aha-meter-70': $root.ahaGuide.ahaGuideToggles.exitedEarly,\ - 'aha-meter-100': $root.ahaGuide.completedMilestones.aha1\ + 'aha-meter-100': !$root.ahaGuide.ahaGuideToggles.showAha1\ }" ) svg.iconnables use( - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1" + ng-if = "$root.ahaGuide.ahaGuideToggles.showAha1" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "$root.ahaGuide.completedMilestones.aha1" + ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 9354db916..5f927a3c6 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -55,7 +55,7 @@ button.grid-block.shrink.btn.btn-md.green( 'scale-in-modal': $root.featureFlags.aha1\ }" ng-click = "EC.triggerModal.newContainer()" - ng-if = "!$root.featureFlags.aha1 || ($root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && $root.ahaGuide.ahaGuideToggles.showAha1)" + ng-if = "!$root.featureFlags.aha1 || ($root.featureFlags.aha1 && (!$root.ahaGuide.ahaGuideToggles.showOverview || data.instances.models.length))" ) svg.iconnables.icons-add.float-left use( diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 9e1addf4f..ae803f077 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -98,7 +98,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && !$root.ahaGuide.ahaGuideToggles.exitedEarly && $root.ahaGuide.ahaGuideToggles.showAha1" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && !$root.ahaGuide.ahaGuideToggles.exitedEarly && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index dd0d98e59..4d6cafd41 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.completedMilestones.aha1" + ng-if = "$root.featureFlags.aha1 && $root.ahaGuide.ahaGuideToggles.showAha1" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index cb5967560..6002f91c9 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -20,6 +20,5 @@ ) .grid-block.vertical.instance-wrapper( - ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha2}" ui-view ) diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index 08b67fe24..fc35abac5 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -7,36 +7,7 @@ .grid-block.vertical.instance( ng-if = "!isLoading.main" ) - - .grid-block.shrink.vertical.instance-header( - ng-if = "$root.featureFlags.aha2" - ) - - button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "$root.featureFlags.ahaSidebar = true" - ng-if = "$root.featureFlags.aha && !$root.featureFlags.ahaSidebar" - tooltip = "Setup Guide" - tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" - ) - svg.iconnables - use( - xlink:href = "#icons-help" - ) - - .grid-block.align-center.justify-center( - ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.completedMilestones.aha2" - ) - .modal-dialog.modal-sm( - ) - .grid-block.align-center.aha-guide.padding-md( - aha-guide-directive - step-index = 2 - sub-step = "addBranch" - sub-step-index = 0 - ) - .grid-block.vertical( - ng-if = "!$root.featureFlags.aha2" ) //- show if server build is being swapped out - orange when build is updating or has failed From 761066572adda9eddbba489feb7f3309363db063 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 10:21:20 -0700 Subject: [PATCH 103/577] further clarify non-admin state --- .../components/ahaGuide/ahaSidebarView.jade | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 77e50d35b..f3634814b 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -133,10 +133,11 @@ //- ng-include = "'spinner'" //- ) - .small.text-gray - //- if the user is an admin: - | This may affect your GitHub bill. - //- if the user is not an admin: - //- | Sorry, you’ll need help from an admin of your org to invite Runnabot. + //- if the user is an admin: + .small.text-gray This may affect your GitHub bill. + //- if the user is not an admin: + //- .small.text-red Sorry, you’ll need help from an admin br - a.link More about Runnabot + | of your org to invite Runnabot. + + a.small.text-gray.link More about Runnabot From 4178572916659b321b02c28a7eef45891c081445 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 10:41:13 -0700 Subject: [PATCH 104/577] add runnabot success state --- client/assets/images/runnabot-head.png | Bin 0 -> 7470 bytes .../styles/scss/components/aha-sidebar.scss | 15 ++++++++++++++- .../components/ahaGuide/ahaSidebarView.jade | 15 +++++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 client/assets/images/runnabot-head.png diff --git a/client/assets/images/runnabot-head.png b/client/assets/images/runnabot-head.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8920e96a7508de19f9b0dc16451b1534146771 GIT binary patch literal 7470 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 Date: Thu, 1 Sep 2016 10:43:56 -0700 Subject: [PATCH 105/577] fix shrinking aha sidebar header width --- client/assets/styles/scss/components/aha-sidebar.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 9a128dd82..622309abd 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -39,6 +39,7 @@ margin-bottom: 15px; padding-bottom: 15px; position: relative; + width: 100%; } .icons-close { From 3f01e346c9c803fc878106617dfc0a5acda65c8a Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 10:50:43 -0700 Subject: [PATCH 106/577] update copy for clarity --- client/directives/components/ahaGuide/ahaSidebarView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 71ef81034..ad6e5c5f1 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -102,7 +102,7 @@ ng-if = "$root.featureFlags.aha3" ) header.grid-block.shrink.align-center.justify-center.aha-sidebar-header - h4.grid-content.shrink.strong.text-center.h4 You finished setup! + h4.grid-content.shrink.strong.text-center.h4 One more thing… svg.iconnables.icons-close( ng-click = "\ $root.featureFlags.aha = false;\ @@ -113,7 +113,7 @@ use( xlink:href = "#icons-close" ) - p.grid-content.shrink.p Now invite Runnabot to your GitHub org to get helpful comments on your pull requests: + p.grid-content.shrink.p You did it! Now invite Runnabot to your org to get helpful comments on your pull requests: img.grid-content.shrink.img.img-comment( height = "206" src = "/build/images/runnabot-comment.png" From 19114beef2af14f914ad5111ee25f292a0ab52ec Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 10:57:50 -0700 Subject: [PATCH 107/577] actually fix spinner --- client/assets/styles/scss/components/aha-sidebar.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 622309abd..2e7d6ce6f 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -84,7 +84,7 @@ width: 21px; } - .spinner { + .spinner-wrapper { float: right; } } From 5ff2a21983a77406a3c697380985fd388cb056b2 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 11:42:48 -0700 Subject: [PATCH 108/577] update empty states --- .../environment/environmentBody/viewCardGrid.jade | 8 ++++++-- client/directives/environment/environmentView.jade | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index b3b35b25f..b937d95ae 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -10,8 +10,12 @@ //- empty state .card.gray.disabled.load.empty.p( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length" -) Create your first repository template to get started. + ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length && !$root.featureFlags.aha" +) + h1.h1 😐 + | This is awkward. + br + | You don‘t have any templates. //- server card .card.gray.disabled.load( diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 07a87d401..8a4811304 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -126,7 +126,7 @@ xlink:href = "#icons-team-invite" ) | Invite a teammate - | to help you set up your stack. + | to help you set up your project. .grid-block.vertical.aha-sidebar.padding-sm.js-animate( ng-include = "'ahaSidebarView'" From 9aa695f7f153650140ef77d35143597853a2618e Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 13:19:44 -0700 Subject: [PATCH 109/577] remove instances-list-wrapper --- .../styles/scss/layout/instances-list.scss | 23 ++++++++----------- client/templates/instances/viewInstances.jade | 21 +++++++++-------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index ed48baf5a..6f14cbc59 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -1,25 +1,19 @@ -.list-instances-wrapper { +// instances list +.list-instances { background: $gray-lighterest; border-right: 1px solid $gray-lighter; color: $gray; display: none; font-size: 15px; height: 100vh; - overflow: visible; + overflow-y: auto; + padding: 0 12px 45px; + position: relative; width: $instance-list-width; &.in { - display: flex; + display: block; } -} - -// instances list -.list-instances { - max-height: 100vh; - overflow-y: auto; - padding: 0 12px 45px; - position: relative; - width: 100%; // search .label-search { @@ -92,8 +86,11 @@ // wraps the master cluster and each repository section .list-clusters { - border-bottom: 1px solid $gray-lighter; padding: 15px 0; + + + .list-clusters { + border-top: 1px solid $gray-lighter; + } } .list-clusters-heading { diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index c5cde1154..6002f91c9 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -1,20 +1,21 @@ //- instance list -.list-instances-wrapper.grid-block.vertical.shrink.align-start( - ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" +.grid-block.shrink.list-instances( + ng-class = "{\ + 'deprecated': !$root.featureFlags.addBranches,\ + 'in': !CIS.$storage.instanceListIsClosed\ + }" ng-if = "CIS.instancesByPod" + ng-include = "'viewInstancesList'" + scroll-offset = "200" + scroll-to = "a.a-sref.active" ) - .list-instances( - ng-class = "{'deprecated': !$root.featureFlags.addBranches}" - ng-include = "'viewInstancesList'" - scroll-offset = "200" - scroll-to = "a.a-sref.active" - ) -.list-instances-wrapper.grid-block.shrink.align-center.justify-center( +.grid-block.shrink.list-instances( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" ) - .spinner-wrapper.spinner-md.spinner-gray.in( + + .spinner-wrapper.spinner-md.spinner-gray.spinner-center.in( ng-include = "'spinner'" ) From f44ba92542c5c0369d7f8ba1e3a4ff5bb89ceb0d Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 13:46:42 -0700 Subject: [PATCH 110/577] move empty state --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index d4f32e5e1..ba3cdcbdf 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -90,9 +90,6 @@ .popover-content( ng-init = "state.branchesLoaded = null" ) - .text-center.text-gray.small.padding-md( - ng-if = "branch.length === 0" - ) There are no branches to add. .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( ng-click = "state.branchesLoaded = true" @@ -123,6 +120,9 @@ required type = "search" ) + .text-center.text-gray.small.padding-md( + ng-if = "branch.length === 0" + ) There are no branches to add. ul.list.popover-list( ng-if = "state.branchesLoaded" ) From 4e1d10dfe84482bd7ae8e0c8daf6bd05a1a1dfd2 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 13:50:25 -0700 Subject: [PATCH 111/577] hide filter when no branches exist --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index ba3cdcbdf..096a0cad0 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -116,6 +116,7 @@ ) .toggle-group.toggle-sm input.input.input-xs.input-search( + ng-if = "branch.length !== 0" placeholder = "Filter" required type = "search" From 6c651a2fdb7bc1796a6c27b56124e2309e8ed4b1 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 13:58:28 -0700 Subject: [PATCH 112/577] add copy for second template states --- .../components/setUpRepositoryGuideView.jade | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index c34513680..03ded941c 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -57,29 +57,40 @@ ng-if = "state.showSubStep < 8" ) Next p.p.small.text-gray-light Create your First Template + //- Step 1: p.p( ng-if = "state.showSubStep === 0 && !state.showError" ) Add a repository by clicking ‘Create Template‘. + //- Step 2: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 1 && !state.showError" - ) Select a repository to set up. + ) + //- If no first repo template: + | Select a repository to set up. + //- If repo template exists: + //- | Choose a template to set up. + //- Step 3: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 2 && !state.showError" ) How would you like to set up your repo? + //- Step 4: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 3 && !state.showError" ) Give your template a name. + //- Step 5: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 4 && !state.showError" ) What does your repository run? + //- Step 6: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 5 && !state.showError" ) Choose commands and packages. + //- Step 7: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 6 && !state.showError" @@ -88,23 +99,32 @@ | {{state.fromMirroring ? 'We‘ve imported your dockerfile, click ‘Save & Build’ to build it!' : ''}} //- If the user selected to start with a blank dockerfile: //- | When you‘re done editing your dockerfile, click ‘Save & Build’ to build it! + + //- Step 8: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" - ng-if = "state.showSubStep === 7" + ng-if = "state.showSubStep === 7 && !$root.featureFlags.aha1ExitedEarly" ) //- During the build: | {{!state.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} //- If there's an error (build or cmd): - | {{state.showError ? 'Looks like there‘s an error! Inspect your logs for debug info.' : ''}} + | {{state.showError ? 'Uh oh, there was a build error! Inspect your logs for debug info.' : ''}} //- If detention error: //- | Your container is running! But it looks like something has not been set up correctly. + //- If template repo is deleted: + p.p( + ng-class = "{'p-slide js-animate': state.showSubStep}" + ng-if = "state.showSubStep === 7 && $root.featureFlags.aha1ExitedEarly" + ) You‘ve deleted your repository template. Create another one to continue. + + //- Step 9: p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 8 && !state.showError" ) Your build is looking good! Check out the URL, then click ‘Done’ if it looks good to you. - //- in the popover + //- Step 10 (in the nav popover): p.p( ng-if = "$root.featureFlags.aha2" ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. From 97ab583f07eda8cbf05aa61a7c363b939bba9e9f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 14:13:39 -0700 Subject: [PATCH 113/577] support "no branches" in aha guide --- .../components/ahaGuide/components/addBranchGuideView.jade | 6 ++++++ .../instance/branchMenuPopover/branchMenuPopoverView.jade | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/components/addBranchGuideView.jade b/client/directives/components/ahaGuide/components/addBranchGuideView.jade index 859c3ad25..a52426307 100644 --- a/client/directives/components/ahaGuide/components/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/components/addBranchGuideView.jade @@ -22,3 +22,9 @@ p.p( ng-if = "state.showSubStep === 2" ) Select a branch to add. + //- show in the branch menu if the repository has no branches. + p.p( + ng-if = "state.showSubStep === 3" + ) Aw, no branches. Try another repository or + a.link skip this step + | . diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 096a0cad0..a9e03e55a 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -121,9 +121,9 @@ required type = "search" ) - .text-center.text-gray.small.padding-md( - ng-if = "branch.length === 0" - ) There are no branches to add. + .text-center.text-gray.small.padding-lg( + ng-if = "branch.length === 0" + ) This repository doesn’t have any branches. ul.list.popover-list( ng-if = "state.branchesLoaded" ) From 124836853b20b09065a650eacf5ab474667e4c2b Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 14:16:16 -0700 Subject: [PATCH 114/577] add well on success state --- client/assets/styles/scss/components/aha-sidebar.scss | 10 ++++++---- .../directives/components/ahaGuide/ahaSidebarView.jade | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 2e7d6ce6f..47fbcb10b 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -75,7 +75,6 @@ } .btn { - margin-bottom: 30px; .iconnables { height: 21px; @@ -88,12 +87,15 @@ float: right; } } + + // the details text + .grid-content.small { + margin-top: 15px; + } } .runnabot-success { - margin: 15px 0 30px; - max-width: 180px; - padding: 3px 0; + max-width: 210px; .img { margin-right: 9px; diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index a2fa4cdeb..4bb3eb495 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -135,8 +135,8 @@ //- ) //- show after successfully inviting runnabot - //- .grid-block.runnabot-success.shrink - img.img( + //- .grid-block.shrink.well.gray.padding-sm.runnabot-success + img.grid-content.shrink.img( height = "36" src = "/build/images/runnabot-head.png" width = "36" @@ -145,7 +145,7 @@ //- if the user is an admin: - .small.text-gray This may affect your GitHub bill. + .grid-content.shrink.small.text-gray This may affect your GitHub bill. //- if the user is not an admin: //- .small.text-red Sorry, you’ll need help from an admin br From d036a5a94ee27a73254ffb50d7778e5c97ad9f82 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 14:17:54 -0700 Subject: [PATCH 115/577] add line break --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index a9e03e55a..afa1f8d90 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -123,7 +123,9 @@ ) .text-center.text-gray.small.padding-lg( ng-if = "branch.length === 0" - ) This repository doesn’t have any branches. + ) This repository doesn’t have + br + | any branches. ul.list.popover-list( ng-if = "state.branchesLoaded" ) From 5e8fb0b3e7e85aef82d9521276a64f8e6cfe3481 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 14:28:12 -0700 Subject: [PATCH 116/577] change empty state text back so it covers the case where branches exist, but they have all been added already --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index afa1f8d90..5566c4499 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -123,9 +123,7 @@ ) .text-center.text-gray.small.padding-lg( ng-if = "branch.length === 0" - ) This repository doesn’t have - br - | any branches. + ) There are no branches to add. ul.list.popover-list( ng-if = "state.branchesLoaded" ) From 31e8a3a9d1415b4985cea6436772f83006c3f0a0 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 14:37:41 -0700 Subject: [PATCH 117/577] update small text for runnabot --- .../styles/scss/components/aha-sidebar.scss | 3 ++- .../components/ahaGuide/ahaSidebarView.jade | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 47fbcb10b..f1f4bc52a 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -89,7 +89,8 @@ } // the details text - .grid-content.small { + .grid-content.small, + .text-red { margin-top: 15px; } } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 4bb3eb495..6f1b97f6f 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -144,11 +144,21 @@ p.small.text-gray.text-left Nice! Runnabot will join your team soon. - //- if the user is an admin: - .grid-content.shrink.small.text-gray This may affect your GitHub bill. - //- if the user is not an admin: - //- .small.text-red Sorry, you’ll need help from an admin - br - | of your org to invite Runnabot. + .grid-content.shrink.small( + ng-class = "{\ + 'text-gray': !state.adminRequired,\ + 'text-red': state.adminRequired\ + }" + ng-init = "state.adminRequired = false" + ) + //- if the user is an admin: + | This may affect your GitHub bill. - a.small.text-gray.link More about Runnabot + //- if the user is not an admin: + //- | Sorry, you’ll need help from an admin + //- br + //- | of your org to invite Runnabot. + + //- always show this: + br + a.small.link More about Runnabot From 0fcdedc3d89c925d46942209fdb4f7eb90014332 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 14:48:05 -0700 Subject: [PATCH 118/577] optimize images - and remove old homepage images --- client/assets/images/confetti.png | Bin 10036 -> 4005 bytes client/assets/images/favicon-gray.png | Bin 1025 -> 518 bytes client/assets/images/favicon-green.png | Bin 1080 -> 558 bytes client/assets/images/favicon-orange.png | Bin 1046 -> 558 bytes client/assets/images/favicon-red.png | Bin 1961 -> 1116 bytes client/assets/images/favicon.png | Bin 1087 -> 558 bytes client/assets/images/home/hero-bg.svg | 215 -------------------- client/assets/images/home/preview.png | Bin 35041 -> 0 bytes client/assets/images/runnabear-head.png | Bin 14339 -> 13650 bytes client/assets/images/runnabear-waving-2.png | Bin 10900 -> 10898 bytes client/assets/images/slack-notification.png | Bin 5211 -> 5209 bytes 11 files changed, 215 deletions(-) delete mode 100644 client/assets/images/home/hero-bg.svg delete mode 100644 client/assets/images/home/preview.png diff --git a/client/assets/images/confetti.png b/client/assets/images/confetti.png index 3543e6e78804fb427e83560ea9bbbaf01b47f6ef..2d389a0417975a988585f1cfbbb3dc1fc4813a5b 100644 GIT binary patch literal 4005 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 IcN`=C4+6fk9{>OV literal 10036 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 PPmpK2COVBzT;BX2NXZA} diff --git a/client/assets/images/favicon-gray.png b/client/assets/images/favicon-gray.png index 8b1df7bd4d63fd6818cca8835b242d39eb1805a3..c4e184be6fd29462aacf36c8f352fd37cdae998c 100644 GIT binary patch delta 503 zcmVM$4u;CfZB>Q%kMt9tLJ zUR53!i6ah&#Bukl-gXy1lR;JmS$E!2whW<<{5MT=JYP5dB?~zyQA6VagqsIw)F`v~ z2Ng6d_@7v4RI$h$4Gb6%g9iCm*#;IA#G;X-v;Cb)V=$9EV1EThh(aF17I*_AggCx44aN+|SB_Znl)4c7JK!OR>lY?iY-6R>SuUGZwrXde5l9v0xIu zR6VSd!@7rUa(~$NZGqu%$1PhqOq3bwaCk>W5M0aQI)e^}Ux|IzQdnnr2#3ED4lRHm zGEnl4*G_Tm!eNSF51kGsH!htHCO@4Pnh@@sKAjA19d?rnZmEc4Udc4D%YKpq_(5JW z_pGph$V=v)m6ps}UNRM1agz|W#g3c(94c>%(+vVsj&MGc40}ColENmzK>zB4o46~C zr_5}IR~Y|2tE+VDS==^U9)saDH>|1i;h&SlOtzT+F3t`F00000fc#&}utB1ThA)Ym t60mhr{D}J5_(OTDfsrAhe?oYL;seyq^4&F2^#lL_002ovPDHLkV1j=H=q3OF delta 1014 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 WF6t1?syzXW8U{~SKbLh*2~7Y47ZAw+ delta 1036 zcmV+n1oQi@1eOSp8Gi-<0027t*>V5?02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00X#5L_t(|+U%P&GgN{J3m7QPgL9ng;D037@l9%9+c!PZk<-+% z{oQ+B_hE&EB!|tbc{u2xIZ%y$o+eFD6SR$=m-YQt7|*2y3|WFh5fqP^V_wbzH9#8x zZ^Q-|AQ7wrTBbc2hG5UvL2CeSMFtG8+i-XgKyS{{>rVlCTPQGqqCf70*rPl>z5(FP zP=TrWZc!7CgMZXOtFxH7G6O93<}PTS#7i)muLHCh7%)vSdjfrR9^WqTq%uVU*qNXe zNnp956(65{mmpX-^qQAXt5c%!ZUSKmedb-tzz0lIPo5-K@|3~fq-jyHN92&gcyW?u zoV3GpB{g$v;=BHz16yMx$ddK!VOkq+O%3a3u8{QQ$A9*bNBY*A$woOGZIu4+kA!r7 z{r|i3bMRd-Qgzqf%2=TK;uolva&@9)ZVK-zccWmVbq`+fHVQ`VtW$ovgI0wnDn|k9 zSQg$JRb4HSr5i7adhQNy)UL3ibUA4eDRt=~@2TYxU^-KwB@I|PeV+GJjWP~Kj^Zvek!1j%y@PB8OhCS=Ge89H(LZD(z7O>1cP?w4X z*27m*+9pX|+>{4+8mw0Y55uIJ!b;1CVUZPq%_vIC2w+i6H0gFErDb|$Fh9mQ85oeX zg_(3}b$u9t5i$Z;+obJTOBg5q;2jg6y8R(mqx!$EuJN8~E$jPdojhz1`NeP-9*qS6 zZhs7c={_h^Vp!AJ>*X#j>q(>Netph+YMoU}8MUm9vxYY9b3F(?#z!qg2 zWC-_vcox&_{CWM^OiM1~i)GG3k1wj(vzm+<&0~(B*o$c{Xk1X!{H}sSyC{ZtbNFu7 zZ}6}|I2OcXxE4%2Sf-DM>56$xg2-HBZGTPlngFPh!49{iN{cc~x}w)F7HZoPHEsMs zfhSeP47M{{HtuO!mrutjW!3zAb}o}sYU diff --git a/client/assets/images/favicon-red.png b/client/assets/images/favicon-red.png index 0dddc9548436b0abc6f4257ca28e1de05b72a2ce..64fb0f5e33e086a0203eadc000cc896f625d20e6 100644 GIT binary patch delta 1096 zcmV-O1h@OC58MclBYy-VNkleJ4f%iU-lYLW)_FIySwM_?(XjH z?(XjH?v`Y1VYI>*Pnv9oU8b3NQ19VT-9H$*tG=oc{Ibh6HFy0iMx~#nL^D~8kCny5 z7Fmj)$=}{oq=bPB?&CSUhWFsT_zXTPgu$*#(!KIi@vjsqzJLCAC~DxvfDibB&%lBH zB*h+)rNjb7j9Zv+DKGE|-x#C(pijmhSH#2yOpM0`WBv40;xX=^Hy*BiKo;YZ`GB$) zjEy;Pft96bG(X_a+(B9BpD`C-VHGj{ZGJEZ0|w;cU`{0mJ@H`lc5E9MB#0Nx4Rb6B z?3IV3_sCLWGk+Wh`GPrOu8sa>8Q6eBH|m%6;V|ZMcsFK&qA*@C_oBBRW;G7i#Q}ro zpn}6b%VnST6r6aDpfb;s_U=cdzVjieFTGAm>bW37Pp%ghaq9m%il)g}u!vmSrhl93 zIOM7-IoGa{eda9L2M?3AeJ7b~*ORemDH$_nQ*PWu%6|?SPIbNdQeB5Gq&ICv+85uF z_TI;&zVar%NK$H(C4;Uv_V$tp5cb@DcN6Ff`i_G;K$ylTSrkwB4eS~Q>0f>SXV8KzhBGjMRe%=E0~mn+@Ku|{p2`&%tV{~%7qES_ z@QP|opT!LrtO8Vj9>B2NEAbJ{Np)a zfy;47ySW_lVAg*uL)P{k{vOi27cE3t`ZrA&zc{?D9lN+JTHLlJS5Zm({AU=xZN;!T3{Oc#Z6nr?~|l{6fnOn^@S_-bOOPHMHcGJXi+~{=*LxPsl~Q zlLxNpAtV|7yQY-wJCIyiE>C(`egS|FFc`}(@o)qNW7tJJ#N9=Sc%heR?PJG_l4+S< zD^EiF)oT<0LoAL3&=WA&8eVD{HMT73B!5p(9ZzLLN+d>-MC7-;A`+zQ!Jn zG73UYYwv^6X2fEQX+5S`h{DYRf|fG__RQma2_u;X!Xb ztTvZc+lQ+S;?+|Cm`1jWILV_>kC*SK@u1f#Xm;(%C+`cviCUF)D&8-Fd#hTggeEco O0000Px+V@X6oRA>d|TWf3-RTMsVX1lvxpbxZ_ zLJcudk>DRKh8U@W*kWmY#z#s*Kod3kL!-P@1fpmV5dFaqV>BXas0Kqc778ulRT6@v z8jVUSuU}Fq#s(_;?9BC?*`0M}c6T1TGutiRWHa}1Uf;cU?tk2S&shc@rE?7pq0q$I z*}%jG#`!b=HVqh`1e{G^3?`6T&S4nqhOzEEmijqk{lKNZ@ZW<+CinG)y)ccrDfE1E zb8Wd?wvY+%C<2^?vi*6=k7EZM<1*}w2#M{Jy1NJSl#{{c3gDsU1$PS|EXR?&9~kpx zXep$E^AQ~RJ%2LDo2t8aA1*``@fHMlXkP1FQDASOl-Y$EVvC={5sAa<>V2IDZP8~T z$_wzt#`$&rpl>r{tUZfN&#O4+9r5VM(wg4A15TAW27IZxr3JXqfnY10Dsz(_L0`*g4u@$!4;FY$2PRV6Zj9Cx35j3Dn*oe1u9CI}u(iS{&_d zgJUPxtcP$!sV91E8$_bY*-tC`6{A~-ek}&}%%=q!Z z@K;E}=?D1*u*M(0`L|_!KeaG-a*;p zEhQ>eg`Y#4NyRA8?PBV}%_eL9Wc1mR|2&smdGi;O=4Ae|bly6{W)W7Oa+R9@?V`1w z6a|mRA+qufkbXY_fSZ=!D=$G=<6XA-U4J0-6IOxlja?9CDPrW<@g!KH#P4hLoedD* z({0J;Dgj~@l9%MJip?rasIAf0>AkGXzZTk0PZ&`x6j&{+SGI@vnA3bjye6dciHFmkF^7TLhf%iw;eQ7q zxa?)z0VrF5baSF}H$*pVM%R**u5&$uSOwLw<+^Yafn`niLiyTN00I5=)5w8C5dWgX zgtM?F!m97)!sI#P78`B@@s`ZxL-}kulH`n7z}IHj8B5{RJQjn1z*fv?x+XemD;D=`%VF40m6lci#qK%4A)=R|Ud~Q(EftN`HY?F00aC zgwl;?=>3gF1FP7ASbY>gGX9!6jH$>w9z%;OXWn<~3_Kyd2#J0BL8z~Xz*CEWRaE4p z_n;w8Se4m)xw-W)?y1u^duGZe?ET)Xx#(@f^B=IOllNA1@4{FVOcX6+lWWY9sTdW& z6dHs(_mQ!N#`eA&u_+i4pnn3G;-DxrXsiJ?uKKy`Cv0l0mjajwDGn+ZgSKA2;988B zR;=SZPb47r@u#-c|mR_{f27kq4juCEH&VL@M!ba~YQpFhK?UEC#EYd{`(oXXqqybw(SO85nlC4(pmZpHIrzm!D@QgH?k9zM`algJu51Dc4dSo<uzOMChABl$>tZJFn|J)^vNK6`wXMlBXIHN3$)0c8>rnwToxdc=FPOog zVE+F90q+GG?mP4=oZql9XdVLtV~MAWV@L(#(&_0*EeZl|fqz)4-+%mf{LHu1$)y2v zzTa-oU3KHw=hO!E#xJ&oGXk{!IG_B`v2wA*>?0HJ6)Up}iAG*kX`5=H7&bVUlyRzjx9+Ujy4`a%Ef)OSv;Evdmvya*t;#D4g)Nd79X%3SxcG?ON9%bX zm#ms?{&woR{YEkUt3MnyKDYJIgEc@af7mGs$@$JS*ok9##A8G^vO`=Z1lY;Dk^7+j1nB7=!Y}?yOMr zVp9~})_rHqv9js2`OLeDKZQIxrn$3j$7{)*^9mQ|$D}?k7TM(G&I-WGtBV8RK+kxk&l*^W%|GNYW_;uttfH*|J!4Cs{UmdKI;Vst08F3x3jhEB delta 1077 zcmV-51j_ra1iuK78Gi-<0027t*>V5?02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00ZGkL_t(|+U%RnYZE~fz-QBH1f{hH?Io48B1o}Kf(2VDl87L9Fjep% zJ(T`P!dMWTrvQQ+Dt(S5_<`H^Gg6N*A1A4m|1~+ zbvu1K!V}6Q7r+{VmRthM4K3;P+1Cz&RYQli>eHSY-ZjY3K!z(q47#_pd)t*6jq0EPtI_YMAE6W3_5HbhwS2zc5fb z@<{&cil$N4s~Tl>^(QG7|0=(W8=K_E>RP>^6YAVs(m1NmdXDPK)pNwx(Jow7*Z{@i zrqXDyUcBdR6!hAimGo0>(xW_H*$UW-Whv4@NcV{@GM$Yz5S%XR(?O8Sr82z@QCuxUhf`eBM64} zdqkOZsPA~mj9JiXQx{>_MPS*A)Y1Z26d6rAXGLo1_3karkMT|h)=6^0OuDq)W4wFiu?K z9e)#FzcFm9QT^>(Q@pnprWVKBDv3v$xL?xhOe@m>z!?RY?t_wD3@camdZ}~iq|+## z&oA@dnq&pZW!%akrjeTO!nzZvM~RK%UMyjk{Di0!}xje@)<)*F6wn5^-F69 z4;w}HBH9i|Q0&Dt6*MlW`SohSp@P>LHx&vr)*xlo5Bvf9L(f?k4~S!7)d5|1L)! v8tBIPjE4d5{tvZuLK*gTTYZZ6Pk;dchi9`MgvW?)00000NkvXXu0mjfm%9E1 diff --git a/client/assets/images/home/hero-bg.svg b/client/assets/images/home/hero-bg.svg deleted file mode 100644 index 74536a1ca..000000000 --- a/client/assets/images/home/hero-bg.svg +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/assets/images/home/preview.png b/client/assets/images/home/preview.png deleted file mode 100644 index 2b0eb794caa9469f9ec57dfdc50ec8ae17332b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35041 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

+8a>d+BJkj)W&J%_WCc5-EY)i>I{ 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 FV1i-hI86Wm diff --git a/client/assets/images/runnabear-head.png b/client/assets/images/runnabear-head.png index 6baea151dd406abeab77d84bd4e93adc9d6d025c..c74420e9b1f522a61eab085344e122c7ea69b4c3 100644 GIT binary patch literal 13650 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 E10!f_RsaA1 literal 14339 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 diff --git a/client/assets/images/runnabear-waving-2.png b/client/assets/images/runnabear-waving-2.png index 7f650ecb91a6a1d4cc97a0623fe59f899e8766bf..f0d8b05c213c20ef3b8a8f19b4580a53d5d59c5c 100644 GIT binary patch delta 1125 zcmV-r1e*JlRgzVZBmr5mB^@SzJaFR%VkjEOUG7DY;49=B$q{mgTrIcEK0pMRfoO#* zy6y+?ysj$A{P`S`npOQ$yaz|^I3(jiz-z`C^7=XoR=AaON&Za|2y~@Y8D=%lmX^)7 zbMw14IK5~Yv_ zE%;q;K7774iuJ$3XniEV) z!-@~c35Jk0O|mxomQFBPpYrs9@`lb<{^rH(k2N-B=OgL%O$}4c1f)YrxiDZ2zQ!2W zqu6{3)km+ky7Z!d%sjAdLiAB6*PfVM#vRv6>4*ttjI8_&1hXc{VaM50T8VUw9Y5N1pb?>` zKd}E-A-W}hBckp{kQxP{d_SlUT9&4dR+>%I;A-Qb<1AaBbqsHvij`riZGFm{rHf)6 zYYjwJ6R}!EU~ErowG9KoD*6;6|40g^=(QA>r02*Ru@7iBH0q4b;2)A^c`LJ&VZI05 z++jB4nqo{m@lGTjBFh&Ka0X*`TR#1CNsprkQv{b|J%56gwrmSI=fM9D~%(?SG|g zgpf{H`&p~gf+nBlpLegc1JS6Jr3_R2Yiv&{+6!?|^qAp(J820Srs!t#ytEy4zWiJ7 r2qBJUonOzKX+UL`KRhOTT)CEse&_0T3HM7Ci)ic9f-qyq18- z^121T>&=JHT@<@oI9$(~l(B)(OynHvT+C8Pvo)}CTUp|;w5d;jd46GRYmJz{wNi;U zdA{cR20G?2|M%sb&Jwp`=_Gum)da zj5DHGQYDL{S6f|wdQsLqux�Q7G45F}d_xo|V!OM^5XX(JWC|webiB0cb^ia6C(6 z$3$;vvp&V^SC{3+CgvBLi};-H9j-Y~hN)(P0Ky9Pj#8Z!Q*>!s#L78Y;g(Xz#wPKZ z*d&8&PjpiPp-j8cI7Yzy zbG(m!$uLzHaTEo~%CR6I%&k^Ft;+h6X#&Q`%Fh?=Cj{ATxf@F>k&dzBmo^=6 zBFt&^e=RP5jAqP;sQVG5mV!{eU#JgSmZmMNH1npxIgNwHoz-U-(Cs@FE5lUV`cQ9{ zE{b)`X&@qnYqf}iv3*X}HVg!-=u?RLM^Z3Fuca9ca#!AneL%aSQKxqX|6Xa9uQE#+ z<{@ZOhgnzI6l3Bk?nL4tviwGr-41H3Lps)fLa4!iFRVuRIJE;&MdM&QV)E}3n%*3f zu4S0w&QltkUOWNZc zk1)%?ERZxR!&DR-C`jX`(vUZ*YY0)y1`UB5c-$;AO}!zz3{%ubu|s9|>RmF!zL45^ zRmw(Mh*>&qlU9cjO@5}IH#^#asMpF;hAI9vwoeu9g}5j%*?!qhT0({?nq;1jwxf>T tdPj(}=PK#^IdP{Ir3_ODagqoj{sJsVbipIJAqxNi002ovPDHLkV1f|QCdU8( diff --git a/client/assets/images/slack-notification.png b/client/assets/images/slack-notification.png index 08e3e61d4e896c032798eed681b62cca4820e8c8..a10a9531879cdec0b9e317090476cd88a50371a1 100644 GIT binary patch delta 4817 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 K{pp(Hlm7!+T@#`J delta 4819 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 bDQ?7z=n&=f{)J2`BLm~BX8Pq Date: Thu, 1 Sep 2016 15:06:22 -0700 Subject: [PATCH 119/577] remove extra github icon --- client/templates/svg/svgDefs.jade | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index 4ef04fb29..f943322a5 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -159,8 +159,6 @@ svg(xmlns='http://www.w3.org/2000/svg') path(d='M8.4,9.1c0.1,0,0.3,0,0.4,0.1c0.2,0.2,0.2,0.5,0,0.7l-4,4H8c0.3,0,0.5,0.2,0.5,0.5S8.3,15,8,15H3.5h0c0,0,0,0,0,0h0c0,0,0,0,0,0l0,0c0,0,0,0,0,0l0,0c-0.1,0-0.2,0-0.3-0.1c0,0,0,0,0,0v0c0,0,0,0-0.1-0.1C3,14.7,3,14.6,3,14.5c0,0,0,0,0,0V10c0-0.3,0.2-0.5,0.5-0.5S4,9.7,4,10v3.3l4-4C8.1,9.2,8.2,9.1,8.4,9.1z') symbol#icons-fat-check(viewBox='0 0 30 30') path(d='M24.3,9.2c-0.6-0.6-1.5-0.6-2.1,0l-8.5,8.5l-4.3-4.3c-0.6-0.6-1.5-0.6-2.1,0c-0.6,0.6-0.6,1.5,0,2.1l5.4,5.4c0.3,0.3,0.6,0.4,1.1,0.4c0.4,0,0.8-0.2,1.1-0.4l9.6-9.6C24.8,10.8,24.8,9.8,24.3,9.2z') - symbol#icons-github(viewBox='0 0 30 30') - path(d='M22.4,7.8c2,2,3,4.5,3.1,7.4c0,2.4-0.7,4.4-2,6.2c-1.3,1.8-3,3-5.1,3.8c-0.3,0-0.4,0-0.6-0.1c-0.1-0.1-0.2-0.2-0.2-0.4l0-2.9c0-0.5-0.1-0.9-0.2-1.2c-0.1-0.3-0.3-0.6-0.5-0.7c1.2-0.1,2.3-0.5,3.3-1.2c1-0.7,1.5-2,1.5-4c0-0.6-0.1-1.1-0.3-1.6c-0.2-0.5-0.4-0.9-0.8-1.3c0.1-0.1,0.2-0.5,0.2-0.9c0.1-0.5,0-1.1-0.3-1.8c0,0-0.2,0-0.7,0c-0.5,0.1-1.2,0.4-2.2,1.1C16.8,10,15.9,9.8,15,9.8c-0.9,0-1.8,0.1-2.6,0.3c-1-0.6-1.7-1-2.2-1.1c-0.5-0.1-0.7-0.1-0.7,0C9.2,9.8,9.1,10.5,9.2,11c0.1,0.5,0.1,0.8,0.2,0.9c-0.3,0.4-0.6,0.8-0.8,1.3c-0.2,0.5-0.3,1-0.3,1.6c0.1,2,0.6,3.3,1.5,4c1,0.7,2.1,1.1,3.3,1.2c-0.2,0.1-0.3,0.3-0.4,0.6c-0.1,0.2-0.2,0.5-0.3,0.9c-0.3,0.2-0.8,0.3-1.4,0.3c-0.6,0-1.2-0.4-1.7-1.1c0,0-0.1-0.2-0.4-0.5c-0.3-0.3-0.7-0.5-1.2-0.6c-0.1,0-0.2,0-0.4,0.1c-0.2,0.1-0.1,0.3,0.3,0.6c0,0,0.1,0.1,0.4,0.3c0.3,0.2,0.5,0.6,0.8,1.2c0,0.1,0.2,0.4,0.7,0.9c0.5,0.5,1.4,0.6,2.9,0.4l0,1.9c0,0.2-0.1,0.3-0.2,0.4c-0.1,0.1-0.3,0.2-0.6,0.1c-2.1-0.7-3.8-2-5.1-3.8c-1.3-1.8-2-3.8-2-6.2c0.1-3,1.1-5.5,3.1-7.4c2-2,4.5-3,7.4-3.1C18,4.8,20.5,5.8,22.4,7.8z') symbol#icons-help(viewBox='0 0 16.4 16.8') path(d='M0,14.6c0-1.3,0.9-2.2,2.2-2.2c1.3,0,2.1,0.9,2.1,2.2c0,1.3-0.8,2.2-2.1,2.2C0.9,16.8,0,15.8,0,14.6z M0.8,11.2L0.2,0.3h3.8L3.5,11.2H0.8z') path(d='M9.9,11.3l0-0.6c-0.1-1.2,0.3-2.5,1.4-3.8c0.8-0.9,1.4-1.7,1.4-2.5c0-0.8-0.6-1.4-1.8-1.4c-0.8,0-1.8,0.3-2.4,0.7L7.8,1c0.9-0.5,2.3-1,4-1c3.2,0,4.6,1.8,4.6,3.8c0,1.8-1.1,3-2,4.1c-0.9,1-1.3,1.9-1.2,3v0.4H9.9z M9.3,14.6c0-1.3,0.9-2.2,2.1-2.2c1.3,0,2.1,0.9,2.2,2.2c0,1.3-0.9,2.2-2.2,2.2C10.2,16.8,9.3,15.8,9.3,14.6z') From 2f73e18e7f03739e1c0b9e83ba1eea0d4691be28 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 15:11:49 -0700 Subject: [PATCH 120/577] remove styles for spinner-wrapper inside aha guide --- client/assets/styles/scss/components/aha-guide.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/client/assets/styles/scss/components/aha-guide.scss b/client/assets/styles/scss/components/aha-guide.scss index 65b278110..cb338c976 100644 --- a/client/assets/styles/scss/components/aha-guide.scss +++ b/client/assets/styles/scss/components/aha-guide.scss @@ -14,7 +14,6 @@ } // anchor image - .spinner-wrapper, .aha-meter { height: $input-md; left: 15px; From 5c1da2abc1da55be0c8c1a4210b3956c8c60cebc Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 15:17:27 -0700 Subject: [PATCH 121/577] clean up button spinner --- client/assets/styles/scss/components/aha-sidebar.scss | 4 ---- client/directives/components/ahaGuide/ahaSidebarView.jade | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index f1f4bc52a..69532a655 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -82,10 +82,6 @@ top: 4px; width: 21px; } - - .spinner-wrapper { - float: right; - } } // the details text diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 6f1b97f6f..00cd1add2 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -121,7 +121,7 @@ ) //- add 'disabled' attr if inviting runnabot, or if user isn't an admin hide after successfully inviting runnabot - button.grid-content.shrink.btn.btn-md.green.btn-spinner( + button.grid-content.shrink.btn.btn-md.green( ng-click = "$root.featureFlags.ahaOverview = false" ) svg.iconnables.icons-octicons-github @@ -130,7 +130,7 @@ ) | Invite Runnabot //- if inviting Runnabot - //- .spinner-wrapper.spinner-sm.spinner-white.in( + //- .spinner-wrapper.spinner-sm.spinner-white.float-right( //- ng-include = "'spinner'" //- ) From 322dd9616c14a159e230a684c8b67e070b0ff2f2 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 15:19:17 -0700 Subject: [PATCH 122/577] clean up popover-add-branches --- client/assets/styles/scss/popover/popover-add-branches.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-add-branches.scss b/client/assets/styles/scss/popover/popover-add-branches.scss index 95b5493b3..b66aa4410 100644 --- a/client/assets/styles/scss/popover/popover-add-branches.scss +++ b/client/assets/styles/scss/popover/popover-add-branches.scss @@ -1,7 +1,7 @@ -.popover.popover-add-branches { +.popover-add-branches { max-width: 330px; .btn-menu { - margin-left: 20px; + margin-left: 15px; } } From 24a8bdfc0ca3701bc7e60f70003c9e8e7675c657 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 15:24:00 -0700 Subject: [PATCH 123/577] better alignment for aha guide in branch menu --- client/assets/styles/scss/popover/popover-branch-menu.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 799fc4efd..c74178aa0 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -4,10 +4,10 @@ width: 100%; .aha-guide { - padding-bottom: 21px; border-bottom: 1px solid $gray-lighter; font-size: 15px; - margin: 6px 6px 0; + margin-top: 6px; + padding-bottom: 21px; } .well { From df8845fab6174b56c6e139be7953460a10dcd402 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 15:29:55 -0700 Subject: [PATCH 124/577] shorten copy to prevent clipping --- .../ahaGuide/components/setUpRepositoryGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 03ded941c..5071f3c5a 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -122,7 +122,7 @@ p.p( ng-class = "{'p-slide js-animate': state.showSubStep}" ng-if = "state.showSubStep === 8 && !state.showError" - ) Your build is looking good! Check out the URL, then click ‘Done’ if it looks good to you. + ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. //- Step 10 (in the nav popover): p.p( From 1a3aea5b6d6598cf91e390f694662bcfb2339a69 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 15:32:53 -0700 Subject: [PATCH 125/577] fix confirm setup buttons at xxxs --- client/directives/environment/modals/confirmSetupView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/modals/confirmSetupView.jade b/client/directives/environment/modals/confirmSetupView.jade index 3ab285299..d89c3fa17 100644 --- a/client/directives/environment/modals/confirmSetupView.jade +++ b/client/directives/environment/modals/confirmSetupView.jade @@ -17,5 +17,5 @@ a.link chat with our devs | . footer.modal-footer.clearfix - button.btn.btn-md.white.float-left Go Back + button.btn.btn-md.btn-cancel.gray.float-left Go Back button.btn.btn-md.green.float-right It‘s Running! From 2e40658f0973885609c6010e36df9c1ca024a5b0 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 1 Sep 2016 15:44:42 -0700 Subject: [PATCH 126/577] update milestone 4 copy --- client/directives/components/ahaGuide/ahaSidebarView.jade | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 00cd1add2..c0ee574a4 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -102,7 +102,7 @@ ng-if = "$root.featureFlags.aha3" ) header.grid-block.shrink.align-center.justify-center.aha-sidebar-header - h4.grid-content.shrink.strong.text-center.h4 One more thing… + h4.grid-content.shrink.strong.text-center.h4 You did it! svg.iconnables.icons-close( ng-click = "\ $root.featureFlags.aha = false;\ @@ -113,8 +113,9 @@ use( xlink:href = "#icons-close" ) - p.grid-content.shrink.p You did it! Now invite Runnabot to your org to get helpful comments on your pull requests: + p.grid-content.shrink.p Now you can invite our bot to your GitHub org to get notifications on your pull requests: img.grid-content.shrink.img.img-comment( + alt = "Runnabot sample comment on a GitHub pull request." height = "206" src = "/build/images/runnabot-comment.png" width = "358" From c57336fdeaa7f540ece38ffeb1b33f6b2c0244d3 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 16:58:37 -0700 Subject: [PATCH 127/577] add github form to settings modal --- .../styles/scss/components/aha-sidebar.scss | 13 ++--- .../scss/components/buttons/buttons.scss | 1 - .../styles/scss/forms/forms-github.scss | 46 +++++++---------- .../viewPopoverAccountMenu.jade | 2 +- .../components/ahaGuide/ahaGuideView.jade | 5 -- .../components/ahaGuide/ahaSidebarView.jade | 51 +------------------ .../components/setUpRunnabotGuideView.jade | 14 ----- .../gitHubIntegrationView.jade | 51 +++++++++++++++++++ .../forms/gitHubForm/gitHubForm.jade | 42 +++------------ .../settingsModal/settingsModalView.jade | 2 +- client/templates/svg/svgDefs.jade | 27 ++++++++-- 11 files changed, 108 insertions(+), 146 deletions(-) delete mode 100644 client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade create mode 100644 client/directives/components/gitHubIntegration/gitHubIntegrationView.jade diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 69532a655..280d00b65 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -74,14 +74,11 @@ max-width: 100%; } - .btn { - - .iconnables { - height: 21px; - margin-right: 6px; - top: 4px; - width: 21px; - } + .btn .iconnables { + height: 21px; + margin-right: 6px; + top: 4px; + width: 21px; } // the details text diff --git a/client/assets/styles/scss/components/buttons/buttons.scss b/client/assets/styles/scss/components/buttons/buttons.scss index 01241d797..954347d79 100755 --- a/client/assets/styles/scss/components/buttons/buttons.scss +++ b/client/assets/styles/scss/components/buttons/buttons.scss @@ -45,7 +45,6 @@ > .spinner-wrapper { align-items: center; display: flex; - float: left; height: 100%; &:first-child { diff --git a/client/assets/styles/scss/forms/forms-github.scss b/client/assets/styles/scss/forms/forms-github.scss index e0f579427..144becbcf 100644 --- a/client/assets/styles/scss/forms/forms-github.scss +++ b/client/assets/styles/scss/forms/forms-github.scss @@ -1,40 +1,30 @@ +// github form .form-github { - .label-col { - @include media(xs) { - width: auto; - } + > .img.img.img { + margin-bottom: 30px; + margin-top: 30px; } - .input-col { - @include media(xs) { - padding-right: 15px; - } + .btn .iconnables { + height: 21px; + margin-right: 6px; + top: 4px; + width: 21px; } - .well { - padding-bottom: 0; + // the details text + .grid-content.small, + .text-red { + margin-top: 15px; } - .ol { - font-size: 14px; - list-style-type: decimal; - padding-left: 24px; - - + .link { - border-top: 1px solid $gray-lighter; - line-height: 1.2; - margin-top: 15px; + // success state + .runnabot-success { + max-width: 210px; - .iconnables { - height: 18px; - margin-right: 6px; - width: 18px; - } + .img.img { + margin-right: 9px; } } - - .li + .li { - margin-top: 6px; - } } diff --git a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade index c35768eb0..6bfa08328 100644 --- a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade +++ b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade @@ -63,7 +63,7 @@ ) svg.iconnables use( - xlink:href = "#icons-github" + xlink:href = "#icons-runnabot" ) | GitHub Integration li.list-item.popover-list-item( diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 55c86a34c..61baf3bc0 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -15,11 +15,6 @@ ng-include = "'addBranchGuideView'" ) -.grid-block.align-center( - ng-if = "state.showStep === 3" - ng-include = "'setUpRunnabotGuideView'" -) - button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" ng-if = "!state.hideMenu" diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 1c41440cd..3172120ba 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -113,53 +113,6 @@ use( xlink:href = "#icons-close" ) - p.grid-content.shrink.p Now you can invite our bot to your GitHub org to get notifications on your pull requests: - img.grid-content.shrink.img.img-comment( - alt = "Runnabot sample comment on a GitHub pull request." - height = "206" - src = "/build/images/runnabot-comment.png" - width = "358" + .grid-block.vertical.align-center( + ng-include = "'gitHubIntegrationView'" ) - //- add 'disabled' attr if inviting runnabot, or if user isn't an admin - hide after successfully inviting runnabot - button.grid-content.shrink.btn.btn-md.green( - ng-click = "$root.featureFlags.ahaOverview = false" - ) - svg.iconnables.icons-octicons-github - use( - xlink:href = "#icons-octicons-github" - ) - | Invite Runnabot - //- if inviting Runnabot - //- .spinner-wrapper.spinner-sm.spinner-white.float-right( - //- ng-include = "'spinner'" - //- ) - - //- show after successfully inviting runnabot - //- .grid-block.shrink.well.gray.padding-sm.runnabot-success - img.grid-content.shrink.img( - height = "36" - src = "/build/images/runnabot-head.png" - width = "36" - ) - p.small.text-gray.text-left Nice! Runnabot will join your team soon. - - - .grid-content.shrink.small( - ng-class = "{\ - 'text-gray': !state.adminRequired,\ - 'text-red': state.adminRequired\ - }" - ng-init = "state.adminRequired = false" - ) - //- if the user is an admin: - | This may affect your GitHub bill. - - //- if the user is not an admin: - //- | Sorry, you’ll need help from an admin - //- br - //- | of your org to invite Runnabot. - - //- always show this: - br - a.small.link More about Runnabot diff --git a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade deleted file mode 100644 index 688aa4067..000000000 --- a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade +++ /dev/null @@ -1,14 +0,0 @@ -.grid-block.shrink.aha-meter( - ng-class = "{'aha-meter-50': $root.featureFlags.aha3}" -) - svg.iconnables - use( - xlink:href = "#icons-runnabot" - ) - //- if complete - //- use( - //- xlink:href = "#icons-check" - //- ) -.grid-block.vertical.aha-text - p.p.small.text-gray-light Set Up Runnabot - p.p Set up auto-branching before booting up Runnabot. diff --git a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade new file mode 100644 index 000000000..efff3fa2d --- /dev/null +++ b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade @@ -0,0 +1,51 @@ +p.grid-content.shrink.p.text-center Now you can invite our bot to your GitHub org to get notifications on your pull requests: + +img.grid-content.shrink.img.img-comment( + alt = "Runnabot sample comment on a GitHub pull request." + height = "206" + src = "/build/images/runnabot-comment.png" + width = "358" +) +//- add 'disabled' attr if inviting runnabot, or if user isn't an admin + hide after successfully inviting runnabot +button.grid-content.shrink.btn.btn-md.green( + ng-click = "$root.featureFlags.ahaOverview = false" +) + svg.iconnables.icons-octicons-github + use( + xlink:href = "#icons-octicons-github" + ) + | Invite Runnabot + //- if inviting Runnabot + //- .spinner-wrapper.spinner-sm.spinner-white.float-right( + //- ng-include = "'spinner'" + //- ) + +//- show after successfully inviting runnabot +//- .grid-block.shrink.well.gray.padding-sm.runnabot-success + img.grid-content.shrink.img( + height = "36" + src = "/build/images/runnabot-head.png" + width = "36" + ) + p.small.text-gray.text-left Nice! Runnabot will join your team soon. + + +.grid-content.shrink.small.text-center( + ng-class = "{\ + 'text-gray': !state.adminRequired,\ + 'text-red': state.adminRequired\ + }" + ng-init = "state.adminRequired = false" +) + //- if the user is an admin: + | This may affect your GitHub bill. + + //- if the user is not an admin: + //- | Sorry, you’ll need help from an admin + //- br + //- | of your org to invite Runnabot. + + //- always show this: + br + a.small.link More about Runnabot diff --git a/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade b/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade index 4759ff00b..a284fb9f9 100644 --- a/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade +++ b/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade @@ -1,35 +1,9 @@ -.modal-form.form-github +//- If loading: +//- .modal-form + .spinner-wrapper.spinner-md.spinner-gray.in( + ng-include = "'spinner'" + ) - //- .spinner-wrapper.spinner-md.spinner-gray.in( - //- ng-include = "'spinner'" - //- ) - - label.label.clearfix - .grid-block.align-center - .grid-block.shrink.label-col Enable PR Comments - - .grid-block.justify-right.input-col - input.toggle-input( - type = "checkbox" - ) - .toggle-group.toggle-sm - small.small.padding-xxs Runnabot will comment on your pull requests with your container url and status. - .well.gray.padding-sm - .label-col.full-width Powering Up Runnabot - ol.ol.padding-xxs - li.li Go to - a.link( - href = "https://github.com/orgs/CodeNow/people" - target = "_blank" - ) your team on GitHub - |, and click on “Invite member”. - li.li Look for “Runnabot” and add our bot as a member to your org. - a.grid-block.link.small.padding-xxs( - href = "https://support.runnable.com/hc/en-us/articles/210294023-How-do-I-invite-Runnabot-to-my-GitHub-Organization-" - target = "_blank" - ) - svg.grid-content.shrink.iconnables - use( - xlink:href = "#icons-life-preserver" - ) - | I need help (with pictures)! +.modal-form.empty.grid-block.vertical.align-center.form-github( + ng-include = "'gitHubIntegrationView'" +) diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index db8e3ea7a..a1b591bbe 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -43,7 +43,7 @@ ) svg.iconnables.grid-content use( - xlink:href = "#icons-github" + xlink:href = "#icons-runnabot" ) .btn-text.grid-content GitHub Integration button.btn.btn-radio.grid-block.vertical( diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index e17873b9a..c340ea7ad 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -566,11 +566,28 @@ svg(xmlns='http://www.w3.org/2000/svg') path(fill='#EBFFEE', d='M12.5,16.6c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S14.7,16.6,12.5,16.6z') path(fill='#3CCB5A', d='M12.5,9.1c1.9,0,3.5,1.6,3.5,3.5s-1.6,3.5-3.5,3.5S9,14.5,9,12.6S10.6,9.1,12.5,9.1 M12.5,8.1c-2.5,0-4.5,2-4.5,4.5s2,4.5,4.5,4.5s4.5-2,4.5-4.5S15,8.1,12.5,8.1L12.5,8.1z') polygon(fill='#3CCB5A', points='15,12.1 13,12.1 13,10.1 12,10.1 12,12.1 10,12.1 10,13.1 12,13.1 12,15.1 13,15.1 13,13.1 15,13.1 ') - symbol#icons-runnabot(viewBox='0 0 18 18') - circle(cx='9', cy='9', r='9', fill='none') - path(d='M11.519,4.624H6.481A2.871,2.871,0,0,0,3.61,7.494V9.512a2.871,2.871,0,0,0,2.871,2.871H8.75c0.862,0.969,2.621,2.777,2.38,1.1a5.374,5.374,0,0,1-.07-1.1h0.46A2.871,2.871,0,0,0,14.39,9.512V7.494A2.871,2.871,0,0,0,11.519,4.624Z') - circle(cx='6.87', cy='8.503', r='0.937', fill='#fff') - circle(cx='11.13', cy='8.503', r='0.937', fill='#fff') + symbol#icons-runnabot(viewBox='0 0 196.895 188.791') + path(d='M170.416,71.526c-9.638-24.9,26.808-22.087,25.553-42.805-0.7-11.537-18.819-21.752-29.187-19.263-17.071,4.1-18.645,27.108-19.963,41.421', transform='translate(-1.553 -5.604)', fill='#853cbe', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M157.973,45.6s3.38-15.743,15.126-19c7.894-2.183,12.405,3.3,11.663,7.34-1.13,6.13-18.691,14.4-21.208,18.7', transform='translate(-1.553 -5.604)', fill='#44275e') + path(d='M31.429,8.265c-1.405-1.35-8.635,3.848-16.138,11.61S2.836,35.021,4.238,36.371L30.4,66.067l31.717-32.79Z', transform='translate(-1.553 -5.604)', fill='#d1d3d4', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M30,15.975a69.27,69.27,0,0,1-8.238,10,62.482,62.482,0,0,1-9.725,7.959', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M31.429,8.265c-1.405-1.35-8.635,3.848-16.138,11.61S2.836,35.021,4.238,36.371L30.4,66.067l31.717-32.79Z', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M179.771,112.563v-8.107c-2.667-27.65-6.789-61.415-20.11-70.124-12.094-7.906-30.28-11.523-42.161-12.3-7.667,0-12.9-.54-23.561,0C74.12,23.2,55.466,26.948,44.166,35.9c-12.28,9.728-16.326,40.937-19.252,69.793v6.869c0,43.845,54.164,79.386,77.427,79.386S179.771,156.407,179.771,112.563Z', transform='translate(-1.553 -5.604)', fill='#853cbe', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M43.364,63.387s8.2-13.269,24.329-13.269', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895', opacity='0.15', style='mix-blend-mode:multiply') + path(d='M43.364,59.6s8.2-13.268,24.329-13.268', transform='translate(-1.553 -5.604)', fill='none', stroke='#2f1244', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + circle(cx='56.568', cy='61.675', r='5.991', fill='#2f1244') + path(d='M43.345,63.181s8.2-13.269,24.329-13.269', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895', opacity='0.15', style='mix-blend-mode:multiply') + path(d='M43.345,59.394s8.2-13.268,24.329-13.268', transform='translate(-1.553 -5.604)', fill='none', stroke='#2f1244', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + circle(cx='56.548', cy='61.47', r='5.991', fill='#2f1244') + path(d='M45.033,35.866c-12.254,9.708-16.909,39.727-19.991,68.591,30.6-9.852,70.288-13.469,70.288-13.469L92.552,22.032c-0.072.059-.143,0.117-0.21,0.178C72.032,23.4,56.611,26.694,45.033,35.866Z', transform='translate(-1.553 -5.604)', fill='#d1d3d4', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M44.356,60.451s4.139,10.8,15.4,10.8S76.72,59.465,76.72,59.465', transform='translate(-1.553 -5.604)', fill='#2ab0f6', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M93.94,58.648s-31.543.5-61.69,1.8', transform='translate(-1.553 -5.604)', fill='#bcbec0', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M79.052,72.612c14.287-20.474,76.266-14.465,50.913,51.08-3.68,9.549-12.91,26.308-13.81,26.563-4.373,7.175-9.766,3.884-14.333-2.674-1.27,1.42-10.322,4.039-11.643,5.43C76.582,136.565,64.759,93.087,79.052,72.612Z', transform='translate(-1.553 -5.604)', fill='#ccadd2', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + line(x1='96.932', y1='117.605', x2='107.932', y2='117.605', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M122.013,80.2c-2.448-2.533-9.992-3.82-18.027-3.867-8.033.047-15.579,1.334-18.029,3.867-5.713,5.9,7.612,19.4,18.029,20.237C114.4,99.6,127.725,86.1,122.013,80.2Z', transform='translate(-1.553 -5.604)', fill='#44275e') + line(x1='102.473', y1='117.605', x2='102.473', y2='94.836', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') + path(d='M102.341,170.756c-30.9,0-70.677-31.176-76.792-71.149-0.218,2.036-.429,4.069-0.634,6.087v6.869c0,43.845,54.164,79.386,77.427,79.386s77.431-35.541,77.431-79.386v-8.107c-0.175-1.808-.356-3.642-0.545-5.493C173.543,139.243,133.243,170.756,102.341,170.756Z', transform='translate(-1.553 -5.604)', fill='#231f20', stroke='#231f20', stroke-miterlimit='10', stroke-width='4.895', opacity='0.25', style='mix-blend-mode:multiply') + path(d='M139.681,61.527a9,9,0,1,0,8.994-9A9,9,0,0,0,139.681,61.527Z', transform='translate(-1.553 -5.604)', fill='#2f1244') symbol#icons-server-delete(viewBox='0 0 18 18') path(fill='#E6E6E6', d='M8,15.185c-0.129,0-0.258-0.03-0.374-0.088l-6.664-3.332C0.677,11.622,0.5,11.336,0.5,11.018v-6.35c0-0.318,0.177-0.604,0.462-0.747l6.665-3.332C7.742,0.531,7.871,0.5,8,0.5s0.258,0.031,0.374,0.088l6.665,3.332C15.323,4.063,15.5,4.35,15.5,4.667v6.35c0,0.313-0.182,0.606-0.462,0.747l-6.665,3.332C8.258,15.154,8.129,15.185,8,15.185z') path(fill='#999999', d='M8,1c0.052,0,0.104,0.012,0.15,0.035l6.665,3.332C14.929,4.425,15,4.54,15,4.668v6.35c0,0.128-0.071,0.243-0.185,0.3L8.15,14.649C8.104,14.673,8.052,14.685,8,14.685c-0.052,0-0.104-0.012-0.15-0.035l-6.665-3.332C1.071,11.26,1,11.145,1,11.017v-6.35c0-0.128,0.071-0.243,0.185-0.3L7.85,1.035C7.896,1.012,7.948,1,8,1 M8,0C7.795,0,7.591,0.047,7.403,0.141L0.738,3.473C0.286,3.7,0,4.162,0,4.668v6.35c0,0.506,0.286,0.968,0.738,1.194l6.665,3.332C7.591,15.638,7.795,15.685,8,15.685s0.409-0.047,0.597-0.141l6.665-3.332C15.714,11.985,16,11.523,16,11.017v-6.35c0-0.506-0.286-0.968-0.738-1.194L8.597,0.141C8.409,0.047,8.205,0,8,0L8,0z') From 8ec001764b85df3dc8bd96ecc6d5d8671d470e3d Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 17:15:03 -0700 Subject: [PATCH 128/577] pull in taylor's changes --- .../styles/scss/components/aha-sidebar.scss | 27 ------------ .../styles/scss/forms/forms-github.scss | 42 +++++++++++++++++-- .../components/ahaGuide/ahaSidebarView.jade | 2 +- .../gitHubIntegrationView.jade | 7 ++-- 4 files changed, 44 insertions(+), 34 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 280d00b65..67d737ef0 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -67,33 +67,6 @@ .p { margin-top: 30px; } - - .img-comment { - height: auto; - margin: 30px 0; - max-width: 100%; - } - - .btn .iconnables { - height: 21px; - margin-right: 6px; - top: 4px; - width: 21px; - } - - // the details text - .grid-content.small, - .text-red { - margin-top: 15px; - } - } - - .runnabot-success { - max-width: 210px; - - .img { - margin-right: 9px; - } } .aha-guide { diff --git a/client/assets/styles/scss/forms/forms-github.scss b/client/assets/styles/scss/forms/forms-github.scss index 144becbcf..5568f4964 100644 --- a/client/assets/styles/scss/forms/forms-github.scss +++ b/client/assets/styles/scss/forms/forms-github.scss @@ -21,10 +21,46 @@ // success state .runnabot-success { - max-width: 210px; + max-width: 215px; + overflow: visible; + position: relative; - .img.img { - margin-right: 9px; + .well { + background: $white; + border-color: $gray-lighter; + position: relative; + } + + .arrow::after { + border-right-color: $white; + } + + .arrow, + .arrow::after { + border-color: transparent; + border-style: solid; + position: absolute; + } + + .arrow { + border-bottom-width: 10px; + border-left-width: 0; + border-right: 10px solid darken($gray-lighter,5); + border-top-width: 10px; + left: -10px; + margin-top: -10px; + top: 50%; + + &::after { + border-bottom-width: 9px; + border-left-width: 0; + border-right: 9px solid $white; + border-top-width: 9px; + bottom: -9px; + content: ''; + display: block; + left: 1px; + } } } } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 3172120ba..b0dd48d6f 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -113,6 +113,6 @@ use( xlink:href = "#icons-close" ) - .grid-block.vertical.align-center( + .grid-block.vertical.align-center.form-github( ng-include = "'gitHubIntegrationView'" ) diff --git a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade index efff3fa2d..92cd814aa 100644 --- a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade @@ -22,14 +22,15 @@ button.grid-content.shrink.btn.btn-md.green( //- ) //- show after successfully inviting runnabot -//- .grid-block.shrink.well.gray.padding-sm.runnabot-success +//- .grid-block.align-center.shrink.runnabot-success img.grid-content.shrink.img( height = "36" src = "/build/images/runnabot-head.png" width = "36" ) - p.small.text-gray.text-left Nice! Runnabot will join your team soon. - + .grid-content.well.padding-xs.ignore-margin + .arrow + p.small.text-gray.text-left Thanks! See you soon on your pull requests. .grid-content.shrink.small.text-center( ng-class = "{\ From 22cae5c3c6c55e8254e115eac90ddebed9a7ff12 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 17:19:53 -0700 Subject: [PATCH 129/577] update github integration title --- .../popoverAccountMenu/viewPopoverAccountMenu.jade | 4 ++-- client/directives/modals/settingsModal/settingsModalView.jade | 4 ++-- client/templates/svg/svgDefs.jade | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade index 6bfa08328..e37e17a92 100644 --- a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade +++ b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade @@ -63,9 +63,9 @@ ) svg.iconnables use( - xlink:href = "#icons-runnabot" + xlink:href = "#icons-octicons-github-gray" ) - | GitHub Integration + | PR Integration li.list-item.popover-list-item( ng-click = "actions.openSettingsModal('slackIntegration')" ) diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index a1b591bbe..339297633 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -43,9 +43,9 @@ ) svg.iconnables.grid-content use( - xlink:href = "#icons-runnabot" + xlink:href = "#icons-octicons-github-gray" ) - .btn-text.grid-content GitHub Integration + .btn-text.grid-content PR Integration button.btn.btn-radio.grid-block.vertical( ng-class = "{'active': SEMC.currentTab === 'slackIntegration'}" ng-click = "SEMC.currentTab = 'slackIntegration'" diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index c340ea7ad..22b25cdd4 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -624,6 +624,8 @@ svg(xmlns='http://www.w3.org/2000/svg') path(d='M11.747,5.129a1.481,1.481,0,0,1,1.5,1.5,1.415,1.415,0,0,1-.205.756,1.549,1.549,0,0,1-.545.533V8.129a3.011,3.011,0,0,1-.937,2.062,3.011,3.011,0,0,1-2.063.938,1.624,1.624,0,0,0-.7.135,1.218,1.218,0,0,0-.445.346,1.5,1.5,0,1,1-2.6,1.02,1.415,1.415,0,0,1,.205-0.756A1.549,1.549,0,0,1,6.5,11.34V6.43A1.549,1.549,0,0,1,5.952,5.9a1.415,1.415,0,0,1-.205-0.756,1.5,1.5,0,1,1,3,0,1.415,1.415,0,0,1-.205.756A1.549,1.549,0,0,1,8,6.43V9.981a3.087,3.087,0,0,1,1.5-.34,1.613,1.613,0,0,0,1.5-1.5V7.93A1.549,1.549,0,0,1,10.452,7.4a1.415,1.415,0,0,1-.205-0.756,1.481,1.481,0,0,1,1.5-1.5V5.129ZM6.719,4.614a0.738,0.738,0,1,0,1.055,0A0.736,0.736,0,0,0,6.719,4.614Zm1.055,8.555a0.738,0.738,0,1,0-1.055,0A0.736,0.736,0,0,0,7.774,13.168Zm4.5-6a0.738,0.738,0,1,0-1.055,0A0.736,0.736,0,0,0,12.274,7.168Z') symbol#icons-octicons-github(viewBox='0 0 18 18') path(d='M15.372,2.628a9.007,9.007,0,0,1,.888,11.68,9.062,9.062,0,0,1-4.412,3.234,0.515,0.515,0,0,1-.475-0.1,0.486,0.486,0,0,1-.141-0.343l0.018-2.461a2.9,2.9,0,0,0-.193-1.046,1.664,1.664,0,0,0-.422-0.624,5.256,5.256,0,0,0,2.8-1.011q1.239-.905,1.31-3.436a3.844,3.844,0,0,0-.255-1.336,3.427,3.427,0,0,0-.677-1.072,2.44,2.44,0,0,0,.176-0.809,3.7,3.7,0,0,0-.264-1.582,1.289,1.289,0,0,0-.6.026,5.553,5.553,0,0,0-1.881.905,8.62,8.62,0,0,0-4.5,0A5.553,5.553,0,0,0,4.87,3.753a1.289,1.289,0,0,0-.6-0.026,3.7,3.7,0,0,0-.264,1.582,2.44,2.44,0,0,0,.176.809,3.429,3.429,0,0,0-.677,1.072,3.844,3.844,0,0,0-.255,1.336q0.07,2.531,1.3,3.436a5.232,5.232,0,0,0,2.812,1.011,1.45,1.45,0,0,0-.36.475,2.56,2.56,0,0,0-.22.738,2.487,2.487,0,0,1-1.2.22,1.815,1.815,0,0,1-1.424-.976,2.414,2.414,0,0,0-.484-0.562,1.325,1.325,0,0,0-.888-0.352q-0.527.018-.4,0.229a0.993,0.993,0,0,0,.413.352,1.937,1.937,0,0,1,.562.615,4.326,4.326,0,0,1,.352.65,1.648,1.648,0,0,0,.738.879,3.375,3.375,0,0,0,2.285.193L6.768,17.1a0.486,0.486,0,0,1-.141.343,0.515,0.515,0,0,1-.475.1A9.064,9.064,0,0,1,1.74,14.308,9,9,0,0,1,15.372,2.628Z') + symbol#icons-octicons-github-gray(viewBox='0 0 18 18') + path(fill='#555', d='M15.372,2.628a9.007,9.007,0,0,1,.888,11.68,9.062,9.062,0,0,1-4.412,3.234,0.515,0.515,0,0,1-.475-0.1,0.486,0.486,0,0,1-.141-0.343l0.018-2.461a2.9,2.9,0,0,0-.193-1.046,1.664,1.664,0,0,0-.422-0.624,5.256,5.256,0,0,0,2.8-1.011q1.239-.905,1.31-3.436a3.844,3.844,0,0,0-.255-1.336,3.427,3.427,0,0,0-.677-1.072,2.44,2.44,0,0,0,.176-0.809,3.7,3.7,0,0,0-.264-1.582,1.289,1.289,0,0,0-.6.026,5.553,5.553,0,0,0-1.881.905,8.62,8.62,0,0,0-4.5,0A5.553,5.553,0,0,0,4.87,3.753a1.289,1.289,0,0,0-.6-0.026,3.7,3.7,0,0,0-.264,1.582,2.44,2.44,0,0,0,.176.809,3.429,3.429,0,0,0-.677,1.072,3.844,3.844,0,0,0-.255,1.336q0.07,2.531,1.3,3.436a5.232,5.232,0,0,0,2.812,1.011,1.45,1.45,0,0,0-.36.475,2.56,2.56,0,0,0-.22.738,2.487,2.487,0,0,1-1.2.22,1.815,1.815,0,0,1-1.424-.976,2.414,2.414,0,0,0-.484-0.562,1.325,1.325,0,0,0-.888-0.352q-0.527.018-.4,0.229a0.993,0.993,0,0,0,.413.352,1.937,1.937,0,0,1,.562.615,4.326,4.326,0,0,1,.352.65,1.648,1.648,0,0,0,.738.879,3.375,3.375,0,0,0,2.285.193L6.768,17.1a0.486,0.486,0,0,1-.141.343,0.515,0.515,0,0,1-.475.1A9.064,9.064,0,0,1,1.74,14.308,9,9,0,0,1,15.372,2.628Z') symbol#icons-octicons-repo(viewBox='0 0 18 18') circle(cx='9', cy='9', r='9', fill='none') path(d='M13.293,4.446v7.806a0.63,0.63,0,0,1-.213.457,0.761,0.761,0,0,1-.5.193H9v1.3l-1.073-.976L6.854,14.2V12.9H5.422a0.761,0.761,0,0,1-.5-0.193,0.629,0.629,0,0,1-.212-0.457V4.446a0.629,0.629,0,0,1,.212-0.457,0.761,0.761,0,0,1,.5-0.193h7.156a0.761,0.761,0,0,1,.5.193A0.63,0.63,0,0,1,13.293,4.446Zm-0.716,6.505H5.422v1.3H6.854V11.6H9v0.651h3.578v-1.3Zm0-6.505H6.138V10.3h6.44V4.446ZM7.569,5.1H6.854V5.748H7.569V5.1Zm0,1.3H6.854V7.048H7.569V6.4Zm0,1.3H6.854V8.349H7.569V7.7Zm0,1.951H6.854V9H7.569V9.651h0Z') From ac2a6b3c029bfc773889b552c4255516b52a66c6 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 17:22:17 -0700 Subject: [PATCH 130/577] remove unused selector --- client/assets/styles/scss/forms/forms-github.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/assets/styles/scss/forms/forms-github.scss b/client/assets/styles/scss/forms/forms-github.scss index 5568f4964..e5e56fe37 100644 --- a/client/assets/styles/scss/forms/forms-github.scss +++ b/client/assets/styles/scss/forms/forms-github.scss @@ -14,8 +14,7 @@ } // the details text - .grid-content.small, - .text-red { + .grid-content.small { margin-top: 15px; } From 2e7763280acc987becc819273b01d88d4d50f9e2 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 1 Sep 2016 17:27:45 -0700 Subject: [PATCH 131/577] fix img width and remove extra icon --- .../styles/scss/forms/forms-github.scss | 2 ++ client/templates/svg/svgDefs.jade | 22 ------------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/client/assets/styles/scss/forms/forms-github.scss b/client/assets/styles/scss/forms/forms-github.scss index e5e56fe37..1dd80f771 100644 --- a/client/assets/styles/scss/forms/forms-github.scss +++ b/client/assets/styles/scss/forms/forms-github.scss @@ -2,8 +2,10 @@ .form-github { > .img.img.img { + height: auto; margin-bottom: 30px; margin-top: 30px; + max-width: 100%; } .btn .iconnables { diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index 22b25cdd4..7f2964e28 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -566,28 +566,6 @@ svg(xmlns='http://www.w3.org/2000/svg') path(fill='#EBFFEE', d='M12.5,16.6c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S14.7,16.6,12.5,16.6z') path(fill='#3CCB5A', d='M12.5,9.1c1.9,0,3.5,1.6,3.5,3.5s-1.6,3.5-3.5,3.5S9,14.5,9,12.6S10.6,9.1,12.5,9.1 M12.5,8.1c-2.5,0-4.5,2-4.5,4.5s2,4.5,4.5,4.5s4.5-2,4.5-4.5S15,8.1,12.5,8.1L12.5,8.1z') polygon(fill='#3CCB5A', points='15,12.1 13,12.1 13,10.1 12,10.1 12,12.1 10,12.1 10,13.1 12,13.1 12,15.1 13,15.1 13,13.1 15,13.1 ') - symbol#icons-runnabot(viewBox='0 0 196.895 188.791') - path(d='M170.416,71.526c-9.638-24.9,26.808-22.087,25.553-42.805-0.7-11.537-18.819-21.752-29.187-19.263-17.071,4.1-18.645,27.108-19.963,41.421', transform='translate(-1.553 -5.604)', fill='#853cbe', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M157.973,45.6s3.38-15.743,15.126-19c7.894-2.183,12.405,3.3,11.663,7.34-1.13,6.13-18.691,14.4-21.208,18.7', transform='translate(-1.553 -5.604)', fill='#44275e') - path(d='M31.429,8.265c-1.405-1.35-8.635,3.848-16.138,11.61S2.836,35.021,4.238,36.371L30.4,66.067l31.717-32.79Z', transform='translate(-1.553 -5.604)', fill='#d1d3d4', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M30,15.975a69.27,69.27,0,0,1-8.238,10,62.482,62.482,0,0,1-9.725,7.959', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M31.429,8.265c-1.405-1.35-8.635,3.848-16.138,11.61S2.836,35.021,4.238,36.371L30.4,66.067l31.717-32.79Z', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M179.771,112.563v-8.107c-2.667-27.65-6.789-61.415-20.11-70.124-12.094-7.906-30.28-11.523-42.161-12.3-7.667,0-12.9-.54-23.561,0C74.12,23.2,55.466,26.948,44.166,35.9c-12.28,9.728-16.326,40.937-19.252,69.793v6.869c0,43.845,54.164,79.386,77.427,79.386S179.771,156.407,179.771,112.563Z', transform='translate(-1.553 -5.604)', fill='#853cbe', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M43.364,63.387s8.2-13.269,24.329-13.269', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895', opacity='0.15', style='mix-blend-mode:multiply') - path(d='M43.364,59.6s8.2-13.268,24.329-13.268', transform='translate(-1.553 -5.604)', fill='none', stroke='#2f1244', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - circle(cx='56.568', cy='61.675', r='5.991', fill='#2f1244') - path(d='M43.345,63.181s8.2-13.269,24.329-13.269', transform='translate(-1.553 -5.604)', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895', opacity='0.15', style='mix-blend-mode:multiply') - path(d='M43.345,59.394s8.2-13.268,24.329-13.268', transform='translate(-1.553 -5.604)', fill='none', stroke='#2f1244', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - circle(cx='56.548', cy='61.47', r='5.991', fill='#2f1244') - path(d='M45.033,35.866c-12.254,9.708-16.909,39.727-19.991,68.591,30.6-9.852,70.288-13.469,70.288-13.469L92.552,22.032c-0.072.059-.143,0.117-0.21,0.178C72.032,23.4,56.611,26.694,45.033,35.866Z', transform='translate(-1.553 -5.604)', fill='#d1d3d4', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M44.356,60.451s4.139,10.8,15.4,10.8S76.72,59.465,76.72,59.465', transform='translate(-1.553 -5.604)', fill='#2ab0f6', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M93.94,58.648s-31.543.5-61.69,1.8', transform='translate(-1.553 -5.604)', fill='#bcbec0', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M79.052,72.612c14.287-20.474,76.266-14.465,50.913,51.08-3.68,9.549-12.91,26.308-13.81,26.563-4.373,7.175-9.766,3.884-14.333-2.674-1.27,1.42-10.322,4.039-11.643,5.43C76.582,136.565,64.759,93.087,79.052,72.612Z', transform='translate(-1.553 -5.604)', fill='#ccadd2', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - line(x1='96.932', y1='117.605', x2='107.932', y2='117.605', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M122.013,80.2c-2.448-2.533-9.992-3.82-18.027-3.867-8.033.047-15.579,1.334-18.029,3.867-5.713,5.9,7.612,19.4,18.029,20.237C114.4,99.6,127.725,86.1,122.013,80.2Z', transform='translate(-1.553 -5.604)', fill='#44275e') - line(x1='102.473', y1='117.605', x2='102.473', y2='94.836', fill='none', stroke='#44275e', stroke-linecap='round', stroke-linejoin='round', stroke-width='4.895') - path(d='M102.341,170.756c-30.9,0-70.677-31.176-76.792-71.149-0.218,2.036-.429,4.069-0.634,6.087v6.869c0,43.845,54.164,79.386,77.427,79.386s77.431-35.541,77.431-79.386v-8.107c-0.175-1.808-.356-3.642-0.545-5.493C173.543,139.243,133.243,170.756,102.341,170.756Z', transform='translate(-1.553 -5.604)', fill='#231f20', stroke='#231f20', stroke-miterlimit='10', stroke-width='4.895', opacity='0.25', style='mix-blend-mode:multiply') - path(d='M139.681,61.527a9,9,0,1,0,8.994-9A9,9,0,0,0,139.681,61.527Z', transform='translate(-1.553 -5.604)', fill='#2f1244') symbol#icons-server-delete(viewBox='0 0 18 18') path(fill='#E6E6E6', d='M8,15.185c-0.129,0-0.258-0.03-0.374-0.088l-6.664-3.332C0.677,11.622,0.5,11.336,0.5,11.018v-6.35c0-0.318,0.177-0.604,0.462-0.747l6.665-3.332C7.742,0.531,7.871,0.5,8,0.5s0.258,0.031,0.374,0.088l6.665,3.332C15.323,4.063,15.5,4.35,15.5,4.667v6.35c0,0.313-0.182,0.606-0.462,0.747l-6.665,3.332C8.258,15.154,8.129,15.185,8,15.185z') path(fill='#999999', d='M8,1c0.052,0,0.104,0.012,0.15,0.035l6.665,3.332C14.929,4.425,15,4.54,15,4.668v6.35c0,0.128-0.071,0.243-0.185,0.3L8.15,14.649C8.104,14.673,8.052,14.685,8,14.685c-0.052,0-0.104-0.012-0.15-0.035l-6.665-3.332C1.071,11.26,1,11.145,1,11.017v-6.35c0-0.128,0.071-0.243,0.185-0.3L7.85,1.035C7.896,1.012,7.948,1,8,1 M8,0C7.795,0,7.591,0.047,7.403,0.141L0.738,3.473C0.286,3.7,0,4.162,0,4.668v6.35c0,0.506,0.286,0.968,0.738,1.194l6.665,3.332C7.591,15.638,7.795,15.685,8,15.685s0.409-0.047,0.597-0.141l6.665-3.332C15.714,11.985,16,11.523,16,11.017v-6.35c0-0.506-0.286-0.968-0.738-1.194L8.597,0.141C8.409,0.047,8.205,0,8,0L8,0z') From a6b2547d283ce727e63aff2d1147fd09fec2a147 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 12:03:08 -0700 Subject: [PATCH 132/577] add branch loading state --- .../styles/scss/popover/popover-branch-menu.scss | 16 +++++++++++++--- .../branchMenuPopover/branchMenuPopoverView.jade | 12 +++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index c74178aa0..6b0194071 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -37,8 +37,18 @@ } } - // pagination - .list-pagination { - padding: 6px; + // loading state + .list-item { + + &.disabled { + color: $gray-light; + cursor: not-allowed; + } + + > .spinner-wrapper { + position: absolute; + right: 10px; + top: 10px; + } } } diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 5566c4499..19ff59d4b 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -116,6 +116,7 @@ ) .toggle-group.toggle-sm input.input.input-xs.input-search( + ng-disabled = "state.loading" ng-if = "branch.length !== 0" placeholder = "Filter" required @@ -133,18 +134,27 @@ ng-include = "'spinner'" ) li.list-item.popover-list-item( + ng-class = "{'disabled': state.loading}" ng-click = "\ $root.featureFlags.ahaSidebar = true;\ $root.featureFlags.aha2 = false;\ $root.featureFlags.aha3 = true;\ + state.loading = !state.loading;\ " ) SAN-4377-Cant-add-files - button.btn.btn-xs.btn-icon.btn-add + button.btn.btn-xs.btn-icon.btn-add( + ng-if = "!state.loading" + ) svg.iconnables.icons-add use( xlink:href = "#icons-add" ) + .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( + ng-if = "state.loading" + ng-include = "'spinner'" + ) li.list-item.popover-list-item( + ng-class = "{'disabled': state.loading}" ng-click = "\ $root.featureFlags.ahaSidebar = true;\ $root.featureFlags.aha2 = false;\ From 34636ae4c1a398c628df67e87d5b4516b0024f63 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 12:10:05 -0700 Subject: [PATCH 133/577] fix spinner classes --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 19ff59d4b..5436f3226 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -91,7 +91,7 @@ ng-init = "state.branchesLoaded = null" ) - .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( + .spinner-wrapper.spinner-sm.spinner-gray( ng-click = "state.branchesLoaded = true" ng-if = "!state.branchesLoaded" ng-include = "'spinner'" From c575584acf1ec49f083c3b31b3b632e5a1923fde Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 12:10:49 -0700 Subject: [PATCH 134/577] for real fix spinner classes --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 5436f3226..724f24264 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -91,7 +91,7 @@ ng-init = "state.branchesLoaded = null" ) - .spinner-wrapper.spinner-sm.spinner-gray( + .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( ng-click = "state.branchesLoaded = true" ng-if = "!state.branchesLoaded" ng-include = "'spinner'" @@ -149,7 +149,7 @@ use( xlink:href = "#icons-add" ) - .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( + .spinner-wrapper.spinner-sm.spinner-gray( ng-if = "state.loading" ng-include = "'spinner'" ) From 6af432de0df79799ff12cf85a57d91ebe21a87e9 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 2 Sep 2016 12:50:30 -0700 Subject: [PATCH 135/577] Updating state --- client/controllers/controllerApp.js | 5 +++-- .../components/ahaGuide/AhaGuideController.js | 18 ++++++++------- .../ahaGuide/ahaGuideMenuPopoverView.jade | 2 +- .../components/ahaGuide/ahaSidebarView.jade | 4 ++-- .../environmentBody/viewCardGrid.jade | 2 +- .../environment/environmentController.js | 13 +++++++---- .../environment/environmentView.jade | 8 +++---- .../chooseOrganizationModalController.js | 7 ++++++ .../chooseOrganizationModalView.jade | 2 +- .../newContainerModalView.jade | 6 ++--- client/services/ahaGuideService.js | 22 ++++++++++++++----- 11 files changed, 58 insertions(+), 31 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index fd1f3c01c..788ee62f2 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -104,9 +104,10 @@ function ControllerApp( if (!ahaGuideToggles) { ahaGuideToggles = { showAha: true, + showAha0: true, showAha1: false, - showAha2: false, - showAha3: false, + showAha2: true, + showAha3: true, exitedEarly: false, showError: false, showOverview: true, diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 1a72cdfd5..5d1e626e6 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -17,6 +17,7 @@ function AhaGuideController( } AGC.exitingEarly = exitingEarly; + AGC.confirmAha1Complete = confirmAha1Complete; var alertListener = $scope.$on('alert', function(event, alert) { // alerts on container creation success @@ -84,11 +85,12 @@ function AhaGuideController( AGC.state.showError = true; } else if (buildStatus === 'starting') { AGC.state.showError = false; - addVerificationListeners(AGC.state.containerHostname); + addVerificationListeners(); } else if (buildStatus === 'running') { updateCaption('success'); - $rootScope.ahaGuide.exitedEarly = false; - $root.ahaGuide.ahaGuideToggles.showPopover = true; + $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = false; + $rootScope.ahaGuide.ahaGuideToggles.showPopover = true; + $rootScope.ahaGuide.ahaGuideToggles.showAha1 = false; } updateBuildStatus(buildStatus); } @@ -98,7 +100,7 @@ function AhaGuideController( AGC.state.caption = currentMilestone.buildStatus[buildStatus] || AGC.state.caption; } - function addVerificationListeners(containerHostname) { + function addVerificationListeners() { if (!$rootScope.doneListener) { $rootScope.doneListener = $rootScope.$on('close-popovers', function() { $rootScope.doneListener(); @@ -114,7 +116,10 @@ function AhaGuideController( exitedEarlyListener(); AGC.state.showError = true; updateCaption('exitedEarly'); - $rootScope.ahaGuide.completedMilestones.aha1 = true; + } + + function confirmAha1Complete() { + console.log('confirmed that we\'ve finished the first aha 1'); } // we need to unregister this animated panel listener if it exists @@ -130,9 +135,6 @@ function AhaGuideController( if ($rootScope.doneListener) { $rootScope.doneListener(); } - if (AGC.state.subStep === 'dockLoaded') { - $rootScope.ahaGuide.completedMilestones.aha0 = true; - } if (AGC.state.subStepIndex === 7 && !AGC.state.isBuildSuccessful) { $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = true; $rootScope.$broadcast('exitedEarly'); diff --git a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade index d93eb217d..c03146e2f 100644 --- a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade @@ -9,5 +9,5 @@ ng-click = "$scope.showSidebar = true" ) View All li.list-item.popover-list-item( - ng-click = "$root.ahaGuide.completedMilestones.aha1 = true" + ng-click = "AGC.confirmAha1Complete()" ) End Guide \ No newline at end of file diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index 48ee5b9df..fe44f1d7f 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -1,13 +1,13 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( ng-click = "$root.ahaGuide.ahaGuideToggles.showSidebar = false" - ng-if = "!$root.ahaGuide.ahaGuideToggles.showOverview || $root.ahaGuide.completedMilestones.aha1" + ng-if = "!$root.ahaGuide.ahaGuideToggles.showOverview || $root.ahaGuide.ahaGuideToggles.showAha1" ) use( xlink:href = "#icons-close" ) .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.ahaOverview && !$root.ahaGuide.completedMilestones.aha1 && $root.ahaGuide.ahaGuideToggles.showOverview" + ng-if = "$root.featureFlags.ahaOverview && $root.ahaGuide.ahaGuideToggles.showOverview" ) .grid-content.strong Let‘s get running! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index de4d53537..5a082a648 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -10,7 +10,7 @@ //- empty state .card.gray.disabled.load.empty( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length" + ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1 && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" ) svg.iconnables( ng-click = "EC.triggerModal.newContainer()" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index adec51f1c..c98a4f8d5 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -88,11 +88,16 @@ function EnvironmentController( fetchInstancesByPod($state.userName) .then(function (instancesCollection) { $scope.data.instances = instancesCollection; - $rootScope.ahaGuide.ahaGuideToggles.showAha1 = !instancesCollection.models.length; - $rootScope.ahaGuide.ahaGuideToggles.showSidebar = !instancesCollection.models.length; - $rootScope.ahaGuide.ahaGuideToggles.showOverview = !instancesCollection.models.length; - // Asynchronously fetch the Dockerfile + $rootScope.ahaGuide.ahaGuideToggles.showAha1 = true; + $rootScope.ahaGuide.ahaGuideToggles.showSidebar = true; + // Asynchronously fetch the Dockerfile and check for working instances instancesCollection.forEach(function (instance) { + if (instance.attrs.build.successful && instance.getRepoName()) { + $rootScope.ahaGuide.ahaGuideToggles.showAha1 = false; + $rootScope.ahaGuide.ahaGuideToggles.showSidebar = false; + $rootScope.ahaGuide.ahaGuideToggles.showOverview = false; + $rootScope.ahaGuide.ahaGuideToggles.showPopover = true; + } if (instance.hasDockerfileMirroring()) { return fetchDockerfileForContextVersion(instance.contextVersion) .then(function (dockerfile) { diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index ae803f077..1bb8835a1 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,7 +42,7 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha1 && $root.ahaGuide.ahaGuideToggles.showAha1}" + ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha1 && $root.ahaGuide.ahaGuideToggles.showAha1 && !$root.ahaGuide.ahaGuideToggles.exitedEarly}" ) header.grid-block.align-center.environment-header( @@ -61,7 +61,7 @@ ) .grid-block.environment-body.justify-center.clearfix( - ng-class = "{'align-center justify-center': $root.featureFlags.aha1}" + ng-class = "{'align-center justify-center': $root.ahaGuide.ahaGuideToggles.showAha1}" ) .help-container( ng-class = "{\ @@ -98,7 +98,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && !$root.ahaGuide.ahaGuideToggles.exitedEarly && !data.instances.models.length" + ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && $root.ahaGuide.ahaGuideToggles.showAha1 && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive @@ -109,7 +109,7 @@ .grid-block.card-grid.clearfix( ng-class = "{'padding-top': helpCards.getActiveCard().helpTop}" - ng-if = "data.instances.models.length" + ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1 || $root.ahaGuide.ahaGuideToggles.exitedEarly" ng-include = "'viewCardGrid'" ) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index 235beb7c2..6a9e05098 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -24,6 +24,13 @@ function ChooseOrganizationModalController( COMC.allAccounts = grantedOrgs.models; COMC.whitelistedOrgs = whitelistedOrgs; + // fixme once active org/currentOrg is resolved + $rootScope.ahaGuide = { + ahaGuideToggles: { + showAha0: true + } + }; + // otherwise the user can clear away the model // this will be re-added when they transition to something else keypather.set($rootScope, 'dataApp.documentKeydownEventHandler', null); diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index d29786614..4de6de1f7 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -14,7 +14,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( aha-guide-directive - ng-if = "$root.featureFlags.aha && $root.featureFlags.aha0 && !$root.ahaGuide.completedMilestones.aha0" + ng-if = "$root.featureFlags.aha && $root.featureFlags.aha0 && $root.ahaGuide.ahaGuideToggles.showAha0" step-index = 0 sub-step = "orgSelection" sub-step-index = 0 diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 4d6cafd41..76cedab47 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -14,13 +14,13 @@ name = "containerSelection" ) header.modal-header.grid-block.justify-center( - ng-class = "{'lg': !$root.featureFlags.aha1}" + ng-class = "{'lg': !$root.ahaGuide.ahaGuideToggles.showAha1}" ng-click = "MC.changeTab('nameContainer')" ) .grid-block.shrink.btn( ng-class = "{'active': MC.state.tabName === 'repos'}" ng-click = "MC.changeTab('repos')" - ng-if = "!$root.featureFlags.aha1" + ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1" ) svg.iconnables.icons-repository.grid-block.shrink use( @@ -36,7 +36,7 @@ 'disabled': $root.isLoading[MC.name + 'SingleRepo'] \ }" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && MC.changeTab('services')" - ng-if = "!$root.featureFlags.aha1" + ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1" ) svg.iconnables.icons-template.grid-block.shrink use( diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 436fb59ca..5d1cdc86f 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -9,6 +9,8 @@ function ahaGuide( keypather ) { + var _lastStep; + var _steps = [ { title: 'Create your Sandbox', @@ -126,10 +128,10 @@ function ahaGuide( building: 'Now building. Build time varies depending on your configuration', starting: 'Now building. Build time varies depending on your configuration', running: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', - stopped: 'Your container failed to run. Inspect your CMD logs for more information.', - cmdFailed: 'Your container failed to run. Inspect your CMD logs for more information.', - crashed: 'Your container failed to run. Inspect your CMD logs for more information.', - buildFailed: 'Your build failed. Inspect your build logs for more information.' + stopped: 'Your container failed to run. Inspect your logs for more information.', + cmdFailed: 'Your container failed to run. Inspect your logs for more information.', + crashed: 'Your container failed to run. Inspect your logs for more information.', + buildFailed: 'Your container failed to run. Inspect your logs for more information.' } }, { @@ -190,9 +192,19 @@ function ahaGuide( return completedMilestones; } + function setLastStep(step) { + _lastStep = step; + } + + function getLastStep() { + return _lastStep; + } + return { checkContainerStatus: checkContainerStatus, getAhaMilestones: getAhaMilestones, - getSteps: getSteps + getLastStep: getLastStep, + getSteps: getSteps, + setLastStep: setLastStep }; } From 2c21ca8eaf21270c195703baf3e192a57bccaad2 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 2 Sep 2016 13:41:16 -0700 Subject: [PATCH 136/577] Locking version of angular-clipboard to 1.4.x because 1.5 caused errors to be thrown in tests. --- package.json | 2 +- .../components/containerUrl/containerUrlDirective.unit.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 0d9750bc3..f91c7d299 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@runnable/api-client": "v9.1.1", "angular": "1.3.15", "angular-animate": "1.3.15", - "angular-clipboard": "^1.1.1", + "angular-clipboard": "1.4.x", "angular-credit-cards": "^3.1.4", "angular-drag-and-drop-lists": "git://github.com/cmlenz/angular-drag-and-drop-lists.git#handle-support", "angular-modal-service": "git://github.com/Runnable/angular-modal-service.git#v0.6.8", diff --git a/test/unit/directives/components/containerUrl/containerUrlDirective.unit.js b/test/unit/directives/components/containerUrl/containerUrlDirective.unit.js index 6a8b59d32..c31fff107 100644 --- a/test/unit/directives/components/containerUrl/containerUrlDirective.unit.js +++ b/test/unit/directives/components/containerUrl/containerUrlDirective.unit.js @@ -8,7 +8,6 @@ var $window; var keypather; var $q; var $elScope; -var readOnlySwitchController; var apiMocks = require('./../../../apiMocks/index'); describe('containerUrlDirective'.bold.underline.blue, function () { From 993042797fa0b5b684582c6ff841e1308c97fb7a Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 2 Sep 2016 13:57:39 -0700 Subject: [PATCH 137/577] Initial commit to add branch --- client/controllers/controllerInstances.js | 36 ++++++++++++- .../branchMenuPopoverView.jade | 51 ++++++------------- .../directives/popovers/popOverDirective.js | 1 + client/templates/instances/viewInstances.jade | 26 ++++++---- .../instances/viewInstancesList.jade | 3 ++ 5 files changed, 70 insertions(+), 47 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index b0fe4c04d..ba165c1dd 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -14,12 +14,16 @@ function ControllerInstances( errs, ModalService, fetchInstancesByPod, + fetchOwnerRepos, activeAccount, - user + user, + promisify, + currentOrg ) { var self = this; var userName = $state.params.userName; self.searchBranches = null; + self.instanceBranches = null; self.$storage = $localStorage.$default({ instanceListIsClosed: false }); @@ -143,6 +147,31 @@ function ControllerInstances( }); }; + this.getReposFromInstance = function(instance) { + var branchName; + var childInstances = instance.children.models.reduce(function(childHash, child) { + branchName = keypather.get(child, 'contextVersion.appCodeVersions.models[0].attrs.branch'); + childHash[branchName] = branchName; + return childHash; + }, {}); + return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) + .then(function (repo) { + return promisify(repo, 'fetchBranches')() + }) + .then(function (branches) { + self.instanceBranches = branches.models.filter(function(branch) { + branchName = keypather.get(branch, 'attrs.name'); + return !childInstances[branchName]; + }); + }); + }; + + this.forkBranchFromInstance = function(branch, instance) { + console.log('branch', branch, '\ninstance', instance); + var sha = branch.attrs.commit.sha; + promisify(instance, 'fork')(branch.attrs.name, sha); + } + this.editInstance = function (instance) { ModalService.showModal({ controller: 'EditServerModalController', @@ -181,4 +210,9 @@ function ControllerInstances( }) .catch(errs.handler); }; + + this.setAutofork = function(instance) { + console.log(instance); + // instance.attrs.shouldNotAutofork = !instance.attrs.shouldNotAutofork; + } } diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 5566c4499..8e9efc673 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -2,14 +2,6 @@ ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" ) - .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha2" - ng-include = "'ahaGuideView'" - ng-init = "\ - state.showStep = 2;\ - state.showSubStep = 2;\ - " - ) .arrow.white .grid-block.vertical.popover-content.empty( ng-if = "$root.featureFlags.autoIsolationSetup" @@ -88,16 +80,17 @@ ) | Add Branch .popover-content( - ng-init = "state.branchesLoaded = null" ) + .text-center.text-gray.small.padding-md( + ng-if = "CIS.instanceBranches.length === 0" + ) There are no branches to add. .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( - ng-click = "state.branchesLoaded = true" - ng-if = "!state.branchesLoaded" + ng-if = "!CIS.instanceBranches.length" ng-include = "'spinner'" ) .padding-xxs( - ng-if = "state.branchesLoaded" + ng-if = "CIS.instanceBranches.length" ) .grid-block.shrink.align-center.well.gray.padding-xxs( ng-if = "!$root.featureFlags.autoIsolation" @@ -116,43 +109,31 @@ ) .toggle-group.toggle-sm input.input.input-xs.input-search( - ng-if = "branch.length !== 0" placeholder = "Filter" required type = "search" ) - .text-center.text-gray.small.padding-lg( - ng-if = "branch.length === 0" - ) There are no branches to add. ul.list.popover-list( - ng-if = "state.branchesLoaded" + ng-if = "CIS.instanceBranches.length" ) //- show when loading paginated list //- li.list-item.padding-md .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( ng-include = "'spinner'" ) + //- ng-repeat = branch in whatever returned from instance fetch branches li.list-item.popover-list-item( - ng-click = "\ - $root.featureFlags.ahaSidebar = true;\ - $root.featureFlags.aha2 = false;\ - $root.featureFlags.aha3 = true;\ - " - ) SAN-4377-Cant-add-files - button.btn.btn-xs.btn-icon.btn-add - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) - li.list-item.popover-list-item( - ng-click = "\ - $root.featureFlags.ahaSidebar = true;\ - $root.featureFlags.aha2 = false;\ - $root.featureFlags.aha3 = true;\ - " - ) SAN-4342-auto-isolation-setup + ng-repeat = "branch in CIS.instanceBranches" + ng-click = "CIS.forkBranchFromInstance(branch, instance)" + ) {{ branch.attrs.name }} button.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-add use( xlink:href = "#icons-add" ) + + li.list-item.grid-block.justify-justified.list-pagination( + ) + //- ng-if = "paginated" + button.btn.btn-xs.gray.grid-content Last 50 + button.btn.btn-xs.gray.grid-content Next 50 diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index fda8b35ab..bbc9b0e40 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -14,6 +14,7 @@ var scopeVars = { noBroadcast: '=? popOverNoBroadcast', actions: '=? popOverActions', active: '=? popOverActive', + instance: '=? popOverInstance', template: '= popOverTemplate', controller: '=? popOverController', controllerAs: '@? popOverControllerAs' diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 6002f91c9..857567764 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -1,21 +1,25 @@ //- instance list -.grid-block.shrink.list-instances( - ng-class = "{\ - 'deprecated': !$root.featureFlags.addBranches,\ - 'in': !CIS.$storage.instanceListIsClosed\ - }" +.list-instances-wrapper.grid-block.vertical.shrink.align-start( + ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "CIS.instancesByPod" - ng-include = "'viewInstancesList'" - scroll-offset = "200" - scroll-to = "a.a-sref.active" ) + .list-instances( + ng-class = "{'deprecated': !$root.featureFlags.addBranches, 'in': !CIS.$storage.instanceListIsClosed }" + ng-include = "'viewInstancesList'" + scroll-offset = "200" + scroll-to = "a.a-sref.active" + ) -.grid-block.shrink.list-instances( + .popover.bottom.in.popover-aha.popover-add-branches.js-animate( + ng-if = "$root.featureFlags.aha2" + ng-include = "'ahaPopoverView'" + ) + +.list-instances-wrapper.grid-block.shrink.align-center.justify-center( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" ) - - .spinner-wrapper.spinner-md.spinner-gray.spinner-center.in( + .spinner-wrapper.spinner-md.spinner-gray.in( ng-include = "'spinner'" ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index a86ad13c1..3b4529054 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -52,7 +52,10 @@ p.p.text-center.text-gray-light.padding-sm( button.grid-block.shrink.btn.btn-xs.btn-icon.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" + ng-click = "CIS.getReposFromInstance(masterInstance)" pop-over + pop-over-controller = "CIS" + pop-over-instance = "masterInstance" pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" pop-over-template = "branchMenuPopoverView" tooltip = "Add Branch" From 589820d4fd2ea4f6180125f0fe01253f9c443fe8 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 14:11:38 -0700 Subject: [PATCH 138/577] move scrolling onto .modal-body instead of list --- .../components/repository-details-content.scss | 18 ++++++++++-------- .../scss/modals/modals-server-select.scss | 4 ---- client/assets/styles/scss/modals/modals.scss | 1 - 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/client/assets/styles/scss/components/repository-details-content.scss b/client/assets/styles/scss/components/repository-details-content.scss index 9b1c289ad..9d3af0a0d 100644 --- a/client/assets/styles/scss/components/repository-details-content.scss +++ b/client/assets/styles/scss/components/repository-details-content.scss @@ -3,7 +3,15 @@ flex-direction: column; &.modal-body { - padding-bottom: 0; + max-height: calc(100vh - 195px); + + @media (max-height: $screen-xs), (max-width: $screen-sm) { + max-height: calc(100vh - 165px); + } + + @include media(xxxs) { + max-height: calc(100vh - 212px); + } } > .label { @@ -19,10 +27,8 @@ } .list-servers.list-servers { - flex: 1 1 auto; - max-height: calc(100vh - 300px); + flex: 0 0 auto; min-height: 90px; - overflow-y: auto; padding: 15px 0; position: relative; @@ -76,10 +82,6 @@ } } - &:last-child { - margin-bottom: 15px; - } - .small { color: $gray; } diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index 6f047970a..65c94acef 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -220,10 +220,6 @@ } } - &:last-child { - margin-bottom: 15px; - } - + .list-item { margin-top: 3px; } diff --git a/client/assets/styles/scss/modals/modals.scss b/client/assets/styles/scss/modals/modals.scss index 5a4ca4f67..4f66e03f9 100755 --- a/client/assets/styles/scss/modals/modals.scss +++ b/client/assets/styles/scss/modals/modals.scss @@ -41,7 +41,6 @@ display: flex; flex: 0 0 auto; flex-direction: column; - margin-bottom: 15px; min-width: 360px; position: relative; transform-origin: 50% 10%; From 5ac1551ef8496bf36a92542c36c14df017a727cb Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 14:25:51 -0700 Subject: [PATCH 139/577] fix spacing below modals in safari --- client/assets/styles/scss/modals/modals.scss | 23 +++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/client/assets/styles/scss/modals/modals.scss b/client/assets/styles/scss/modals/modals.scss index 4f66e03f9..330a131e4 100755 --- a/client/assets/styles/scss/modals/modals.scss +++ b/client/assets/styles/scss/modals/modals.scss @@ -7,21 +7,12 @@ flex-direction: column; height: 100vh; overflow: auto; - padding: 90px 15px; + padding: 0 15px; position: fixed; top: 0; width: 100vw; z-index: $z-modal; - @include media(lg) { - padding-bottom: 30px; - padding-top: 30px; - } - - @media (max-height: $screen-xs), (max-width: $screen-sm) { - padding: 15px; - } - &.modal-blackout { background: $white; } @@ -41,11 +32,23 @@ display: flex; flex: 0 0 auto; flex-direction: column; + margin-bottom: 90px; + margin-top: 90px; min-width: 360px; position: relative; transform-origin: 50% 10%; transition: max-width .3s ease-in-out; + @include media(lg) { + margin-bottom: 30px; + margin-top: 30px; + } + + @media (max-height: $screen-xs), (max-width: $screen-sm) { + margin-bottom: 15px; + margin-top: 15px; + } + @include media(sm) { width: 100%; } From b3b5e44e0bbef3a984f88e53e63043ee1a5438bd Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 14:46:25 -0700 Subject: [PATCH 140/577] fix aha guide being cut off --- client/assets/styles/scss/components/aha-modals.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/assets/styles/scss/components/aha-modals.scss b/client/assets/styles/scss/components/aha-modals.scss index ff8112165..9c0e82175 100644 --- a/client/assets/styles/scss/components/aha-modals.scss +++ b/client/assets/styles/scss/components/aha-modals.scss @@ -23,14 +23,14 @@ } + .modal-dialog { - margin-top: 30px; + margin-top: 45px; @include media(lg) { - margin-top: 90px; + margin-top: 120px; } @media (max-height: $screen-xs), (max-width: $screen-sm) { - margin-top: 105px; + margin-top: 120px; } } From bc642b14844357b37ecbdf28fc9a512641044625 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 14:54:03 -0700 Subject: [PATCH 141/577] fix pr button being off center --- client/assets/styles/scss/layout/instance-header.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/client/assets/styles/scss/layout/instance-header.scss b/client/assets/styles/scss/layout/instance-header.scss index f4100b12d..ffca063fa 100644 --- a/client/assets/styles/scss/layout/instance-header.scss +++ b/client/assets/styles/scss/layout/instance-header.scss @@ -45,7 +45,6 @@ .green { margin-left: 9px; padding: 0 3px 0 0; - top: -4px; .iconnables { height: 100%; From 42e671a03a11628b69501272b36bbe79eb7e81c8 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 2 Sep 2016 15:49:36 -0700 Subject: [PATCH 142/577] Added toggle for shouldNotAutofork property on instances, and updated property when toggled --- client/controllers/controllerInstances.js | 5 +++++ .../instance/branchMenuPopover/branchMenuPopoverView.jade | 2 ++ 2 files changed, 7 insertions(+) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 47f841abd..ecfc4ebcd 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -223,4 +223,9 @@ function ControllerInstances( }) .catch(errs.handler); }; + + this.setAutofork = function(instance) { + var shouldNotAutofork = instance.attrs.shouldNotAutofork = !instance.attrs.shouldNotAutofork; + promisify(instance, 'update')({shouldNotAutofork: shouldNotAutofork}); + }; } diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 559b9c321..e70eca7a5 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -104,7 +104,9 @@ ) label.grid-content.shrink.toggle-wrapper input.toggle-input( + ng-click = "CIS.setAutofork(instance)" ng-disabled = "$root.featureFlags.webhooks" + ng-checked = "instance.attrs.shouldNotAutofork" type = "checkbox" ) .toggle-group.toggle-sm From 8d4dcf4552cc3c3143390b1a035a6504aaba823d Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 2 Sep 2016 17:01:25 -0700 Subject: [PATCH 143/577] WIP - Cleaning up feature flags. --- client/controllers/controllerApp.js | 5 + .../components/ahaGuide/AhaGuideController.js | 6 +- .../addBranchGuide/addBranchGuideDirective.js | 20 ++++ .../addBranchGuideView.jade | 8 +- .../components/ahaGuide/ahaGuideDirective.js | 6 +- .../components/ahaGuide/ahaGuideView.jade | 2 +- .../{ => ahaSidebar}/ahaSidebarController.js | 9 +- .../{ => ahaSidebar}/ahaSidebarDirective.js | 5 +- .../{ => ahaSidebar}/ahaSidebarView.jade | 36 +++---- .../setUpRepositoryGuideView.jade | 46 +-------- .../setupRepositoryGuideDirective.js | 20 ++++ client/directives/navBar/viewNav.jade | 4 +- client/services/ahaGuideService.js | 95 +++++++++---------- .../createAndBuildNewContainerService.js | 4 +- client/services/featureFlagService.js | 1 - 15 files changed, 131 insertions(+), 136 deletions(-) create mode 100644 client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js rename client/directives/components/ahaGuide/{components => addBranchGuide}/addBranchGuideView.jade (52%) rename client/directives/components/ahaGuide/{ => ahaSidebar}/ahaSidebarController.js (73%) rename client/directives/components/ahaGuide/{ => ahaSidebar}/ahaSidebarDirective.js (76%) rename client/directives/components/ahaGuide/{ => ahaSidebar}/ahaSidebarView.jade (69%) rename client/directives/components/ahaGuide/{components => setupRepositoryGuide}/setUpRepositoryGuideView.jade (55%) create mode 100644 client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 788ee62f2..95db2d065 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -129,6 +129,11 @@ function ControllerApp( } }); + $scope.showAhaNavPopover = false; + $rootScope.$on('launchAhaNavPopover', function () { + $scope.showAhaNavPopover = true; + }); + /** * broadcast to child scopes when click event propagates up * to top level controller scope. diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 5d1e626e6..d80f02279 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -53,7 +53,7 @@ function AhaGuideController( }; // get steps from service - AGC.state.steps = ahaGuide.getSteps(); + AGC.state.steps = ahaGuide.stepList; // get the current milestone var currentMilestone = AGC.state.steps[AGC.state.mainStep]; @@ -123,7 +123,7 @@ function AhaGuideController( } // we need to unregister this animated panel listener if it exists - // to avoid duplication + // to avoid duplication if ($rootScope.animatedPanelListener) { $rootScope.animatedPanelListener(); } @@ -140,7 +140,7 @@ function AhaGuideController( $rootScope.$broadcast('exitedEarly'); } }); - + $rootScope.animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { updateCaption(panel); }); diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js new file mode 100644 index 000000000..1a6e93cef --- /dev/null +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js @@ -0,0 +1,20 @@ +'use strict'; + +require('app') + .directive('addBranchGuide', addBranchGuide); + +function addBranchGuide( + ahaGuide +) { + return { + restrict: 'A', + templateUrl: 'addBranchGuideView', + scope: true, + link: function ($scope, elem, attrs) { + $scope.ahaGuide = { + steps: ahaGuide.steps, + getCurrentStep: ahaGuide.getCurrentStep + }; + } + }; +} diff --git a/client/directives/components/ahaGuide/components/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade similarity index 52% rename from client/directives/components/ahaGuide/components/addBranchGuideView.jade rename to client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 6680148e8..561d63d9e 100644 --- a/client/directives/components/ahaGuide/components/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -1,16 +1,16 @@ .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-33': $root.featureFlags.aha2,\ - 'aha-meter-100': $root.featureFlags.aha3\ + 'aha-meter-33': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH,\ + 'aha-meter-100': ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables use( - ng-if = "!$root.featureFlags.aha3" + ng-if = "ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "$root.featureFlags.aha3" + ng-if = "ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 7557f2b3f..8bef579e1 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -7,7 +7,7 @@ require('app') * @ngInject */ function ahaGuideDirective( - + ) { return { restrict: 'A', @@ -20,8 +20,6 @@ function ahaGuideDirective( subStepIndex: '=', errorState: '=?' }, - link: function ($scope, elem, attrs) { - - } + link: function ($scope, elem, attrs) {} }; } diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 3d21b64eb..00890d3d8 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -10,7 +10,7 @@ .grid-block.align-center( ng-if = "AGC.state.mainStep === 2" - ng-include = "'addBranchGuideView'" + add-branch-guide ) .grid-block.align-center( diff --git a/client/directives/components/ahaGuide/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js similarity index 73% rename from client/directives/components/ahaGuide/ahaSidebarController.js rename to client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js index 1cf325561..cea8d0f76 100644 --- a/client/directives/components/ahaGuide/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js @@ -5,19 +5,20 @@ require('app') .controller('AhaSidebarController', AhaSidebarController); function AhaSidebarController( - $scope, $rootScope, ahaGuide ) { - var ASC = this; - ASC.toggleOverview = function() { + ASC.steps = ahaGuide.steps; + ASC.getCurrentStep = ahaGuide.getCurrentStep; + + ASC.toggleOverview = function () { $rootScope.ahaGuide.ahaGuideToggles.showOverview = !$rootScope.ahaGuide.ahaGuideToggles.showOverview; ASC.toggleSidebar(); }; - ASC.toggleSidebar = function() { + ASC.toggleSidebar = function () { $rootScope.ahaGuide.ahaGuideToggles.showSidebar = !$rootScope.ahaGuide.ahaGuideToggles.showSidebar; }; } diff --git a/client/directives/components/ahaGuide/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js similarity index 76% rename from client/directives/components/ahaGuide/ahaSidebarDirective.js rename to client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index e647183c3..d02816b5c 100644 --- a/client/directives/components/ahaGuide/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -13,9 +13,6 @@ function ahaSidebarDirective( restrict: 'A', templateUrl: 'ahaSidebarView', controller: 'AhaSidebarController', - controllerAs: 'ASC', - link: function ($scope, elem, attrs) { - - } + controllerAs: 'ASC' }; } diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade similarity index 69% rename from client/directives/components/ahaGuide/ahaSidebarView.jade rename to client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index fe44f1d7f..fa2d9a101 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -1,6 +1,6 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( - ng-click = "$root.ahaGuide.ahaGuideToggles.showSidebar = false" + ng-click = "ASC.toggleSidebar()" ng-if = "!$root.ahaGuide.ahaGuideToggles.showOverview || $root.ahaGuide.ahaGuideToggles.showAha1" ) use( @@ -29,9 +29,10 @@ p.small This is the first step to success. .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': data.instances.models.length}" - ng-click = "!data.instances.models.length && ASC.toggleOverview()" - ng-class = "{active: !data.instances.models.length}" + ng-class = "{\ + disabled: ASC.getCurrentStep() < ASC.steps.ADD_FIRST_REPO,\ + active: ASC.getCurrentStep() === ASC.steps.ADD_FIRST_REPO\ + }" ) .grid-block.shrink.aha-meter( ng-class = "{\ @@ -42,11 +43,11 @@ ) svg.iconnables use( - ng-if = "$root.ahaGuide.ahaGuideToggles.showAha1" + ng-if = "ASC.getCurrentStep() <= ASC.steps.ADD_FIRST_REPO" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1" + ng-if = "ASC.getCurrentStep() > ASC.steps.ADD_FIRST_REPO" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text @@ -54,21 +55,21 @@ p.small Set up your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': !data.instances.models.length}" + ng-class = "{'disabled': ASC.getCurrentStep() < ASC.steps.ADD_FIRST_BRANCH}" ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-0': !$root.ahaGuide.completedMilestones.aha2,\ - 'aha-meter-100': $root.ahaGuide.completedMilestones.aha2\ + 'aha-meter-0': ASC.getCurrentStep() <= ASC.steps.ADD_FIRST_BRANCH,\ + 'aha-meter-100': $ASC.getCurrentStep() > ASC.steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables use( - ng-if = "!$root.featureFlags.aha3" + ng-if = "ASC.getCurrentStep() <= ASC.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "$root.featureFlags.aha3" + ng-if = "ASC.getCurrentStep() > ASC.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text @@ -76,19 +77,20 @@ p.small Your branches will update on every commit you make. .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.ahaGuide.completedMilestones.aha3 || !$root.ahaGuide.completedMilestones.aha2}" + ng-class = "{'disabled': ASC.getCurrentStep() < ASC.steps.SETUP_RUNNABOT}" ) .grid-block.shrink.aha-meter( - ng-class = "{'aha-meter-50': $root.featureFlags.aha3}" + ng-class = "{'aha-meter-50': ASC.getCurrentStep() === ASC.steps.SETUP_RUNNABOT}" ) svg.iconnables use( + ng-if = "ASC.getCurrentStep() <= ASC.steps.SETUP_RUNNABOT" xlink:href = "#icons-runnabot" ) - //- if complete - //- use( - //- xlink:href = "#icons-check" - //- ) + use( + ng-if = "ASC.getCurrentStep() > ASC.steps.SETUP_RUNNABOT" + xlink:href = "#icons-check" + ) .grid-block.vertical.aha-text p.p.strong Set Up Runnabot p.small Receive notifications on pull requests when your container is ready. diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade similarity index 55% rename from client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade rename to client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 47212ca28..666ac9956 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -12,7 +12,7 @@ ng-if = "!AGC.state.showError" ) use( - ng-if = "$root.featureFlags.aha1 && AGC.state.subStep !== 'complete'" + ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.state.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( @@ -27,52 +27,10 @@ ) .grid-block.vertical.aha-text - .grid-block( - ng-if = "$root.canEditFeatureFlags()" - ng-show = "state.showControls" - style = "position: absolute; right: 0; top: 0;" - ) - a.grid-content.shrink.red.small.link( - ng-click = "state.showVerification = !state.showVerification" - ng-if = "AGC.state.subStep === 7" - ) Verify - a.grid-content.shrink.red.small.link( - ng-click = "\ - state.showError = !state.showError;\ - state.showErrorType = 'CMD';\ - " - ng-if = "AGC.state.subStep === 7" - ) CMDErr - a.grid-content.shrink.red.small.link( - ng-click = "\ - state.showError = !state.showError;\ - state.showErrorType = 'build';\ - " - ng-if = "AGC.state.subStep === 7" - ) BuildErr - a.grid-content.shrink.red.small.link( - ng-click = "\ - $root.featureFlags.aha1 = false;\ - $root.featureFlags.aha2 = true;\ - " - ng-if = "AGC.state.subStep === 8" - ) NextMile - a.grid-content.shrink.red.small.link( - ng-click = "AGC.state.subStep = AGC.state.subStep - 1" - ng-if = "AGC.state.subStep < 9 && AGC.state.subStep > 1" - ) Prev - a.grid-content.shrink.red.small.link( - ng-click = "AGC.state.subStep = AGC.state.subStep + 1" - ng-if = "AGC.state.subStep < 8" - ) Next p.p.small.text-gray-light {{ AGC.state.title }} - p.p( - ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.exitedEarly && !state.showError && !state.showVerification" - ) {{ AGC.state.caption }} p.p( ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" - ng-if = "$root.featureFlags.aha && $root.ahaGuide.ahaGuideToggles.exitedEarly && !state.showError && !state.showVerification" + ng-if = "$root.featureFlags.aha && !state.showError && !state.showVerification" ) {{ AGC.state.caption }} p.p( ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js new file mode 100644 index 000000000..2708d66de --- /dev/null +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js @@ -0,0 +1,20 @@ +'use strict'; + +require('app') + .directive('setupRepositoryGuide', setupRepositoryGuide); + +function setupRepositoryGuide( + ahaGuide +) { + return { + restrict: 'A', + templateUrl: 'setupRepositoryGuideView', + scope: true, + link: function ($scope, elem, attrs) { + $scope.ahaGuide = { + steps: ahaGuide.steps, + getCurrentStep: ahaGuide.getCurrentStep + }; + } + }; +} diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 8cd07bcad..bda0df9aa 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -4,9 +4,9 @@ data = "dataApp.data" ) -//- aha menu +//- aha menu --- This should be triggered via an event! .popover.right.in.popover-aha( - ng-if = "$root.featureFlags.aha2 && !$root.ahaGuide.ahaGuideToggles.exitedEarly && $root.ahaGuide.ahaGuideToggles.showPopover" + ng-if = "showAhaNavPopover" ng-include = "'ahaPopoverView'" ) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 5d1cdc86f..63f96f3fa 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -3,15 +3,27 @@ require('app') .factory('ahaGuide', ahaGuide); +var STEPS = { + CHOOSE_ORGANIZATION: 1, + ADD_FIRST_REPO: 2, + ADD_FIRST_BRANCH: 3, + SETUP_RUNNABOT: 4, + COMPLETED: -1 +}; + function ahaGuide( $http, - $localStorage, - keypather + fetchInstancesByPod, + currentOrg, + $rootScope ) { + var instances = []; + fetchInstancesByPod() + .then(function (instanceByPod) { + instances = instanceByPod; + }); - var _lastStep; - - var _steps = [ + var stepList = [ { title: 'Create your Sandbox', subSteps: { @@ -155,56 +167,37 @@ function ahaGuide( } ]; - function getSteps() { - return _steps; - } - - function checkContainerStatus(url) { - return $http({ - method: 'GET', - url: url - }) - .then(function(data) { - if (data.status >= 200 && data.status < 300) { - return true; + var cachedStep; + $rootScope.$watch(function () { + cachedStep = null; + }); + function getCurrentStep() { + if (!cachedStep) { + // Temporarily turning aha on + currentOrg.poppa.hasAha = true; + currentOrg.poppa.hasConfirmedSetup = false; + if (!currentOrg.poppa.hasAha) { + cachedStep = STEPS.COMPLETED; + } else if (!currentOrg.poppa.hasConfirmedSetup) { + cachedStep = STEPS.ADD_FIRST_REPO; + } else { + // loop over instances and see if any has ever had a branch launched + var hasBranchLaunched = instances.models.some(function (instance) { + return instance.attrs.hasBranchLaunched; + }); + if (hasBranchLaunched) { + cachedStep = STEPS.SETUP_RUNNABOT; + } else { + cachedStep = STEPS.ADD_FIRST_BRANCH; } - return false; - }) - .catch(function(err) { - return new Error(err); - }); - } - - function getAhaMilestones() { - var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); - - if (!ahaGuideToggles) { - ahaGuideToggles = { - exitedEarly: false, - showError: false, - showOverview: false, - showPopover: false, - showSidebar: false - }; - keypather.set($localStorage, 'ahaGuide.toggles', ahaGuideToggles); + } } - - return completedMilestones; - } - - function setLastStep(step) { - _lastStep = step; - } - - function getLastStep() { - return _lastStep; + return cachedStep; } return { - checkContainerStatus: checkContainerStatus, - getAhaMilestones: getAhaMilestones, - getLastStep: getLastStep, - getSteps: getSteps, - setLastStep: setLastStep + stepList: stepList, + getCurrentStep: getCurrentStep, + steps: STEPS }; } diff --git a/client/services/createAndBuildNewContainerService.js b/client/services/createAndBuildNewContainerService.js index af03c678a..8352ad79c 100644 --- a/client/services/createAndBuildNewContainerService.js +++ b/client/services/createAndBuildNewContainerService.js @@ -83,7 +83,9 @@ function createAndBuildNewContainer( }) .catch(function (err) { // Remove it from the servers list - instance.dealloc(); + if (instance) { + instance.dealloc(); + } return $q.reject(err); }); }; diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index a38888ba4..f1a4b3d4e 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -12,7 +12,6 @@ function featureFlags( aha0: false, // step 1: create sandbox aha1: false, // step 2: working repo config aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config - aha2: false, // step 3: add branch aha3: false, // step 4: runnabot ahaOverview: false, // toggle sidebar ahaSidebar: false, // toggle sidebar From 805d2ed9dc3cf05b379d005a6dd532582a21e74b Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 17:51:04 -0700 Subject: [PATCH 144/577] add branch filter empty state --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 3 +++ client/templates/instances/viewInstancesList.jade | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 724f24264..0bd9ade85 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -125,6 +125,9 @@ .text-center.text-gray.small.padding-lg( ng-if = "branch.length === 0" ) There are no branches to add. + .text-center.text-gray.small.padding-lg( + ng-if = "branch.length === 0" + ) No branches match this filter. ul.list.popover-list( ng-if = "state.branchesLoaded" ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index a86ad13c1..85248a133 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -9,7 +9,7 @@ label.grid-block.vertical.label-search p.p.text-center.text-gray-light.padding-sm( ng-if = "CIS.getFilteredInstanceList().length < 1" -) No containers match filter. +) No containers match this filter. //- master cluster .list-clusters.master-cluster( From c294fa0a132b0b8bbed703b0456612c6e14b1bad Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 17:56:44 -0700 Subject: [PATCH 145/577] update billing history empty state --- .../billingForm/billingHistoryForm/billingHistoryForm.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/modals/settingsModal/forms/billingForm/billingHistoryForm/billingHistoryForm.jade b/client/directives/modals/settingsModal/forms/billingForm/billingHistoryForm/billingHistoryForm.jade index c410c466c..e14ee270c 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/billingHistoryForm/billingHistoryForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/billingHistoryForm/billingHistoryForm.jade @@ -10,9 +10,9 @@ .cell.text-overflow.small Paid by {{invoice.paidBy.githubUser.name || invoice.paidBy.githubUser.login}} .cell.monospace.text-right {{getBillingDate(invoice)}} -div( +.well.gray.ignore-margin.text-center.padding-sm.small( ng-if = "invoices.length === 0" -) You have no billing history right now. +) You have no billing history. //- if there's something older to load //-.label From 260433515663409c4d37e8f233e9589f12942db8 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 2 Sep 2016 18:20:55 -0700 Subject: [PATCH 146/577] Got loading instancesByPod as a resolve in the environment controller. --- client/config/routes.js | 8 ++- .../ahaSidebar/ahaSidebarController.js | 6 +- .../ahaSidebar/ahaSidebarDirective.js | 15 +++-- .../environment/environmentController.js | 58 ++++++++++--------- .../viewEnvironmentHeader.jade | 5 +- .../environment/environmentView.jade | 16 ++--- client/services/ahaGuideService.js | 9 ++- client/templates/viewInstance.jade | 2 +- 8 files changed, 67 insertions(+), 52 deletions(-) diff --git a/client/config/routes.js b/client/config/routes.js index 182ada309..ef1d8aab6 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -194,7 +194,13 @@ module.exports = [ url: '^/:userName/configure', templateUrl: 'environmentView', controller: 'EnvironmentController', - controllerAs: 'EC' + controllerAs: 'EC', + resolve: { + instancesByPod: function (fetchInstancesByPod, $stateParams, $state) { + $state.params.userName = $stateParams.userName; + return fetchInstancesByPod(); + } + } }, { state: 'base.instances', abstract: false, diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js index cea8d0f76..33a989ce4 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js @@ -18,7 +18,7 @@ function AhaSidebarController( ASC.toggleSidebar(); }; - ASC.toggleSidebar = function () { - $rootScope.ahaGuide.ahaGuideToggles.showSidebar = !$rootScope.ahaGuide.ahaGuideToggles.showSidebar; - }; + // ASC.toggleSidebar = function () { + // $rootScope.ahaGuide.ahaGuideToggles.showSidebar = !$rootScope.ahaGuide.ahaGuideToggles.showSidebar; + // }; } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index d02816b5c..583557ab5 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -1,18 +1,17 @@ 'use strict'; require('app') - .directive('ahaSidebarDirective', ahaSidebarDirective); + .directive('ahaSidebar', ahaSidebar); -/** - * @ngInject - */ -function ahaSidebarDirective( - -) { +function ahaSidebar() { return { restrict: 'A', templateUrl: 'ahaSidebarView', controller: 'AhaSidebarController', - controllerAs: 'ASC' + controllerAs: 'ASC', + bindToController: true, + scope: { + toggleSidebar: '=' + } }; } diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index c98a4f8d5..c2e6ba52a 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -15,19 +15,27 @@ function EnvironmentController( $state, $timeout, $window, + ahaGuide, favico, - fetchUser, fetchDockerfileForContextVersion, - fetchInstancesByPod, fetchOrgMembers, + fetchUser, helpCards, keypather, ModalService, - pageName + pageName, + instancesByPod ) { var EC = this; EC.showInviteButton = false; + EC.ahaGuide = ahaGuide; + EC.showCreateTemplate = true; + EC.showSidebar = false; + EC.toggleSidebar = function () { + EC.showSidebar = !EC.showSidebar; + EC.showCreateTemplate = true; + }; var unbindUpdateTeammateInvitation = $rootScope.$on('updateTeammateInvitations', function (event, invitesCreated) { if (invitesCreated) { @@ -85,29 +93,27 @@ function EnvironmentController( $scope.data = { helpCards: helpCards }; - fetchInstancesByPod($state.userName) - .then(function (instancesCollection) { - $scope.data.instances = instancesCollection; - $rootScope.ahaGuide.ahaGuideToggles.showAha1 = true; - $rootScope.ahaGuide.ahaGuideToggles.showSidebar = true; - // Asynchronously fetch the Dockerfile and check for working instances - instancesCollection.forEach(function (instance) { - if (instance.attrs.build.successful && instance.getRepoName()) { - $rootScope.ahaGuide.ahaGuideToggles.showAha1 = false; - $rootScope.ahaGuide.ahaGuideToggles.showSidebar = false; - $rootScope.ahaGuide.ahaGuideToggles.showOverview = false; - $rootScope.ahaGuide.ahaGuideToggles.showPopover = true; - } - if (instance.hasDockerfileMirroring()) { - return fetchDockerfileForContextVersion(instance.contextVersion) - .then(function (dockerfile) { - instance.mirroredDockerfile = dockerfile; - }); - } - // Differentiate between non-fetched and non-existing - instance.mirroredDockerfile = null; - }); - }); + $scope.data.instances = instancesByPod; + + if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && instancesByPod.models.length === 0) { + EC.showCreateTemplate = false; + EC.showSidebar = true; + } + + // Asynchronously fetch the Dockerfile and check for working instances + instancesByPod.forEach(function (instance) { + if (instance.attrs.build.successful && instance.getRepoName()) { + $rootScope.$emit('launchAhaNavPopover'); + } + if (instance.hasDockerfileMirroring()) { + return fetchDockerfileForContextVersion(instance.contextVersion) + .then(function (dockerfile) { + instance.mirroredDockerfile = dockerfile; + }); + } + // Differentiate between non-fetched and non-existing + instance.mirroredDockerfile = null; + }); $scope.state = { validation: { diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 5f927a3c6..0bf97d7ca 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -55,7 +55,6 @@ button.grid-block.shrink.btn.btn-md.green( 'scale-in-modal': $root.featureFlags.aha1\ }" ng-click = "EC.triggerModal.newContainer()" - ng-if = "!$root.featureFlags.aha1 || ($root.featureFlags.aha1 && (!$root.ahaGuide.ahaGuideToggles.showOverview || data.instances.models.length))" ) svg.iconnables.icons-add.float-left use( @@ -64,8 +63,8 @@ button.grid-block.shrink.btn.btn-md.green( | Create Template button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "$root.ahaGuide.ahaGuideToggles.showSidebar = true" - ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar" + ng-click = "EC.toggleSidebar()" + ng-if = "$root.featureFlags.aha" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" ) diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 1bb8835a1..dd67c9c65 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,12 +42,12 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': $root.featureFlags.aha && $root.featureFlags.aha1 && $root.ahaGuide.ahaGuideToggles.showAha1 && !$root.ahaGuide.ahaGuideToggles.exitedEarly}" + ng-class = "{'empty': $root.featureFlags.aha && EC.ahaGuide.isInGuide() && EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO && data.instances.models.length === 0}" ) - header.grid-block.align-center.environment-header( ng-include = "'viewEnvironmentHeader'" ng-init = "state.helpButton = {active: false}" + ng-if = "$root.featureFlags.aha && EC.showCreateTemplate" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( @@ -57,11 +57,10 @@ sub-step = 'exitedEarly' sub-step-index = 7 error-state = "true" - " ) .grid-block.environment-body.justify-center.clearfix( - ng-class = "{'align-center justify-center': $root.ahaGuide.ahaGuideToggles.showAha1}" + ng-class = "{'align-center justify-center': EC.showCreateTemplate}" ) .help-container( ng-class = "{\ @@ -98,7 +97,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha1 && !$root.ahaGuide.ahaGuideToggles.showOverview && $root.ahaGuide.ahaGuideToggles.showAha1 && !data.instances.models.length" + ng-if = "$root.featureFlags.aha && EC.showCreateTemplate" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive @@ -109,7 +108,7 @@ .grid-block.card-grid.clearfix( ng-class = "{'padding-top': helpCards.getActiveCard().helpTop}" - ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1 || $root.ahaGuide.ahaGuideToggles.exitedEarly" + ng-if = "!$root.featureFlags.aha || data.instances.models.length > 0 || !EC.ahaGuide.isInGuide()" ng-include = "'viewCardGrid'" ) @@ -127,6 +126,7 @@ | to help you set up your stack. .grid-block.vertical.aha-sidebar.padding-sm.js-animate( - aha-sidebar-directive - ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaSidebar && $root.ahaGuide.ahaGuideToggles.showSidebar" + aha-sidebar + toggle-sidebar = "EC.toggleSidebar" + ng-if = "$root.featureFlags.aha && EC.showSidebar" ) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 63f96f3fa..16766b152 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -12,7 +12,6 @@ var STEPS = { }; function ahaGuide( - $http, fetchInstancesByPod, currentOrg, $rootScope @@ -195,9 +194,15 @@ function ahaGuide( return cachedStep; } + function isInGuide() { + currentOrg.poppa.hasAha = true; + return currentOrg.poppa.hasAha && getCurrentStep() !== STEPS.COMPLETED; + } + return { stepList: stepList, getCurrentStep: getCurrentStep, - steps: STEPS + steps: STEPS, + isInGuide: isInGuide }; } diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index fc35abac5..ffd28ad1a 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -59,6 +59,6 @@ ) .grid-block.vertical.aha-sidebar.padding-sm.js-animate( - aha-sidebar-directive + aha-sidebar ng-if = "$root.featureFlags.aha && $root.ahaGuide.ahaGuideToggles.showSidebar" ) From 9431bfffd4826746c16eed9da1d592f4404a1464 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 2 Sep 2016 18:23:46 -0700 Subject: [PATCH 147/577] Addressed PR comments --- client/controllers/controllerInstances.js | 38 ++++++++++++++----- .../instanceNavigationPopoverView.jade | 2 +- .../branchMenuPopoverView.jade | 24 ++++++------ client/templates/instances/viewInstances.jade | 2 +- 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 47f841abd..095ddcf0c 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -25,6 +25,7 @@ function ControllerInstances( var userName = $state.params.userName; self.searchBranches = null; self.instanceBranches = null; + self.branchQuery = null; self.$storage = $localStorage.$default({ instanceListIsClosed: false }); @@ -124,6 +125,27 @@ function ControllerInstances( }); }; + this.getFilteredBranches = function() { + if (!self.branchQuery) { + return self.instanceBranches; + } + var branchName; + var searchQuery = self.branchQuery.toLowerCase(); + return self.instanceBranches.filter(function (branch) { + branchName = branch.attrs.name.toLowerCase(); + return branchName.indexOf(searchQuery) !== -1; + }); + }; + + this.shouldShowBranch = function(branch) { + if (!self.branchQuery) { + return true; + } + var searchQuery = self.branchQuery.toLowerCase(); + var branchName = branch.attrs.name.toLowerCase(); + return branchName.indexOf(searchQuery) !== -1; + } + this.shouldShowChild = function (childInstance) { if (!self.searchBranches) { return true; @@ -150,8 +172,11 @@ function ControllerInstances( this.getReposFromInstance = function(instance) { var branchName; + self.instanceBranches = null; + self.branchQuery = null; + loading('fetchingBranches', true); var childInstances = instance.children.models.reduce(function(childHash, child) { - branchName = keypather.get(child, 'contextVersion.appCodeVersions.models[0].attrs.branch'); + branchName = child.getBranchName(); childHash[branchName] = branchName; return childHash; }, {}); @@ -164,10 +189,11 @@ function ControllerInstances( branchName = keypather.get(branch, 'attrs.name'); return !childInstances[branchName]; }); + loading('fetchingBranches', false); }); }; - this.forkBranchFromInstance = function(branch, instance) { + this.forkBranchFromInstance = function(branch, instance, closePopover) { var sha = branch.attrs.commit.sha; var loadingName = 'buildingForkedBranch' + branch.attrs.name; var index; @@ -175,13 +201,7 @@ function ControllerInstances( promisify(instance, 'fork')(branch.attrs.name, sha) .then(function(result) { loading(loadingName, false); - for (var i = 0; i < self.instanceBranches.length; i++) { - if (self.instanceBranches[i].attrs.name === branch.attrs.name) { - index = i; - break; - } - } - self.instanceBranches.splice(index, 1); + closePopover(); }); }; diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index be0ea3098..a944f3f1b 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -48,7 +48,7 @@ ) li.list-item.popover-list-item( ng-click = "INC.removeBranch()" - ng-if = "!INC.instance.attrs.isolated" + ng-if = "INC.instance.attrs.isIsolationGroupMaster" ) svg.iconnables use( diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 559b9c321..b13aac21a 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -86,11 +86,11 @@ ) There are no branches to add. .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( - ng-if = "!CIS.instanceBranches.length" + ng-if = "$root.isLoading.fetchingBranches" ng-include = "'spinner'" ) .padding-xxs( - ng-if = "CIS.instanceBranches.length" + ng-if = "CIS.instanceBranches" ) .grid-block.shrink.align-center.well.gray.padding-xxs( ng-if = "!$root.featureFlags.autoIsolation" @@ -109,7 +109,7 @@ ) .toggle-group.toggle-sm input.input.input-xs.input-search( - ng-disabled = "!CIS.instanceBranches.length" + ng-model = "CIS.branchQuery" placeholder = "Filter" required type = "search" @@ -122,13 +122,12 @@ .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( ng-include = "'spinner'" ) - //- ng-repeat = branch in whatever returned from instance fetch branches li.list-item.popover-list-item( - ng-repeat = "branch in CIS.instanceBranches" - ng-click = "CIS.forkBranchFromInstance(branch, instance)" + ng-repeat = "branch in CIS.getFilteredBranches()" + ng-click = "CIS.forkBranchFromInstance(branch, instance, POC.closePopover);" ) {{ branch.attrs.name }} button.btn.btn-xs.btn-icon.btn-add( - ng-if = "!$root.isLoading['buildingForkedBranch' + branch.attrs.name]" + ng-if = "!$root.isLoading['buildingForkedBranch' + branch.attrs.name] && CIS.shouldShowBranch(branch)" ) svg.iconnables.icons-add use( @@ -138,9 +137,8 @@ ng-if = "$root.isLoading['buildingForkedBranch' + branch.attrs.name]" ng-include = "'spinner'" ) - - li.list-item.grid-block.justify-justified.list-pagination( - ) - //- ng-if = "paginated" - button.btn.btn-xs.gray.grid-content Last 50 - button.btn.btn-xs.gray.grid-content Next 50 + .empty-div( + ng-if = "CIS.instanceBranches && !CIS.getFilteredBranches().length" + ) + p.p.text-center.text-gray-light.padding-sm( + ) There are no branches to add. diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 857567764..0d6a07635 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -19,7 +19,7 @@ ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" ) - .spinner-wrapper.spinner-md.spinner-gray.in( + .spinner-wrapper.spinner-md.spinner-gray.spinner-center.in( ng-include = "'spinner'" ) From dbe0b3d389d87832af70855eb40a7c033d0dc231 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 2 Sep 2016 18:24:16 -0700 Subject: [PATCH 148/577] Deleted ahaSidebar feature flag. --- client/directives/instances/instance/instanceHeaderView.jade | 4 ++-- client/services/featureFlagService.js | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/directives/instances/instance/instanceHeaderView.jade b/client/directives/instances/instance/instanceHeaderView.jade index ac64b11b8..5201719eb 100644 --- a/client/directives/instances/instance/instanceHeaderView.jade +++ b/client/directives/instances/instance/instanceHeaderView.jade @@ -47,8 +47,8 @@ ) {{key}}:{{value[0].HostPort}} | button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "$root.featureFlags.ahaSidebar = true" - ng-if = "$root.featureFlags.aha && !$root.featureFlags.ahaSidebar" + ng-click = "EC.toggleSidebar()" + ng-if = "$root.featureFlags.aha" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" ) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index f1a4b3d4e..f9bde99c6 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -14,7 +14,6 @@ function featureFlags( aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config aha3: false, // step 4: runnabot ahaOverview: false, // toggle sidebar - ahaSidebar: false, // toggle sidebar allowIsolatedUpdate: false, autoIsolation: false, autoIsolationSetup: false, From 6a3f859fda5a4f8f1b7a4492b48ea5b7bb3d5e4e Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 2 Sep 2016 18:25:26 -0700 Subject: [PATCH 149/577] Removed ahaOverview feature flag. --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 +- client/services/featureFlagService.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index fa2d9a101..21e38c034 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -7,7 +7,7 @@ xlink:href = "#icons-close" ) .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.featureFlags.ahaOverview && $root.ahaGuide.ahaGuideToggles.showOverview" + ng-if = "$root.ahaGuide.ahaGuideToggles.showOverview" ) .grid-content.strong Let‘s get running! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index f9bde99c6..28191af2c 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -13,7 +13,6 @@ function featureFlags( aha1: false, // step 2: working repo config aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config aha3: false, // step 4: runnabot - ahaOverview: false, // toggle sidebar allowIsolatedUpdate: false, autoIsolation: false, autoIsolationSetup: false, From 2926052bde27cd619be2ca5d189836b2161a14f5 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 2 Sep 2016 18:31:18 -0700 Subject: [PATCH 150/577] Removed lingering aha-guide-2 dom element --- client/templates/instances/viewInstances.jade | 5 ----- 1 file changed, 5 deletions(-) diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 0d6a07635..686c38e2a 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -10,11 +10,6 @@ scroll-to = "a.a-sref.active" ) - .popover.bottom.in.popover-aha.popover-add-branches.js-animate( - ng-if = "$root.featureFlags.aha2" - ng-include = "'ahaPopoverView'" - ) - .list-instances-wrapper.grid-block.shrink.align-center.justify-center( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" From c07342dd7dc617a1e498a3ab6af56cf16529055f Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 2 Sep 2016 18:35:56 -0700 Subject: [PATCH 151/577] haste makes waste --- client/controllers/controllerInstances.js | 9 --------- .../branchMenuPopover/branchMenuPopoverView.jade | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 095ddcf0c..7e6fe88a2 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -137,15 +137,6 @@ function ControllerInstances( }); }; - this.shouldShowBranch = function(branch) { - if (!self.branchQuery) { - return true; - } - var searchQuery = self.branchQuery.toLowerCase(); - var branchName = branch.attrs.name.toLowerCase(); - return branchName.indexOf(searchQuery) !== -1; - } - this.shouldShowChild = function (childInstance) { if (!self.searchBranches) { return true; diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index b13aac21a..f031aa5cf 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -127,7 +127,7 @@ ng-click = "CIS.forkBranchFromInstance(branch, instance, POC.closePopover);" ) {{ branch.attrs.name }} button.btn.btn-xs.btn-icon.btn-add( - ng-if = "!$root.isLoading['buildingForkedBranch' + branch.attrs.name] && CIS.shouldShowBranch(branch)" + ng-if = "!$root.isLoading['buildingForkedBranch' + branch.attrs.name]" ) svg.iconnables.icons-add use( From dffaecbc1d8ab63115ec22b6c2bd250b50db5c8a Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 2 Sep 2016 18:46:52 -0700 Subject: [PATCH 152/577] comment out filter empty state --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 0bd9ade85..dea72f3f0 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -125,9 +125,8 @@ .text-center.text-gray.small.padding-lg( ng-if = "branch.length === 0" ) There are no branches to add. - .text-center.text-gray.small.padding-lg( - ng-if = "branch.length === 0" - ) No branches match this filter. + //- when the filter has no results + //- .text-center.text-gray.small.padding-lg No branches match this filter. ul.list.popover-list( ng-if = "state.branchesLoaded" ) From 08e9c90daf513f021212b7c80b4cde7ca0d51b66 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 19:12:57 -0700 Subject: [PATCH 153/577] reduce default border width to 1px --- .../styles/scss/components/aha-button.scss | 2 +- .../assets/styles/scss/components/cards.scss | 10 ++++----- .../scss/deprecated/btn-auto-deploy.scss | 4 ++-- .../styles/scss/forms/forms-toggles.scss | 14 ++++++------ client/assets/styles/scss/globals/var.scss | 2 +- .../styles/scss/layout/environment-body.scss | 4 ++-- .../scss/modals/modals-server-select.scss | 5 +---- client/assets/styles/scss/modals/modals.scss | 4 ++-- .../styles/scss/popover/popover-arrows.scss | 22 +++++++++---------- .../directives/activePanel/tabs/viewTabs.jade | 2 +- .../buildLogs/viewPopoverDebug.jade | 4 ++-- .../containerStatusButtonView.jade | 2 +- .../editRepoCommit/editRepoCommitView.jade | 2 +- .../explorer/explorerSectionHeading.jade | 2 +- .../components/explorer/explorerView.jade | 2 +- .../components/explorer/fileTreeDirView.jade | 4 ++-- .../saveOpenItemsButtonView.jade | 2 +- .../saveOpenItemsOptionsPopoverView.jade | 2 +- .../forms/backupForm/backupFormView.jade | 4 ++-- .../pages/newRepositorySelectionView.jade | 2 +- .../popovers/viewPopoverFileOptions.jade | 4 ++-- .../instance/instanceHeaderView.jade | 2 +- .../teammateOptionsPopoverView.jade | 4 ++-- 23 files changed, 51 insertions(+), 54 deletions(-) diff --git a/client/assets/styles/scss/components/aha-button.scss b/client/assets/styles/scss/components/aha-button.scss index 707479e41..7908edac5 100644 --- a/client/assets/styles/scss/components/aha-button.scss +++ b/client/assets/styles/scss/components/aha-button.scss @@ -9,6 +9,6 @@ .iconnables { height: 12px; - width: 12px; + width: 100%; } } diff --git a/client/assets/styles/scss/components/cards.scss b/client/assets/styles/scss/components/cards.scss index 400971183..2948967a4 100644 --- a/client/assets/styles/scss/components/cards.scss +++ b/client/assets/styles/scss/components/cards.scss @@ -1,5 +1,5 @@ .card { - border: 2px solid transparent; + border: $input-border solid transparent; border-radius: $input-border-radius-lg; display: flex; flex-direction: column; @@ -148,8 +148,8 @@ } &:not([disabled]):hover { - border-color: darken($gray-lighter,6%); - box-shadow: inset 0 1px 0 darken($gray-lighter,6%); + border-color: $gray-light; + box-shadow: inset 0 0 0 $gray-light; &:first-child { box-shadow: none; @@ -159,7 +159,7 @@ &:not([disabled]):active { background: lighten($purple-lightest,6%); border-color: $purple-light; - box-shadow: inset 0 1px 0 $purple-light; + box-shadow: inset 0 0 0 $purple-light; &:first-child { box-shadow: none; @@ -170,7 +170,7 @@ } .icons-arrow-down { - color: lighten($purple-light,37%); + color: lighten($purple-light,18%); } .btn-xxs { diff --git a/client/assets/styles/scss/deprecated/btn-auto-deploy.scss b/client/assets/styles/scss/deprecated/btn-auto-deploy.scss index c4deb7d21..e8a1c17c5 100644 --- a/client/assets/styles/scss/deprecated/btn-auto-deploy.scss +++ b/client/assets/styles/scss/deprecated/btn-auto-deploy.scss @@ -9,7 +9,7 @@ .btn-auto-deploy-deprecated { background: $gray-lightest; - border-radius: 0; + border-radius: 0 0 $input-border-radius; border-top: 1px solid $gray-lighter; bottom: 0; color: $gray; @@ -17,7 +17,7 @@ font-size: 13px; height: $input-sm; left: 0; - margin: 2px; + margin: $input-border; padding: 0 9px; position: absolute; right: 0; diff --git a/client/assets/styles/scss/forms/forms-toggles.scss b/client/assets/styles/scss/forms/forms-toggles.scss index 0155907f1..74bf46216 100644 --- a/client/assets/styles/scss/forms/forms-toggles.scss +++ b/client/assets/styles/scss/forms/forms-toggles.scss @@ -49,7 +49,7 @@ width: 40px; &:hover { - background: #e6e6e6; // warning: unique color + background: $gray-lighter; // warning: unique color } &:active { @@ -63,8 +63,8 @@ width: 33px; &::after { - height: 17px; - width: 17px; + height: 21px - ($input-border * 2); + width: 21px - ($input-border * 2); } } @@ -74,8 +74,8 @@ width: 24px; &::after { - height: 11px; - width: 11px; + height: 15px - ($input-border * 2); + width: 15px - ($input-border * 2); } } @@ -86,12 +86,12 @@ box-shadow: 1px 1px 3px rgba($black,.05); content: ''; display: block; - height: 22px; + height: 26px - ($input-border * 2); left: 0; position: absolute; top: 0; transition: transform .15s ease-in-out; - width: 22px; + width: 26px - ($input-border * 2); } } diff --git a/client/assets/styles/scss/globals/var.scss b/client/assets/styles/scss/globals/var.scss index c1ef02e9d..59dbd0bac 100755 --- a/client/assets/styles/scss/globals/var.scss +++ b/client/assets/styles/scss/globals/var.scss @@ -171,7 +171,7 @@ $screen-xl: 1920px + $layout-navigation-width; $terminal-line-height: 19px; // button/input sizes -$input-border: 2px; +$input-border: 1px; $input-border-radius: 3px; $input-border-radius-lg: 6px; diff --git a/client/assets/styles/scss/layout/environment-body.scss b/client/assets/styles/scss/layout/environment-body.scss index 51fd60bb4..437ff9d35 100644 --- a/client/assets/styles/scss/layout/environment-body.scss +++ b/client/assets/styles/scss/layout/environment-body.scss @@ -18,12 +18,12 @@ } .card { - height: 461px; + height: 466px; margin-bottom: 15px; min-width: 0; &.deprecated { - height: 439px; + height: 444px; } // sibling styles must appear first to be overridden by media queries diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index 6f047970a..6a61b3aa3 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -1,10 +1,7 @@ .modal-servers, .modal-servers .animated-panel { + max-width: 100%; min-width: 100%; // fix animated panel container - - @include media(xxxs) { - max-width: 100%; - } } .modal-server-select { diff --git a/client/assets/styles/scss/modals/modals.scss b/client/assets/styles/scss/modals/modals.scss index 5a4ca4f67..e92d58e03 100755 --- a/client/assets/styles/scss/modals/modals.scss +++ b/client/assets/styles/scss/modals/modals.scss @@ -2,7 +2,7 @@ .modal-backdrop { align-items: center; animation: fade .15s; - background: rgba($white,.97); + background: rgba($white,.98); display: flex; flex-direction: column; height: 100vh; @@ -36,7 +36,7 @@ .modal-dialog { animation: scale-in-modal .15s ease-out; background: $gray-lighterest; - border: $input-border-radius solid $gray-lighter; + border: 2px solid $gray-lighter; border-radius: $input-border-radius-lg; display: flex; flex: 0 0 auto; diff --git a/client/assets/styles/scss/popover/popover-arrows.scss b/client/assets/styles/scss/popover/popover-arrows.scss index fa527f837..6a1b290b0 100644 --- a/client/assets/styles/scss/popover/popover-arrows.scss +++ b/client/assets/styles/scss/popover/popover-arrows.scss @@ -31,7 +31,7 @@ .arrow { background: transparent; border-color: $gray-lighter; - border-width: 13px; + border-width: 12px; z-index: $z-popover-arrow; // reset bg @@ -75,7 +75,7 @@ border-bottom-width: 0; border-left-color: transparent; border-right-color: transparent; - bottom: -13px; + bottom: -12px; left: 50%; margin-left: -11px; @@ -83,7 +83,7 @@ border-bottom-width: 0; border-left-color: transparent; border-right-color: transparent; - bottom: 3px; + bottom: 2px; margin-left: -10px; } } @@ -98,8 +98,8 @@ border-bottom-color: transparent; border-left-width: 0; border-top-color: transparent; - left: -13px; - margin-top: -13px; + left: -12px; + margin-top: -12px; top: 50%; &::after { @@ -107,7 +107,7 @@ border-left-width: 0; border-top-color: transparent; bottom: -10px; - left: 3px; + left: 2px; } } } @@ -121,15 +121,15 @@ border-right-color: transparent; border-top-width: 0; left: 50%; - margin-left: -13px; - top: -13px; + margin-left: -12px; + top: -12px; &::after { border-left-color: transparent; border-right-color: transparent; border-top-width: 0; margin-left: -10px; - top: 3px; + top: 2px; } } } @@ -142,8 +142,8 @@ border-bottom-color: transparent; border-right-width: 0; border-top-color: transparent; - margin-top: -13px; - right: -13px; + margin-top: -12px; + right: -12px; top: 50%; &::after { diff --git a/client/directives/activePanel/tabs/viewTabs.jade b/client/directives/activePanel/tabs/viewTabs.jade index 1eda8cd45..268291835 100755 --- a/client/directives/activePanel/tabs/viewTabs.jade +++ b/client/directives/activePanel/tabs/viewTabs.jade @@ -40,7 +40,7 @@ button.btn.btn-xs.btn-add-tab( pop-over-actions = "popoverAddTab.actions" pop-over-active = "popoverAddTab.data.show" pop-over-data = "popoverAddTab.data" - pop-over-options = "{\"right\":-7,\"top\":37}" + pop-over-options = "{\"right\":-5,\"top\":37}" pop-over-template = "viewPopoverAddTab" ) svg.iconnables.icons-add diff --git a/client/directives/components/buildLogs/viewPopoverDebug.jade b/client/directives/components/buildLogs/viewPopoverDebug.jade index 4365d1a84..a5e954d4d 100644 --- a/client/directives/components/buildLogs/viewPopoverDebug.jade +++ b/client/directives/components/buildLogs/viewPopoverDebug.jade @@ -1,10 +1,10 @@ .popover.menu.bottom.popover-debug( - ng-class = "{in: active}" + ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" style = "transform-origin: 90% 0;" ) .arrow.white( - style = "left: auto; right: 1px;" + style = "left: auto; right: 3px;" ) .popover-content .list.popover-list diff --git a/client/directives/components/containerStatusButton/containerStatusButtonView.jade b/client/directives/components/containerStatusButton/containerStatusButtonView.jade index 888a345e2..499c49f41 100644 --- a/client/directives/components/containerStatusButton/containerStatusButtonView.jade +++ b/client/directives/components/containerStatusButton/containerStatusButtonView.jade @@ -19,7 +19,7 @@ button.btn.btn-md.btn-status( pop-over-actions = "CSBC.actions" pop-over-active = "CSBC.popoverActive" pop-over-controller = "CSBC" - pop-over-options = "{\"centered\":true,\"top\":45}" + pop-over-options = "{\"centered\":true,\"top\":47}" pop-over-template = "containerStatusOptionsPopoverView" pop-over-trigger = "activeAttr" ) diff --git a/client/directives/components/editRepoCommit/editRepoCommitView.jade b/client/directives/components/editRepoCommit/editRepoCommitView.jade index 6c310fc5a..7c71e0315 100644 --- a/client/directives/components/editRepoCommit/editRepoCommitView.jade +++ b/client/directives/components/editRepoCommit/editRepoCommitView.jade @@ -47,7 +47,7 @@ ng-include = "'userButtonView'" pop-over pop-over-active = "state.active" - pop-over-options = "{\"left\":-24,\"top\":26}" + pop-over-options = "{\"left\":-23,\"top\":26}" pop-over-template = "userPopoverView" ) span.small( diff --git a/client/directives/components/explorer/explorerSectionHeading.jade b/client/directives/components/explorer/explorerSectionHeading.jade index a58fa70da..8c061f0b9 100644 --- a/client/directives/components/explorer/explorerSectionHeading.jade +++ b/client/directives/components/explorer/explorerSectionHeading.jade @@ -5,7 +5,7 @@ button.btn.gray.btn-xs.btn-icon( pop-over-actions = "FPC.actions" pop-over-active = "filePopover.data.show" pop-over-data = "filePopover.data" - pop-over-options = "{\"top\":36,\"centered\":true}" + pop-over-options = "{\"top\":35,\"centered\":true}" pop-over-template = "viewFileTreePopoverFileExplorerMenu" ) svg.iconnables.icons-add diff --git a/client/directives/components/explorer/explorerView.jade b/client/directives/components/explorer/explorerView.jade index ebccd4302..f2fac6139 100644 --- a/client/directives/components/explorer/explorerView.jade +++ b/client/directives/components/explorer/explorerView.jade @@ -15,7 +15,7 @@ pop-over pop-over-actions = "FPC.actions" pop-over-data = "filePopover.data" - pop-over-options = "{\"left\":-84,\"top\":35}" + pop-over-options = "{\"top\":35,\"centered\":true}" pop-over-template = "viewFileTreePopoverFileExplorerMenu" pop-over-active = "filePopover.data.show" ) diff --git a/client/directives/components/explorer/fileTreeDirView.jade b/client/directives/components/explorer/fileTreeDirView.jade index c8490b331..f96ec2c34 100755 --- a/client/directives/components/explorer/fileTreeDirView.jade +++ b/client/directives/components/explorer/fileTreeDirView.jade @@ -45,7 +45,7 @@ li.folder( pop-over-actions = "popoverFilesRepositoryCommitToggle.actions" pop-over-active = "state.showAddRepo" pop-over-data = "popoverFilesRepositoryCommitToggle.data" - pop-over-options = "{\"left\":207,\"top\":-222}" + pop-over-options = "{\"left\":203,\"top\":-220}" pop-over-template = "viewPopoverFilesRepositoryCommitToggle" pop-over-trigger = "activeAttr" ) @@ -79,7 +79,7 @@ li.folder( pop-over-actions = "popoverFilesRepositoryCommitToggle.actions" pop-over-active = "acv.editing" pop-over-data = "popoverEditRepoCommit.data" - pop-over-options = "{\"left\":207,\"top\":-222}" + pop-over-options = "{\"left\":203,\"top\":-220}" pop-over-template = "viewPopoverFilesRepositoryCommitToggle" pop-over-trigger = "activeAttr" ) diff --git a/client/directives/components/saveOpenItemsButton/saveOpenItemsButtonView.jade b/client/directives/components/saveOpenItemsButton/saveOpenItemsButtonView.jade index 8804ef37c..4e6f6bfdf 100644 --- a/client/directives/components/saveOpenItemsButton/saveOpenItemsButtonView.jade +++ b/client/directives/components/saveOpenItemsButton/saveOpenItemsButtonView.jade @@ -24,7 +24,7 @@ pop-over pop-over-active = "SOIBC.popoverActive" pop-over-controller = "SOIBC" - pop-over-options = "{\"right\":1,\"top\":47}" + pop-over-options = "{\"right\":-6,\"top\":47}" pop-over-template = "saveOpenItemsOptionsPopoverView" type = "button" ) diff --git a/client/directives/components/saveOpenItemsButton/saveOpenItemsOptionsPopoverView.jade b/client/directives/components/saveOpenItemsButton/saveOpenItemsOptionsPopoverView.jade index 79d15f7db..601041448 100644 --- a/client/directives/components/saveOpenItemsButton/saveOpenItemsOptionsPopoverView.jade +++ b/client/directives/components/saveOpenItemsButton/saveOpenItemsOptionsPopoverView.jade @@ -4,7 +4,7 @@ style = "transform-origin: 95% 0;" ) .arrow.white( - style = "left: auto; right: -1px;" + style = "left: auto; right: 6px;" ) .popover-content ul.popover-list diff --git a/client/directives/environment/modals/forms/backupForm/backupFormView.jade b/client/directives/environment/modals/forms/backupForm/backupFormView.jade index a0aeca638..42bd59e54 100644 --- a/client/directives/environment/modals/forms/backupForm/backupFormView.jade +++ b/client/directives/environment/modals/forms/backupForm/backupFormView.jade @@ -47,8 +47,8 @@ ng-class = "{'disabled': false}" ) Back Up Now //- disable the above button and add tooltip if the container is down - //- tooltip = "You can’t back up while the container isn’t running." - //- tooltip-options = "{\"class\":\"bottom bottom-arrow-right\",\"right\":0,\"top\":30}" + tooltip = "You can’t back up while the container isn’t running." + tooltip-options = "{\"class\":\"bottom bottom-arrow-right\",\"right\":0,\"top\":24}" .ace-container.ace-backup( ng-class = "{\ diff --git a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade index ee4896a27..1e1fef27c 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade @@ -73,7 +73,7 @@ ul.list.list-servers( ng-include = "'userButtonView'" pop-over pop-over-active = "MC.state.active" - pop-over-options = "{\"left\":-24,\"top\":26}" + pop-over-options = "{\"left\":-22,\"top\":26}" pop-over-template = "userPopoverView" ) span.small( diff --git a/client/directives/environment/modals/popovers/viewPopoverFileOptions.jade b/client/directives/environment/modals/popovers/viewPopoverFileOptions.jade index 8143e6cc2..d84be8544 100644 --- a/client/directives/environment/modals/popovers/viewPopoverFileOptions.jade +++ b/client/directives/environment/modals/popovers/viewPopoverFileOptions.jade @@ -1,10 +1,10 @@ .popover.menu.bottom( - ng-class = "{in: active}" + ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" style = "transform-origin: 90% 0" ) .arrow.white( - style = "left: auto; right: 3px" + style = "left: auto; right: 2px" ) .popover-content ul.popover-list diff --git a/client/directives/instances/instance/instanceHeaderView.jade b/client/directives/instances/instance/instanceHeaderView.jade index ac64b11b8..5bed7b294 100644 --- a/client/directives/instances/instance/instanceHeaderView.jade +++ b/client/directives/instances/instance/instanceHeaderView.jade @@ -50,7 +50,7 @@ ng-click = "$root.featureFlags.ahaSidebar = true" ng-if = "$root.featureFlags.aha && !$root.featureFlags.ahaSidebar" tooltip = "Setup Guide" - tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" + tooltip-options = "{\"class\":\"left\",\"right\":44,\"top\":0}" ) svg.iconnables use( diff --git a/client/directives/modals/settingsModal/forms/teamManagementForm/teammateOptionsPopoverView.jade b/client/directives/modals/settingsModal/forms/teamManagementForm/teammateOptionsPopoverView.jade index 19d19b1cf..0f27db6ec 100644 --- a/client/directives/modals/settingsModal/forms/teamManagementForm/teammateOptionsPopoverView.jade +++ b/client/directives/modals/settingsModal/forms/teamManagementForm/teammateOptionsPopoverView.jade @@ -1,10 +1,10 @@ .popover.menu.bottom( - ng-class = "{in: active}" + ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" style = "transform-origin: 90% 0" ) .arrow.white( - style = "left: auto; right: 0" + style = "left: auto; right: 1px" ) .popover-content ul.popover-list From ed8706cf3ab91a47bee0650dc4b2726dfaf2b7b1 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 19:28:08 -0700 Subject: [PATCH 154/577] fix error wells expanding in safari --- .../environment/modals/forms/formLogs/viewFormLogs.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 2ca276884..38fe66327 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -78,11 +78,11 @@ pre.pre.log-wrapper( use( xlink:href = "#icons-life-preserver" ) - small.grid-content.small + small.grid-content.shrink.small //- If build error: | Build problems? Sometimes rebuilding the container can resolve errors, otherwise inspect your build logs. //- IF CMD error: //- | Your container is having trouble running. Check the CMD Logs and your CMD Command. - button.grid-content.btn.btn-xs.orange( + button.grid-content.shrink.btn.btn-xs.orange( ng-click = "SMC.rebuild(true, true)" ) Rebuild From 59a48e610ed95af78863644557645da8485be2c0 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 19:36:06 -0700 Subject: [PATCH 155/577] fix alert icon in aha getting cut off --- client/assets/styles/scss/components/aha-guide.scss | 1 - .../ahaGuide/components/setUpRepositoryGuideView.jade | 2 +- client/templates/svg/svgDefs.jade | 3 +++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/client/assets/styles/scss/components/aha-guide.scss b/client/assets/styles/scss/components/aha-guide.scss index cb338c976..397386374 100644 --- a/client/assets/styles/scss/components/aha-guide.scss +++ b/client/assets/styles/scss/components/aha-guide.scss @@ -95,7 +95,6 @@ .icons-alert { color: $orange; - overflow: visible; padding: 10px 11px 11px; } } diff --git a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade index 5071f3c5a..eb18e4556 100644 --- a/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRepositoryGuideView.jade @@ -28,7 +28,7 @@ ng-if = "state.showError" ) use( - xlink:href = "#icons-alert-alt" + xlink:href = "#icons-alert-alt-round" ) .grid-block.vertical.aha-text diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index 7f2964e28..34c45d48b 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -13,6 +13,9 @@ svg(xmlns='http://www.w3.org/2000/svg') path(d='M10,8.006l-0.032,6A0.982,0.982,0,0,1,9.005,15H8.995a0.982,0.982,0,0,1-.962-0.994L8,8.006A0.982,0.982,0,0,1,8.962,7H9.038A0.982,0.982,0,0,1,10,8.006Z', transform='translate(0 -1.123)') symbol#icons-alert-alt(viewBox='0 0 18 15.877') path(d='M17.853,15.306L13.9,8.456,9.943,1.606a1.088,1.088,0,0,0-1.885,0L4.1,8.456l-3.955,6.85a1.088,1.088,0,0,0,.943,1.633H16.91A1.088,1.088,0,0,0,17.853,15.306ZM10,8.006l-0.032,6A0.982,0.982,0,0,1,9.005,15H8.995a0.982,0.982,0,0,1-.962-0.994L8,8.006A0.982,0.982,0,0,1,8.962,7H9.038A0.982,0.982,0,0,1,10,8.006Z', transform='translate(0 -1.061)') + symbol#icons-alert-alt-round(viewBox='0 0 18 18') + circle(cx='9', cy='9', r='9', fill='none') + path(d='M15.885,13.9L12.809,8.577,9.733,3.249a0.846,0.846,0,0,0-1.466,0L5.191,8.577,2.115,13.9a0.846,0.846,0,0,0,.733,1.27h12.3A0.846,0.846,0,0,0,15.885,13.9ZM9.778,8.227L9.753,12.893A0.763,0.763,0,0,1,9,13.667H9a0.763,0.763,0,0,1-.749-0.773L8.222,8.227a0.764,0.764,0,0,1,.749-0.782H9.029A0.764,0.764,0,0,1,9.778,8.227Z', transform='translate(0)') symbol#icons-alert-round(viewBox='0 0 30 30') path(d='M15,5c5.5,0,10,4.5,10,10s-4.5,10-10,10S5,20.5,5,15S9.5,5,15,5 M15,3C8.4,3,3,8.4,3,15s5.4,12,12,12s12-5.4,12-12S21.6,3,15,3L15,3z') path(d='M15,18.3c-0.6,0-1-0.4-1-1V9.5c0-0.6,0.4-1,1-1s1,0.4,1,1v7.8C16,17.8,15.6,18.3,15,18.3z') From 2e2a2587698495d9dbba8e95fa3494a2ab259565 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 2 Sep 2016 19:43:38 -0700 Subject: [PATCH 156/577] fix text alignment in safari --- .../modalChooseOrganization/chooseOrganizationModalView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index e97832eaa..37c25de4e 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -99,7 +99,7 @@ ng-if = "data.allAccounts.length" ) //- disabled until an org is selected - button.grid-block.align-center.justify-center.btn.btn-md.green( + button.btn.btn-md.green( ng-click = "\ actions.createOrCheckDock(data.selectedOrgName, goToPanel);\ state.showSubStep = 1;\ @@ -135,7 +135,7 @@ footer.grid-block.vertical.modal-footer.fade( ng-class = "{'in': isActivePanel()}" ) - button.grid-block.align-center.justify-center.btn.btn-md.green( + button.btn.btn-md.green( ng-click = "actions.selectAccount(data.selectedOrgName)" ) Go to Runnable .grid-block.justify-center.modal-outer-footer( From b4953b7b9f1d1bda322412db1848b5d592bb082c Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 2 Sep 2016 20:11:58 -0700 Subject: [PATCH 157/577] Added all states, will look more critically soon --- client/controllers/controllerInstances.js | 25 ++++++++++++------- .../instanceNavigationPopoverView.jade | 2 +- .../branchMenuPopoverView.jade | 21 +++++++++------- client/templates/instances/viewInstances.jade | 19 +++++++------- .../instances/viewInstancesList.jade | 2 +- 5 files changed, 40 insertions(+), 29 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 7e6fe88a2..02ac41499 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -25,6 +25,7 @@ function ControllerInstances( var userName = $state.params.userName; self.searchBranches = null; self.instanceBranches = null; + self.unbuiltBranches = null; self.branchQuery = null; self.$storage = $localStorage.$default({ instanceListIsClosed: false @@ -161,26 +162,32 @@ function ControllerInstances( }); }; - this.getReposFromInstance = function(instance) { + this.unbuiltBranches = function(instance, branches) { var branchName; - self.instanceBranches = null; - self.branchQuery = null; - loading('fetchingBranches', true); var childInstances = instance.children.models.reduce(function(childHash, child) { branchName = child.getBranchName(); childHash[branchName] = branchName; return childHash; }, {}); + + var unbuiltBranches = branches.models.filter(function(branch) { + branchName = keypather.get(branch, 'attrs.name'); + return !childInstances[branchName]; + }); + loading('fetchingBranches', false); + return unbuiltBranches; + }; + + this.getAllBranches = function(instance) { + self.instanceBranches = null; + loading('fetchingBranches', true); return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) .then(function (repo) { return promisify(repo, 'fetchBranches')(); }) .then(function (branches) { - self.instanceBranches = branches.models.filter(function(branch) { - branchName = keypather.get(branch, 'attrs.name'); - return !childInstances[branchName]; - }); - loading('fetchingBranches', false); + self.totalInstanceBranches = branches.models.length; + self.instanceBranches = self.unbuiltBranches(instance, branches); }); }; diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index a944f3f1b..bf276cd82 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -132,7 +132,7 @@ use( xlink:href = "#icons-delete" ) - | Delete Branch + | Remove Branch .popover-content( ng-if = "!$root.featureFlags.addBranches && !$root.featureFlags.autoIsolation" diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index f031aa5cf..6d394c9de 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -81,10 +81,6 @@ | Add Branch .popover-content( ) - .text-center.text-gray.small.padding-md( - ng-if = "CIS.instanceBranches.length === 0" - ) There are no branches to add. - .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( ng-if = "$root.isLoading.fetchingBranches" ng-include = "'spinner'" @@ -137,8 +133,15 @@ ng-if = "$root.isLoading['buildingForkedBranch' + branch.attrs.name]" ng-include = "'spinner'" ) - .empty-div( - ng-if = "CIS.instanceBranches && !CIS.getFilteredBranches().length" - ) - p.p.text-center.text-gray-light.padding-sm( - ) There are no branches to add. + + .text-center.text-gray.small.padding-md( + ng-if = "CIS.instanceBranches && !CIS.instanceBranches.length && CIS.totalInstanceBranches" + ) There are no branches to add. + + .text-center.text-gray.small.padding-md( + ng-if = "CIS.instanceBranches && !CIS.instanceBranches.length && !CIS.totalInstanceBranches" + ) The repository has no branches. + + .text-center.text-gray.small.padding-md( + ng-if = "CIS.instanceBranches && CIS.instanceBranches.length && CIS.totalInstanceBranches && !CIS.getFilteredBranches().length" + ) No branches match this filter. diff --git a/client/templates/instances/viewInstances.jade b/client/templates/instances/viewInstances.jade index 686c38e2a..6002f91c9 100644 --- a/client/templates/instances/viewInstances.jade +++ b/client/templates/instances/viewInstances.jade @@ -1,19 +1,20 @@ //- instance list -.list-instances-wrapper.grid-block.vertical.shrink.align-start( - ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" +.grid-block.shrink.list-instances( + ng-class = "{\ + 'deprecated': !$root.featureFlags.addBranches,\ + 'in': !CIS.$storage.instanceListIsClosed\ + }" ng-if = "CIS.instancesByPod" + ng-include = "'viewInstancesList'" + scroll-offset = "200" + scroll-to = "a.a-sref.active" ) - .list-instances( - ng-class = "{'deprecated': !$root.featureFlags.addBranches, 'in': !CIS.$storage.instanceListIsClosed }" - ng-include = "'viewInstancesList'" - scroll-offset = "200" - scroll-to = "a.a-sref.active" - ) -.list-instances-wrapper.grid-block.shrink.align-center.justify-center( +.grid-block.shrink.list-instances( ng-class = "{'in': !CIS.$storage.instanceListIsClosed}" ng-if = "!CIS.instancesByPod" ) + .spinner-wrapper.spinner-md.spinner-gray.spinner-center.in( ng-include = "'spinner'" ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 3b4529054..5a6e089d1 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -52,7 +52,7 @@ p.p.text-center.text-gray-light.padding-sm( button.grid-block.shrink.btn.btn-xs.btn-icon.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" - ng-click = "CIS.getReposFromInstance(masterInstance)" + ng-click = "CIS.getAllBranches(masterInstance)" pop-over pop-over-controller = "CIS" pop-over-instance = "masterInstance" From 9e6b72067e5836739384d212032e22dab0cf5a9f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Sat, 3 Sep 2016 12:44:40 -0700 Subject: [PATCH 158/577] fix "recommended" border --- client/assets/styles/scss/modals/modals-edit.scss | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/assets/styles/scss/modals/modals-edit.scss b/client/assets/styles/scss/modals/modals-edit.scss index a3464b567..5b1b053d0 100644 --- a/client/assets/styles/scss/modals/modals-edit.scss +++ b/client/assets/styles/scss/modals/modals-edit.scss @@ -389,21 +389,22 @@ } &.recommended { + border-radius: 0; &::after { background: $gray-lighter; - border-radius: $input-border-radius; + border-radius: $input-border-radius $input-border-radius 0 0; color: $gray; content: 'Recommended'; display: block; font-size: 11px; font-weight: $weight-normal; height: 21px; - left: -2px; + left: -$input-border; letter-spacing: -.25px; line-height: 20px; position: absolute; - right: -2px; + right: -$input-border; top: -21px; } From 96bc6551fb6c03d3f7c4eacd90c32dbdc51ed2f0 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 4 Sep 2016 16:11:55 -0700 Subject: [PATCH 159/577] Cleanup and exited early handling --- client/controllers/controllerApp.js | 4 +- .../components/ahaGuide/AhaGuideController.js | 49 ++++++------------- .../components/ahaGuide/ahaPopoverView.jade | 4 +- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 5 +- .../environment/environmentController.js | 9 +++- .../environment/environmentView.jade | 4 +- .../setupServerModalController.js | 4 +- .../chooseOrganizationModalController.js | 1 + .../newContainerModalController.js | 4 +- .../newContainerModalView.jade | 5 +- client/directives/navBar/viewNav.jade | 2 +- 11 files changed, 41 insertions(+), 50 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 95db2d065..6d643632b 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -129,9 +129,9 @@ function ControllerApp( } }); - $scope.showAhaNavPopover = false; + CA.showAhaNavPopover = false; $rootScope.$on('launchAhaNavPopover', function () { - $scope.showAhaNavPopover = true; + CA.showAhaNavPopover = true; }); /** diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index d80f02279..c48ec4c7d 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -12,12 +12,6 @@ function AhaGuideController( ) { var AGC = this; - if (!$rootScope.ahaGuide) { - $rootScope.ahaGuide = {}; - } - - AGC.exitingEarly = exitingEarly; - AGC.confirmAha1Complete = confirmAha1Complete; var alertListener = $scope.$on('alert', function(event, alert) { // alerts on container creation success @@ -31,10 +25,6 @@ function AhaGuideController( handleBuildUpdate(buildStatus); }); - var exitedEarlyListener = $scope.$on('exitedEarly', function() { - exitingEarly(); - }); - var tabListener = $scope.$on('updatedTab', function(event, tabName) { if (AGC.state.subStepIndex > 5) { tabListener(); @@ -75,22 +65,30 @@ function AhaGuideController( AGC.state.subStepIndex = currentMilestone.subSteps[status].step; AGC.state.caption = currentMilestone.subSteps[status].caption; AGC.state.className = currentMilestone.subSteps[status].className; + + // not animating + // var thingy = angular.element(document.getElementsByClassName('p-slide')) + // var parentThingy = angular.element(document.getElementsByClassName('grid-block aha-text')) + + // if (thingy && parentThingy) { + // thingy.remove(); + // parentThingy.append('

' + + // AGC.state.caption + '

'); + // } } function handleBuildUpdate(update) { console.log(update); var buildStatus = update.status; - AGC.state.containerHostname = update.containerHostname; if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { AGC.state.showError = true; } else if (buildStatus === 'starting') { AGC.state.showError = false; - addVerificationListeners(); } else if (buildStatus === 'running') { + AGC.state.isBuildSuccessful = true; updateCaption('success'); - $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = false; - $rootScope.ahaGuide.ahaGuideToggles.showPopover = true; - $rootScope.ahaGuide.ahaGuideToggles.showAha1 = false; + $rootScope.$broadcast('exitedEarly', false); } updateBuildStatus(buildStatus); } @@ -100,24 +98,6 @@ function AhaGuideController( AGC.state.caption = currentMilestone.buildStatus[buildStatus] || AGC.state.caption; } - function addVerificationListeners() { - if (!$rootScope.doneListener) { - $rootScope.doneListener = $rootScope.$on('close-popovers', function() { - $rootScope.doneListener(); - updateCaption('complete'); - $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = false; - $rootScope.ahaGuide.ahaGuideToggles.showPopover = true; - $rootScope.ahaGuide.ahaGuideToggles.showAha1 = false; - }); - } - } - - function exitingEarly() { - exitedEarlyListener(); - AGC.state.showError = true; - updateCaption('exitedEarly'); - } - function confirmAha1Complete() { console.log('confirmed that we\'ve finished the first aha 1'); } @@ -136,8 +116,7 @@ function AhaGuideController( $rootScope.doneListener(); } if (AGC.state.subStepIndex === 7 && !AGC.state.isBuildSuccessful) { - $rootScope.ahaGuide.ahaGuideToggles.exitedEarly = true; - $rootScope.$broadcast('exitedEarly'); + $rootScope.$broadcast('exitedEarly', true); } }); diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 6e9e0a055..9e7ebf49a 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -3,9 +3,9 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive step-index = 1 - sub-step = 'complete' + sub-step = "complete" ) .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( - ng-click = "$root.ahaGuide.ahaGuideToggles.showPopover = false" + ng-click = "CA.showAhaNavPopover = false" ) Got It diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 21e38c034..1b9f9d436 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -33,12 +33,15 @@ disabled: ASC.getCurrentStep() < ASC.steps.ADD_FIRST_REPO,\ active: ASC.getCurrentStep() === ASC.steps.ADD_FIRST_REPO\ }" + ng-click = "\ + ASC.toggleOverview();\ + " ) .grid-block.shrink.aha-meter( ng-class = "{\ 'aha-error': $root.ahaGuide.ahaGuideToggles.showError,\ 'aha-meter-70': $root.ahaGuide.ahaGuideToggles.exitedEarly,\ - 'aha-meter-100': !$root.ahaGuide.ahaGuideToggles.showAha1\ + 'aha-meter-100': ASC.getCurrentStep() > ASC.steps.ADD_FIRST_REPO\ }" ) svg.iconnables diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index c2e6ba52a..2d1f88b33 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -37,6 +37,13 @@ function EnvironmentController( EC.showCreateTemplate = true; }; + $scope.$on('exitedEarly', function(event, didExitEarly) { + EC.showExitedEarly = didExitEarly; + if (!didExitEarly) { + $rootScope.$broadcast('launchAhaNavPopover'); + } + }) + var unbindUpdateTeammateInvitation = $rootScope.$on('updateTeammateInvitations', function (event, invitesCreated) { if (invitesCreated) { updateShowInviteButton(); @@ -103,7 +110,7 @@ function EnvironmentController( // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { if (instance.attrs.build.successful && instance.getRepoName()) { - $rootScope.$emit('launchAhaNavPopover'); + $rootScope.$broadcast('launchAhaNavPopover'); } if (instance.hasDockerfileMirroring()) { return fetchDockerfileForContextVersion(instance.contextVersion) diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index dd67c9c65..c2dc49a1c 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -51,7 +51,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha1ExitedEarly && $root.ahaGuide.ahaGuideToggles.exitedEarly" + ng-if = "$root.featureFlags.aha && EC.showExitedEarly" aha-guide-directive step-index = 1 sub-step = 'exitedEarly' @@ -97,7 +97,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha && EC.showCreateTemplate" + ng-if = "$root.featureFlags.aha && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 7b6dbc5ff..2c604c384 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -266,10 +266,8 @@ function SetupServerModalController( SMC.state.instance = instance; SMC.state.instance.on('update', function() { var buildStatus = SMC.state.instance.status(); - var containerHostname = SMC.state.instance.getContainerHostname(); $rootScope.$broadcast('buildStatusUpdated', { - status: buildStatus, - containerHostname: containerHostname + status: buildStatus }); if (buildStatus === 'running') { SMC.page = 'run'; diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index 6a9e05098..d33bf228a 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -8,6 +8,7 @@ function ChooseOrganizationModalController( $scope, $state, createNewSandboxForUserService, + currentOrg, errs, featureFlags, fetchWhitelistForDockCreated, diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index 57cc90ac8..b0da58ace 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -6,6 +6,7 @@ require('app') function NewContainerModalController( $q, $timeout, + ahaGuide, createNewBuildAndFetchBranch, createNonRepoInstance, errs, @@ -31,7 +32,8 @@ function NewContainerModalController( dockerfile: null, configurationMethod: null, namesForAllInstances: [] - } + }, + ahaGuide: ahaGuide }); // Start loading repos and templates diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 76cedab47..ae2e8d8c1 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "$root.featureFlags.aha1 && $root.ahaGuide.ahaGuideToggles.showAha1" + ng-if = "$root.featureFlags.aha1 && MC.getCurrentStep() === MC.ahaGuide.STEPS.ADD_FIRST_REPO" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 @@ -14,7 +14,8 @@ name = "containerSelection" ) header.modal-header.grid-block.justify-center( - ng-class = "{'lg': !$root.ahaGuide.ahaGuideToggles.showAha1}" + ng-class = "{'lg': MC.ahaGuide.getCurrentStep() === MC.ahaGuide.STEPS.ADD_FIRST_REPO}" + ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.STEPS.ADD_FIRST_REPO" ng-click = "MC.changeTab('nameContainer')" ) .grid-block.shrink.btn( diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index bda0df9aa..c11769365 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -6,7 +6,7 @@ //- aha menu --- This should be triggered via an event! .popover.right.in.popover-aha( - ng-if = "showAhaNavPopover" + ng-if = "CA.showAhaNavPopover" ng-include = "'ahaPopoverView'" ) From c044c9768ed9a5af6ac2d00bb5c86bf499146e94 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sun, 4 Sep 2016 21:11:33 -0700 Subject: [PATCH 160/577] Add service functions to fetch runnabot status add Unit test for controller --- .../viewPopoverAccountMenu.jade | 2 +- .../components/ahaGuide/ahaSidebarView.jade | 2 +- .../gitHubIntegrationDirective.js | 20 +++ .../gitHubIntegrationView.jade | 35 ++--- .../githubIntegrationController.js | 45 +++++++ .../forms/gitHubForm/gitHubForm.jade | 2 +- .../settingsModal/settingsModalView.jade | 6 +- client/services/runnabotService.js | 39 ++++++ client/services/serviceFetch.js | 22 ++++ .../githubIntegrationController.unit.js | 121 ++++++++++++++++++ 10 files changed, 272 insertions(+), 22 deletions(-) create mode 100644 client/directives/components/gitHubIntegration/gitHubIntegrationDirective.js create mode 100644 client/directives/components/gitHubIntegration/githubIntegrationController.js create mode 100644 client/services/runnabotService.js create mode 100644 test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js diff --git a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade index e37e17a92..fb4241c1b 100644 --- a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade +++ b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade @@ -58,7 +58,7 @@ //- $root.featureFlags.billing //- ***************** li.list-item.popover-list-item( - ng-click = "actions.openSettingsModal('gitHubIntegration')" + ng-click = "actions.openSettingsModal('githubIntegration')" ng-if = "$root.featureFlags.gitHubIntegration" ) svg.iconnables diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade index b0dd48d6f..241b7d48f 100644 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebarView.jade @@ -114,5 +114,5 @@ xlink:href = "#icons-close" ) .grid-block.vertical.align-center.form-github( - ng-include = "'gitHubIntegrationView'" + github-integration ) diff --git a/client/directives/components/gitHubIntegration/gitHubIntegrationDirective.js b/client/directives/components/gitHubIntegration/gitHubIntegrationDirective.js new file mode 100644 index 000000000..0e9610c0f --- /dev/null +++ b/client/directives/components/gitHubIntegration/gitHubIntegrationDirective.js @@ -0,0 +1,20 @@ +'use strict'; + +require('app') + .directive('githubIntegration', githubIntegration); +/** + * @ngInject + */ +function githubIntegration( +) { + return { + restrict: 'A', + templateUrl: 'githubIntegrationView', + controller: 'GithubIntegrationController', + controllerAs: 'GIC', + bindToController: true, + scope: { + state: '=' + } + }; +} diff --git a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade index 92cd814aa..7045fdd3f 100644 --- a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade @@ -9,20 +9,24 @@ img.grid-content.shrink.img.img-comment( //- add 'disabled' attr if inviting runnabot, or if user isn't an admin hide after successfully inviting runnabot button.grid-content.shrink.btn.btn-md.green( - ng-click = "$root.featureFlags.ahaOverview = false" + ng-click = "GIC.addRunnabot()" + ng-disabled = "!GIC.isAdmin || $root.isLoading.addRunnabot" + ng-hide = "GIC.hasRunnabot" ) svg.iconnables.icons-octicons-github use( xlink:href = "#icons-octicons-github" ) | Invite Runnabot - //- if inviting Runnabot - //- .spinner-wrapper.spinner-sm.spinner-white.float-right( - //- ng-include = "'spinner'" - //- ) + .spinner-wrapper.spinner-sm.spinner-white.float-right( + ng-if = "$root.isLoading.addRunnabot" + ng-include = "'spinner'" + ) //- show after successfully inviting runnabot -//- .grid-block.align-center.shrink.runnabot-success +.grid-block.align-center.shrink.runnabot-success( + ng-show = "GIC.hasRunnabot" +) img.grid-content.shrink.img( height = "36" src = "/build/images/runnabot-head.png" @@ -32,21 +36,20 @@ button.grid-content.shrink.btn.btn-md.green( .arrow p.small.text-gray.text-left Thanks! See you soon on your pull requests. -.grid-content.shrink.small.text-center( - ng-class = "{\ - 'text-gray': !state.adminRequired,\ - 'text-red': state.adminRequired\ - }" - ng-init = "state.adminRequired = false" +.grid-content.shrink.small.text-center.text-red( + ng-show = "GIC.isAdmin" ) //- if the user is an admin: | This may affect your GitHub bill. - //- if the user is not an admin: - //- | Sorry, you’ll need help from an admin - //- br - //- | of your org to invite Runnabot. +.grid-content.shrink.small.text-center.text-gray( + ng-show = "!GIC.isAdmin" +) + | Sorry, you’ll need help from an admin + br + | of your org to invite Runnabot. +.grid-content.shrink.small.text-center //- always show this: br a.small.link More about Runnabot diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js new file mode 100644 index 000000000..a89b2256d --- /dev/null +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -0,0 +1,45 @@ +'use strict'; + +require('app') + .controller('GithubIntegrationController', GithubIntegrationController); +/** + * @ngInject + */ +function GithubIntegrationController( + addRunnabotToGithubOrg, + currentOrg, + errs, + fetchGithubUserIsAdminOfOrg, + isRunnabotPartOfOrg, + keypather, + loading +) { + var GIC = this; + var org = keypather.get(currentOrg, 'github.attrs.login'); + + fetchGithubUserIsAdminOfOrg(org) + .then(function (isAdmin) { + GIC.isAdmin = isAdmin; + }) + .catch(errs.handler); + + isRunnabotPartOfOrg(org) + .then(function (hasRunnabot) { + GIC.hasRunnabot = hasRunnabot; + if (!hasRunnabot) { + isRunnabotPartOfOrg.cache.clear(); + } + }) + .catch(errs.handler); + + GIC.addRunnabot = function () { + loading('addRunnabot', true); + return addRunnabotToGithubOrg(org) + .catch(errs.handler) + .finally(function () { + loading('addRunnabot'); + isRunnabotPartOfOrg.cache.clear(); + }); + }; +} + diff --git a/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade b/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade index a284fb9f9..fb5d798e3 100644 --- a/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade +++ b/client/directives/modals/settingsModal/forms/gitHubForm/gitHubForm.jade @@ -5,5 +5,5 @@ ) .modal-form.empty.grid-block.vertical.align-center.form-github( - ng-include = "'gitHubIntegrationView'" + github-integration ) diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index 339297633..f06d094c4 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -37,8 +37,8 @@ ) .btn-text.grid-content Teammates button.btn.btn-radio.grid-block.vertical( - ng-class = "{'active': SEMC.currentTab === 'gitHubIntegration'}" - ng-click = "SEMC.currentTab = 'gitHubIntegration'" + ng-class = "{'active': SEMC.currentTab === 'githubIntegration'}" + ng-click = "SEMC.currentTab = 'githubIntegration'" ng-if = "$root.featureFlags.gitHubIntegration" ) svg.iconnables.grid-content @@ -70,7 +70,7 @@ ) div( - ng-if = "SEMC.currentTab === 'gitHubIntegration'" + ng-if = "SEMC.currentTab === 'githubIntegration'" ng-include = "'gitHubForm'" ) diff --git a/client/services/runnabotService.js b/client/services/runnabotService.js new file mode 100644 index 000000000..949d298e3 --- /dev/null +++ b/client/services/runnabotService.js @@ -0,0 +1,39 @@ +'use strict'; + +require('app') + .factory('addRunnabotToGithubOrg', addRunnabotToGithubOrg) + .factory('isRunnabotPartOfOrg', isRunnabotPartOfOrg); + +function isRunnabotPartOfOrg( + $http, + configAPIHost, + memoize +) { + return memoize(function (orgName) { + return $http({ + method: 'get', + url: configAPIHost + '/github/orgs/' + orgName + '/members/runnabot' + }) + .then(function (data) { + return data.status !== 404; // Github returns 404 when the user isn't part of the org + }) + .catch(function () { + return false; + }); + }); +} + +function addRunnabotToGithubOrg( + $http, + configAPIHost +) { + return function (orgName) { + return $http({ + method: 'put', + url: configAPIHost + '/github/orgs/' + orgName + '/memberships/runnabot', + params: { + role: 'member' + } + }); + }; +} \ No newline at end of file diff --git a/client/services/serviceFetch.js b/client/services/serviceFetch.js index 335172e9c..578c5404f 100644 --- a/client/services/serviceFetch.js +++ b/client/services/serviceFetch.js @@ -26,6 +26,7 @@ require('app') .factory('fetchDebugContainer', fetchDebugContainer) .factory('fetchStackData', fetchStackData) // Github API + .factory('fetchGithubUserIsAdminOfOrg', fetchGithubUserIsAdminOfOrg) .factory('fetchGitHubUser', fetchGitHubUser) .factory('fetchGitHubMembers', fetchGitHubMembers) .factory('fetchGitHubAdminsByRepo', fetchGitHubAdminsByRepo) @@ -697,6 +698,27 @@ function fetchGitHubUser( }); } +function fetchGithubUserIsAdminOfOrg( + $http, + configAPIHost, + keypather, + memoize +) { + return memoize(function (orgName) { + return $http({ + method: 'get', + url: configAPIHost + '/github/user/memberships/orgs/' + orgName + }) + .catch(function () { + return false; + }) + .then(function (response) { + return keypather.get(response, 'data.state') === 'active' && + keypather.get(response, 'data.role') === 'admin'; + }); + }); +} + /** * Given an org name and a repo name, fetch all github users who have admin access to a repo. This * returns a promise containing a map of all of the users, indexed by their github login. diff --git a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js new file mode 100644 index 000000000..68b5b8cb0 --- /dev/null +++ b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js @@ -0,0 +1,121 @@ +'use strict'; + +var $scope; +var $controller; +var $rootScope; + +describe.only('Github Integration Controller'.bold.underline.blue, function() { + var GIC; + var addRunnabotToGithubOrgMock; + var isRunnabotPartOfOrgMock; + var isRunnabotPartOfOrgResult; + var fetchGithubUserIsAdminOfOrgMock; + var fetchGithubUserIsAdminOfOrgResult; + var errsMock; + var mockCurrentOrg = { + poppa: { + trialDaysRemaining: sinon.stub(), + isInTrial: sinon.stub(), + isInGrace: sinon.stub(), + isGraceExpired: sinon.stub(), + attrs: { + hasPaymentMethod: false + } + }, + github: { + attrs: { + login: 'org', + id: 'githubId1234' + } + } + }; + function injectSetupCompile () { + errsMock = { + handler: sinon.spy() + }; + angular.mock.module('app'); + angular.mock.module(function ($provide) { + $provide.value('currentOrg', mockCurrentOrg); + $provide.value('errs', errsMock); + $provide.factory('addRunnabotToGithubOrg', function ($q) { + addRunnabotToGithubOrgMock = sinon.stub().returns($q.when(true)); + return addRunnabotToGithubOrgMock; + }); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgMock = sinon.stub().returns($q.when(isRunnabotPartOfOrgResult)); + isRunnabotPartOfOrgMock.cache = { + clear: sinon.stub() + }; + return isRunnabotPartOfOrgMock; + }); + $provide.factory('fetchGithubUserIsAdminOfOrg', function ($q) { + fetchGithubUserIsAdminOfOrgMock = sinon.stub().returns($q.when(fetchGithubUserIsAdminOfOrgResult)); + fetchGithubUserIsAdminOfOrgMock.cache = { + clear: sinon.stub() + }; + return fetchGithubUserIsAdminOfOrgMock; + }); + }); + + angular.mock.inject(function ( + _$rootScope_, + _$controller_ + ) { + $scope = _$rootScope_.$new(); + $rootScope = _$rootScope_; + $controller = _$controller_; + }); + + + var laterController = $controller('GithubIntegrationController', { + $scope: $scope + }, true); + + GIC = laterController(); + } + + it('should fetch github user is admin and set isAdmin', function () { + fetchGithubUserIsAdminOfOrgResult = true; + injectSetupCompile(); + $scope.$digest(); + sinon.assert.calledOnce(fetchGithubUserIsAdminOfOrgMock); + sinon.assert.calledWith(fetchGithubUserIsAdminOfOrgMock, 'org'); + expect(GIC.isAdmin).to.be.true; + }); + + it('should fetch isRunnabotPartOfOrg and set hasRunnabot', function () { + isRunnabotPartOfOrgResult = true; + injectSetupCompile(); + $scope.$digest(); + sinon.assert.calledOnce(isRunnabotPartOfOrgMock); + sinon.assert.calledWith(isRunnabotPartOfOrgMock, 'org'); + expect(GIC.hasRunnabot).to.be.true; + }); + + describe('isRunnabotPartOfOrg cache clear', function () { + beforeEach(function () { + isRunnabotPartOfOrgResult = false; + }); + beforeEach(injectSetupCompile); + it('should clear if runnabot is not part of the org', function () { + $scope.$digest(); + sinon.assert.calledOnce(isRunnabotPartOfOrgMock.cache.clear); + }); + it('should clear after adding runnabot', function () { + $scope.$digest(); + isRunnabotPartOfOrgMock.cache.clear.reset(); + GIC.addRunnabot(); + $scope.$digest(); + sinon.assert.calledOnce(isRunnabotPartOfOrgMock.cache.clear); + }); + }); + + describe('addRunnabot', function () { + beforeEach(injectSetupCompile); + it('should attempt to add runnabot', function () { + GIC.addRunnabot(); + $scope.$digest(); + sinon.assert.calledOnce(addRunnabotToGithubOrgMock); + }); + }); +}); From 6b1cde80d534f5051741ce52431b9591e1a45dc5 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sun, 4 Sep 2016 21:38:37 -0700 Subject: [PATCH 161/577] remove only --- .../githubIntegration/githubIntegrationController.unit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js index 68b5b8cb0..85b24d7e5 100644 --- a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js +++ b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js @@ -4,7 +4,7 @@ var $scope; var $controller; var $rootScope; -describe.only('Github Integration Controller'.bold.underline.blue, function() { +describe('Github Integration Controller'.bold.underline.blue, function() { var GIC; var addRunnabotToGithubOrgMock; var isRunnabotPartOfOrgMock; From 3e8b376cdb0b6c84da7f7bad2ada4639df756af8 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 11:41:42 -0700 Subject: [PATCH 162/577] Updated to use CIS to store the instance and fixed package.json version. --- client/controllers/controllerInstances.js | 98 ++++++++----------- .../branchMenuPopoverView.jade | 7 +- .../instances/viewInstancesList.jade | 3 +- package.json | 2 +- 4 files changed, 42 insertions(+), 68 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 02ac41499..5e7728a2a 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -15,19 +15,18 @@ function ControllerInstances( loading, ModalService, fetchInstancesByPod, - fetchOwnerRepos, activeAccount, user, promisify, currentOrg ) { - var self = this; + var CIS = this; var userName = $state.params.userName; - self.searchBranches = null; - self.instanceBranches = null; - self.unbuiltBranches = null; - self.branchQuery = null; - self.$storage = $localStorage.$default({ + CIS.searchBranches = null; + CIS.instanceBranches = null; + CIS.unbuiltBranches = null; + CIS.branchQuery = null; + CIS.$storage = $localStorage.$default({ instanceListIsClosed: false }); fetchInstancesByPod() @@ -37,8 +36,8 @@ function ControllerInstances( if (userName !== $state.params.userName) { return; } - self.instancesByPod = instancesByPod; - self.activeAccount = activeAccount; + CIS.instancesByPod = instancesByPod; + CIS.activeAccount = activeAccount; var instances = instancesByPod; var lastViewedInstance = keypather.get(user, 'attrs.userOptions.uiState.previousLocation.instance'); @@ -92,65 +91,65 @@ function ControllerInstances( .catch(errs.handler); this.filterMasterInstance = function (masterPod) { - if (!self.searchBranches) { + if (!CIS.searchBranches) { return true; } - var searchQuery = self.searchBranches.toLowerCase(); + var searchQuery = CIS.searchBranches.toLowerCase(); var instanceName = masterPod.getRepoAndBranchName() + masterPod.attrs.lowerName; return instanceName.toLowerCase().indexOf(searchQuery) !== -1; }; this.getFilteredInstanceList = function () { - if (!self.instancesByPod) { + if (!CIS.instancesByPod) { return null; } - if (!self.searchBranches) { - return self.instancesByPod; + if (!CIS.searchBranches) { + return CIS.instancesByPod; } - var searchQuery = self.searchBranches.toLowerCase(); - return self.instancesByPod + var searchQuery = CIS.searchBranches.toLowerCase(); + return CIS.instancesByPod .filter(function (masterPod) { var instanceName = masterPod.getRepoAndBranchName() + masterPod.attrs.lowerName; return instanceName.toLowerCase().indexOf(searchQuery) !== -1 || - self.getFilteredChildren(masterPod).length > 0; + CIS.getFilteredChildren(masterPod).length > 0; }); }; this.getFilteredChildren = function (masterPod) { - if (!self.searchBranches) { + if (!CIS.searchBranches) { return masterPod.children.models; } - var searchQuery = self.searchBranches.toLowerCase(); + var searchQuery = CIS.searchBranches.toLowerCase(); return masterPod.children.models.filter(function (child) { return child.attrs.lowerName.indexOf(searchQuery) !== -1; }); }; this.getFilteredBranches = function() { - if (!self.branchQuery) { - return self.instanceBranches; + if (!CIS.branchQuery) { + return CIS.instanceBranches; } var branchName; - var searchQuery = self.branchQuery.toLowerCase(); - return self.instanceBranches.filter(function (branch) { + var searchQuery = CIS.branchQuery.toLowerCase(); + return CIS.instanceBranches.filter(function (branch) { branchName = branch.attrs.name.toLowerCase(); return branchName.indexOf(searchQuery) !== -1; }); }; this.shouldShowChild = function (childInstance) { - if (!self.searchBranches) { + if (!CIS.searchBranches) { return true; } - var searchQuery = self.searchBranches.toLowerCase(); + var searchQuery = CIS.searchBranches.toLowerCase(); return childInstance.attrs.lowerName.indexOf(searchQuery) !== -1; }; this.shouldShowParent = function (masterPod) { - if (!self.searchBranches) { + if (!CIS.searchBranches) { return true; } - var searchQuery = self.searchBranches.toLowerCase(); + var searchQuery = CIS.searchBranches.toLowerCase(); var instanceName = masterPod.getRepoAndBranchName() + masterPod.attrs.lowerName; if (instanceName.indexOf(searchQuery) !== -1) { @@ -169,6 +168,8 @@ function ControllerInstances( childHash[branchName] = branchName; return childHash; }, {}); + var instanceBranchName = instance.getBranchName(); + childInstances[instanceBranchName] = instanceBranchName; var unbuiltBranches = branches.models.filter(function(branch) { branchName = keypather.get(branch, 'attrs.name'); @@ -178,26 +179,30 @@ function ControllerInstances( return unbuiltBranches; }; + this.popInstanceOpen = function (instance) { + CIS.poppedInstance = instance; + CIS.getAllBranches(instance); + }; + this.getAllBranches = function(instance) { - self.instanceBranches = null; + CIS.instanceBranches = null; loading('fetchingBranches', true); return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) .then(function (repo) { return promisify(repo, 'fetchBranches')(); }) .then(function (branches) { - self.totalInstanceBranches = branches.models.length; - self.instanceBranches = self.unbuiltBranches(instance, branches); + CIS.totalInstanceBranches = branches.models.length; + CIS.instanceBranches = CIS.unbuiltBranches(instance, branches); }); }; - this.forkBranchFromInstance = function(branch, instance, closePopover) { + this.forkBranchFromInstance = function (branch, closePopover) { var sha = branch.attrs.commit.sha; var loadingName = 'buildingForkedBranch' + branch.attrs.name; - var index; loading(loadingName, true); - promisify(instance, 'fork')(branch.attrs.name, sha) - .then(function(result) { + promisify(CIS.poppedInstance, 'fork')(branch.attrs.name, sha) + .then(function() { loading(loadingName, false); closePopover(); }); @@ -216,29 +221,4 @@ function ControllerInstances( }) .catch(errs.handler); }; - - this.openInviteAdminModal = function (instance) { - ModalService.showModal({ - controller: 'InviteAdminModalController', - controllerAs: 'IAMC', - templateUrl: 'inviteAdminModalView', - inputs: { - instance: instance, - isFromAutoDeploy: false - } - }) - .catch(errs.handler); - }; - - this.openEnableBranchesModal = function (instance) { - ModalService.showModal({ - controller: 'EnableBranchesModalController', - controllerAs: 'EBMC', - templateUrl: 'enableBranchesModalView', - inputs: { - instance: instance - } - }) - .catch(errs.handler); - }; } diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 6d394c9de..7da69c045 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -113,14 +113,9 @@ ul.list.popover-list( ng-if = "CIS.instanceBranches.length" ) - //- show when loading paginated list - //- li.list-item.padding-md - .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( - ng-include = "'spinner'" - ) li.list-item.popover-list-item( ng-repeat = "branch in CIS.getFilteredBranches()" - ng-click = "CIS.forkBranchFromInstance(branch, instance, POC.closePopover);" + ng-click = "CIS.forkBranchFromInstance(branch, POC.closePopover);" ) {{ branch.attrs.name }} button.btn.btn-xs.btn-icon.btn-add( ng-if = "!$root.isLoading['buildingForkedBranch' + branch.attrs.name]" diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 5a6e089d1..21c98e4fd 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -52,10 +52,9 @@ p.p.text-center.text-gray-light.padding-sm( button.grid-block.shrink.btn.btn-xs.btn-icon.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" - ng-click = "CIS.getAllBranches(masterInstance)" + ng-click = "CIS.popInstanceOpen(masterInstance)" pop-over pop-over-controller = "CIS" - pop-over-instance = "masterInstance" pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" pop-over-template = "branchMenuPopoverView" tooltip = "Add Branch" diff --git a/package.json b/package.json index f91c7d299..b66ebb43c 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ ], "dependencies": { "101": "0.14.1", - "@runnable/api-client": "v9.1.1", + "@runnable/api-client": "v9.2.0", "angular": "1.3.15", "angular-animate": "1.3.15", "angular-clipboard": "1.4.x", From deeae8af296c71a4e4ed8adcc72874bd99afb7de Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 11:43:33 -0700 Subject: [PATCH 163/577] Delete -> Remove --- .../instanceNavigtion/instanceNavigationPopoverView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index bf276cd82..6836b5a2f 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -54,7 +54,7 @@ use( xlink:href = "#icons-delete" ) - | Delete Branch + | Remove Branch .popover-content( ng-if = "$root.featureFlags.addBranches && !$root.featureFlags.autoIsolation" From add8b9202dab3dafb25b5f69f6a0e6da82bfc683 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 5 Sep 2016 11:54:24 -0700 Subject: [PATCH 164/577] Removed traces of bindings to instance in popover directive --- client/directives/popovers/popOverDirective.js | 1 - client/templates/instances/viewInstancesList.jade | 1 - 2 files changed, 2 deletions(-) diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index bbc9b0e40..fda8b35ab 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -14,7 +14,6 @@ var scopeVars = { noBroadcast: '=? popOverNoBroadcast', actions: '=? popOverActions', active: '=? popOverActive', - instance: '=? popOverInstance', template: '= popOverTemplate', controller: '=? popOverController', controllerAs: '@? popOverControllerAs' diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 5a6e089d1..ca170e52c 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -55,7 +55,6 @@ p.p.text-center.text-gray-light.padding-sm( ng-click = "CIS.getAllBranches(masterInstance)" pop-over pop-over-controller = "CIS" - pop-over-instance = "masterInstance" pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" pop-over-template = "branchMenuPopoverView" tooltip = "Add Branch" From 7c215a058eec3a0d4ef5229bfa426ec954203c2a Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 12:28:55 -0700 Subject: [PATCH 165/577] Cleaned up more states, gave the ability to leave aha guide during setup and have it reflect properly in UI. --- client/config/routes.js | 4 ++++ .../components/ahaGuide/AhaGuideController.js | 15 +++++++++++++-- .../ahaGuide/ahaGuideMenuPopoverView.jade | 6 +++--- .../components/ahaGuide/ahaGuideView.jade | 1 + .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 3 --- .../environment/environmentController.js | 3 ++- .../directives/environment/environmentView.jade | 8 ++++---- .../modalNewContainer/newContainerModalView.jade | 11 ++++++----- client/services/ahaGuideService.js | 8 ++------ 9 files changed, 35 insertions(+), 24 deletions(-) diff --git a/client/config/routes.js b/client/config/routes.js index ef1d8aab6..2a4d262f3 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -184,6 +184,10 @@ module.exports = [ activeAccount, currentOrg ) { + // TODO: AHA - Remove this temporary change ot turn aha on + activeOrg.hasAha = true; + activeOrg.hasConfirmedSetup = false; + currentOrg.poppa = activeOrg; currentOrg.github = activeAccount; } diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index c48ec4c7d..165812451 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -7,8 +7,8 @@ require('app') function AhaGuideController( $scope, $rootScope, - $timeout, - ahaGuide + ahaGuide, + currentOrg ) { var AGC = this; @@ -124,4 +124,15 @@ function AhaGuideController( updateCaption(panel); }); + AGC.popoverActions = { + endGuide: function () { + $rootScope.$broadcast('close-popovers'); + // TODO: AHA - Make this save + currentOrg.poppa.hasAha = false; + }, + showSidebar: function () { + $rootScope.$broadcast('close-popovers'); + $rootScope.$broadcast('show-aha-sidebar'); + } + }; } diff --git a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade index c03146e2f..f4e910b38 100644 --- a/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaGuideMenuPopoverView.jade @@ -6,8 +6,8 @@ .popover-content ul.list.popover-list li.list-item.popover-list-item( - ng-click = "$scope.showSidebar = true" + ng-click = "actions.showSidebar()" ) View All li.list-item.popover-list-item( - ng-click = "AGC.confirmAha1Complete()" - ) End Guide \ No newline at end of file + ng-click = "actions.endGuide()" + ) End Guide diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 00890d3d8..f04b76206 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -30,6 +30,7 @@ button.btn.btn-xs.white.btn-menu( pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" pop-over-template = "ahaGuideMenuPopoverView" + pop-over-actions = "AGC.popoverActions" ) svg.iconnables use( diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 1b9f9d436..d38ec5f9e 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -33,9 +33,6 @@ disabled: ASC.getCurrentStep() < ASC.steps.ADD_FIRST_REPO,\ active: ASC.getCurrentStep() === ASC.steps.ADD_FIRST_REPO\ }" - ng-click = "\ - ASC.toggleOverview();\ - " ) .grid-block.shrink.aha-meter( ng-class = "{\ diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 2d1f88b33..af884d077 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -36,13 +36,14 @@ function EnvironmentController( EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; }; + $scope.$on('show-aha-sidebar', EC.toggleSidebar); $scope.$on('exitedEarly', function(event, didExitEarly) { EC.showExitedEarly = didExitEarly; if (!didExitEarly) { $rootScope.$broadcast('launchAhaNavPopover'); } - }) + }); var unbindUpdateTeammateInvitation = $rootScope.$on('updateTeammateInvitations', function (event, invitesCreated) { if (invitesCreated) { diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index c2dc49a1c..8ccced16e 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,12 +42,12 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': $root.featureFlags.aha && EC.ahaGuide.isInGuide() && EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO && data.instances.models.length === 0}" + ng-class = "{'empty': EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO && data.instances.models.length === 0}" ) header.grid-block.align-center.environment-header( ng-include = "'viewEnvironmentHeader'" ng-init = "state.helpButton = {active: false}" - ng-if = "$root.featureFlags.aha && EC.showCreateTemplate" + ng-if = "!EC.ahaGuide.isInGuide() || (EC.showCreateTemplate && EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO)" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( @@ -67,7 +67,7 @@ 'fixed': helpUndock,\ 'top': helpUndock\ }" - ng-if = "helpCards.getActiveCard() && !$root.featureFlags.aha" + ng-if = "helpCards.getActiveCard() && !EC.ahaGuide.isInGuide()" ) .help( ng-if = "helpCards.getActiveCard().targets.newContainer && state.newServerButton.active" @@ -97,7 +97,7 @@ ) .modal-dialog.modal-sm( - ng-if = "$root.featureFlags.aha && EC.showCreateTemplate && !data.instances.models.length" + ng-if = "EC.ahaGuide.isInGuide() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide-directive diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index ae2e8d8c1..bd7d5db94 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "$root.featureFlags.aha1 && MC.getCurrentStep() === MC.ahaGuide.STEPS.ADD_FIRST_REPO" + ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 @@ -14,8 +14,8 @@ name = "containerSelection" ) header.modal-header.grid-block.justify-center( - ng-class = "{'lg': MC.ahaGuide.getCurrentStep() === MC.ahaGuide.STEPS.ADD_FIRST_REPO}" - ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.STEPS.ADD_FIRST_REPO" + ng-class = "{'lg': MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO}" + ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO" ng-click = "MC.changeTab('nameContainer')" ) .grid-block.shrink.btn( @@ -28,6 +28,7 @@ xlink:href = "#icons-new-repository-server" ) .btn-text.grid-block Repository Template + //- disable this button when loading a repository .grid-block.shrink.btn( ng-disabled = "$root.isLoading[MC.name + 'SingleRepo']" @@ -74,7 +75,7 @@ xlink:href = "#icons-arrow-down" ) h1.modal-heading( - ng-if = "!$root.featureFlags.aha1" + ng-if = "!MC.ahaGuide.isInGuide()" ) Setup Method svg.iconnables.icons-close( ng-click = "MC.close()" @@ -117,7 +118,7 @@ xlink:href = "#icons-arrow-down" ) h1.modal-heading.text-overflow( - ng-if = "!$root.featureFlags.aha1" + ng-if = "!MC.ahaGuide.isInGuide()" ) Container Name svg.iconnables.icons-close( ng-click = "MC.close()" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 16766b152..fb2be9bb6 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -172,10 +172,7 @@ function ahaGuide( }); function getCurrentStep() { if (!cachedStep) { - // Temporarily turning aha on - currentOrg.poppa.hasAha = true; - currentOrg.poppa.hasConfirmedSetup = false; - if (!currentOrg.poppa.hasAha) { + if (!$rootScope.featureFlags.aha || !currentOrg.poppa.hasAha) { cachedStep = STEPS.COMPLETED; } else if (!currentOrg.poppa.hasConfirmedSetup) { cachedStep = STEPS.ADD_FIRST_REPO; @@ -195,8 +192,7 @@ function ahaGuide( } function isInGuide() { - currentOrg.poppa.hasAha = true; - return currentOrg.poppa.hasAha && getCurrentStep() !== STEPS.COMPLETED; + return $rootScope.featureFlags.aha && currentOrg.poppa.hasAha && getCurrentStep() !== STEPS.COMPLETED; } return { From ec2280dcbbbc20613e729a68f5386a3254f4b22f Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 12:42:28 -0700 Subject: [PATCH 166/577] Updated to use includes instead of indexOf --- client/controllers/controllerInstances.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 5e7728a2a..1dc35c576 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -133,7 +133,7 @@ function ControllerInstances( var searchQuery = CIS.branchQuery.toLowerCase(); return CIS.instanceBranches.filter(function (branch) { branchName = branch.attrs.name.toLowerCase(); - return branchName.indexOf(searchQuery) !== -1; + return branchName.includes(searchQuery); }); }; From c19e96262931b59a7b4f8ea50a5f9ebd645152ae Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 12:52:47 -0700 Subject: [PATCH 167/577] Updated ahaSidebar to have it's sidebar status passed in. --- .../ahaGuide/ahaSidebar/ahaSidebarController.js | 10 ---------- .../ahaGuide/ahaSidebar/ahaSidebarDirective.js | 3 ++- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 8 +++----- client/directives/environment/environmentController.js | 2 +- client/directives/environment/environmentView.jade | 1 + 5 files changed, 7 insertions(+), 17 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js index 33a989ce4..c9a58ea99 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js @@ -5,20 +5,10 @@ require('app') .controller('AhaSidebarController', AhaSidebarController); function AhaSidebarController( - $rootScope, ahaGuide ) { var ASC = this; ASC.steps = ahaGuide.steps; ASC.getCurrentStep = ahaGuide.getCurrentStep; - - ASC.toggleOverview = function () { - $rootScope.ahaGuide.ahaGuideToggles.showOverview = !$rootScope.ahaGuide.ahaGuideToggles.showOverview; - ASC.toggleSidebar(); - }; - - // ASC.toggleSidebar = function () { - // $rootScope.ahaGuide.ahaGuideToggles.showSidebar = !$rootScope.ahaGuide.ahaGuideToggles.showSidebar; - // }; } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index 583557ab5..b6a918bba 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -11,7 +11,8 @@ function ahaSidebar() { controllerAs: 'ASC', bindToController: true, scope: { - toggleSidebar: '=' + toggleSidebar: '=', + showOverview: '=' } }; } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index d38ec5f9e..328a5604b 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -1,20 +1,18 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( ng-click = "ASC.toggleSidebar()" - ng-if = "!$root.ahaGuide.ahaGuideToggles.showOverview || $root.ahaGuide.ahaGuideToggles.showAha1" + ng-if = "!ASC.showOverview" ) use( xlink:href = "#icons-close" ) .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "$root.ahaGuide.ahaGuideToggles.showOverview" + ng-if = "ASC.showOverview" ) .grid-content.strong Let‘s get running! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.btn.btn-sm.green( - ng-click = "\ - ASC.toggleOverview();\ - " + ng-click = "ASC.toggleSidebar()" ) Get Started .grid-block.vertical .grid-block.shrink.align-center.padding-sm.aha-guide.disabled diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index af884d077..c4d8fbafe 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -31,7 +31,7 @@ function EnvironmentController( EC.showInviteButton = false; EC.ahaGuide = ahaGuide; EC.showCreateTemplate = true; - EC.showSidebar = false; + EC.showOverview = true; EC.toggleSidebar = function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 8ccced16e..94338754d 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -128,5 +128,6 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar toggle-sidebar = "EC.toggleSidebar" + show-overview = "!EC.showCreateTemplate" ng-if = "$root.featureFlags.aha && EC.showSidebar" ) From 896819875a87cdcc43f4f94a9b80d72b55221c96 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 12:54:58 -0700 Subject: [PATCH 168/577] Removed controller, because it's not needed right now. --- .../ahaSidebar/ahaSidebarController.js | 14 -------- .../ahaSidebar/ahaSidebarDirective.js | 11 +++--- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 36 +++++++++---------- 3 files changed, 25 insertions(+), 36 deletions(-) delete mode 100644 client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js deleted file mode 100644 index c9a58ea99..000000000 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarController.js +++ /dev/null @@ -1,14 +0,0 @@ - -'use strict'; - -require('app') - .controller('AhaSidebarController', AhaSidebarController); - -function AhaSidebarController( - ahaGuide -) { - var ASC = this; - - ASC.steps = ahaGuide.steps; - ASC.getCurrentStep = ahaGuide.getCurrentStep; -} diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index b6a918bba..3e5022e88 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -3,16 +3,19 @@ require('app') .directive('ahaSidebar', ahaSidebar); -function ahaSidebar() { +function ahaSidebar( + ahaGuide +) { return { restrict: 'A', templateUrl: 'ahaSidebarView', - controller: 'AhaSidebarController', - controllerAs: 'ASC', - bindToController: true, scope: { toggleSidebar: '=', showOverview: '=' + }, + link: function ($scope) { + $scope.steps = ahaGuide.steps; + $scope.getCurrentStep = ahaGuide.getCurrentStep; } }; } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 328a5604b..e0d5c1094 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -1,18 +1,18 @@ .grid-block.shrink.align-center.justify-right svg.iconnables.icons-close( - ng-click = "ASC.toggleSidebar()" - ng-if = "!ASC.showOverview" + ng-click = "toggleSidebar()" + ng-if = "!showOverview" ) use( xlink:href = "#icons-close" ) .grid-block.vertical.shrink.justify-center.text-center.aha-overview( - ng-if = "ASC.showOverview" + ng-if = "showOverview" ) .grid-content.strong Let‘s get running! 👋 | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.btn.btn-sm.green( - ng-click = "ASC.toggleSidebar()" + ng-click = "toggleSidebar()" ) Get Started .grid-block.vertical .grid-block.shrink.align-center.padding-sm.aha-guide.disabled @@ -28,24 +28,24 @@ .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{\ - disabled: ASC.getCurrentStep() < ASC.steps.ADD_FIRST_REPO,\ - active: ASC.getCurrentStep() === ASC.steps.ADD_FIRST_REPO\ + disabled: getCurrentStep() < steps.ADD_FIRST_REPO,\ + active: getCurrentStep() === steps.ADD_FIRST_REPO\ }" ) .grid-block.shrink.aha-meter( ng-class = "{\ 'aha-error': $root.ahaGuide.ahaGuideToggles.showError,\ 'aha-meter-70': $root.ahaGuide.ahaGuideToggles.exitedEarly,\ - 'aha-meter-100': ASC.getCurrentStep() > ASC.steps.ADD_FIRST_REPO\ + 'aha-meter-100': getCurrentStep() > steps.ADD_FIRST_REPO\ }" ) svg.iconnables use( - ng-if = "ASC.getCurrentStep() <= ASC.steps.ADD_FIRST_REPO" + ng-if = "getCurrentStep() <= steps.ADD_FIRST_REPO" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "ASC.getCurrentStep() > ASC.steps.ADD_FIRST_REPO" + ng-if = "getCurrentStep() > steps.ADD_FIRST_REPO" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text @@ -53,21 +53,21 @@ p.small Set up your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': ASC.getCurrentStep() < ASC.steps.ADD_FIRST_BRANCH}" + ng-class = "{'disabled': getCurrentStep() < steps.ADD_FIRST_BRANCH}" ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-0': ASC.getCurrentStep() <= ASC.steps.ADD_FIRST_BRANCH,\ - 'aha-meter-100': $ASC.getCurrentStep() > ASC.steps.ADD_FIRST_BRANCH\ + 'aha-meter-0': getCurrentStep() <= steps.ADD_FIRST_BRANCH,\ + 'aha-meter-100': $getCurrentStep() > steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables use( - ng-if = "ASC.getCurrentStep() <= ASC.steps.ADD_FIRST_BRANCH" + ng-if = "getCurrentStep() <= steps.ADD_FIRST_BRANCH" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "ASC.getCurrentStep() > ASC.steps.ADD_FIRST_BRANCH" + ng-if = "getCurrentStep() > steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text @@ -75,18 +75,18 @@ p.small Your branches will update on every commit you make. .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': ASC.getCurrentStep() < ASC.steps.SETUP_RUNNABOT}" + ng-class = "{'disabled': getCurrentStep() < steps.SETUP_RUNNABOT}" ) .grid-block.shrink.aha-meter( - ng-class = "{'aha-meter-50': ASC.getCurrentStep() === ASC.steps.SETUP_RUNNABOT}" + ng-class = "{'aha-meter-50': getCurrentStep() === steps.SETUP_RUNNABOT}" ) svg.iconnables use( - ng-if = "ASC.getCurrentStep() <= ASC.steps.SETUP_RUNNABOT" + ng-if = "getCurrentStep() <= steps.SETUP_RUNNABOT" xlink:href = "#icons-runnabot" ) use( - ng-if = "ASC.getCurrentStep() > ASC.steps.SETUP_RUNNABOT" + ng-if = "getCurrentStep() > steps.SETUP_RUNNABOT" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text From 7378c3db4d355957da22485b743f7c466e8b64c7 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 14:03:16 -0700 Subject: [PATCH 169/577] Removed showAha0, fixed bug with aha guide where it'd fail if instantiated without an active org. --- client/controllers/controllerApp.js | 2 -- .../components/createSandboxGuideView.jade | 4 +-- .../chooseOrganizationModalController.js | 7 ------ .../chooseOrganizationModalView.jade | 2 +- client/services/ahaGuideService.js | 25 +++++++++++++------ client/services/featureFlagService.js | 1 - 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 6d643632b..649546403 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -93,7 +93,6 @@ function ControllerApp( if (!completedMilestones) { completedMilestones = { - aha0: false, aha1: false, aha2: false, aha3: false @@ -104,7 +103,6 @@ function ControllerApp( if (!ahaGuideToggles) { ahaGuideToggles = { showAha: true, - showAha0: true, showAha1: false, showAha2: true, showAha3: true, diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index 64c3ffc44..3e19c7a88 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -5,11 +5,11 @@ ) svg.iconnables use( - ng-if = "$root.featureFlags.aha0 && AGC.state.subStep !== 'dockLoaded'" + ng-if = "$root.featureFlags.aha && AGC.state.subStep !== 'dockLoaded'" xlink:href = "#icons-cog" ) use( - ng-if = "$root.featureFlags.aha0 && AGC.state.subStep === 'dockLoaded'" + ng-if = "$root.featureFlags.aha && AGC.state.subStep === 'dockLoaded'" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index d33bf228a..b0b8ff3f7 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -25,13 +25,6 @@ function ChooseOrganizationModalController( COMC.allAccounts = grantedOrgs.models; COMC.whitelistedOrgs = whitelistedOrgs; - // fixme once active org/currentOrg is resolved - $rootScope.ahaGuide = { - ahaGuideToggles: { - showAha0: true - } - }; - // otherwise the user can clear away the model // this will be re-added when they transition to something else keypather.set($rootScope, 'dataApp.documentKeydownEventHandler', null); diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 4de6de1f7..d53f6a15f 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -14,7 +14,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( aha-guide-directive - ng-if = "$root.featureFlags.aha && $root.featureFlags.aha0 && $root.ahaGuide.ahaGuideToggles.showAha0" + ng-if = "$root.featureFlags.aha" step-index = 0 sub-step = "orgSelection" sub-step-index = 0 diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index fb2be9bb6..f6dc6df7c 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -12,15 +12,21 @@ var STEPS = { }; function ahaGuide( - fetchInstancesByPod, + $rootScope, currentOrg, - $rootScope + fetchInstancesByPod, + keypather ) { var instances = []; - fetchInstancesByPod() - .then(function (instanceByPod) { - instances = instanceByPod; - }); + function refreshInstances() { + if (keypather.get(currentOrg, 'poppa.id')) { + return fetchInstancesByPod() + .then(function (fetchedInstances) { + instances = fetchedInstances; + }); + } + } + refreshInstances(); var stepList = [ { @@ -170,9 +176,14 @@ function ahaGuide( $rootScope.$watch(function () { cachedStep = null; }); + $rootScope.$on('$stateChangeSuccess', function () { + refreshInstances(); + }); function getCurrentStep() { if (!cachedStep) { - if (!$rootScope.featureFlags.aha || !currentOrg.poppa.hasAha) { + if ($rootScope.featureFlags.aha && !keypather.get(currentOrg, 'poppa.id')) { + cachedStep = STEPS.CHOOSE_ORGANIZATION; + } else if (!$rootScope.featureFlags.aha || !currentOrg.poppa.hasAha) { cachedStep = STEPS.COMPLETED; } else if (!currentOrg.poppa.hasConfirmedSetup) { cachedStep = STEPS.ADD_FIRST_REPO; diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 28191af2c..db20579a0 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -9,7 +9,6 @@ function featureFlags( var defaultFeatureFlags = { addBranches: false, aha: false, - aha0: false, // step 1: create sandbox aha1: false, // step 2: working repo config aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config aha3: false, // step 4: runnabot From 011ffd631fe13b32e354f731b92fffa4e829ecfd Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 14:06:24 -0700 Subject: [PATCH 170/577] Hardened fetchInstancesByPod so it'll return nothing is there is no active username. --- .../chooseOrganizationModalController.js | 1 - client/services/ahaGuideService.js | 10 ++++------ client/services/serviceFetch.js | 4 ++++ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index b0b8ff3f7..235beb7c2 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -8,7 +8,6 @@ function ChooseOrganizationModalController( $scope, $state, createNewSandboxForUserService, - currentOrg, errs, featureFlags, fetchWhitelistForDockCreated, diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index f6dc6df7c..9a12b976f 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -19,12 +19,10 @@ function ahaGuide( ) { var instances = []; function refreshInstances() { - if (keypather.get(currentOrg, 'poppa.id')) { - return fetchInstancesByPod() - .then(function (fetchedInstances) { - instances = fetchedInstances; - }); - } + return fetchInstancesByPod() + .then(function (fetchedInstances) { + instances = fetchedInstances; + }); } refreshInstances(); diff --git a/client/services/serviceFetch.js b/client/services/serviceFetch.js index 335172e9c..5bb30e917 100644 --- a/client/services/serviceFetch.js +++ b/client/services/serviceFetch.js @@ -193,6 +193,7 @@ function fetchInstance( var fetchByPodCache = {}; function fetchInstancesByPod( + $q, $state, fetchInstances, fetchUser, @@ -200,6 +201,9 @@ function fetchInstancesByPod( ) { return function (username) { username = username || $state.params.userName; + if (!username) { + return $q.when([]); + } if (!fetchByPodCache[username]) { var userPromise = fetchUser(); fetchByPodCache[username] = fetchInstances({ From d232ee5265fefc045dea680e6faea76438a3e50f Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 14:06:49 -0700 Subject: [PATCH 171/577] Removed trailing commas --- client/services/ahaGuideService.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 9a12b976f..56d53d7e3 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -41,7 +41,7 @@ function ahaGuide( dockLoaded: { caption: 'Continue to start configuring your project.', className: 'aha-meter-100' - }, + } }, panelSteps: { orgSelection: 0, @@ -163,7 +163,7 @@ function ahaGuide( dockLoaded: { caption: 'Continue to start configuring your project.', className: 'aha-meter-100' - }, + } }, panelSteps: { } From e28702e911a90819913377f11047f3d7cc73bc83 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 14:55:56 -0700 Subject: [PATCH 172/577] Removed flag for aha1 --- client/controllers/controllerApp.js | 2 -- .../components/ahaGuide/AhaGuideController.js | 4 ---- .../environmentBody/viewCardGrid.jade | 2 +- .../viewEnvironmentHeader.jade | 2 +- .../setupMirrorServerModalController.js | 17 ++++++++--------- .../setupMirrorServerModalView.jade | 4 ++-- .../setupServerModalController.js | 2 ++ .../modalSetupServer/setupServerModalView.jade | 4 ++-- .../newContainerModalView.jade | 5 ++--- client/services/featureFlagService.js | 1 - 10 files changed, 18 insertions(+), 25 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 649546403..78d035546 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -93,7 +93,6 @@ function ControllerApp( if (!completedMilestones) { completedMilestones = { - aha1: false, aha2: false, aha3: false }; @@ -103,7 +102,6 @@ function ControllerApp( if (!ahaGuideToggles) { ahaGuideToggles = { showAha: true, - showAha1: false, showAha2: true, showAha3: true, exitedEarly: false, diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 165812451..29212a666 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -98,10 +98,6 @@ function AhaGuideController( AGC.state.caption = currentMilestone.buildStatus[buildStatus] || AGC.state.caption; } - function confirmAha1Complete() { - console.log('confirmed that we\'ve finished the first aha 1'); - } - // we need to unregister this animated panel listener if it exists // to avoid duplication if ($rootScope.animatedPanelListener) { diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index 5a082a648..bda7feeb1 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -10,7 +10,7 @@ //- empty state .card.gray.disabled.load.empty( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1 && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" + ng-if = "!EC.ahaGuide.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" ) svg.iconnables( ng-click = "EC.triggerModal.newContainer()" diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 0bf97d7ca..054587e49 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -52,7 +52,7 @@ button.grid-block.shrink.btn.btn-md.btn-icon.btn-help( button.grid-block.shrink.btn.btn-md.green( ng-class = "{\ 'scale': helpCards.getActiveCard().targets.newContainer,\ - 'scale-in-modal': $root.featureFlags.aha1\ + 'scale-in-modal': EC.ahaGuide.getCurrentStep() === EC.ahaGuide.ADD_FIRST_BRANCH\ }" ng-click = "EC.triggerModal.newContainer()" ) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 0680b3616..4b729934c 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -4,34 +4,33 @@ require('app') .controller('SetupMirrorServerModalController', SetupMirrorServerModalController); function SetupMirrorServerModalController( - $scope, $controller, $q, $rootScope, + $scope, + ahaGuide, cardInfoTypes, createAndBuildNewContainer, - createBuildFromContextVersionId, errs, eventTracking, - fetchUser, helpCards, isTabNameValid, keypather, loading, loadingPromises, - ModalService, promisify, - OpenItems, - TAB_VISIBILITY, - updateDockerfileFromState, + + build, close, instanceName, + masterBranch, + OpenItems, repo, - build, - masterBranch + TAB_VISIBILITY ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.helpCards = helpCards; + SMC.ahaGuide = ahaGuide; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade index 552cf13d7..ffd877f5a 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade @@ -4,9 +4,9 @@ step-index = 1 sub-step-index = 6 sub-step = "filesMirror" - ng-if = "$root.featureFlags.aha1" + ng-if = "SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" ) - + form.modal-dialog.modal-edit( name = "SMC.serverForm" ng-include = "'serverModalView'" diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 2c604c384..412554386 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -9,6 +9,7 @@ function SetupServerModalController( $filter, $q, $rootScope, + ahaGuide, cardInfoTypes, createAndBuildNewContainer, createBuildFromContextVersionId, @@ -33,6 +34,7 @@ function SetupServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.helpCards = helpCards; + SMC.ahaGuide = ahaGuide; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade index ec8a0312a..2f2e5ce0c 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade @@ -1,14 +1,14 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-if = "SMC.state.advanced !== 'blankDockerfile'" + ng-if = "SMC.state.advanced !== 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.SETUP_FIRST_REPO" step-index = 1 sub-step = "repository" sub-step-index = 4 ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-if = "$root.featureFlags.aha && $root.featureFlags.aha1 && SMC.state.advanced === 'blankDockerfile'" + ng-if = "SMC.state.advanced === 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.SETUP_FIRST_REPO" step-index = 1 sub-step = "buildfiles" sub-step-index = 6 diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index bd7d5db94..824a65fc6 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -15,13 +15,12 @@ ) header.modal-header.grid-block.justify-center( ng-class = "{'lg': MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO}" - ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO" ng-click = "MC.changeTab('nameContainer')" ) .grid-block.shrink.btn( ng-class = "{'active': MC.state.tabName === 'repos'}" ng-click = "MC.changeTab('repos')" - ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1" + ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO" ) svg.iconnables.icons-repository.grid-block.shrink use( @@ -38,7 +37,7 @@ 'disabled': $root.isLoading[MC.name + 'SingleRepo'] \ }" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && MC.changeTab('services')" - ng-if = "!$root.ahaGuide.ahaGuideToggles.showAha1" + ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO" ) svg.iconnables.icons-template.grid-block.shrink use( diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index db20579a0..193eec024 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -9,7 +9,6 @@ function featureFlags( var defaultFeatureFlags = { addBranches: false, aha: false, - aha1: false, // step 2: working repo config aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config aha3: false, // step 4: runnabot allowIsolatedUpdate: false, From 17d59011d0df395f8a5c8df4c7cfb968eb9d350e Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 14:58:39 -0700 Subject: [PATCH 173/577] Removed aha3 feature flag. --- client/controllers/controllerApp.js | 4 +--- .../ahaGuide/components/setUpRunnabotGuideView.jade | 4 +--- client/services/featureFlagService.js | 2 -- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 78d035546..865942116 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -93,8 +93,7 @@ function ControllerApp( if (!completedMilestones) { completedMilestones = { - aha2: false, - aha3: false + aha2: false }; keypather.set($localStorage, 'ahaGuide.completedMilestones', completedMilestones); } @@ -103,7 +102,6 @@ function ControllerApp( ahaGuideToggles = { showAha: true, showAha2: true, - showAha3: true, exitedEarly: false, showError: false, showOverview: true, diff --git a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade index 688aa4067..177c7e3a6 100644 --- a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade @@ -1,6 +1,4 @@ -.grid-block.shrink.aha-meter( - ng-class = "{'aha-meter-50': $root.featureFlags.aha3}" -) +.grid-block.shrink.aha-meter.aha-meter-50 svg.iconnables use( xlink:href = "#icons-runnabot" diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 193eec024..8aa703f68 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -9,8 +9,6 @@ function featureFlags( var defaultFeatureFlags = { addBranches: false, aha: false, - aha1ExitedEarly: false, // step 2: if the user left the flow before getting a running config - aha3: false, // step 4: runnabot allowIsolatedUpdate: false, autoIsolation: false, autoIsolationSetup: false, From a72dd05f302b9bbad8f237fbd31a50b52a2d3ef6 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 14:59:02 -0700 Subject: [PATCH 174/577] Removed aha2 flags. --- client/controllers/controllerApp.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 865942116..21dbdc863 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -92,16 +92,13 @@ function ControllerApp( var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); if (!completedMilestones) { - completedMilestones = { - aha2: false - }; + completedMilestones = {}; keypather.set($localStorage, 'ahaGuide.completedMilestones', completedMilestones); } if (!ahaGuideToggles) { ahaGuideToggles = { showAha: true, - showAha2: true, exitedEarly: false, showError: false, showOverview: true, From 81bc0d3a91421e483b7183aac3dcd9d46fcb6f02 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 15:05:12 -0700 Subject: [PATCH 175/577] Removed showSidebar ahaGuide toggle. --- client/controllers/controllerApp.js | 1 - client/controllers/controllerInstance.js | 7 +++++++ client/templates/viewInstance.jade | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 21dbdc863..727a42a33 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -101,7 +101,6 @@ function ControllerApp( showAha: true, exitedEarly: false, showError: false, - showOverview: true, showPopover: false, showSidebar: false }; diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index a3ae04e7e..288a981c9 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -27,6 +27,13 @@ function ControllerInstance( setLastInstance, loading ) { + var CIS = this; + CIS.showSidebar = false; + CIS.toggleSidebar = function () { + CIS.showSidebar = !CIS.showSidebar; + }; + $scope.$on('show-aha-sidebar', CIS.toggleSidebar); + var dataInstance = $scope.dataInstance = { data: { unsavedAcvs: [] diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index ffd28ad1a..add07e850 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -60,5 +60,7 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar - ng-if = "$root.featureFlags.aha && $root.ahaGuide.ahaGuideToggles.showSidebar" + toggle-sidebar = "CIS.toggleSidebar" + show-overview = "false" + ng-if = "$root.featureFlags.aha && CIS.showSidebar" ) From 22a06675ac73a640199a00f186aa18e0e0888d36 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 15:39:09 -0700 Subject: [PATCH 176/577] Updated logic so we can toggle first branch properly. --- client/config/routes.js | 3 ++- client/controllers/controllerApp.js | 4 +--- client/controllers/controllerInstance.js | 17 +++++++++++++---- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 6 +++--- .../environment/environmentController.js | 3 ++- .../directives/environment/environmentView.jade | 2 +- .../modalSetupServer/setupServerModalView.jade | 4 ++-- .../instance/instanceHeaderDirective.js | 4 ++++ .../instances/instance/instanceHeaderView.jade | 2 +- client/services/ahaGuideService.js | 4 ++-- client/templates/viewInstance.jade | 4 ++-- 11 files changed, 33 insertions(+), 20 deletions(-) diff --git a/client/config/routes.js b/client/config/routes.js index 2a4d262f3..1c657e723 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -217,7 +217,8 @@ module.exports = [ abstract: false, url: '^/:userName/:instanceName', templateUrl: 'viewInstance', - controller: 'ControllerInstance' + controller: 'ControllerInstance', + controllerAs: 'CI' } ]; Object.freeze(module.exports); diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 727a42a33..181070337 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -100,9 +100,7 @@ function ControllerApp( ahaGuideToggles = { showAha: true, exitedEarly: false, - showError: false, - showPopover: false, - showSidebar: false + showError: false }; keypather.set($localStorage, 'ahaGuide.ahaGuideToggles', ahaGuideToggles); } diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index 288a981c9..e0cb1fdd6 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -12,7 +12,8 @@ function ControllerInstance( $state, $stateParams, $timeout, - OpenItems, + ahaGuide, + currentOrg, errs, eventTracking, favico, @@ -20,13 +21,17 @@ function ControllerInstance( fetchDockerfileForContextVersion, fetchInstances, fetchSettings, + fetchUser, getCommitForCurrentlyBuildingBuild, keypather, - fetchUser, + loading, + OpenItems, pageName, - setLastInstance, - loading + setLastInstance ) { + // TODO: Aha - Remove this hardcoding + currentOrg.poppa.hasConfirmedSetup = true; + var CIS = this; CIS.showSidebar = false; CIS.toggleSidebar = function () { @@ -34,6 +39,10 @@ function ControllerInstance( }; $scope.$on('show-aha-sidebar', CIS.toggleSidebar); + if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH) { + console.log('Toggle first branch thingy'); + } + var dataInstance = $scope.dataInstance = { data: { unsavedAcvs: [] diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index e0d5c1094..3761bf023 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -28,7 +28,7 @@ .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{\ - disabled: getCurrentStep() < steps.ADD_FIRST_REPO,\ + disabled: getCurrentStep() !== steps.ADD_FIRST_REPO,\ active: getCurrentStep() === steps.ADD_FIRST_REPO\ }" ) @@ -53,7 +53,7 @@ p.small Set up your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': getCurrentStep() < steps.ADD_FIRST_BRANCH}" + ng-class = "{'disabled': getCurrentStep() !== steps.ADD_FIRST_BRANCH}" ) .grid-block.shrink.aha-meter( ng-class = "{\ @@ -75,7 +75,7 @@ p.small Your branches will update on every commit you make. .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': getCurrentStep() < steps.SETUP_RUNNABOT}" + ng-class = "{'disabled': getCurrentStep() !== steps.SETUP_RUNNABOT}" ) .grid-block.shrink.aha-meter( ng-class = "{'aha-meter-50': getCurrentStep() === steps.SETUP_RUNNABOT}" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index c4d8fbafe..841ba76a1 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -108,9 +108,10 @@ function EnvironmentController( EC.showSidebar = true; } + var isAddFirstRepo = ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO; // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { - if (instance.attrs.build.successful && instance.getRepoName()) { + if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { $rootScope.$broadcast('launchAhaNavPopover'); } if (instance.hasDockerfileMirroring()) { diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 94338754d..066bf36f4 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -47,7 +47,7 @@ header.grid-block.align-center.environment-header( ng-include = "'viewEnvironmentHeader'" ng-init = "state.helpButton = {active: false}" - ng-if = "!EC.ahaGuide.isInGuide() || (EC.showCreateTemplate && EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO)" + ng-if = "!EC.ahaGuide.isInGuide() || EC.showCreateTemplate" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade index 2f2e5ce0c..efff05507 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade @@ -1,14 +1,14 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-if = "SMC.state.advanced !== 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.SETUP_FIRST_REPO" + ng-if = "SMC.state.advanced !== 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" step-index = 1 sub-step = "repository" sub-step-index = 4 ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide-directive - ng-if = "SMC.state.advanced === 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.SETUP_FIRST_REPO" + ng-if = "SMC.state.advanced === 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" step-index = 1 sub-step = "buildfiles" sub-step-index = 6 diff --git a/client/directives/instances/instance/instanceHeaderDirective.js b/client/directives/instances/instance/instanceHeaderDirective.js index a0fa40773..c4ba9f36d 100644 --- a/client/directives/instances/instance/instanceHeaderDirective.js +++ b/client/directives/instances/instance/instanceHeaderDirective.js @@ -8,6 +8,7 @@ require('app') */ function instanceHeader( $localStorage, + $rootScope, $stateParams, fetchPullRequest ) { @@ -32,6 +33,9 @@ function instanceHeader( } }); }); + $scope.toggleSidebar = function () { + $rootScope.$broadcast('show-aha-sidebar'); + }; } }; } diff --git a/client/directives/instances/instance/instanceHeaderView.jade b/client/directives/instances/instance/instanceHeaderView.jade index 5201719eb..05e808db2 100644 --- a/client/directives/instances/instance/instanceHeaderView.jade +++ b/client/directives/instances/instance/instanceHeaderView.jade @@ -47,7 +47,7 @@ ) {{key}}:{{value[0].HostPort}} | button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "EC.toggleSidebar()" + ng-click = "toggleSidebar()" ng-if = "$root.featureFlags.aha" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 56d53d7e3..6e1fc568f 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -21,7 +21,7 @@ function ahaGuide( function refreshInstances() { return fetchInstancesByPod() .then(function (fetchedInstances) { - instances = fetchedInstances; + instances = fetchedInstances.models; }); } refreshInstances(); @@ -187,7 +187,7 @@ function ahaGuide( cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched - var hasBranchLaunched = instances.models.some(function (instance) { + var hasBranchLaunched = instances.some(function (instance) { return instance.attrs.hasBranchLaunched; }); if (hasBranchLaunched) { diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index add07e850..bb5231866 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -60,7 +60,7 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar - toggle-sidebar = "CIS.toggleSidebar" + toggle-sidebar = "CI.toggleSidebar" show-overview = "false" - ng-if = "$root.featureFlags.aha && CIS.showSidebar" + ng-if = "$root.featureFlags.aha && CI.showSidebar" ) From 17a6d672eadb08e6473ec68776a1f412f285d2be Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 5 Sep 2016 15:41:18 -0700 Subject: [PATCH 177/577] fix middle toggle border radius --- client/assets/styles/scss/components/buttons/buttons-group.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/components/buttons/buttons-group.scss b/client/assets/styles/scss/components/buttons/buttons-group.scss index 2ba8c2b08..3fb67ba76 100644 --- a/client/assets/styles/scss/components/buttons/buttons-group.scss +++ b/client/assets/styles/scss/components/buttons/buttons-group.scss @@ -134,7 +134,7 @@ > .btn:active { &:not(:first-child):not(:last-child) { - border-radius: $input-border-radius; + border-radius: 0; } &:first-child:not(:last-child) { From 56ff08f40d2248f9bbd23ff3438420de017fe7bd Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 5 Sep 2016 15:53:18 -0700 Subject: [PATCH 178/577] unbuiltBranches -> getUnbuiltBranches --- client/controllers/controllerInstances.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 1dc35c576..a8f7bf100 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -161,7 +161,7 @@ function ControllerInstances( }); }; - this.unbuiltBranches = function(instance, branches) { + this.getUnbuiltBranches = function (instance, branches) { var branchName; var childInstances = instance.children.models.reduce(function(childHash, child) { branchName = child.getBranchName(); @@ -184,7 +184,7 @@ function ControllerInstances( CIS.getAllBranches(instance); }; - this.getAllBranches = function(instance) { + this.getAllBranches = function (instance) { CIS.instanceBranches = null; loading('fetchingBranches', true); return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) @@ -193,7 +193,7 @@ function ControllerInstances( }) .then(function (branches) { CIS.totalInstanceBranches = branches.models.length; - CIS.instanceBranches = CIS.unbuiltBranches(instance, branches); + CIS.instanceBranches = CIS.getUnbuiltBranches(instance, branches); }); }; From f8e9661687008a978cbc1ef41b5fb3a5fcbf3059 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 5 Sep 2016 16:32:45 -0700 Subject: [PATCH 179/577] Added more logic for current org and big poppa state --- client/controllers/controllerApp.js | 12 ------------ client/controllers/controllerInstances.js | 4 ++++ .../addBranchGuide/addBranchGuideDirective.js | 1 + .../addBranchGuide/addBranchGuideView.jade | 7 ++++--- .../branchMenuPopover/branchMenuPopoverView.jade | 15 +++++++++++++++ client/services/ahaGuideService.js | 6 +++--- 6 files changed, 27 insertions(+), 18 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 6d643632b..cc3a53bfe 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -88,19 +88,8 @@ function ControllerApp( $rootScope.resetFeatureFlags = featureFlags.reset; this.featureFlagsChanged = featureFlags.changed; $rootScope.ahaGuide = {}; - var completedMilestones = keypather.get($localStorage, 'ahaGuide.completedMilestones'); var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); - if (!completedMilestones) { - completedMilestones = { - aha0: false, - aha1: false, - aha2: false, - aha3: false - }; - keypather.set($localStorage, 'ahaGuide.completedMilestones', completedMilestones); - } - if (!ahaGuideToggles) { ahaGuideToggles = { showAha: true, @@ -117,7 +106,6 @@ function ControllerApp( keypather.set($localStorage, 'ahaGuide.ahaGuideToggles', ahaGuideToggles); } - $rootScope.ahaGuide.completedMilestones = $localStorage.ahaGuide.completedMilestones; $rootScope.ahaGuide.ahaGuideToggles = $localStorage.ahaGuide.ahaGuideToggles; $scope.$watch(function () { diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index b2a51c677..495e85caf 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -9,6 +9,7 @@ function ControllerInstances( $filter, $localStorage, $state, + ahaGuide, keypather, setLastOrg, errs, @@ -22,6 +23,8 @@ function ControllerInstances( ) { var CIS = this; var userName = $state.params.userName; + CIS.ahaGuide = ahaGuide; + CIS.currentOrg = currentOrg; CIS.searchBranches = null; CIS.instanceBranches = null; CIS.unbuiltBranches = null; @@ -204,6 +207,7 @@ function ControllerInstances( promisify(CIS.poppedInstance, 'fork')(branch.attrs.name, sha) .then(function() { loading(loadingName, false); + CIS.poppedInstance.attrs.hasBranchLaunched = true; closePopover(); }); }; diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js index 1a6e93cef..a5f382ad7 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js @@ -15,6 +15,7 @@ function addBranchGuide( steps: ahaGuide.steps, getCurrentStep: ahaGuide.getCurrentStep }; + $scope.subStep = $scope.AGC.state.subStep; } }; } diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 688eba2e6..37ef77af0 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -1,6 +1,7 @@ .grid-block.shrink.aha-meter( ng-class = "{\ 'aha-meter-33': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH,\ + 'aha-meter-66': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH && subStep === 'dockLoading',\ 'aha-meter-100': ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) @@ -16,14 +17,14 @@ .grid-block.vertical.aha-text p.p.small.text-gray-light Add your First Branch p.p( - ng-if = "AGC.state.subStep === 'addBranch'" + ng-if = "subStep === 'addBranch'" ) Click the + button next to any repo name. p.p( - ng-if = "AGC.state.subStep === 'dockLoading'" + ng-if = "subStep === 'dockLoading'" ) Select a branch to add. //- show in the branch menu if the repository has no branches. p.p( - ng-if = "AGC.state.subStep === 'dockLoaded'" + ng-if = "subStep === 'dockLoaded'" ) Aw, no branches. Try another repository or a.link skip this step | . diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 90f4f3687..e0c8f37cf 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -2,10 +2,25 @@ ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha2 && CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + aha-guide-directive + step-index = 2 + sub-step = "dockLoading" + sub-step-index = 1 + ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha2 && CIS.instanceBranches && !CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + aha-guide-directive + step-index = 2 + sub-step = "dockLoaded" + sub-step-index = 2 + ) .arrow.white .grid-block.vertical.popover-content.empty( ng-if = "$root.featureFlags.autoIsolationSetup" ) + svg.svg.grid-block use( xlink:href = "#icons-branch-burst" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index d82f0e582..ccefbc799 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -149,7 +149,7 @@ function ahaGuide( title: 'Add your first branch', subSteps: { addBranch: { - caption: 'Click the + button next to any repository name.', + caption: 'Click the + button next to any repostory name.', className: 'aha-meter-33', step: 0 }, @@ -177,14 +177,14 @@ function ahaGuide( if (!cachedStep) { // Temporarily turning aha on currentOrg.poppa.hasAha = true; - currentOrg.poppa.hasConfirmedSetup = false; + currentOrg.poppa.hasConfirmedSetup = true; if (!currentOrg.poppa.hasAha) { cachedStep = STEPS.COMPLETED; } else if (!currentOrg.poppa.hasConfirmedSetup) { cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched - var hasBranchLaunched = instances.models.some(function (instance) { + var hasBranchLaunched = instances.models && instances.models.some(function (instance) { return instance.attrs.hasBranchLaunched; }); if (hasBranchLaunched) { From 260cb3c365774f33f8c629f5d14c9ac1c66e4391 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 5 Sep 2016 18:11:01 -0700 Subject: [PATCH 180/577] Updated aha-guide-milestone-3 with aha-guide-2 changes --- client/controllers/controllerApp.js | 21 ++++++++++---- .../components/ahaGuide/AhaGuideController.js | 1 + .../components/ahaGuide/ahaGuideView.jade | 5 ---- .../components/ahaGuide/ahaPopoverView.jade | 22 +++++--------- .../setUpRepositoryGuideView.jade | 29 +++++++++++++++++-- .../environment/environmentController.js | 1 + .../environment/modals/confirmSetupView.jade | 10 +++++-- client/directives/navBar/viewNav.jade | 4 +-- 8 files changed, 60 insertions(+), 33 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 56310d4ae..9f8d999b4 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -11,6 +11,7 @@ function ControllerApp( $state, $timeout, $window, + ahaGuide, configAPIHost, configEnvironment, configLoginURL, @@ -21,6 +22,7 @@ function ControllerApp( keypather, ModalService, pageName, + promisify, currentOrg, user, orgs, @@ -31,9 +33,23 @@ function ControllerApp( $ocLazyLoad.load('ui.ace'); }, 10000); + $scope.$on('confirmedSetup', function() { + promisify(currentOrg.poppa, 'update')({ + hasConfirmedSetup: true + }) + .then(function(result) { + console.log(result); + }) + // cheese it + currentOrg.poppa.hasConfirmedSetup = true; + $state.go('base.instances', {userName: CA.activeAccount.oauthName()}) + }); + this.activeAccount = activeAccount; this.user = user; var CA = this; + CA.ahaGuide = ahaGuide; + CA.currentOrg = currentOrg; fetchInstancesByPod() .then(function (instancesByPod) { @@ -90,11 +106,6 @@ function ControllerApp( $rootScope.ahaGuide = {}; var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); - if (!completedMilestones) { - completedMilestones = {}; - keypather.set($localStorage, 'ahaGuide.completedMilestones', completedMilestones); - } - if (!ahaGuideToggles) { ahaGuideToggles = { showAha: true, diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 29212a666..dddb7534c 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -33,6 +33,7 @@ function AhaGuideController( } }); + AGC.ahaGuide = ahaGuide; AGC.state = { hideMenu: false, isBuildSuccessful: false, diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index f04b76206..6e1d29b71 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -18,11 +18,6 @@ ng-include = "'setUpRunnabotGuideView'" ) -.grid-block.align-center( - ng-if = "state.addRepo" - ng-include = "'setUpRepositoryGuideView'" -) - button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" ng-if = "!AGC.state.hideMenu" diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 1bfd94b82..9e7ebf49a 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -1,19 +1,11 @@ .arrow.white .popover-content .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "!$root.featureFlags.ahaInContainersView" - ng-include = "'ahaGuideView'" - ng-init = "state.showStep = 1" + aha-guide-directive + step-index = 1 + sub-step = "complete" ) - .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.ahaInContainersView" - ng-include = "'ahaGuideView'" - ng-init = "\ - state.showStep = 2;\ - state.showSubStep = 1;\ - " - ) -.grid-block.justify-right.popover-footer( - ng-if = "!$root.featureFlags.ahaInContainersView" -) - button.grid-block.shrink.btn.btn-sm.green Got It +.grid-block.justify-right.popover-footer + button.grid-block.shrink.btn.btn-sm.green( + ng-click = "CA.showAhaNavPopover = false" +) Got It diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 666ac9956..0f8902c6e 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -6,17 +6,40 @@ .grid-block.shrink.aha-meter.js-animate( class = "{{ AGC.state.className }}" ng-class = "{'aha-error': AGC.state.showError}" - ng-if = "!state.showVerification" + ng-if = "!state.showVerification && AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_REPO" ) svg.iconnables( ng-if = "!AGC.state.showError" ) use( - ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.state.subStep !== 'complete'" + ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_REPO && AGC.state.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AGC.state.subStep === 'complete'" + ng-if = "AGC.state.subStep === 'complete' || AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" + xlink:href = "#icons-check" + ) + svg.iconnables.icons-alert( + ng-if = "AGC.state.showError" + ) + use( + xlink:href = "#icons-alert-alt" + ) + +.grid-block.shrink.aha-meter.js-animate( + class = "aha-meter-100" + ng-class = "{'aha-error': AGC.state.showError}" + ng-if = "!state.showVerification && AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" +) + svg.iconnables( + ng-if = "!AGC.state.showError" + ) + use( + ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_REPO && AGC.state.subStep !== 'complete'" + xlink:href = "#icons-octicons-repo" + ) + use( + ng-if = "AGC.state.subStep === 'complete' || AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 841ba76a1..369f3ecf6 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -16,6 +16,7 @@ function EnvironmentController( $timeout, $window, ahaGuide, + currentOrg, favico, fetchDockerfileForContextVersion, fetchOrgMembers, diff --git a/client/directives/environment/modals/confirmSetupView.jade b/client/directives/environment/modals/confirmSetupView.jade index d89c3fa17..7c4fafc3d 100644 --- a/client/directives/environment/modals/confirmSetupView.jade +++ b/client/directives/environment/modals/confirmSetupView.jade @@ -5,7 +5,7 @@ .modal-dialog.modal-sm .modal-body svg.iconnables.icons-close( - ng-click = "SMC.actions.close()" + ng-click = "CMC.actions.cancel()" ) use( xlink:href = "#icons-close" @@ -17,5 +17,9 @@ a.link chat with our devs | . footer.modal-footer.clearfix - button.btn.btn-md.btn-cancel.gray.float-left Go Back - button.btn.btn-md.green.float-right It‘s Running! + button.btn.btn-md.btn-cancel.gray.float-left( + ng-click = "CMC.actions.cancel()" + ) Go Back + button.btn.btn-md.green.float-right( + ng-click = "$root.$broadcast('confirmedSetup');CMC.actions.confirm()" + ) It‘s Running! diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 1baaee42f..e2e287bf4 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -32,7 +32,7 @@ a.a.disabled( | Containers a.a( - ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length)" + ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && (!$root.featureFlags.aha || CA.ahaGuide.getCurrentStep() > CA.ahaGuide.steps.ADD_FIRST_REPO)" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) @@ -43,7 +43,7 @@ a.a( | Containers a.a( - ng-if = "$root.featureFlags.aha2" + ng-if = "$root.featureFlags.aha && CA.ahaGuide.getCurrentStep() === CA.ahaGuide.steps.ADD_FIRST_REPO" internal-modal-helper = "confirmSetupView" ) svg.iconnables.icons-server-dark From 3d8adc39e9ed8803d334438146c4fae0e4a307cc Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 6 Sep 2016 12:09:29 -0700 Subject: [PATCH 181/577] Addressed PR comments --- client/controllers/controllerInstances.js | 12 ++++++++++-- .../instanceNavigationController.js | 3 +-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index a8f7bf100..99d94b130 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -8,6 +8,7 @@ require('app') function ControllerInstances( $filter, $localStorage, + $scope, $state, keypather, setLastOrg, @@ -29,6 +30,13 @@ function ControllerInstances( CIS.$storage = $localStorage.$default({ instanceListIsClosed: false }); + + $scope.$watch('CIS.instanceBranches', function(newVal, oldVal) { + if (newVal) { + loading('fetchingBranches', false); + } + }); + fetchInstancesByPod() .then(function (instancesByPod) { @@ -175,18 +183,18 @@ function ControllerInstances( branchName = keypather.get(branch, 'attrs.name'); return !childInstances[branchName]; }); - loading('fetchingBranches', false); + return unbuiltBranches; }; this.popInstanceOpen = function (instance) { CIS.poppedInstance = instance; + loading('fetchingBranches', true); CIS.getAllBranches(instance); }; this.getAllBranches = function (instance) { CIS.instanceBranches = null; - loading('fetchingBranches', true); return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) .then(function (repo) { return promisify(repo, 'fetchBranches')(); diff --git a/client/directives/components/instanceNavigtion/instanceNavigationController.js b/client/directives/components/instanceNavigtion/instanceNavigationController.js index 34452a1e4..30d69d25b 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationController.js +++ b/client/directives/components/instanceNavigtion/instanceNavigationController.js @@ -137,8 +137,7 @@ function InstanceNavigationController( .then(function (modal) { modal.close.then(function (confirmed) { if (confirmed) { - promisify(INC.instance, 'destroy')() - .catch(errs.handler); + promisify(INC.instance, 'destroy')(); } }); }) From 093e727ba700df74357850fc410436a344bd19d7 Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 13:42:12 -0700 Subject: [PATCH 182/577] add empty state for when aha guide is not yet implemented --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 3 +-- .../environment/environmentBody/viewCardGrid.jade | 8 +++++++- client/directives/environment/environmentView.jade | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 3761bf023..9428b8a27 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -16,8 +16,7 @@ ) Get Started .grid-block.vertical .grid-block.shrink.align-center.padding-sm.aha-guide.disabled - .grid-block.shrink.aha-meter.aha-meter-100( - ) + .grid-block.shrink.aha-meter.aha-meter-100 svg.iconnables use( xlink:href = "#icons-check" diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index d31f56c90..686a03adb 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -10,13 +10,19 @@ //- empty state .card.gray.disabled.load.empty.p( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "!EC.ahaGuide.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" + ng-if = "$root.featureFlags.aha && !EC.ahaGuide.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" ) h1.h1 😐 | This is awkward. br | You don‘t have any templates. +//- empty state +.card.gray.disabled.load.empty.p( + ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" + ng-if = "!$root.featureFlags.aha && !EC.ahaGuide.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" +) Create a repository template to get started! + //- server card .card.gray.disabled.load( actions = "actions" diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 2ed1fdfb3..a120cae5b 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -51,12 +51,12 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.showExitedEarly" aha-guide-directive + error-state = "true" + ng-if = "$root.featureFlags.aha && EC.showExitedEarly" step-index = 1 sub-step = 'exitedEarly' sub-step-index = 7 - error-state = "true" ) .grid-block.environment-body.justify-center.clearfix( From 405ff015c74306c18b9454ddbb02cb600b2f0d09 Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 13:47:09 -0700 Subject: [PATCH 183/577] fix card alignment at 3 columns --- client/assets/styles/scss/layout/environment-body.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/layout/environment-body.scss b/client/assets/styles/scss/layout/environment-body.scss index 437ff9d35..714644f01 100644 --- a/client/assets/styles/scss/layout/environment-body.scss +++ b/client/assets/styles/scss/layout/environment-body.scss @@ -56,7 +56,7 @@ } @include media(lg) { - flex: 0 0 calc(33.333% - 11px); + flex: 0 0 calc(33.333% - 10px); // on the 6th card + 5 thereafter &:nth-child(5n+6) { From 4232a77935076a31fe592b4964f49c4a372695e2 Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 13:54:05 -0700 Subject: [PATCH 184/577] remove active state from .aha-guide in sidebar --- client/assets/styles/scss/components/aha-sidebar.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 231a03997..67d737ef0 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -92,10 +92,6 @@ } } - &.active { - cursor: pointer; - } - + .aha-guide { margin-top: 15px; } From 0ca527dd529e4c11d37d72c317fd4e0ed5ddbdee Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 14:22:51 -0700 Subject: [PATCH 185/577] fix merge on ahaSidebarView --- .../styles/scss/components/aha-sidebar.scss | 8 ++- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 63 ++++++++++--------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/client/assets/styles/scss/components/aha-sidebar.scss b/client/assets/styles/scss/components/aha-sidebar.scss index 67d737ef0..d038f9efb 100644 --- a/client/assets/styles/scss/components/aha-sidebar.scss +++ b/client/assets/styles/scss/components/aha-sidebar.scss @@ -65,7 +65,13 @@ } .p { - margin-top: 30px; + margin-top: 15px; + } + + .btn { + margin-bottom: 30px; + margin-left: auto; + margin-right: auto; } } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 9428b8a27..e93f24279 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -1,20 +1,34 @@ -.grid-block.shrink.align-center.justify-right - svg.iconnables.icons-close( - ng-click = "toggleSidebar()" - ng-if = "!showOverview" - ) - use( - xlink:href = "#icons-close" +.grid-block.shrink( + ng-if = "!showOverview" +) + header.grid-block.align-center.justify-center.aha-sidebar-header + h4.grid-content.strong.text-center.h4 + //- During ahas 1-3: + | Setup Guide + //- During aha 4: + //- | You did it! + svg.grid-content.shrink.iconnables.icons-close( + ng-click = "toggleSidebar()" + ng-if = "!showOverview" ) -.grid-block.vertical.shrink.justify-center.text-center.aha-overview( + use( + xlink:href = "#icons-close" + ) + +//- At the start of milestone 2: +.grid-block.vertical.shrink.aha-overview( ng-if = "showOverview" ) - .grid-content.strong Let‘s get running! 👋 - | It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! - button.grid-content.btn.btn-sm.green( - ng-click = "toggleSidebar()" - ) Get Started -.grid-block.vertical + header.grid-block.vertical.shrink.align-center.justify-center.aha-sidebar-header + h4.grid-content.shrink.text-center.h4 Let‘s get running! 👋 + .grid-block.shrink.vertical.padding-sm + p.grid-content.shrink.text-center.p It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! + button.grid-content.shrink.btn.btn-md.green( + ng-click = "toggleSidebar()" + ) Get Started + +//- During ahas 1-3 +.grid-block.shrink.vertical.aha-guide-wrapper .grid-block.shrink.align-center.padding-sm.aha-guide.disabled .grid-block.shrink.aha-meter.aha-meter-100 svg.iconnables @@ -73,21 +87,8 @@ p.p.strong Add your First Branch p.small Your branches will update on every commit you make. - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': getCurrentStep() !== steps.SETUP_RUNNABOT}" +//- During aha 4: +//- .grid-block.vertical.aha-overview + .grid-block.vertical.align-center.form-github( + ng-include = "'gitHubIntegrationView'" ) - .grid-block.shrink.aha-meter( - ng-class = "{'aha-meter-50': getCurrentStep() === steps.SETUP_RUNNABOT}" - ) - svg.iconnables - use( - ng-if = "getCurrentStep() <= steps.SETUP_RUNNABOT" - xlink:href = "#icons-runnabot" - ) - use( - ng-if = "getCurrentStep() > steps.SETUP_RUNNABOT" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Set Up Runnabot - p.small Receive notifications on pull requests when your container is ready. From 634a9bb32ae49e02a7e2110dc0c0f50ecde0679d Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 14:29:39 -0700 Subject: [PATCH 186/577] fix merge on ahaPopoverView --- client/directives/components/ahaGuide/ahaPopoverView.jade | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 9bb9b87ce..97034de16 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -1,15 +1,13 @@ .arrow.white .popover-content .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + aha-guide-directive ng-if = "!$root.featureFlags.ahaInContainersView" - ng-include = "'ahaGuideView'" ng-init = "state.showStep = 1" - ) - aha-guide-directive step-index = 1 sub-step = "complete" ) .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( - ng-click = "CA.showAhaNavPopover = false" -) Got It + ng-click = "CA.showAhaNavPopover = false" + ) Got It From a6bcee4ff1297e84d51bd165dc37f375c83891da Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 14:33:56 -0700 Subject: [PATCH 187/577] fix merge on setUpRepositoryGuideView --- .../setUpRepositoryGuideView.jade | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 666ac9956..fe54765e1 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -1,8 +1,3 @@ -.grid-block.align-center.shrink.spinner-wrapper.spinner-md.spinner-gray.in.js-animate( - ng-if = "state.showVerification" - ng-include = "'spinner'" -) - .grid-block.shrink.aha-meter.js-animate( class = "{{ AGC.state.className }}" ng-class = "{'aha-error': AGC.state.showError}" @@ -32,14 +27,14 @@ ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" ng-if = "$root.featureFlags.aha && !state.showError && !state.showVerification" ) {{ AGC.state.caption }} + + //- Step 8: p.p( ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" ng-if = "AGC.state.subStep === 7" ) - | {{!state.showError && !state.showVerification ? 'Now building. Build time varies depending on your template.' : ''}} - | {{state.showVerification ? 'Verifying Template…' : ''}} - | {{state.showErrorType === 'build' && state.showError ? 'Your build failed. Inspect your build logs for more information.' : ''}} - | {{state.showErrorType === 'CMD' && state.showError ? 'Your container failed to run. Inspect your CMD logs for more information.' : ''}} + | {{!state.showError && !state.showVerification ? 'We‘re building! Build time varies depending on your template.' : ''}} + | {{state.showError ? 'Uh oh, there was a build error! Inspect your logs for debug info.' : ''}} //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. span.span( ng-if = "state.showErrorType === 'exitedEarly'" @@ -49,7 +44,17 @@ a.link ask our engineers | ! + //- If template repo is deleted: + //- p.p( + //- ng-class = "{'p-slide js-animate': state.showSubStep}" + //- ) You‘ve deleted your repository template. Create another one to continue. + + + //- Step 9: p.p( ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" ng-if = "AGC.state.subStep === 8 && !state.showError && !state.showVerification" - ) Your build is looking good! Check out its URL and click ‘Done’ if it looks good to you. + ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. + + //- Step 10 (in the nav popover): + //- p.p Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. From e116cd66d9a3d8beae26a1d1d3ff3b7c01152e2e Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 6 Sep 2016 14:35:34 -0700 Subject: [PATCH 188/577] Added popover open on page load --- client/controllers/controllerApp.js | 4 +-- client/controllers/controllerInstances.js | 30 +++++++++++++--- .../branchMenuPopoverView.jade | 7 ++-- .../branchMenuPopover/enterAddBranch.jade | 30 ++++++++++++++++ .../directives/popovers/popOverController.js | 16 +++++++-- .../directives/popovers/popOverDirective.js | 5 +-- .../instances/viewInstancesList.jade | 34 +++++++++++++------ 7 files changed, 102 insertions(+), 24 deletions(-) create mode 100644 client/directives/instances/instance/branchMenuPopover/enterAddBranch.jade diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 9f8d999b4..77a511d77 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -39,10 +39,10 @@ function ControllerApp( }) .then(function(result) { console.log(result); - }) + }); // cheese it currentOrg.poppa.hasConfirmedSetup = true; - $state.go('base.instances', {userName: CA.activeAccount.oauthName()}) + $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); }); this.activeAccount = activeAccount; diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 495e85caf..24e41479a 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -8,6 +8,7 @@ require('app') function ControllerInstances( $filter, $localStorage, + $scope, $state, ahaGuide, keypather, @@ -27,11 +28,28 @@ function ControllerInstances( CIS.currentOrg = currentOrg; CIS.searchBranches = null; CIS.instanceBranches = null; + CIS.isPopoverOpen = true; CIS.unbuiltBranches = null; CIS.branchQuery = null; CIS.$storage = $localStorage.$default({ instanceListIsClosed: false }); + + $scope.$on('popover-closed', function(event, pop) { + if (pop.data !== 'ahaTemplate') { + CIS.isPopoverOpen = true; + } else { + console.log('seeting branches to null'); + CIS.instanceBranches = null; + } + }); + + $scope.$on('popover-opened', function(event, pop) { + if (pop.data !== 'ahaTemplate') { + CIS.isPopoverOpen = false; + } + }); + fetchInstancesByPod() .then(function (instancesByPod) { @@ -182,7 +200,8 @@ function ControllerInstances( return unbuiltBranches; }; - this.popInstanceOpen = function (instance) { + this.popInstanceOpen = function (instance, open) { + console.log(instance); CIS.poppedInstance = instance; CIS.getAllBranches(instance); }; @@ -251,8 +270,11 @@ function ControllerInstances( .catch(errs.handler); }; - this.setAutofork = function(instance) { - var shouldNotAutofork = instance.attrs.shouldNotAutofork = !instance.attrs.shouldNotAutofork; - promisify(instance, 'update')({shouldNotAutofork: shouldNotAutofork}); + this.setAutofork = function() { + var shouldNotAutofork = CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; + promisify(CIS.poppedInstance, 'update')({shouldNotAutofork: shouldNotAutofork}) + .then(function(ins) { + console.log(ins.attrs.shouldNotAutofork); + }); }; } diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index e0c8f37cf..ce4a238fc 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -3,19 +3,20 @@ ng-style = "popoverStyle.getStyle()" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha2 && CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "$root.featureFlags.aha && CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" aha-guide-directive step-index = 2 sub-step = "dockLoading" sub-step-index = 1 ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha2 && CIS.instanceBranches && !CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "$root.featureFlags.aha && CIS.instanceBranches && !CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" aha-guide-directive step-index = 2 sub-step = "dockLoaded" sub-step-index = 2 ) + .arrow.white .grid-block.vertical.popover-content.empty( ng-if = "$root.featureFlags.autoIsolationSetup" @@ -31,7 +32,7 @@ ) Set Up Branches animated-panel-container.popover-views( - ng-if = "!$root.featureFlags.autoIsolationSetup" + ng-if = "!$root.featureFlags.autoIsolationSetup && !CIS.isPopoverOpen" ) //- this should be the default panel when auto-isolation is implemented animated-panel( diff --git a/client/directives/instances/instance/branchMenuPopover/enterAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/enterAddBranch.jade new file mode 100644 index 000000000..7e3ba3d03 --- /dev/null +++ b/client/directives/instances/instance/branchMenuPopover/enterAddBranch.jade @@ -0,0 +1,30 @@ +.popover.menu.right.popover-branch-menu( + ng-class = "{'in': active}" + ng-style = "popoverStyle.getStyle()" +) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + aha-guide-directive + step-index = 2 + sub-step = "addBranch" + sub-step-index = 0 + ) + + .arrow.white + + animated-panel-container.popover-views( + ng-if = "!$root.featureFlags.autoIsolationSetup && $root.isLoading.fetchingBranches" + ) + animated-panel( + default = "true" + name = "addBranch" + ) + .popover-view.fade( + class = "in" + ) + .popover-content( + ) + .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( + ng-if = "$root.isLoading.fetchingBranches" + ng-include = "'spinner'" + ) \ No newline at end of file diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index 3e4f5be83..8c1f0720f 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -20,11 +20,17 @@ function PopOverController( return $scope.active; }; POC.closePopover = function () { + console.log('Close popover called'); + console.trace(); // trigger a digest because we are setting active to false! $timeout(angular.noop); $scope.active = false; POC.unbindDocumentClick(); POC.unbindPopoverOpened(); + $rootScope.$broadcast('popover-closed', { + template: $scope.template, + data: $scope.data + }); // We need a closure because they could technically re-open the popover and we want to manage THIS scope and THIS element. (function (popoverElementScope, popoverElement) { //Give the transition some time to finish! @@ -39,6 +45,10 @@ function PopOverController( }(POC.popoverElementScope, POC.popoverElement)); }; POC.openPopover = function () { + $rootScope.$broadcast('popover-opened', { + template: $scope.template, + data: $scope.data + }); $scope.popoverOptions = $scope.popoverOptions || {}; if (!exists($scope.popoverOptions.top) && !exists($scope.popoverOptions.bottom)) { @@ -55,13 +65,15 @@ function PopOverController( // If the click has a target and that target is on the page but not on our popover we should close the popover. // Otherwise we should keep the popover alive. POC.unbindDocumentClick = $scope.$on('app-document-click', function (event, target) { - if (!target || (target && $document[0].contains(target) && !POC.popoverElement[0].contains(target))) { + if (!$scope.uncloseable && (!target || (target && $document[0].contains(target) && !POC.popoverElement[0].contains(target)))) { POC.closePopover(); } }); }, 0); POC.unbindPopoverOpened = $scope.$on('close-popovers', function () { - POC.closePopover(); + if (!$scope.uncloseable) { + POC.closePopover(); + } }); var template = $templateCache.get($scope.template); diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index 7d5e805cd..737884ecc 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -14,10 +14,10 @@ var scopeVars = { noBroadcast: '=? popOverNoBroadcast', actions: '=? popOverActions', active: '=? popOverActive', - func: '=? popOverFunc', template: '= popOverTemplate', controller: '=? popOverController', - controllerAs: '@? popOverControllerAs' + controllerAs: '@? popOverControllerAs', + uncloseable: '=? popOverUncloseable' }; function popOver( @@ -101,6 +101,7 @@ function popOver( if (keypather.get($scope, 'popoverOptions.verticallyCentered')) { style.bottom = null; style.top = Math.round((-POC.popoverElement[0].offsetHeight / 2 + offset.top + (offset.bottom - offset.top) / 2)) + 'px'; + console.log(Math.round((-POC.popoverElement[0].offsetHeight / 2 + offset.top + (offset.bottom - offset.top) / 2))) } previousStyle = style; diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 7717dce69..1b2fbdfc9 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -48,22 +48,34 @@ p.p.text-center.text-gray-light.padding-sm( span.grid-content.text-overflow( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} - //- '+' button for adding branches and configuring clusters - button.grid-block.shrink.btn.btn-xs.btn-icon.gray( - ng-class = "{'active': state.active}" - ng-if = "$root.featureFlags.addBranches" + .popoverContainingDiv( + ng-if = "$root.featureFlags.aha" ng-click = "CIS.popInstanceOpen(masterInstance)" + tooltip = "Add Branch" + tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-36,\"top\":24}" pop-over pop-over-controller = "CIS" pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" pop-over-template = "branchMenuPopoverView" - tooltip = "Add Branch" - tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-36,\"top\":24}" - ) - svg.iconnables - use( - xlink:href = "#icons-add" - ) + pop-over-data = "'branchSelect'" + ) + .hiddenPopoverThingy( + ng-if = "$index === 0" + pop-over + pop-over-active = "CIS.isPopoverOpen" + pop-over-controller = "CIS" + pop-over-options = "{\"left\":24,\"top\":-40}" + pop-over-template = "enterAddBranch" + pop-over-trigger = "activeAttr" + pop-over-uncloseable = "true" + pop-over-data = "'ahaTemplate'" + ) + //- '+' button for adding branches and configuring clusters + button.grid-block.shrink.btn.btn-xs.btn-icon.gray() + svg.iconnables + use( + xlink:href = "#icons-add" + ) //- repo config button (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( ng-click = "CIS.editInstance(masterInstance)" From 673c54d0bb17166cd7ae947b7bb1d344689eb780 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 6 Sep 2016 15:04:36 -0700 Subject: [PATCH 189/577] Changing checkRunnabot to use polling Update the services to work better --- client/services/runnabotService.js | 23 ++------- .../githubIntegrationController.unit.js | 50 ++++++++----------- 2 files changed, 23 insertions(+), 50 deletions(-) diff --git a/client/services/runnabotService.js b/client/services/runnabotService.js index 949d298e3..24d5ecc3a 100644 --- a/client/services/runnabotService.js +++ b/client/services/runnabotService.js @@ -1,18 +1,16 @@ 'use strict'; require('app') - .factory('addRunnabotToGithubOrg', addRunnabotToGithubOrg) .factory('isRunnabotPartOfOrg', isRunnabotPartOfOrg); function isRunnabotPartOfOrg( $http, - configAPIHost, - memoize + configAPIHost ) { - return memoize(function (orgName) { + return function (orgName) { return $http({ method: 'get', - url: configAPIHost + '/github/orgs/' + orgName + '/members/runnabot' + url: configAPIHost + '/github/orgs/' + orgName + '/memberships/runnabot' }) .then(function (data) { return data.status !== 404; // Github returns 404 when the user isn't part of the org @@ -20,20 +18,5 @@ function isRunnabotPartOfOrg( .catch(function () { return false; }); - }); -} - -function addRunnabotToGithubOrg( - $http, - configAPIHost -) { - return function (orgName) { - return $http({ - method: 'put', - url: configAPIHost + '/github/orgs/' + orgName + '/memberships/runnabot', - params: { - role: 'member' - } - }); }; } \ No newline at end of file diff --git a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js index 85b24d7e5..8e08eb0d5 100644 --- a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js +++ b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js @@ -3,10 +3,10 @@ var $scope; var $controller; var $rootScope; +var $interval; -describe('Github Integration Controller'.bold.underline.blue, function() { +describe.only('Github Integration Controller'.bold.underline.blue, function() { var GIC; - var addRunnabotToGithubOrgMock; var isRunnabotPartOfOrgMock; var isRunnabotPartOfOrgResult; var fetchGithubUserIsAdminOfOrgMock; @@ -37,10 +37,6 @@ describe('Github Integration Controller'.bold.underline.blue, function() { angular.mock.module(function ($provide) { $provide.value('currentOrg', mockCurrentOrg); $provide.value('errs', errsMock); - $provide.factory('addRunnabotToGithubOrg', function ($q) { - addRunnabotToGithubOrgMock = sinon.stub().returns($q.when(true)); - return addRunnabotToGithubOrgMock; - }); $provide.factory('isRunnabotPartOfOrg', function ($q) { isRunnabotPartOfOrgMock = sinon.stub().returns($q.when(isRunnabotPartOfOrgResult)); isRunnabotPartOfOrgMock.cache = { @@ -59,11 +55,13 @@ describe('Github Integration Controller'.bold.underline.blue, function() { angular.mock.inject(function ( _$rootScope_, - _$controller_ + _$controller_, + _$interval_ ) { $scope = _$rootScope_.$new(); $rootScope = _$rootScope_; $controller = _$controller_; + $interval = _$interval_; }); @@ -92,30 +90,22 @@ describe('Github Integration Controller'.bold.underline.blue, function() { expect(GIC.hasRunnabot).to.be.true; }); - describe('isRunnabotPartOfOrg cache clear', function () { - beforeEach(function () { - isRunnabotPartOfOrgResult = false; - }); - beforeEach(injectSetupCompile); - it('should clear if runnabot is not part of the org', function () { - $scope.$digest(); - sinon.assert.calledOnce(isRunnabotPartOfOrgMock.cache.clear); - }); - it('should clear after adding runnabot', function () { - $scope.$digest(); - isRunnabotPartOfOrgMock.cache.clear.reset(); - GIC.addRunnabot(); - $scope.$digest(); - sinon.assert.calledOnce(isRunnabotPartOfOrgMock.cache.clear); - }); + it('should create interval on pollCheckRunnabot', function () { + isRunnabotPartOfOrgResult = true; + injectSetupCompile(); + $scope.$digest(); + GIC.pollCheckRunnabot(); + expect(GIC.pollingInterval).to.exist(); }); - describe('addRunnabot', function () { - beforeEach(injectSetupCompile); - it('should attempt to add runnabot', function () { - GIC.addRunnabot(); - $scope.$digest(); - sinon.assert.calledOnce(addRunnabotToGithubOrgMock); - }); + it('should stop interval when hasRunnabot and interval is true', function () { + isRunnabotPartOfOrgResult = true; + sinon.stub($interval.cancel); + GIC.pollingInterval = $interval(sinon.stub(), 1000); + isRunnabotPartOfOrgResult = true; + injectSetupCompile(); + $scope.$digest(); + sinon.assert.calledOnce($interval.cancel); + sinon.assert.calledWith($interval.cancel, GIC.pollingInterval); }); }); From 80cf3eaa31fa694c9f4738ede65c41a6e1f524cd Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 15:06:57 -0700 Subject: [PATCH 190/577] update copy --- client/services/ahaGuideService.js | 42 +++++++++++++++--------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6e1fc568f..1d3bba9e5 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -53,7 +53,7 @@ function ahaGuide( title: 'Add your First Repository', subSteps: { addRepository: { - caption: 'Add your repository by clicking \'Add Configuration\'.', + caption: 'Add your repository by clicking ‘Add Configuration’.', className: 'aha-meter-10', step: 0 }, @@ -78,79 +78,79 @@ function ahaGuide( step: 4 }, commands: { - caption: 'Choose commands and packages', + caption: 'Choose commands and packages.', className: 'aha-meter-60', step: 5 }, buildfiles: { - caption: 'If your app needs additional configuration...', + caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, default: { - caption: 'If your app needs additional configuration...', + caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, env: { - caption: 'If your app needs additional configuration...', + caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, files: { - caption: 'If your app needs additional configuration...', + caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, filesMirror: { - caption: 'We\'ve imported your dockerfile, click \'Save & Build\' to build it!', + caption: 'We’ve imported your dockerfile, click ‘Save & Build’ to build it!', className: 'aha-meter-70', step: 6 }, ports: { - caption: 'If your app needs additional configuration...', + caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, translation: { - caption: 'If your app needs additional configuration...', + caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, logs: { - caption: 'Now building. Build time varies depending on your configuration', + caption: 'We‘re building! Build time varies depending on your template.', className: 'aha-meter-80', step: 7 }, exitedEarly: { - caption: 'Your container isn\'t running yet! Check the logs to debug any issues. If you\'re stumped, ask our engineers!', + caption: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', className: 'aha-meter-80', step: 7, errorState: true }, success: { - caption: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', + caption: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', className: 'aha-meter-90', step: 8 }, complete: { - caption: 'Add more containers if your project requires it. Once you\'re done, head to your containers to start adding branches.', + caption: 'Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches.', className: 'aha-meter-100', step: 9 } }, buildStatus: { - building: 'Now building. Build time varies depending on your configuration', - starting: 'Now building. Build time varies depending on your configuration', - running: 'Your build is looking good! Check out its URL and click \'Done\' if it looks good', - stopped: 'Your container failed to run. Inspect your logs for more information.', - cmdFailed: 'Your container failed to run. Inspect your logs for more information.', - crashed: 'Your container failed to run. Inspect your logs for more information.', - buildFailed: 'Your container failed to run. Inspect your logs for more information.' + building: 'We‘re building! Build time varies depending on your template.', + starting: 'We‘re building! Build time varies depending on your template.', + running: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', + stopped: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', + cmdFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', + crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', + buildFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' } }, { - title: 'Add your first branch', + title: 'Add your First Branch', subSteps: { addBranch: { caption: 'Almost done! Click the + button next to a repo name to add a branch.', From 38f0c5f3ebe7f0ddf5972930c21dca8ae51d436b Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 15:19:01 -0700 Subject: [PATCH 191/577] fix card wrapping at 3 columns in safari --- client/assets/styles/scss/layout/environment-body.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/layout/environment-body.scss b/client/assets/styles/scss/layout/environment-body.scss index 714644f01..437ff9d35 100644 --- a/client/assets/styles/scss/layout/environment-body.scss +++ b/client/assets/styles/scss/layout/environment-body.scss @@ -56,7 +56,7 @@ } @include media(lg) { - flex: 0 0 calc(33.333% - 10px); + flex: 0 0 calc(33.333% - 11px); // on the 6th card + 5 thereafter &:nth-child(5n+6) { From f445fe4dd31039cc73bc4d7a93ad3d0247d05589 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 6 Sep 2016 15:20:42 -0700 Subject: [PATCH 192/577] Update tests to test the polling and cancelling --- .../gitHubIntegrationView.jade | 6 ++++-- .../githubIntegrationController.unit.js | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade index 7045fdd3f..80e7a8c32 100644 --- a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade @@ -8,10 +8,12 @@ img.grid-content.shrink.img.img-comment( ) //- add 'disabled' attr if inviting runnabot, or if user isn't an admin hide after successfully inviting runnabot -button.grid-content.shrink.btn.btn-md.green( - ng-click = "GIC.addRunnabot()" +a.grid-content.shrink.btn.btn-md.green( ng-disabled = "!GIC.isAdmin || $root.isLoading.addRunnabot" + ng-click = "GIC.sayHey()" ng-hide = "GIC.hasRunnabot" + ng-href = "https://github.com/orgs/{{GIC.organizationName}}/invitations/runnabot/edit" + target = "_blank" ) svg.iconnables.icons-octicons-github use( diff --git a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js index 8e08eb0d5..8c1f53a17 100644 --- a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js +++ b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js @@ -5,7 +5,7 @@ var $controller; var $rootScope; var $interval; -describe.only('Github Integration Controller'.bold.underline.blue, function() { +describe('Github Integration Controller'.bold.underline.blue, function() { var GIC; var isRunnabotPartOfOrgMock; var isRunnabotPartOfOrgResult; @@ -95,15 +95,25 @@ describe.only('Github Integration Controller'.bold.underline.blue, function() { injectSetupCompile(); $scope.$digest(); GIC.pollCheckRunnabot(); - expect(GIC.pollingInterval).to.exist(); + expect(GIC.pollingInterval).to.be.ok; }); it('should stop interval when hasRunnabot and interval is true', function () { isRunnabotPartOfOrgResult = true; - sinon.stub($interval.cancel); - GIC.pollingInterval = $interval(sinon.stub(), 1000); + injectSetupCompile(); + sinon.stub($interval, 'cancel').returns(); + GIC.pollingInterval = true; + $scope.$digest(); + sinon.assert.calledOnce($interval.cancel); + sinon.assert.calledWith($interval.cancel, GIC.pollingInterval); + }); + + it('should stop interval when $destroyed', function () { isRunnabotPartOfOrgResult = true; injectSetupCompile(); + sinon.stub($interval, 'cancel').returns(); + $scope.$digest(); + $scope.$destroy(); $scope.$digest(); sinon.assert.calledOnce($interval.cancel); sinon.assert.calledWith($interval.cancel, GIC.pollingInterval); From 04690c014df7f49b163bb7d7b3b4308d77f2fdb9 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 6 Sep 2016 15:24:42 -0700 Subject: [PATCH 193/577] Update tests to test the polling and cancelling --- .../githubIntegrationController.js | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js index a89b2256d..5a4b7a015 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationController.js +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -6,16 +6,17 @@ require('app') * @ngInject */ function GithubIntegrationController( - addRunnabotToGithubOrg, + $scope, + $interval, currentOrg, errs, fetchGithubUserIsAdminOfOrg, isRunnabotPartOfOrg, - keypather, - loading + keypather ) { var GIC = this; var org = keypather.get(currentOrg, 'github.attrs.login'); + GIC.organizationName = org; fetchGithubUserIsAdminOfOrg(org) .then(function (isAdmin) { @@ -23,23 +24,26 @@ function GithubIntegrationController( }) .catch(errs.handler); - isRunnabotPartOfOrg(org) - .then(function (hasRunnabot) { - GIC.hasRunnabot = hasRunnabot; - if (!hasRunnabot) { - isRunnabotPartOfOrg.cache.clear(); - } - }) - .catch(errs.handler); - - GIC.addRunnabot = function () { - loading('addRunnabot', true); - return addRunnabotToGithubOrg(org) - .catch(errs.handler) - .finally(function () { - loading('addRunnabot'); - isRunnabotPartOfOrg.cache.clear(); + function checkRunnabot() { + isRunnabotPartOfOrg(org) + .then(function (hasRunnabot) { + GIC.hasRunnabot = hasRunnabot; + if (hasRunnabot && GIC.pollingInterval) { + $interval.cancel(GIC.pollingInterval); + } + }) + .catch(function (err) { + errs.handler(err); }); + } + checkRunnabot(); + + GIC.pollCheckRunnabot = function () { + GIC.pollingInterval = $interval(checkRunnabot, 2000); }; + + $scope.$on('$destroy', function () { + $interval.cancel(GIC.pollingInterval); + }); } From aa9e5a769d2637469abf549165564c9b50967595 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Tue, 6 Sep 2016 15:35:26 -0700 Subject: [PATCH 194/577] Updated aha guide to have it handle steps in a better way hopefully. --- .../components/ahaGuide/AhaGuideController.js | 58 ++-- .../components/ahaGuide/ahaGuideDirective.js | 11 +- .../components/ahaGuide/ahaGuideView.jade | 12 +- .../components/ahaGuide/ahaPopoverView.jade | 4 +- .../components/createSandboxGuideView.jade | 10 +- .../setUpRepositoryGuideView.jade | 37 ++- .../environment/environmentView.jade | 8 +- .../setupMirrorServerModalView.jade | 2 +- .../setupServerModalView.jade | 4 +- .../chooseOrganizationModalView.jade | 2 +- .../newContainerModalView.jade | 10 +- client/services/ahaGuideService.js | 269 +++++++++--------- 12 files changed, 200 insertions(+), 227 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 29212a666..b20999c70 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -26,32 +26,24 @@ function AhaGuideController( }); var tabListener = $scope.$on('updatedTab', function(event, tabName) { - if (AGC.state.subStepIndex > 5) { + if (AGC.subStepIndex > 5) { tabListener(); } else { updateCaption(tabName); } }); - AGC.state = { - hideMenu: false, - isBuildSuccessful: false, - mainStep: $scope.stepIndex, - subStep: $scope.subStep, - subStepIndex: $scope.subStepIndex, - showError: $scope.errorState - }; - - // get steps from service - AGC.state.steps = ahaGuide.stepList; + AGC.hideMenu = false; + AGC.isBuildSuccessful = false; + AGC.ahaGuide = ahaGuide; // get the current milestone - var currentMilestone = AGC.state.steps[AGC.state.mainStep]; - // get the bound of the caption array so we know when to stop + var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; + console.log(currentMilestone); - AGC.state.title = currentMilestone.title; - AGC.state.caption = currentMilestone.subSteps[AGC.state.subStep].caption; - AGC.state.className = currentMilestone.subSteps[AGC.state.subStep].className; + AGC.title = currentMilestone.title; + AGC.caption = currentMilestone.subSteps[AGC.subStep].caption; + AGC.className = currentMilestone.subSteps[AGC.subStep].className; // update steps and initiate digest loop function updateCaption(status) { @@ -61,32 +53,20 @@ function AhaGuideController( if (status === 'dockLoaded') { $rootScope.animatedPanelListener(); } - AGC.state.subStep = status; - AGC.state.subStepIndex = currentMilestone.subSteps[status].step; - AGC.state.caption = currentMilestone.subSteps[status].caption; - AGC.state.className = currentMilestone.subSteps[status].className; - - // not animating - // var thingy = angular.element(document.getElementsByClassName('p-slide')) - // var parentThingy = angular.element(document.getElementsByClassName('grid-block aha-text')) - - // if (thingy && parentThingy) { - // thingy.remove(); - // parentThingy.append('

' + - // AGC.state.caption + '

'); - // } + AGC.subStep = status; + AGC.subStepIndex = currentMilestone.subSteps[status].step; + AGC.caption = currentMilestone.subSteps[status].caption; + AGC.className = currentMilestone.subSteps[status].className; } function handleBuildUpdate(update) { - console.log(update); var buildStatus = update.status; if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { - AGC.state.showError = true; + AGC.showError = true; } else if (buildStatus === 'starting') { - AGC.state.showError = false; + AGC.showError = false; } else if (buildStatus === 'running') { - AGC.state.isBuildSuccessful = true; + AGC.isBuildSuccessful = true; updateCaption('success'); $rootScope.$broadcast('exitedEarly', false); } @@ -94,8 +74,8 @@ function AhaGuideController( } function updateBuildStatus(buildStatus) { - AGC.state.buildStatus = buildStatus; - AGC.state.caption = currentMilestone.buildStatus[buildStatus] || AGC.state.caption; + AGC.buildStatus = buildStatus; + AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; } // we need to unregister this animated panel listener if it exists @@ -111,7 +91,7 @@ function AhaGuideController( if ($rootScope.doneListener) { $rootScope.doneListener(); } - if (AGC.state.subStepIndex === 7 && !AGC.state.isBuildSuccessful) { + if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('exitedEarly', true); } }); diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 8bef579e1..6acf1832c 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -1,12 +1,12 @@ 'use strict'; require('app') - .directive('ahaGuideDirective', ahaGuideDirective); + .directive('ahaGuide', ahaGuide); /** * @ngInject */ -function ahaGuideDirective( +function ahaGuide( ) { return { @@ -14,12 +14,11 @@ function ahaGuideDirective( templateUrl: 'ahaGuideView', controller: 'AhaGuideController', controllerAs: 'AGC', + bindToController: true, scope: { - stepIndex: '=', subStep: '@', - subStepIndex: '=', + subStepIndex: '=?', errorState: '=?' - }, - link: function ($scope, elem, attrs) {} + } }; } diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index f04b76206..94687b176 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -1,31 +1,31 @@ .grid-block.align-center( - ng-if = "AGC.state.mainStep === 0" + ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.CHOOSE_ORGANIZATION" ng-include = "'createSandboxGuideView'" ) .grid-block.align-center( - ng-if = "AGC.state.mainStep === 1" + ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_REPO" ng-include = "'setUpRepositoryGuideView'" ) .grid-block.align-center( - ng-if = "AGC.state.mainStep === 2" + ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_BRANCH" add-branch-guide ) .grid-block.align-center( - ng-if = "AGC.state.mainStep === 3" + ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.SETUP_RUNNABOT" ng-include = "'setUpRunnabotGuideView'" ) .grid-block.align-center( - ng-if = "state.addRepo" + ng-if = "addRepo" ng-include = "'setUpRepositoryGuideView'" ) button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!AGC.state.hideMenu" + ng-if = "!AGC.hideMenu" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 97034de16..6c8631ff1 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -1,9 +1,7 @@ .arrow.white .popover-content .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - aha-guide-directive - ng-if = "!$root.featureFlags.ahaInContainersView" - ng-init = "state.showStep = 1" + aha-guide step-index = 1 sub-step = "complete" ) diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index 3e19c7a88..408270ccf 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -1,17 +1,17 @@ .grid-block.shrink.aha-meter( ng-class = "\ - AGC.state.className\ + AGC.className\ " ) svg.iconnables use( - ng-if = "$root.featureFlags.aha && AGC.state.subStep !== 'dockLoaded'" + ng-if = "$root.featureFlags.aha && AGC.subStep !== 'dockLoaded'" xlink:href = "#icons-cog" ) use( - ng-if = "$root.featureFlags.aha && AGC.state.subStep === 'dockLoaded'" + ng-if = "$root.featureFlags.aha && AGC.subStep === 'dockLoaded'" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.small.text-gray-light {{ AGC.state.title }} - p.p {{ AGC.state.caption }} + p.p.small.text-gray-light {{ AGC.title }} + p.p {{ AGC.caption }} diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index fe54765e1..eeeed0075 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -1,43 +1,42 @@ .grid-block.shrink.aha-meter.js-animate( - class = "{{ AGC.state.className }}" - ng-class = "{'aha-error': AGC.state.showError}" - ng-if = "!state.showVerification" + class = "{{ AGC.className }}" + ng-class = "{'aha-error': AGC.showError}" ) svg.iconnables( - ng-if = "!AGC.state.showError" + ng-if = "!AGC.showError" ) use( - ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.state.subStep !== 'complete'" + ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AGC.state.subStep === 'complete'" + ng-if = "AGC.subStep === 'complete'" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( - ng-if = "AGC.state.showError" + ng-if = "AGC.showError" ) use( xlink:href = "#icons-alert-alt" ) .grid-block.vertical.aha-text - p.p.small.text-gray-light {{ AGC.state.title }} + p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" - ng-if = "$root.featureFlags.aha && !state.showError && !state.showVerification" - ) {{ AGC.state.caption }} + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError" + ) {{ AGC.caption }} //- Step 8: p.p( - ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" - ng-if = "AGC.state.subStep === 7" + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "AGC.subStep === 7" ) - | {{!state.showError && !state.showVerification ? 'We‘re building! Build time varies depending on your template.' : ''}} - | {{state.showError ? 'Uh oh, there was a build error! Inspect your logs for debug info.' : ''}} + | {{!AGC.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} + | {{AGC.showError ? 'Uh oh, there was a build error! Inspect your logs for debug info.' : ''}} //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. span.span( - ng-if = "state.showErrorType === 'exitedEarly'" + ng-if = "AGC.showErrorType === 'exitedEarly'" ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, //- this link should open in intercom with the prefilled message: "I’m having trouble getting my first container up and running." @@ -46,14 +45,14 @@ //- If template repo is deleted: //- p.p( - //- ng-class = "{'p-slide js-animate': state.showSubStep}" + //- ng-class = "{'p-slide js-animate': AGC.showSubStep}" //- ) You‘ve deleted your repository template. Create another one to continue. //- Step 9: p.p( - ng-class = "{'p-slide js-animate': AGC.state.subStepIndex}" - ng-if = "AGC.state.subStep === 8 && !state.showError && !state.showVerification" + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "AGC.subStep === 8 && !AGC.showError" ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. //- Step 10 (in the nav popover): diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index a120cae5b..0fe30c1e1 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -51,10 +51,9 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - aha-guide-directive - error-state = "true" ng-if = "$root.featureFlags.aha && EC.showExitedEarly" - step-index = 1 + aha-guide + error-state = "true" sub-step = 'exitedEarly' sub-step-index = 7 ) @@ -100,8 +99,7 @@ ng-if = "EC.ahaGuide.isInGuide() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( - aha-guide-directive - step-index = 1 + aha-guide sub-step = "addRepository" sub-step-index = 0 ) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade index ffd877f5a..de8eb7d84 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade @@ -1,6 +1,6 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - aha-guide-directive + aha-guide step-index = 1 sub-step-index = 6 sub-step = "filesMirror" diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade index efff05507..c58008496 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade @@ -1,13 +1,13 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - aha-guide-directive + aha-guide ng-if = "SMC.state.advanced !== 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" step-index = 1 sub-step = "repository" sub-step-index = 4 ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - aha-guide-directive + aha-guide ng-if = "SMC.state.advanced === 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" step-index = 1 sub-step = "buildfiles" diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index d4a628d27..4af5a3f5d 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -13,7 +13,7 @@ }" ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( - aha-guide-directive + aha-guide ng-if = "$root.featureFlags.aha" step-index = 0 sub-step = "orgSelection" diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 824a65fc6..d2fdd81e8 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -1,8 +1,8 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - aha-guide-directive + aha-guide ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO && MC.instances.models.length === 0 && MC.instances.models" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 @@ -14,13 +14,13 @@ name = "containerSelection" ) header.modal-header.grid-block.justify-center( - ng-class = "{'lg': MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO}" + ng-class = "{'lg': MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || MC.instances.models.length !== 0 && MC.instances.models}" ng-click = "MC.changeTab('nameContainer')" ) .grid-block.shrink.btn( ng-class = "{'active': MC.state.tabName === 'repos'}" ng-click = "MC.changeTab('repos')" - ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || MC.instances.models.length !== 0 && MC.instances.models" ) svg.iconnables.icons-repository.grid-block.shrink use( @@ -37,7 +37,7 @@ 'disabled': $root.isLoading[MC.name + 'SingleRepo'] \ }" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && MC.changeTab('services')" - ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || MC.instances.models.length !== 0 && MC.instances.models" ) svg.iconnables.icons-template.grid-block.shrink use( diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 1d3bba9e5..aeeb36aac 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -26,149 +26,148 @@ function ahaGuide( } refreshInstances(); - var stepList = [ - { - title: 'Create your Sandbox', - subSteps: { - orgSelection: { - caption: 'Choose an organization to create your sandbox for.', - className: 'aha-meter-33' - }, - dockLoading: { - caption: 'Hang tight!', - className: 'aha-meter-66' - }, - dockLoaded: { - caption: 'Continue to start configuring your project.', - className: 'aha-meter-100' - } + var stepList = {}; + stepList[STEPS.CHOOSE_ORGANIZATION] = { + title: 'Create your Sandbox', + subSteps: { + orgSelection: { + caption: 'Choose an organization to create your sandbox for.', + className: 'aha-meter-33' + }, + dockLoading: { + caption: 'Hang tight!', + className: 'aha-meter-66' }, - panelSteps: { - orgSelection: 0, - dockLoading: 1, - dockLoaded: 2 + dockLoaded: { + caption: 'Continue to start configuring your project.', + className: 'aha-meter-100' } }, - { - title: 'Add your First Repository', - subSteps: { - addRepository: { - caption: 'Add your repository by clicking ‘Add Configuration’.', - className: 'aha-meter-10', - step: 0 - }, - containerSelection: { - caption: 'Select a repository to configure.', - className: 'aha-meter-20', - step: 1 - }, - dockerfileMirroring: { - caption: 'How would you like to configure your repo?', - className: 'aha-meter-30', - step: 2 - }, - nameContainer: { - caption: 'Give your configuration a name.', - className: 'aha-meter-40', - step: 3 - }, - repository: { - caption: 'What does your repository run?', - className: 'aha-meter-50', - step: 4 - }, - commands: { - caption: 'Choose commands and packages.', - className: 'aha-meter-60', - step: 5 - }, - buildfiles: { - caption: 'If your app needs additional configuration…', - className: 'aha-meter-70', - step: 6 - }, - default: { - caption: 'If your app needs additional configuration…', - className: 'aha-meter-70', - step: 6 - }, - env: { - caption: 'If your app needs additional configuration…', - className: 'aha-meter-70', - step: 6 - }, - files: { - caption: 'If your app needs additional configuration…', - className: 'aha-meter-70', - step: 6 - }, - filesMirror: { - caption: 'We’ve imported your dockerfile, click ‘Save & Build’ to build it!', - className: 'aha-meter-70', - step: 6 - }, - ports: { - caption: 'If your app needs additional configuration…', - className: 'aha-meter-70', - step: 6 - }, - translation: { - caption: 'If your app needs additional configuration…', - className: 'aha-meter-70', - step: 6 - }, - logs: { - caption: 'We‘re building! Build time varies depending on your template.', - className: 'aha-meter-80', - step: 7 - }, - exitedEarly: { - caption: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', - className: 'aha-meter-80', - step: 7, - errorState: true - }, - success: { - caption: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', - className: 'aha-meter-90', - step: 8 - }, - complete: { - caption: 'Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches.', - className: 'aha-meter-100', - step: 9 - } + panelSteps: { + orgSelection: 0, + dockLoading: 1, + dockLoaded: 2 + } + }; + stepList[STEPS.ADD_FIRST_REPO] = { + title: 'Add your First Repository', + subSteps: { + addRepository: { + caption: 'Add your repository by clicking ‘Add Configuration’.', + className: 'aha-meter-10', + step: 0 + }, + containerSelection: { + caption: 'Select a repository to configure.', + className: 'aha-meter-20', + step: 1 + }, + dockerfileMirroring: { + caption: 'How would you like to configure your repo?', + className: 'aha-meter-30', + step: 2 + }, + nameContainer: { + caption: 'Give your configuration a name.', + className: 'aha-meter-40', + step: 3 + }, + repository: { + caption: 'What does your repository run?', + className: 'aha-meter-50', + step: 4 + }, + commands: { + caption: 'Choose commands and packages.', + className: 'aha-meter-60', + step: 5 + }, + buildfiles: { + caption: 'If your app needs additional configuration…', + className: 'aha-meter-70', + step: 6 + }, + default: { + caption: 'If your app needs additional configuration…', + className: 'aha-meter-70', + step: 6 + }, + env: { + caption: 'If your app needs additional configuration…', + className: 'aha-meter-70', + step: 6 + }, + files: { + caption: 'If your app needs additional configuration…', + className: 'aha-meter-70', + step: 6 }, - buildStatus: { - building: 'We‘re building! Build time varies depending on your template.', - starting: 'We‘re building! Build time varies depending on your template.', - running: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', - stopped: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', - cmdFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', - crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', - buildFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' + filesMirror: { + caption: 'We’ve imported your dockerfile, click ‘Save & Build’ to build it!', + className: 'aha-meter-70', + step: 6 + }, + ports: { + caption: 'If your app needs additional configuration…', + className: 'aha-meter-70', + step: 6 + }, + translation: { + caption: 'If your app needs additional configuration…', + className: 'aha-meter-70', + step: 6 + }, + logs: { + caption: 'We‘re building! Build time varies depending on your template.', + className: 'aha-meter-80', + step: 7 + }, + exitedEarly: { + caption: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', + className: 'aha-meter-80', + step: 7, + errorState: true + }, + success: { + caption: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', + className: 'aha-meter-90', + step: 8 + }, + complete: { + caption: 'Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches.', + className: 'aha-meter-100', + step: 9 } }, - { - title: 'Add your First Branch', - subSteps: { - addBranch: { - caption: 'Almost done! Click the + button next to a repo name to add a branch.', - className: 'aha-meter-33' - }, - dockLoading: { - caption: 'Hang tight!', - className: 'aha-meter-66' - }, - dockLoaded: { - caption: 'Continue to start configuring your project.', - className: 'aha-meter-100' - } + buildStatus: { + building: 'We‘re building! Build time varies depending on your template.', + starting: 'We‘re building! Build time varies depending on your template.', + running: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', + stopped: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', + cmdFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', + crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', + buildFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' + } + }; + + stepList[STEPS.ADD_FIRST_BRANCH] = { + title: 'Add your First Branch', + subSteps: { + addBranch: { + caption: 'Almost done! Click the + button next to a repo name to add a branch.', + className: 'aha-meter-33' + }, + dockLoading: { + caption: 'Hang tight!', + className: 'aha-meter-66' }, - panelSteps: { + dockLoaded: { + caption: 'Continue to start configuring your project.', + className: 'aha-meter-100' } - } - ]; + }, + panelSteps: { } + }; var cachedStep; $rootScope.$watch(function () { From 4c1ac55055c757f4467af690c6255a925de8895b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 6 Sep 2016 15:47:41 -0700 Subject: [PATCH 195/577] Moved function to cease loading into chained function on popInstanceOpen --- client/controllers/controllerInstances.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 99d94b130..d62ab1117 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -31,12 +31,6 @@ function ControllerInstances( instanceListIsClosed: false }); - $scope.$watch('CIS.instanceBranches', function(newVal, oldVal) { - if (newVal) { - loading('fetchingBranches', false); - } - }); - fetchInstancesByPod() .then(function (instancesByPod) { @@ -190,7 +184,12 @@ function ControllerInstances( this.popInstanceOpen = function (instance) { CIS.poppedInstance = instance; loading('fetchingBranches', true); - CIS.getAllBranches(instance); + return CIS.getAllBranches(instance) + .then(function(branches) { + CIS.totalInstanceBranches = branches.models.length; + CIS.instanceBranches = CIS.getUnbuiltBranches(instance, branches); + loading('fetchingBranches', false); + }) }; this.getAllBranches = function (instance) { @@ -199,10 +198,6 @@ function ControllerInstances( .then(function (repo) { return promisify(repo, 'fetchBranches')(); }) - .then(function (branches) { - CIS.totalInstanceBranches = branches.models.length; - CIS.instanceBranches = CIS.getUnbuiltBranches(instance, branches); - }); }; this.forkBranchFromInstance = function (branch, closePopover) { From 35023f2aa0fa455b566bb9f834c826eb6eb1134e Mon Sep 17 00:00:00 2001 From: Myztiq Date: Tue, 6 Sep 2016 15:52:27 -0700 Subject: [PATCH 196/577] Removed console log --- client/directives/components/ahaGuide/AhaGuideController.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index b20999c70..aedb4fb55 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -39,7 +39,6 @@ function AhaGuideController( // get the current milestone var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; - console.log(currentMilestone); AGC.title = currentMilestone.title; AGC.caption = currentMilestone.subSteps[AGC.subStep].caption; From 1e78225a3c7caf32bf7fbb25e84c6a1f02d0bbb2 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Tue, 6 Sep 2016 15:59:52 -0700 Subject: [PATCH 197/577] Nits. Fixing tests. --- client/controllers/controllerInstances.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index d62ab1117..7aa0130e9 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -44,7 +44,7 @@ function ControllerInstances( var instances = instancesByPod; var lastViewedInstance = keypather.get(user, 'attrs.userOptions.uiState.previousLocation.instance'); - function isInstanceMatch (instance, nameMatch) { + function isInstanceMatch(instance, nameMatch) { if (instance.destroyed || !instance.id()) { return false; } @@ -127,7 +127,7 @@ function ControllerInstances( }); }; - this.getFilteredBranches = function() { + this.getFilteredBranches = function () { if (!CIS.branchQuery) { return CIS.instanceBranches; } @@ -165,7 +165,7 @@ function ControllerInstances( this.getUnbuiltBranches = function (instance, branches) { var branchName; - var childInstances = instance.children.models.reduce(function(childHash, child) { + var childInstances = instance.children.models.reduce(function (childHash, child) { branchName = child.getBranchName(); childHash[branchName] = branchName; return childHash; @@ -173,7 +173,7 @@ function ControllerInstances( var instanceBranchName = instance.getBranchName(); childInstances[instanceBranchName] = instanceBranchName; - var unbuiltBranches = branches.models.filter(function(branch) { + var unbuiltBranches = branches.models.filter(function (branch) { branchName = keypather.get(branch, 'attrs.name'); return !childInstances[branchName]; }); @@ -184,20 +184,20 @@ function ControllerInstances( this.popInstanceOpen = function (instance) { CIS.poppedInstance = instance; loading('fetchingBranches', true); + CIS.instanceBranches = null; return CIS.getAllBranches(instance) - .then(function(branches) { + .then(function (branches) { CIS.totalInstanceBranches = branches.models.length; CIS.instanceBranches = CIS.getUnbuiltBranches(instance, branches); loading('fetchingBranches', false); - }) + }); }; this.getAllBranches = function (instance) { - CIS.instanceBranches = null; return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) .then(function (repo) { return promisify(repo, 'fetchBranches')(); - }) + }); }; this.forkBranchFromInstance = function (branch, closePopover) { @@ -205,7 +205,7 @@ function ControllerInstances( var loadingName = 'buildingForkedBranch' + branch.attrs.name; loading(loadingName, true); promisify(CIS.poppedInstance, 'fork')(branch.attrs.name, sha) - .then(function() { + .then(function () { loading(loadingName, false); closePopover(); }); From 769dfa41c2873fe068f313487ee96a6cc4b35137 Mon Sep 17 00:00:00 2001 From: Nathan Meyers Date: Tue, 6 Sep 2016 16:07:44 -0700 Subject: [PATCH 198/577] Rename gitHubIntegrationDirective.js to githubIntegrationDirective.js --- ...itHubIntegrationDirective.js => githubIntegrationDirective.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/directives/components/gitHubIntegration/{gitHubIntegrationDirective.js => githubIntegrationDirective.js} (100%) diff --git a/client/directives/components/gitHubIntegration/gitHubIntegrationDirective.js b/client/directives/components/gitHubIntegration/githubIntegrationDirective.js similarity index 100% rename from client/directives/components/gitHubIntegration/gitHubIntegrationDirective.js rename to client/directives/components/gitHubIntegration/githubIntegrationDirective.js From 41b6a588afb048a3beec3c0f9c2a6a84ad90545b Mon Sep 17 00:00:00 2001 From: Nathan Meyers Date: Tue, 6 Sep 2016 16:08:02 -0700 Subject: [PATCH 199/577] Rename gitHubIntegrationView.jade to githubIntegrationView.jade --- .../{gitHubIntegrationView.jade => githubIntegrationView.jade} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/directives/components/gitHubIntegration/{gitHubIntegrationView.jade => githubIntegrationView.jade} (100%) diff --git a/client/directives/components/gitHubIntegration/gitHubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade similarity index 100% rename from client/directives/components/gitHubIntegration/gitHubIntegrationView.jade rename to client/directives/components/gitHubIntegration/githubIntegrationView.jade From bde8479f23dbc920deb57cd37eecb25742a63983 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 6 Sep 2016 16:19:08 -0700 Subject: [PATCH 200/577] 4.19.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b66ebb43c..80398acc7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.18.1", + "version": "4.19.0", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 1669409646da6422d5c1cd4d7ec925d284461408 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Tue, 6 Sep 2016 16:27:58 -0700 Subject: [PATCH 201/577] Fixed tests. --- .../controllers/controllerInstance.unit.js | 7 +++++ .../newContainerModalController.unit.js | 5 +++ .../environment/environmentController.unit.js | 31 +++++++++---------- test/unit/services/serviceFetch.unit.js | 1 + 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/test/unit/controllers/controllerInstance.unit.js b/test/unit/controllers/controllerInstance.unit.js index b738746bb..62f5f8c9b 100644 --- a/test/unit/controllers/controllerInstance.unit.js +++ b/test/unit/controllers/controllerInstance.unit.js @@ -54,11 +54,18 @@ describe('controllerInstance'.bold.underline.blue, function () { status: sinon.stub().returns('building'), on: sinon.stub() }; + window.helpers.killDirective('ahaSidebar'); angular.mock.module(function ($provide) { mockFavico = { reset : sinon.spy(), setInstanceState: sinon.spy() }; + $provide.value('ahaGuide', { + getCurrentStep: sinon.stub().returns(1), + steps: { + ADD_FIRST_BRANCH: 123 + } + }); $provide.value('favico', mockFavico); $provide.factory('fetchUser', function ($q) { return function () { diff --git a/test/unit/directives/modals/newContainerModalController.unit.js b/test/unit/directives/modals/newContainerModalController.unit.js index e6597ba77..15b41165c 100644 --- a/test/unit/directives/modals/newContainerModalController.unit.js +++ b/test/unit/directives/modals/newContainerModalController.unit.js @@ -46,8 +46,13 @@ describe('NewContainerModalController'.bold.underline.blue, function () { } }; + window.helpers.killDirective('ahaGuide'); angular.mock.module('app'); angular.mock.module(function ($provide) { + $provide.value('ahaGuide', { + isInGuide: sinon.stub(), + getCurrentSteop: sinon.stub() + }); $provide.value('errs', errsStub); $provide.value('helpCards', helpCardsStub); $provide.factory('fetchInstancesByPod', function ($q) { diff --git a/test/unit/environment/environmentController.unit.js b/test/unit/environment/environmentController.unit.js index c8653c564..6dc8e6b35 100644 --- a/test/unit/environment/environmentController.unit.js +++ b/test/unit/environment/environmentController.unit.js @@ -1,27 +1,23 @@ 'use strict'; -var $controller, - $rootScope, - $scope, - $q, - $timeout; -var keypather = require('keypather')(); var apiMocks = require('../apiMocks/index'); +var keypather = require('keypather')(); var runnable = window.runnable; -var fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); -var createAndBuildNewContainer = new (require('../fixtures/mockFetch'))(); -var stacks = angular.copy(apiMocks.stackInfo); +var $controller; +var $q; +var $rootScope; +var $scope; +var $timeout; + var thisUser = runnable.newUser(apiMocks.user); var EC; var fetchDockerfileForContextVersionStub; -var fetchInstancesByPodStub; describe('environmentController'.bold.underline.blue, function () { var ctx = {}; - function setup(opts) { - opts = opts || {}; + function setup() { ctx = {}; var buildingInstance = apiMocks.instances.building; ctx.runningInstance = apiMocks.instances.runningWithContainers[0]; @@ -74,10 +70,13 @@ describe('environmentController'.bold.underline.blue, function () { $provide.value('eventTracking', ctx.eventTracking); $provide.value('user', thisUser); $provide.value('$state', ctx.state); - $provide.factory('fetchInstancesByPod', function ($q) { - fetchInstancesByPodStub = sinon.stub().returns($q.when(ctx.masterPods)); - return fetchInstancesByPodStub; + $provide.value('ahaGuide', { + getCurrentStep: sinon.stub(), + steps: { + ADD_FIRST_REPO: 'addFirstRepo?!' + } }); + $provide.value('instancesByPod', ctx.masterPods); $provide.factory('fetchDockerfileForContextVersion', function ($q) { fetchDockerfileForContextVersionStub = sinon.stub().returns($q.when(ctx.dockerfile)); return fetchDockerfileForContextVersionStub; @@ -145,8 +144,6 @@ describe('environmentController'.bold.underline.blue, function () { setup(); $rootScope.$digest(); // this should now be loaded - expect($scope.data.instances, 'masterPods').to.equal(ctx.masterPods); - sinon.assert.calledOnce(fetchInstancesByPodStub); sinon.assert.calledOnce(fetchDockerfileForContextVersionStub); expect(ctx.masterPods.models[1].mirroredDockerfile).to.equal(ctx.dockerfile); }); diff --git a/test/unit/services/serviceFetch.unit.js b/test/unit/services/serviceFetch.unit.js index e222bb973..9c7f881d5 100644 --- a/test/unit/services/serviceFetch.unit.js +++ b/test/unit/services/serviceFetch.unit.js @@ -543,6 +543,7 @@ describe('serviceFetch'.bold.underline.blue, function () { }); it('should fetch all the instances in one go', function (done) { + $state.params.userName = 'thejsj'; fetchInstancesByPod().then(function (instancesByPod) { expect(instancesByPod).to.deep.equal({reset: resetInstance, githubUsername: $state.params.userName}); done(); From 1670185406e27fe59418200e980ecfe615d4dfdb Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 6 Sep 2016 16:37:07 -0700 Subject: [PATCH 202/577] add template menu button and popover --- .../scss/popover/popover-branch-menu.scss | 27 +++++ .../templateMenuPopoverView.jade | 108 ++++++++++++++++++ .../instances/viewInstancesList.jade | 13 +++ 3 files changed, 148 insertions(+) create mode 100644 client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 6b0194071..bb5c5faca 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -52,3 +52,30 @@ } } } + +.popover-template-menu { + top: 30px !important; + + .input-search { + margin-top: 0; + } + + .btn-add.btn-add.btn-add { + position: static; + right: auto; + top: auto; + } + + .list-servers { + + .list-item { + font-size: 15px; + } + } + + .gravatar.gravatar { + margin: 0; + margin-right: 4px; + margin-top: 2px; + } +} diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade new file mode 100644 index 000000000..49bfde019 --- /dev/null +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -0,0 +1,108 @@ +.popover.menu.right.popover-branch-menu.popover-template-menu( + ng-class = "{'in': active}" + ng-style = "popoverStyle.getStyle()" +) + .arrow.white + .popover-header Add Branch + .popover-content( + ng-init = "state.branchesLoaded = null" + ) + .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( + ng-click = "state.branchesLoaded = true" + ng-if = "!state.branchesLoaded" + ng-include = "'spinner'" + ) + .padding-xxs( + ng-if = "state.branchesLoaded" + ) + input.input.input-xs.input-search( + ng-disabled = "state.loading" + ng-if = "branch.length !== 0" + placeholder = "Filter" + required + type = "search" + ) + .text-center.text-gray.small.padding-lg( + ng-if = "branch.length === 0" + ) There are no branches to add. + ul.list.popover-list( + ng-if = "state.branchesLoaded" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ) + .grid-block.vertical + .grid-content button-clicker + .grid-block( + ng-if = "$root.featureFlags.inviteFlows" + ) + .btn-user.text-overflow.no-touching( + ng-class = "{'active': state.active}" + ng-include = "'userButtonView'" + ) + span.small( + ng-if = "$root.featureFlags.inviteFlows" + )  — 3 days ago + + //- else + small.small( + ng-if = "!$root.featureFlags.inviteFlows" + ) Updated 3 days ago + + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add + svg.iconnables.icons-add + use( + xlink:href = "#icons-add" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ) + .grid-block.vertical + .grid-content api + .grid-block( + ng-if = "$root.featureFlags.inviteFlows" + ) + .btn-user.text-overflow.no-touching( + ng-class = "{'active': state.active}" + ng-include = "'userButtonView'" + ) + span.small( + ng-if = "$root.featureFlags.inviteFlows" + )  — 3 days ago + + //- else + small.small( + ng-if = "!$root.featureFlags.inviteFlows" + ) Updated 3 days ago + + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add + svg.iconnables.icons-add + use( + xlink:href = "#icons-add" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ) + .grid-block.vertical + .grid-content runnable.com + .grid-block( + ng-if = "$root.featureFlags.inviteFlows" + ) + .btn-user.text-overflow.no-touching( + ng-class = "{'active': state.active}" + ng-include = "'userButtonView'" + ) + span.small( + ng-if = "$root.featureFlags.inviteFlows" + )  — 3 days ago + + //- else + small.small( + ng-if = "!$root.featureFlags.inviteFlows" + ) Updated 3 days ago + + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add + svg.iconnables.icons-add + use( + xlink:href = "#icons-add" + ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index a86ad13c1..f677c63f6 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -18,6 +18,19 @@ p.p.text-center.text-gray-light.padding-sm( .grid-block.align-center.list-item-cluster.list-clusters-heading span.grid-content.text-overflow Templates + button.grid-block.shrink.btn.btn-xs.btn-icon.green( + ng-class = "{'active': state.active}" + ng-if = "$root.featureFlags.addBranches" + pop-over + pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" + pop-over-template = "templateMenuPopoverView" + tooltip = "Add Branch" + tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-36,\"top\":24}" + ) + svg.iconnables + use( + xlink:href = "#icons-add" + ) .list-item-cluster .grid-block.list-containers.vertical.text-overflow.open //- master repository containers From 423689a4c5a762499b28bdab32d232adcbd046b2 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 6 Sep 2016 17:02:35 -0700 Subject: [PATCH 203/577] Fixed closing of popover after successful add --- client/controllers/controllerInstances.js | 18 +++++++++++------- .../templates/instances/viewInstancesList.jade | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 32a65c167..5f06483e9 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -8,8 +8,10 @@ require('app') function ControllerInstances( $filter, $localStorage, + $rootScope, $scope, $state, + $timeout, ahaGuide, keypather, setLastOrg, @@ -30,6 +32,7 @@ function ControllerInstances( CIS.instanceBranches = null; CIS.isPopoverOpen = true; CIS.unbuiltBranches = null; + CIS.popoverCannotClose = true; CIS.branchQuery = null; CIS.$storage = $localStorage.$default({ instanceListIsClosed: false @@ -38,9 +41,6 @@ function ControllerInstances( $scope.$on('popover-closed', function(event, pop) { if (pop.data !== 'ahaTemplate') { CIS.isPopoverOpen = true; - } else { - console.log('seeting branches to null'); - CIS.instanceBranches = null; } }); @@ -201,9 +201,9 @@ function ControllerInstances( }; this.popInstanceOpen = function (instance, open) { + CIS.instanceBranches = null; CIS.poppedInstance = instance; loading('fetchingBranches', true); - CIS.instanceBranches = null; return CIS.getAllBranches(instance) .then(function (branches) { CIS.totalInstanceBranches = branches.models.length; @@ -223,11 +223,15 @@ function ControllerInstances( var sha = branch.attrs.commit.sha; var loadingName = 'buildingForkedBranch' + branch.attrs.name; loading(loadingName, true); + CIS.popoverCannotClose = false; promisify(CIS.poppedInstance, 'fork')(branch.attrs.name, sha) - .then(function () { + .then(function() { + closePopover() loading(loadingName, false); CIS.poppedInstance.attrs.hasBranchLaunched = true; - closePopover(); + $timeout(function() { + $rootScope.$broadcast('close-popovers'); + }); }); }; @@ -244,7 +248,7 @@ function ControllerInstances( }) .catch(errs.handler); }; - + this.openInviteAdminModal = function (instance) { ModalService.showModal({ controller: 'InviteAdminModalController', diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 1b2fbdfc9..c148b9b15 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -59,7 +59,7 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-template = "branchMenuPopoverView" pop-over-data = "'branchSelect'" ) - .hiddenPopoverThingy( + .stepOneUncloseablePopover( ng-if = "$index === 0" pop-over pop-over-active = "CIS.isPopoverOpen" @@ -67,7 +67,7 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-options = "{\"left\":24,\"top\":-40}" pop-over-template = "enterAddBranch" pop-over-trigger = "activeAttr" - pop-over-uncloseable = "true" + pop-over-uncloseable = "CIS.popoverCannotClose" pop-over-data = "'ahaTemplate'" ) //- '+' button for adding branches and configuring clusters From f2ac98c05e460e0cbc65c37b1f5826ee82c712d3 Mon Sep 17 00:00:00 2001 From: Nathan Meyers Date: Tue, 6 Sep 2016 18:13:54 -0700 Subject: [PATCH 204/577] Update githubIntegrationView.jade --- .../components/gitHubIntegration/githubIntegrationView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index 80e7a8c32..06f74a768 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -10,7 +10,7 @@ img.grid-content.shrink.img.img-comment( hide after successfully inviting runnabot a.grid-content.shrink.btn.btn-md.green( ng-disabled = "!GIC.isAdmin || $root.isLoading.addRunnabot" - ng-click = "GIC.sayHey()" + ng-click = "GIC.pollCheckRunnabot()" ng-hide = "GIC.hasRunnabot" ng-href = "https://github.com/orgs/{{GIC.organizationName}}/invitations/runnabot/edit" target = "_blank" From 8ce2239ead366c6f95ffb9e7f948defd5dd2a4bf Mon Sep 17 00:00:00 2001 From: Nathan Meyers Date: Tue, 6 Sep 2016 18:17:49 -0700 Subject: [PATCH 205/577] Update githubIntegrationView.jade --- .../githubIntegrationView.jade | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index 06f74a768..b563966f7 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -38,20 +38,20 @@ a.grid-content.shrink.btn.btn-md.green( .arrow p.small.text-gray.text-left Thanks! See you soon on your pull requests. -.grid-content.shrink.small.text-center.text-red( - ng-show = "GIC.isAdmin" -) - //- if the user is an admin: - | This may affect your GitHub bill. - -.grid-content.shrink.small.text-center.text-gray( - ng-show = "!GIC.isAdmin" -) - | Sorry, you’ll need help from an admin - br - | of your org to invite Runnabot. - -.grid-content.shrink.small.text-center - //- always show this: - br - a.small.link More about Runnabot + .grid-content.shrink.small.text-center.text-red( + ng-show = "GIC.isAdmin" + ) + //- if the user is an admin: + | This may affect your GitHub bill. + + .grid-content.shrink.small.text-center.text-gray( + ng-show = "!GIC.isAdmin" + ) + | Sorry, you’ll need help from an admin + br + | of your org to invite Runnabot. + + .grid-content.shrink.small.text-center + //- always show this: + br + a.small.link More about Runnabot From 333437cfc4bdf7e5f8fdb0caaeb5d698a4dcf150 Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 18:30:31 -0700 Subject: [PATCH 206/577] fix copy --- client/services/ahaGuideService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index aeeb36aac..27985fe5a 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -53,7 +53,7 @@ function ahaGuide( title: 'Add your First Repository', subSteps: { addRepository: { - caption: 'Add your repository by clicking ‘Add Configuration’.', + caption: 'Add a repository by clicking ‘Add Template’.', className: 'aha-meter-10', step: 0 }, From 72a41fdc8415dc907825cd6fb53e1561536cb11e Mon Sep 17 00:00:00 2001 From: runnabro Date: Tue, 6 Sep 2016 18:30:47 -0700 Subject: [PATCH 207/577] remove learn more links for now --- .../activePanel/toolbar/webViewToolbarView.jade | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/directives/activePanel/toolbar/webViewToolbarView.jade b/client/directives/activePanel/toolbar/webViewToolbarView.jade index c76cb76f0..f98f2b9df 100644 --- a/client/directives/activePanel/toolbar/webViewToolbarView.jade +++ b/client/directives/activePanel/toolbar/webViewToolbarView.jade @@ -16,8 +16,8 @@ a.p.monospace.text-overflow( ) | {{state.error ? 'No exposed ports.' : ''}} | {{!state.error ? 'Bind to all interfaces.' : ''}} - |   - a.link( - href = "#" - target = "_blank" - ) Learn More + //- |   + //- a.link( + //- href = "#" + //- target = "_blank" + //- ) Learn More From 01374e5c67d4a0733f9fb39908023ba6ab645a2f Mon Sep 17 00:00:00 2001 From: Nathan Meyers Date: Tue, 6 Sep 2016 19:07:08 -0700 Subject: [PATCH 208/577] Update githubIntegrationView.jade --- .../githubIntegrationView.jade | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index b563966f7..75464761e 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -38,20 +38,21 @@ a.grid-content.shrink.btn.btn-md.green( .arrow p.small.text-gray.text-left Thanks! See you soon on your pull requests. - .grid-content.shrink.small.text-center.text-red( - ng-show = "GIC.isAdmin" - ) - //- if the user is an admin: - | This may affect your GitHub bill. - - .grid-content.shrink.small.text-center.text-gray( - ng-show = "!GIC.isAdmin" - ) - | Sorry, you’ll need help from an admin +.grid-content.shrink.small.text-center( + ng-class = "{\ + 'text-gray': GIC.isAdmin,\ + 'text-red': !GIC.isAdmin\ + }" +) + span( + ng-if = "GIC.isAdmin" + ) This may affect your GitHub bill. + span( + ng-if = "!GIC.isAdmin" + ) Sorry, you’ll need help from an admin br | of your org to invite Runnabot. - - .grid-content.shrink.small.text-center - //- always show this: + + span br a.small.link More about Runnabot From 056ec3fef3a2ea4eb99bc9600e6ac53c2f2c0588 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 7 Sep 2016 10:55:14 -0700 Subject: [PATCH 209/577] add external link icon to 'invite runnabot' button --- client/assets/styles/scss/forms/forms-github.scss | 15 +++++++++++---- client/templates/svg/svgDefs.jade | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/client/assets/styles/scss/forms/forms-github.scss b/client/assets/styles/scss/forms/forms-github.scss index 1dd80f771..7ed5f35d6 100644 --- a/client/assets/styles/scss/forms/forms-github.scss +++ b/client/assets/styles/scss/forms/forms-github.scss @@ -9,10 +9,17 @@ } .btn .iconnables { - height: 21px; - margin-right: 6px; - top: 4px; - width: 21px; + height: 18px; + top: 2px; + width: 18px; + + &:first-child { + margin-right: 6px; + } + + &:last-child { + margin-left: 6px; + } } // the details text diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index 7f2964e28..ad6739cd4 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -232,8 +232,8 @@ svg(xmlns='http://www.w3.org/2000/svg') path(d='M3.8,17.8L3.8,17.8c-0.7,0-1.4-0.3-1.8-0.8l-1.2-1.2C0.3,15.4,0,14.7,0,14c0-0.7,0.3-1.4,0.8-1.9l3.9-3.9c0.3-0.3,0.9-0.3,1.2,0c0.3,0.3,0.3,0.9,0,1.2l-3.9,3.9c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l1.2,1.2c0.2,0.2,0.4,0.3,0.7,0.3l0,0c0.3,0,0.5-0.1,0.7-0.3L8.4,12c0.3-0.3,0.9-0.3,1.2,0c0.3,0.3,0.3,0.9,0,1.2l-3.9,3.9C5.2,17.6,4.5,17.8,3.8,17.8z') path(d='M9.1,9.8c-0.2,0-0.4-0.1-0.6-0.2c-0.3-0.3-0.3-0.9,0-1.2l3.9-3.9c0.4-0.4,0.4-1,0-1.3l-1.2-1.2c-0.4-0.4-1-0.4-1.3,0L5.9,5.9c-0.3,0.3-0.9,0.3-1.2,0C4.4,5.5,4.4,5,4.7,4.7l3.9-3.9c1-1,2.7-1,3.7,0l1.2,1.2c1,1,1,2.7,0,3.7L9.6,9.6C9.5,9.7,9.3,9.8,9.1,9.8z') symbol#icons-link-external(viewBox='0 0 18 18') - path(d='M8.5,7C8.4,7,8.2,7,8.1,6.9C8,6.7,8,6.3,8.1,6.1L13.3,1H10C9.7,1,9.5,0.8,9.5,0.5S9.7,0,10,0h4.5h0c0,0,0,0,0,0h0c0,0,0,0,0,0l0,0c0,0,0,0,0,0l0,0c0.1,0,0.2,0,0.3,0.1c0,0,0,0,0,0v0c0,0,0,0,0.1,0.1C15,0.3,15,0.4,15,0.5c0,0,0,0,0,0V5c0,0.3-0.2,0.5-0.5,0.5S14,5.3,14,5V1.7L8.9,6.9C8.8,7,8.6,7,8.5,7z') - path(d='M12.3,6.2L12,6.5V12c0,1.1-0.9,2-2,2H3c-1.1,0-2-0.9-2-2V5c0-1.1,0.9-2,2-2h5.5l0.3-0.3C8.5,2.5,8.2,2.3,8,2H3C1.3,2,0,3.3,0,5v7c0,1.7,1.3,3,3,3h7c1.7,0,3-1.3,3-3V7C12.7,6.8,12.5,6.5,12.3,6.2z') + path(d='M16.5,1.965A0.5,0.5,0,0,0,16.4,1.7a0.56,0.56,0,0,0-.07-0.074h0a0.5,0.5,0,0,0-.32-0.121H11.5a0.5,0.5,0,0,0,0,1h3.293L9.646,7.646a0.5,0.5,0,1,0,.707.707L15.5,3.207V6.5a0.5,0.5,0,0,0,1,0V2C16.5,1.991,16.5,1.978,16.5,1.965Z') + path(d='M13.817,7.718L13.5,8.035V13.5a2,2,0,0,1-2,2h-7a2,2,0,0,1-2-2v-7a2,2,0,0,1,2-2H9.965l0.317-.317A2.5,2.5,0,0,1,9.527,3.5H4.5a3,3,0,0,0-3,3v7a3,3,0,0,0,3,3h7a3,3,0,0,0,3-3V8.473A2.5,2.5,0,0,1,13.817,7.718Z') symbol#icons-lock(viewBox='0 0 15.725 17') path(d='M2.249,8a1.136,1.136,0,0,0-1.1,1.141V15.9a1.1,1.1,0,0,0,1.1,1.1H15.774a1.1,1.1,0,0,0,1.1-1.1V9.141A1.136,1.136,0,0,0,15.774,8H2.249Z', transform='translate(-1.149)', style='fill:#d8a956') path(d='M15.774,9.125l-0.025.016,0.025,6.734-13.5.025L2.249,9.125H15.774m0-1.125H2.249a1.136,1.136,0,0,0-1.1,1.141V15.9a1.1,1.1,0,0,0,1.1,1.1H15.774a1.1,1.1,0,0,0,1.1-1.1V9.141A1.136,1.136,0,0,0,15.774,8h0Z', transform='translate(-1.149)', style='fill:#ad8850') From 5c897bc74ca8230cf71a858fcf4ac72715f87468 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 7 Sep 2016 12:10:46 -0700 Subject: [PATCH 210/577] Added animations for paragraphs in aha guide --- .../components/ahaGuide/AhaGuideController.js | 9 ++- .../setUpRepositoryGuideView.jade | 66 +++++++++++++++++-- .../environment/environmentView.jade | 2 +- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index b505dbead..93a2771fe 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -22,12 +22,15 @@ function AhaGuideController( }); var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { + console.log(buildStatus); handleBuildUpdate(buildStatus); }); - $scope.$on('exitedEarly', function() { - AGC.showError = true; - updateCaption('exitedEarly'); + $scope.$on('exitedEarly', function(event, didExitEarly) { + if (didExitEarly) { + AGC.showError = true; + updateCaption('exitedEarly'); + } }); var tabListener = $scope.$on('updatedTab', function(event, tabName) { diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index a25ce648f..ccffb038f 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -1,9 +1,9 @@ .grid-block.shrink.aha-meter.js-animate( class = "{{ AGC.className }}" - ng-class = "{'aha-error': AGC.showError}" + ng-class = "{'aha-error': AGC.showError || AGC.errorState}" ) svg.iconnables( - ng-if = "!AGC.showError" + ng-if = "!AGC.showError && !AGC.errorState" ) use( ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_REPO && AGC.subStep !== 'complete'" @@ -14,7 +14,7 @@ xlink:href = "#icons-check" ) svg.iconnables.icons-alert( - ng-if = "AGC.showError" + ng-if = "AGC.showError || AGC.errorState" ) use( xlink:href = "#icons-alert-alt" @@ -43,7 +43,63 @@ xlink:href = "#icons-alert-alt" ) -.grid-block.vertical.aha-text +.grid-block.vertical.aha-text( + ng-if = "$root.featureFlags.aha && !AGC.showError" +) + p.p.small.text-gray-light {{ AGC.title }} + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'addRepository'" + ) Add your repository by clicking ‘Add Configuration’. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'containerSelection'" + ) Select a repository to configure. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" + ) How would you like to configure your repo? + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'nameContainer'" + ) Give your configuration a name. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'repository'" + ) What does your repository run? + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'commands'" + ) Choose commands and packages. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" + ) If your app needs additional configuration… + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'filesMirror'" + ) We’ve imported your dockerfile, click ‘Save & Build’ to build it! + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'logs'" + ) We‘re building! Build time varies depending on your template. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'exitedEarly'" + ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers! + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'success'" + ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'complete'" + ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. + + +.grid-block.vertical.aha-text( + ng-if = "$root.featureFlags.aha && AGC.showError && AGC.subStepIndex > 6" +) p.p.small.text-gray-light {{ AGC.title }} p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" @@ -53,7 +109,7 @@ //- Step 8: p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "AGC.subStep === 7" + ng-if = "AGC.subStepIndex === 7" ) | {{!AGC.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} | {{AGC.showError ? 'Uh oh, there was a build error! Inspect your logs for debug info.' : ''}} diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 42b5be5d5..abda33f8d 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -51,7 +51,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.showExitedEarly" + ng-if = "$root.featureFlags.aha && EC.showExitedEarly && data.instances.models.length" aha-guide error-state = "true" sub-step = 'exitedEarly' From 5a057941a6b300a0a923bcca939b70acf4d315af Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 13:35:16 -0700 Subject: [PATCH 211/577] Fixed scale-in-modal not being applied properly. --- .../environment/environmentHeader/viewEnvironmentHeader.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 054587e49..599cb52dd 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -52,7 +52,7 @@ button.grid-block.shrink.btn.btn-md.btn-icon.btn-help( button.grid-block.shrink.btn.btn-md.green( ng-class = "{\ 'scale': helpCards.getActiveCard().targets.newContainer,\ - 'scale-in-modal': EC.ahaGuide.getCurrentStep() === EC.ahaGuide.ADD_FIRST_BRANCH\ + 'scale-in-modal': EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO\ }" ng-click = "EC.triggerModal.newContainer()" ) From 15d1403ae4634a3b30ae018b08779c0427114f22 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 13:45:58 -0700 Subject: [PATCH 212/577] Fix alignment when models exist. --- client/directives/environment/environmentView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 0fe30c1e1..57076a6b1 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -59,7 +59,7 @@ ) .grid-block.environment-body.justify-center.clearfix( - ng-class = "{'align-center justify-center': EC.showCreateTemplate}" + ng-class = "{'align-center justify-center': EC.showCreateTemplate && data.instances.models.length === 0}" ) .help-container( ng-class = "{\ From ff67c79232ad5e1fed71349fcf2da0556659f370 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 13:48:37 -0700 Subject: [PATCH 213/577] Aha guide menu is hidden in m1. --- client/directives/components/ahaGuide/AhaGuideController.js | 1 - client/directives/components/ahaGuide/ahaGuideView.jade | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index aedb4fb55..053f66d7a 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -33,7 +33,6 @@ function AhaGuideController( } }); - AGC.hideMenu = false; AGC.isBuildSuccessful = false; AGC.ahaGuide = ahaGuide; diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 94687b176..9b18b3384 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -25,7 +25,7 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!AGC.hideMenu" + ng-if = "AGC.ahaGuide.getCurrentStep() !== AGC.ahaGuide.steps.CHOOSE_ORGANIZATION" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" From a1e0da307c7d595eab498693735a98bbbf816d97 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 14:16:08 -0700 Subject: [PATCH 214/577] Aha progress no longer restarts on new templates. --- .../components/ahaGuide/AhaGuideController.js | 32 +++-- .../components/ahaGuide/ahaGuideView.jade | 5 - .../newContainerModalController.js | 112 +++++++++--------- .../newContainerModalView.jade | 8 +- 4 files changed, 81 insertions(+), 76 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 053f66d7a..9f3a6c5cc 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -8,12 +8,20 @@ function AhaGuideController( $scope, $rootScope, ahaGuide, - currentOrg + currentOrg, + fetchInstances, + keypather ) { - var AGC = this; - var alertListener = $scope.$on('alert', function(event, alert) { + AGC.instances = null; + fetchInstances() + .then(function (instances) { + AGC.instances = instances; + updateCaption(AGC.subStep); + }); + + var alertListener = $scope.$on('alert', function (event, alert) { // alerts on container creation success if (alert.type === 'success') { updateCaption('logs'); @@ -21,11 +29,11 @@ function AhaGuideController( } }); - var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { + $scope.$on('buildStatusUpdated', function (event, buildStatus) { handleBuildUpdate(buildStatus); }); - var tabListener = $scope.$on('updatedTab', function(event, tabName) { + var tabListener = $scope.$on('updatedTab', function (event, tabName) { if (AGC.subStepIndex > 5) { tabListener(); } else { @@ -40,8 +48,7 @@ function AhaGuideController( var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; AGC.title = currentMilestone.title; - AGC.caption = currentMilestone.subSteps[AGC.subStep].caption; - AGC.className = currentMilestone.subSteps[AGC.subStep].className; + updateCaption(AGC.subStep); // update steps and initiate digest loop function updateCaption(status) { @@ -55,6 +62,9 @@ function AhaGuideController( AGC.subStepIndex = currentMilestone.subSteps[status].step; AGC.caption = currentMilestone.subSteps[status].caption; AGC.className = currentMilestone.subSteps[status].className; + if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && keypather.get(AGC, 'instances.models.length') > 0) { + AGC.className = 'aha-meter-100'; + } } function handleBuildUpdate(update) { @@ -64,9 +74,9 @@ function AhaGuideController( } else if (buildStatus === 'starting') { AGC.showError = false; } else if (buildStatus === 'running') { - AGC.isBuildSuccessful = true; - updateCaption('success'); - $rootScope.$broadcast('exitedEarly', false); + AGC.isBuildSuccessful = true; + updateCaption('success'); + $rootScope.$broadcast('exitedEarly', false); } updateBuildStatus(buildStatus); } @@ -82,7 +92,7 @@ function AhaGuideController( $rootScope.animatedPanelListener(); } - $scope.$on('$destroy', function() { + $scope.$on('$destroy', function () { if ($rootScope.animatedPanelListener) { $rootScope.animatedPanelListener(); } diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 9b18b3384..57f054d86 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -18,11 +18,6 @@ ng-include = "'setUpRunnabotGuideView'" ) -.grid-block.align-center( - ng-if = "addRepo" - ng-include = "'setUpRepositoryGuideView'" -) - button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" ng-if = "AGC.ahaGuide.getCurrentStep() !== AGC.ahaGuide.steps.CHOOSE_ORGANIZATION" diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index b0da58ace..c9d71e268 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -22,9 +22,9 @@ function NewContainerModalController( close, currentOrg ) { - var NCMC = this; + var MC = this; var helpCard = helpCards.getActiveCard(); - angular.extend(NCMC, { + angular.extend(MC, { name: 'newContainerModal', servicesActive: keypather.get(helpCard, 'id') === 'missingDependency', state: { @@ -37,52 +37,52 @@ function NewContainerModalController( }); // Start loading repos and templates - loading.reset(NCMC.name + 'Repos'); - loading.reset(NCMC.name + 'Templates'); - loading.reset(NCMC.name + 'SingleRepo'); + loading.reset(MC.name + 'Repos'); + loading.reset(MC.name + 'Templates'); + loading.reset(MC.name + 'SingleRepo'); // Fetch all repos from Github - loading(NCMC.name + 'Repos', true); + loading(MC.name + 'Repos', true); $q.all({ instances: fetchInstancesByPod(), repoList: fetchOwnerRepos(currentOrg.github.oauthName()) }) .then(function (data) { - NCMC.instances = data.instances; - NCMC.state.namesForAllInstances = NCMC.instances.map(function (instance) { + MC.instances = data.instances; + MC.state.namesForAllInstances = MC.instances.map(function (instance) { return instance.attrs.name; }); - NCMC.githubRepos = data.repoList; - NCMC.githubRepos.models.forEach(function (repo) { - repo.isAdded = NCMC.isRepoAdded(repo, data.instances); + MC.githubRepos = data.repoList; + MC.githubRepos.models.forEach(function (repo) { + repo.isAdded = MC.isRepoAdded(repo, data.instances); }); }) .catch(errs.handler) .finally(function () { - loading(NCMC.name + 'Repos', false); + loading(MC.name + 'Repos', false); }); - NCMC.fetchTemplateServers = function () { - loading(NCMC.name + 'Templates', true); + MC.fetchTemplateServers = function () { + loading(MC.name + 'Templates', true); // Fetch all non-repo containres return fetchInstances({ githubUsername: 'HelloRunnable' }) .then(function (servers) { - NCMC.templateServers = servers; - loading(NCMC.name + 'Templates', false); + MC.templateServers = servers; + loading(MC.name + 'Templates', false); return servers; }); }; - NCMC.changeTab = function (tabName) { + MC.changeTab = function (tabName) { if (!['repos', 'services'].includes(tabName)) { return; } - NCMC.state.tabName = tabName; + MC.state.tabName = tabName; // Reset repo and template - NCMC.state.templateSource = null; - NCMC.state.repo = null; - if (NCMC.state.tabName === 'services' && !NCMC.templateServers) { - NCMC.fetchTemplateServers(); + MC.state.templateSource = null; + MC.state.repo = null; + if (MC.state.tabName === 'services' && !MC.templateServers) { + MC.fetchTemplateServers(); } }; @@ -90,7 +90,7 @@ function NewContainerModalController( return repo.attrs.name.replace(/[^a-zA-Z0-9-]/g, '-'); } - NCMC.isRepoAdded = function (repo, instances) { + MC.isRepoAdded = function (repo, instances) { // Since the newServers may have faked repos (just containing names), just check the name return !!instances.find(function (instance) { var repoName = instance.getRepoName(); @@ -102,21 +102,21 @@ function NewContainerModalController( }); }; - NCMC.close = function () { - if (NCMC.state.closed) { return; } - NCMC.state.closed = true; + MC.close = function () { + if (MC.state.closed) { return; } + MC.state.closed = true; return close(); }; - NCMC.setTemplate = function (sourceInstance, goToPanelCb) { - NCMC.state.templateSource = sourceInstance; + MC.setTemplate = function (sourceInstance, goToPanelCb) { + MC.state.templateSource = sourceInstance; var instanceToForkName = sourceInstance.attrs.name; - loading(NCMC.name + 'SingleRepo', true); + loading(MC.name + 'SingleRepo', true); return fetchInstances() .then(function (instances) { - loading(NCMC.name + 'SingleRepo', false); + loading(MC.name + 'SingleRepo', false); var serverName = getNewForkName(instanceToForkName, instances, true); - NCMC.state.instanceName = serverName; + MC.state.instanceName = serverName; /** * Warning: Hack Ahead * @@ -134,9 +134,9 @@ function NewContainerModalController( .catch(errs.handler); }; - NCMC.addServerFromTemplate = function (sourceInstance) { + MC.addServerFromTemplate = function (sourceInstance) { var instanceToForkName = sourceInstance.attrs.name; - NCMC.close(); + MC.close(); return fetchInstances() .then(function (instances) { var serverName = getNewForkName(instanceToForkName, instances, true); @@ -155,31 +155,31 @@ function NewContainerModalController( .catch(errs.handler); }; - NCMC.setRepo = function (repo, goToPanelCb) { - if (repo.attrs.full_name === keypather.get(NCMC, 'state.repo.attrs.full_name')) { + MC.setRepo = function (repo, goToPanelCb) { + if (repo.attrs.full_name === keypather.get(MC, 'state.repo.attrs.full_name')) { return goToPanelCb('dockerfileMirroring'); } repo.loading = true; - NCMC.state.repo = repo; - loading(NCMC.name + 'SingleRepo', true); + MC.state.repo = repo; + loading(MC.name + 'SingleRepo', true); var fullName = keypather.get(repo, 'attrs.full_name'); var defaultBranch = keypather.get(repo, 'attrs.default_branch'); - NCMC.state.configurationMethod = null; - NCMC.state.instanceName = fullName.split('/')[1] || ''; - NCMC.state.instanceName = NCMC.state.instanceName.replace(/_/g, '-'); + MC.state.configurationMethod = null; + MC.state.instanceName = fullName.split('/')[1] || ''; + MC.state.instanceName = MC.state.instanceName.replace(/_/g, '-'); return fetchRepoDockerfiles(fullName, defaultBranch) .then(function (dockerfiles) { - loading(NCMC.name + 'SingleRepo', false); + loading(MC.name + 'SingleRepo', false); repo.loading = false; repo.dockerfiles = dockerfiles; - NCMC.state.dockerfile = null; + MC.state.dockerfile = null; return goToPanelCb('dockerfileMirroring'); }); }; - NCMC.createBuildAndGoToNewRepoModal = function (instanceName, repo, dockerfile, configurationMethod) { + MC.createBuildAndGoToNewRepoModal = function (instanceName, repo, dockerfile, configurationMethod) { var dockerfilePath; - loading(NCMC.name + 'SingleRepo', true); + loading(MC.name + 'SingleRepo', true); if (configurationMethod === 'dockerfile') { dockerfilePath = keypather.get(dockerfile, 'path'); @@ -190,27 +190,27 @@ function NewContainerModalController( .then(function (repoBuildAndBranch) { repoBuildAndBranch.instanceName = instanceName; if (configurationMethod === 'dockerfile' && dockerfile) { - NCMC.newMirrorRepositoryContainer(repoBuildAndBranch); + MC.newMirrorRepositoryContainer(repoBuildAndBranch); } else if (configurationMethod === 'blankDockerfile'){ - NCMC.newRepositoryContainer(repoBuildAndBranch, configurationMethod); + MC.newRepositoryContainer(repoBuildAndBranch, configurationMethod); } else { - NCMC.newRepositoryContainer(repoBuildAndBranch, false); + MC.newRepositoryContainer(repoBuildAndBranch, false); } }) .finally(function () { - loading(NCMC.name + 'SingleRepo', false); + loading(MC.name + 'SingleRepo', false); }); }; - NCMC.createBuildFromTemplate = function (instanceName, sourceInstance) { - NCMC.close(); + MC.createBuildFromTemplate = function (instanceName, sourceInstance) { + MC.close(); return createNonRepoInstance(instanceName, sourceInstance) .catch(errs.handler); }; - NCMC.newRepositoryContainer = function (inputs, configurationMethod) { - if (NCMC.state.closed) { return; } - NCMC.close(); + MC.newRepositoryContainer = function (inputs, configurationMethod) { + if (MC.state.closed) { return; } + MC.close(); ModalService.showModal({ controller: 'SetupServerModalController', controllerAs: 'SMC', @@ -225,9 +225,9 @@ function NewContainerModalController( }); }; - NCMC.newMirrorRepositoryContainer = function (inputs) { - if (NCMC.state.closed) { return; } - NCMC.close(); + MC.newMirrorRepositoryContainer = function (inputs) { + if (MC.state.closed) { return; } + MC.close(); ModalService.showModal({ controller: 'SetupMirrorServerModalController', controllerAs: 'SMC', diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index d2fdd81e8..bfc96c34c 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO && MC.instances.models.length === 0 && MC.instances.models" + ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO && MC.instances.models && MC.instances.models.length !== 0" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 @@ -14,13 +14,13 @@ name = "containerSelection" ) header.modal-header.grid-block.justify-center( - ng-class = "{'lg': MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || MC.instances.models.length !== 0 && MC.instances.models}" + ng-class = "{'lg': MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || ( MC.instances.models && MC.instances.models.length !== 0 )}" ng-click = "MC.changeTab('nameContainer')" ) .grid-block.shrink.btn( ng-class = "{'active': MC.state.tabName === 'repos'}" ng-click = "MC.changeTab('repos')" - ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || MC.instances.models.length !== 0 && MC.instances.models" + ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || ( MC.instances.models && MC.instances.models.length !== 0 )" ) svg.iconnables.icons-repository.grid-block.shrink use( @@ -37,7 +37,7 @@ 'disabled': $root.isLoading[MC.name + 'SingleRepo'] \ }" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && MC.changeTab('services')" - ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || MC.instances.models.length !== 0 && MC.instances.models" + ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || ( MC.instances.models && MC.instances.models.length !== 0 )" ) svg.iconnables.icons-template.grid-block.shrink use( From 3e5e8f5c761cd62b6d69bacd2b8c5369c5e198a3 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 14:45:45 -0700 Subject: [PATCH 215/577] Removed help cards! --- .../serverCards/serverCardDirective.js | 113 +------ .../serverCards/serverCardView.jade | 6 - .../serverStatusCardHeaderDirective.js | 2 - .../environmentBody/viewCardGrid.jade | 1 - .../environment/environmentController.js | 49 +-- .../viewEnvironmentHeader.jade | 51 --- .../environment/environmentView.jade | 35 -- .../formBuildfiles/viewFormBuildfiles.jade | 15 - .../viewFormEnvironmentVariables.jade | 17 - .../modals/forms/formFiles/viewFormFiles.jade | 15 - .../formRepository/repositoryFormDirective.js | 4 +- .../formRepository/viewFormRepository.jade | 15 - .../translationRulesDirective.js | 4 +- .../formTranslation/viewFormTranslation.jade | 15 - .../editServerModalController.js | 2 - .../setupMirrorServerModalController.js | 6 - .../setupServerModalController.js | 2 - .../modals/serverModalController.js | 7 +- .../setupTemplateModalController.js | 2 - client/directives/help/viewHelpPopover.jade | 68 ---- .../newContainerModalController.js | 3 - .../newContainerModalView.jade | 1 - .../createAndBuildNewContainerService.js | 5 +- client/services/serviceHelpCards.js | 312 ------------------ 24 files changed, 7 insertions(+), 743 deletions(-) delete mode 100644 client/directives/help/viewHelpPopover.jade delete mode 100644 client/services/serviceHelpCards.js diff --git a/client/directives/environment/environmentBody/serverCards/serverCardDirective.js b/client/directives/environment/environmentBody/serverCards/serverCardDirective.js index e23dba236..4c6f2892f 100644 --- a/client/directives/environment/environmentBody/serverCards/serverCardDirective.js +++ b/client/directives/environment/environmentBody/serverCards/serverCardDirective.js @@ -10,7 +10,6 @@ require('app') createServerObjectFromInstance, fetchDockerfileForContextVersion, fetchStackAnalysis, - helpCards, keypather, ModalService, parseDockerfileForCardInfoFromInstance, @@ -23,8 +22,7 @@ require('app') scope: { data: '=', actions: '=', - instance: '=', - helpCard: '=?' + instance: '=' }, link: function ($scope, ele) { var listeners = []; @@ -79,114 +77,11 @@ require('app') return '—'; }; - $scope.helpCards = helpCards; $scope.server = {}; $scope.activeAccount = currentOrg.github; // I'm unsure if this is used. - function scrollIntoView() { - $document.scrollToElement(ele, 100, 200); - } - - function calculateHelpCardsForRepoInstance (instance) { - if (instance.attrs.owner.username !== $state.params.userName) { return; } - // This may be a newInstance... just a placeholder - helpCards.removeByInstance(instance); - - var fullRepoName = keypather.get($scope.server.instance, 'contextVersion.getMainAppCodeVersion().attrs.repo'); - - return $q.all({ - stackAnalysis: fetchStackAnalysis(fullRepoName), - dependencies: promisify(instance, 'fetchDependencies', true)() - }) - .then(function (res) { - var stackAnalysis = res.stackAnalysis; - var dependencies = res.dependencies; - if (!stackAnalysis.serviceDependencies) { return; } - - stackAnalysis.serviceDependencies.forEach(function (dependency) { - var matchedInstance = $scope.data.instances.find(function (instance) { - return instance.attrs.lowerName === dependency; - }); - if (matchedInstance) { - var matchedDependency = dependencies.find(function (dep) { - return dep.attrs.shortHash === matchedInstance.attrs.shortHash; - }); - if (matchedDependency) { return; } - return helpCards.triggerCard('missingAssociation', { - instance: $scope.server.instance, - association: matchedInstance.attrs.name - }) - .then(function (helpCard) { - if (!helpCard) { return; } - addListener(helpCard, 'refresh', calculateHelpCardsForRepoInstance.bind(null, instance)); - addListener(helpCard, 'activate', scrollIntoView); - }).catch(errs.handler); - } - // Missing Dependency - return helpCards.triggerCard('missingDependency', { - instance: $scope.server.instance, - dependency: dependency - }) - .then(function (helpCard) { - if (!helpCard) { return; } - addListener(helpCard, 'refresh', calculateHelpCardsForRepoInstance.bind(null, instance)); - }).catch(errs.handler); - }); - }) - .catch(errs.handler); - } - - function calculateHelpCardsForNonRepoContainers (instance) { - return $q.when($scope.data.instances) - .then(function (instances) { - return $q.all(instances.filter(function (instance) { - return instance !== $scope.server.instance && keypather.get(instance, 'attrs._id'); - }) - .map(function (instance) { - if (keypather.get(instance, 'dependencies.models.length')) { - return $q.when(instance.dependencies); - } - return promisify(instance, 'fetchDependencies')(); - })); - }) - .then(function (dependencyList) { - return dependencyList.find(function (depList) { - return depList.find(function (dep) { - return dep.attrs.name === $scope.server.instance.attrs.name; - }); - }); - }) - .then(function (foundMatch) { - if (foundMatch) { return; } - var foundInstanceWithMainACV = $scope.data.instances.find(function (instance) { - return keypather.get(instance, 'contextVersion.getMainAppCodeVersion()'); - }); - if (!foundInstanceWithMainACV) { return; } - if (instance.attrs.owner.username !== $state.params.userName) { return; } - return helpCards.triggerCard('missingMapping', { - mapping: $scope.server.instance.attrs.name - }) - .then(function (helpCard) { - if (!helpCard) { return; } - addListener(helpCard, 'refresh', calculateHelpCardsForNonRepoContainers.bind(null, instance)); - }) - .catch(errs.handler); - }); - } - - function addListener (helpCard, name, cb) { - listeners.push({ - obj: helpCard, - key: name, - value: cb - }); - helpCard - .on(name, cb); - } - function handleNewInstanceUpdate (instance) { // This may be a newInstance... just a placeholder - helpCards.removeByInstance(instance); angular.extend($scope.server, createServerObjectFromInstance(instance)); if (!instance.contextVersion) { return; } @@ -201,11 +96,6 @@ require('app') } $scope.server.building = false; - var fullRepoName = keypather.get($scope.server.instance, 'contextVersion.getMainAppCodeVersion().attrs.repo'); - if (fullRepoName) { - return calculateHelpCardsForRepoInstance(instance); - } - return calculateHelpCardsForNonRepoContainers(instance); } $scope.$watchCollection('instance.attrs', function (n) { @@ -267,7 +157,6 @@ require('app') listeners.forEach(function (watcher) { watcher.obj.removeListener(watcher.key, watcher.value); }); - helpCards.removeByInstance($scope.server.instance); }); } }; diff --git a/client/directives/environment/environmentBody/serverCards/serverCardView.jade b/client/directives/environment/environmentBody/serverCards/serverCardView.jade index 52f11cbb6..293ef7468 100644 --- a/client/directives/environment/environmentBody/serverCards/serverCardView.jade +++ b/client/directives/environment/environmentBody/serverCards/serverCardView.jade @@ -29,7 +29,6 @@ ul.card-body.load( //- repository li.btn.white( ng-click = "openEditServerModal('repository')" - ng-class = "{'btn-hint': helpCards.cardIsActiveOnThisContainer(instance) && helpCards.getActiveCard().targets.repository}" ng-if = "server.repo && !server.advanced" ) svg.iconnables @@ -47,7 +46,6 @@ ul.card-body.load( //- commands li.btn.white( ng-click = "openEditServerModal('commands')" - ng-class = "{'btn-hint': helpCards.cardIsActiveOnThisContainer(instance) && helpCards.getActiveCard().targets.commands}" ng-if = "server.repo && !server.advanced" ) svg.iconnables @@ -65,7 +63,6 @@ ul.card-body.load( //- exposed ports li.btn.white( ng-click = "openEditServerModal('ports')" - ng-class = "{'btn-hint': helpCards.cardIsActiveOnThisContainer(instance) && helpCards.getActiveCard().targets.exposedPorts}" ng-if = "server.repo && !server.advanced" ) svg.iconnables @@ -82,7 +79,6 @@ ul.card-body.load( li.btn.white( ng-click = "openEditServerModal('env')" ng-class = "{\ - 'btn-hint': helpCards.cardIsActiveOnThisContainer(instance) && helpCards.getActiveCard().targets.environmentVariables,\ 'active-notification': $root.featureFlags.hostnameNotifications\ }" ) @@ -103,7 +99,6 @@ ul.card-body.load( //- container files li.btn.white( ng-click = "openEditServerModal('files')" - ng-class = "{'btn-hint': helpCards.cardIsActiveOnThisContainer(instance) && helpCards.getActiveCard().targets.containerFiles}" ng-if = "server.repo && !server.advanced" ) svg.iconnables @@ -119,7 +114,6 @@ ul.card-body.load( //- find & replace li.btn.white( ng-click = "openEditServerModal('translation')" - ng-class = "{'btn-hint': helpCards.cardIsActiveOnThisContainer(instance) && helpCards.getActiveCard().targets.findAndReplace}" ng-if = "\ server.repo && \ !server.instance.hasDockerfileMirroring() \ diff --git a/client/directives/environment/environmentBody/serverStatusCardHeaderDirective.js b/client/directives/environment/environmentBody/serverStatusCardHeaderDirective.js index 0e95f885b..66706a7ed 100644 --- a/client/directives/environment/environmentBody/serverStatusCardHeaderDirective.js +++ b/client/directives/environment/environmentBody/serverStatusCardHeaderDirective.js @@ -8,7 +8,6 @@ require('app') function serverStatusCardHeader( $rootScope, errs, - helpCards, ModalService, promisify ) { @@ -63,7 +62,6 @@ function serverStatusCardHeader( }); }) .catch(errs.handler); - helpCards.refreshAllCards(); } return confirmed; }); diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index b937d95ae..3a07bc9e1 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -21,7 +21,6 @@ .card.gray.disabled.load( actions = "actions" data = "data" - help-card = "state.helpCard" instance = "instance" ng-class = "{\ 'deprecated': !$root.featureFlags.cardStatus,\ diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 041a3a3be..5fa1abec6 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -14,13 +14,11 @@ function EnvironmentController( $scope, $state, $timeout, - $window, favico, fetchUser, fetchDockerfileForContextVersion, fetchInstancesByPod, fetchOrgMembers, - helpCards, keypather, ModalService, pageName @@ -82,9 +80,7 @@ function EnvironmentController( $scope.$state = $state; favico.reset(); pageName.setTitle('Configure - Runnable'); - $scope.data = { - helpCards: helpCards - }; + $scope.data = {}; fetchInstancesByPod($state.userName) .then(function (instancesCollection) { $scope.data.instances = instancesCollection; @@ -105,41 +101,11 @@ function EnvironmentController( validation: { env: {} }, - helpCard: null, newServerButton: { active: false } }; - $scope.help = helpCards.cards; - $scope.helpCards = helpCards; - - helpCards.clearAllCards(); - - $scope.helpUndock = false; - - var scrollHelper = function () { - var newVal = false; - if ($window.scrollY > 60) { - newVal = true; - } - if ($scope.helpUndock !== newVal) { - $scope.helpUndock = newVal; - $timeout(angular.noop); - } - }; - $scope.$on('helpCardScroll:enable', function () { - $window.addEventListener('scroll', scrollHelper); - scrollHelper(); - }); - $scope.$on('helpCardScroll:disable', function () { - $window.removeEventListener('scroll', scrollHelper); - }); - - $scope.$on('$destroy', function () { - $window.removeEventListener('scroll', scrollHelper); - }); - EC.alert = null; $scope.$on('alert', function (evt, data) { @@ -169,17 +135,4 @@ function EnvironmentController( } }; - $scope.helpPopover = { - data: $scope.help, - actions: { - ignoreHelp: function (help) { - helpCards.ignoreCard(help); - }, - getHelp: function (help) { - helpCards.setActiveCard(help); - $rootScope.$broadcast('close-popovers'); - } - } - }; - } diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index cfcdc11f8..0fe3b35d6 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -1,57 +1,6 @@ -button.grid-block.shrink.btn.btn-md.btn-icon.btn-help( - data-badge-count = "{{helpCards.cards.triggered.length}}" - ng-class = "{\ - 'active': state.helpButton.active || !state.helpButton.active && helpCards.cards.triggered.length > 0 && !helpCards.getActiveCard(),\ - 'badge': helpCards.cards.triggered.length > 0,\ - 'badge-blue': helpCards.cards.triggered.length > 0\ - }" - ng-click = "state.helpButton.active = true" - ng-if = "!$root.featureFlags.aha" - pop-over - pop-over-actions = "helpPopover.actions" - pop-over-active = "state.helpButton.active" - pop-over-data = "helpPopover.data" - pop-over-options = "{\"left\":60}" - pop-over-template = "viewHelpPopover" - pop-over-trigger = "activeAttr" - title = "Help Center" -) - svg.iconnables - use( - xlink:href = "#icons-help" - ) - -.help.help-top-card( - ng-if = "!state.helpButton.active && helpCards.cards.triggered.length > 0 && !helpCards.getActiveCard()" -) - .help-lists-wrapper - ul.triggered-help-list - li.grid-block.triggered-help-item.clearfix - button.btn.btn-icon.btn-icon-xs( - ng-click = "helpPopover.actions.ignoreHelp(helpCards.cards.triggered[0])" - ) - svg.iconnables - use( - xlink:href = "#icons-close" - ) - p.p.grid-content( - ng-bind-html = "helpCards.cards.triggered[0].label" - ) - button.btn.btn-xs.blue.grid-content.shrink( - ng-click = "helpPopover.actions.getHelp(helpCards.cards.triggered[0])" - ) Show Me - button.btn( - ng-click = "state.helpButton.active = true" - ) More Help - svg.iconnables - use( - xlink:href = "#icons-arrow-down" - ) - //- new server button button.grid-block.shrink.btn.btn-md.green( ng-class = "{\ - 'scale': helpCards.getActiveCard().targets.newContainer,\ 'scale-in-modal': $root.featureFlags.aha1\ }" ng-click = "EC.triggerModal.newContainer()" diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 8a4811304..8e0e11ba8 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -64,40 +64,6 @@ .grid-block.environment-body.justify-center.clearfix( ng-class = "{'align-center justify-center': $root.featureFlags.aha1}" ) - .help-container( - ng-class = "{\ - 'fixed': helpUndock,\ - 'top': helpUndock\ - }" - ng-if = "helpCards.getActiveCard() && !$root.featureFlags.aha" - ) - .help( - ng-if = "helpCards.getActiveCard().targets.newContainer && state.newServerButton.active" - ) - button.btn.btn-xs.btn-icon( - ng-click = "helpCards.hideActiveCard()" - ) - svg.iconnables.icons-close - use( - xlink:href = "#icons-close" - ) - span( - ng-bind-html = "helpCards.getActiveCard().helpPopover.newContainer" - ) - .help( - ng-if = "!(helpCards.getActiveCard().targets.newContainer && state.newServerButton.active)" - ) - button.btn.btn-xs.btn-icon( - ng-click = "helpCards.hideActiveCard()" - ) - svg.iconnables.icons-close - use( - xlink:href = "#icons-close" - ) - span( - ng-bind-html = "helpCards.getActiveCard().helpTop" - ) - .modal-dialog.modal-sm( ng-if = "$root.featureFlags.aha1 && !$root.featureFlags.ahaOverview" ) @@ -110,7 +76,6 @@ ) .grid-block.card-grid.clearfix( - ng-class = "{'padding-top': helpCards.getActiveCard().helpTop}" ng-if = "!$root.featureFlags.aha1" ng-include = "'viewCardGrid'" ) diff --git a/client/directives/environment/modals/forms/formBuildfiles/viewFormBuildfiles.jade b/client/directives/environment/modals/forms/formBuildfiles/viewFormBuildfiles.jade index 7d6a9647d..e1afecb78 100644 --- a/client/directives/environment/modals/forms/formBuildfiles/viewFormBuildfiles.jade +++ b/client/directives/environment/modals/forms/formBuildfiles/viewFormBuildfiles.jade @@ -1,18 +1,3 @@ -.help-container( - ng-if = "SMC.helpCards.getActiveCard().helpPopover.containerFiles" -) - .help - button.btn.btn-xs.btn-icon( - ng-click = "SMC.helpCards.hideActiveCard()" - ) - svg.iconnables.icons-close - use( - xlink:href = "#icons-close" - ) - span( - ng-bind-html = "SMC.helpCards.getActiveCard().helpPopover.containerFiles" - ) - .grid-block.shrink.align-center.well.well-600.gray.can-disable.padding-sm( ng-if = "!SMC.state.advanced" ) diff --git a/client/directives/environment/modals/forms/formEnvironmentVariables/viewFormEnvironmentVariables.jade b/client/directives/environment/modals/forms/formEnvironmentVariables/viewFormEnvironmentVariables.jade index 78e5aeb28..b3d9f8211 100644 --- a/client/directives/environment/modals/forms/formEnvironmentVariables/viewFormEnvironmentVariables.jade +++ b/client/directives/environment/modals/forms/formEnvironmentVariables/viewFormEnvironmentVariables.jade @@ -1,20 +1,3 @@ -//- help things -.help-container( - ng-if = "SMC.helpCards.getActiveCard().helpPopover.environmentVariables && SMC.helpCards.cardIsActiveOnThisContainer(SMC.instance)" - ng-hide = "$root.featureFlags.fullScreen" -) - .help - button.btn.btn-xs.btn-icon( - ng-click = "SMC.helpCards.hideActiveCard()" - ) - svg.iconnables.icons-close - use( - xlink:href = "#icons-close" - ) - span( - ng-bind-html = "SMC.helpCards.getActiveCard().helpPopover.environmentVariables" - ) - //- begin form .label-description.clearfix( ng-hide = "$root.featureFlags.fullScreen" diff --git a/client/directives/environment/modals/forms/formFiles/viewFormFiles.jade b/client/directives/environment/modals/forms/formFiles/viewFormFiles.jade index e7dca402c..85d5de481 100644 --- a/client/directives/environment/modals/forms/formFiles/viewFormFiles.jade +++ b/client/directives/environment/modals/forms/formFiles/viewFormFiles.jade @@ -1,18 +1,3 @@ -.help-container( - ng-if = "SMC.helpCards.getActiveCard().helpPopover.containerFiles && SMC.helpCards.cardIsActiveOnThisContainer(SMC.instance)" -) - .help - button.btn.btn-xs.btn-icon( - ng-click = "SMC.helpCards.hideActiveCard()" - ) - svg.iconnables.icons-close - use( - xlink:href = "#icons-close" - ) - span( - ng-bind-html = "SMC.helpCards.getActiveCard().helpPopover.containerFiles" - ) - .ng-hide( pop-over pop-over-actions = "CFC.repositoryPopover.actions" diff --git a/client/directives/environment/modals/forms/formRepository/repositoryFormDirective.js b/client/directives/environment/modals/forms/formRepository/repositoryFormDirective.js index 09f20e7f4..426353d3c 100644 --- a/client/directives/environment/modals/forms/formRepository/repositoryFormDirective.js +++ b/client/directives/environment/modals/forms/formRepository/repositoryFormDirective.js @@ -9,8 +9,7 @@ require('app') updateDockerfileFromState, parseDockerfileForDefaults, report, - watchOncePromise, - helpCards + watchOncePromise ) { return { restrict: 'A', @@ -23,7 +22,6 @@ require('app') startCommandCanDisable: '=?' }, link: function ($scope, element, attrs) { - $scope.helpCards = helpCards; $scope.data = { }; watchOncePromise($scope, 'state.containerFiles', true) .then(function (containerFiles) { diff --git a/client/directives/environment/modals/forms/formRepository/viewFormRepository.jade b/client/directives/environment/modals/forms/formRepository/viewFormRepository.jade index 0730a1cc7..b5993cb03 100644 --- a/client/directives/environment/modals/forms/formRepository/viewFormRepository.jade +++ b/client/directives/environment/modals/forms/formRepository/viewFormRepository.jade @@ -1,18 +1,3 @@ -.help-container( - ng-if = "helpCards.getActiveCard().helpPopover.repositories" -) - .help - button.btn.btn-xs.btn-icon( - ng-click = "helpCards.hideActiveCard()" - ) - svg.iconnables.icons-close - use( - xlink:href = "#icons-close" - ) - span( - ng-bind-html = "helpCards.getActiveCard().helpPopover.repositories" - ) - label.label.clearfix .label-col Packages small.small (optional) diff --git a/client/directives/environment/modals/forms/formTranslation/translationRulesDirective.js b/client/directives/environment/modals/forms/formTranslation/translationRulesDirective.js index ec546ff61..602af3822 100644 --- a/client/directives/environment/modals/forms/formTranslation/translationRulesDirective.js +++ b/client/directives/environment/modals/forms/formTranslation/translationRulesDirective.js @@ -7,8 +7,7 @@ require('app') parseDiffResponse, promisify, testAllTransformRules, - $document, - helpCards + $document ) { return { restrict: 'A', @@ -19,7 +18,6 @@ require('app') data: '=?' }, link: function ($scope, elem, attrs) { - $scope.helpCards = helpCards; $scope.$watch('state.contextVersion', function (contextVersion) { if (contextVersion && (keypather.get(contextVersion, 'getMainAppCodeVersion().attrs.transformRules.replace.length') || diff --git a/client/directives/environment/modals/forms/formTranslation/viewFormTranslation.jade b/client/directives/environment/modals/forms/formTranslation/viewFormTranslation.jade index 3fd69d1ec..69b054251 100644 --- a/client/directives/environment/modals/forms/formTranslation/viewFormTranslation.jade +++ b/client/directives/environment/modals/forms/formTranslation/viewFormTranslation.jade @@ -1,18 +1,3 @@ -.help-container( - ng-if = "helpCards.getActiveCard().helpPopover.findAndReplace && helpCards.cardIsActiveOnThisContainer(instance)" -) - .help - button.btn.btn-xs.btn-icon( - ng-click = "helpCards.hideActiveCard()" - ) - svg.iconnables.icons-close - use( - xlink:href = "#icons-close" - ) - span( - ng-bind-html = "helpCards.getActiveCard().helpPopover.findAndReplace" - ) - .btn-group.btn-toggle.btn-toggle-xs( ng-init = "page = 'rules'" ) diff --git a/client/directives/environment/modals/modalEditServer/editServerModalController.js b/client/directives/environment/modals/modalEditServer/editServerModalController.js index 17b70323f..858490714 100644 --- a/client/directives/environment/modals/modalEditServer/editServerModalController.js +++ b/client/directives/environment/modals/modalEditServer/editServerModalController.js @@ -12,7 +12,6 @@ function EditServerModalController( cleanStartCommand, errs, fetchInstancesByPod, - helpCards, instance, isTabNameValid, keypather, @@ -24,7 +23,6 @@ function EditServerModalController( close ) { var SMC = this; - SMC.helpCards = helpCards; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 7ef90175e..c2bc3c94f 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -10,20 +10,15 @@ function SetupMirrorServerModalController( $rootScope, cardInfoTypes, createAndBuildNewContainer, - createBuildFromContextVersionId, errs, eventTracking, - fetchUser, - helpCards, isTabNameValid, keypather, loading, loadingPromises, - ModalService, promisify, OpenItems, TAB_VISIBILITY, - updateDockerfileFromState, close, instanceName, repo, @@ -31,7 +26,6 @@ function SetupMirrorServerModalController( masterBranch ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) - SMC.helpCards = helpCards; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index ede9b33f4..a41d8cfb7 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -16,7 +16,6 @@ function SetupServerModalController( errs, eventTracking, fetchDockerfileFromSource, - helpCards, isTabNameValid, keypather, loading, @@ -32,7 +31,6 @@ function SetupServerModalController( masterBranch ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) - SMC.helpCards = helpCards; var blankDockerfile = false; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 5570ed570..e830294c4 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -12,8 +12,6 @@ function ServerModalController( errs, eventTracking, fetchDockerfileForContextVersion, - hasKeypaths, - helpCards, keypather, ModalService, loading, @@ -341,7 +339,6 @@ function ServerModalController( $rootScope.$broadcast('close-popovers'); return SMC.rebuildAndOrRedeploy() .then(function () { - helpCards.refreshActiveCard(); $rootScope.$broadcast('alert', { type: 'success', text: 'Changes Saved' @@ -503,8 +500,8 @@ function ServerModalController( }; /** - * Updates the this.instance with all the states, emits the Changes Saved alert, and refreshes the - * help cards. If a failure occurs, the cv is reset, and the error propagates. + * Updates the this.instance with all the states, emits the Changes Saved alert. + * If a failure occurs, the cv is reset, and the error propagates. * @returns {Promise} Resolves when the instance update has been started, and the cv has been * reset. The error is uncaught, so a catch should be added to this */ diff --git a/client/directives/environment/modals/setupTemplate/setupTemplateModalController.js b/client/directives/environment/modals/setupTemplate/setupTemplateModalController.js index caebf20a0..076b8b7f4 100644 --- a/client/directives/environment/modals/setupTemplate/setupTemplateModalController.js +++ b/client/directives/environment/modals/setupTemplate/setupTemplateModalController.js @@ -15,7 +15,6 @@ function SetupTemplateModalController( fetchInstances, getNewForkName, promisify, - helpCards, ModalService, close, isolation @@ -26,7 +25,6 @@ function SetupTemplateModalController( STMC.templateServers = servers; }) .catch(errs.handler); - STMC.helpCard = helpCards.getActiveCard(); STMC.close = close; STMC.addServerFromTemplate = function (sourceInstance) { var instancesPromise = null; diff --git a/client/directives/help/viewHelpPopover.jade b/client/directives/help/viewHelpPopover.jade deleted file mode 100644 index ace638f94..000000000 --- a/client/directives/help/viewHelpPopover.jade +++ /dev/null @@ -1,68 +0,0 @@ -.popover.help( - ng-class = "{'in': active}" - ng-style = "popoverStyle.getStyle()" -) - .help-lists-wrapper - ul.triggered-help-list - li.grid-block.triggered-help-item.clearfix( - ng-repeat = "helpItem in data.triggered" - ) - button.btn.btn-icon.btn-icon-xs( - ng-click = "actions.ignoreHelp(helpItem)" - ) - svg.iconnables - use( - xlink:href = "#icons-close" - ) - p.p.grid-content( - ng-bind-html= "helpItem.label" - ) - button.btn.btn-xs.blue.grid-content.shrink( - ng-click = "actions.getHelp(helpItem)" - ) Show Me - .general-help-container - .strong General Help - ul.general-help-list - li.general-help-item( - ng-repeat = "helpItem in data.general" - ng-hide = "!showMore && $index > 5" - ng-click = "actions.getHelp(helpItem)" - ng-bind-html= "helpItem.label" - ) - li.general-help-item - a.link( - target = "_blank" - href = "http://www.youtube.com/watch?v=_uwPKIH990E" - ) View our Getting Started video - svg.iconnables.icons-link-external - use( - xlink:href = "#icons-link-external" - ) - li.general-help-item - a.link( - target = "_blank" - href = "https://runnable.zendesk.com/hc/en-us/articles/205184275-How-can-containers-in-my-Runnable-Sandbox-communicate-with-each-other-" - ) Connect two templates together - svg.iconnables.icons-link-external - use( - xlink:href = "#icons-link-external" - ) - - button.btn( - ng-click = "POC.closePopover()" - ) - svg.iconnables( - ng-if = '!data.triggered.length' - ) - use( - xlink:href = "#icons-close" - ) - - | {{data.triggered.length ? 'Less Help' : 'Close'}} - - svg.iconnables( - ng-if = 'data.triggered.length' - ) - use( - xlink:href = "#icons-arrow-down" - ) diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index 6a3c82ea8..3252086cb 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -14,7 +14,6 @@ function NewContainerModalController( fetchOwnerRepos, fetchRepoDockerfiles, getNewForkName, - helpCards, keypather, loading, ModalService, @@ -22,10 +21,8 @@ function NewContainerModalController( currentOrg ) { var NCMC = this; - var helpCard = helpCards.getActiveCard(); angular.extend(NCMC, { name: 'newContainerModal', - servicesActive: keypather.get(helpCard, 'id') === 'missingDependency', state: { tabName: 'repos', dockerfile: null, diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 812e297fe..c8b5fc7cc 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -32,7 +32,6 @@ ng-disabled = "$root.isLoading[MC.name + 'SingleRepo']" ng-class = "{\ 'active': MC.state.tabName === 'services', \ - 'btn-hint': MC.servicesActive, \ 'disabled': $root.isLoading[MC.name + 'SingleRepo'] \ }" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && MC.changeTab('services')" diff --git a/client/services/createAndBuildNewContainerService.js b/client/services/createAndBuildNewContainerService.js index af03c678a..80d36558b 100644 --- a/client/services/createAndBuildNewContainerService.js +++ b/client/services/createAndBuildNewContainerService.js @@ -19,8 +19,7 @@ function createAndBuildNewContainer( eventTracking, fetchInstancesByPod, fetchPlan, - fetchUser, - helpCards + fetchUser ) { return function (createPromiseForState, containerName, options) { options = options || {}; @@ -51,7 +50,6 @@ function createAndBuildNewContainer( return $q.when(createPromiseForState); }) .then(function (newServerModel) { - helpCards.hideActiveCard(); if (options.isolation) { newServerModel.opts.isIsolationGroupMaster = false; newServerModel.opts.isolated = options.isolation.id(); @@ -78,7 +76,6 @@ function createAndBuildNewContainer( }); }) .then(function (instance) { - helpCards.refreshAllCards(); return instance; }) .catch(function (err) { diff --git a/client/services/serviceHelpCards.js b/client/services/serviceHelpCards.js deleted file mode 100644 index 3fadb0902..000000000 --- a/client/services/serviceHelpCards.js +++ /dev/null @@ -1,312 +0,0 @@ -'use strict'; -var EventEmitter = require('events').EventEmitter; - -require('app') - .factory('helpCards', helpCardsFactory); - -function helpCardsFactory( - $interpolate, - $q, - keypather, - fetchSettings, - errs, - promisify, - $rootScope, - jsonHash -) { - -//POSSIBLE TARGETS: -//repository -//exposedPorts -//environmentVariables -//commands -//containerFiles -//findAndReplace -//newContainer -//buildCommand - var helpCards = { - 'general': [ - { - label: 'Connect to an external service', - targets: [ - 'environmentVariables', - 'findAndReplace' - ], - helpTop: 'Use Environment Variables or Find and Replace to connect to a service.', - helpPopover: { - 'environmentVariables': 'Add or update an environment variable to reference your external service.', - 'findAndReplace': 'Create a new string rule to connect to your external service.' - } - }, - { - label: 'Connect to an OAuth service', - targets: [ - 'environmentVariables', - 'findAndReplace' - ], - helpTop: 'Use Environment Variables or Find and Replace to update your OAuth credentials.', - helpPopover: { - 'environmentVariables': 'Add or update the environment variables for your OAuth credentials.', - 'findAndReplace': 'Add a string rule to update your OAuth credentials in your code.' - } - }, - { - label: 'Add a library', - targets: [ - 'commands', - ], - helpTop: 'Use Commands and Packages to add a library.', - }, - { - label: 'Seed a database', - targets: ['containerFiles'], - helpTop: 'Use Files & SSH Keys to upload seed data and import it using scripts.', - helpPopover: { - 'containerFiles': 'Click Upload File to select and upload your seed file. Then enter the scripts you need to import the data.' - } - } - ], - 'triggered': [ - // when we detect that one existing container depends on service for which there is no existing container - { - id: 'missingDependency', - label: '{{instance.getDisplayName()}} may need a {{dependency}} container.', - targets: [ - 'newContainer' - ], - helpTop: 'Click on the New Container button to add a {{dependency}} container.', - helpPopover: { - 'newContainer': 'Click Non-repository to add a {{dependency}} container.' - } - }, - // when we detect that one existing container depends on another existing contianer - { - id: 'missingAssociation', - label: 'You may need to connect {{instance.getDisplayName()}} to {{association}}.', - targets: [ - 'environmentVariables', - 'findAndReplace' - ], - helpTop: 'Use Environment Variables or Find and Replace to connect {{instance.getDisplayName()}} to {{association}}.', - helpPopover: { - 'environmentVariables': 'Connect to {{association}} by using its URL in an environment variable.', - 'findAndReplace': 'Connect to {{association}} by adding a string rule with its URL.' - } - }, - // when the user adds a non-repo container, but we can't detect which containers depend on it - { - id: 'missingMapping', - label: 'You may need to connect some repository containers to {{mapping}}.', - targets: [ - 'environmentVariables', - 'findAndReplace' - ], - helpTop: 'Use Environment Variables or Find and Replace to connect one or more of your repository containers to {{mapping}}.', - helpPopover: { - environmentVariables: 'Connect to {{mapping}} by using its URL in an environment variable.', - findAndReplace: 'Connect to {{mapping}} by adding a string rule with its URL.' - }, - highlightRepoContainers: true - } - ] - }; - - - - var HelpCard = function (config) { - var self = this; - Object.keys(config).forEach(function (key) { - self[key] = config[key]; - }); - - var cardClone = { - id: this.id, - type: this.type, - data: {} - }; - if (this.data && this.data.instance && this.data.instance.attrs) { - cardClone.data = { instance: this.data.instance.attrs.shortHash }; - } - - if (this.data) { - Object.keys(this.data).forEach(function (key) { - if (key !== 'instance') { - cardClone.data[key] = self.data[key]; - } - }); - } - this.hash = jsonHash.digest(cardClone); - }; - - HelpCard.prototype = Object.create(EventEmitter.prototype); - - helpCards.general = helpCards.general.map(function (cardConfig) { - cardConfig.type = 'general'; - var card = new HelpCard(cardConfig); - var targetHash = {}; - card.targets.forEach(function (target) { - if (keypather.get($rootScope, 'featureFlags.' + target) !== false) { - targetHash[target] = true; - } - }); - card.targets = targetHash; - return card; - }); - - var triggeredHash = {}; - helpCards.triggered.forEach(function (cardConfig) { - cardConfig.type = 'triggered'; - var card = new HelpCard(cardConfig); - var targetHash = {}; - card.targets.forEach(function (target) { - if (keypather.get($rootScope, 'featureFlags.' + target) !== false) { - targetHash[target] = true; - } - }); - card.targets = targetHash; - triggeredHash[card.id] = card; - }); - - helpCards.triggered = triggeredHash; - - - var currentCardHash = {}; - var activeCard = null; - var helpCardManager = { - cards: { - general: helpCards.general, - triggered: [] - }, - getActiveCard: function () { - return activeCard; - }, - setActiveCard: function (newCard) { - if (activeCard && activeCard !== newCard) { - activeCard.emit('deactivate'); - } - - if (newCard) { - newCard.emit('activate'); - $rootScope.$broadcast('helpCardScroll:enable'); - } else { - $rootScope.$broadcast('helpCardScroll:disable'); - } - - activeCard = newCard; - }, - clearAllCards: function () { - this.cards.triggered = []; - currentCardHash = {}; - activeCard = null; - }, - hideActiveCard: function () { - if (this.getActiveCard()) { - var helpCard = this.getActiveCard(); - currentCardHash[helpCard.hash] = null; - this.setActiveCard(null); - var index = this.cards.triggered.indexOf(helpCard); - this.cards.triggered.splice(index, 1); - } - }, - refreshActiveCard: function () { - if (this.getActiveCard()) { - this.getActiveCard().emit('refresh'); - this.setActiveCard(null); - } - }, - refreshAllCards: function () { - this.cards.triggered.forEach(function (card) { - if (!card.removed) { - card.emit('refresh'); - } - }); - currentCardHash = {}; - this.cards.triggered = []; - this.setActiveCard(null); - }, - cardIsActiveOnThisContainer: function (container) { - activeCard = this.getActiveCard(); - - return activeCard && - ( - activeCard.type === 'general' || - angular.equals(container, keypather.get(activeCard, 'data.instance')) || - ( activeCard.highlightRepoContainers && container.contextVersion.getMainAppCodeVersion() ) - ); - }, - removeByInstance: function (instance) { - this.cards.triggered - .filter(function (card) { - return keypather.get(card, 'data.instance.attrs.shortHash') === instance.attrs.shortHash; - }) - .forEach(function (card) { - if (!card.removed) { - card.emit('remove'); - } - }); - }, - triggerCard: function (cardId, data) { - var self = this; - return fetchSettings().then(function (settings) { - var ignoredHelpCards = settings.attrs.ignoredHelpCards || []; - - var cardConfig = helpCards.triggered[cardId]; - if (!cardConfig) { - throw new Error('Attempt to create a help card with invalid ID.'); - } - cardConfig = angular.copy(cardConfig); - - - cardConfig.label = $interpolate(cardConfig.label)(data); - cardConfig.helpTop = $interpolate(cardConfig.helpTop)(data); - Object.keys(cardConfig.helpPopover).forEach(function (key) { - cardConfig.helpPopover[key] = $interpolate(cardConfig.helpPopover[key])(data); - }); - - cardConfig.data = data; - - var helpCard = new HelpCard(cardConfig); - - if (!currentCardHash[helpCard.hash] && ignoredHelpCards.indexOf(helpCard.hash) === -1) { - self.cards.triggered.unshift(helpCard); - currentCardHash[helpCard.hash] = helpCard; - helpCard.on('remove', function () { - if (self.getActiveCard() === helpCard) { - self.setActiveCard(null); - } - helpCard.removed = true; - var index = self.cards.triggered.indexOf(helpCard); - self.cards.triggered.splice(index, 1); - currentCardHash[helpCard.hash] = null; - }); - helpCard.on('refresh', function () { - if (!helpCard.removed) { - helpCard.emit('remove'); - } - }); - } - return $q.when(currentCardHash[helpCard.hash]); - }) - .catch(errs.handler); - }, - ignoreCard: function (card) { - var index = this.cards.triggered.indexOf(card); - this.cards.triggered.splice(index, 1); - if (this.getActiveCard() === card) { - this.setActiveCard(null); - } - fetchSettings().then(function (settings) { - var ignoredHelpCards = settings.attrs.ignoredHelpCards || []; - ignoredHelpCards.push(card.hash); - - return promisify(settings, 'update')({ - json: { - ignoredHelpCards: ignoredHelpCards - } - }); - }) - .catch(errs.handler); - } - }; - return helpCardManager; -} From f0e174b299a83649a5963d91c6a4f4418a96a359 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 7 Sep 2016 14:54:11 -0700 Subject: [PATCH 216/577] actually add external link icon --- .../components/gitHubIntegration/githubIntegrationView.jade | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index 75464761e..831560b15 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -24,6 +24,10 @@ a.grid-content.shrink.btn.btn-md.green( ng-if = "$root.isLoading.addRunnabot" ng-include = "'spinner'" ) + svg.iconnables.icons-link-external + use( + xlink:href = "#icons-link-external" + ) //- show after successfully inviting runnabot .grid-block.align-center.shrink.runnabot-success( From 360bab702816c54c79e5186058f8afbd8153c6e8 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 14:54:26 -0700 Subject: [PATCH 217/577] Removed help cards tests. --- test/unit/apiMocks/HelpCardServiceMock.js | 30 -- .../editServerModalController.unit.js | 28 +- .../controllers/serverModalController.unit.js | 6 +- .../setupMirrorServerModalController.unit.js | 6 - .../setupServerModalController.unit.js | 5 - .../newContainerModalController.unit.js | 5 - .../environment/serverCardDirective.unit.js | 300 +----------------- .../serverStatusCardHeaderDirective.unit.js | 1 - test/unit/globals.js | 1 - .../createAndBuildNewContainerService.unit.js | 8 - test/unit/services/serviceOpenItems.unit.js | 2 +- 11 files changed, 4 insertions(+), 388 deletions(-) delete mode 100644 test/unit/apiMocks/HelpCardServiceMock.js diff --git a/test/unit/apiMocks/HelpCardServiceMock.js b/test/unit/apiMocks/HelpCardServiceMock.js deleted file mode 100644 index 07675e85e..000000000 --- a/test/unit/apiMocks/HelpCardServiceMock.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; - -var EventEmitter = require('events').EventEmitter; -var HelpCard = function () {}; -HelpCard.prototype = Object.create(EventEmitter.prototype); - -module.exports = { - create: function (ctx) { - return function ($q) { - var helpCards = { - getActiveCard: sinon.stub(), - setActiveCard: sinon.stub(), - clearAllCards: sinon.stub(), - hideActiveCard: sinon.stub(), - refreshActiveCard: sinon.stub(), - refreshAllCards: sinon.stub(), - cardIsActiveOnThisContainer: sinon.stub(), - triggerCard: sinon.stub().returns($q.when(new HelpCard())), - ignoreCard: sinon.stub(), - removeByInstance: sinon.stub() - }; - helpCards.getActiveCard.returns('abc'); - helpCards.cardIsActiveOnThisContainer.returns(true); - if (ctx) { - ctx.helpCards = helpCards; - } - return helpCards; - }; - } -}; diff --git a/test/unit/controllers/editServerModalController.unit.js b/test/unit/controllers/editServerModalController.unit.js index 1e5092f4b..bed92c804 100644 --- a/test/unit/controllers/editServerModalController.unit.js +++ b/test/unit/controllers/editServerModalController.unit.js @@ -1,4 +1,4 @@ -/*global runnable:true, mocks: true, directiveTemplate: true, xdescribe: true, helpCardsMock */ +/*global runnable:true, mocks: true, directiveTemplate: true, xdescribe: true */ 'use strict'; describe('editServerModalController'.bold.underline.blue, function () { @@ -72,10 +72,6 @@ describe('editServerModalController'.bold.underline.blue, function () { }; angular.mock.module('app', function ($provide) { - $provide.factory('helpCards', function () { - ctx.helpCards = helpCardsMock.create(ctx)($q); - return ctx.helpCards; - }); $provide.factory('fetchUser', mockUserFetch.autoTrigger(ctx.fakeOrg1)); $provide.factory('createBuildFromContextVersionId', function () { ctx.createBuildFromContextVersionId = sinon.stub().returns($q.when(ctx.build)); @@ -387,7 +383,6 @@ describe('editServerModalController'.bold.underline.blue, function () { sinon.assert.called(ctx.loadingPromiseMock.finished); expect(SMC.state.ports).to.be.ok; sinon.assert.notCalled(ctx.build.build); - sinon.assert.calledOnce(ctx.helpCards.refreshActiveCard); sinon.assert.notCalled(ctx.instance.update); sinon.assert.notCalled(ctx.instance.redeploy); }); @@ -412,7 +407,6 @@ describe('editServerModalController'.bold.underline.blue, function () { sinon.assert.called(ctx.loadingPromiseMock.finished); expect(SMC.state.ports).to.be.ok; sinon.assert.calledOnce(ctx.build.build); - sinon.assert.calledOnce(ctx.helpCards.refreshActiveCard); sinon.assert.calledOnce(ctx.instance.update); sinon.assert.notCalled(ctx.instance.redeploy); sinon.assert.called(ctx.loadingPromiseMock.clear); @@ -444,8 +438,6 @@ describe('editServerModalController'.bold.underline.blue, function () { $scope.$digest(); expect(SMC.state.opts.build).to.be.ok; $scope.$digest(); - sinon.assert.calledOnce(ctx.helpCards.refreshActiveCard); - $scope.$digest(); sinon.assert.calledOnce(ctx.instance.update); sinon.assert.notCalled(ctx.instance.redeploy); @@ -477,7 +469,6 @@ describe('editServerModalController'.bold.underline.blue, function () { $scope.$digest(); sinon.assert.calledOnce(ctx.build.build); expect(SMC.state.opts.build).to.be.ok; - sinon.assert.calledOnce(ctx.helpCards.refreshActiveCard); sinon.assert.calledOnce(ctx.instance.update); sinon.assert.notCalled(ctx.instance.redeploy); }); @@ -655,7 +646,6 @@ describe('editServerModalController'.bold.underline.blue, function () { $scope.$digest(); expect(SMC.state.opts.build).to.be.ok; $scope.$digest(); - sinon.assert.calledOnce(ctx.helpCards.refreshActiveCard); $scope.$digest(); sinon.assert.calledOnce(ctx.instance.update); @@ -687,7 +677,6 @@ describe('editServerModalController'.bold.underline.blue, function () { $scope.$digest(); sinon.assert.calledOnce(ctx.build.build); expect(SMC.state.opts.build).to.be.ok; - sinon.assert.calledOnce(ctx.helpCards.refreshActiveCard); sinon.assert.calledOnce(ctx.instance.update); sinon.assert.notCalled(ctx.instance.redeploy); }); @@ -1324,21 +1313,6 @@ describe('editServerModalController'.bold.underline.blue, function () { }); }); - describe('Help Cards', function () { - - beforeEach(function () { - setup({ - currentModel: ctx.instance, - selectedTab: 'env' - }); - }); - - it('should set the help cards to the scope, depending on the instances', function () { - $scope.$digest(); - expect(ctx.helpCards.getActiveCard()).to.equal('abc'); - }); - }); - describe('isTabVisible', function () { beforeEach(function () { setup({ diff --git a/test/unit/controllers/serverModalController.unit.js b/test/unit/controllers/serverModalController.unit.js index e88d19100..8d6bff493 100644 --- a/test/unit/controllers/serverModalController.unit.js +++ b/test/unit/controllers/serverModalController.unit.js @@ -1,4 +1,4 @@ -/*global runnable:true, mocks: true, directiveTemplate: true, xdescribe: true, helpCardsMock */ +/*global runnable:true, mocks: true, directiveTemplate: true, xdescribe: true */ 'use strict'; describe('serverModalController'.bold.underline.blue, function () { @@ -127,10 +127,6 @@ describe('serverModalController'.bold.underline.blue, function () { }; angular.mock.module('app', function ($provide) { - $provide.factory('helpCards', function () { - ctx.helpCards = helpCardsMock.create(ctx)($q); - return ctx.helpCards; - }); $provide.factory('fetchUser', mockUserFetch.autoTrigger(ctx.fakeOrg1)); $provide.factory('createBuildFromContextVersionId', function () { ctx.createBuildFromContextVersionId = sinon.stub().returns($q.when(ctx.build)); diff --git a/test/unit/controllers/setupMirrorServerModalController.unit.js b/test/unit/controllers/setupMirrorServerModalController.unit.js index ddaf30959..59d600f56 100644 --- a/test/unit/controllers/setupMirrorServerModalController.unit.js +++ b/test/unit/controllers/setupMirrorServerModalController.unit.js @@ -40,7 +40,6 @@ describe('setupMirrorServerModalController'.bold.underline.blue, function () { var createNewBuildMock; var fetchOwnerRepoStub; - var fetchUserStub; var fetchStackAnalysisMock; var updateDockerfileFromStateStub; var populateDockerfileStub; @@ -50,7 +49,6 @@ describe('setupMirrorServerModalController'.bold.underline.blue, function () { var showModalStub; var closeModalStub; var createAndBuildNewContainerMock; - var helpCardsMock; var instanceName = 'HelloWorldInstanceName'; var branches; @@ -72,9 +70,6 @@ describe('setupMirrorServerModalController'.bold.underline.blue, function () { opts.build = (opts.build !== undefined) ? opts.build : newBuild; opts.masterBranch = (opts.masterBranch !== undefined) ? opts.masterBranch: branch; - helpCardsMock = { - refreshAllCards: sinon.stub() - }; errsMock = { handler: sinon.spy() }; @@ -89,7 +84,6 @@ describe('setupMirrorServerModalController'.bold.underline.blue, function () { angular.mock.module(function ($provide) { $provide.value('errs', errsMock); $provide.factory('fetchStackAnalysis', fetchStackAnalysisMock.fetch()); - $provide.value('helpCards', helpCardsMock); $provide.factory('fetchUser', mockUserFetch.autoTrigger(org1)); $provide.factory('fetchInstancesByPod', function ($q) { fetchInstancesByPodStub = sinon.stub().returns($q.when(instances)); diff --git a/test/unit/controllers/setupServerModalController.unit.js b/test/unit/controllers/setupServerModalController.unit.js index 0b22b1d77..41d80a153 100644 --- a/test/unit/controllers/setupServerModalController.unit.js +++ b/test/unit/controllers/setupServerModalController.unit.js @@ -47,7 +47,6 @@ describe('setupServerModalController'.bold.underline.blue, function () { var showModalStub; var closeModalStub; var createAndBuildNewContainerMock; - var helpCardsMock; var instanceName = 'instanceName'; var branches; @@ -65,9 +64,6 @@ describe('setupServerModalController'.bold.underline.blue, function () { var mockServerModalController; function initState(opts, replaceSMC, done) { - helpCardsMock = { - refreshAllCards: sinon.stub() - }; errsMock = { handler: sinon.spy() }; @@ -112,7 +108,6 @@ describe('setupServerModalController'.bold.underline.blue, function () { } $provide.value('errs', errsMock); $provide.factory('fetchStackAnalysis', fetchStackAnalysisMock.fetch()); - $provide.value('helpCards', helpCardsMock); $provide.factory('fetchUser', mockUserFetch.autoTrigger(org1)); $provide.factory('fetchInstancesByPod', function ($q) { fetchInstancesByPodStub = sinon.stub().returns($q.when(instances)); diff --git a/test/unit/directives/modals/newContainerModalController.unit.js b/test/unit/directives/modals/newContainerModalController.unit.js index 5847b098c..8fac1f034 100644 --- a/test/unit/directives/modals/newContainerModalController.unit.js +++ b/test/unit/directives/modals/newContainerModalController.unit.js @@ -11,7 +11,6 @@ describe('NewContainerModalController'.bold.underline.blue, function () { var keypather; // Stubs - var helpCardsStub; var errsStub; var createNewBuildAndFetchBranch; var createNonRepoInstanceStub; @@ -33,9 +32,6 @@ describe('NewContainerModalController'.bold.underline.blue, function () { var mockCurrentOrg; function initState () { - helpCardsStub = { - getActiveCard: sinon.stub() - }; errsStub = { handler: sinon.spy() }; @@ -49,7 +45,6 @@ describe('NewContainerModalController'.bold.underline.blue, function () { angular.mock.module('app'); angular.mock.module(function ($provide) { $provide.value('errs', errsStub); - $provide.value('helpCards', helpCardsStub); $provide.factory('fetchInstancesByPod', function ($q) { fetchInstancesByPodStub = sinon.stub().returns($q.when(instances)); return fetchInstancesByPodStub; diff --git a/test/unit/environment/serverCardDirective.unit.js b/test/unit/environment/serverCardDirective.unit.js index 65704b93c..ecdff9696 100644 --- a/test/unit/environment/serverCardDirective.unit.js +++ b/test/unit/environment/serverCardDirective.unit.js @@ -1,4 +1,4 @@ -/*global runnable:true, helpCardsMock:true, directiveTemplate:true */ +/*global runnable:true, directiveTemplate:true */ 'use strict'; describe('serverCardDirective'.bold.underline.blue, function () { @@ -35,7 +35,6 @@ describe('serverCardDirective'.bold.underline.blue, function () { runnable.reset(apiMocks.user); angular.mock.module('app', function ($provide) { $provide.factory('parseDockerfileForCardInfoFromInstance', parseDockMock.fetch()); - $provide.factory('helpCards', helpCardsMock.create(ctx)); $provide.value('$state', mockState); $provide.factory('fetchStackAnalysis', function ($q) { return fetchStackAnalysisMock.returns($q.when(stackAnalysisData)); @@ -276,301 +275,4 @@ describe('serverCardDirective'.bold.underline.blue, function () { expect($elScope.showSpinner(), 'showSpinner').to.not.be.ok; }); }); - - describe('help cards', function () { - describe('Non repo instance', function () { - it('should find a help card a missing dependency to a non repo container', function () { - var instance = runnable.newInstance( - apiMocks.instances.running, - {noStore: true} - ); - instance.attrs.env = ['hello=asdfasd', 'aasdasd=asdasd']; - - instance.fetchDependencies = sinon.spy(function (cb) { - $timeout(cb); - return []; - }); - - var scope = { - data: { - stacks: apiMocks.stackInfo, - instances: [ - instance, - { - contextVersion: { - getMainAppCodeVersion: sinon.stub().returns({}) - }, - fetchDependencies: sinon.spy(function (cb) { - $timeout(cb); - return []; - }) - } - ] - }, - actions: { - iunno: angular.noop - }, - instance: instance - }; - - instance.build = runnable.newBuild( - apiMocks.builds.built, - {noStore: true} - ); - instance.contextVersion = { - getMainAppCodeVersion: sinon.stub().returns({}), - attrs: { - advanced: false, - infraCodeVersion: 'asdasd' - }, - appCodeVersions: { - models: [] - } - }; - setup(scope); - parseDockMock.triggerPromise(null); - $scope.$digest(); - $timeout.flush(); - - sinon.assert.calledOnce(ctx.helpCards.triggerCard); - sinon.assert.calledWith(ctx.helpCards.triggerCard, 'missingMapping', { - mapping: instance.attrs.name - }); - }); - it('should not trigger if there is a dependency that matches', function () { - var instance = runnable.newInstance( - apiMocks.instances.running, - {noStore: true} - ); - - instance.attrs.env = ['hello=asdfasd', 'aasdasd=asdasd']; - - instance.fetchDependencies = sinon.spy(function (cb) { - $timeout(cb); - return []; - }); - - var dependencies = { - models: [ - { - attrs: { - name: instance.attrs.name - } - } - ] - }; - - dependencies.filter = function (fn) { - return dependencies.models.filter(fn); - }; - dependencies.map = function (fn) { - return dependencies.models.map(fn); - }; - dependencies.find = function (fn) { - return dependencies.models.find(fn); - }; - - - var scope = { - data: { - stacks: apiMocks.stackInfo, - instances: [ - instance, - { - dependencies: dependencies - } - ] - }, - actions: { - iunno: angular.noop - }, - instance: instance - }; - - instance.build = runnable.newBuild( - apiMocks.builds.built, - {noStore: true} - ); - instance.contextVersion = { - attrs: { - advanced: false, - infraCodeVersion: 'asdasd' - }, - appCodeVersions: { - models: [] - } - }; - setup(scope); - parseDockMock.triggerPromise(null); - $scope.$digest(); - $timeout.flush(); - - sinon.assert.notCalled(ctx.helpCards.triggerCard); - }); - }); - - describe('repo backed instance', function () { - it('should not find any help cards if there are no service dependencies in the stackAnalysis', function () { - var instance = runnable.newInstance( - apiMocks.instances.running, - {noStore: true} - ); - - instance.contextVersion = { - getMainAppCodeVersion: sinon.stub().returns({}) - }; - - instance.attrs.env = ['hello=asdfasd', 'aasdasd=asdasd']; - - instance.fetchDependencies = sinon.spy(function (cb) { - $timeout(cb); - return []; - }); - - var scope = { - data: { - stacks: apiMocks.stackInfo, - instances: [ - instance, - { - fetchDependencies: sinon.spy(function (cb) { - $timeout(cb); - return []; - }) - } - ] - }, - actions: { - iunno: angular.noop - }, - instance: instance - }; - - instance.build = runnable.newBuild( - apiMocks.builds.built, - {noStore: true} - ); - instance.contextVersion = { - attrs: { - advanced: false, - infraCodeVersion: 'asdasd' - }, - appCodeVersions: { - models: [] - }, - getMainAppCodeVersion: function () { - return { - attrs: { - repo: 'fullRepoName' - } - }; - } - }; - - var analysisMockData = { - languageFramework: 'ruby_ror', - version: { - rails: '4.1.8', - ruby: '0.8' - } - }; - setup(scope, analysisMockData); - parseDockMock.triggerPromise(null); - - $scope.$digest(); - $timeout.flush(); - - sinon.assert.notCalled(ctx.helpCards.triggerCard); - }); - - it('should not find a missingAssociation and a missingDependency', function () { - var instance = runnable.newInstance( - apiMocks.instances.running, - {noStore: true} - ); - - instance.attrs.env = ['hello=asdfasd', 'aasdasd=asdasd']; - - instance.fetchDependencies = sinon.spy(function (cb) { - $timeout(cb); - return [{ - attrs: { - shortHash: 'shortHash1' - } - }]; - }); - var scope = { - data: { - stacks: apiMocks.stackInfo, - instances: [ - instance, - { - attrs: { - lowerName: 'mongo', - name: 'Mongo' - } - }, - { - attrs: { - shortHash: 'shortHash1', - lowerName: 'foo' - } - } - ] - }, - actions: { - iunno: angular.noop - }, - instance: instance - }; - - instance.build = runnable.newBuild( - apiMocks.builds.built, - {noStore: true} - ); - instance.contextVersion = { - attrs: { - advanced: false, - infraCodeVersion: 'asdasd' - }, - appCodeVersions: { - models: [] - }, - getMainAppCodeVersion: function () { - return { - attrs: { - repo: 'fullRepoName' - } - }; - } - }; - - var analysisMockData = { - languageFramework: 'ruby_ror', - version: { - rails: '4.1.8', - ruby: '0.8' - }, - serviceDependencies: [ - 'mongo', - 'mysql', - 'foo' - ] - }; - - setup(scope, analysisMockData); - parseDockMock.triggerPromise(null); - - $scope.$digest(); - $timeout.flush(); - - sinon.assert.called(ctx.helpCards.triggerCard); - - sinon.assert.calledWith(ctx.helpCards.triggerCard, 'missingAssociation', { - association: 'Mongo', - instance: instance - }); - }); - }); - }); }); diff --git a/test/unit/environment/serverStatusCardHeaderDirective.unit.js b/test/unit/environment/serverStatusCardHeaderDirective.unit.js index 1b7fd9153..d6d27a143 100644 --- a/test/unit/environment/serverStatusCardHeaderDirective.unit.js +++ b/test/unit/environment/serverStatusCardHeaderDirective.unit.js @@ -31,7 +31,6 @@ describe('serverStatusCardHeaderDirective'.bold.underline.blue, function () { runnable.reset(apiMocks.user); angular.mock.module('app', function ($provide) { - $provide.factory('helpCards', helpCardsMock.create(ctx)); $provide.factory('ModalService', function ($q) { ctx.showModalStub = sinon.stub().returns($q.when({ close: $q.when(true) diff --git a/test/unit/globals.js b/test/unit/globals.js index 91a2d6f7a..0b3c69605 100644 --- a/test/unit/globals.js +++ b/test/unit/globals.js @@ -48,7 +48,6 @@ window.fixtures = { }; window.apiClientMockFactory = require('../unit/apiMocks/apiClientMockFactory'); -window.helpCardsMock = require('../unit/apiMocks/HelpCardServiceMock'); window.noop = function () {}; window.helpers = { click: function (el, augmentCb){ diff --git a/test/unit/services/createAndBuildNewContainerService.unit.js b/test/unit/services/createAndBuildNewContainerService.unit.js index 194208d35..3e54cc658 100644 --- a/test/unit/services/createAndBuildNewContainerService.unit.js +++ b/test/unit/services/createAndBuildNewContainerService.unit.js @@ -8,7 +8,6 @@ var runnable = window.runnable; var fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); var createNewInstanceMock = new (require('../fixtures/mockFetch'))(); var createAndBuildNewContainer; -var helpCardsMock = require('../apiMocks/HelpCardServiceMock'); var thisUser = runnable.newUser(apiMocks.user); @@ -64,7 +63,6 @@ describe('createAndBuildNewContainer'.bold.underline.blue, function () { ctx.fetchUserMock = sinon.stub().returns($q.when(ctx.fakeUser)); return ctx.fetchUserMock; }); - $provide.factory('helpCards', helpCardsMock.create(ctx)); $provide.factory('fetchInstancesByPod', fetchInstancesByPodMock.fetch()); $provide.factory('createNewInstance', createNewInstanceMock.fetch()); $provide.factory('fetchPlan', function ($q) { @@ -123,7 +121,6 @@ describe('createAndBuildNewContainer'.bold.underline.blue, function () { } }, { warn: false }); - sinon.assert.calledOnce(ctx.helpCards.hideActiveCard); sinon.assert.calledOnce(instances.add); sinon.assert.calledOnce(ctx.eventTracking.triggeredBuild); @@ -131,7 +128,6 @@ describe('createAndBuildNewContainer'.bold.underline.blue, function () { mockFetchPlan.returns($q.when({next: {id: '5678'}})); createNewInstanceMock.triggerPromise(instance); $rootScope.$digest(); - sinon.assert.calledOnce(ctx.helpCards.refreshAllCards); sinon.assert.calledOnce(mockFetchPlan.cache.clear); sinon.assert.calledOnce(mockFetchPlan); sinon.assert.calledWith($rootScope.$broadcast, 'alert', { @@ -189,13 +185,11 @@ describe('createAndBuildNewContainer'.bold.underline.blue, function () { } }, { warn: false }); - sinon.assert.calledOnce(ctx.helpCards.hideActiveCard); sinon.assert.calledOnce(ctx.eventTracking.triggeredBuild); createNewInstanceMock.triggerPromise(instance); $rootScope.$digest(); - sinon.assert.calledOnce(ctx.helpCards.refreshAllCards); sinon.assert.calledOnce(createNewInstanceMock.getFetchSpy()); sinon.assert.calledWith(createNewInstanceMock.getFetchSpy(), ctx.fakeOrg1, build, { @@ -270,7 +264,6 @@ describe('createAndBuildNewContainer'.bold.underline.blue, function () { createAndBuildNewContainer($q.when(server), 'newName') .catch(function (err) { - sinon.assert.notCalled(ctx.helpCards.refreshAllCards); expect(err).to.equal(error); sinon.assert.calledOnce(instance.dealloc); done(); @@ -287,7 +280,6 @@ describe('createAndBuildNewContainer'.bold.underline.blue, function () { }, { warn: false }); sinon.assert.calledOnce(instances.add); - sinon.assert.calledOnce(ctx.helpCards.hideActiveCard); sinon.assert.calledOnce(ctx.eventTracking.triggeredBuild); createNewInstanceMock.triggerPromiseError(error); diff --git a/test/unit/services/serviceOpenItems.unit.js b/test/unit/services/serviceOpenItems.unit.js index 87ddcac60..c75522a84 100644 --- a/test/unit/services/serviceOpenItems.unit.js +++ b/test/unit/services/serviceOpenItems.unit.js @@ -1,4 +1,4 @@ -/*global runnable:true, mocks: true, directiveTemplate: true, xdescribe: true, helpCardsMock */ +/*global runnable:true, mocks: true, directiveTemplate: true, xdescribe: true */ 'use strict'; var VersionFileModel = require('@runnable/api-client/lib/models/context/version/file'); From 05bb63a529103e69378de7295c8ad79cee0b9305 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 7 Sep 2016 14:54:38 -0700 Subject: [PATCH 218/577] add spinner for runnabot section + remove button spinner --- .../gitHubIntegration/githubIntegrationView.jade | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index 831560b15..bdd7d1cda 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -6,6 +6,12 @@ img.grid-content.shrink.img.img-comment( src = "/build/images/runnabot-comment.png" width = "358" ) + +//- if checking whether the user is an admin, or checking whether runnabot has been enabled +//- .grid-content.spinner-wrapper.spinner-md.spinner-gray( +//- ng-include = "'spinner'" +//- ) + //- add 'disabled' attr if inviting runnabot, or if user isn't an admin hide after successfully inviting runnabot a.grid-content.shrink.btn.btn-md.green( @@ -20,10 +26,6 @@ a.grid-content.shrink.btn.btn-md.green( xlink:href = "#icons-octicons-github" ) | Invite Runnabot - .spinner-wrapper.spinner-sm.spinner-white.float-right( - ng-if = "$root.isLoading.addRunnabot" - ng-include = "'spinner'" - ) svg.iconnables.icons-link-external use( xlink:href = "#icons-link-external" From ea8cf9e46a8fe083f97d3fdc38ca87bc4497f178 Mon Sep 17 00:00:00 2001 From: henrymollman Date: Wed, 7 Sep 2016 15:09:25 -0700 Subject: [PATCH 219/577] San 4876 disable auto launch (#1707) * Added toggle for shouldNotAutofork property on instances, and updated property when toggled * Updated to reflect instance as a property of CIS controller * Removed debugging console logs * PR comments * Added catch for instance autofork update * Added semicolon and removed unused var. * Fixed non-filtering of templates and [config-name] --- client/controllers/controllerInstances.js | 11 +++++++++-- .../instanceNavigationPopoverView.jade | 2 +- .../branchMenuPopover/branchMenuPopoverView.jade | 2 ++ client/templates/instances/viewInstancesList.jade | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 7aa0130e9..f9716b008 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -172,12 +172,10 @@ function ControllerInstances( }, {}); var instanceBranchName = instance.getBranchName(); childInstances[instanceBranchName] = instanceBranchName; - var unbuiltBranches = branches.models.filter(function (branch) { branchName = keypather.get(branch, 'attrs.name'); return !childInstances[branchName]; }); - return unbuiltBranches; }; @@ -224,4 +222,13 @@ function ControllerInstances( }) .catch(errs.handler); }; + + this.setAutofork = function () { + CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; + promisify(CIS.poppedInstance, 'update')({ shouldNotAutofork: CIS.poppedInstance.attrs.shouldNotAutofork }) + .catch(function () { + CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; + }); + }; + } diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index 6836b5a2f..7ab3e40da 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -70,7 +70,7 @@ xlink:href = "#icons-gear" ) | Configure Template - .small Affects all non-isolated [config-name] containers. + .small Affects all non-isolated {{ INC.instance.attrs.name }} containers. ul.list.popover-list( ng-if = "!INC.instance.attrs.masterPod" diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 50b68c104..a35055ac6 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -100,7 +100,9 @@ ) label.grid-content.shrink.toggle-wrapper input.toggle-input( + ng-click = "CIS.setAutofork()" ng-disabled = "$root.featureFlags.webhooks" + ng-checked = "!CIS.poppedInstance.attrs.shouldNotAutofork" type = "checkbox" ) .toggle-group.toggle-sm diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 7717dce69..bc6063b7f 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -26,7 +26,7 @@ p.p.text-center.text-gray-light.padding-sm( instance = "masterInstance" instance-navigation master-instance = "masterInstance" - ng-repeat = "masterInstance in CIS.instancesByPod.models | instanceHasRepo:true | orderBy: ['attrs.name'] track by masterInstance.attrs.name" + ng-repeat = "masterInstance in CIS.getFilteredInstanceList().models | instanceHasRepo:true | orderBy: ['attrs.name'] track by masterInstance.attrs.name" ) //- master non-repository containers .grid-block( From 8fe8b9b9fef315f7ab061f77b278d1e4ffc9dbbb Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 7 Sep 2016 15:10:51 -0700 Subject: [PATCH 220/577] 4.19.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 80398acc7..0516bc2f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.19.0", + "version": "4.19.1", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 04de2c3cc71067c4d2766751cecce88526f21df2 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 7 Sep 2016 15:40:39 -0700 Subject: [PATCH 221/577] Adding loading and spinner --- .../githubIntegrationController.js | 33 +++++++++++-------- .../githubIntegrationView.jade | 14 ++++---- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js index 5a4b7a015..993c1d6d0 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationController.js +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -6,37 +6,44 @@ require('app') * @ngInject */ function GithubIntegrationController( - $scope, $interval, + $q, + $scope, currentOrg, errs, fetchGithubUserIsAdminOfOrg, isRunnabotPartOfOrg, - keypather + keypather, + loading ) { var GIC = this; var org = keypather.get(currentOrg, 'github.attrs.login'); GIC.organizationName = org; - fetchGithubUserIsAdminOfOrg(org) - .then(function (isAdmin) { - GIC.isAdmin = isAdmin; - }) - .catch(errs.handler); - function checkRunnabot() { - isRunnabotPartOfOrg(org) + return isRunnabotPartOfOrg(org) .then(function (hasRunnabot) { GIC.hasRunnabot = hasRunnabot; if (hasRunnabot && GIC.pollingInterval) { $interval.cancel(GIC.pollingInterval); } }) - .catch(function (err) { - errs.handler(err); - }); + .catch(errs.handler); } - checkRunnabot(); + + loading.reset('checkRunnabot'); + loading('checkRunnabot', true); + $q.all({ + isAdmin: fetchGithubUserIsAdminOfOrg(org), + hasRunnabot: checkRunnabot() + }) + .then(function (results) { + GIC.isAdmin = results.isAdmin; + }) + .catch(errs.handler) + .finally(function () { + loading('checkRunnabot'); + }); GIC.pollCheckRunnabot = function () { GIC.pollingInterval = $interval(checkRunnabot, 2000); diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index bdd7d1cda..4b45612ee 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -8,16 +8,17 @@ img.grid-content.shrink.img.img-comment( ) //- if checking whether the user is an admin, or checking whether runnabot has been enabled -//- .grid-content.spinner-wrapper.spinner-md.spinner-gray( -//- ng-include = "'spinner'" -//- ) +.grid-content.spinner-wrapper.spinner-md.spinner-gray( + ng-if = "$root.isLoading.checkRunnabot" + ng-include = "'spinner'" +) //- add 'disabled' attr if inviting runnabot, or if user isn't an admin hide after successfully inviting runnabot a.grid-content.shrink.btn.btn-md.green( - ng-disabled = "!GIC.isAdmin || $root.isLoading.addRunnabot" + ng-disabled = "!GIC.isAdmin" ng-click = "GIC.pollCheckRunnabot()" - ng-hide = "GIC.hasRunnabot" + ng-hide = "$root.isLoading.checkRunnabot || GIC.hasRunnabot" ng-href = "https://github.com/orgs/{{GIC.organizationName}}/invitations/runnabot/edit" target = "_blank" ) @@ -33,7 +34,7 @@ a.grid-content.shrink.btn.btn-md.green( //- show after successfully inviting runnabot .grid-block.align-center.shrink.runnabot-success( - ng-show = "GIC.hasRunnabot" + ng-show = "GIC.hasRunnabot && !$root.isLoading.checkRunnabot" ) img.grid-content.shrink.img( height = "36" @@ -45,6 +46,7 @@ a.grid-content.shrink.btn.btn-md.green( p.small.text-gray.text-left Thanks! See you soon on your pull requests. .grid-content.shrink.small.text-center( + ng-hide = "$root.isLoading.checkRunnabot" ng-class = "{\ 'text-gray': GIC.isAdmin,\ 'text-red': !GIC.isAdmin\ From 6ebf2062a4dbc52f35837f8529e5cc03ed1398d2 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 16:04:58 -0700 Subject: [PATCH 222/577] 4.19.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0516bc2f4..0d4d7e9cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.19.1", + "version": "4.19.2", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 1ed4a9f4e0b543c1ab790d0778419637d40821f8 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 7 Sep 2016 16:19:12 -0700 Subject: [PATCH 223/577] Fixed disabling branches and searching --- client/controllers/controllerInstances.js | 2 ++ .../instance/branchMenuPopover/branchMenuPopoverView.jade | 2 ++ client/directives/navBar/viewNav.jade | 2 +- client/templates/instances/viewInstancesList.jade | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 49646a24b..782d7c037 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -221,10 +221,12 @@ function ControllerInstances( var sha = branch.attrs.commit.sha; var loadingName = 'buildingForkedBranch' + branch.attrs.name; loading(loadingName, true); + loading('buildingForkedBranch', true); CIS.popoverCannotClose = false; promisify(CIS.poppedInstance, 'fork')(branch.attrs.name, sha) .then(function() { closePopover() + loading('buildingForkedBranch', false); loading(loadingName, false); CIS.poppedInstance.attrs.hasBranchLaunched = true; $timeout(function() { diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index cf20ca406..f0c52a2c8 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -123,6 +123,7 @@ ) .toggle-group.toggle-sm input.input.input-xs.input-search( + ng-disabled = "$root.isLoading['buildingForkedBranch']" ng-model = "CIS.branchQuery" placeholder = "Filter" required @@ -132,6 +133,7 @@ ng-if = "CIS.instanceBranches.length" ) li.list-item.popover-list-item( + ng-class = "{'disabled': $root.isLoading[\'buildingForkedBranch\']}" ng-repeat = "branch in CIS.getFilteredBranches()" ng-click = "CIS.forkBranchFromInstance(branch, POC.closePopover);" ) {{ branch.attrs.name }} diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index ed4842818..2b3b2a726 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -6,7 +6,7 @@ //- aha menu --- This should be triggered via an event! .popover.right.in.popover-aha( - ng-if = "CA.showAhaNavPopover" + ng-if = "$root.featureFlags.aha && CA.showAhaNavPopover" ng-include = "'ahaPopoverView'" ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 3533465dc..1c96fbf8b 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -60,7 +60,7 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-data = "'branchSelect'" ) .stepOneUncloseablePopover( - ng-if = "$index === 0" + ng-if = "$index === 0 && CIS.shouldShowParent(masterInstance)" pop-over pop-over-active = "CIS.isPopoverOpen" pop-over-controller = "CIS" From 80594309c53f35b969e1ff97d8bc668b7e679315 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 16:49:44 -0700 Subject: [PATCH 224/577] fixed dup. Whoooopppsss --- client/directives/environment/environmentController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index b532aad2c..1bcf4c9d7 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -16,12 +16,12 @@ function EnvironmentController( $timeout, ahaGuide, favico, - fetchUser, fetchDockerfileForContextVersion, fetchOrgMembers, fetchUser, keypather, ModalService, + pageName, instancesByPod ) { From fada5c43086fce356e906c288447097b97cfd76d Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 16:50:05 -0700 Subject: [PATCH 225/577] Fixed spacing. --- client/directives/environment/environmentController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 1bcf4c9d7..44c3902c2 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -37,7 +37,7 @@ function EnvironmentController( }; $scope.$on('show-aha-sidebar', EC.toggleSidebar); - $scope.$on('exitedEarly', function(event, didExitEarly) { + $scope.$on('exitedEarly', function (event, didExitEarly) { EC.showExitedEarly = didExitEarly; if (!didExitEarly) { $rootScope.$broadcast('launchAhaNavPopover'); @@ -51,7 +51,7 @@ function EnvironmentController( }); $scope.$on('$destroy', unbindUpdateTeammateInvitation); - function updateShowInviteButton () { + function updateShowInviteButton() { return $q.all({ user: fetchUser(), members: fetchOrgMembers($state.params.userName) From 62d8e3bc03fd2b72f00205179f231cf7f074f22e Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 7 Sep 2016 16:56:48 -0700 Subject: [PATCH 226/577] Kahn's comments --- .../components/gitHubIntegration/githubIntegrationController.js | 2 +- client/services/runnabotService.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js index 993c1d6d0..64735063a 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationController.js +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -42,7 +42,7 @@ function GithubIntegrationController( }) .catch(errs.handler) .finally(function () { - loading('checkRunnabot'); + loading('checkRunnabot', false); }); GIC.pollCheckRunnabot = function () { diff --git a/client/services/runnabotService.js b/client/services/runnabotService.js index 24d5ecc3a..2c504e3a7 100644 --- a/client/services/runnabotService.js +++ b/client/services/runnabotService.js @@ -13,7 +13,7 @@ function isRunnabotPartOfOrg( url: configAPIHost + '/github/orgs/' + orgName + '/memberships/runnabot' }) .then(function (data) { - return data.status !== 404; // Github returns 404 when the user isn't part of the org + return data.status < 400; // Github returns 404 when the user isn't part of the org }) .catch(function () { return false; From b10807b2514863cf918a175b36c303acd8ef9966 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 17:01:14 -0700 Subject: [PATCH 227/577] Removed pslide. --- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index eeeed0075..601d129b8 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -23,13 +23,11 @@ .grid-block.vertical.aha-text p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && !AGC.showError" ) {{ AGC.caption }} //- Step 8: p.p( - ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.subStep === 7" ) | {{!AGC.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} @@ -51,7 +49,6 @@ //- Step 9: p.p( - ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.subStep === 8 && !AGC.showError" ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. From c75c9975150e1448d5314579b61ab5039fa2a90d Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 7 Sep 2016 17:11:52 -0700 Subject: [PATCH 228/577] 4.19.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d4d7e9cf..4dd4414cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.19.2", + "version": "4.19.3", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 4da44c7351a560e3cf49db5b549404c8704acf1a Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 17:34:19 -0700 Subject: [PATCH 229/577] Updated text so it shows as complete the second time around. --- .../components/ahaGuide/AhaGuideController.js | 10 +++++----- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 4 ++-- .../modalNewContainer/newContainerModalView.jade | 2 +- client/services/ahaGuideService.js | 5 +++++ 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 9f3a6c5cc..7477c7617 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -9,13 +9,13 @@ function AhaGuideController( $rootScope, ahaGuide, currentOrg, - fetchInstances, + fetchInstancesByPod, keypather ) { var AGC = this; AGC.instances = null; - fetchInstances() + fetchInstancesByPod() .then(function (instances) { AGC.instances = instances; updateCaption(AGC.subStep); @@ -58,13 +58,13 @@ function AhaGuideController( if (status === 'dockLoaded') { $rootScope.animatedPanelListener(); } + if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && keypather.get(AGC, 'instances.models.length') > 0) { + status = 'hasContainer'; + } AGC.subStep = status; AGC.subStepIndex = currentMilestone.subSteps[status].step; AGC.caption = currentMilestone.subSteps[status].caption; AGC.className = currentMilestone.subSteps[status].className; - if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && keypather.get(AGC, 'instances.models.length') > 0) { - AGC.className = 'aha-meter-100'; - } } function handleBuildUpdate(update) { diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 601d129b8..45ac43f2f 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -6,11 +6,11 @@ ng-if = "!AGC.showError" ) use( - ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.subStep !== 'complete'" + ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.subStep !== 'complete' && AGC.subStep !== 'hasContainer'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AGC.subStep === 'complete'" + ng-if = "AGC.subStep === 'complete' || AGC.subStep === 'hasContainer'" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index ec69a8939..e248990f8 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO && MC.instances.models && MC.instances.models.length !== 0" + ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 27985fe5a..e63030461 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -137,6 +137,11 @@ function ahaGuide( caption: 'Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches.', className: 'aha-meter-100', step: 9 + }, + hasContainer: { + caption: 'Choose a template to configure.', + className: 'aha-meter-100', + step: 9 } }, buildStatus: { From a702f1cb86df46ea99f1df521cc9d9377b1ef469 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 7 Sep 2016 17:42:34 -0700 Subject: [PATCH 230/577] Fixed display when status is complete. --- client/directives/components/ahaGuide/AhaGuideController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 7477c7617..21ae16da4 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -58,7 +58,7 @@ function AhaGuideController( if (status === 'dockLoaded') { $rootScope.animatedPanelListener(); } - if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && keypather.get(AGC, 'instances.models.length') > 0) { + if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && keypather.get(AGC, 'instances.models.length') > 0 && status !== 'complete') { status = 'hasContainer'; } AGC.subStep = status; From 466b177c9e84300d6d12220fd865d611bc755f41 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 7 Sep 2016 18:24:49 -0700 Subject: [PATCH 231/577] 'PR Integration' -> 'PR Bot' --- .../popoverAccountMenu/viewPopoverAccountMenu.jade | 2 +- client/directives/modals/settingsModal/settingsModalView.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade index fb4241c1b..87dc041ac 100644 --- a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade +++ b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade @@ -65,7 +65,7 @@ use( xlink:href = "#icons-octicons-github-gray" ) - | PR Integration + | PR Bot li.list-item.popover-list-item( ng-click = "actions.openSettingsModal('slackIntegration')" ) diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index f06d094c4..4c5af7424 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -45,7 +45,7 @@ use( xlink:href = "#icons-octicons-github-gray" ) - .btn-text.grid-content PR Integration + .btn-text.grid-content PR Bot button.btn.btn-radio.grid-block.vertical( ng-class = "{'active': SEMC.currentTab === 'slackIntegration'}" ng-click = "SEMC.currentTab = 'slackIntegration'" From 40278e8234e786c52af19882e9b0ddc545b3719f Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 7 Sep 2016 19:37:36 -0700 Subject: [PATCH 232/577] Fixing opening popover on 'popover-closed' event --- client/controllers/controllerInstances.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 782d7c037..0832b72ad 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -39,7 +39,7 @@ function ControllerInstances( }); $scope.$on('popover-closed', function(event, pop) { - if (pop.data !== 'ahaTemplate') { + if (pop.data && pop.data !== 'ahaTemplate') { CIS.isPopoverOpen = true; } }); From d5366ff0d5b51012ab1822ce8e13e5f4bc70d61d Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 8 Sep 2016 09:55:57 -0700 Subject: [PATCH 233/577] Changed listener variable and removed $ from getCurrentStep function --- client/directives/components/ahaGuide/AhaGuideController.js | 4 ++-- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index aedb4fb55..ab8edc32c 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -25,9 +25,9 @@ function AhaGuideController( handleBuildUpdate(buildStatus); }); - var tabListener = $scope.$on('updatedTab', function(event, tabName) { + var stopTabUpdate = $scope.$on('updatedTab', function(event, tabName) { if (AGC.subStepIndex > 5) { - tabListener(); + stopTabUpdate(); } else { updateCaption(tabName); } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index e93f24279..3a9a1426a 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -71,7 +71,7 @@ .grid-block.shrink.aha-meter( ng-class = "{\ 'aha-meter-0': getCurrentStep() <= steps.ADD_FIRST_BRANCH,\ - 'aha-meter-100': $getCurrentStep() > steps.ADD_FIRST_BRANCH\ + 'aha-meter-100': getCurrentStep() > steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables From 2904b7d2865dfc242a599393f28c13f5ffd055cf Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 10:46:29 -0700 Subject: [PATCH 234/577] add header to template popover + make btn-radio more general --- .../scss/components/buttons/buttons.scss | 36 +++----------- .../styles/scss/modals/modals-edit.scss | 14 ++++-- .../scss/modals/modals-server-select.scss | 15 ------ client/assets/styles/scss/modals/modals.scss | 24 +++------ .../scss/popover/popover-branch-menu.scss | 49 ++++++++++++------- .../templateMenuPopoverView.jade | 46 ++++++++++------- .../newContainerModalView.jade | 4 +- 7 files changed, 89 insertions(+), 99 deletions(-) diff --git a/client/assets/styles/scss/components/buttons/buttons.scss b/client/assets/styles/scss/components/buttons/buttons.scss index 954347d79..46b626905 100755 --- a/client/assets/styles/scss/components/buttons/buttons.scss +++ b/client/assets/styles/scss/components/buttons/buttons.scss @@ -485,12 +485,10 @@ } .btn-radio { - background: $white; border: $input-border solid transparent; border-radius: $input-border-radius; box-shadow: none; cursor: pointer; - display: inline-block; font-size: 16px; height: 72px; text-align: center; @@ -498,44 +496,26 @@ transition: none; user-select: none; white-space: nowrap; - width: 90px; + + &:hover { + border-color: $gray-lighter; + } &:active, &.active { + background: lighten($purple-lightest,6%); + border-color: $purple-light; + box-shadow: inset 0 0 0 1px $purple-light; color: $purple-light; - cursor: default; } &.active { - font-weight: $weight-bold; + cursor: default; } &:focus { outline: 0; } - - &.btn-lg { - height: 108px; - width: 120px; - - .img, - .iconnables { - margin-bottom: 6px; - width: 36px; - } - } - - &:last-child { - margin-right: 0; - } - - .img, - .iconnables { - display: block; - height: 33px; - margin: 0 auto; - width: 18px; - } } // add button diff --git a/client/assets/styles/scss/modals/modals-edit.scss b/client/assets/styles/scss/modals/modals-edit.scss index 5b1b053d0..c1217a8a6 100644 --- a/client/assets/styles/scss/modals/modals-edit.scss +++ b/client/assets/styles/scss/modals/modals-edit.scss @@ -354,13 +354,20 @@ } > .btn { - border-color: $gray-lighter; flex: 0 1 25%; font-size: 13px; height: 90px; line-height: normal; // reset padding: 0; + &:not(:active):not(.active) { + border-color: $gray-lighter; + + &:hover:not([disabled]) { + border-color: $gray-light; + } + } + &:first-child { border-radius: $input-border-radius 0 0; } @@ -408,13 +415,13 @@ top: -21px; } - &:hover::after { + &:hover:not([disabled])::after { background: $gray-light; color: $white; } &.active, - &:active { + &:active:not([disabled]) { &::after { background: $purple-light; @@ -424,6 +431,7 @@ } .iconnables { + display: block; height: 24px; margin: 9px auto 6px; width: 24px; diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index 6a61b3aa3..19574a9d1 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -29,11 +29,7 @@ } .btn { - align-items: center; - border: 1px solid transparent; border-radius: $input-border-radius-lg; - display: flex; - font-size: 15px; height: 60px; line-height: 1.2; padding: 0 21px; @@ -51,17 +47,6 @@ white-space: normal; } - &:hover { - border-color: $gray-lighter; - } - - &:active, - &.active { - border-color: currentColor; - box-shadow: inset 0 0 0 1px $purple-light; - color: $purple; - } - + .btn { margin-left: 15px; diff --git a/client/assets/styles/scss/modals/modals.scss b/client/assets/styles/scss/modals/modals.scss index e92d58e03..6820a6c0f 100755 --- a/client/assets/styles/scss/modals/modals.scss +++ b/client/assets/styles/scss/modals/modals.scss @@ -281,25 +281,21 @@ } .btn-radio { - background: none; - border: 1px solid transparent; border-radius: $input-border-radius-lg; - color: $gray; - display: flex; flex: 0 0 90px; font-weight: $weight-normal; padding: 9px 3px 6px; + width: 90px; - &:hover { - border-color: $gray-lighter; + &:not(.active):not(:active) { + color: $gray; } - &:active, - &.active { - background: lighten($purple-lightest,6%); - border-color: currentColor; - box-shadow: inset 0 0 0 1px $purple-light; - color: $purple-light; + .iconnables { + display: block; + height: 21px; + margin: 0 auto; + width: 18px; } // animation start state @@ -325,10 +321,6 @@ margin-left: $tab-margin; } - .iconnables { - height: 21px; - } - .btn-text { align-items: center; display: flex; diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index bb5c5faca..ca1d4b7b3 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -1,5 +1,5 @@ .popover-branch-menu { - max-width: 330px; + max-width: 360px; min-height: 90px; width: 100%; @@ -11,15 +11,11 @@ } .well { - margin-bottom: 6px; - } - - .input-search { - margin-top: 9px; + margin-bottom: 15px; } .popover-content.popover-content { - max-height: 330px; + max-height: 360px; min-height: 90px; overflow-y: auto; } @@ -54,10 +50,36 @@ } .popover-template-menu { - top: 30px !important; - .input-search { - margin-top: 0; + .popover-header { + display: flex; + height: auto; + padding: 12px 15px; + } + + .btn-radio { + border-radius: $input-border-radius-lg; + flex: 0 1 50%; + font-size: 13px; + height: auto; + line-height: 1.4; + padding: 9px; + text-align: left; + + .small { + font-size: 12px; + opacity: .6; + } + + + .btn { + margin-left: 6px; + } + + .iconnables { + height: 18px; + margin-right: 6px; + width: 18px; + } } .btn-add.btn-add.btn-add { @@ -66,13 +88,6 @@ top: auto; } - .list-servers { - - .list-item { - font-size: 15px; - } - } - .gravatar.gravatar { margin: 0; margin-right: 4px; diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 49bfde019..3bc59d3ca 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -2,19 +2,35 @@ ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" ) - .arrow.white - .popover-header Add Branch + .arrow.gray( + style = "top: 39px;" + ) + .grid-block.popover-header + btn.grid-block.align-center.justify-center.btn.btn-radio.active + svg.iconnables.grid-block.shrink + use( + xlink:href = "#icons-new-repository-server" + ) + .grid-block.vertical.shrink Repository + .small From your GH org + btn.grid-block.align-center.justify-center.btn.btn-radio + svg.iconnables.grid-block.shrink + use( + xlink:href = "#icons-server-new" + ) + .grid-block.vertical.shrink Non-Repository + .small For services & DBs .popover-content( ng-init = "state.branchesLoaded = null" ) - .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( - ng-click = "state.branchesLoaded = true" - ng-if = "!state.branchesLoaded" - ng-include = "'spinner'" - ) + //- .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( + //- ng-click = "state.branchesLoaded = true" + //- ng-if = "!state.branchesLoaded" + //- ng-include = "'spinner'" + //- ) .padding-xxs( - ng-if = "state.branchesLoaded" ) + //- ng-if = "state.branchesLoaded" input.input.input-xs.input-search( ng-disabled = "state.loading" ng-if = "branch.length !== 0" @@ -26,11 +42,9 @@ ng-if = "branch.length === 0" ) There are no branches to add. ul.list.popover-list( - ng-if = "state.branchesLoaded" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line( - ng-class = "{'disabled': state.loading}" - ) + //- ng-if = "state.branchesLoaded" + li.grid-block.align-center.list-item.popover-list-item.multi-line .grid-block.vertical .grid-content button-clicker .grid-block( @@ -54,9 +68,7 @@ use( xlink:href = "#icons-add" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line( - ng-class = "{'disabled': state.loading}" - ) + li.grid-block.align-center.list-item.popover-list-item.multi-line .grid-block.vertical .grid-content api .grid-block( @@ -80,9 +92,7 @@ use( xlink:href = "#icons-add" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line( - ng-class = "{'disabled': state.loading}" - ) + li.grid-block.align-center.list-item.popover-list-item.multi-line .grid-block.vertical .grid-content runnable.com .grid-block( diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 812e297fe..c1aefb5d0 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -17,7 +17,7 @@ ng-class = "{'lg': !$root.featureFlags.aha1}" ng-click = "MC.changeTab('nameContainer')" ) - .grid-block.shrink.btn( + .grid-block.align-center.shrink.btn.btn-radio( ng-class = "{'active': MC.state.tabName === 'repos'}" ng-click = "MC.changeTab('repos')" ng-if = "!$root.featureFlags.aha1" @@ -28,7 +28,7 @@ ) .btn-text.grid-block Repository Template //- disable this button when loading a repository - .grid-block.shrink.btn( + .grid-block.align-center.shrink.btn.btn-radio( ng-disabled = "$root.isLoading[MC.name + 'SingleRepo']" ng-class = "{\ 'active': MC.state.tabName === 'services', \ From e0aa19b812bf884b8a4c6ec2126ece9935aedb5c Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 10:46:45 -0700 Subject: [PATCH 235/577] replace + buttons in list-instances with text buttons --- .../styles/scss/layout/instances-list.scss | 12 +++++++++ .../instances/viewInstancesList.jade | 26 ++++++------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 6f14cbc59..150596a8c 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -11,6 +11,18 @@ position: relative; width: $instance-list-width; + .btn-xs.gray { + border-color: #eee; + color: #a1a1a1; + font-size: 12px; + font-weight: 400; + height: 20px; + padding: 0 4px; + right: -6px; + top: 1px; + width: auto; + } + &.in { display: block; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 014371393..9cd556f31 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -18,19 +18,14 @@ p.p.text-center.text-gray-light.padding-sm( .grid-block.align-center.list-item-cluster.list-clusters-heading span.grid-content.text-overflow Templates - button.grid-block.shrink.btn.btn-xs.btn-icon.green( + button.grid-block.shrink.btn.btn-xs.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" pop-over - pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" + pop-over-options = "{\"top\":-30,\"left\":105}" pop-over-template = "templateMenuPopoverView" - tooltip = "Add Branch" - tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-36,\"top\":24}" - ) - svg.iconnables - use( - xlink:href = "#icons-add" - ) + ) Create Template + .list-item-cluster .grid-block.list-containers.vertical.text-overflow.open //- master repository containers @@ -62,21 +57,16 @@ p.p.text-center.text-gray-light.padding-sm( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} //- '+' button for adding branches and configuring clusters - button.grid-block.shrink.btn.btn-xs.btn-icon.gray( + button.grid-block.shrink.btn.btn-xs.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" ng-click = "CIS.popInstanceOpen(masterInstance)" pop-over pop-over-controller = "CIS" - pop-over-options = "{\"verticallyCentered\":true,\"left\":24}" + pop-over-options = "{\"verticallyCentered\":true,\"left\":78}" pop-over-template = "branchMenuPopoverView" - tooltip = "Add Branch" - tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-36,\"top\":24}" - ) - svg.iconnables - use( - xlink:href = "#icons-add" - ) + ) Add Branch + //- repo config button (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( ng-click = "CIS.editInstance(masterInstance)" From 23e9f0f723a73d32ee52d2622d402fc395c2f21c Mon Sep 17 00:00:00 2001 From: thejsj Date: Thu, 8 Sep 2016 12:01:17 -0700 Subject: [PATCH 236/577] Fix Save and Save & Rebuild issue --- .../repositoryDetailsModalController.js | 16 ++++++++++++++-- .../repositoryDetailsModalView.jade | 3 ++- .../repositoryDetailsModalController.unit.js | 19 ++++++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js b/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js index 14ffd4100..ff867c0ae 100644 --- a/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js +++ b/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js @@ -49,12 +49,22 @@ function RepositoryDetailsModalController( }); }; + RDMC.hasCommitBeenUpdated = function () { + var newCommitSha = keypather.get(RDMC, 'data.commit.attrs.sha'); + var oldCommitSha = keypather.get(RDMC, 'appCodeVersion.attrs.commit'); + return newCommitSha && newCommitSha !== oldCommitSha; + }; + + RDMC.hasLockedBeenUpdated = function () { + return RDMC.data.locked === RDMC.instance.attrs.locked; + }; + RDMC.updateInstance = function () { var updateInstance = function () { return $q.when() .then(function () { loading('main', true); - if (RDMC.data.locked === RDMC.instance.attrs.locked) { + if (RDMC.hasLockedBeenUpdated()) { return; } return promisify(instance, 'update')({ @@ -62,7 +72,9 @@ function RepositoryDetailsModalController( }); }) .then(function () { - return updateInstanceWithNewAcvData(RDMC.instance, RDMC.appCodeVersion, RDMC.data); + if (RDMC.hasCommitBeenUpdated()) { + return updateInstanceWithNewAcvData(RDMC.instance, RDMC.appCodeVersion, RDMC.data); + } }) .finally(function () { loading('main', false); diff --git a/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade b/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade index 12f779c7b..f94616130 100644 --- a/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade +++ b/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade @@ -27,5 +27,6 @@ ng-click = "RDMC.close()" ) Cancel button.btn.btn-md.green.float-right( + ng-disabled="!RDMC.hasCommitBeenUpdated() && !RDMC.hasLockedBeenUpdated())" ng-click = "RDMC.updateInstance()" - ) Save & Rebuild + ) {{ RDMC.hasCommitBeenUpdated() ? 'Save and Build' : 'Save' }} diff --git a/test/unit/directives/modals/modalRepoDetail/repositoryDetailsModalController.unit.js b/test/unit/directives/modals/modalRepoDetail/repositoryDetailsModalController.unit.js index d960a1f7c..640e7ffdd 100644 --- a/test/unit/directives/modals/modalRepoDetail/repositoryDetailsModalController.unit.js +++ b/test/unit/directives/modals/modalRepoDetail/repositoryDetailsModalController.unit.js @@ -15,6 +15,7 @@ describe('RepositoryDetailsModalController'.bold.underline.blue, function () { var instance; var repo = 'helllo/World'; var branch = 'superBranch'; + var newCommit; var acv; var closeStub; @@ -23,6 +24,7 @@ describe('RepositoryDetailsModalController'.bold.underline.blue, function () { attrs: { repo: repo, branch: branch, + commit: '1', useLatest: false } }; @@ -38,6 +40,7 @@ describe('RepositoryDetailsModalController'.bold.underline.blue, function () { }, isolation: null }; + newCommit = { attrs: { sha: 2 } }; closeStub = sinon.stub(); } function initState() { @@ -46,7 +49,7 @@ describe('RepositoryDetailsModalController'.bold.underline.blue, function () { $provide.factory('fetchCommitData', function ($q) { fetchCommitDataStub = { activeBranch: sinon.stub().returns({}), - activeCommit: sinon.stub().returns($q.when(true)) + activeCommit: sinon.stub().returns($q.when(newCommit)) }; return fetchCommitDataStub; }); @@ -137,7 +140,7 @@ describe('RepositoryDetailsModalController'.bold.underline.blue, function () { { contextVersion: { getMainAppCodeVersion: sinon.stub().returns({ - attrs: { repo: repo, branch: branch } + attrs: { repo: repo, branch: branch, commit: '1' } }) } } @@ -151,7 +154,7 @@ describe('RepositoryDetailsModalController'.bold.underline.blue, function () { }); describe('Confirmation', function () { - it('should update insance without confirmation if not in isolation', function () { + it('should update insance without confirmation if not in isolation and if there is a new commit', function () { sinon.stub(controller, 'confirmAutoDeploy').returns($q.when(true)); controller.updateInstance(); @@ -166,6 +169,16 @@ describe('RepositoryDetailsModalController'.bold.underline.blue, function () { ); }); + it('should not update the insance if there is no new commit', function () { + newCommit.attrs.sha = '1'; + sinon.stub(controller, 'confirmAutoDeploy').returns($q.when(true)); + + controller.updateInstance(); + $scope.$digest(); + sinon.assert.notCalled(controller.confirmAutoDeploy); + sinon.assert.notCalled(updateInstanceWithNewAcvDataStub); + }); + it('should update insance without confirmation if no other instance has the same branch', function () { instance.isolation = generateIsolation(repo, 'someOtherBranch'); sinon.stub(controller, 'confirmAutoDeploy').returns($q.when(true)); From 632919659dbeeb514dd38385f1accb238519e1ca Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 13:53:43 -0700 Subject: [PATCH 237/577] clean up .btn-add and .list-servers --- .../scss/components/buttons/buttons.scss | 4 -- .../assets/styles/scss/components/lists.scss | 5 -- .../repository-details-content.scss | 1 - .../scss/modals/modals-mirror-dockerfile.scss | 3 - .../scss/modals/modals-server-select.scss | 46 ++------------ .../styles/scss/pages/grace-period.scss | 1 - .../scss/popover/popover-branch-menu.scss | 36 ++++------- .../styles/scss/popover/popover-files.scss | 7 +-- .../mirrorDockerfileView.jade | 6 +- .../pages/newRepositorySelectionView.jade | 63 ++++++++++--------- .../pages/templateSelectSectionView.jade | 8 +-- .../branchMenuPopoverView.jade | 9 +-- .../templateMenuPopoverView.jade | 16 ++--- .../viewPopoverFilesRepositorySelect.jade | 39 ++++++------ 14 files changed, 94 insertions(+), 150 deletions(-) diff --git a/client/assets/styles/scss/components/buttons/buttons.scss b/client/assets/styles/scss/components/buttons/buttons.scss index 46b626905..2aec2a101 100755 --- a/client/assets/styles/scss/components/buttons/buttons.scss +++ b/client/assets/styles/scss/components/buttons/buttons.scss @@ -529,14 +529,10 @@ transition: none; &.btn-sm { - right: 15px; - top: 15px; width: $input-sm; } &.btn-xs { - right: 6px; - top: 6px; width: $input-xs; } diff --git a/client/assets/styles/scss/components/lists.scss b/client/assets/styles/scss/components/lists.scss index 381080512..09cb2524a 100644 --- a/client/assets/styles/scss/components/lists.scss +++ b/client/assets/styles/scss/components/lists.scss @@ -150,11 +150,6 @@ opacity: 0; position: absolute; } - - // add button - .btn-add { - position: absolute; - } } // links diff --git a/client/assets/styles/scss/components/repository-details-content.scss b/client/assets/styles/scss/components/repository-details-content.scss index c00d08535..c7cfaa26f 100644 --- a/client/assets/styles/scss/components/repository-details-content.scss +++ b/client/assets/styles/scss/components/repository-details-content.scss @@ -26,7 +26,6 @@ .list-item { @extend %text-overflow; - font-size: 15px; padding-right: 36px; &:active, diff --git a/client/assets/styles/scss/modals/modals-mirror-dockerfile.scss b/client/assets/styles/scss/modals/modals-mirror-dockerfile.scss index 4fbfd2e0d..353df1c8b 100644 --- a/client/assets/styles/scss/modals/modals-mirror-dockerfile.scss +++ b/client/assets/styles/scss/modals/modals-mirror-dockerfile.scss @@ -70,10 +70,7 @@ // check button .btn-icon { border-radius: 50%; - flex: 0 0 auto; pointer-events: none; // let the label parent select - position: static; - width: $input-xs; } } diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index 19574a9d1..366706d0a 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -108,15 +108,6 @@ .list-servers { flex: 0 0 auto; - // add button - .btn-icon { - border-radius: $input-border-radius; - padding: 3px; - right: 10px; - top: 10px; // to center - width: $input-sm; - } - .icons-dockerfile, .icons-server { height: 14px; @@ -133,21 +124,8 @@ } .list-item { + font-size: 18px; height: 60px; - overflow: hidden; - - // template list - &.grid-block { - align-items: center; - - .img { - margin-right: 15px; - } - } - - .spinner-wrapper { - right: 21px; - } } } @@ -158,9 +136,8 @@ border: $input-border solid transparent; border-radius: $input-border-radius-lg; cursor: pointer; - font-size: 18px; font-weight: $weight-bold; - padding: 6px 60px 6px 15px; + padding: 6px 15px; white-space: nowrap; // reset .multi-line default &:hover:not(.disabled) { @@ -194,14 +171,6 @@ } } - &.multi-line { - - // only if in modal (for templates without descriptions) - .modal-dialog & { - min-height: 60px; - } - } - &:last-child { margin-bottom: 15px; } @@ -223,18 +192,15 @@ // next arrow .icons-arrow-down { - height: 100%; - position: absolute; - right: 3px; - top: 0; + height: 36px; + padding: 6px; transform: rotate3d(0,0,1,-90deg); + width: 36px; } // spinner .spinner-wrapper { - position: absolute; - right: 9px; - top: 20px; + padding: 10px; } // tiled view for template containers diff --git a/client/assets/styles/scss/pages/grace-period.scss b/client/assets/styles/scss/pages/grace-period.scss index 0e6a43198..c7cf410b8 100644 --- a/client/assets/styles/scss/pages/grace-period.scss +++ b/client/assets/styles/scss/pages/grace-period.scss @@ -71,7 +71,6 @@ .btn-add { border-radius: 50%; flex: 0 0 auto; - position: static; } } diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index ca1d4b7b3..9182d8d1a 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -10,16 +10,20 @@ padding-bottom: 21px; } - .well { - margin-bottom: 15px; - } - .popover-content.popover-content { max-height: 360px; min-height: 90px; overflow-y: auto; } + .well { + margin-bottom: 15px; + } + + .popover-list-item { + padding-right: 9px; + } + // empty state .empty { @@ -42,9 +46,7 @@ } > .spinner-wrapper { - position: absolute; - right: 10px; - top: 10px; + padding: 4px; } } } @@ -66,31 +68,19 @@ padding: 9px; text-align: left; + + .btn-radio { + margin-left: 6px; + } + .small { font-size: 12px; opacity: .6; } - + .btn { - margin-left: 6px; - } - .iconnables { height: 18px; margin-right: 6px; width: 18px; } } - - .btn-add.btn-add.btn-add { - position: static; - right: auto; - top: auto; - } - - .gravatar.gravatar { - margin: 0; - margin-right: 4px; - margin-top: 2px; - } } diff --git a/client/assets/styles/scss/popover/popover-files.scss b/client/assets/styles/scss/popover/popover-files.scss index de368daf5..d6f5bb534 100644 --- a/client/assets/styles/scss/popover/popover-files.scss +++ b/client/assets/styles/scss/popover/popover-files.scss @@ -31,8 +31,7 @@ .list-servers { .list-item { - font-size: 15px; - padding: 6px 21px 6px 9px; + padding: 6px 3px 6px 9px; &:active, &.active { @@ -40,10 +39,6 @@ color: $purple-light; } } - - .spinner-wrapper { - top: 18px; - } } // forms diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index 803985341..92124cf7a 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -31,7 +31,7 @@ value = "new" ) - button.btn.btn-xs.btn-icon.btn-add + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-check use( xlink:href = "#icons-check" @@ -60,7 +60,7 @@ small.small.text-gray.padding-xxs.label-from( type = "radio" value = "blankDockerfile" ) - button.btn.btn-xs.btn-icon.btn-add + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-check use( xlink:href = "#icons-check" @@ -95,7 +95,7 @@ small.small.text-gray.padding-xxs.label-from( type = "radio" value = "dockerfile" ) - button.btn.btn-xs.btn-icon.btn-add + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-check use( xlink:href = "#icons-check" diff --git a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade index 1e1fef27c..e9f262cdf 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade @@ -51,7 +51,7 @@ ul.list.list-servers( | ‘{{MC.repoFilter}}’. //- add active class when loading - li.list-item.multi-line.text-overflow( + li.grid-block.align-center.list-item.multi-line.text-overflow( ng-disabled = "$root.isLoading[MC.name + 'SingleRepo']" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && MC.setRepo(repo, goToPanel)" ng-repeat = "\ @@ -63,44 +63,47 @@ ul.list.list-servers( 'active': repo.loading, \ 'disabled': $root.isLoading[MC.name + 'SingleRepo'] \ }" - ) {{ repo.attrs.name }} - .row.row-author( - ng-if = "$root.featureFlags.inviteFlows" - ) - //- if invite flows... - .btn-user.text-overflow( - ng-class = "{'active': MC.state.active}" - ng-include = "'userButtonView'" - pop-over - pop-over-active = "MC.state.active" - pop-over-options = "{\"left\":-22,\"top\":26}" - pop-over-template = "userPopoverView" - ) - span.small( + ) + .grid-content.text-overflow( + title = "{{ repo.attrs.name }}" + ) {{ repo.attrs.name }} + .row.row-author( ng-if = "$root.featureFlags.inviteFlows" - ) {{repo.attrs.updated_at | timeFrom}} - small.small( - ng-if = "!$root.featureFlags.inviteFlows" - ) {{repo.attrs.updated_at | timeFrom}} - svg.iconnables.icons-server( - ng-if = "$root.featureFlags.multipleRepositoryContainers" - pop-over - pop-over-hover-trigger - pop-over-options = "{\"top\":27,\"centered\":true}" - pop-over-template = "viewCountainerTooltip" - pop-over-trigger = "hover" ) - use( - xlink:href = "#icons-server" + //- if invite flows... + .btn-user.text-overflow( + ng-class = "{'active': MC.state.active}" + ng-include = "'userButtonView'" + pop-over + pop-over-active = "MC.state.active" + pop-over-options = "{\"left\":-22,\"top\":26}" + pop-over-template = "userPopoverView" + ) + span.small( + ng-if = "$root.featureFlags.inviteFlows" + ) {{repo.attrs.updated_at | timeFrom}} + small.small( + ng-if = "!$root.featureFlags.inviteFlows" + ) {{repo.attrs.updated_at | timeFrom}} + svg.iconnables.icons-server( + ng-if = "$root.featureFlags.multipleRepositoryContainers" + pop-over + pop-over-hover-trigger + pop-over-options = "{\"top\":27,\"centered\":true}" + pop-over-template = "viewCountainerTooltip" + pop-over-trigger = "hover" ) - button.btn.btn-sm.btn-icon.btn-add( + use( + xlink:href = "#icons-server" + ) + button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add( ng-if = "!repo.loading" ) svg.iconnables.icons-add use( xlink:href = "#icons-add" ) - .spinner-wrapper.spinner-sm.spinner-green.in( + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green.in( ng-if = "repo.loading" ng-include = "'spinner'" ) diff --git a/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade index b10d6f94d..b186c633b 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade @@ -19,7 +19,7 @@ ul.list.list-servers( ng-if = "!$root.isLoading.newContainerModalTemplates" ) - li.list-item.grid-block( + li.grid-block.align-center.list-item( ng-click = "MC.setTemplate(dependency, goToPanel)" ng-repeat = "\ dependency in MC.templateServers.models | \ @@ -28,13 +28,13 @@ ul.list.list-servers( orderBy:'attrs.name'\ " ) - img.img( + img.grid-content.shrink.img( height = "36" ng-src = "/build/images/logos/logo-icon-{{dependency.attrs.name.toLowerCase()}}.png" width = "36" ) - | {{dependency.attrs.name}} - button.btn.btn-sm.btn-icon.btn-add + .grid-content {{dependency.attrs.name}} + button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add svg.iconnables.icons-add use( xlink:href = "#icons-add" diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 50b68c104..680c3f237 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -113,18 +113,19 @@ ul.list.popover-list( ng-if = "CIS.instanceBranches.length" ) - li.list-item.popover-list-item( + li.grid-block.align-center.list-item.popover-list-item( ng-repeat = "branch in CIS.getFilteredBranches()" ng-click = "CIS.forkBranchFromInstance(branch, POC.closePopover);" - ) {{ branch.attrs.name }} - button.btn.btn-xs.btn-icon.btn-add( + ) + .grid-content {{ branch.attrs.name }} + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!$root.isLoading['buildingForkedBranch' + branch.attrs.name]" ) svg.iconnables.icons-add use( xlink:href = "#icons-add" ) - .spinner-wrapper.spinner-sm.spinner-gray( + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-gray( ng-if = "$root.isLoading['buildingForkedBranch' + branch.attrs.name]" ng-include = "'spinner'" ) diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 3bc59d3ca..99417f6cf 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -23,14 +23,14 @@ .popover-content( ng-init = "state.branchesLoaded = null" ) - //- .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( - //- ng-click = "state.branchesLoaded = true" - //- ng-if = "!state.branchesLoaded" - //- ng-include = "'spinner'" - //- ) + .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( + ng-click = "state.branchesLoaded = true" + ng-if = "!state.branchesLoaded" + ng-include = "'spinner'" + ) .padding-xxs( + ng-if = "state.branchesLoaded" ) - //- ng-if = "state.branchesLoaded" input.input.input-xs.input-search( ng-disabled = "state.loading" ng-if = "branch.length !== 0" @@ -42,8 +42,8 @@ ng-if = "branch.length === 0" ) There are no branches to add. ul.list.popover-list( + ng-if = "state.branchesLoaded" ) - //- ng-if = "state.branchesLoaded" li.grid-block.align-center.list-item.popover-list-item.multi-line .grid-block.vertical .grid-content button-clicker @@ -63,7 +63,7 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add svg.iconnables.icons-add use( xlink:href = "#icons-add" diff --git a/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade b/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade index 6e9d042c3..79e0edff2 100644 --- a/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade +++ b/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade @@ -36,7 +36,7 @@ ul.list.list-servers( ng-if = "repoSelector.data.githubRepos.models" ) - li.list-item.multi-line( + li.grid-block.align-center.list-item.multi-line( ng-class = "{\ 'active': repo.loading,\ 'no-touching': repoSelector.data.loading\ @@ -48,32 +48,35 @@ allBut: data.appCodeVersions | \ orderBy: '-attrs.updated_at'\ " - ) {{ repo.attrs.name}} + ) + .grid-content.text-overflow( + title = "{{ repo.attrs.name}}" + ) {{ repo.attrs.name}} - //- if invite flows... - .row.row-author( - ng-if = "$root.featureFlags.inviteFlows" - ) - .btn-user.text-overflow.no-touching( - ng-class = "{'active': state.active}" - ng-include = "'userButtonView'" - ) - span.small( + //- if invite flows... + .row.row-author( ng-if = "$root.featureFlags.inviteFlows" - ) —{{repo.attrs.updated_at | timeFrom}} + ) + .btn-user.text-overflow.no-touching( + ng-class = "{'active': state.active}" + ng-include = "'userButtonView'" + ) + span.small( + ng-if = "$root.featureFlags.inviteFlows" + ) —{{repo.attrs.updated_at | timeFrom}} - //- else - small.small( - ng-if = "!$root.featureFlags.inviteFlows" - ) Updated {{ repo.attrs.updated_at | timeFrom }} + //- else + small.small( + ng-if = "!$root.featureFlags.inviteFlows" + ) Updated {{ repo.attrs.updated_at | timeFrom }} - svg.iconnables.icons-arrow-down( + svg.grid-content.shrink.iconnables.icons-arrow-down( ng-if = "!repo.loading" ) use( xlink:href = "#icons-arrow-down" ) - .spinner-wrapper.spinner-sm.spinner-purple.in( + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-purple.in( ng-if = "repo.loading" ng-include = "'spinner'" ) From 37c878c7aec3504b0d38360f2adade6e890ef063 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 13:57:17 -0700 Subject: [PATCH 238/577] clean up --- .../scss/popover/popover-branch-menu.scss | 18 +++++++++++------- .../templateMenuPopoverView.jade | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 9182d8d1a..5587e906e 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -1,8 +1,18 @@ -.popover-branch-menu { +.popover-branch-menu, +.popover-template-menu { max-width: 360px; min-height: 90px; width: 100%; + .popover-content.popover-content { + max-height: 360px; + min-height: 90px; + overflow-y: auto; + } +} + +.popover-branch-menu { + .aha-guide { border-bottom: 1px solid $gray-lighter; font-size: 15px; @@ -10,12 +20,6 @@ padding-bottom: 21px; } - .popover-content.popover-content { - max-height: 360px; - min-height: 90px; - overflow-y: auto; - } - .well { margin-bottom: 15px; } diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 99417f6cf..e0f236323 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -1,4 +1,4 @@ -.popover.menu.right.popover-branch-menu.popover-template-menu( +.popover.menu.right.popover-template-menu( ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle()" ) From 14bc0a3d3c8b27594ea56282ab9f6edf04165c36 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 14:20:16 -0700 Subject: [PATCH 239/577] fix disabled button issue (thanks jorge) --- .../modalRepoDetail/repositoryDetailsModalController.js | 4 ++-- .../modals/modalRepoDetail/repositoryDetailsModalView.jade | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js b/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js index ff867c0ae..8207441a2 100644 --- a/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js +++ b/client/directives/modals/modalRepoDetail/repositoryDetailsModalController.js @@ -56,7 +56,7 @@ function RepositoryDetailsModalController( }; RDMC.hasLockedBeenUpdated = function () { - return RDMC.data.locked === RDMC.instance.attrs.locked; + return RDMC.data.locked !== RDMC.instance.attrs.locked; }; RDMC.updateInstance = function () { @@ -64,7 +64,7 @@ function RepositoryDetailsModalController( return $q.when() .then(function () { loading('main', true); - if (RDMC.hasLockedBeenUpdated()) { + if (!RDMC.hasLockedBeenUpdated()) { return; } return promisify(instance, 'update')({ diff --git a/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade b/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade index f94616130..b367d7cbc 100644 --- a/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade +++ b/client/directives/modals/modalRepoDetail/repositoryDetailsModalView.jade @@ -27,6 +27,6 @@ ng-click = "RDMC.close()" ) Cancel button.btn.btn-md.green.float-right( - ng-disabled="!RDMC.hasCommitBeenUpdated() && !RDMC.hasLockedBeenUpdated())" ng-click = "RDMC.updateInstance()" + ng-disabled = "!RDMC.hasCommitBeenUpdated() && !RDMC.hasLockedBeenUpdated()" ) {{ RDMC.hasCommitBeenUpdated() ? 'Save and Build' : 'Save' }} From 82ae5e84d0efe94cca1fc1399f7a44ba2dc1d214 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 14:25:53 -0700 Subject: [PATCH 240/577] removed instance to button binding. --- .../environment/modals/forms/formLogs/viewFormLogs.jade | 1 - 1 file changed, 1 deletion(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 511d4e326..6c26b4184 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -16,7 +16,6 @@ ng-click = "SMC.page = 'terminal'" ng-disabled = "!SMC.instance.containers.models.length" ng-if = "$root.featureFlags.configTerminal" - instance = "SMC.instance" ) Terminal //- logs From 6316b0c9a6aab333376325409af407ad05d4ea1c Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 14:30:54 -0700 Subject: [PATCH 241/577] Fixed bad merge. --- .../components/ahaGuide/ahaSidebarView.jade | 118 ------------------ 1 file changed, 118 deletions(-) delete mode 100644 client/directives/components/ahaGuide/ahaSidebarView.jade diff --git a/client/directives/components/ahaGuide/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebarView.jade deleted file mode 100644 index 241b7d48f..000000000 --- a/client/directives/components/ahaGuide/ahaSidebarView.jade +++ /dev/null @@ -1,118 +0,0 @@ -.grid-block.shrink( - ng-if = "!$root.featureFlags.ahaOverview && !$root.featureFlags.aha3" -) - header.grid-block.align-center.justify-center.aha-sidebar-header - h4.grid-content.strong.text-center.h4 Setup Guide - svg.grid-content.shrink.iconnables.icons-close( - ng-click = "$root.featureFlags.ahaSidebar = false" - ) - use( - xlink:href = "#icons-close" - ) - -.grid-block.shrink.vertical.aha-overview( - ng-if = "$root.featureFlags.ahaOverview" -) - header.grid-block.vertical.shrink.align-center.justify-center.aha-sidebar-header - h4.grid-content.shrink.h4.text-center Let‘s get running! 👋 - .grid-block.shrink.vertical.padding-sm - p.grid-content.shrink.p.text-center It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! - button.grid-content.shrink.btn.btn-md.green( - ng-click = "\ - $root.featureFlags.ahaOverview = false;\ - $root.featureFlags.ahaSidebar = false;\ - " - ) Get Started - -.grid-block.shrink.vertical.aha-guide-wrapper( - ng-if = "!$root.featureFlags.aha3" -) - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-meter-50': $root.featureFlags.aha0,\ - 'aha-meter-100': $root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3\ - }" - ) - svg.iconnables - use( - ng-if = "$root.featureFlags.aha1 || $root.featureFlags.aha2 || $root.featureFlags.aha3" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Choose your Organization - p.small This is the first step to success. - - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha2 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-error': state.showError,\ - 'aha-meter-10': state.showSubStep === 0,\ - 'aha-meter-20': state.showSubStep === 1,\ - 'aha-meter-30': state.showSubStep === 2,\ - 'aha-meter-40': state.showSubStep === 3,\ - 'aha-meter-50': state.showSubStep === 4,\ - 'aha-meter-60': state.showSubStep === 5,\ - 'aha-meter-70': state.showSubStep === 6,\ - 'aha-meter-80': state.showSubStep === 7,\ - 'aha-meter-90': state.showSubStep === 8,\ - 'aha-meter-100': $root.featureFlags.aha2 || $root.featureFlags.aha3\ - }" - ) - svg.iconnables - use( - ng-if = "!$root.featureFlags.aha2 && !$root.featureFlags.aha3" - xlink:href = "#icons-octicons-repo" - ) - use( - ng-if = "$root.featureFlags.aha2 || $root.featureFlags.aha3" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Create your First Template - p.small Set up your project and get it running! - - .grid-block.shrink.align-center.padding-sm.aha-guide( - ng-class = "{'disabled': $root.featureFlags.aha0 || $root.featureFlags.aha1 || $root.featureFlags.aha3}" - ) - .grid-block.shrink.aha-meter( - ng-class = "{\ - 'aha-meter-33': $root.featureFlags.aha2,\ - 'aha-meter-100': $root.featureFlags.aha3\ - }" - ) - svg.iconnables - use( - ng-if = "!$root.featureFlags.aha3" - xlink:href = "#icons-octicons-branch" - ) - use( - ng-if = "$root.featureFlags.aha3" - xlink:href = "#icons-check" - ) - .grid-block.vertical.aha-text - p.p.strong Add your First Branch - p.small Your branches will update on every commit you make. - -.grid-block.vertical.align-center.text-center.aha-overview( - ng-if = "$root.featureFlags.aha3" -) - header.grid-block.shrink.align-center.justify-center.aha-sidebar-header - h4.grid-content.shrink.strong.text-center.h4 You did it! - svg.iconnables.icons-close( - ng-click = "\ - $root.featureFlags.aha = false;\ - $root.featureFlags.aha3 = false;\ - $root.featureFlags.ahaSidebar = false;\ - " - ) - use( - xlink:href = "#icons-close" - ) - .grid-block.vertical.align-center.form-github( - github-integration - ) From 5e8f4628874d4073a303a8de3505b56c2edbfb6f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 14:32:33 -0700 Subject: [PATCH 242/577] remove arrow icon from repository button --- client/assets/styles/scss/layout/instance-sidebar.scss | 7 ------- .../components/editRepoCommit/editRepoCommitView.jade | 4 ---- 2 files changed, 11 deletions(-) diff --git a/client/assets/styles/scss/layout/instance-sidebar.scss b/client/assets/styles/scss/layout/instance-sidebar.scss index 236794dce..014905540 100644 --- a/client/assets/styles/scss/layout/instance-sidebar.scss +++ b/client/assets/styles/scss/layout/instance-sidebar.scss @@ -80,13 +80,6 @@ } } - .icons-arrow-forward { - height: 100%; - position: absolute; - right: 3px; - top: 0; - } - .file-tree { margin: 0; } diff --git a/client/directives/components/editRepoCommit/editRepoCommitView.jade b/client/directives/components/editRepoCommit/editRepoCommitView.jade index f5ecd6dcf..a23d7e43a 100644 --- a/client/directives/components/editRepoCommit/editRepoCommitView.jade +++ b/client/directives/components/editRepoCommit/editRepoCommitView.jade @@ -56,10 +56,6 @@ span.small( ng-if = "!$root.featureFlags.inviteFlows" ) {{activeCommit.attrs.commit.author.date | timeFrom}} - svg.iconnables.icons-arrow-forward - use( - xlink:href = "#icons-arrow-down" - ) //- auto-deploy w/ commit syncing //- show alternate text in autoDeployTooltip.jade if disabled From 6f52e48f860ad0ba1be3c6e20f63e932c96c8946 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 14:39:44 -0700 Subject: [PATCH 243/577] Fixing bad merge. --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 3a9a1426a..200be291a 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -87,8 +87,6 @@ p.p.strong Add your First Branch p.small Your branches will update on every commit you make. -//- During aha 4: -//- .grid-block.vertical.aha-overview .grid-block.vertical.align-center.form-github( - ng-include = "'gitHubIntegrationView'" + github-integration ) From 0b461df2af929480ad356f6d31050a0ae2746d3e Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 14:40:49 -0700 Subject: [PATCH 244/577] Updated so we don't register animatedPanelListener on the rootScope as a variable. --- .../components/ahaGuide/AhaGuideController.js | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 2ed917fba..0ef11cf32 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -13,6 +13,7 @@ function AhaGuideController( keypather ) { var AGC = this; + var animatedPanelListener = angular.noop; AGC.instances = null; fetchInstancesByPod() @@ -56,7 +57,7 @@ function AhaGuideController( return; } if (status === 'dockLoaded') { - $rootScope.animatedPanelListener(); + animatedPanelListener(); } if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && keypather.get(AGC, 'instances.models.length') > 0 && status !== 'complete') { status = 'hasContainer'; @@ -86,25 +87,14 @@ function AhaGuideController( AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; } - // we need to unregister this animated panel listener if it exists - // to avoid duplication - if ($rootScope.animatedPanelListener) { - $rootScope.animatedPanelListener(); - } - $scope.$on('$destroy', function () { - if ($rootScope.animatedPanelListener) { - $rootScope.animatedPanelListener(); - } - if ($rootScope.doneListener) { - $rootScope.doneListener(); - } + animatedPanelListener(); if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('exitedEarly', true); } }); - $rootScope.animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { + animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { updateCaption(panel); }); From 1aaf96a1d73a5fdd6145c8b8a4c729aee8a1c282 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 14:41:09 -0700 Subject: [PATCH 245/577] add controls for deleting templates --- .../instanceNavigationPopoverView.jade | 27 +++++++++++++++++-- client/services/featureFlagService.js | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade index 6836b5a2f..c12ffc99a 100644 --- a/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade +++ b/client/directives/components/instanceNavigtion/instanceNavigationPopoverView.jade @@ -17,7 +17,19 @@ xlink:href = "#icons-gear" ) | Configure Template - .small Affects all [config-name] containers. + .small Affects all non-isolated [config-name] containers. + li.divider( + ng-if = "$root.featureFlags.containersViewTemplateControls" + ) + li.list-item.popover-list-item( + internal-modal-helper = "confirmDeleteServerView" + ng-if = "$root.featureFlags.containersViewTemplateControls" + ) + svg.iconnables.icons-delete + use( + xlink:href = "#icons-delete" + ) + | Delete Template ul.list.popover-list( ng-if = "!INC.instance.attrs.masterPod" @@ -71,7 +83,18 @@ ) | Configure Template .small Affects all non-isolated [config-name] containers. - + li.divider( + ng-if = "$root.featureFlags.containersViewTemplateControls" + ) + li.list-item.popover-list-item( + internal-modal-helper = "confirmDeleteServerView" + ng-if = "$root.featureFlags.containersViewTemplateControls" + ) + svg.iconnables.icons-delete + use( + xlink:href = "#icons-delete" + ) + | Delete Template ul.list.popover-list( ng-if = "!INC.instance.attrs.masterPod" ) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 6ee9e9789..fea85d2d0 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -26,6 +26,7 @@ function featureFlags( cardStatus: false, connections: false, configTerminal: false, // flag for terminal in config view + containersViewTemplateControls: false, dockerfileMirroringMultiple: false, editAnyInstance: false, emptyFolder: false, // shows empty folder markup From 3c2e64545dfb081f9909dc40e14caaca2c065b27 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 14:42:09 -0700 Subject: [PATCH 246/577] update error message --- .../components/instanceNavigtion/confirmBranchRemoveView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade b/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade index 773308354..4a952bb19 100644 --- a/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade +++ b/client/directives/components/instanceNavigtion/confirmBranchRemoveView.jade @@ -2,7 +2,7 @@ .modal-dialog.modal-sm.modal-alert header.modal-body p.p.strong Are you sure you want to remove this branch from Runnable? - p.p You can add this branch again later, but any changes made to this template will not be saved. + p.p You can add this branch again later, but any changes you’ve made will not be saved. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left( ng-click = "CMC.actions.cancel()" From a3763246c96f8b3043b5fe07e47bc42ec3f0dff5 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 14:43:14 -0700 Subject: [PATCH 247/577] flag "create template" button --- client/templates/instances/viewInstancesList.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 9cd556f31..3c970810c 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -20,7 +20,7 @@ p.p.text-center.text-gray-light.padding-sm( span.grid-content.text-overflow Templates button.grid-block.shrink.btn.btn-xs.gray( ng-class = "{'active': state.active}" - ng-if = "$root.featureFlags.addBranches" + ng-if = "$root.featureFlags.containersViewTemplateControls" pop-over pop-over-options = "{\"top\":-30,\"left\":105}" pop-over-template = "templateMenuPopoverView" From f940eafb3ffa81425daed353bfe0239d24b147a9 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 14:47:05 -0700 Subject: [PATCH 248/577] Moved handleInstanceUpdate to a function so we can test it better. --- .../setupMirrorServerModalController.js | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index b860a7780..f45da97fb 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -156,6 +156,18 @@ function SetupMirrorServerModalController( }); }; + SMC.handleInstanceUpdate = function () { + var buildStatus = SMC.state.instance.status(); + var containerHostname = SMC.state.instance.getContainerHostname(); + $rootScope.$broadcast('buildStatusUpdated', { + status: buildStatus, + containerHostname: containerHostname + }); + if (buildStatus === 'running') { + SMC.page = 'run'; + } + }; + SMC.createServer = function () { // Wait until all changes to the context version have been resolved before // creating a build with that context version @@ -179,17 +191,7 @@ function SetupMirrorServerModalController( if (instance) { SMC.instance = instance; SMC.state.instance = instance; - SMC.state.instance.on('update', function() { - var buildStatus = SMC.state.instance.status(); - var containerHostname = SMC.state.instance.getContainerHostname(); - $rootScope.$broadcast('buildStatusUpdated', { - status: buildStatus, - containerHostname: containerHostname - }); - if (buildStatus === 'running') { - SMC.page = 'run'; - } - }); + SMC.state.instance.on('update', SMC.handleInstanceUpdate); // Reset the opts, in the same way as `EditServerModalController` SMC.state.opts = { env: keypather.get(instance, 'attrs.env') || [], From cf97159d6593a6f387838d589c8fc59671c3e5c8 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 15:14:30 -0700 Subject: [PATCH 249/577] add view for non-repo templates --- .../styles/scss/layout/instances-list.scss | 2 +- .../scss/popover/popover-branch-menu.scss | 4 +- .../templateMenuPopoverView.jade | 71 ++++++++++++++++++- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 150596a8c..64d5b4510 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -12,7 +12,7 @@ width: $instance-list-width; .btn-xs.gray { - border-color: #eee; + border-color: #ddd; color: #a1a1a1; font-size: 12px; font-weight: 400; diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 5587e906e..efa3055fb 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -69,7 +69,7 @@ font-size: 13px; height: auto; line-height: 1.4; - padding: 9px; + padding: 9px 15px; text-align: left; + .btn-radio { @@ -83,7 +83,7 @@ .iconnables { height: 18px; - margin-right: 6px; + margin-right: 9px; width: 18px; } } diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index e0f236323..d5a46703c 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -1,19 +1,26 @@ .popover.menu.right.popover-template-menu( ng-class = "{'in': active}" + ng-init = "state.tab = 'repo'" ng-style = "popoverStyle.getStyle()" ) .arrow.gray( style = "top: 39px;" ) .grid-block.popover-header - btn.grid-block.align-center.justify-center.btn.btn-radio.active + btn.grid-block.align-center.btn.btn-radio( + ng-class = "{'active': state.tab === 'repo'}" + ng-click = "state.tab = 'repo'" + ) svg.iconnables.grid-block.shrink use( xlink:href = "#icons-new-repository-server" ) .grid-block.vertical.shrink Repository - .small From your GH org - btn.grid-block.align-center.justify-center.btn.btn-radio + .small From your org + btn.grid-block.align-center.btn.btn-radio( + ng-class = "{'active': state.tab === 'nonRepo'}" + ng-click = "state.tab = 'nonRepo'" + ) svg.iconnables.grid-block.shrink use( xlink:href = "#icons-server-new" @@ -21,6 +28,7 @@ .grid-block.vertical.shrink Non-Repository .small For services & DBs .popover-content( + ng-if = "state.tab === 'repo'" ng-init = "state.branchesLoaded = null" ) .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( @@ -116,3 +124,60 @@ use( xlink:href = "#icons-add" ) + .popover-content( + ng-if = "state.tab === 'nonRepo'" + ng-init = "state.servicesLoaded = null" + ) + .spinner-wrapper.spinner-sm.spinner-gray.spinner-center( + ng-click = "state.servicesLoaded = true" + ng-if = "!state.servicesLoaded" + ng-include = "'spinner'" + ) + .padding-xxs( + ng-if = "state.servicesLoaded" + ) + input.input.input-xs.input-search( + ng-disabled = "state.loading" + placeholder = "Filter" + required + type = "search" + ) + ul.list.popover-list( + ng-if = "state.servicesLoaded" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line + img.grid-content.shrink.img( + height = "24" + ng-src = "/build/images/logos/logo-icon-cassandra.png" + width = "24" + ) + .grid-content Cassandra + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add + svg.iconnables.icons-add + use( + xlink:href = "#icons-add" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line + img.grid-content.shrink.img( + height = "24" + ng-src = "/build/images/logos/logo-icon-consul-server.png" + width = "24" + ) + .grid-content Consul-Server + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add + svg.iconnables.icons-add + use( + xlink:href = "#icons-add" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line + img.grid-content.shrink.img( + height = "24" + ng-src = "/build/images/logos/logo-icon-elasticsearch.png" + width = "24" + ) + .grid-content ElasticSearch + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add + svg.iconnables.icons-add + use( + xlink:href = "#icons-add" + ) From 82a69a628218bdea1c9b4d0599630a5066ab73f1 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Thu, 8 Sep 2016 15:43:50 -0700 Subject: [PATCH 250/577] removed GA, Facebook init scripts. added x-domain linking in segment. --- layout.jade | 45 ++++----------------------------------------- 1 file changed, 4 insertions(+), 41 deletions(-) diff --git a/layout.jade b/layout.jade index b2eefba86..387622839 100644 --- a/layout.jade +++ b/layout.jade @@ -50,6 +50,10 @@ html( analytics.load("fxTY7pKf5m9VtepmIUtNSLbe8jM8muvt"); analytics.track('Logged in'); }}(); + analytics.ready(function () { + ga('require', 'linker'); + ga('linker:autoLink', ['runnable.com']); + }); if env !== 'development' script. @@ -87,30 +91,6 @@ html( } })(); - - if env === 'production' - //- Facebook Events - script. - !function (f, b, e, v, n, t, s) { - if (f.fbq)return; - n = f.fbq = function () { - n.callMethod ? - n.callMethod.apply(n, arguments) : n.queue.push(arguments) - }; - if (!f._fbq)f._fbq = n; - n.push = n; - n.loaded = !0; - n.version = '2.0'; - n.queue = []; - t = b.createElement(e); - t.async = !0; - t.src = v; - s = b.getElementsByTagName(e)[0]; - s.parentNode.insertBefore(t, s) - }(window, document, 'script', '//connect.facebook.net/en_US/fbevents.js'); - fbq('init', '761302660669573'); - fbq('track', "PageView"); - //- Rollbar script. var _rollbarConfig = { @@ -147,23 +127,6 @@ html( for(g=0;g Date: Thu, 8 Sep 2016 15:49:13 -0700 Subject: [PATCH 251/577] Added isAddingFirstRepo method. --- client/directives/components/ahaGuide/AhaGuideController.js | 4 ---- .../modalSetupServer/setupMirrorServerModalController.js | 2 +- .../modals/modalSetupServer/setupMirrorServerModalView.jade | 2 +- .../modals/modalSetupServer/setupServerModalController.js | 2 +- .../modals/modalSetupServer/setupServerModalView.jade | 4 ++-- client/services/ahaGuideService.js | 5 ++++- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 0ef11cf32..413e265b8 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -79,10 +79,6 @@ function AhaGuideController( updateCaption('success'); $rootScope.$broadcast('exitedEarly', false); } - updateBuildStatus(buildStatus); - } - - function updateBuildStatus(buildStatus) { AGC.buildStatus = buildStatus; AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; } diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index f45da97fb..baa7f4f0d 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -28,7 +28,7 @@ function SetupMirrorServerModalController( TAB_VISIBILITY ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) - SMC.ahaGuide = ahaGuide; + SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade index de8eb7d84..23f7b92de 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalView.jade @@ -4,7 +4,7 @@ step-index = 1 sub-step-index = 6 sub-step = "filesMirror" - ng-if = "SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "SMC.isAddingFirstRepo()" ) form.modal-dialog.modal-edit( diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 35183b1b1..8692d8db4 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -32,7 +32,7 @@ function SetupServerModalController( masterBranch ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) - SMC.ahaGuide = ahaGuide; + SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade index c58008496..7ac7f7f4a 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalView.jade @@ -1,14 +1,14 @@ .modal-backdrop.in .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide - ng-if = "SMC.state.advanced !== 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "SMC.state.advanced !== 'blankDockerfile' && SMC.isAddingFirstRepo()" step-index = 1 sub-step = "repository" sub-step-index = 4 ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide - ng-if = "SMC.state.advanced === 'blankDockerfile' && SMC.ahaGuide.getCurrentStep() === SMC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "SMC.state.advanced === 'blankDockerfile' && SMC.isAddingFirstRepo()" step-index = 1 sub-step = "buildfiles" sub-step-index = 6 diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index e63030461..ccc0f13cd 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -212,6 +212,9 @@ function ahaGuide( stepList: stepList, getCurrentStep: getCurrentStep, steps: STEPS, - isInGuide: isInGuide + isInGuide: isInGuide, + isAddingFirstRepo: function () { + return getCurrentStep() === STEPS.ADD_FIRST_REPO; + } }; } From 362450c1c55d62d62ef80a8c5dd8099d9e15021f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 15:51:20 -0700 Subject: [PATCH 252/577] add loading spinners --- .../scss/components/buttons/buttons.scss | 6 +-- .../scss/popover/popover-branch-menu.scss | 27 +++++----- .../branchMenuPopoverView.jade | 3 +- .../templateMenuPopoverView.jade | 53 +++++++++++++++---- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/client/assets/styles/scss/components/buttons/buttons.scss b/client/assets/styles/scss/components/buttons/buttons.scss index 2aec2a101..8b4942c69 100755 --- a/client/assets/styles/scss/components/buttons/buttons.scss +++ b/client/assets/styles/scss/components/buttons/buttons.scss @@ -497,12 +497,12 @@ user-select: none; white-space: nowrap; - &:hover { + &:hover:not([disabled]) { border-color: $gray-lighter; } - &:active, - &.active { + &:active:not([disabled]), + &.active.active { background: lighten($purple-lightest,6%); border-color: $purple-light; box-shadow: inset 0 0 0 1px $purple-light; diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index efa3055fb..90936e073 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -9,6 +9,20 @@ min-height: 90px; overflow-y: auto; } + + // loading state + .list-item.disabled { + cursor: not-allowed; + opacity: .5; + + .spinner-wrapper { + padding: 4px; + + .path { + stroke: $gray; + } + } + } } .popover-branch-menu { @@ -40,19 +54,6 @@ font-size: 15px; } } - - // loading state - .list-item { - - &.disabled { - color: $gray-light; - cursor: not-allowed; - } - - > .spinner-wrapper { - padding: 4px; - } - } } .popover-template-menu { diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 680c3f237..b1f40ceab 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -79,8 +79,7 @@ xlink:href = "#icons-arrow-down" ) | Add Branch - .popover-content( - ) + .popover-content .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( ng-if = "$root.isLoading.fetchingBranches" ng-include = "'spinner'" diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index d5a46703c..6574ab1eb 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -1,15 +1,19 @@ .popover.menu.right.popover-template-menu( ng-class = "{'in': active}" - ng-init = "state.tab = 'repo'" + ng-init = "\ + state.tab = 'repo';\ + state.loading = null;\ + " ng-style = "popoverStyle.getStyle()" ) .arrow.gray( style = "top: 39px;" ) .grid-block.popover-header - btn.grid-block.align-center.btn.btn-radio( + button.grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'repo'}" ng-click = "state.tab = 'repo'" + ng-disabled = "state.tab !== 'repo'&& state.loading" ) svg.iconnables.grid-block.shrink use( @@ -17,9 +21,10 @@ ) .grid-block.vertical.shrink Repository .small From your org - btn.grid-block.align-center.btn.btn-radio( + button.grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'nonRepo'}" ng-click = "state.tab = 'nonRepo'" + ng-disabled = "state.tab !== 'nonRepo'&& state.loading" ) svg.iconnables.grid-block.shrink use( @@ -52,7 +57,10 @@ ul.list.popover-list( ng-if = "state.branchesLoaded" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ng-click = "state.loading = !state.loading" + ) .grid-block.vertical .grid-content button-clicker .grid-block( @@ -71,12 +79,20 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( + ng-if = "!state.loading" + ) svg.iconnables.icons-add use( xlink:href = "#icons-add" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-gray( + ng-if = "state.loading" + ng-include = "'spinner'" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ) .grid-block.vertical .grid-content api .grid-block( @@ -100,7 +116,9 @@ use( xlink:href = "#icons-add" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ) .grid-block.vertical .grid-content runnable.com .grid-block( @@ -145,19 +163,30 @@ ul.list.popover-list( ng-if = "state.servicesLoaded" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ng-click = "state.loading = !state.loading" + ) img.grid-content.shrink.img( height = "24" ng-src = "/build/images/logos/logo-icon-cassandra.png" width = "24" ) .grid-content Cassandra - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( + ng-if = "!state.loading" + ) svg.iconnables.icons-add use( xlink:href = "#icons-add" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-gray( + ng-if = "state.loading" + ng-include = "'spinner'" + ) + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ) img.grid-content.shrink.img( height = "24" ng-src = "/build/images/logos/logo-icon-consul-server.png" @@ -169,7 +198,9 @@ use( xlink:href = "#icons-add" ) - li.grid-block.align-center.list-item.popover-list-item.multi-line + li.grid-block.align-center.list-item.popover-list-item.multi-line( + ng-class = "{'disabled': state.loading}" + ) img.grid-content.shrink.img( height = "24" ng-src = "/build/images/logos/logo-icon-elasticsearch.png" From 759aea476398ca6b9e8f17ccab9d7e1656b75b24 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 15:54:20 -0700 Subject: [PATCH 253/577] Added helper method to determine if we are adding the first repo. --- client/controllers/controllerInstance.js | 2 +- .../directives/components/ahaGuide/AhaGuideController.js | 2 +- client/directives/components/ahaGuide/ahaGuideView.jade | 2 +- .../components/ahaGuide/ahaSidebar/ahaSidebarDirective.js | 1 + .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 4 ++-- client/directives/environment/environmentController.js | 4 ++-- .../environmentHeader/viewEnvironmentHeader.jade | 4 +--- client/directives/environment/environmentView.jade | 2 +- .../modals/modalNewContainer/newContainerModalView.jade | 8 ++++---- 9 files changed, 14 insertions(+), 15 deletions(-) diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index e0cb1fdd6..5ab053631 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -39,7 +39,7 @@ function ControllerInstance( }; $scope.$on('show-aha-sidebar', CIS.toggleSidebar); - if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH) { + if (ahaGuide.isAddingFirstRepo()) { console.log('Toggle first branch thingy'); } diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 413e265b8..45f6dcfc9 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -59,7 +59,7 @@ function AhaGuideController( if (status === 'dockLoaded') { animatedPanelListener(); } - if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && keypather.get(AGC, 'instances.models.length') > 0 && status !== 'complete') { + if (ahaGuide.isAddingFirstRepo() && keypather.get(AGC, 'instances.models.length') > 0 && status !== 'complete') { status = 'hasContainer'; } AGC.subStep = status; diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 57f054d86..bf1995736 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -4,7 +4,7 @@ ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "AGC.ahaGuide.isAddingFirstRepo()" ng-include = "'setUpRepositoryGuideView'" ) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index 3e5022e88..2832f1dd3 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -16,6 +16,7 @@ function ahaSidebar( link: function ($scope) { $scope.steps = ahaGuide.steps; $scope.getCurrentStep = ahaGuide.getCurrentStep; + $scope.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; } }; } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 200be291a..5358b9d10 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -41,8 +41,8 @@ .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{\ - disabled: getCurrentStep() !== steps.ADD_FIRST_REPO,\ - active: getCurrentStep() === steps.ADD_FIRST_REPO\ + disabled: !isAddingFirstRepo(),\ + active: isAddingFirstRepo()\ }" ) .grid-block.shrink.aha-meter( diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 44c3902c2..244d5b3b6 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -100,12 +100,12 @@ function EnvironmentController( $scope.data = { }; $scope.data.instances = instancesByPod; - if (ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO && instancesByPod.models.length === 0) { + if (ahaGuide.isAddingFirstRepo() && instancesByPod.models.length === 0) { EC.showCreateTemplate = false; EC.showSidebar = true; } - var isAddFirstRepo = ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_REPO; + var isAddFirstRepo = ahaGuide.isAddingFirstRepo(); // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 71d192006..ba12b90ab 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -1,8 +1,6 @@ //- new server button button.grid-block.shrink.btn.btn-md.green( - ng-class = "{\ - 'scale-in-modal': EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO\ - }" + ng-class = "{ 'scale-in-modal': EC.ahaGuide.isAddingFirstRepo() }" ng-click = "EC.triggerModal.newContainer()" ) svg.iconnables.icons-add.float-left diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index b2663edef..86e11ee6a 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,7 +42,7 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': EC.ahaGuide.getCurrentStep() === EC.ahaGuide.steps.ADD_FIRST_REPO && data.instances.models.length === 0}" + ng-class = "{'empty': EC.ahaGuide.isAddingFirstRepo() && data.instances.models.length === 0}" ) header.grid-block.align-center.environment-header( ng-include = "'viewEnvironmentHeader'" diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index e248990f8..a329dbfc0 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -2,7 +2,7 @@ .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( aha-guide ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" - ng-if = "MC.ahaGuide.getCurrentStep() === MC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "MC.ahaGuide.isAddingFirstRepo()" step-index = 1 sub-step = "containerSelection" sub-step-index = 1 @@ -14,13 +14,13 @@ name = "containerSelection" ) header.modal-header.grid-block.justify-center( - ng-class = "{'lg': MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || ( MC.instances.models && MC.instances.models.length !== 0 )}" + ng-class = "{'lg': !MC.ahaGuide.isAddingFirstRepo() || ( MC.instances.models && MC.instances.models.length !== 0 )}" ng-click = "MC.changeTab('nameContainer')" ) .grid-block.shrink.btn( ng-class = "{'active': MC.state.tabName === 'repos'}" ng-click = "MC.changeTab('repos')" - ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || ( MC.instances.models && MC.instances.models.length !== 0 )" + ng-if = "!MC.ahaGuide.isAddingFirstRepo() || ( MC.instances.models && MC.instances.models.length !== 0 )" ) svg.iconnables.icons-repository.grid-block.shrink use( @@ -36,7 +36,7 @@ 'disabled': $root.isLoading[MC.name + 'SingleRepo'] \ }" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && MC.changeTab('services')" - ng-if = "MC.ahaGuide.getCurrentStep() !== MC.ahaGuide.steps.ADD_FIRST_REPO || ( MC.instances.models && MC.instances.models.length !== 0 )" + ng-if = "!MC.ahaGuide.isAddingFirstRepo() || ( MC.instances.models && MC.instances.models.length !== 0 )" ) svg.iconnables.icons-template.grid-block.shrink use( From 41c0d80d4c41f484f1652003ce1ce989cc6aeb8a Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 15:56:48 -0700 Subject: [PATCH 254/577] Updated to bind just the parts of the ahaGuide we use in the environment controller --- .../environment/environmentBody/viewCardGrid.jade | 4 ++-- client/directives/environment/environmentController.js | 3 ++- .../environmentHeader/viewEnvironmentHeader.jade | 2 +- client/directives/environment/environmentView.jade | 8 ++++---- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index 8176d2c53..fea638b4f 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -10,7 +10,7 @@ //- empty state .card.gray.disabled.load.empty.p( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "$root.featureFlags.aha && !EC.ahaGuide.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" + ng-if = "$root.featureFlags.aha && !EC.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" ) h1.h1 😐 | This is awkward. @@ -20,7 +20,7 @@ //- empty state .card.gray.disabled.load.empty.p( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "!$root.featureFlags.aha && !EC.ahaGuide.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" + ng-if = "!$root.featureFlags.aha && !EC.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" ) Create a repository template to get started! //- server card diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 244d5b3b6..9bbb7a74b 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -28,7 +28,8 @@ function EnvironmentController( var EC = this; EC.showInviteButton = false; - EC.ahaGuide = ahaGuide; + EC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; + EC.isInGuide = ahaGuide.isInGuide; EC.showCreateTemplate = true; EC.showOverview = true; EC.toggleSidebar = function () { diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index ba12b90ab..8d9470b8a 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -1,6 +1,6 @@ //- new server button button.grid-block.shrink.btn.btn-md.green( - ng-class = "{ 'scale-in-modal': EC.ahaGuide.isAddingFirstRepo() }" + ng-class = "{ 'scale-in-modal': EC.isAddingFirstRepo() }" ng-click = "EC.triggerModal.newContainer()" ) svg.iconnables.icons-add.float-left diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 86e11ee6a..3cc60f59a 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,12 +42,12 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': EC.ahaGuide.isAddingFirstRepo() && data.instances.models.length === 0}" + ng-class = "{'empty': EC.isAddingFirstRepo() && data.instances.models.length === 0}" ) header.grid-block.align-center.environment-header( ng-include = "'viewEnvironmentHeader'" ng-init = "state.helpButton = {active: false}" - ng-if = "!EC.ahaGuide.isInGuide() || EC.showCreateTemplate" + ng-if = "!EC.isInGuide() || EC.showCreateTemplate" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( @@ -62,7 +62,7 @@ ng-class = "{'align-center justify-center': EC.showCreateTemplate && data.instances.models.length === 0}" ) .modal-dialog.modal-sm( - ng-if = "EC.ahaGuide.isInGuide() && EC.showCreateTemplate && !data.instances.models.length" + ng-if = "EC.isInGuide() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide @@ -71,7 +71,7 @@ ) .grid-block.card-grid.clearfix( - ng-if = "!$root.featureFlags.aha || data.instances.models.length > 0 || !EC.ahaGuide.isInGuide()" + ng-if = "!$root.featureFlags.aha || data.instances.models.length > 0 || !EC.isInGuide()" ng-include = "'viewCardGrid'" ) From b7130fb568dda1258fb3cda90faeb567d821746b Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 8 Sep 2016 16:07:02 -0700 Subject: [PATCH 255/577] Fixed tests --- test/unit/controllers/controllerInstance.unit.js | 1 + .../unit/directives/modals/newContainerModalController.unit.js | 3 ++- test/unit/environment/environmentController.unit.js | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/test/unit/controllers/controllerInstance.unit.js b/test/unit/controllers/controllerInstance.unit.js index 62f5f8c9b..abcca6489 100644 --- a/test/unit/controllers/controllerInstance.unit.js +++ b/test/unit/controllers/controllerInstance.unit.js @@ -61,6 +61,7 @@ describe('controllerInstance'.bold.underline.blue, function () { setInstanceState: sinon.spy() }; $provide.value('ahaGuide', { + isAddingFirstRepo: sinon.stub().returns(false), getCurrentStep: sinon.stub().returns(1), steps: { ADD_FIRST_BRANCH: 123 diff --git a/test/unit/directives/modals/newContainerModalController.unit.js b/test/unit/directives/modals/newContainerModalController.unit.js index 35782fe09..c71b42b79 100644 --- a/test/unit/directives/modals/newContainerModalController.unit.js +++ b/test/unit/directives/modals/newContainerModalController.unit.js @@ -46,8 +46,9 @@ describe('NewContainerModalController'.bold.underline.blue, function () { angular.mock.module('app'); angular.mock.module(function ($provide) { $provide.value('ahaGuide', { + isAddingFirstRepo: sinon.stub().returns(false), isInGuide: sinon.stub(), - getCurrentSteop: sinon.stub() + getCurrentStep: sinon.stub() }); $provide.value('errs', errsStub); $provide.factory('fetchInstancesByPod', function ($q) { diff --git a/test/unit/environment/environmentController.unit.js b/test/unit/environment/environmentController.unit.js index 6dc8e6b35..5634df436 100644 --- a/test/unit/environment/environmentController.unit.js +++ b/test/unit/environment/environmentController.unit.js @@ -71,6 +71,7 @@ describe('environmentController'.bold.underline.blue, function () { $provide.value('user', thisUser); $provide.value('$state', ctx.state); $provide.value('ahaGuide', { + isAddingFirstRepo: sinon.stub().returns(false), getCurrentStep: sinon.stub(), steps: { ADD_FIRST_REPO: 'addFirstRepo?!' From 001c50eecfa028c41e0dc3d13bfe24b1878e13c4 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 8 Sep 2016 16:11:14 -0700 Subject: [PATCH 256/577] Moved handleInstanceUpdate function to servermodalcontroller --- .../setupMirrorServerModalController.js | 13 +------------ .../modalSetupServer/setupServerModalController.js | 11 ++--------- .../environment/modals/serverModalController.js | 10 ++++++++++ 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index baa7f4f0d..66457427a 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -40,6 +40,7 @@ function SetupMirrorServerModalController( 'getElasticHostname': parentController.getElasticHostname.bind(SMC), 'getNumberOfOpenTabs': parentController.getNumberOfOpenTabs.bind(SMC), 'getUpdatePromise': parentController.getUpdatePromise.bind(SMC), + 'handleInstanceUpdate': parentController.handleInstanceUpdate.bind(SMC), 'insertHostName': parentController.insertHostName.bind(SMC), 'isDirty': parentController.isDirty.bind(SMC), 'openDockerfile': parentController.openDockerfile.bind(SMC), @@ -156,18 +157,6 @@ function SetupMirrorServerModalController( }); }; - SMC.handleInstanceUpdate = function () { - var buildStatus = SMC.state.instance.status(); - var containerHostname = SMC.state.instance.getContainerHostname(); - $rootScope.$broadcast('buildStatusUpdated', { - status: buildStatus, - containerHostname: containerHostname - }); - if (buildStatus === 'running') { - SMC.page = 'run'; - } - }; - SMC.createServer = function () { // Wait until all changes to the context version have been resolved before // creating a build with that context version diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 8692d8db4..07d7b02aa 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -44,6 +44,7 @@ function SetupServerModalController( 'getElasticHostname': parentController.getElasticHostname.bind(SMC), 'getNumberOfOpenTabs': parentController.getNumberOfOpenTabs.bind(SMC), 'getUpdatePromise': parentController.getUpdatePromise.bind(SMC), + 'handleInstanceUpdate': parentController.handleInstanceUpdate.bind(SMC), 'insertHostName': parentController.insertHostName.bind(SMC), 'isDirty': parentController.isDirty.bind(SMC), 'openDockerfile': parentController.openDockerfile.bind(SMC), @@ -264,15 +265,7 @@ function SetupServerModalController( if (instance) { SMC.instance = instance; SMC.state.instance = instance; - SMC.state.instance.on('update', function() { - var buildStatus = SMC.state.instance.status(); - $rootScope.$broadcast('buildStatusUpdated', { - status: buildStatus - }); - if (buildStatus === 'running') { - SMC.page = 'run'; - } - }); + SMC.state.instance.on('update', SMC.handleInstanceUpdate); // Reset the opts, in the same way as `EditServerModalController` SMC.state.opts = { env: keypather.get(instance, 'attrs.env') || [], diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index db16dbe94..e2ce8aa24 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -347,6 +347,16 @@ function ServerModalController( }); }; + this.handleInstanceUpdate = function () { + var buildStatus = this.instance.status(); + $rootScope.$broadcast('buildStatusUpdated', { + status: buildStatus + }); + if (buildStatus === 'running') { + this.page = 'run'; + } + }; + this.switchToMirrorMode = function (state, openItems, dockerfile) { var SMC = this; return loadingPromises.add(SMC.name, promisify(state.contextVersion, 'update')({ From 977e04387e4446b12555aebf47dddbc21253053c Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Thu, 8 Sep 2016 16:15:53 -0700 Subject: [PATCH 257/577] added segment identify tracking --- client/services/serviceEventTracking.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 214031c0a..0646bcc5c 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -105,7 +105,7 @@ function EventTracking( } /** - * Intercom and Mixpanel user identification + * Intercom, Mixpanel, and Segment user identification * @throws Error * @param {Object} user - User Model instance * @return this @@ -176,6 +176,23 @@ EventTracking.prototype.boot = function (user, opts) { '$created': _keypather.get(userJSON, 'created'), '$email': _keypather.get(userJSON, 'email') }); + + //Segment + analytics.ready(function () { + analytics.identify(user.name, { + firstName: firstName, + lastName: lastName, + username: data.name, + email: _keypather.get(userJSON, 'email'), + createdAt: _keypather.get(userJSON, 'created'), + avatar: _keypather.get(userJSON, 'gravatar') + }); + if (opts.orgName) { + analytics.group(data.company.id, { + name: data.company.name + }); + } + }); return this; }; From 9b61f83d38e72d8a2ffdc35cd8aea7311ca3bdfa Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Thu, 8 Sep 2016 16:24:43 -0700 Subject: [PATCH 258/577] Removed FB events. Add segment to all events. --- client/services/serviceEventTracking.js | 29 +++++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 0646bcc5c..6a19783af 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -177,7 +177,7 @@ EventTracking.prototype.boot = function (user, opts) { '$email': _keypather.get(userJSON, 'email') }); - //Segment + // Segment analytics.ready(function () { analytics.identify(user.name, { firstName: firstName, @@ -200,6 +200,7 @@ EventTracking.prototype.boot = function (user, opts) { * Record user event toggling of selected commit in repository * Reports to: * - mixpanel + * - segment * @param {Object} data - key/value pairs of event data * - keys * - triggeredBuild: Boolean @@ -213,6 +214,9 @@ EventTracking.prototype.toggledCommit = function (data) { selectedCommit: data.acv }); this._mixpanel('track', eventName, eventData); + analytics.ready(function () { + analytics.track(eventName, eventData); + }); return this; }; @@ -221,6 +225,7 @@ EventTracking.prototype.toggledCommit = function (data) { * Reports to: * - intercom * - mixpanel + * - segment * @param {Boolean} cache - build triggered without cache * @return this */ @@ -231,6 +236,9 @@ EventTracking.prototype.triggeredBuild = function (cache) { }); this._Intercom('trackEvent', eventName, eventData); this._mixpanel('track', eventName, eventData); + analytics.ready(function () { + analytics.track(eventName, eventData); + }); return this; }; @@ -238,6 +246,7 @@ EventTracking.prototype.triggeredBuild = function (cache) { * Record user visit to states * Reports to: * - mixpanel + * - segment * @return this */ EventTracking.prototype.visitedState = function () { @@ -246,6 +255,9 @@ EventTracking.prototype.visitedState = function () { referral: _$location.search().ref || 'direct' }); this._mixpanel('track', eventName, eventData); + analytics.ready(function () { + analytics.track(eventName, eventData); + }); return this; }; @@ -266,6 +278,9 @@ EventTracking.prototype.update = function () { */ EventTracking.prototype.trackClicked = function (data) { this._mixpanel('track', 'clicked - ' + _keypather.get(data, 'text'), data); + analytics.ready(function () { + analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); + }); return this; }; @@ -283,12 +298,12 @@ EventTracking.prototype.createdRepoContainer = function (org, repo) { }); } - if (this.$window.fbq) { - this.$window.fbq('track', 'ViewContent', { + analytics.ready(function () { + analytics.track('ViewContent', { action: 'CreateContainer', type: 'Repo' }); - } + }); }; /** @@ -303,10 +318,10 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { }); } - if (this.$window.fbq) { - this.$window.fbq('track', 'ViewContent', { + analytics.ready(function () { + analytics.track('ViewContent', { action: 'CreateContainer', type: 'NonRepo' }); - } + }); }; From 0f69353e32f2cf2b2abe15634b210f5d28473107 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Thu, 8 Sep 2016 16:27:04 -0700 Subject: [PATCH 259/577] added containername in segment --- client/services/serviceEventTracking.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 6a19783af..55107e0b4 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -301,7 +301,8 @@ EventTracking.prototype.createdRepoContainer = function (org, repo) { analytics.ready(function () { analytics.track('ViewContent', { action: 'CreateContainer', - type: 'Repo' + type: 'Repo', + containerName: containerName }); }); }; @@ -321,7 +322,8 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { analytics.ready(function () { analytics.track('ViewContent', { action: 'CreateContainer', - type: 'NonRepo' + type: 'NonRepo', + containerName: containerName }); }); }; From b4c406e96749e81ceed09bb380a889aff485de49 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 16:33:06 -0700 Subject: [PATCH 260/577] add empty state to containers view --- .../styles/scss/layout/instances-list.scss | 27 +++---------------- client/services/featureFlagService.js | 1 + .../instances/viewInstancesList.jade | 11 +++++++- client/templates/viewInstance.jade | 2 +- 4 files changed, 15 insertions(+), 26 deletions(-) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 64d5b4510..e8fd0ce26 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -37,30 +37,9 @@ > .well { background: $white; border-color: $gray-lighter; - margin-bottom: 15px; - padding-left: 30px; - padding-right: 30px; - position: relative; - - .icons-branch { - flex: 0 0 30px; - height: 30px; - } - - // 'x' button - .btn-xs { - color: $gray-light; - height: 18px; - position: absolute; - right: 12px; - top: 12px; - width: 18px; - - &:hover, - &:active { - color: $red; - } - } + font-size: 21px; + margin-top: 3px; + padding: 15px 24px 24px; } .a-sref { diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index fea85d2d0..134969f46 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -27,6 +27,7 @@ function featureFlags( connections: false, configTerminal: false, // flag for terminal in config view containersViewTemplateControls: false, + containersViewEmptyState: false, dockerfileMirroringMultiple: false, editAnyInstance: false, emptyFolder: false, // shows empty folder markup diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 3c970810c..4d9f45da9 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -26,7 +26,9 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-template = "templateMenuPopoverView" ) Create Template - .list-item-cluster + .list-item-cluster( + ng-if = "!$root.featureFlags.containersViewEmptyState" + ) .grid-block.list-containers.vertical.text-overflow.open //- master repository containers .grid-block( @@ -44,8 +46,15 @@ p.p.text-center.text-gray-light.padding-sm( ng-repeat = "masterInstance in CIS.instancesByPod.models | instanceHasRepo:false | orderBy: ['attrs.name'] as nonRepoInstances track by masterInstance.attrs.name" ) +.well.text-center( + ng-if = "$root.featureFlags.containersViewEmptyState" +) 😐 + br + .small You don’t have any templates. Click the button above to create one. + //- branch clusters .list-clusters( + ng-if = "!$root.featureFlags.containersViewEmptyState" ng-repeat = "masterInstance in CIS.instancesByPod | instanceHasRepo:true | orderBy: ['attrs.name'] track by masterInstance.attrs.name" ng-show = "CIS.shouldShowParent(masterInstance)" ) diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index f0a977751..1796966ae 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -5,7 +5,7 @@ ) .grid-block.vertical.instance( - ng-if = "!isLoading.main" + ng-if = "!isLoading.main && !$root.featureFlags.containersViewEmptyState" ) .grid-block.vertical //- show if server build is being swapped out From a07ec230f0e07d7b6ee07d5eaef302c0e2c1d562 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 16:33:57 -0700 Subject: [PATCH 261/577] make empty states match --- .../directives/environment/environmentBody/viewCardGrid.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index b937d95ae..0145b6263 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -13,9 +13,9 @@ ng-if = "data.instances && !$root.isLoading.sidebar && !data.instances.models.length && !$root.featureFlags.aha" ) h1.h1 😐 - | This is awkward. + | You don’t have any templates. br - | You don‘t have any templates. + | Click the button above to create one. //- server card .card.gray.disabled.load( From 34ca59ecc4d120885bd929e6f631fea697a516d2 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 8 Sep 2016 16:38:53 -0700 Subject: [PATCH 262/577] Fixed broken test --- test/unit/controllers/setupServerModalController.unit.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/controllers/setupServerModalController.unit.js b/test/unit/controllers/setupServerModalController.unit.js index da4a85203..1db5f5eb4 100644 --- a/test/unit/controllers/setupServerModalController.unit.js +++ b/test/unit/controllers/setupServerModalController.unit.js @@ -77,6 +77,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { this.getElasticHostname = sinon.spy(); this.getNumberOfOpenTabs = sinon.spy(); this.getUpdatePromise = sinon.spy(); + this.handleInstanceUpdate = sinon.spy(); this.insertHostName = sinon.spy(); this.isDirty = sinon.spy(); this.openDockerfile = sinon.spy(); From 66bc245f0e047995bfbb1b7866f93b60cf0df076 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 17:25:25 -0700 Subject: [PATCH 263/577] add arrows to instance list popover buttons --- .../scss/components/buttons/buttons.scss | 2 +- .../styles/scss/layout/instances-list.scss | 35 +++++++++---------- .../scss/popover/popover-branch-menu.scss | 5 ++- .../templateMenuPopoverView.jade | 4 +-- .../instances/viewInstancesList.jade | 16 ++++++--- 5 files changed, 34 insertions(+), 28 deletions(-) diff --git a/client/assets/styles/scss/components/buttons/buttons.scss b/client/assets/styles/scss/components/buttons/buttons.scss index 8b4942c69..c254c8d7c 100755 --- a/client/assets/styles/scss/components/buttons/buttons.scss +++ b/client/assets/styles/scss/components/buttons/buttons.scss @@ -115,7 +115,7 @@ font-size: 12px; height: $input-xxs; line-height: $input-line-height-xxs; - padding: 0 3px; + padding: 0 5px; } // .btn-icon diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index e8fd0ce26..0eac401d5 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -11,18 +11,6 @@ position: relative; width: $instance-list-width; - .btn-xs.gray { - border-color: #ddd; - color: #a1a1a1; - font-size: 12px; - font-weight: 400; - height: 20px; - padding: 0 4px; - right: -6px; - top: 1px; - width: auto; - } - &.in { display: block; } @@ -87,18 +75,29 @@ .list-clusters-heading { height: 27px; margin: 4px 0; - padding: 0 10px 0 31px; + padding: 0 4px 0 31px; // repo name .text-overflow { padding-right: 9px; } - // '+' button - .btn-xs { - line-height: initial; - overflow: hidden; - width: $input-xs; + // 'add…' buttons + .btn-xxs { + color: lighten($gray,15); + font-weight: $weight-normal; + height: 20px; + top: 1px; + + &:hover { + color: $gray; + } + + .icons-arrow-forward { + height: 12px; + margin-right: -3px; + width: 12px; + } } } diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 90936e073..dcbf1ce92 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -65,12 +65,11 @@ } .btn-radio { - border-radius: $input-border-radius-lg; flex: 0 1 50%; font-size: 13px; height: auto; line-height: 1.4; - padding: 9px 15px; + padding: 9px 12px; text-align: left; + .btn-radio { @@ -84,7 +83,7 @@ .iconnables { height: 18px; - margin-right: 9px; + margin-right: 6px; width: 18px; } } diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 6574ab1eb..12b1a5989 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -20,7 +20,7 @@ xlink:href = "#icons-new-repository-server" ) .grid-block.vertical.shrink Repository - .small From your org + .small Add from your org button.grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'nonRepo'}" ng-click = "state.tab = 'nonRepo'" @@ -31,7 +31,7 @@ xlink:href = "#icons-server-new" ) .grid-block.vertical.shrink Non-Repository - .small For services & DBs + .small Add a service or DB .popover-content( ng-if = "state.tab === 'repo'" ng-init = "state.branchesLoaded = null" diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 4d9f45da9..7a9ad9487 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -18,13 +18,17 @@ p.p.text-center.text-gray-light.padding-sm( .grid-block.align-center.list-item-cluster.list-clusters-heading span.grid-content.text-overflow Templates - button.grid-block.shrink.btn.btn-xs.gray( + button.grid-block.align-center.shrink.btn.btn-xxs.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.containersViewTemplateControls" pop-over - pop-over-options = "{\"top\":-30,\"left\":105}" + pop-over-options = "{\"top\":-30,\"left\":114}" pop-over-template = "templateMenuPopoverView" ) Create Template + svg.iconnables.icons-arrow-forward + use( + xlink:href = "#icons-arrow-down" + ) .list-item-cluster( ng-if = "!$root.featureFlags.containersViewEmptyState" @@ -66,15 +70,19 @@ p.p.text-center.text-gray-light.padding-sm( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} //- '+' button for adding branches and configuring clusters - button.grid-block.shrink.btn.btn-xs.gray( + button.grid-block.align-center.shrink.btn.btn-xxs.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" ng-click = "CIS.popInstanceOpen(masterInstance)" pop-over pop-over-controller = "CIS" - pop-over-options = "{\"verticallyCentered\":true,\"left\":78}" + pop-over-options = "{\"verticallyCentered\":true,\"left\":87}" pop-over-template = "branchMenuPopoverView" ) Add Branch + svg.iconnables.icons-arrow-forward + use( + xlink:href = "#icons-arrow-down" + ) //- repo config button (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( From c217ada5d6bffa37040fec7b9ad6e978d4cd71ff Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 17:32:55 -0700 Subject: [PATCH 264/577] tweaks --- client/assets/styles/scss/popover/popover-branch-menu.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index dcbf1ce92..06eb20c9d 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -65,6 +65,7 @@ } .btn-radio { + border-radius: $input-border-radius-lg; flex: 0 1 50%; font-size: 13px; height: auto; @@ -73,7 +74,7 @@ text-align: left; + .btn-radio { - margin-left: 6px; + margin-left: 9px; } .small { From b6451136a8f2f4dec0916d9d29c807f6c8b25e7e Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 17:50:23 -0700 Subject: [PATCH 265/577] more tweaks --- client/assets/styles/scss/popover/popover-branch-menu.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 06eb20c9d..a178c64ca 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -61,7 +61,7 @@ .popover-header { display: flex; height: auto; - padding: 12px 15px; + padding: 15px; } .btn-radio { From d68a4b2d4df7270bc7c7a27cb803c70c03c297a5 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Thu, 8 Sep 2016 17:56:08 -0700 Subject: [PATCH 266/577] attempting to track org-select visit and dock create --- client/config/routes.js | 6 ++++ .../createNewSandboxForUserService.js | 2 ++ .../services/doesOrgHaveStartedDockService.js | 2 ++ client/services/serviceEventTracking.js | 30 +++++++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/client/config/routes.js b/client/config/routes.js index 182ada309..d02ec3f78 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -73,6 +73,12 @@ module.exports = [ }, whitelistedOrgs: function (fetchWhitelistForDockCreated) { return fetchWhitelistForDockCreated(); + }, + booted: function (eventTracking, user) { + return eventTracking.boot(user) + .then(function(eventTracking) { + return eventTracking.visitedOrgSelectPage(); + }); } } }, { diff --git a/client/services/createNewSandboxForUserService.js b/client/services/createNewSandboxForUserService.js index dfba27d2a..a66333e30 100644 --- a/client/services/createNewSandboxForUserService.js +++ b/client/services/createNewSandboxForUserService.js @@ -4,12 +4,14 @@ require('app') .factory('createNewSandboxForUserService', createNewSandboxForUserService); function createNewSandboxForUserService( + eventTracking, fetchUser, promisify ) { return function (orgName) { return fetchUser() .then(function (user) { + eventTracking.waitingForInfrastructure(orgName); return promisify(user, 'createUserWhitelist')({ name: orgName }); }); }; diff --git a/client/services/doesOrgHaveStartedDockService.js b/client/services/doesOrgHaveStartedDockService.js index 6aa852272..bef6c56cb 100644 --- a/client/services/doesOrgHaveStartedDockService.js +++ b/client/services/doesOrgHaveStartedDockService.js @@ -4,6 +4,7 @@ require('app') .factory('doesOrgHaveStartedDock', doesOrgHaveStartedDock); function doesOrgHaveStartedDock( + eventTracking, fetchWhitelistedOrgsForDockCreated, keypather ) { @@ -15,4 +16,5 @@ function doesOrgHaveStartedDock( }); }); }; + eventTracking.visitedOrgSelectPage(); } diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 55107e0b4..83bc6c28b 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -327,3 +327,33 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { }); }); }; + +/** + * Track user visit to /orgSelect page + * Reports to: + * - segment + * @return this + */ +EventTracking.prototype.visitedOrgSelectPage = function () { + var eventName = 'Visited org-select page'; + + analytics.ready(function () { + analytics.track(eventName); + }); + return this; +}; + +/** + * Track org click on /orgSelect page + * Reports to: + * - segment + * @return this + */ +EventTracking.prototype.waitingForInfrastructure = function () { + var eventName = 'Waiting for infrastrucuture'; + + analytics.ready(function () { + analytics.track(eventName); + }); + return this; +}; \ No newline at end of file From 52fc0eafcdd49d978e7899f1d69e36ad67d86a15 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 8 Sep 2016 18:34:42 -0700 Subject: [PATCH 267/577] fix button alignment --- client/templates/instances/viewInstancesList.jade | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 50710d229..f5cbad514 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -18,7 +18,8 @@ p.p.text-center.text-gray-light.padding-sm( .grid-block.align-center.list-item-cluster.list-clusters-heading span.grid-content.text-overflow Templates - button.grid-block.align-center.shrink.btn.btn-xxs.gray( + //- div instead of button so safari doesn’t get weird with alignment + .grid-block.align-center.shrink.btn.btn-xxs.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.containersViewTemplateControls" pop-over @@ -69,8 +70,8 @@ p.p.text-center.text-gray-light.padding-sm( span.grid-content.text-overflow( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} - //- '+' button for adding branches and configuring clusters - button.grid-block.align-center.shrink.btn.btn-xxs.gray( + //- div instead of button so safari doesn’t get weird with alignment + .grid-block.align-center.shrink.btn.btn-xxs.gray( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" ng-click = "CIS.popInstanceOpen(masterInstance)" From 2bc5a624b2a351eb065279929e47410afea11d3b Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 10:19:12 -0700 Subject: [PATCH 268/577] update header copy --- .../styles/scss/popover/popover-branch-menu.scss | 13 +++++++------ .../branchMenuPopover/templateMenuPopoverView.jade | 12 ++++++++---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index a178c64ca..fcc2503d2 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -1,12 +1,12 @@ .popover-branch-menu, .popover-template-menu { max-width: 360px; - min-height: 90px; + min-height: 105px; width: 100%; .popover-content.popover-content { - max-height: 360px; - min-height: 90px; + max-height: 375px; + min-height: 105px; overflow-y: auto; } @@ -61,16 +61,17 @@ .popover-header { display: flex; height: auto; - padding: 15px; + padding: 9px; } .btn-radio { border-radius: $input-border-radius-lg; flex: 0 1 50%; font-size: 13px; + font-weight: $weight-bold; height: auto; line-height: 1.4; - padding: 9px 12px; + padding: 9px 15px; text-align: left; + .btn-radio { @@ -84,7 +85,7 @@ .iconnables { height: 18px; - margin-right: 6px; + margin-right: 9px; width: 18px; } } diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 12b1a5989..98adac62e 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -10,7 +10,7 @@ style = "top: 39px;" ) .grid-block.popover-header - button.grid-block.align-center.btn.btn-radio( + .grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'repo'}" ng-click = "state.tab = 'repo'" ng-disabled = "state.tab !== 'repo'&& state.loading" @@ -20,8 +20,10 @@ xlink:href = "#icons-new-repository-server" ) .grid-block.vertical.shrink Repository - .small Add from your org - button.grid-block.align-center.btn.btn-radio( + .small From your GitHub + br + | organization + .grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'nonRepo'}" ng-click = "state.tab = 'nonRepo'" ng-disabled = "state.tab !== 'nonRepo'&& state.loading" @@ -31,7 +33,9 @@ xlink:href = "#icons-server-new" ) .grid-block.vertical.shrink Non-Repository - .small Add a service or DB + .small For a database or + br + | other service .popover-content( ng-if = "state.tab === 'repo'" ng-init = "state.branchesLoaded = null" From abccb80461189a9d4355125f0960b7159342d924 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 11:22:55 -0700 Subject: [PATCH 269/577] fixed tracking on org-select load --- client/config/routes.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/client/config/routes.js b/client/config/routes.js index d02ec3f78..16f22df77 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -75,10 +75,8 @@ module.exports = [ return fetchWhitelistForDockCreated(); }, booted: function (eventTracking, user) { - return eventTracking.boot(user) - .then(function(eventTracking) { - return eventTracking.visitedOrgSelectPage(); - }); + eventTracking.boot(user); + eventTracking.visitedOrgSelectPage(); } } }, { From 54dcf84ee1ff2644fe0c38daaf31759f571cca0f Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 11:24:48 -0700 Subject: [PATCH 270/577] dont need this --- client/services/doesOrgHaveStartedDockService.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/services/doesOrgHaveStartedDockService.js b/client/services/doesOrgHaveStartedDockService.js index bef6c56cb..6aa852272 100644 --- a/client/services/doesOrgHaveStartedDockService.js +++ b/client/services/doesOrgHaveStartedDockService.js @@ -4,7 +4,6 @@ require('app') .factory('doesOrgHaveStartedDock', doesOrgHaveStartedDock); function doesOrgHaveStartedDock( - eventTracking, fetchWhitelistedOrgsForDockCreated, keypather ) { @@ -16,5 +15,4 @@ function doesOrgHaveStartedDock( }); }); }; - eventTracking.visitedOrgSelectPage(); } From 047afc9a616360bfec6268aa47e34c017b22bcbf Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 11:39:13 -0700 Subject: [PATCH 271/577] replaced more fb tracking with segment --- client/services/serviceEventTracking.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 83bc6c28b..19b3aa8d9 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -132,11 +132,11 @@ EventTracking.prototype.boot = function (user, opts) { _sift.push(['_setSessionId', session]); _sift.push(['_trackPageview']); - if (this.$window.fbq) { - this.$window.fbq('track', 'ViewContent', { + analytics.ready(function () { + analytics.track('ViewContent', { action: 'LoggedIn' }); - } + }); } this._user = user; @@ -349,11 +349,11 @@ EventTracking.prototype.visitedOrgSelectPage = function () { * - segment * @return this */ -EventTracking.prototype.waitingForInfrastructure = function () { +EventTracking.prototype.waitingForInfrastructure = function (orgName) { var eventName = 'Waiting for infrastrucuture'; - + analytics.ready(function () { - analytics.track(eventName); + analytics.track(eventName, {org: orgName}); }); return this; }; \ No newline at end of file From 0339c46d7a25e767d788c49e2c21ec34e6231b90 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 11:58:50 -0700 Subject: [PATCH 272/577] fix identify tracking --- client/services/serviceEventTracking.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 19b3aa8d9..1f9ed901e 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -179,7 +179,7 @@ EventTracking.prototype.boot = function (user, opts) { // Segment analytics.ready(function () { - analytics.identify(user.name, { + analytics.identify(data.name, { firstName: firstName, lastName: lastName, username: data.name, @@ -187,6 +187,8 @@ EventTracking.prototype.boot = function (user, opts) { createdAt: _keypather.get(userJSON, 'created'), avatar: _keypather.get(userJSON, 'gravatar') }); + analytics.alias(user.oauthId()); + analytics.alias(_keypather.get(userJSON, '_id')); if (opts.orgName) { analytics.group(data.company.id, { name: data.company.name From 920c8f9425a3d252f3e52734b202e295f83c65d2 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 12:10:16 -0700 Subject: [PATCH 273/577] stubbing segment to pass tests --- client/services/serviceEventTracking.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 1f9ed901e..b4453e54f 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -83,6 +83,15 @@ function EventTracking( this._Intercom = angular.noop; } + /** + * Stub Segment when SDK not present + * (development/staging environments) + */ + if (!analytics) { + // stub segment (analytics) if not present + analytics = angular.noop; + } + /** * Wrap invokations of mixpanel SDK API methods (object properties) * @param {String} mixpanel SDK API method name From 8d842b80e314bc866c252505fa8031d335dff233 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 12:16:15 -0700 Subject: [PATCH 274/577] fixing tests --- client/services/serviceEventTracking.js | 51 +++++++++++++------------ 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index b4453e54f..cb3f7649e 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -42,6 +42,7 @@ function EventTracking( _$location = $location; this._Intercom = $window.Intercom; + this.analytics = $window.analytics; this._user = null; this.$window = $window; @@ -87,9 +88,9 @@ function EventTracking( * Stub Segment when SDK not present * (development/staging environments) */ - if (!analytics) { + if (!this.analytics) { // stub segment (analytics) if not present - analytics = angular.noop; + this.analytics = angular.noop; } /** @@ -141,8 +142,8 @@ EventTracking.prototype.boot = function (user, opts) { _sift.push(['_setSessionId', session]); _sift.push(['_trackPageview']); - analytics.ready(function () { - analytics.track('ViewContent', { + this.analytics.ready(function () { + this.analytics.track('ViewContent', { action: 'LoggedIn' }); }); @@ -187,8 +188,8 @@ EventTracking.prototype.boot = function (user, opts) { }); // Segment - analytics.ready(function () { - analytics.identify(data.name, { + this.analytics.ready(function () { + this.analytics.identify(data.name, { firstName: firstName, lastName: lastName, username: data.name, @@ -196,10 +197,10 @@ EventTracking.prototype.boot = function (user, opts) { createdAt: _keypather.get(userJSON, 'created'), avatar: _keypather.get(userJSON, 'gravatar') }); - analytics.alias(user.oauthId()); - analytics.alias(_keypather.get(userJSON, '_id')); + this.analytics.alias(user.oauthId()); + this.analytics.alias(_keypather.get(userJSON, '_id')); if (opts.orgName) { - analytics.group(data.company.id, { + this.analytics.group(data.company.id, { name: data.company.name }); } @@ -225,8 +226,8 @@ EventTracking.prototype.toggledCommit = function (data) { selectedCommit: data.acv }); this._mixpanel('track', eventName, eventData); - analytics.ready(function () { - analytics.track(eventName, eventData); + this.analytics.ready(function () { + this.analytics.track(eventName, eventData); }); return this; }; @@ -247,8 +248,8 @@ EventTracking.prototype.triggeredBuild = function (cache) { }); this._Intercom('trackEvent', eventName, eventData); this._mixpanel('track', eventName, eventData); - analytics.ready(function () { - analytics.track(eventName, eventData); + this.analytics.ready(function () { + this.analytics.track(eventName, eventData); }); return this; }; @@ -266,8 +267,8 @@ EventTracking.prototype.visitedState = function () { referral: _$location.search().ref || 'direct' }); this._mixpanel('track', eventName, eventData); - analytics.ready(function () { - analytics.track(eventName, eventData); + this.analytics.ready(function () { + this.analytics.track(eventName, eventData); }); return this; }; @@ -289,8 +290,8 @@ EventTracking.prototype.update = function () { */ EventTracking.prototype.trackClicked = function (data) { this._mixpanel('track', 'clicked - ' + _keypather.get(data, 'text'), data); - analytics.ready(function () { - analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); + this.analytics.ready(function () { + this.analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); }); return this; }; @@ -309,8 +310,8 @@ EventTracking.prototype.createdRepoContainer = function (org, repo) { }); } - analytics.ready(function () { - analytics.track('ViewContent', { + this.analytics.ready(function () { + this.analytics.track('ViewContent', { action: 'CreateContainer', type: 'Repo', containerName: containerName @@ -330,8 +331,8 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { }); } - analytics.ready(function () { - analytics.track('ViewContent', { + this.analytics.ready(function () { + this.analytics.track('ViewContent', { action: 'CreateContainer', type: 'NonRepo', containerName: containerName @@ -348,8 +349,8 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { EventTracking.prototype.visitedOrgSelectPage = function () { var eventName = 'Visited org-select page'; - analytics.ready(function () { - analytics.track(eventName); + this.analytics.ready(function () { + this.analytics.track(eventName); }); return this; }; @@ -363,8 +364,8 @@ EventTracking.prototype.visitedOrgSelectPage = function () { EventTracking.prototype.waitingForInfrastructure = function (orgName) { var eventName = 'Waiting for infrastrucuture'; - analytics.ready(function () { - analytics.track(eventName, {org: orgName}); + this.analytics.ready(function () { + this.analytics.track(eventName, {org: orgName}); }); return this; }; \ No newline at end of file From e828c4cb75dfd95e57de9c5064549f4c9f087c2d Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 12:22:48 -0700 Subject: [PATCH 275/577] fixed typo with repo createcontainer --- client/services/serviceEventTracking.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index cb3f7649e..06ceb664c 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -314,7 +314,7 @@ EventTracking.prototype.createdRepoContainer = function (org, repo) { this.analytics.track('ViewContent', { action: 'CreateContainer', type: 'Repo', - containerName: containerName + containerName: repo }); }); }; From a8417879398cb0458b88150ec2a40a4b756791e3 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 9 Sep 2016 13:37:58 -0700 Subject: [PATCH 276/577] Only show github-integraiton if we need to setup runnabot --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 5358b9d10..d68b07cd6 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -88,5 +88,6 @@ p.small Your branches will update on every commit you make. .grid-block.vertical.align-center.form-github( + ng-if = "getCurrentStep() === steps.SETUP_RUNNABOT" github-integration ) From 96143763baca40309408ac4546faf3efc80482de Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 9 Sep 2016 14:09:54 -0700 Subject: [PATCH 277/577] Removed unused scope variable from popover directive --- client/directives/popovers/popOverDirective.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index 7d5e805cd..fda8b35ab 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -14,7 +14,6 @@ var scopeVars = { noBroadcast: '=? popOverNoBroadcast', actions: '=? popOverActions', active: '=? popOverActive', - func: '=? popOverFunc', template: '= popOverTemplate', controller: '=? popOverController', controllerAs: '@? popOverControllerAs' From 36f479d740f83a5d6acf846b48f7e59360ef2219 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 9 Sep 2016 14:16:17 -0700 Subject: [PATCH 278/577] 4.20.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4dd4414cf..e16851395 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.19.3", + "version": "4.20.0", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 208eb1faad53c5d6c008ede1e200bb62141d3be5 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 14:17:02 -0700 Subject: [PATCH 279/577] remove icons from popover header --- .../scss/popover/popover-branch-menu.scss | 14 +++++----- .../templateMenuPopoverView.jade | 28 +++++++++---------- .../newContainerModalView.jade | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index fcc2503d2..8e9c05c0b 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -61,7 +61,7 @@ .popover-header { display: flex; height: auto; - padding: 9px; + padding: 15px; } .btn-radio { @@ -75,18 +75,18 @@ text-align: left; + .btn-radio { - margin-left: 9px; + margin-left: 12px; } .small { font-size: 12px; opacity: .6; } + } - .iconnables { - height: 18px; - margin-right: 9px; - width: 18px; - } + .list-item .iconnables.icons-repository { + margin-right: 15px; + padding-left: 3px; + width: 24px; } } diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 98adac62e..3cf8920fd 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -15,27 +15,15 @@ ng-click = "state.tab = 'repo'" ng-disabled = "state.tab !== 'repo'&& state.loading" ) - svg.iconnables.grid-block.shrink - use( - xlink:href = "#icons-new-repository-server" - ) .grid-block.vertical.shrink Repository - .small From your GitHub - br - | organization + .small From your GitHub org .grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'nonRepo'}" ng-click = "state.tab = 'nonRepo'" ng-disabled = "state.tab !== 'nonRepo'&& state.loading" ) - svg.iconnables.grid-block.shrink - use( - xlink:href = "#icons-server-new" - ) .grid-block.vertical.shrink Non-Repository - .small For a database or - br - | other service + .small For a DB or service .popover-content( ng-if = "state.tab === 'repo'" ng-init = "state.branchesLoaded = null" @@ -65,6 +53,10 @@ ng-class = "{'disabled': state.loading}" ng-click = "state.loading = !state.loading" ) + svg.grid-content.shrink.iconnables.icons-repository + use( + xlink:href = "#icons-repository" + ) .grid-block.vertical .grid-content button-clicker .grid-block( @@ -97,6 +89,10 @@ li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) + svg.grid-content.shrink.iconnables.icons-repository + use( + xlink:href = "#icons-repository" + ) .grid-block.vertical .grid-content api .grid-block( @@ -123,6 +119,10 @@ li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) + svg.grid-content.shrink.iconnables.icons-repository + use( + xlink:href = "#icons-repository" + ) .grid-block.vertical .grid-content runnable.com .grid-block( diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 792471dd0..e4fee19ee 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -116,7 +116,7 @@ ) h1.modal-heading.text-overflow( ng-if = "!$root.featureFlags.aha1" - ) Container Name + ) Template Name svg.iconnables.icons-close( ng-click = "MC.close()" ) From 627bb74fdcd0d2e8501e513a22050e2aecfe5125 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 14:21:07 -0700 Subject: [PATCH 280/577] update text to match + hide arrows --- .../modals/modalNewContainer/newContainerModalView.jade | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index e4fee19ee..af87d5756 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -26,7 +26,8 @@ use( xlink:href = "#icons-new-repository-server" ) - .btn-text.grid-block Repository Template + .btn-text.grid-block.vertical.text-left Repository Template + small.small From your GitHub org //- disable this button when loading a repository .grid-block.align-center.shrink.btn.btn-radio( ng-disabled = "$root.isLoading[MC.name + 'SingleRepo']" @@ -42,7 +43,7 @@ xlink:href = "#icons-server-new" ) .btn-text.grid-block.vertical.text-left Non-Repository Template - small.small For services and databases + small.small For a database or service svg.iconnables.icons-close( ng-click = "MC.close()" ) @@ -67,6 +68,7 @@ header.modal-header svg.iconnables.icons-arrow-backward( ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && goToPanel('containerSelection', 'back')" + ng-if = "!$root.featureFlags.containersViewTemplateControls" ) use( xlink:href = "#icons-arrow-down" @@ -110,6 +112,7 @@ header.modal-header svg.iconnables.icons-arrow-backward( ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && goToPanel(MC.state.templateSource ? 'containerSelection' : 'dockerfileMirroring', 'back')" + ng-if = "!$root.featureFlags.containersViewTemplateControls" ) use( xlink:href = "#icons-arrow-down" From 2b11adf8ee317978125f7552b41b13ff6606ab38 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 9 Sep 2016 14:21:33 -0700 Subject: [PATCH 281/577] Stub analytics --- client/services/serviceEventTracking.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 06ceb664c..1e48e67bd 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -90,7 +90,10 @@ function EventTracking( */ if (!this.analytics) { // stub segment (analytics) if not present - this.analytics = angular.noop; + this.analytics = { + ready: angular.noop, + track: angular.noop + }; } /** @@ -348,7 +351,7 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { */ EventTracking.prototype.visitedOrgSelectPage = function () { var eventName = 'Visited org-select page'; - + this.analytics.ready(function () { this.analytics.track(eventName); }); @@ -363,9 +366,9 @@ EventTracking.prototype.visitedOrgSelectPage = function () { */ EventTracking.prototype.waitingForInfrastructure = function (orgName) { var eventName = 'Waiting for infrastrucuture'; - + this.analytics.ready(function () { this.analytics.track(eventName, {org: orgName}); }); return this; -}; \ No newline at end of file +}; From 78a6d8ee5c1baf56d0c06249e1258cf23d022140 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 14:24:39 -0700 Subject: [PATCH 282/577] update copy to match new buttons --- .../components/ahaGuide/components/addBranchGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/components/addBranchGuideView.jade b/client/directives/components/ahaGuide/components/addBranchGuideView.jade index a52426307..fb51a5a74 100644 --- a/client/directives/components/ahaGuide/components/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/components/addBranchGuideView.jade @@ -18,7 +18,7 @@ p.p.small.text-gray-light Add your First Branch p.p( ng-if = "state.showSubStep === 1" - ) Click the + button next to any repo name. + ) Click the ‘add branch’ button next to any repo name. p.p( ng-if = "state.showSubStep === 2" ) Select a branch to add. From ae2e6decf5ffc3a09a4c4bbc31dce91a5e836e31 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 14:32:14 -0700 Subject: [PATCH 283/577] increase border radius --- client/assets/styles/scss/layout/instances-list.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/client/assets/styles/scss/layout/instances-list.scss b/client/assets/styles/scss/layout/instances-list.scss index 0eac401d5..9b2d83e54 100644 --- a/client/assets/styles/scss/layout/instances-list.scss +++ b/client/assets/styles/scss/layout/instances-list.scss @@ -25,6 +25,7 @@ > .well { background: $white; border-color: $gray-lighter; + border-radius: $input-border-radius-lg; font-size: 21px; margin-top: 3px; padding: 15px 24px 24px; From 86dcddc83123e6d7953bc76b9dc4ef28da12841b Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 14:55:49 -0700 Subject: [PATCH 284/577] clarify error message --- .../environment/modals/confirmDeleteServerView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/environment/modals/confirmDeleteServerView.jade b/client/directives/environment/modals/confirmDeleteServerView.jade index f2d1078a9..4ee6ed169 100644 --- a/client/directives/environment/modals/confirmDeleteServerView.jade +++ b/client/directives/environment/modals/confirmDeleteServerView.jade @@ -2,11 +2,11 @@ .modal-dialog.modal-sm.modal-alert header.modal-body p.p.strong Are you sure you want to delete this template? - p.p Deleting this template cannot be undone. + p.p All containers that belong to this template will be deleted. This cannot be undone. footer.modal-footer.clearfix button.btn.btn-sm.gray.float-left( ng-click = "CMC.actions.cancel()" ) Cancel button.btn.btn-sm.red.float-right( ng-click = "CMC.actions.confirm()" - ) Delete Template \ No newline at end of file + ) Delete Template From 6b056e7df9ef13fe2923d1e4f8c7eecfa6816343 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 15:23:20 -0700 Subject: [PATCH 285/577] enable containers button when no templates exist --- client/directives/navBar/viewNav.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index e1957e008..d1325d436 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -21,7 +21,7 @@ a.a( | Templates a.a.disabled( - ng-if = "(dataApp.state.includes('base.config') && CA.instancesByPod && !CA.instancesByPod.models.length) || $root.featureFlags.aha1 || $root.featureFlags.aha1ExitedEarly" + ng-if = "(dataApp.state.includes('base.config') && CA.instancesByPod && !CA.instancesByPod.models.length) && !$root.featureFlags.containersViewTemplateControls || $root.featureFlags.aha1 || $root.featureFlags.aha1ExitedEarly" tooltip = "You don’t have any running containers yet!" tooltip-options = "{\"class\":\"right\",\"left\":75,\"top\":17}" ) @@ -32,7 +32,7 @@ a.a.disabled( | Containers a.a( - ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && !$root.featureFlags.aha1 && !$root.featureFlags.aha1ExitedEarly && !$root.featureFlags.aha2" + ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) && !$root.featureFlags.aha1 && !$root.featureFlags.aha1ExitedEarly && !$root.featureFlags.aha2 || $root.featureFlags.containersViewTemplateControls" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) From fcc30f4eb44fb8f5b934d5cf303742852a14c316 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 9 Sep 2016 15:41:15 -0700 Subject: [PATCH 286/577] removed this. inside analytics functions --- client/services/serviceEventTracking.js | 38 ++++++++++++++++--------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 1e48e67bd..fef2d560b 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -92,7 +92,17 @@ function EventTracking( // stub segment (analytics) if not present this.analytics = { ready: angular.noop, - track: angular.noop + track: angular.noop, + identify: angular.noop, + alias: angular.noop, + page: angular.noop, + group: angular.noop, + trackLink: angular.noop, + trackForm: angular.noop, + user: angular.noop, + debug: angular.noop, + on: angular.noop, + timeout: angular.noop }; } @@ -146,7 +156,7 @@ EventTracking.prototype.boot = function (user, opts) { _sift.push(['_trackPageview']); this.analytics.ready(function () { - this.analytics.track('ViewContent', { + analytics.track('ViewContent', { action: 'LoggedIn' }); }); @@ -192,7 +202,7 @@ EventTracking.prototype.boot = function (user, opts) { // Segment this.analytics.ready(function () { - this.analytics.identify(data.name, { + analytics.identify(data.name, { firstName: firstName, lastName: lastName, username: data.name, @@ -200,10 +210,10 @@ EventTracking.prototype.boot = function (user, opts) { createdAt: _keypather.get(userJSON, 'created'), avatar: _keypather.get(userJSON, 'gravatar') }); - this.analytics.alias(user.oauthId()); - this.analytics.alias(_keypather.get(userJSON, '_id')); + analytics.alias(user.oauthId()); + analytics.alias(_keypather.get(userJSON, '_id')); if (opts.orgName) { - this.analytics.group(data.company.id, { + analytics.group(data.company.id, { name: data.company.name }); } @@ -230,7 +240,7 @@ EventTracking.prototype.toggledCommit = function (data) { }); this._mixpanel('track', eventName, eventData); this.analytics.ready(function () { - this.analytics.track(eventName, eventData); + analytics.track(eventName, eventData); }); return this; }; @@ -252,7 +262,7 @@ EventTracking.prototype.triggeredBuild = function (cache) { this._Intercom('trackEvent', eventName, eventData); this._mixpanel('track', eventName, eventData); this.analytics.ready(function () { - this.analytics.track(eventName, eventData); + analytics.track(eventName, eventData); }); return this; }; @@ -271,7 +281,7 @@ EventTracking.prototype.visitedState = function () { }); this._mixpanel('track', eventName, eventData); this.analytics.ready(function () { - this.analytics.track(eventName, eventData); + analytics.track(eventName, eventData); }); return this; }; @@ -294,7 +304,7 @@ EventTracking.prototype.update = function () { EventTracking.prototype.trackClicked = function (data) { this._mixpanel('track', 'clicked - ' + _keypather.get(data, 'text'), data); this.analytics.ready(function () { - this.analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); + analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); }); return this; }; @@ -314,7 +324,7 @@ EventTracking.prototype.createdRepoContainer = function (org, repo) { } this.analytics.ready(function () { - this.analytics.track('ViewContent', { + analytics.track('ViewContent', { action: 'CreateContainer', type: 'Repo', containerName: repo @@ -335,7 +345,7 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { } this.analytics.ready(function () { - this.analytics.track('ViewContent', { + analytics.track('ViewContent', { action: 'CreateContainer', type: 'NonRepo', containerName: containerName @@ -353,7 +363,7 @@ EventTracking.prototype.visitedOrgSelectPage = function () { var eventName = 'Visited org-select page'; this.analytics.ready(function () { - this.analytics.track(eventName); + analytics.track(eventName); }); return this; }; @@ -368,7 +378,7 @@ EventTracking.prototype.waitingForInfrastructure = function (orgName) { var eventName = 'Waiting for infrastrucuture'; this.analytics.ready(function () { - this.analytics.track(eventName, {org: orgName}); + analytics.track(eventName, {org: orgName}); }); return this; }; From 68d947e48a233ff7e394eade6e38d55a3c821c1a Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 9 Sep 2016 15:46:04 -0700 Subject: [PATCH 287/577] Updated to use self everywhere! --- client/services/serviceEventTracking.js | 131 +++++++++++++----------- 1 file changed, 71 insertions(+), 60 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index fef2d560b..36a034d3a 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -31,6 +31,7 @@ function EventTracking( configEnvironment, siftApiConfig ) { + var self = this; SIFT_API_KEY = siftApiConfig; if (configEnvironment === 'production') { @@ -41,10 +42,10 @@ function EventTracking( _keypather = keypather; _$location = $location; - this._Intercom = $window.Intercom; - this.analytics = $window.analytics; - this._user = null; - this.$window = $window; + self._Intercom = $window.Intercom; + self.analytics = $window.analytics; + self._user = null; + self.$window = $window; /** * Extend per-event data with specific properties @@ -52,8 +53,8 @@ function EventTracking( * @param {Object} data - data for given event to be extended * @return Object - extended event object */ - this.extendEventData = function (data) { - if (!this._user) { + self.extendEventData = function (data) { + if (!self._user) { $log.error('eventTracking.boot() must be invoked before reporting events'); } // username owner if server page @@ -63,8 +64,8 @@ function EventTracking( state: $state.$current.name, href: $window.location.href }; - if (angular.isFunction(keypather.get(this._user, 'oauthName'))) { - baseData.userName = this._user.oauthName(); + if (angular.isFunction(keypather.get(self._user, 'oauthName'))) { + baseData.userName = self._user.oauthName(); } if ($stateParams.userName) { baseData.instanceOwner = $stateParams.userName; @@ -79,18 +80,18 @@ function EventTracking( * Stub Intercom when SDK not present * (development/staging environments) */ - if (!this._Intercom || $browser.cookies().isModerating) { + if (!self._Intercom || $browser.cookies().isModerating) { // stub intercom if not present - this._Intercom = angular.noop; + self._Intercom = angular.noop; } /** * Stub Segment when SDK not present * (development/staging environments) */ - if (!this.analytics) { + if (!self.analytics) { // stub segment (analytics) if not present - this.analytics = { + self.analytics = { ready: angular.noop, track: angular.noop, identify: angular.noop, @@ -111,7 +112,7 @@ function EventTracking( * @param {String} mixpanel SDK API method name * @params [1..n] optional arguments passed to mixpanel SDK */ - this._mixpanel = function () { + self._mixpanel = function () { if (!angular.isFunction(keypather.get($window, 'mixpanel.'+arguments[0]))) { // $log.info('Mixpanel JS SDK stubbed'); // $log.info(arguments); @@ -134,8 +135,9 @@ function EventTracking( * @return this */ EventTracking.prototype.boot = function (user, opts) { + var self = this; opts = opts || {}; - if (this._user) { return this; } + if (self._user) { return self; } if (!(user instanceof User)) { throw new Error('arguments[0] must be instance of User'); } @@ -155,14 +157,14 @@ EventTracking.prototype.boot = function (user, opts) { _sift.push(['_setSessionId', session]); _sift.push(['_trackPageview']); - this.analytics.ready(function () { - analytics.track('ViewContent', { + self.analytics.ready(function () { + self.nalytics.track('ViewContent', { action: 'LoggedIn' }); }); } - this._user = user; + self._user = user; var data = { name: user.oauthName(), email: user.attrs.email, @@ -179,12 +181,12 @@ EventTracking.prototype.boot = function (user, opts) { // Mixpanel uses a string GUID to track anon users // If we're still tracking the user via GUID, we need to alias // Otherwise, we can just identify ourselves - if (angular.isString(this._mixpanel('get_distinct_id'))) { - this._mixpanel('alias', user.oauthId()); + if (angular.isString(self._mixpanel('get_distinct_id'))) { + self._mixpanel('alias', user.oauthId()); } else { - this._mixpanel('identify', user.oauthId()); + self._mixpanel('identify', user.oauthId()); } - this._Intercom('boot', data); + self._Intercom('boot', data); var userJSON = user.toJSON(); var firstName = ''; var lastName = ''; @@ -193,7 +195,7 @@ EventTracking.prototype.boot = function (user, opts) { firstName = displayName.split(/ (.+)/)[0]; lastName = displayName.split(/ (.+)/)[1]; } - this._mixpanel('people.set', { + self._mixpanel('people.set', { '$first_name': firstName, '$last_name': lastName, '$created': _keypather.get(userJSON, 'created'), @@ -201,7 +203,7 @@ EventTracking.prototype.boot = function (user, opts) { }); // Segment - this.analytics.ready(function () { + self.analytics.ready(function () { analytics.identify(data.name, { firstName: firstName, lastName: lastName, @@ -218,7 +220,7 @@ EventTracking.prototype.boot = function (user, opts) { }); } }); - return this; + return self; }; /** @@ -233,16 +235,17 @@ EventTracking.prototype.boot = function (user, opts) { * @return this */ EventTracking.prototype.toggledCommit = function (data) { + var self = this; var eventName = 'toggled-commit'; - var eventData = this.extendEventData({ + var eventData = self.extendEventData({ triggeredBuild: !!data.triggeredBuild, selectedCommit: data.acv }); - this._mixpanel('track', eventName, eventData); - this.analytics.ready(function () { - analytics.track(eventName, eventData); + self._mixpanel('track', eventName, eventData); + self.analytics.ready(function () { + self.analytics.track(eventName, eventData); }); - return this; + return self; }; /** @@ -255,16 +258,17 @@ EventTracking.prototype.toggledCommit = function (data) { * @return this */ EventTracking.prototype.triggeredBuild = function (cache) { + var self = this; var eventName = 'triggered-build'; - var eventData = this.extendEventData({ + var eventData = self.extendEventData({ cache: cache }); - this._Intercom('trackEvent', eventName, eventData); - this._mixpanel('track', eventName, eventData); - this.analytics.ready(function () { - analytics.track(eventName, eventData); + self._Intercom('trackEvent', eventName, eventData); + self._mixpanel('track', eventName, eventData); + self.analytics.ready(function () { + self.analytics.track(eventName, eventData); }); - return this; + return self; }; /** @@ -275,15 +279,16 @@ EventTracking.prototype.triggeredBuild = function (cache) { * @return this */ EventTracking.prototype.visitedState = function () { + var self = this; var eventName = 'visited-state'; - var eventData = this.extendEventData({ + var eventData = self.extendEventData({ referral: _$location.search().ref || 'direct' }); - this._mixpanel('track', eventName, eventData); - this.analytics.ready(function () { - analytics.track(eventName, eventData); + self._mixpanel('track', eventName, eventData); + self.analytics.ready(function () { + self.analytics.track(eventName, eventData); }); - return this; + return self; }; /** @@ -292,8 +297,9 @@ EventTracking.prototype.visitedState = function () { * @return this */ EventTracking.prototype.update = function () { - this._Intercom('update'); - return this; + var self = this; + self._Intercom('update'); + return self; }; /** @@ -302,11 +308,12 @@ EventTracking.prototype.update = function () { * @returns {EventTracking} */ EventTracking.prototype.trackClicked = function (data) { - this._mixpanel('track', 'clicked - ' + _keypather.get(data, 'text'), data); - this.analytics.ready(function () { - analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); + var self = this; + self._mixpanel('track', 'clicked - ' + _keypather.get(data, 'text'), data); + self.analytics.ready(function () { + self.analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); }); - return this; + return self; }; /** @@ -316,15 +323,16 @@ EventTracking.prototype.trackClicked = function (data) { * @returns {EventTracking} */ EventTracking.prototype.createdRepoContainer = function (org, repo) { - if (this._mixpanel) { - this._mixpanel('track', 'createRepoContainer', { + var self = this; + if (self._mixpanel) { + self._mixpanel('track', 'createRepoContainer', { org: org, repo: repo }); } - this.analytics.ready(function () { - analytics.track('ViewContent', { + self.analytics.ready(function () { + self.analytics.track('ViewContent', { action: 'CreateContainer', type: 'Repo', containerName: repo @@ -338,14 +346,15 @@ EventTracking.prototype.createdRepoContainer = function (org, repo) { * @returns {EventTracking} */ EventTracking.prototype.createdNonRepoContainer = function (containerName) { - if (this._mixpanel) { - this._mixpanel('track', 'createNonRepoContainer', { + var self = this; + if (self._mixpanel) { + self._mixpanel('track', 'createNonRepoContainer', { containerName: containerName }); } - this.analytics.ready(function () { - analytics.track('ViewContent', { + self.analytics.ready(function () { + self.analytics.track('ViewContent', { action: 'CreateContainer', type: 'NonRepo', containerName: containerName @@ -360,12 +369,13 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { * @return this */ EventTracking.prototype.visitedOrgSelectPage = function () { + var self = this; var eventName = 'Visited org-select page'; - this.analytics.ready(function () { - analytics.track(eventName); + self.analytics.ready(function () { + self.analytics.track(eventName); }); - return this; + return self; }; /** @@ -375,10 +385,11 @@ EventTracking.prototype.visitedOrgSelectPage = function () { * @return this */ EventTracking.prototype.waitingForInfrastructure = function (orgName) { + var self = this; var eventName = 'Waiting for infrastrucuture'; - this.analytics.ready(function () { - analytics.track(eventName, {org: orgName}); + self.analytics.ready(function () { + self.analytics.track(eventName, {org: orgName}); }); - return this; + return self; }; From 096de84bfd06f475eba997a44d6ef0ffd82bc359 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 9 Sep 2016 15:47:04 -0700 Subject: [PATCH 288/577] Fixed typo --- client/services/serviceEventTracking.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 36a034d3a..94af19857 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -158,7 +158,7 @@ EventTracking.prototype.boot = function (user, opts) { _sift.push(['_trackPageview']); self.analytics.ready(function () { - self.nalytics.track('ViewContent', { + self.analytics.track('ViewContent', { action: 'LoggedIn' }); }); @@ -204,18 +204,18 @@ EventTracking.prototype.boot = function (user, opts) { // Segment self.analytics.ready(function () { - analytics.identify(data.name, { - firstName: firstName, - lastName: lastName, - username: data.name, - email: _keypather.get(userJSON, 'email'), - createdAt: _keypather.get(userJSON, 'created'), - avatar: _keypather.get(userJSON, 'gravatar') + self.analytics.identify(data.name, { + firstName: firstName, + lastName: lastName, + username: data.name, + email: _keypather.get(userJSON, 'email'), + createdAt: _keypather.get(userJSON, 'created'), + avatar: _keypather.get(userJSON, 'gravatar') }); - analytics.alias(user.oauthId()); - analytics.alias(_keypather.get(userJSON, '_id')); + self.analytics.alias(user.oauthId()); + self.analytics.alias(_keypather.get(userJSON, '_id')); if (opts.orgName) { - analytics.group(data.company.id, { + self.analytics.group(data.company.id, { name: data.company.name }); } From f6315780227ed214274878f25cd90460a33b5314 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 9 Sep 2016 16:07:37 -0700 Subject: [PATCH 289/577] fixes - fix xs and xxs input line-height - consistent filter placeholder - fix status popover --- client/assets/styles/scss/forms/forms-inputs.scss | 4 ++-- .../containerStatusButton/containerStatusButtonView.jade | 2 +- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 2 +- .../instance/branchMenuPopover/templateMenuPopoverView.jade | 4 ++-- .../instance/branchSetupModal/branchSetupModalView.jade | 2 +- .../popoverMoreContainers/viewMoreContainersPopover.jade | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/assets/styles/scss/forms/forms-inputs.scss b/client/assets/styles/scss/forms/forms-inputs.scss index 747b37d97..ec25a087f 100644 --- a/client/assets/styles/scss/forms/forms-inputs.scss +++ b/client/assets/styles/scss/forms/forms-inputs.scss @@ -116,7 +116,7 @@ input { &.input-xs { font-size: 13px; height: $input-xs; - line-height: 1; + line-height: $input-line-height-xs; &[type="search"] { border-radius: $input-xs; @@ -127,7 +127,7 @@ input { &.input-xxs { font-size: 13px; height: $input-xxs; - line-height: 1; + line-height: $input-line-height-xxs; &[type="search"] { border-radius: $input-xxs; diff --git a/client/directives/components/containerStatusButton/containerStatusButtonView.jade b/client/directives/components/containerStatusButton/containerStatusButtonView.jade index 499c49f41..d13e26da3 100644 --- a/client/directives/components/containerStatusButton/containerStatusButtonView.jade +++ b/client/directives/components/containerStatusButton/containerStatusButtonView.jade @@ -19,7 +19,7 @@ button.btn.btn-md.btn-status( pop-over-actions = "CSBC.actions" pop-over-active = "CSBC.popoverActive" pop-over-controller = "CSBC" - pop-over-options = "{\"centered\":true,\"top\":47}" + pop-over-options = "{\"centered\":true,\"top\":46}" pop-over-template = "containerStatusOptionsPopoverView" pop-over-trigger = "activeAttr" ) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 946912ce3..f8c896d55 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -107,7 +107,7 @@ .toggle-group.toggle-sm input.input.input-xs.input-search( ng-model = "CIS.branchQuery" - placeholder = "Filter" + placeholder = "Filter by name" required type = "search" ) diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 3cf8920fd..76a05ae6a 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -39,7 +39,7 @@ input.input.input-xs.input-search( ng-disabled = "state.loading" ng-if = "branch.length !== 0" - placeholder = "Filter" + placeholder = "Filter by name" required type = "search" ) @@ -160,7 +160,7 @@ ) input.input.input-xs.input-search( ng-disabled = "state.loading" - placeholder = "Filter" + placeholder = "Filter by name" required type = "search" ) diff --git a/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade b/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade index 107c408bc..eddf8cdfa 100644 --- a/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade +++ b/client/directives/instances/instance/branchSetupModal/branchSetupModalView.jade @@ -51,7 +51,7 @@ h4.grid-block.shrink.align-center.h4.text-gray.small.padding-xs .grid-content Select branches to add: input.grid-content.shrink.input.input-xs.input-search( - placeholder = "Filter" + placeholder = "Filter by name" required type = "search" ) diff --git a/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade b/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade index 80c6cc6e3..f48f69000 100644 --- a/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade +++ b/client/directives/popovers/popoverMoreContainers/viewMoreContainersPopover.jade @@ -5,7 +5,7 @@ .popover-header api input.input.input-xs.input-search( ng-model = "data.repoFilter" - placeholder = "Filter by branch name" + placeholder = "Filter by name" required type = "search" select-on = "showFilter" From d3de95883f6943c4b57b8ab4e90502402c9d5b2a Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 9 Sep 2016 16:10:35 -0700 Subject: [PATCH 290/577] update api-client --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e16851395..91346e1a6 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ ], "dependencies": { "101": "0.14.1", - "@runnable/api-client": "v9.2.0", + "@runnable/api-client": "v9.2.1", "angular": "1.3.15", "angular-animate": "1.3.15", "angular-clipboard": "1.4.x", From 035be1ab9eaf06ea14466b2c3ded4da617e6b2dc Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 9 Sep 2016 16:14:41 -0700 Subject: [PATCH 291/577] fix small text active state color --- client/assets/styles/scss/components/cards.scss | 6 +----- client/assets/styles/scss/components/lists.scss | 2 +- .../styles/scss/modals/modals-server-select.scss | 11 +++-------- .../styles/scss/popover/popover-primary-options.scss | 6 +----- 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/client/assets/styles/scss/components/cards.scss b/client/assets/styles/scss/components/cards.scss index 2948967a4..9037447af 100644 --- a/client/assets/styles/scss/components/cards.scss +++ b/client/assets/styles/scss/components/cards.scss @@ -165,10 +165,6 @@ box-shadow: none; } - > .small { - color: lighten($purple-light,18%); - } - .icons-arrow-down { color: lighten($purple-light,18%); } @@ -210,9 +206,9 @@ // description of tool > .small { - color: $gray; display: block; line-height: 15px; + opacity: .6; } // notifications diff --git a/client/assets/styles/scss/components/lists.scss b/client/assets/styles/scss/components/lists.scss index 09cb2524a..dd273cb86 100644 --- a/client/assets/styles/scss/components/lists.scss +++ b/client/assets/styles/scss/components/lists.scss @@ -121,8 +121,8 @@ } .small { - color: $gray; display: block; + opacity: .6; } .input-checkbox { diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index 366706d0a..c5928658d 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -146,16 +146,15 @@ } &.disabled { - color: $gray-light; cursor: default; - > .small { - color: $gray-light; + > .small, + .btn-icon { + opacity: .6; } .btn-icon { cursor: default; - opacity: .5; } } @@ -165,10 +164,6 @@ background: $white; border-color: currentColor; color: $green; - - .small { - color: currentColor; - } } &:last-child { diff --git a/client/assets/styles/scss/popover/popover-primary-options.scss b/client/assets/styles/scss/popover/popover-primary-options.scss index 95c6bef6a..e6960d2a5 100644 --- a/client/assets/styles/scss/popover/popover-primary-options.scss +++ b/client/assets/styles/scss/popover/popover-primary-options.scss @@ -17,13 +17,9 @@ padding-bottom: 6px; padding-top: 6px; - &:active .small { - color: currentColor; - } - .small { - color: $gray; margin-left: 27px; + opacity: .6; } } } From 068b86d75a20af5b1303da38a1d7bc6abf1f7b7f Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 9 Sep 2016 17:05:59 -0700 Subject: [PATCH 292/577] change add buttons to white --- client/templates/instances/viewInstancesList.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index f5cbad514..dd073bf4f 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -19,7 +19,7 @@ p.p.text-center.text-gray-light.padding-sm( .grid-block.align-center.list-item-cluster.list-clusters-heading span.grid-content.text-overflow Templates //- div instead of button so safari doesn’t get weird with alignment - .grid-block.align-center.shrink.btn.btn-xxs.gray( + .grid-block.align-center.shrink.btn.btn-xxs.white( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.containersViewTemplateControls" pop-over @@ -71,7 +71,7 @@ p.p.text-center.text-gray-light.padding-sm( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} //- div instead of button so safari doesn’t get weird with alignment - .grid-block.align-center.shrink.btn.btn-xxs.gray( + .grid-block.align-center.shrink.btn.btn-xxs.white( ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" ng-click = "CIS.popInstanceOpen(masterInstance)" From 4676b70e772ee8a6cdc5aa879f76bdd101bd4e6e Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 17:13:54 -0700 Subject: [PATCH 293/577] fix position of repository icon --- client/assets/styles/scss/popover/popover-branch-menu.scss | 6 +++--- .../modals/modalNewContainer/newContainerModalView.jade | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 8e9c05c0b..ce057d59e 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -85,8 +85,8 @@ } .list-item .iconnables.icons-repository { - margin-right: 15px; - padding-left: 3px; - width: 24px; + margin-left: 3px; + margin-right: 18px; + width: 18px; } } diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 96d159eaf..d8e884b9f 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -104,7 +104,7 @@ ng-include = "'spinner'" ng-if = "$root.isLoading[MC.name + 'SingleRepo']" ) - span() Next Step: Naming + span Next Step: Naming animated-panel.grid-block.vertical.modals-rename( name = "nameContainer" From 04182d49ce1034ec861950a146c8c0fc3045039f Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 9 Sep 2016 17:39:19 -0700 Subject: [PATCH 294/577] remove double border from stack radio --- client/assets/styles/scss/modals/modals-edit.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/assets/styles/scss/modals/modals-edit.scss b/client/assets/styles/scss/modals/modals-edit.scss index c1217a8a6..b732c2319 100644 --- a/client/assets/styles/scss/modals/modals-edit.scss +++ b/client/assets/styles/scss/modals/modals-edit.scss @@ -368,6 +368,11 @@ } } + &:active, + &.active { + box-shadow: none; + } + &:first-child { border-radius: $input-border-radius 0 0; } From 82366bcf514c3fc7121a7abe56340f727f05d15b Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 17:52:06 -0700 Subject: [PATCH 295/577] change hover and active states --- .../scss/popover/popover-branch-menu.scss | 36 ++++++++++++++----- .../branchMenuPopoverView.jade | 2 +- .../templateMenuPopoverView.jade | 8 ++--- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index ce057d59e..0ba56bd0a 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -10,18 +10,38 @@ overflow-y: auto; } - // loading state - .list-item.disabled { - cursor: not-allowed; - opacity: .5; + .list-item { + border: 1px solid transparent; - .spinner-wrapper { - padding: 4px; + &:hover:not(.disabled) { + background: $gray-lighterest; + border-color: $gray-lighter; + } - .path { - stroke: $gray; + &:active:not(.disabled), + &.active:not(.disabled) { + background: $white; + border-color: currentColor; + color: $green; + + .small { + color: currentColor; } } + + &.active { + cursor: default; + } + + // loading state + &.disabled { + cursor: not-allowed; + opacity: .5; + } + + .spinner-wrapper { + padding: 4px; + } } } diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 946912ce3..38b3a5c71 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -126,7 +126,7 @@ use( xlink:href = "#icons-add" ) - .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-gray( + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "$root.isLoading['buildingForkedBranch' + branch.attrs.name]" ng-include = "'spinner'" ) diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 3cf8920fd..67d420d38 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -50,7 +50,7 @@ ng-if = "state.branchesLoaded" ) li.grid-block.align-center.list-item.popover-list-item.multi-line( - ng-class = "{'disabled': state.loading}" + ng-class = "{'active': state.loading}" ng-click = "state.loading = !state.loading" ) svg.grid-content.shrink.iconnables.icons-repository @@ -82,7 +82,7 @@ use( xlink:href = "#icons-add" ) - .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-gray( + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "state.loading" ng-include = "'spinner'" ) @@ -168,7 +168,7 @@ ng-if = "state.servicesLoaded" ) li.grid-block.align-center.list-item.popover-list-item.multi-line( - ng-class = "{'disabled': state.loading}" + ng-class = "{'active': state.loading}" ng-click = "state.loading = !state.loading" ) img.grid-content.shrink.img( @@ -184,7 +184,7 @@ use( xlink:href = "#icons-add" ) - .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-gray( + .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "state.loading" ng-include = "'spinner'" ) From 0f6b10afe784e51e97b51a0f4a239fbbc0965bbb Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 9 Sep 2016 17:53:21 -0700 Subject: [PATCH 296/577] fix icon size --- client/assets/styles/scss/modals/modals.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/modals/modals.scss b/client/assets/styles/scss/modals/modals.scss index 6820a6c0f..a4931a518 100755 --- a/client/assets/styles/scss/modals/modals.scss +++ b/client/assets/styles/scss/modals/modals.scss @@ -293,7 +293,7 @@ .iconnables { display: block; - height: 21px; + height: 18px; margin: 0 auto; width: 18px; } From cf0a4a1ec140575efba6c95e655a77529922fe1f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 17:58:08 -0700 Subject: [PATCH 297/577] clean up coloring of .small in .popover-list-item --- client/assets/styles/scss/popover/popover-branch-menu.scss | 4 ---- client/assets/styles/scss/popover/popover.scss | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 0ba56bd0a..9871e8f2d 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -23,10 +23,6 @@ background: $white; border-color: currentColor; color: $green; - - .small { - color: currentColor; - } } &.active { diff --git a/client/assets/styles/scss/popover/popover.scss b/client/assets/styles/scss/popover/popover.scss index 976a6c2f3..1a9a806b4 100755 --- a/client/assets/styles/scss/popover/popover.scss +++ b/client/assets/styles/scss/popover/popover.scss @@ -259,8 +259,7 @@ background: rgba($purple-lightest,.9); color: $purple-light; - .iconnables, - .small { + .iconnables { color: $purple-light; } From 4279bd1a90dfd2ea02ad507ff4c972b6f875a2c8 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 18:01:13 -0700 Subject: [PATCH 298/577] re-buttonize buttons --- .../instance/branchMenuPopover/templateMenuPopoverView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index abef46e42..522dc0746 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -10,14 +10,14 @@ style = "top: 39px;" ) .grid-block.popover-header - .grid-block.align-center.btn.btn-radio( + button.grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'repo'}" ng-click = "state.tab = 'repo'" ng-disabled = "state.tab !== 'repo'&& state.loading" ) .grid-block.vertical.shrink Repository .small From your GitHub org - .grid-block.align-center.btn.btn-radio( + button.grid-block.align-center.btn.btn-radio( ng-class = "{'active': state.tab === 'nonRepo'}" ng-click = "state.tab = 'nonRepo'" ng-disabled = "state.tab !== 'nonRepo'&& state.loading" From 8316b22b4c63104f5a50d5d33d92252f97cab879 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 18:03:22 -0700 Subject: [PATCH 299/577] capitalize --- .../components/ahaGuide/addBranchGuide/addBranchGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index e3f2a2fa6..e9da6b876 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -17,7 +17,7 @@ p.p.small.text-gray-light Add your First Branch p.p( ng-if = "state.showSubStep === 1" - ) Click the ‘add branch’ button next to any repo name. + ) Click the ‘Add Branch’ button next to any repo name. p.p( ng-if = "state.showSubStep === 2" ) Select a branch to add. From f2725f2d1b8dfa02209c27651706a7d47be39f89 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 9 Sep 2016 18:07:52 -0700 Subject: [PATCH 300/577] remove feature flagging --- .../modals/modalNewContainer/newContainerModalView.jade | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index d8e884b9f..727951862 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -69,7 +69,6 @@ header.modal-header svg.iconnables.icons-arrow-backward( ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && goToPanel('containerSelection', 'back')" - ng-if = "!$root.featureFlags.containersViewTemplateControls" ) use( xlink:href = "#icons-arrow-down" @@ -113,7 +112,6 @@ header.modal-header svg.iconnables.icons-arrow-backward( ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && goToPanel(MC.state.templateSource ? 'containerSelection' : 'dockerfileMirroring', 'back')" - ng-if = "!$root.featureFlags.containersViewTemplateControls" ) use( xlink:href = "#icons-arrow-down" From 36a5d21ed04086e0ee95d1edcd09e0b94825cde3 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 9 Sep 2016 19:14:29 -0700 Subject: [PATCH 301/577] Fix validator to throw an error with dsasda=(nothing) --- client/services/serviceValidateEnvVars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/serviceValidateEnvVars.js b/client/services/serviceValidateEnvVars.js index c116b5bb7..807eb9b8b 100644 --- a/client/services/serviceValidateEnvVars.js +++ b/client/services/serviceValidateEnvVars.js @@ -27,7 +27,7 @@ function validateEnvVars() { return; } // Check for syntactic validity - if (!/^([A-z]+[A-z0-9_]*)=.*$/.test(line)) { + if (!/^([A-z]+[A-z0-9_]*)=\S+$/.test(line)) { response.valid = false; response.errors.push(index); return; From 501a50acaf5c9ea5dd282961621892f6049eb8db Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 9 Sep 2016 19:21:29 -0700 Subject: [PATCH 302/577] add unit test --- test/unit/services/serviceValidateEnvVars.unit.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/unit/services/serviceValidateEnvVars.unit.js b/test/unit/services/serviceValidateEnvVars.unit.js index 549052cf1..f1487a296 100644 --- a/test/unit/services/serviceValidateEnvVars.unit.js +++ b/test/unit/services/serviceValidateEnvVars.unit.js @@ -51,4 +51,11 @@ describe('serviceValidateEnvVars'.bold.underline.blue, function () { ]; expectFail(validateEnvVars(env)); }); + + it('should always require something at the end of an =', function () { + var env = [ + 'PROPERTY1=', //invalid + ]; + expectFail(validateEnvVars(env)); + }); }); From 742912f469e3092e74fc15b9ef6f0f7bcb59a541 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 9 Sep 2016 19:22:13 -0700 Subject: [PATCH 303/577] remove comma --- test/unit/services/serviceValidateEnvVars.unit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/services/serviceValidateEnvVars.unit.js b/test/unit/services/serviceValidateEnvVars.unit.js index f1487a296..3609e55aa 100644 --- a/test/unit/services/serviceValidateEnvVars.unit.js +++ b/test/unit/services/serviceValidateEnvVars.unit.js @@ -54,7 +54,7 @@ describe('serviceValidateEnvVars'.bold.underline.blue, function () { it('should always require something at the end of an =', function () { var env = [ - 'PROPERTY1=', //invalid + 'PROPERTY1=' //invalid ]; expectFail(validateEnvVars(env)); }); From b5f65356cf073a645bec95dd99a6ae5f21600af6 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 9 Sep 2016 19:24:38 -0700 Subject: [PATCH 304/577] revert --- test/unit/services/serviceValidateEnvVars.unit.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/unit/services/serviceValidateEnvVars.unit.js b/test/unit/services/serviceValidateEnvVars.unit.js index 3609e55aa..549052cf1 100644 --- a/test/unit/services/serviceValidateEnvVars.unit.js +++ b/test/unit/services/serviceValidateEnvVars.unit.js @@ -51,11 +51,4 @@ describe('serviceValidateEnvVars'.bold.underline.blue, function () { ]; expectFail(validateEnvVars(env)); }); - - it('should always require something at the end of an =', function () { - var env = [ - 'PROPERTY1=' //invalid - ]; - expectFail(validateEnvVars(env)); - }); }); From 16c54ad70f7abd0eea94dad29643d69813a5eeda Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 9 Sep 2016 19:25:17 -0700 Subject: [PATCH 305/577] adding unit test --- test/unit/services/serviceValidateEnvVars.unit.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/unit/services/serviceValidateEnvVars.unit.js b/test/unit/services/serviceValidateEnvVars.unit.js index 549052cf1..3609e55aa 100644 --- a/test/unit/services/serviceValidateEnvVars.unit.js +++ b/test/unit/services/serviceValidateEnvVars.unit.js @@ -51,4 +51,11 @@ describe('serviceValidateEnvVars'.bold.underline.blue, function () { ]; expectFail(validateEnvVars(env)); }); + + it('should always require something at the end of an =', function () { + var env = [ + 'PROPERTY1=' //invalid + ]; + expectFail(validateEnvVars(env)); + }); }); From 702a6d642824a3c55fed1c7c83032b563090f8a1 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 9 Sep 2016 19:25:20 -0700 Subject: [PATCH 306/577] fix payment summary --- .../forms/billingForm/changePaymentForm/changePaymentForm.jade | 2 +- .../components/paymentSummary/paymentSummaryView.jade | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/directives/modals/settingsModal/forms/billingForm/changePaymentForm/changePaymentForm.jade b/client/directives/modals/settingsModal/forms/billingForm/changePaymentForm/changePaymentForm.jade index 92ba4da14..6451dcc69 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/changePaymentForm/changePaymentForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/changePaymentForm/changePaymentForm.jade @@ -104,7 +104,7 @@ form.padding-md( ng-disabled="$root.isLoading.savePayment" ) - .grid-block.well.padding-xxs.small.justify-center.text-center( + .grid-content.well.padding-xxs.small.justify-center.text-center( payment-summary show-next = 'false' ) diff --git a/client/directives/modals/settingsModal/forms/billingForm/components/paymentSummary/paymentSummaryView.jade b/client/directives/modals/settingsModal/forms/billingForm/components/paymentSummary/paymentSummaryView.jade index 157b50903..d59d046db 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/components/paymentSummary/paymentSummaryView.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/components/paymentSummary/paymentSummaryView.jade @@ -4,6 +4,7 @@ span( strong.strong( ng-if = "currentOrg.poppa.isInTrial()" ) You will not be charged until your trial ends. + | span( ng-if = "currentOrg.poppa.isGraceExpired() || currentOrg.poppa.isInGrace()" From 4500fac58700430052c69213b9aab45a009bf68d Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 9 Sep 2016 19:27:40 -0700 Subject: [PATCH 307/577] fix month not showing in safari --- client/assets/styles/scss/forms/forms-payment.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/client/assets/styles/scss/forms/forms-payment.scss b/client/assets/styles/scss/forms/forms-payment.scss index c827b256e..a3f6fd819 100644 --- a/client/assets/styles/scss/forms/forms-payment.scss +++ b/client/assets/styles/scss/forms/forms-payment.scss @@ -57,6 +57,7 @@ border: 0; &:first-child { + flex: 0 0 27px; width: 27px; } } From 28305965fd0a2d6737c802bdfc7363adf4e6711a Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 9 Sep 2016 19:46:44 -0700 Subject: [PATCH 308/577] fix test --- test/unit/services/serviceValidateEnvVars.unit.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/services/serviceValidateEnvVars.unit.js b/test/unit/services/serviceValidateEnvVars.unit.js index 3609e55aa..80273e084 100644 --- a/test/unit/services/serviceValidateEnvVars.unit.js +++ b/test/unit/services/serviceValidateEnvVars.unit.js @@ -54,6 +54,7 @@ describe('serviceValidateEnvVars'.bold.underline.blue, function () { it('should always require something at the end of an =', function () { var env = [ + 'PROPERTY1=test', //valid 'PROPERTY1=' //invalid ]; expectFail(validateEnvVars(env)); From 916b6ff9654c1328be0a6fdbe27756ed80d924b9 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Sat, 10 Sep 2016 14:22:31 -0700 Subject: [PATCH 309/577] added additional domain to cross-track using Google Analytics --- layout.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layout.jade b/layout.jade index 387622839..4d62e9f5a 100644 --- a/layout.jade +++ b/layout.jade @@ -52,7 +52,7 @@ html( }}(); analytics.ready(function () { ga('require', 'linker'); - ga('linker:autoLink', ['runnable.com']); + ga('linker:autoLink', ['runnable.com', 'runnable.io']); }); if env !== 'development' From 19c9bdf96f1bdc246480d8db62fef63f5d2aff94 Mon Sep 17 00:00:00 2001 From: thejsj Date: Sat, 10 Sep 2016 16:53:11 -0700 Subject: [PATCH 310/577] 4.20.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 91346e1a6..634c426d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.0", + "version": "4.20.1", "private": true, "description": "Frontend for Runnable.io", "scripts": { From f303383a3c84c4d3b36e9fec4e4063f9f91e8452 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sat, 10 Sep 2016 22:04:52 -0700 Subject: [PATCH 311/577] 4.20.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 634c426d4..82ae45d86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.1", + "version": "4.20.2", "private": true, "description": "Frontend for Runnable.io", "scripts": { From a06cda3b1b0b68973e9697384139df86e2351009 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 12 Sep 2016 10:48:21 -0700 Subject: [PATCH 312/577] Added logic to pop a help window open in intercom. --- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 6 +++--- .../setupRepositoryGuide/setupRepositoryGuideDirective.js | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 45ac43f2f..a88fe609d 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -36,9 +36,9 @@ span.span( ng-if = "AGC.showErrorType === 'exitedEarly'" ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, - //- this link should open in intercom with the prefilled message: - "I’m having trouble getting my first container up and running." - a.link ask our engineers + a.link( + ng-click = "askEngineers()" + ) ask our engineers | ! //- If template repo is deleted: diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js index 2708d66de..29a7fa48b 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js @@ -15,6 +15,12 @@ function setupRepositoryGuide( steps: ahaGuide.steps, getCurrentStep: ahaGuide.getCurrentStep }; + $scope.askEngineers = function () { + window.Intercom( + 'showNewMessage', + 'I’m having trouble getting my first container up and running.' + ); + }; } }; } From 1f923634218ff0033b247b02cdf56bd4d0923e57 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 11:07:27 -0700 Subject: [PATCH 313/577] Fixed bad merge --- .../instances/viewInstancesList.jade | 30 +++---- test/karma.conf.js | 3 +- .../controllers/controllerInstances.unit.js | 85 +------------------ 3 files changed, 14 insertions(+), 104 deletions(-) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index aab958ed6..d83b0bf2f 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -70,43 +70,33 @@ p.p.text-center.text-gray-light.padding-sm( span.grid-content.text-overflow( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} - .popoverContainingDiv( - ng-if = "$root.featureFlags.aha" - //- div instead of button so safari doesn’t get weird with alignment .grid-block.align-center.shrink.btn.btn-xxs.white( - ng-class = "{'active': state.active}" - ng-if = "$root.featureFlags.addBranches" + ng-if = "$root.featureFlags.aha" ng-click = "CIS.popInstanceOpen(masterInstance)" tooltip = "Add Branch" - tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-36,\"top\":24}" + tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-4,\"top\":24}" pop-over pop-over-controller = "CIS" pop-over-options = "{\"verticallyCentered\":true,\"left\":87}" pop-over-template = "branchMenuPopoverView" pop-over-data = "'branchSelect'" - ) - .uncloseablePopover( + ) Add Branch + //- '+' button for adding branches and configuring clusters + svg.iconnables.icons-arrow-forward + use( + xlink:href = "#icons-arrow-down" + ) + .stepOneUncloseablePopover( ng-if = "$index === 0 && CIS.shouldShowParent(masterInstance)" pop-over pop-over-active = "CIS.isPopoverOpen" pop-over-controller = "CIS" - pop-over-options = "{\"left\":24,\"top\":-40}" + pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" pop-over-trigger = "activeAttr" pop-over-uncloseable = "CIS.popoverCannotClose" pop-over-data = "'ahaTemplate'" ) - //- '+' button for adding branches and configuring clusters - button.grid-block.shrink.btn.btn-xs.btn-icon.gray() - svg.iconnables - use( - xlink:href = "#icons-add" - ) - ) Add Branch - svg.iconnables.icons-arrow-forward - use( - xlink:href = "#icons-arrow-down" - ) //- repo config button (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( diff --git a/test/karma.conf.js b/test/karma.conf.js index 8fc5afb65..db4ad0028 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -37,8 +37,7 @@ module.exports = function(config) { files: [ 'https://js.stripe.com/v2/stripe-debug.js', 'unit/globals.js', - 'unit/controllers/controllerInstances.unit.js' - // 'unit/**/*.unit.js' + 'unit/**/*.unit.js' ], diff --git a/test/unit/controllers/controllerInstances.unit.js b/test/unit/controllers/controllerInstances.unit.js index d886b6549..7e25983b0 100644 --- a/test/unit/controllers/controllerInstances.unit.js +++ b/test/unit/controllers/controllerInstances.unit.js @@ -7,10 +7,7 @@ var $controller, $localStorage, keypather, $state, - $q, - promisify, - mockOrg, - currentOrg; + $q; var apiMocks = require('../apiMocks/index'); var mockFetch = new (require('../fixtures/mockFetch'))(); var runnable = window.runnable; @@ -78,21 +75,8 @@ describe('ControllerInstances'.bold.underline.blue, function () { localStorageData = angular.extend({}, localStorageData, { $default: sinon.spy() }); - mockOrg = { - github: { - fetchRepo: sinon.stub() - } - }; angular.mock.module('app', function ($provide) { $provide.factory('fetchInstancesByPod', mockFetch.fetch()); - $provide.factory('promisify', function ($q) { - var promisifyMock = sinon.spy(function (obj, key) { - return function () { - return $q.when(obj[key].apply(obj, arguments)); - }; - }); - return promisifyMock; - }); $provide.value('favico', { reset : sinon.spy(), setInstanceState: sinon.spy() @@ -103,7 +87,7 @@ describe('ControllerInstances'.bold.underline.blue, function () { $provide.value('user', ctx.fakeuser); $provide.value('activeAccount', ctx.fakeuser); - $provide.value('currentOrg', mockOrg); + $provide.factory('setLastOrg', function ($q) { return sinon.stub().returns($q.when()); }); @@ -270,69 +254,6 @@ describe('ControllerInstances'.bold.underline.blue, function () { }); }); }); - - describe('branch launch popover', function() { - - var childInstance; - var childInstance2; - var masterInstance; - var masterInstance2; - - beforeEach(function() { - childInstance = { - attrs: { - name: 'feature-AWESOME', - lowerName: 'feature-awesome' - }, - getBranchName: sinon.stub().returns('henry\'s branch') - }; - childInstance2 = { - attrs: { - name: 'deezNutz', - lowerName: 'deeznutz' - }, - getBranchName: sinon.stub().returns('olive branch') - }; - masterInstance = { - getRepoAndBranchName: sinon.stub().returns('master'), - getRepoName: sinon.stub().returns('main'), - getBranchName: sinon.stub().returns('master'), - attrs: { - name: 'MyFirstNodeAPI', - lowerName: 'myfirstnodeapi' - }, - children: { - models: [ childInstance, childInstance2 ] - } - }; - masterInstance2 = { - getRepoAndBranchName: sinon.stub().returns(null), - attrs: { - name: 'PostgreSQL', - lowerName: 'postgresql' - }, - children: { - models: [] - }, - }; - }); - - it('should call the right stuff', function() { - setup('myOrg'); - $rootScope.$digest(); - var repo = { - fetchBranches: sinon.stub().returns($q.when({ - models: [] - })) - }; - - mockOrg.github.fetchRepo.returns($q.when(repo)); - CIS.popInstanceOpen(masterInstance); - $rootScope.$digest(); - sinon.assert.calledOnce(mockOrg.github.fetchRepo); - }); - - }); describe('using various searches in the search filter'.blue, function () { var childInstance; @@ -454,4 +375,4 @@ describe('ControllerInstances'.bold.underline.blue, function () { expect(results).to.deep.equal([[true,true],[false,true],[false,false],[true,false]]); }); }); -}); \ No newline at end of file +}); From 72db37afbe7614402ed08186e6e91a1ddec65038 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 12 Sep 2016 12:43:31 -0700 Subject: [PATCH 314/577] Hofix for rollbar. We broke the config! --- layout.jade | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/layout.jade b/layout.jade index 4d62e9f5a..bcf24831d 100644 --- a/layout.jade +++ b/layout.jade @@ -91,23 +91,23 @@ html( } })(); - //- Rollbar - script. - var _rollbarConfig = { - accessToken: "07537af868d741b495dbaaaf1bcb77f5", - captureUncaught: true, - payload: { - environment: "#{locals.rollbarEnv}", - client: { - javascript: { - source_map_enabled: true, - code_version: "#{locals.version}", - guess_uncaught_frames: true - } + //- Rollbar + script. + var _rollbarConfig = { + accessToken: "07537af868d741b495dbaaaf1bcb77f5", + captureUncaught: true, + payload: { + environment: "#{locals.rollbarEnv}", + client: { + javascript: { + source_map_enabled: true, + code_version: "#{locals.version}", + guess_uncaught_frames: true } } - }; - !function(r){function t(e){if(o[e])return o[e].exports;var n=o[e]={exports:{},id:e,loaded:!1};return r[e].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var o={};return t.m=r,t.c=o,t.p="",t(0)}([function(r,t,o){"use strict";var e=o(1).Rollbar,n=o(2),a="https://d37gvrvc0wt4s1.cloudfront.net/js/v1.5/rollbar.min.js";_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||a;var i=e.init(window,_rollbarConfig),l=n(i,_rollbarConfig);i.loadFull(window,document,!1,_rollbarConfig,l)},function(r,t){"use strict";function o(){var r=window.console;r&&"function"==typeof r.log&&r.log.apply(r,arguments)}function e(r,t){return t=t||o,function(){try{return r.apply(this,arguments)}catch(o){t("Rollbar internal error:",o)}}}function n(r,t,o){window._rollbarWrappedError&&(o[4]||(o[4]=window._rollbarWrappedError),o[5]||(o[5]=window._rollbarWrappedError._rollbarContext),window._rollbarWrappedError=null),r.uncaughtError.apply(r,o),t&&t.apply(window,o)}function a(r){this.shimId=++u,this.notifier=null,this.parentShim=r,this.logger=o,this._rollbarOldOnError=null}function i(r){var t=a;return e(function(){if(this.notifier)return this.notifier[r].apply(this.notifier,arguments);var o=this,e="scope"===r;e&&(o=new t(this));var n=Array.prototype.slice.call(arguments,0),a={shim:o,method:r,args:n,ts:new Date};return window._rollbarShimQueue.push(a),e?o:void 0})}function l(r,t){if(t.hasOwnProperty&&t.hasOwnProperty("addEventListener")){var o=t.addEventListener;t.addEventListener=function(t,e,n){o.call(this,t,r.wrap(e),n)};var e=t.removeEventListener;t.removeEventListener=function(r,t,o){e.call(this,r,t&&t._wrapped?t._wrapped:t,o)}}}var u=0;a.init=function(r,t){var o=t.globalAlias||"Rollbar";if("object"==typeof r[o])return r[o];r._rollbarShimQueue=[],r._rollbarWrappedError=null,t=t||{};var i=new a;return e(function(){if(i.configure(t),t.captureUncaught){i._rollbarOldOnError=r.onerror,r.onerror=function(){var r=Array.prototype.slice.call(arguments,0);n(i,i._rollbarOldOnError,r)};var e,a,u="EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(",");for(e=0;e Date: Mon, 12 Sep 2016 12:52:36 -0700 Subject: [PATCH 315/577] 4.20.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82ae45d86..dae6d03aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.2", + "version": "4.20.3", "private": true, "description": "Frontend for Runnable.io", "scripts": { From e7fdd720b0b2cfcb223dc1e69ff48d6f2fbe8421 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 12 Sep 2016 14:24:47 -0700 Subject: [PATCH 316/577] Fix issues with the connections part of setup Fix test --- .../modals/modalSetupServer/setupServerModalController.js | 6 ++++++ .../directives/environment/modals/serverModalController.js | 4 ++-- test/unit/controllers/serverModalController.unit.js | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 07d7b02aa..a1a62e6a2 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -17,6 +17,7 @@ function SetupServerModalController( errs, eventTracking, fetchDockerfileFromSource, + fetchInstancesByPod, isTabNameValid, keypather, loading, @@ -121,6 +122,11 @@ function SetupServerModalController( repoSelected: true }); + fetchInstancesByPod() + .then(function (instances) { + SMC.data.instances = instances; + }); + // if the blank docker file is chosen, we need to load it because it is already available if (dockerfileType === 'blankDockerfile') { SMC.openDockerfile({contextVersion: build.contextVersion}, SMC.openItems); diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index e2ce8aa24..03a91f25b 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -9,6 +9,7 @@ function ServerModalController( $rootScope, $scope, createBuildFromContextVersionId, + configUserContentDomain, errs, eventTracking, fetchDockerfileForContextVersion, @@ -490,8 +491,7 @@ function ServerModalController( var repo = SMC.state.repo; var repoName = repo.attrs.name; var repoOwner = repo.attrs.owner.login.toLowerCase(); - var domain = SMC.state.repo.opts.userContentDomain; - return repoName + '-staging-' + repoOwner + '.' + domain; + return repoName + '-staging-' + repoOwner + '.' + configUserContentDomain; } return ''; }; diff --git a/test/unit/controllers/serverModalController.unit.js b/test/unit/controllers/serverModalController.unit.js index 8d6bff493..4bafb5b16 100644 --- a/test/unit/controllers/serverModalController.unit.js +++ b/test/unit/controllers/serverModalController.unit.js @@ -1024,7 +1024,7 @@ describe('serverModalController'.bold.underline.blue, function () { SMC.state.repo = ctx.repo; $scope.$digest(); var generatedElasticHostname = SMC.getElasticHostname(); - var manualEleasticHostname = ctx.repo.attrs.name + '-staging-' + ctx.repo.attrs.owner.login + '.' + ctx.repo.opts.userContentDomain; + var manualEleasticHostname = ctx.repo.attrs.name + '-staging-' + ctx.repo.attrs.owner.login + '.' + window.userContentDomain; expect(generatedElasticHostname).to.equal(manualEleasticHostname); }); From 00b36cdc8faad018e04933a4a29f78dfc13f28d6 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 14:41:37 -0700 Subject: [PATCH 317/577] Added runnabot functionality/checks in milestone 3 --- client/controllers/controllerInstances.js | 3 +-- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 8 ++++---- .../components/setUpRunnabotGuideView.jade | 3 +-- client/services/ahaGuideService.js | 14 ++++++++++++-- client/templates/instances/viewInstancesList.jade | 3 +-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 3c7263185..1eb76e1a5 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -39,7 +39,7 @@ function ControllerInstances( }); $scope.$on('popover-closed', function(event, pop) { - if (pop.data && pop.data !== 'ahaTemplate') { + if (pop.data && pop.data !== 'ahaTemplate' && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH) { CIS.isPopoverOpen = true; } }); @@ -228,7 +228,6 @@ function ControllerInstances( closePopover(); loading('buildingForkedBranch', false); loading(loadingName, false); - CIS.poppedInstance.attrs.hasBranchLaunched = true; $rootScope.$broadcast('hasAddedBranch'); $timeout(function() { $rootScope.$broadcast('close-popovers'); diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 855d1597e..ca746dcf8 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -94,7 +94,7 @@ p.p.strong Add your First Branch p.small Your branches will update on every commit you make. - .grid-block.vertical.align-center.form-github( - ng-if = "getCurrentStep() === steps.SETUP_RUNNABOT" - github-integration - ) +.grid-block.vertical.align-center.form-github( + ng-if = "getCurrentStep() === steps.SETUP_RUNNABOT" + github-integration +) diff --git a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade index 177c7e3a6..0d16a2094 100644 --- a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade @@ -8,5 +8,4 @@ //- xlink:href = "#icons-check" //- ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Set Up Runnabot - p.p Set up auto-branching before booting up Runnabot. + p.p Get the most out of Runnabot by adding branches automatically. diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index d25cf484c..5c6144633 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -21,6 +21,7 @@ function ahaGuide( function refreshInstances() { return fetchInstancesByPod() .then(function (fetchedInstances) { + console.log(fetchedInstances); instances = fetchedInstances.models; }); } @@ -174,6 +175,15 @@ function ahaGuide( panelSteps: { } }; + stepList[STEPS.SETUP_RUNNABOT] = { + subSteps: { + setupRunnabot: { + caption: 'Get the most out of Runnabot by adding branches automatically', + className: 'aha-meter-50' + } + } + }; + var cachedStep; $rootScope.$watch(function () { cachedStep = null; @@ -194,8 +204,8 @@ function ahaGuide( cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched - var hasBranchLaunched = instances.models && instances.models.some(function (instance) { - return instance.attrs.hasBranchLaunched; + var hasBranchLaunched = instances.some(function (instance) { + return instance.attrs.hasAddedBranches; }); if (hasBranchLaunched) { cachedStep = STEPS.SETUP_RUNNABOT; diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index d83b0bf2f..48c8e2a38 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -73,7 +73,6 @@ p.p.text-center.text-gray-light.padding-sm( .grid-block.align-center.shrink.btn.btn-xxs.white( ng-if = "$root.featureFlags.aha" ng-click = "CIS.popInstanceOpen(masterInstance)" - tooltip = "Add Branch" tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-4,\"top\":24}" pop-over pop-over-controller = "CIS" @@ -94,7 +93,7 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" pop-over-trigger = "activeAttr" - pop-over-uncloseable = "CIS.popoverCannotClose" + pop-over-uncloseable = "CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" pop-over-data = "'ahaTemplate'" ) From 99ac957d6f232996446ae9a7fddf3d9fabdce716 Mon Sep 17 00:00:00 2001 From: henrymollman Date: Mon, 12 Sep 2016 14:50:24 -0700 Subject: [PATCH 318/577] Fixes for bugs identified in the add branches checklist. (#1714) * Fixes for bugs identified in the add branches checklist. * fix spinners hiding text - and remove arrow from commit tray * Created proper offset feature * Merged runnabro's commits * JSHint problem * Fixed the bottom position for real * Addressed PR comments * Added more fixes as per PR comments * Changed to use directive element argument * Prevented arrow from being rendered offscreen * Arrow will not be rendered anywhere but within attached popover element * Added a state change following fork branch * Addressed PR comments * Removed unnecessary username state param * Added tests * Fixed markup for branch menu * Added active/disabled classes and fixed bug w/ instance names * Fixed failing test --- .../scss/deprecated/btn-auto-deploy.scss | 4 - .../styles/scss/layout/instance-sidebar.scss | 8 - client/controllers/controllerInstances.js | 18 +- .../editRepoCommit/editRepoCommitView.jade | 4 - .../isolationConfigurationModalView.jade | 7 +- .../branchMenuPopoverView.jade | 15 +- .../newContainerModalView.jade | 4 +- .../directives/popovers/popOverDirective.js | 41 ++++- .../instances/viewInstancesList.jade | 6 +- .../controllers/controllerInstances.unit.js | 169 +++++++++++++++++- 10 files changed, 242 insertions(+), 34 deletions(-) diff --git a/client/assets/styles/scss/deprecated/btn-auto-deploy.scss b/client/assets/styles/scss/deprecated/btn-auto-deploy.scss index e8a1c17c5..311976f48 100644 --- a/client/assets/styles/scss/deprecated/btn-auto-deploy.scss +++ b/client/assets/styles/scss/deprecated/btn-auto-deploy.scss @@ -1,10 +1,6 @@ .btn-repository.main-btn.deprecated { min-height: 127px; padding-bottom: ($input-sm + 6px); - - .icons-arrow-forward { - height: calc(100% - 36px); - } } .btn-auto-deploy-deprecated { diff --git a/client/assets/styles/scss/layout/instance-sidebar.scss b/client/assets/styles/scss/layout/instance-sidebar.scss index d0e99d6f1..014905540 100644 --- a/client/assets/styles/scss/layout/instance-sidebar.scss +++ b/client/assets/styles/scss/layout/instance-sidebar.scss @@ -16,7 +16,6 @@ font-size: 15px; font-weight: $weight-normal; min-height: 118px; - padding-right: 24px; text-align: left; &.grid-block { @@ -81,13 +80,6 @@ } } - .icons-arrow-forward { - height: 100%; - position: absolute; - right: 3px; - top: 0; - } - .file-tree { margin: 0; } diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index f9716b008..99613e7d4 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -200,12 +200,20 @@ function ControllerInstances( this.forkBranchFromInstance = function (branch, closePopover) { var sha = branch.attrs.commit.sha; - var loadingName = 'buildingForkedBranch' + branch.attrs.name; - loading(loadingName, true); - promisify(CIS.poppedInstance, 'fork')(branch.attrs.name, sha) - .then(function () { - loading(loadingName, false); + var branchName = branch.attrs.name; + loading(branchName, true); + loading('buildingForkedBranch', true); + promisify(CIS.poppedInstance, 'fork')(branchName, sha) + .then(function (instance) { + var newInstance = instance.children.models.filter(function(childInstance) { + return childInstance.attrs.name === branchName + '-' + instance.attrs.name; + })[0]; + loading(branchName, false); + loading('buildingForkedBranch', false); closePopover(); + $state.go('base.instances.instance', { + instanceName: newInstance.attrs.name + }); }); }; diff --git a/client/directives/components/editRepoCommit/editRepoCommitView.jade b/client/directives/components/editRepoCommit/editRepoCommitView.jade index 7c71e0315..13319cc40 100644 --- a/client/directives/components/editRepoCommit/editRepoCommitView.jade +++ b/client/directives/components/editRepoCommit/editRepoCommitView.jade @@ -57,10 +57,6 @@ span.small( ng-if = "!$root.featureFlags.inviteFlows" ) {{activeCommit.attrs.commit.author.date | timeFrom}} - svg.iconnables.icons-arrow-forward - use( - xlink:href = "#icons-arrow-down" - ) //- auto-deploy w/ commit syncing //- show alternate text in autoDeployTooltip.jade if disabled diff --git a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade index 820fe60cc..be2123431 100644 --- a/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade +++ b/client/directives/components/isolationConfiguration/isolationConfigurationModalView.jade @@ -100,4 +100,9 @@ button.btn.btn-md.green.float-right( ng-disabled = "$root.isLoading.createIsolation" ng-click = "ICMC.createIsolation()" - ) {{$root.isLoading.createIsolation ? 'Isolating...' : 'Isolate Branch'}} + ) + .spinner-wrapper.spinner-white.spinner-sm.float-left( + ng-if = "$root.isLoading.createIsolation" + ng-include = "'spinner'" + ) + span Isolate Branch diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 6897707a9..9d2736959 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -1,8 +1,10 @@ .popover.menu.right.popover-branch-menu( ng-class = "{'in': active}" - ng-style = "popoverStyle.getStyle()" + ng-style = "popoverStyle.getStyle(CIS.instanceBranches)" ) - .arrow.white + .arrow.white( + ng-style = "popoverStyle.getArrowStyle(CIS.instanceBranches)" + ) .grid-block.vertical.popover-content.empty( ng-if = "$root.featureFlags.autoIsolationSetup" ) @@ -106,6 +108,7 @@ ) .toggle-group.toggle-sm input.input.input-xs.input-search( + ng-disabled = "$root.isLoading['buildingForkedBranch']" ng-model = "CIS.branchQuery" placeholder = "Filter by name" required @@ -115,19 +118,23 @@ ng-if = "CIS.instanceBranches.length" ) li.grid-block.align-center.list-item.popover-list-item( + ng-class = "{\ + 'disabled': $root.isLoading['buildingForkedBranch'] && !$root.isLoading[branch.attrs.name],\ + 'active': $root.isLoading['buildingForkedBranch'] && $root.isLoading[branch.attrs.name]\ + }" ng-repeat = "branch in CIS.getFilteredBranches()" ng-click = "CIS.forkBranchFromInstance(branch, POC.closePopover);" ) .grid-content {{ branch.attrs.name }} button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( - ng-if = "!$root.isLoading['buildingForkedBranch' + branch.attrs.name]" + ng-if = "!$root.isLoading[branch.attrs.name]" ) svg.iconnables.icons-add use( xlink:href = "#icons-add" ) .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( - ng-if = "$root.isLoading['buildingForkedBranch' + branch.attrs.name]" + ng-if = "$root.isLoading[branch.attrs.name]" ng-include = "'spinner'" ) diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 727951862..53bd10dd2 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -177,9 +177,9 @@ ) //- should say "Next Step: Setup" if a repository container //- should say "Create Template" if its a non-repository container - .spinner-wrapper.spinner-white.spinner-sm.in( - ng-include = "'spinner'" + .spinner-wrapper.spinner-white.spinner-sm.float-left( ng-if = "$root.isLoading[MC.name + 'SingleRepo']" + ng-include = "'spinner'" ) span( ng-if = "MC.state.repo" diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index fda8b35ab..7746b4ecb 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -24,7 +24,8 @@ function popOver( $document, keypather, $log, - exists + exists, + $timeout ) { return { restrict: 'A', @@ -53,6 +54,7 @@ function popOver( return $log.error('Pop over needs a template'); } } + $scope.element = element; $scope.popoverOptions = $scope.popoverOptions || {}; $scope.active = $scope.active || false; $scope.popoverStyle = { @@ -60,7 +62,9 @@ function popOver( if (!$scope.active) { return previousStyle; } + var offset = {}; + var topMargin = 8; var scrollTop = $document.find('body')[0].scrollTop || $document.find('html')[0].scrollTop; if (keypather.get($scope, 'popoverOptions.mouse')) { @@ -99,11 +103,42 @@ function popOver( if (keypather.get($scope, 'popoverOptions.verticallyCentered')) { style.bottom = null; - style.top = Math.round((-POC.popoverElement[0].offsetHeight / 2 + offset.top + (offset.bottom - offset.top) / 2)) + 'px'; + var targetedTopVal = Math.round((-POC.popoverElement[0].offsetHeight / 2 + offset.top + (offset.bottom - offset.top) / 2)); + if ( + $scope.popoverOptions.pinToViewPort && // If true, make sure popover is not displayed outside the viewport + POC.popoverElement[0].offsetHeight + targetedTopVal > $document.find('body')[0].offsetHeight + ) { + targetedTopVal = $document.find('body')[0].offsetHeight - POC.popoverElement[0].offsetHeight - 8; + } + if (targetedTopVal < 0) { + targetedTopVal = topMargin; + } + + style.top = targetedTopVal + 'px'; } previousStyle = style; return style; + }, + + getArrowStyle: function() { + var style = {}; + var elementPosition = $scope.element[0].getBoundingClientRect(); + var elementCenter = (elementPosition.bottom + elementPosition.top) / 2; + + var popoverElementPosition = POC.popoverElement[0].getBoundingClientRect(); + + var topInt = parseInt($scope.popoverStyle.getStyle().top.replace('px', '')); + var isAtBottom = window.innerHeight - elementPosition.top < 180; + + var diff = Math.abs(popoverElementPosition.top - elementCenter); + + if (topInt > 8 && !isAtBottom || diff > POC.popoverElement[0].getBoundingClientRect().height) { + return style; + } else { + style.top = diff + 'px'; + return style; + } } }; @@ -129,8 +164,10 @@ function popOver( bottom: event.pageY } }; + POC.openPopover($scope.options); } + var trigger = attrs.popOverTrigger || 'click'; switch (trigger) { case 'rightClick': diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index dd073bf4f..ddc1d82a4 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -41,14 +41,14 @@ p.p.text-center.text-gray-light.padding-sm( instance = "masterInstance" instance-navigation master-instance = "masterInstance" - ng-repeat = "masterInstance in CIS.getFilteredInstanceList().models | instanceHasRepo:true | orderBy: ['attrs.name'] track by masterInstance.attrs.name" + ng-repeat = "masterInstance in CIS.getFilteredInstanceList() | instanceHasRepo:true | orderBy: ['attrs.name'] track by masterInstance.attrs.name" ) //- master non-repository containers .grid-block( active-account = "CIS.activeAccount" instance = "masterInstance" instance-navigation - ng-repeat = "masterInstance in CIS.instancesByPod.models | instanceHasRepo:false | orderBy: ['attrs.name'] as nonRepoInstances track by masterInstance.attrs.name" + ng-repeat = "masterInstance in CIS.getFilteredInstanceList() | instanceHasRepo:false | orderBy: ['attrs.name'] as nonRepoInstances track by masterInstance.attrs.name" ) .well.text-center( @@ -77,7 +77,7 @@ p.p.text-center.text-gray-light.padding-sm( ng-click = "CIS.popInstanceOpen(masterInstance)" pop-over pop-over-controller = "CIS" - pop-over-options = "{\"verticallyCentered\":true,\"left\":87}" + pop-over-options = "{\"verticallyCentered\":true,\"left\":87,\"pinToViewPort\":true}" pop-over-template = "branchMenuPopoverView" ) Add Branch svg.iconnables.icons-arrow-forward diff --git a/test/unit/controllers/controllerInstances.unit.js b/test/unit/controllers/controllerInstances.unit.js index 7e25983b0..4ab2d82c0 100644 --- a/test/unit/controllers/controllerInstances.unit.js +++ b/test/unit/controllers/controllerInstances.unit.js @@ -7,7 +7,10 @@ var $controller, $localStorage, keypather, $state, - $q; + $q, + promisify, + mockOrg, + currentOrg; var apiMocks = require('../apiMocks/index'); var mockFetch = new (require('../fixtures/mockFetch'))(); var runnable = window.runnable; @@ -75,8 +78,23 @@ describe('ControllerInstances'.bold.underline.blue, function () { localStorageData = angular.extend({}, localStorageData, { $default: sinon.spy() }); + mockOrg = { + github: { + fetchRepo: sinon.stub() + } + }; angular.mock.module('app', function ($provide) { $provide.factory('fetchInstancesByPod', mockFetch.fetch()); + $provide.factory('promisify', function ($q) { + var promisifyMock = sinon.spy(function (obj, key) { + return function () { + return $q.when(obj[key].apply(obj, arguments)); + }; + }); + return promisifyMock; + }); + + $provide.value('currentOrg', mockOrg); $provide.value('favico', { reset : sinon.spy(), setInstanceState: sinon.spy() @@ -254,6 +272,134 @@ describe('ControllerInstances'.bold.underline.blue, function () { }); }); }); + + describe('branch launch popover', function() { + + var childInstance; + var childInstance2; + var childInstance3; + var masterInstance; + var masterInstance2; + var mockBranch; + + beforeEach(function() { + childInstance = { + attrs: { + name: 'feature-AWESOME', + lowerName: 'feature-awesome' + }, + getBranchName: sinon.stub().returns('henry\'s branch') + }; + childInstance2 = { + attrs: { + name: 'deezNutz', + lowerName: 'deeznutz' + }, + getBranchName: sinon.stub().returns('olive branch') + }; + childInstance3 = { + attrs: { + name: 'mockBranch-PostgreSQL' + } + }; + masterInstance = { + getRepoAndBranchName: sinon.stub().returns('master'), + getRepoName: sinon.stub().returns('main'), + getBranchName: sinon.stub().returns('master'), + attrs: { + name: 'MyFirstNodeAPI', + lowerName: 'myfirstnodeapi' + }, + children: { + models: [ childInstance, childInstance2 ] + } + }; + masterInstance2 = { + getRepoAndBranchName: sinon.stub().returns(null), + attrs: { + name: 'PostgreSQL', + lowerName: 'postgresql', + shouldNotAutofork: false + }, + children: { + models: [childInstance3] + }, + fork: sinon.stub(), + update: sinon.stub() + }; + mockBranch = { + attrs: { + "name": "mockBranch", + "commit": { + "sha": "6e0c5e3778b83f128f6f14c311d5728392053581", + "url": "https://api.github.com/repos/cflynn07/bitcoin/commits/6e0c5e3778b83f128f6f14c311d5728392053581" + } + } + }; + }); + + it('should fetch branches for an instance when popInstanceOpen is called', function () { + setup('myOrg'); + + var repo = { + fetchBranches: sinon.stub().returns($q.when({ + models: apiMocks.branches.bitcoinRepoBranches + })) + }; + + mockOrg.github.fetchRepo.returns($q.when(repo)); + CIS.popInstanceOpen(masterInstance); + $rootScope.$digest(); + sinon.assert.calledOnce(mockOrg.github.fetchRepo); + sinon.assert.calledOnce(repo.fetchBranches); + expect(CIS.instanceBranches).to.deep.equal(apiMocks.branches.bitcoinRepoBranches); + expect(CIS.totalInstanceBranches).to.equal(apiMocks.branches.bitcoinRepoBranches.length); + }); + + it('should not return branches that were already launched', function () { + setup('myOrg'); + apiMocks.branches.bitcoinRepoBranches[0].attrs = { + name: 'henry\'s branch' + } + + CIS.instanceBranches = CIS.getUnbuiltBranches(masterInstance, { + models: apiMocks.branches.bitcoinRepoBranches + }); + $rootScope.$digest(); + expect(CIS.instanceBranches.length).to.equal(apiMocks.branches.bitcoinRepoBranches.length - 1); + }); + + it('should build a new instance', function () { + setup('myOrg'); + + CIS.poppedInstance = masterInstance2; + var closePopoverStub = sinon.stub(); + + masterInstance2.fork.returns($q.when(masterInstance2)); + + CIS.forkBranchFromInstance(mockBranch, closePopoverStub); + $rootScope.$digest(); + sinon.assert.calledOnce(masterInstance2.fork); + sinon.assert.calledWithExactly(masterInstance2.fork, mockBranch.attrs.name, mockBranch.attrs.commit.sha); + sinon.assert.calledOnce(closePopoverStub); + sinon.assert.calledWithExactly(ctx.fakeGo, 'base.instances.instance', { + instanceName: childInstance3.attrs.name + }); + }); + + it('should set the instance\'s autofork property', function () { + setup('myOrg'); + CIS.poppedInstance = masterInstance2; + masterInstance2.update.returns($q.when(true)) + + expect(CIS.poppedInstance.attrs.shouldNotAutofork).to.equal(false); + CIS.setAutofork(); + $rootScope.$digest(); + expect(CIS.poppedInstance.attrs.shouldNotAutofork).to.equal(true); + sinon.assert.calledOnce(masterInstance2.update); + sinon.assert.calledWithExactly(masterInstance2.update, {shouldNotAutofork: masterInstance2.attrs.shouldNotAutofork}); + }) + }); describe('using various searches in the search filter'.blue, function () { var childInstance; @@ -374,5 +520,26 @@ describe('ControllerInstances'.bold.underline.blue, function () { }); expect(results).to.deep.equal([[true,true],[false,true],[false,false],[true,false]]); }); + + it('should only show branches matching the search query', function() { + // polyfill + String.prototype.includes = function (search) { + return this.indexOf(search) !== -1; + } + CIS.instanceBranches = [ + {attrs: {name:'brian'}},{attrs:{name:'carl'}},{attrs:{name:'dennis'}} + ]; + var searchTerms = ['BRIAN', null, 'n', 'mike love', 'AlJaRdInE']; + + var results = searchTerms.map(function(query) { + CIS.branchQuery = query; + return CIS.getFilteredBranches(); + }); + expect(results).to.deep.equal([[{attrs: {name:'brian'}}], + CIS.instanceBranches, + [{attrs: {name:'brian'}},{attrs:{name:'dennis'}}], + [], + []]); + }) }); }); From b984180e8b2ce36d1531d18eeec0770e162cb304 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 14:53:14 -0700 Subject: [PATCH 319/577] 4.20.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dae6d03aa..f5f7c678b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.3", + "version": "4.20.4", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 7d381a8dc119d5a5be954b3c8c052bb33bc41960 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 12 Sep 2016 15:03:54 -0700 Subject: [PATCH 320/577] remove error handler on instance fetch --- client/controllers/controllerInstance.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index 5ab053631..9378f8d31 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -114,8 +114,8 @@ function ControllerInstance( setLastInstance($stateParams.instanceName); loading('main', false); }) - .catch(function (err) { // We ONLY want to handle errors related to fetching instances so this catch is nested. - errs.handler(err); + .catch(function () { + // Don't handle the instance fetch err, because it's super annoying loading('main', false); setLastInstance(false); $state.go('base.instances', { From f150aa1c022f0fb78b8e95130e9b53d56cce403f Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 12 Sep 2016 15:43:46 -0700 Subject: [PATCH 321/577] 4.20.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f5f7c678b..c87e52780 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.4", + "version": "4.20.5", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 2e87f54e91159a99fc82303509c295ae24ece8b2 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 12 Sep 2016 15:45:29 -0700 Subject: [PATCH 322/577] 4.20.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c87e52780..2b3ecdbf3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.5", + "version": "4.20.6", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 99fcb0833f1aacd270da7d6f00f8288172455fee Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 16:31:39 -0700 Subject: [PATCH 323/577] Added caption for hasContainer status, added more logic for container view, removed logs and other bugs --- client/controllers/controllerInstances.js | 2 +- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 4 +++- .../modalSetupServer/setupMirrorServerModalController.js | 1 - .../modalChooseOrganization/chooseOrganizationModalView.jade | 1 - client/directives/navBar/viewNav.jade | 4 ++-- client/services/ahaGuideService.js | 1 - client/services/createAndBuildNewContainerService.js | 5 +++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 1eb76e1a5..0937f72e8 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -226,9 +226,9 @@ function ControllerInstances( promisify(CIS.poppedInstance, 'fork')(branch.attrs.name, sha) .then(function() { closePopover(); + $rootScope.$broadcast('hasAddedBranch'); loading('buildingForkedBranch', false); loading(loadingName, false); - $rootScope.$broadcast('hasAddedBranch'); $timeout(function() { $rootScope.$broadcast('close-popovers'); }); diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 1e695dc90..0bbf19509 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -92,9 +92,11 @@ ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'success'" ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. p.p( - ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'complete'" ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. + p.p( + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'hasContainer'" + ) Choose a template to configure. .grid-block.vertical.aha-text( diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 66457427a..474332fe6 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -18,7 +18,6 @@ function SetupMirrorServerModalController( loading, loadingPromises, promisify, - build, close, instanceName, diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 0d7201201..7434987dc 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -16,7 +16,6 @@ aha-guide ng-if = "$root.featureFlags.aha" sub-step = "orgSelection" - sub-step-index = 0 ) animated-panel-container animated-panel.modal-body.grid-block.vertical.padding-sm( diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index dbcc015ab..9231221af 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -32,7 +32,7 @@ a.a.disabled( | Containers a.a( - ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) || $root.featureFlags.containersViewTemplateControls && (!$root.featureFlags.aha || CA.ahaGuide.getCurrentStep() > CA.ahaGuide.steps.ADD_FIRST_REPO)" + ng-if = "(!$root.featureFlags.aha && (dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length)) || ($root.featureFlags.containersViewTemplateControls || ($root.featureFlags.aha && CA.instancesByPod.models.length && CA.ahaGuide.getCurrentStep() > CA.ahaGuide.steps.ADD_FIRST_REPO))" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) @@ -43,7 +43,7 @@ a.a( | Containers a.a( - ng-if = "$root.featureFlags.aha && CA.ahaGuide.getCurrentStep() === CA.ahaGuide.steps.ADD_FIRST_REPO && CA.instancesByPod.models.length" + ng-if = "$root.featureFlags.aha && CA.instancesByPod.models.length && !CA.currentOrg.poppa.hasConfirmedSetup" internal-modal-helper = "confirmSetupView" ) svg.iconnables.icons-server-dark diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 5c6144633..154d8af05 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -21,7 +21,6 @@ function ahaGuide( function refreshInstances() { return fetchInstancesByPod() .then(function (fetchedInstances) { - console.log(fetchedInstances); instances = fetchedInstances.models; }); } diff --git a/client/services/createAndBuildNewContainerService.js b/client/services/createAndBuildNewContainerService.js index f6355ea38..db346b010 100644 --- a/client/services/createAndBuildNewContainerService.js +++ b/client/services/createAndBuildNewContainerService.js @@ -19,7 +19,8 @@ function createAndBuildNewContainer( eventTracking, fetchInstancesByPod, fetchPlan, - fetchUser + fetchUser, + keypather ) { return function (createPromiseForState, containerName, options) { options = options || {}; @@ -34,7 +35,7 @@ function createAndBuildNewContainer( plan: fetchPlan() }) .then(function (response) { - oldPlanId = response.plan.next.id; + oldPlanId = keypather.get(response, 'plan.next.id'); var instanceOptions = { name: containerName, owner: { From 31515063ea6e32a14e937710d8c7fa610b4c6f83 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 12 Sep 2016 16:31:55 -0700 Subject: [PATCH 324/577] add instanceFetchBy to mirror --- .../modalSetupServer/setupMirrorServerModalController.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 66457427a..406cac967 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -13,12 +13,13 @@ function SetupMirrorServerModalController( createAndBuildNewContainer, errs, eventTracking, + fetchInstancesByPod, isTabNameValid, keypather, loading, loadingPromises, promisify, - + // everything below comes from the modal open build, close, instanceName, @@ -111,6 +112,11 @@ function SetupMirrorServerModalController( repoSelected: true }); + fetchInstancesByPod() + .then(function (instances) { + SMC.data.instances = instances; + }); + SMC.state.mainRepoContainerFile.name = repo.attrs.name; SMC.state.promises.contextVersion = $q.when(SMC.state.contextVersion); From c1517c64d1140a34c5d77b936572bc9a4c1e04dd Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 16:36:04 -0700 Subject: [PATCH 325/577] Missed merge resolution --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 4 ---- 1 file changed, 4 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index ce46afc52..d8a5a163a 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -2,7 +2,6 @@ ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle(CIS.instanceBranches)" ) -<<<<<<< HEAD .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( ng-if = "$root.featureFlags.aha && CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" aha-guide @@ -16,12 +15,9 @@ sub-step = "dockLoaded" ) - .arrow.white -======= .arrow.white( ng-style = "popoverStyle.getArrowStyle(CIS.instanceBranches)" ) ->>>>>>> origin .grid-block.vertical.popover-content.empty( ng-if = "$root.featureFlags.autoIsolationSetup" ) From 5772f47f8d5efd8ef2a1c15a17d31de66bc87602 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 17:43:24 -0700 Subject: [PATCH 326/577] Turned the 'on' switch to 'on' --- client/services/featureFlagService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 1681d14da..944bfe907 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -7,7 +7,7 @@ function featureFlags( $localStorage ) { var defaultFeatureFlags = { - addBranches: false, + addBranches: true, aha: false, allowIsolatedUpdate: false, autoIsolation: false, From cf3a4432b97fc5a6518d691393d37b78b08746bf Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 18:06:26 -0700 Subject: [PATCH 327/577] 4.20.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b3ecdbf3..574488cbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.6", + "version": "4.20.7", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 4f32097f7965a21fa6ff283f2b15a01d54a76352 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 12 Sep 2016 19:03:51 -0700 Subject: [PATCH 328/577] Removed traces of hascontainer --- client/directives/components/ahaGuide/AhaGuideController.js | 3 --- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 4 ++-- client/services/ahaGuideService.js | 5 ----- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 9a81703c1..1ecbd41a7 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -67,9 +67,6 @@ function AhaGuideController( if (status === 'dockLoaded') { animatedPanelListener(); } - if (ahaGuide.isAddingFirstRepo() && keypather.get(AGC, 'instances.models.length') > 0 && status !== 'complete') { - status = 'hasContainer'; - } AGC.subStep = status; AGC.subStepIndex = currentMilestone.subSteps[status].step; AGC.caption = currentMilestone.subSteps[status].caption; diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index a881595aa..ec72129a3 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -29,11 +29,11 @@ ng-if = "!AGC.showError" ) use( - ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.subStep !== 'complete' && AGC.subStep !== 'hasContainer'" + ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AGC.subStep === 'complete' || AGC.subStep === 'hasContainer'" + ng-if = "AGC.subStep === 'complete'" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 154d8af05..b530e0454 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -137,11 +137,6 @@ function ahaGuide( caption: 'Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches.', className: 'aha-meter-100', step: 9 - }, - hasContainer: { - caption: 'Choose a template to configure.', - className: 'aha-meter-100', - step: 9 } }, buildStatus: { From 9e4a37ae60c528f1c38fd5121c5580973a8d4998 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 11:29:41 -0700 Subject: [PATCH 329/577] Added exited early and error indications to user, removed hasContainer property and created a better transition to setup runnabot and proper checking for choose organization aha checks --- client/controllers/controllerInstances.js | 18 +++++++++++++----- .../addBranchGuide/addBranchGuideView.jade | 16 ++++++++++++++-- .../components/createSandboxGuideView.jade | 10 +++++++++- .../setUpRepositoryGuideView.jade | 11 ++++++++++- .../environment/environmentView.jade | 9 ++++++++- .../chooseOrganizationModalController.js | 2 ++ .../chooseOrganizationModalView.jade | 2 +- client/services/ahaGuideService.js | 12 +++++++++++- .../templates/instances/viewInstancesList.jade | 4 ++-- 9 files changed, 70 insertions(+), 14 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 55113ebd2..ad0d25b17 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -224,15 +224,23 @@ function ControllerInstances( loading('buildingForkedBranch', true); promisify(CIS.poppedInstance, 'fork')(branchName, sha) .then(function (instance) { - var newInstance = instance.children.models.filter(function(childInstance) { + instance.attrs.hasAddedBranches = true; + var newInstances = instance.children.models.filter(function(childInstance) { + console.log(childInstance); return childInstance.attrs.name === branchName + '-' + instance.attrs.name; - })[0]; + }); loading(branchName, false); loading('buildingForkedBranch', false); closePopover(); - $state.go('base.instances.instance', { - instanceName: newInstance.attrs.name - }); + if (newInstances.length) { + $rootScope.$broadcast('hasAddedBranch'); + $state.go('base.instances.instance', { + instanceName: newInstances[0].attrs.name + }); + } + }) + .catch(function(err) { + console.log(err); }); }; diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 9021cc08f..04e66cacf 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -1,5 +1,6 @@ .grid-block.shrink.aha-meter( ng-class = "{\ + 'aha-error': AGC.showError || subStep === 'deletedTemplate',\ 'aha-meter-33': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH,\ 'aha-meter-66': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH && subStep === 'dockLoading',\ 'aha-meter-100': ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ @@ -7,13 +8,21 @@ ) svg.iconnables use( - ng-if = "ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "!AGC.showError && ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "AGC.showError && ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) + + svg.iconnables.icons-alert( + ng-if = "AGC.showError || subStep === 'deletedTemplate'" + ) + use( + xlink:href = "#icons-alert-alt" + ) + .grid-block.vertical.aha-text p.p.small.text-gray-light Add your First Branch p.p( @@ -23,6 +32,9 @@ ng-if = "subStep === 'dockLoading'" ) Select a branch to add. //- show in the branch menu if the repository has no branches. + p.p( + ng-if = "subStep === 'deletedTemplate'" + ) You've deleted your repository template. Create another one to continue. p.p( ng-if = "subStep === 'dockLoaded'" ) Aw, no branches. Try another repository or diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index 408270ccf..988ef50dd 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -14,4 +14,12 @@ ) .grid-block.vertical.aha-text p.p.small.text-gray-light {{ AGC.title }} - p.p {{ AGC.caption }} + p.p( + ng-if = "AGC.subStep === 'orgSelection'" + ) Choose an organization to create your sandbox for. + p.p( + ng-if = "AGC.subStep === 'dockLoading'" + ) Hang tight! + p.p( + ng-if = "AGC.subStep === 'dockLoaded'" + ) Continue to start configuring your project. diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index ec72129a3..857dce6d9 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -44,7 +44,7 @@ ) .grid-block.vertical.aha-text( - ng-if = "$root.featureFlags.aha && !AGC.showError" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.ahaGuide.isAddingFirstRepo()" ) p.p.small.text-gray-light {{ AGC.title }} p.p( @@ -128,6 +128,15 @@ //- ng-class = "{'p-slide js-animate': AGC.showSubStep}" //- ) You‘ve deleted your repository template. Create another one to continue. +.grid-block.vertical.aha-text( + class = "{{ AGC.className }}" + ng-if = "$root.featureFlags.aha && !AGC.showError && !AGC.ahaGuide.isAddingFirstRepo()" +) + p.p.small.text-gray-light {{ AGC.title }} + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'hasContainer'" + ) Choose a template to configure. //- Step 9: p.p( diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 4bbdf45cb..e0677172e 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -58,11 +58,18 @@ sub-step-index = 7 ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha && !EC.isAddingFirstRepo() && !data.instances.models.length" + aha-guide + error-state = "true" + sub-step = 'deletedTemplate' + ) + .grid-block.environment-body.justify-center.clearfix( ng-class = "{'align-center justify-center': EC.showCreateTemplate && !data.instances.models.length}" ) .modal-dialog.modal-sm( - ng-if = "EC.isInGuide() && EC.showCreateTemplate && !data.instances.models.length" + ng-if = "EC.isInGuide() && EC.isAddingFirstRepo() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index 235beb7c2..51aaceecf 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -7,6 +7,7 @@ function ChooseOrganizationModalController( $rootScope, $scope, $state, + ahaGuide, createNewSandboxForUserService, errs, featureFlags, @@ -84,6 +85,7 @@ function ChooseOrganizationModalController( return selectedOrgName.toLowerCase() === org.oauthName().toLowerCase(); }); }; + COMC.isChoosingOrg = ahaGuide.isChoosingOrg; // Polling stuff COMC.cancelPolling = function () { diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 7434987dc..9613e91b5 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -14,7 +14,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( aha-guide - ng-if = "$root.featureFlags.aha" + ng-if = "$root.featureFlags.aha && data.isChoosingOrg()" sub-step = "orgSelection" ) animated-panel-container diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index b530e0454..edf9b66a7 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -18,6 +18,7 @@ function ahaGuide( keypather ) { var instances = []; + var isLaunchingBranch; function refreshInstances() { return fetchInstancesByPod() .then(function (fetchedInstances) { @@ -164,6 +165,10 @@ function ahaGuide( dockLoaded: { caption: 'Continue to start configuring your project.', className: 'aha-meter-100' + }, + deletedTemplate: { + caption: 'You\'ve deleted your repository template. Create another one to continue.', + className: 'aha-meter-20' } }, panelSteps: { } @@ -187,6 +192,8 @@ function ahaGuide( }); $rootScope.$on('hasAddedBranch', function () { refreshInstances(); + $rootScope.$broadcast('show-aha-sidebar'); + isLaunchingBranch = true; }); function getCurrentStep() { if (!cachedStep) { @@ -201,7 +208,7 @@ function ahaGuide( var hasBranchLaunched = instances.some(function (instance) { return instance.attrs.hasAddedBranches; }); - if (hasBranchLaunched) { + if (hasBranchLaunched || isLaunchingBranch) { cachedStep = STEPS.SETUP_RUNNABOT; } else { cachedStep = STEPS.ADD_FIRST_BRANCH; @@ -222,6 +229,9 @@ function ahaGuide( isInGuide: isInGuide, isAddingFirstRepo: function () { return getCurrentStep() === STEPS.ADD_FIRST_REPO; + }, + isChoosingOrg: function() { + return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; } }; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index b230daa98..9c44c1f9c 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -71,7 +71,7 @@ p.p.text-center.text-gray-light.padding-sm( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} .grid-block.align-center.shrink.btn.btn-xxs.white( - ng-if = "$root.featureFlags.aha" + ng-if = "$root.featureFlags.addBranches" ng-click = "CIS.popInstanceOpen(masterInstance)" tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-4,\"top\":24}" pop-over @@ -86,7 +86,7 @@ p.p.text-center.text-gray-light.padding-sm( xlink:href = "#icons-arrow-down" ) .stepOneUncloseablePopover( - ng-if = "$index === 0 && CIS.shouldShowParent(masterInstance)" + ng-if = "$root.featureFlags.aha && $index === 0 && CIS.shouldShowParent(masterInstance) && (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)" pop-over pop-over-active = "CIS.isPopoverOpen" pop-over-controller = "CIS" From 419aaab251d29ab5016cc143758db0a97c1c5142 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 13 Sep 2016 13:07:56 -0700 Subject: [PATCH 330/577] 4.20.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 574488cbf..8c32749b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.7", + "version": "4.20.8", "private": true, "description": "Frontend for Runnable.io", "scripts": { From f3a44905fe82cff39da8ebf83eed9ff9fbb8e072 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 13:55:02 -0700 Subject: [PATCH 331/577] Tested intercom against exited early, added deleted container error state --- client/controllers/controllerInstances.js | 3 --- .../directives/components/ahaGuide/AhaGuideController.js | 8 +++++++- .../ahaGuide/addBranchGuide/addBranchGuideView.jade | 4 ++-- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 8 ++++++-- .../setupRepositoryGuide/setupRepositoryGuideDirective.js | 6 ------ client/directives/environment/environmentView.jade | 3 ++- client/services/ahaGuideService.js | 7 +------ 7 files changed, 18 insertions(+), 21 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index ad0d25b17..a82a14ce6 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -224,16 +224,13 @@ function ControllerInstances( loading('buildingForkedBranch', true); promisify(CIS.poppedInstance, 'fork')(branchName, sha) .then(function (instance) { - instance.attrs.hasAddedBranches = true; var newInstances = instance.children.models.filter(function(childInstance) { - console.log(childInstance); return childInstance.attrs.name === branchName + '-' + instance.attrs.name; }); loading(branchName, false); loading('buildingForkedBranch', false); closePopover(); if (newInstances.length) { - $rootScope.$broadcast('hasAddedBranch'); $state.go('base.instances.instance', { instanceName: newInstances[0].attrs.name }); diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 1ecbd41a7..f8797eb75 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -30,8 +30,14 @@ function AhaGuideController( } }); + AGC.askEngineers = function () { + window.Intercom( + 'showNewMessage', + 'I’m having trouble getting my first container up and running.' + ); + }; + var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { - console.log(buildStatus); handleBuildUpdate(buildStatus); }); diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 04e66cacf..7e9516328 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -12,12 +12,12 @@ xlink:href = "#icons-octicons-branch" ) use( - ng-if = "AGC.showError && ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "!AGC.showError && ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( - ng-if = "AGC.showError || subStep === 'deletedTemplate'" + ng-if = "AGC.showError" ) use( xlink:href = "#icons-alert-alt" diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 857dce6d9..8877ee15d 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -86,7 +86,11 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'exitedEarly'" - ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers! + ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, + a.link( + ng-click = "AGC.askEngineers()" + ) ask our engineers + | ! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'success'" @@ -119,7 +123,7 @@ ng-if = "AGC.showErrorType === 'exitedEarly'" ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, a.link( - ng-click = "askEngineers()" + ng-click = "AGC.askEngineers()" ) ask our engineers | ! diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js index 29a7fa48b..2708d66de 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js @@ -15,12 +15,6 @@ function setupRepositoryGuide( steps: ahaGuide.steps, getCurrentStep: ahaGuide.getCurrentStep }; - $scope.askEngineers = function () { - window.Intercom( - 'showNewMessage', - 'I’m having trouble getting my first container up and running.' - ); - }; } }; } diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index e0677172e..89478dea3 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -62,7 +62,8 @@ ng-if = "$root.featureFlags.aha && !EC.isAddingFirstRepo() && !data.instances.models.length" aha-guide error-state = "true" - sub-step = 'deletedTemplate' + sub-step = "deletedTemplate" + error-state = "true" ) .grid-block.environment-body.justify-center.clearfix( diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index edf9b66a7..6b8499ed4 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -190,11 +190,6 @@ function ahaGuide( $rootScope.$on('$stateChangeSuccess', function () { refreshInstances(); }); - $rootScope.$on('hasAddedBranch', function () { - refreshInstances(); - $rootScope.$broadcast('show-aha-sidebar'); - isLaunchingBranch = true; - }); function getCurrentStep() { if (!cachedStep) { if ($rootScope.featureFlags.aha && !keypather.get(currentOrg, 'poppa.id')) { @@ -208,7 +203,7 @@ function ahaGuide( var hasBranchLaunched = instances.some(function (instance) { return instance.attrs.hasAddedBranches; }); - if (hasBranchLaunched || isLaunchingBranch) { + if (hasBranchLaunched) { cachedStep = STEPS.SETUP_RUNNABOT; } else { cachedStep = STEPS.ADD_FIRST_BRANCH; From 357f4c765f3e0327e6468a68cbee9456defdd78b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 13:59:57 -0700 Subject: [PATCH 332/577] Little cleanup --- .../components/ahaGuide/addBranchGuide/addBranchGuideView.jade | 2 +- client/services/featureFlagService.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 7e9516328..d07ac4512 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -1,6 +1,6 @@ .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-error': AGC.showError || subStep === 'deletedTemplate',\ + 'aha-error': AGC.showError,\ 'aha-meter-33': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH,\ 'aha-meter-66': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH && subStep === 'dockLoading',\ 'aha-meter-100': ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index b08e91050..944bfe907 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -1,4 +1,3 @@ - 'use strict'; require('app') From 115fcb2ee822a946e326b7f448eb36f7933fa1c1 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 14:24:58 -0700 Subject: [PATCH 333/577] Fixed tests --- .../chooseOrganizationModalController.unit.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js b/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js index d4206e0db..57c868a07 100644 --- a/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js +++ b/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js @@ -10,6 +10,7 @@ var $q; var apiMocks = require('../../../apiMocks/index'); var user = require('../../../apiMocks').user; +var mockAhaGuide; var mockWhitelistedOrgs; var mockGrantedOrgs; var mockCreateNewSandboxForUserService; @@ -85,8 +86,12 @@ describe('ChooseOrganizationModalController', function () { mockState = { go: sinon.stub() }; + mockAhaGuide = { + isChoosingOrg: sinon.stub() + }; angular.mock.module('app', function ($provide) { $provide.value('$state', mockState); + $provide.value('ahaGuide', mockAhaGuide); $provide.factory('createNewSandboxForUserService', function ($q) { mockCreateNewSandboxForUserService = sinon.stub().returns($q.when(true)); return mockCreateNewSandboxForUserService; From 673dfc5d646699fc537a87b6eb66aee798a5da1d Mon Sep 17 00:00:00 2001 From: henrymollman Date: Tue, 13 Sep 2016 14:35:32 -0700 Subject: [PATCH 334/577] Added uncloseable popover that can only be closed by a directed event (#1717) * Added uncloseable popover that can only be closed by a directed event * Added 'override' to argument name --- .../directives/popovers/popOverController.js | 14 ++++++-- .../directives/popovers/popOverDirective.js | 3 +- .../popovers/popOverController.unit.js | 35 ++++++++++++++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index 3e4f5be83..ee16eb41e 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -25,6 +25,7 @@ function PopOverController( $scope.active = false; POC.unbindDocumentClick(); POC.unbindPopoverOpened(); + POC.unbindSpecificPopoverOpened(); // We need a closure because they could technically re-open the popover and we want to manage THIS scope and THIS element. (function (popoverElementScope, popoverElement) { //Give the transition some time to finish! @@ -55,13 +56,20 @@ function PopOverController( // If the click has a target and that target is on the page but not on our popover we should close the popover. // Otherwise we should keep the popover alive. POC.unbindDocumentClick = $scope.$on('app-document-click', function (event, target) { - if (!target || (target && $document[0].contains(target) && !POC.popoverElement[0].contains(target))) { + if (!$scope.userCannotClose && (!target || (target && $document[0].contains(target) && !POC.popoverElement[0].contains(target)))) { POC.closePopover(); } }); }, 0); - POC.unbindPopoverOpened = $scope.$on('close-popovers', function () { - POC.closePopover(); + POC.unbindPopoverOpened = $scope.$on('close-popovers', function (event, closeAllPopoversOverride) { + if (!$scope.userCannotClose || closeAllPopoversOverride) { + POC.closePopover(); + } + }); + POC.unbindSpecificPopoverOpened = $scope.$on('close-open-state-popover', function (event, popoverName) { + if ($scope.data && $scope.data.popoverName === popoverName) { + POC.closePopover(); + } }); var template = $templateCache.get($scope.template); diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index 7746b4ecb..97adc8c49 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -16,7 +16,8 @@ var scopeVars = { active: '=? popOverActive', template: '= popOverTemplate', controller: '=? popOverController', - controllerAs: '@? popOverControllerAs' + controllerAs: '@? popOverControllerAs', + userCannotClose: '=? popOverUncloseable' }; function popOver( diff --git a/test/unit/directives/popovers/popOverController.unit.js b/test/unit/directives/popovers/popOverController.unit.js index 62219e8d0..3cd7f544a 100644 --- a/test/unit/directives/popovers/popOverController.unit.js +++ b/test/unit/directives/popovers/popOverController.unit.js @@ -143,6 +143,7 @@ describe('PopOverController'.bold.underline.blue, function() { POC.popoverElement = {}; POC.unbindDocumentClick = sinon.spy(); POC.unbindPopoverOpened = sinon.spy(); + POC.unbindSpecificPopoverOpened = sinon.spy(); POC.popoverElementScope.$destroy = sinon.spy(); POC.popoverElement.remove = sinon.spy(); POC.closePopover(); @@ -198,6 +199,38 @@ describe('PopOverController'.bold.underline.blue, function() { sinon.assert.calledOnce(POC.closePopover); }); + it('should not close if it is an uncloseable popover', function () { + POC.popoverElement[0] = { + contains: sinon.spy(function () { + return true; + }) + }; + $scope.userCannotClose = true; + $rootScope.$broadcast('close-popovers', false, {}); + $scope.$digest(); + sinon.assert.notCalled(POC.closePopover); + + $rootScope.$broadcast('close-popovers', true, {}); + $scope.$digest(); + sinon.assert.calledOnce(POC.closePopover); + }); + it('should close an uncloseable popover if the close specific popover is broadcast', function () { + POC.popoverElement[0] = { + contains: sinon.spy(function () { + return true; + }) + }; + $scope.data = {popoverName: 'mockPopoverName'}; + $scope.userCannotClose = true; + + $rootScope.$broadcast('close-open-state-popover', 'not the correct name', {}); + $scope.$digest(); + sinon.assert.notCalled(POC.closePopover); + + $rootScope.$broadcast('close-open-state-popover', 'mockPopoverName', {}); + $scope.$digest(); + sinon.assert.calledOnce(POC.closePopover); + }); }); }); -}); \ No newline at end of file +}); From 7975925aa185d89f6310f7660233b77918282765 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 14:36:10 -0700 Subject: [PATCH 335/577] 4.20.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8c32749b8..c0a8e54e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.8", + "version": "4.20.9", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 9ee6a0d898b914fe8fc22b975e5ac004a9683327 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 15:33:36 -0700 Subject: [PATCH 336/577] Addressed PR comments --- .../scss/popover/popover-branch-menu.scss | 1 - client/controllers/controllerApp.js | 14 ++++++++ client/controllers/controllerInstances.js | 33 ++----------------- .../components/ahaGuide/AhaGuideController.js | 11 ++----- .../addBranchGuide/addBranchGuideView.jade | 7 +--- .../components/ahaGuide/ahaGuideView.jade | 8 ++--- .../setUpRepositoryGuideView.jade | 20 ++--------- .../setupRepositoryGuideDirective.js | 6 ++++ .../environment/environmentView.jade | 3 +- .../branchMenuPopoverView.jade | 4 +-- .../branchMenuPopover/introAddBranch.jade | 4 +-- client/directives/navBar/viewNav.jade | 2 +- client/services/ahaGuideService.js | 10 ++++-- .../instances/viewInstancesList.jade | 2 +- 14 files changed, 47 insertions(+), 78 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 9871e8f2d..2a73b9a07 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -1,7 +1,6 @@ .popover-branch-menu, .popover-template-menu { max-width: 360px; - min-height: 105px; width: 100%; .popover-content.popover-content { diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 77a511d77..591cc5b02 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -131,6 +131,20 @@ function ControllerApp( CA.showAhaNavPopover = true; }); + CA.showAhaConfirmation = function() { + ModalService.showModal({ + controller: 'ConfirmationModalController', + controllerAs: 'CMC', + templateUrl: 'confirmSetupView' + }) + .then(function (modal) { + return modal.close; + }) + .then(function(confirmed) { + console.log(confirmed); + }) + }; + /** * broadcast to child scopes when click event propagates up * to top level controller scope. diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index a82a14ce6..63f2e64a5 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -8,10 +8,8 @@ require('app') function ControllerInstances( $filter, $localStorage, - $rootScope, $scope, $state, - $timeout, ahaGuide, keypather, setLastOrg, @@ -26,20 +24,20 @@ function ControllerInstances( ) { var CIS = this; var userName = $state.params.userName; - CIS.ahaGuide = ahaGuide; + CIS.isAddingFirstBranch = ahaGuide.isAddingFirstBranch; + CIS.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; CIS.currentOrg = currentOrg; CIS.searchBranches = null; CIS.instanceBranches = null; CIS.isPopoverOpen = true; CIS.unbuiltBranches = null; - CIS.popoverCannotClose = true; CIS.branchQuery = null; CIS.$storage = $localStorage.$default({ instanceListIsClosed: false }); $scope.$on('popover-closed', function(event, pop) { - if (pop.data && pop.data !== 'ahaTemplate' && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH) { + if (pop.data && pop.data !== 'ahaTemplate' && CIS.isAddingFirstBranch()) { CIS.isPopoverOpen = true; } }); @@ -255,31 +253,6 @@ function ControllerInstances( .catch(errs.handler); }; - this.openInviteAdminModal = function (instance) { - ModalService.showModal({ - controller: 'InviteAdminModalController', - controllerAs: 'IAMC', - templateUrl: 'inviteAdminModalView', - inputs: { - instance: instance, - isFromAutoDeploy: false - } - }) - .catch(errs.handler); - }; - - this.openEnableBranchesModal = function (instance) { - ModalService.showModal({ - controller: 'EnableBranchesModalController', - controllerAs: 'EBMC', - templateUrl: 'enableBranchesModalView', - inputs: { - instance: instance - } - }) - .catch(errs.handler); - }; - this.setAutofork = function () { CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; promisify(CIS.poppedInstance, 'update')({ shouldNotAutofork: CIS.poppedInstance.attrs.shouldNotAutofork }) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index f8797eb75..08d91f4d1 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -9,8 +9,7 @@ function AhaGuideController( $rootScope, ahaGuide, currentOrg, - fetchInstancesByPod, - keypather + fetchInstancesByPod ) { var AGC = this; var animatedPanelListener = angular.noop; @@ -30,13 +29,6 @@ function AhaGuideController( } }); - AGC.askEngineers = function () { - window.Intercom( - 'showNewMessage', - 'I’m having trouble getting my first container up and running.' - ); - }; - var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { handleBuildUpdate(buildStatus); }); @@ -58,6 +50,7 @@ function AhaGuideController( AGC.isBuildSuccessful = false; AGC.ahaGuide = ahaGuide; + AGC.showError = $scope.showError; // get the current milestone var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index d07ac4512..c5221ccf8 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -34,9 +34,4 @@ //- show in the branch menu if the repository has no branches. p.p( ng-if = "subStep === 'deletedTemplate'" - ) You've deleted your repository template. Create another one to continue. - p.p( - ng-if = "subStep === 'dockLoaded'" - ) Aw, no branches. Try another repository or - a.link skip this step - | . + ) You've deleted your repository template. Create another one to continue. \ No newline at end of file diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index bf1995736..b8e5434fb 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -1,5 +1,5 @@ .grid-block.align-center( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.CHOOSE_ORGANIZATION" + ng-if = "AGC.ahaGuide.isChoosingOrg()" ng-include = "'createSandboxGuideView'" ) @@ -9,18 +9,18 @@ ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "AGC.ahaGuide.isAddingBranch()" add-branch-guide ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.SETUP_RUNNABOT" + ng-if = "AGC.ahaGuide.isSettingUpRunnabot()" ng-include = "'setUpRunnabotGuideView'" ) button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "AGC.ahaGuide.getCurrentStep() !== AGC.ahaGuide.steps.CHOOSE_ORGANIZATION" + ng-if = "AGC.ahaGuide.isChoosingOrg()" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 8877ee15d..7cb1de46f 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -6,7 +6,7 @@ ng-if = "!AGC.showError && !AGC.errorState" ) use( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_REPO && AGC.subStep !== 'complete'" + ng-if = "AGC.ahaGuide.isAddingFirstRepo() && AGC.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( @@ -88,7 +88,7 @@ ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'exitedEarly'" ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, a.link( - ng-click = "AGC.askEngineers()" + ng-click = "askEngineers()" ) ask our engineers | ! p.p( @@ -111,22 +111,6 @@ ng-if = "$root.featureFlags.aha && !AGC.showError" ) {{ AGC.caption }} - //- Step 8: - p.p( - ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "AGC.subStepIndex === 7" - ) - | {{!AGC.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} - | {{AGC.showError ? 'Uh oh, there was a build error! Inspect your logs for debug info.' : ''}} - //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. - span.span( - ng-if = "AGC.showErrorType === 'exitedEarly'" - ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, - a.link( - ng-click = "AGC.askEngineers()" - ) ask our engineers - | ! - //- If template repo is deleted: //- p.p( //- ng-class = "{'p-slide js-animate': AGC.showSubStep}" diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js index 2708d66de..29a7fa48b 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setupRepositoryGuideDirective.js @@ -15,6 +15,12 @@ function setupRepositoryGuide( steps: ahaGuide.steps, getCurrentStep: ahaGuide.getCurrentStep }; + $scope.askEngineers = function () { + window.Intercom( + 'showNewMessage', + 'I’m having trouble getting my first container up and running.' + ); + }; } }; } diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 89478dea3..976c45f7a 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -63,14 +63,13 @@ aha-guide error-state = "true" sub-step = "deletedTemplate" - error-state = "true" ) .grid-block.environment-body.justify-center.clearfix( ng-class = "{'align-center justify-center': EC.showCreateTemplate && !data.instances.models.length}" ) .modal-dialog.modal-sm( - ng-if = "EC.isInGuide() && EC.isAddingFirstRepo() && EC.showCreateTemplate && !data.instances.models.length" + ng-if = "EC.isAddingFirstRepo() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index d8a5a163a..febbea2d8 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -3,13 +3,13 @@ ng-style = "popoverStyle.getStyle(CIS.instanceBranches)" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "$root.featureFlags.aha && CIS.instanceBranches.length && CIS.isAddingFirstBranch()" aha-guide step-index = 2 sub-step = "dockLoading" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && CIS.instanceBranches && !CIS.instanceBranches.length && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "$root.featureFlags.aha && CIS.instanceBranches && !CIS.instanceBranches.length && CIS.isAddingFirstBranch()" aha-guide step-index = 2 sub-step = "dockLoaded" diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade index 859bd39be..f7992df60 100644 --- a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -3,14 +3,14 @@ ng-style = "popoverStyle.getStyle()" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isAddingFirstBranch()" aha-guide step-index = 2 sub-step = "addBranch" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.SETUP_RUNNABOT" + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isSettingUpRunnabot()" aha-guide step-index = 3 sub-step = "addBranch" diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 9231221af..99eea7668 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -44,7 +44,7 @@ a.a( a.a( ng-if = "$root.featureFlags.aha && CA.instancesByPod.models.length && !CA.currentOrg.poppa.hasConfirmedSetup" - internal-modal-helper = "confirmSetupView" + ng-click = "CA.showAhaConfirmation()" ) svg.iconnables.icons-server-dark use( diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6b8499ed4..009aa3bbb 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -222,11 +222,17 @@ function ahaGuide( getCurrentStep: getCurrentStep, steps: STEPS, isInGuide: isInGuide, + isChoosingOrg: function() { + return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; + }, isAddingFirstRepo: function () { return getCurrentStep() === STEPS.ADD_FIRST_REPO; }, - isChoosingOrg: function() { - return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; + isAddingFirstBranch: function() { + return getCurrentStep() === STEPS.ADD_FIRST_BRANCH; + }, + isSettingUpRunnabot: function() { + return getCurrentStep() === STEPS.SETUP_RUNNABOT; } }; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 9c44c1f9c..3aa86ef32 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -93,7 +93,7 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" pop-over-trigger = "activeAttr" - pop-over-uncloseable = "CIS.ahaGuide.getCurrentStep() === CIS.ahaGuide.steps.ADD_FIRST_BRANCH" + pop-over-uncloseable = "CIS.isAddingFirstBranch()" pop-over-data = "'ahaTemplate'" ) From fc008e1d850a5899fa454f4fda552ab4394a7e0c Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 16:24:18 -0700 Subject: [PATCH 337/577] Implemented confirm setup and has aha false --- client/controllers/controllerApp.js | 6 +++++ .../components/ahaGuide/AhaGuideController.js | 9 ++++++-- .../components/ahaGuide/ahaGuideView.jade | 2 +- client/services/patchOrgMetadata.js | 23 +++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 client/services/patchOrgMetadata.js diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 591cc5b02..69cf413c5 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -22,6 +22,7 @@ function ControllerApp( keypather, ModalService, pageName, + patchOrgMetadata, promisify, currentOrg, user, @@ -142,6 +143,11 @@ function ControllerApp( }) .then(function(confirmed) { console.log(confirmed); + patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasConfirmedSetup: true + } + }); }) }; diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 08d91f4d1..a77e506d7 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -9,7 +9,8 @@ function AhaGuideController( $rootScope, ahaGuide, currentOrg, - fetchInstancesByPod + fetchInstancesByPod, + patchOrgMetadata ) { var AGC = this; var animatedPanelListener = angular.noop; @@ -102,7 +103,11 @@ function AhaGuideController( endGuide: function () { $rootScope.$broadcast('close-popovers'); // TODO: AHA - Make this save - currentOrg.poppa.hasAha = false; + patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasAha: false + } + }) }, showSidebar: function () { $rootScope.$broadcast('close-popovers'); diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 14b1afc25..fbef3e1e0 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -20,7 +20,7 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "AGC.ahaGuide.isChoosingOrg()" + ng-if = "!AGC.ahaGuide.isChoosingOrg()" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" diff --git a/client/services/patchOrgMetadata.js b/client/services/patchOrgMetadata.js new file mode 100644 index 000000000..50e96477d --- /dev/null +++ b/client/services/patchOrgMetadata.js @@ -0,0 +1,23 @@ +'use strict'; + +require('app') + .factory('patchOrgMetadata', patchOrgMetadata); + +function patchOrgMetadata( + $http, + configAPIHost +) { + return function (orgId, params) { + return $http({ + method: 'patch', + url: configAPIHost + '/auth/whitelist/' + orgId, + data: params + }) + .then(function (data) { + return data; // Github returns 404 when the user isn't part of the org + }) + .catch(function (err) { + return err; + }); + }; +} \ No newline at end of file From 6bcca0e2ed1bbedb4eba0c78a0877308c0adaf49 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 17:29:59 -0700 Subject: [PATCH 338/577] Addressed PR comments --- client/controllers/controllerApp.js | 26 ++++++----------- client/controllers/controllerInstances.js | 6 ++-- .../components/ahaGuide/AhaGuideController.js | 5 +++- .../addBranchGuide/addBranchGuideView.jade | 6 ++-- .../ahaSidebar/ahaSidebarDirective.js | 1 + .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 4 +-- .../setUpRepositoryGuideView.jade | 2 +- client/directives/modals/directiveModal.js | 6 ++-- .../modals/directiveModalManager.js | 2 +- .../chooseOrganizationModalView.jade | 28 +++++++++---------- .../directives/popovers/popOverController.js | 1 + client/services/ahaGuideService.js | 1 - client/services/patchOrgMetadata.js | 7 +++-- client/templates/viewOrgSelect.jade | 3 +- .../directives/modals/directiveModal.unit.js | 6 ++-- 15 files changed, 51 insertions(+), 53 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 69cf413c5..cd33a636d 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -30,22 +30,6 @@ function ControllerApp( activeAccount ) { // Load ace after 10 seconds. Should improve user experience overall.. - $timeout(function () { - $ocLazyLoad.load('ui.ace'); - }, 10000); - - $scope.$on('confirmedSetup', function() { - promisify(currentOrg.poppa, 'update')({ - hasConfirmedSetup: true - }) - .then(function(result) { - console.log(result); - }); - // cheese it - currentOrg.poppa.hasConfirmedSetup = true; - $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); - }); - this.activeAccount = activeAccount; this.user = user; var CA = this; @@ -142,13 +126,19 @@ function ControllerApp( return modal.close; }) .then(function(confirmed) { - console.log(confirmed); patchOrgMetadata(currentOrg.poppa.id(), { metadata: { hasConfirmedSetup: true } + }) + .then(function() { + $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); + }) + .catch(function(err) { + // errs.handler(errs); + $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); }); - }) + }); }; /** diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 63f2e64a5..1140d5936 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -37,13 +37,13 @@ function ControllerInstances( }); $scope.$on('popover-closed', function(event, pop) { - if (pop.data && pop.data !== 'ahaTemplate' && CIS.isAddingFirstBranch()) { + if (keypather.get(pop, 'data') !== 'ahaTemplate' && CIS.isAddingFirstBranch()) { CIS.isPopoverOpen = true; } }); $scope.$on('popover-opened', function(event, pop) { - if (pop.data !== 'ahaTemplate') { + if (keypather.get(pop, 'data') !== 'ahaTemplate') { CIS.isPopoverOpen = false; } }); @@ -235,7 +235,7 @@ function ControllerInstances( } }) .catch(function(err) { - console.log(err); + errs.handler(err); }); }; diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index a77e506d7..755efe819 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -93,6 +93,9 @@ function AhaGuideController( if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('exitedEarly', true); } + if (AGC.ahaGuide.isSettingUpRunnabot()) { + + } }); animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { @@ -107,7 +110,7 @@ function AhaGuideController( metadata: { hasAha: false } - }) + }); }, showSidebar: function () { $rootScope.$broadcast('close-popovers'); diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index c5221ccf8..0e86ce048 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -1,14 +1,14 @@ .grid-block.shrink.aha-meter( ng-class = "{\ 'aha-error': AGC.showError,\ - 'aha-meter-33': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH,\ - 'aha-meter-66': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH && subStep === 'dockLoading',\ + 'aha-meter-33': ahaGuide.isAddingFirstBranch(),\ + 'aha-meter-66': ahaGuide.isAddingFirstBranch() && subStep === 'dockLoading',\ 'aha-meter-100': ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables use( - ng-if = "!AGC.showError && ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "!AGC.showError && ahaGuide.isAddingFirstBranch()" xlink:href = "#icons-octicons-branch" ) use( diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index 2832f1dd3..abd723f5d 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -16,6 +16,7 @@ function ahaSidebar( link: function ($scope) { $scope.steps = ahaGuide.steps; $scope.getCurrentStep = ahaGuide.getCurrentStep; + $scope.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; $scope.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; } }; diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index ca746dcf8..60513869f 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -8,7 +8,7 @@ //- During ahas 1-3: | Setup Guide h4.grid-content.strong.text-center.h4( - ng-if = "getCurrentStep() === steps.SETUP_RUNNABOT" + ng-if = "isSettingUpRunnabot()" ) //- During aha 4: | You did it! @@ -95,6 +95,6 @@ p.small Your branches will update on every commit you make. .grid-block.vertical.align-center.form-github( - ng-if = "getCurrentStep() === steps.SETUP_RUNNABOT" + ng-if = "isSettingUpRunnabot()" github-integration ) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 7cb1de46f..b78651e14 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -50,7 +50,7 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'addRepository'" - ) Add your repository by clicking ‘Add Configuration’. + ) Add your repository by clicking ‘Create Template’. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'containerSelection'" diff --git a/client/directives/modals/directiveModal.js b/client/directives/modals/directiveModal.js index 9ca2a5dd3..1e46ba86d 100755 --- a/client/directives/modals/directiveModal.js +++ b/client/directives/modals/directiveModal.js @@ -9,7 +9,8 @@ function modal() { return { restrict: 'A', scope: { - data: '=?modalData', // Contains modal specific data + controller: '=?modalController', // Contains modal specific data + controllerAs: '@?modalControllerAs', // the property name used to access controller actions: '=?modalActions', // Contains modal specific actions template: '@modalTemplate', currentModel: '=?modalCurrentModel', // The object that contains the data to display @@ -19,8 +20,9 @@ function modal() { link: function ($scope, element, attrs) { function openModal() { $scope.$emit('open-modal', { - data: $scope.data, actions: $scope.actions, + controller: $scope.controller, + controllerAs: $scope.controllerAs, template: $scope.template, currentModel: $scope.currentModel, stateModel: $scope.stateModel diff --git a/client/directives/modals/directiveModalManager.js b/client/directives/modals/directiveModalManager.js index 54f7d1ecc..4b1823a30 100644 --- a/client/directives/modals/directiveModalManager.js +++ b/client/directives/modals/directiveModalManager.js @@ -58,7 +58,7 @@ function modalManager( } $scope.currentModalScope = currentModalScope = $scope.$new(true); - currentModalScope.data = options.data; + currentModalScope[options.controllerAs] = options.controller; currentModalScope.actions = options.actions; currentModalScope.template = options.template; currentModalScope.openFlag = options.openFlag; diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 9613e91b5..12a0be358 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -8,13 +8,13 @@ ) .grid-block.shrink.modal-dialog.modal-orgs( ng-class = "{\ - 'modal-lg': data.allAccounts.length > 1,\ - 'modal-sm': data.allAccounts.length <= 1\ + 'modal-lg': COS.allAccounts.length > 1,\ + 'modal-sm': COS.allAccounts.length <= 1\ }" ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( aha-guide - ng-if = "$root.featureFlags.aha && data.isChoosingOrg()" + ng-if = "$root.featureFlags.aha && COS.isChoosingOrg()" sub-step = "orgSelection" ) animated-panel-container @@ -35,7 +35,7 @@ .grid-block.shrink.justify-center.align-center.padding-xs.well.gray.aha-tips.fade( ng-class = "{'in': isActivePanel()}" - ng-if = "$root.featureFlags.aha && data.allAccounts.length" + ng-if = "$root.featureFlags.aha && COS.allAccounts.length" ) svg.grid-content.shrink.iconnables use( @@ -50,7 +50,7 @@ //- empty state .empty.well.gray.padding-lg( - ng-if = "!data.allAccounts.length" + ng-if = "!COS.allAccounts.length" ) h3.h3.empty.text-gray.text-center We couldn’t find any organizations. small.small.empty.text-center Check if you’ve granted access to your organization @@ -61,15 +61,15 @@ | . If you don’t have permission to grant access, you’ll have to ask your admin to give the go ahead. form.grid-block.list.fade( - name = "data.orgSelectorForm" + name = "COS.orgSelectorForm" ng-class = "{'in': isActivePanel()}" - ng-if = "data.allAccounts.length" + ng-if = "COS.allAccounts.length" ) //- add .active class if this org is selected //- add [disabled] property when loading NOT class! label.grid-block.align-center.list-item.btn.white( - ng-class = "{'active': org.oauthName() === data.selectedOrgName}" - ng-repeat = "org in data.allAccounts" + ng-class = "{'active': org.oauthName() === COS.selectedOrgName}" + ng-repeat = "org in COS.allAccounts" title = "{{org.oauthName()}}" ) img.grid-block.shrink( @@ -79,7 +79,7 @@ ) span.grid-block.text-left.text-overflow {{org.oauthName()}} input.checkbox.hidden( - ng-model = "data.selectedOrgName" + ng-model = "COS.selectedOrgName" value = "{{org.oauthName()}}" type = "radio" ) @@ -92,14 +92,14 @@ //- hide the footer if no orgs are found footer.grid-block.vertical.modal-footer.fade( ng-class = "{'in': isActivePanel()}" - ng-if = "data.allAccounts.length" + ng-if = "COS.allAccounts.length" ) //- disabled until an org is selected button.btn.btn-md.green( ng-click = "\ - actions.createOrCheckDock(data.selectedOrgName, goToPanel);\ + actions.createOrCheckDock(COS.selectedOrgName, goToPanel);\ " - ng-disabled = "!data.selectedOrgName" + ng-disabled = "!COS.selectedOrgName" ) Confirm Organization animated-panel.modal-body.grid-block.vertical( @@ -131,7 +131,7 @@ ng-class = "{'in': isActivePanel()}" ) button.btn.btn-md.green( - ng-click = "actions.selectAccount(data.selectedOrgName)" + ng-click = "actions.selectAccount(COS.selectedOrgName)" ) Go to Runnable .grid-block.justify-center.modal-outer-footer( grace-period-footer diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index abb5291b4..76a79c338 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -15,6 +15,7 @@ function PopOverController( var POC = this; POC.unbindDocumentClick = angular.noop; POC.unbindPopoverOpened = angular.noop; + POC.unbindSpecificPopoverOpened = angular.noop; POC.isPopoverActive = function () { return $scope.active; diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 009aa3bbb..68bbec816 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -18,7 +18,6 @@ function ahaGuide( keypather ) { var instances = []; - var isLaunchingBranch; function refreshInstances() { return fetchInstancesByPod() .then(function (fetchedInstances) { diff --git a/client/services/patchOrgMetadata.js b/client/services/patchOrgMetadata.js index 50e96477d..cba464fed 100644 --- a/client/services/patchOrgMetadata.js +++ b/client/services/patchOrgMetadata.js @@ -5,7 +5,8 @@ require('app') function patchOrgMetadata( $http, - configAPIHost + configAPIHost, + errs ) { return function (orgId, params) { return $http({ @@ -14,10 +15,10 @@ function patchOrgMetadata( data: params }) .then(function (data) { - return data; // Github returns 404 when the user isn't part of the org + return data; }) .catch(function (err) { - return err; + errs.handler(err); }); }; } \ No newline at end of file diff --git a/client/templates/viewOrgSelect.jade b/client/templates/viewOrgSelect.jade index d1bb2a251..39bf76768 100644 --- a/client/templates/viewOrgSelect.jade +++ b/client/templates/viewOrgSelect.jade @@ -1,7 +1,8 @@ div( modal modal-actions = "actions" - modal-data = "COS" + modal-controller = "COS" + modal-controller-as = "COS" modal-open-flag = "true" modal-template = "chooseOrganizationModalView" ) \ No newline at end of file diff --git a/test/unit/directives/modals/directiveModal.unit.js b/test/unit/directives/modals/directiveModal.unit.js index 28d8909ec..b2ae04d94 100644 --- a/test/unit/directives/modals/directiveModal.unit.js +++ b/test/unit/directives/modals/directiveModal.unit.js @@ -73,7 +73,7 @@ describe('directiveModal'.bold.underline.blue, function () { ctx = {}; ctx.template = directiveTemplate.attribute('modal', { - 'modal-data': 'data', + 'modal-controller': 'controller', 'modal-actions': 'actions', 'modal-template': 'viewModalError', 'modal-current-model': 'currentModel', @@ -93,7 +93,7 @@ describe('directiveModal'.bold.underline.blue, function () { expect($elScope.$emit.calledWith('open-modal'), 'Called with').to.equal(true); var lastCallOptions = $elScope.$emit.lastCall.args[1]; - expect(lastCallOptions.data, 'Called with options.data').to.equal(inputScope.data); + expect(lastCallOptions.controller, 'Called with options.data').to.equal(inputScope.controller); expect(lastCallOptions.actions, 'Called with options.actions').to.equal(inputScope.actions); expect(lastCallOptions.template, 'Called with options.template').to.equal('viewModalError'); expect(lastCallOptions.currentModel, 'Called with options.currentModel').to.equal(inputScope.currentModel); @@ -115,7 +115,7 @@ describe('directiveModal'.bold.underline.blue, function () { expect($elScope.$emit.calledWith('open-modal'), 'Called with').to.equal(true); var lastCallOptions = $elScope.$emit.lastCall.args[1]; - expect(lastCallOptions.data, 'Called with options.data').to.equal(inputScope.data); + expect(lastCallOptions.controller, 'Called with options.data').to.equal(inputScope.controller); expect(lastCallOptions.actions, 'Called with options.actions').to.equal(inputScope.actions); expect(lastCallOptions.template, 'Called with options.template').to.equal('viewModalError'); expect(lastCallOptions.currentModel, 'Called with options.currentModel').to.equal(inputScope.currentModel); From a95f6a779f5f34ae7065313106d59298e428ecf5 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 13 Sep 2016 19:39:24 -0700 Subject: [PATCH 339/577] More cleanup and PR comment addressing --- client/controllers/controllerApp.js | 2 +- client/controllers/controllerInstances.js | 1 + .../components/ahaGuide/AhaGuideController.js | 2 + .../addBranchGuide/addBranchGuideView.jade | 12 +++--- .../setUpRepositoryGuideView.jade | 38 +++++++++---------- .../environment/environmentController.js | 14 +++++-- .../environment/environmentView.jade | 6 +-- client/directives/navBar/viewNav.jade | 4 +- client/services/ahaGuideService.js | 17 ++++++--- client/services/patchOrgMetadata.js | 3 -- .../instances/viewInstancesList.jade | 2 +- 11 files changed, 57 insertions(+), 44 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index cd33a636d..57bdb79ee 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -113,7 +113,7 @@ function ControllerApp( CA.showAhaNavPopover = false; $rootScope.$on('launchAhaNavPopover', function () { - CA.showAhaNavPopover = true; + CA.showAhaNavPopover = !keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); }); CA.showAhaConfirmation = function() { diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 1140d5936..3ecc4c571 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -24,6 +24,7 @@ function ControllerInstances( ) { var CIS = this; var userName = $state.params.userName; + CIS.isInGuide = ahaGuide.isInGuide; CIS.isAddingFirstBranch = ahaGuide.isAddingFirstBranch; CIS.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; CIS.currentOrg = currentOrg; diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 755efe819..5b347ea40 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -49,6 +49,8 @@ function AhaGuideController( } }); + AGC.isInGuide = ahaGuide.isInGuide; + AGC.hasConfirmedSetup = ahaGuide.hasConfirmedSetup; AGC.isBuildSuccessful = false; AGC.ahaGuide = ahaGuide; AGC.showError = $scope.showError; diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 0e86ce048..ae9659888 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -1,18 +1,18 @@ .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-error': AGC.showError,\ - 'aha-meter-33': ahaGuide.isAddingFirstBranch(),\ - 'aha-meter-66': ahaGuide.isAddingFirstBranch() && subStep === 'dockLoading',\ - 'aha-meter-100': ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ + 'aha-error': AGC.errorState || AGC.showError,\ + 'aha-meter-33': AGC.ahaGuide.isAddingFirstBranch(),\ + 'aha-meter-66': AGC.ahaGuide.isAddingFirstBranch() && subStep === 'dockLoading',\ + 'aha-meter-100': AGC.ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables use( - ng-if = "!AGC.showError && ahaGuide.isAddingFirstBranch()" + ng-if = "!AGC.showError && AGC.ahaGuide.isAddingFirstBranch()" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "!AGC.showError && ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "!AGC.showError && ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index b78651e14..4b39fa940 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -22,7 +22,7 @@ .grid-block.shrink.aha-meter.js-animate( class = "aha-meter-100" - ng-class = "{'aha-error': AGC.showError}" + ng-class = "{'aha-error': AGC.showError || AGC.errorState}" ng-if = "!state.showVerification && AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" ) svg.iconnables( @@ -44,48 +44,48 @@ ) .grid-block.vertical.aha-text( - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.ahaGuide.isAddingFirstRepo()" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.ahaGuide.isAddingFirstRepo()" ) p.p.small.text-gray-light {{ AGC.title }} p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'addRepository'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'addRepository'" ) Add your repository by clicking ‘Create Template’. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'containerSelection'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'containerSelection'" ) Select a repository to configure. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" ) How would you like to configure your repo? p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'nameContainer'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" ) Give your configuration a name. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'repository'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'repository'" ) What does your repository run? p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'commands'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'commands'" ) Choose commands and packages. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" ) If your app needs additional configuration… p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'filesMirror'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" ) We’ve imported your dockerfile, click ‘Save & Build’ to build it! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'logs'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" ) We‘re building! Build time varies depending on your template. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'exitedEarly'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'exitedEarly'" ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, a.link( ng-click = "askEngineers()" @@ -93,22 +93,22 @@ | ! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'success'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. p.p( - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'complete'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. p.p( - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'hasContainer'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'hasContainer'" ) Choose a template to configure. .grid-block.vertical.aha-text( - ng-if = "$root.featureFlags.aha && AGC.showError && AGC.subStepIndex > 6" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 6" ) p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-if = "$root.featureFlags.aha && !AGC.showError" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" ) {{ AGC.caption }} //- If template repo is deleted: @@ -118,12 +118,12 @@ .grid-block.vertical.aha-text( class = "{{ AGC.className }}" - ng-if = "$root.featureFlags.aha && !AGC.showError && !AGC.ahaGuide.isAddingFirstRepo()" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && !AGC.ahaGuide.isAddingFirstRepo()" ) p.p.small.text-gray-light {{ AGC.title }} p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && !AGC.showError && AGC.subStep === 'hasContainer'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'hasContainer'" ) Choose a template to configure. //- Step 9: diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 49e5004e4..a56e16294 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -22,7 +22,8 @@ function EnvironmentController( fetchUser, keypather, ModalService, - + // used to reset aha guide + patchOrgMetadata, pageName, instancesByPod ) { @@ -36,6 +37,13 @@ function EnvironmentController( EC.toggleSidebar = function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; + // reset aha guide!!! + patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasAha: true, + hasConfirmedSetup: false + } + }) }; $scope.$on('show-aha-sidebar', EC.toggleSidebar); @@ -107,10 +115,10 @@ function EnvironmentController( EC.showSidebar = true; } - var isAddFirstRepo = ahaGuide.isAddingFirstRepo(); + var isAddingFirstRepo = ahaGuide.isAddingFirstRepo; // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { - if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { + if (instance.attrs.build.successful && instance.getRepoName() && isAddingFirstRepo()) { $rootScope.$broadcast('launchAhaNavPopover'); } if (instance.hasDockerfileMirroring()) { diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 976c45f7a..9d1192e74 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,7 +42,7 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': EC.isAddingFirstRepo() && data.instances.models.length === 0}" + ng-class = "{'empty': EC.isInGuide() && EC.isAddingFirstRepo() && data.instances.models.length === 0}" ) header.grid-block.align-center.environment-header( ng-include = "'viewEnvironmentHeader'" @@ -69,7 +69,7 @@ ng-class = "{'align-center justify-center': EC.showCreateTemplate && !data.instances.models.length}" ) .modal-dialog.modal-sm( - ng-if = "EC.isAddingFirstRepo() && EC.showCreateTemplate && !data.instances.models.length" + ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.isAddingFirstRepo() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide @@ -99,5 +99,5 @@ aha-sidebar toggle-sidebar = "EC.toggleSidebar" show-overview = "!EC.showCreateTemplate" - ng-if = "$root.featureFlags.aha && EC.showSidebar" + ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.showSidebar" ) diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index 99eea7668..baba428d2 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -32,7 +32,7 @@ a.a.disabled( | Containers a.a( - ng-if = "(!$root.featureFlags.aha && (dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length)) || ($root.featureFlags.containersViewTemplateControls || ($root.featureFlags.aha && CA.instancesByPod.models.length && CA.ahaGuide.getCurrentStep() > CA.ahaGuide.steps.ADD_FIRST_REPO))" + ng-if = "(!$root.featureFlags.aha && (dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length)) || ($root.featureFlags.containersViewTemplateControls || ($root.featureFlags.aha && CA.ahaGuide.isInGuide() && CA.instancesByPod.models.length && CA.ahaGuide.getCurrentStep() > CA.ahaGuide.steps.ADD_FIRST_REPO))" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) @@ -43,7 +43,7 @@ a.a( | Containers a.a( - ng-if = "$root.featureFlags.aha && CA.instancesByPod.models.length && !CA.currentOrg.poppa.hasConfirmedSetup" + ng-if = "$root.featureFlags.aha && CA.ahaGuide.isAddingFirstRepo() && CA.instancesByPod.models.length && !CA.ahaGuide.hasConfirmedSetup()" ng-click = "CA.showAhaConfirmation()" ) svg.iconnables.icons-server-dark diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 68bbec816..06edb2313 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -193,9 +193,9 @@ function ahaGuide( if (!cachedStep) { if ($rootScope.featureFlags.aha && !keypather.get(currentOrg, 'poppa.id')) { cachedStep = STEPS.CHOOSE_ORGANIZATION; - } else if (!$rootScope.featureFlags.aha || !currentOrg.poppa.hasAha) { + } else if (!$rootScope.featureFlags.aha || !isInGuide()) { cachedStep = STEPS.COMPLETED; - } else if (!currentOrg.poppa.hasConfirmedSetup) { + } else if (!hasConfirmedSetup()) { cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched @@ -212,15 +212,20 @@ function ahaGuide( return cachedStep; } - function isInGuide() { - return $rootScope.featureFlags.aha && currentOrg.poppa.hasAha && getCurrentStep() !== STEPS.COMPLETED; - } + function isInGuide () { + return keypather.get(currentOrg, 'poppa.attrs.metadata.hasAha'); + }; + + function hasConfirmedSetup () { + return keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); + }; return { stepList: stepList, getCurrentStep: getCurrentStep, steps: STEPS, isInGuide: isInGuide, + hasConfirmedSetup: hasConfirmedSetup, isChoosingOrg: function() { return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; }, @@ -232,6 +237,6 @@ function ahaGuide( }, isSettingUpRunnabot: function() { return getCurrentStep() === STEPS.SETUP_RUNNABOT; - } + }, }; } diff --git a/client/services/patchOrgMetadata.js b/client/services/patchOrgMetadata.js index cba464fed..9a2a18f23 100644 --- a/client/services/patchOrgMetadata.js +++ b/client/services/patchOrgMetadata.js @@ -14,9 +14,6 @@ function patchOrgMetadata( url: configAPIHost + '/auth/whitelist/' + orgId, data: params }) - .then(function (data) { - return data; - }) .catch(function (err) { errs.handler(err); }); diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 3aa86ef32..d458ce0b8 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -86,7 +86,7 @@ p.p.text-center.text-gray-light.padding-sm( xlink:href = "#icons-arrow-down" ) .stepOneUncloseablePopover( - ng-if = "$root.featureFlags.aha && $index === 0 && CIS.shouldShowParent(masterInstance) && (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)" + ng-if = "$root.featureFlags.aha && CIS.isInGuide() && $index === 0 && CIS.shouldShowParent(masterInstance) && (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)" pop-over pop-over-active = "CIS.isPopoverOpen" pop-over-controller = "CIS" From 4b5c1accaeb86f585bc4f51ef95b7f6eb7c2bec2 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 14 Sep 2016 12:10:13 -0700 Subject: [PATCH 340/577] Changes, fixes, removing remnants of hardcoded hasaha hasconfirmedsetup --- client/config/routes.js | 4 --- client/controllers/controllerApp.js | 28 +++++++++++-------- client/controllers/controllerInstance.js | 2 -- .../toolbar/webViewToolbarView.jade | 7 ++--- .../components/ahaGuide/AhaGuideController.js | 19 +++++++++++-- .../components/ahaGuide/ahaGuideView.jade | 2 +- .../components/createSandboxGuideView.jade | 2 +- .../components/setUpRunnabotGuideView.jade | 11 +------- .../setUpRepositoryGuideView.jade | 8 +++--- .../environment/environmentController.js | 4 +-- .../environment/environmentView.jade | 2 +- .../branchMenuPopover/introAddBranch.jade | 2 +- client/services/ahaGuideService.js | 8 +++--- client/services/patchOrgMetadata.js | 9 ++++-- 14 files changed, 55 insertions(+), 53 deletions(-) diff --git a/client/config/routes.js b/client/config/routes.js index dd1720d38..a390ec389 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -188,10 +188,6 @@ module.exports = [ activeAccount, currentOrg ) { - // TODO: AHA - Remove this temporary change ot turn aha on - activeOrg.hasAha = true; - activeOrg.hasConfirmedSetup = false; - currentOrg.poppa = activeOrg; currentOrg.github = activeAccount; } diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 57bdb79ee..1998abcb4 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -117,6 +117,7 @@ function ControllerApp( }); CA.showAhaConfirmation = function() { + CA.showAhaNavPopover = false; ModalService.showModal({ controller: 'ConfirmationModalController', controllerAs: 'CMC', @@ -126,18 +127,21 @@ function ControllerApp( return modal.close; }) .then(function(confirmed) { - patchOrgMetadata(currentOrg.poppa.id(), { - metadata: { - hasConfirmedSetup: true - } - }) - .then(function() { - $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); - }) - .catch(function(err) { - // errs.handler(errs); - $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); - }); + if (confirmed) { + patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasConfirmedSetup: true + } + }) + .then(function(updatedOrg) { + currentOrg.poppa.attrs.metadata = keypather.get(updatedOrg, 'metadata'); + $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); + }); + } + }) + .catch(function(err) { + errs.handler(err); + // $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); }); }; diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index 8661f399b..9f808fd2f 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -29,8 +29,6 @@ function ControllerInstance( pageName, setLastInstance ) { - // TODO: Aha - Remove this hardcoding - currentOrg.poppa.hasConfirmedSetup = true; var CIS = this; CIS.showSidebar = false; diff --git a/client/directives/activePanel/toolbar/webViewToolbarView.jade b/client/directives/activePanel/toolbar/webViewToolbarView.jade index f98f2b9df..e5bead9b7 100644 --- a/client/directives/activePanel/toolbar/webViewToolbarView.jade +++ b/client/directives/activePanel/toolbar/webViewToolbarView.jade @@ -7,15 +7,12 @@ a.p.monospace.text-overflow( use( xlink:href = "#icons-link-external" ) -.grid-block.shrink.align-center.btn.btn-xs.btn-web-state( - ng-click = "state.error = !state.error" -) +.grid-block.shrink.align-center.btn.btn-xs.btn-web-state svg.iconnables.icons-alert use( xlink:href = "#icons-alert-alt" ) - | {{state.error ? 'No exposed ports.' : ''}} - | {{!state.error ? 'Bind to all interfaces.' : ''}} + | {{!SMC.state.ports.length && SMC.state.advanced !== 'isMirroringDockerfile' ? 'No exposed ports.' : 'Bind to all interfaces.'}} //- |   //- a.link( //- href = "#" diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 5b347ea40..6f2d30963 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -9,6 +9,7 @@ function AhaGuideController( $rootScope, ahaGuide, currentOrg, + errs, fetchInstancesByPod, patchOrgMetadata ) { @@ -19,6 +20,16 @@ function AhaGuideController( fetchInstancesByPod() .then(function (instances) { AGC.instances = instances; + if (!instances.models.length) { + patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasConfirmedSetup: false + } + }) + .catch(function(err) { + errs.handler(err); + }); + } updateCaption(AGC.subStep); }); @@ -31,7 +42,9 @@ function AhaGuideController( }); var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { - handleBuildUpdate(buildStatus); + if (ahaGuide.isAddingFirstRepo()) { + handleBuildUpdate(buildStatus); + } }); $scope.$on('exitedEarly', function(event, didExitEarly) { @@ -95,8 +108,8 @@ function AhaGuideController( if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('exitedEarly', true); } - if (AGC.ahaGuide.isSettingUpRunnabot()) { - + if (AGC.subStepIndex < 7) { + $rootScope.$broadcast('changed-animated-panel', 'addRepository'); } }); diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index fbef3e1e0..fecff80b6 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -20,7 +20,7 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!AGC.ahaGuide.isChoosingOrg()" + ng-if = "!AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpRunnabot()" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index 988ef50dd..b19235d96 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -16,7 +16,7 @@ p.p.small.text-gray-light {{ AGC.title }} p.p( ng-if = "AGC.subStep === 'orgSelection'" - ) Choose an organization to create your sandbox for. + ) Choose an organization to create your environment for. p.p( ng-if = "AGC.subStep === 'dockLoading'" ) Hang tight! diff --git a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade index 0d16a2094..bc352c4a5 100644 --- a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade +++ b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade @@ -1,11 +1,2 @@ -.grid-block.shrink.aha-meter.aha-meter-50 - svg.iconnables - use( - xlink:href = "#icons-runnabot" - ) - //- if complete - //- use( - //- xlink:href = "#icons-check" - //- ) -.grid-block.vertical.aha-text +.grid-block.vertical.runnabot-text p.p Get the most out of Runnabot by adding branches automatically. diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 4b39fa940..60ec3b5e9 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -110,11 +110,11 @@ p.p( ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" ) {{ AGC.caption }} + p.p( + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError" + ) Uh oh, there was a build error! Inspect your logs for debug info. + //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. - //- If template repo is deleted: - //- p.p( - //- ng-class = "{'p-slide js-animate': AGC.showSubStep}" - //- ) You‘ve deleted your repository template. Create another one to continue. .grid-block.vertical.aha-text( class = "{{ AGC.className }}" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index a56e16294..17f9be365 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -37,13 +37,13 @@ function EnvironmentController( EC.toggleSidebar = function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; - // reset aha guide!!! + // reset aha guide!!! will be removed!!! patchOrgMetadata(currentOrg.poppa.id(), { metadata: { hasAha: true, hasConfirmedSetup: false } - }) + }); }; $scope.$on('show-aha-sidebar', EC.toggleSidebar); diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 9d1192e74..2f2db42d4 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -59,7 +59,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && !EC.isAddingFirstRepo() && !data.instances.models.length" + ng-if = "$root.featureFlags.aha && EC.isInGuide() && !EC.isAddingFirstRepo() && !data.instances.models.length" aha-guide error-state = "true" sub-step = "deletedTemplate" diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade index f7992df60..631c6c487 100644 --- a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -9,7 +9,7 @@ sub-step = "addBranch" ) - .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + .grid-block.shrink.align-center.justify-center.padding-sm( ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isSettingUpRunnabot()" aha-guide step-index = 3 diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 06edb2313..39b2f6e62 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -28,7 +28,7 @@ function ahaGuide( var stepList = {}; stepList[STEPS.CHOOSE_ORGANIZATION] = { - title: 'Create your Sandbox', + title: 'Create your Environment', subSteps: { orgSelection: { caption: 'Choose an organization to create your sandbox for.', @@ -53,7 +53,7 @@ function ahaGuide( title: 'Add your First Repository', subSteps: { addRepository: { - caption: 'Add a repository by clicking ‘Add Template’.', + caption: 'Add a repository by clicking ‘Create Template’.', className: 'aha-meter-10', step: 0 }, @@ -214,11 +214,11 @@ function ahaGuide( function isInGuide () { return keypather.get(currentOrg, 'poppa.attrs.metadata.hasAha'); - }; + } function hasConfirmedSetup () { return keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); - }; + } return { stepList: stepList, diff --git a/client/services/patchOrgMetadata.js b/client/services/patchOrgMetadata.js index 9a2a18f23..254437a4e 100644 --- a/client/services/patchOrgMetadata.js +++ b/client/services/patchOrgMetadata.js @@ -14,8 +14,11 @@ function patchOrgMetadata( url: configAPIHost + '/auth/whitelist/' + orgId, data: params }) - .catch(function (err) { - errs.handler(err); - }); + .then(function(response) { + return response.data; + }) + .catch(function (err) { + errs.handler(err); + }); }; } \ No newline at end of file From bdb614556b4aabc7d804692ea49f043928e5e980 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 14 Sep 2016 12:59:59 -0700 Subject: [PATCH 341/577] PR comments --- client/directives/components/ahaGuide/AhaGuideController.js | 3 +-- .../instances/instance/branchMenuPopover/introAddBranch.jade | 2 +- client/directives/popovers/popOverController.js | 3 --- client/templates/viewOrgSelect.jade | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 6f2d30963..7934f3663 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -120,8 +120,7 @@ function AhaGuideController( AGC.popoverActions = { endGuide: function () { $rootScope.$broadcast('close-popovers'); - // TODO: AHA - Make this save - patchOrgMetadata(currentOrg.poppa.id(), { + return patchOrgMetadata(currentOrg.poppa.id(), { metadata: { hasAha: false } diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade index 631c6c487..eb4dcd9b8 100644 --- a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -33,4 +33,4 @@ .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( ng-if = "$root.isLoading.fetchingBranches" ng-include = "'spinner'" - ) \ No newline at end of file + ) diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index 76a79c338..0012ba7e4 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -65,14 +65,11 @@ function PopOverController( // If the click has a target and that target is on the page but not on our popover we should close the popover. // Otherwise we should keep the popover alive. POC.unbindDocumentClick = $scope.$on('app-document-click', function (event, target) { - // if (!$scope.uncloseable && (!target || (target && $document[0].contains(target) && !POC.popoverElement[0].contains(target)))) { if (!$scope.userCannotClose && (!target || (target && $document[0].contains(target) && !POC.popoverElement[0].contains(target)))) { POC.closePopover(); } }); }, 0); - // POC.unbindPopoverOpened = $scope.$on('close-popovers', function () { - // if (!$scope.uncloseable) { POC.unbindPopoverOpened = $scope.$on('close-popovers', function (event, closeAllPopoversOverride) { if (!$scope.userCannotClose || closeAllPopoversOverride) { POC.closePopover(); diff --git a/client/templates/viewOrgSelect.jade b/client/templates/viewOrgSelect.jade index 39bf76768..75282a982 100644 --- a/client/templates/viewOrgSelect.jade +++ b/client/templates/viewOrgSelect.jade @@ -5,4 +5,4 @@ div( modal-controller-as = "COS" modal-open-flag = "true" modal-template = "chooseOrganizationModalView" -) \ No newline at end of file +) From b5f2ec4d103c8808a436492cf203d78d05a139b5 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 14 Sep 2016 13:20:44 -0700 Subject: [PATCH 342/577] Addressed more PR comments that were missed --- client/controllers/controllerApp.js | 10 ++++++---- client/controllers/controllerInstances.js | 4 +--- .../components/ahaGuide/AhaGuideController.js | 8 +++----- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 1998abcb4..1c849d20d 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -123,25 +123,27 @@ function ControllerApp( controllerAs: 'CMC', templateUrl: 'confirmSetupView' }) - .then(function (modal) { + .then(function(modal) { return modal.close; }) .then(function(confirmed) { if (confirmed) { - patchOrgMetadata(currentOrg.poppa.id(), { + return patchOrgMetadata(currentOrg.poppa.id(), { metadata: { hasConfirmedSetup: true } }) .then(function(updatedOrg) { - currentOrg.poppa.attrs.metadata = keypather.get(updatedOrg, 'metadata'); + var updatedOrgMetadata = keypather.get(updatedOrg, 'metadata'); + if (updatedOrgMetadata.hasAha !== undefined && updatedOrgMetadata.hasConfirmedSetup !== undefined) { + currentOrg.poppa.attrs.metadata = updatedOrgMetadata; + } $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); }); } }) .catch(function(err) { errs.handler(err); - // $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); }); }; diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 3ecc4c571..3a7353b64 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -235,9 +235,7 @@ function ControllerInstances( }); } }) - .catch(function(err) { - errs.handler(err); - }); + .catch(errs.handler); }; this.editInstance = function (instance) { diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 7934f3663..118101f1f 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -25,13 +25,11 @@ function AhaGuideController( metadata: { hasConfirmedSetup: false } - }) - .catch(function(err) { - errs.handler(err); }); } updateCaption(AGC.subStep); - }); + }) + .catch(errs.handler); var alertListener = $scope.$on('alert', function (event, alert) { // alerts on container creation success @@ -41,7 +39,7 @@ function AhaGuideController( } }); - var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { + $scope.$on('buildStatusUpdated', function(event, buildStatus) { if (ahaGuide.isAddingFirstRepo()) { handleBuildUpdate(buildStatus); } From 8830c6c527bdf9d90179c08a2fe01c66c69b1a66 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 14 Sep 2016 13:23:12 -0700 Subject: [PATCH 343/577] Missed one change --- client/controllers/controllerApp.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 1c849d20d..551caf360 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -142,9 +142,7 @@ function ControllerApp( }); } }) - .catch(function(err) { - errs.handler(err); - }); + .catch(errs.handler); }; /** From 4f5bd111a82ffdc9dc1ddd3b634aafc158d5688e Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 14 Sep 2016 13:31:33 -0700 Subject: [PATCH 344/577] used keypather properly --- client/controllers/controllerApp.js | 5 ++--- client/directives/components/ahaGuide/AhaGuideController.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 551caf360..e39600720 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -134,9 +134,8 @@ function ControllerApp( } }) .then(function(updatedOrg) { - var updatedOrgMetadata = keypather.get(updatedOrg, 'metadata'); - if (updatedOrgMetadata.hasAha !== undefined && updatedOrgMetadata.hasConfirmedSetup !== undefined) { - currentOrg.poppa.attrs.metadata = updatedOrgMetadata; + if (keypather.has(updatedOrg, 'metadata.hasAha') && keypather.has(updatedOrg, 'metadata.hasConfirmedSetup')) { + currentOrg.poppa.attrs.metadata = updatedOrg.metadata; } $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); }); diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 118101f1f..ead61481b 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -106,7 +106,7 @@ function AhaGuideController( if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('exitedEarly', true); } - if (AGC.subStepIndex < 7) { + if (AGC.subStepIndex < 6) { $rootScope.$broadcast('changed-animated-panel', 'addRepository'); } }); From 659d69e433d35e9b01b95607048428297355767a Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 14 Sep 2016 18:01:05 -0700 Subject: [PATCH 345/577] Fixed bug where slack integration was not showing up. --- client/directives/modals/settingsModal/settingsModalView.jade | 1 - 1 file changed, 1 deletion(-) diff --git a/client/directives/modals/settingsModal/settingsModalView.jade b/client/directives/modals/settingsModal/settingsModalView.jade index 4c5af7424..85b414f77 100644 --- a/client/directives/modals/settingsModal/settingsModalView.jade +++ b/client/directives/modals/settingsModal/settingsModalView.jade @@ -49,7 +49,6 @@ button.btn.btn-radio.grid-block.vertical( ng-class = "{'active': SEMC.currentTab === 'slackIntegration'}" ng-click = "SEMC.currentTab = 'slackIntegration'" - ng-if = "$root.featureFlags.gitHubIntegration" ) img.img.iconnables.grid-content( height = "24" From 2f4a8db598aceb7264781d613e63834b422d08fc Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 14 Sep 2016 18:10:14 -0700 Subject: [PATCH 346/577] Remove filter if there aren't any branches left to add. --- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 6897707a9..87baa0091 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -110,6 +110,7 @@ placeholder = "Filter by name" required type = "search" + ng-if = "CIS.instanceBranches.length" ) ul.list.popover-list( ng-if = "CIS.instanceBranches.length" From 1a222da70543cf8a6b9168662610093fb1850994 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 14 Sep 2016 18:50:03 -0700 Subject: [PATCH 347/577] Updated filtering logic so the instances list now filters as expected. --- client/controllers/controllerInstances.js | 48 ++++++++----------- .../instances/viewInstancesList.jade | 4 +- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 99613e7d4..eb5735f6d 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -92,6 +92,19 @@ function ControllerInstances( }) .catch(errs.handler); + this.filterMatchedAnything = function () { + if (!CIS.searchBranches) { + return true; + } + if (!CIS.instancesByPod) { + return true; + } + + return CIS.instancesByPod.models.some(function (masterPod) { + return CIS.filterMasterInstance(masterPod) || CIS.shouldShowParent(masterPod); + }); + }; + this.filterMasterInstance = function (masterPod) { if (!CIS.searchBranches) { return true; @@ -106,25 +119,10 @@ function ControllerInstances( return null; } if (!CIS.searchBranches) { - return CIS.instancesByPod; - } - var searchQuery = CIS.searchBranches.toLowerCase(); - return CIS.instancesByPod - .filter(function (masterPod) { - var instanceName = masterPod.getRepoAndBranchName() + masterPod.attrs.lowerName; - return instanceName.toLowerCase().indexOf(searchQuery) !== -1 || - CIS.getFilteredChildren(masterPod).length > 0; - }); - }; - - this.getFilteredChildren = function (masterPod) { - if (!CIS.searchBranches) { - return masterPod.children.models; + return CIS.instancesByPod.models; } - var searchQuery = CIS.searchBranches.toLowerCase(); - return masterPod.children.models.filter(function (child) { - return child.attrs.lowerName.indexOf(searchQuery) !== -1; - }); + return CIS.instancesByPod.models + .filter(CIS.filterMasterInstance); }; this.getFilteredBranches = function () { @@ -144,23 +142,17 @@ function ControllerInstances( return true; } var searchQuery = CIS.searchBranches.toLowerCase(); - return childInstance.attrs.lowerName.indexOf(searchQuery) !== -1; + return childInstance.getBranchName().toLowerCase().indexOf(searchQuery) !== -1; }; this.shouldShowParent = function (masterPod) { if (!CIS.searchBranches) { return true; } - var searchQuery = CIS.searchBranches.toLowerCase(); - - var instanceName = masterPod.getRepoAndBranchName() + masterPod.attrs.lowerName; - if (instanceName.indexOf(searchQuery) !== -1) { - return true; + if (!masterPod.children) { + return false; } - - return !!masterPod.children.models.find(function (child) { - return child.attrs.lowerName.indexOf(searchQuery) !== -1; - }); + return masterPod.children.models.some(CIS.shouldShowChild); }; this.getUnbuiltBranches = function (instance, branches) { diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index ddc1d82a4..d1e745655 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -8,12 +8,12 @@ label.grid-block.vertical.label-search ) p.p.text-center.text-gray-light.padding-sm( - ng-if = "CIS.getFilteredInstanceList().length < 1" + ng-if = "!CIS.filterMatchedAnything()" ) No containers match this filter. //- master cluster .list-clusters.master-cluster( - ng-if = "$root.featureFlags.addBranches" + ng-if = "$root.featureFlags.addBranches && CIS.getFilteredInstanceList().length" ) .grid-block.align-center.list-item-cluster.list-clusters-heading From 38ab8db9d2b68531679704812d395f0c6e73ea76 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 14 Sep 2016 22:07:52 -0700 Subject: [PATCH 348/577] Addressed PR comments --- client/controllers/controllerApp.js | 4 +--- .../components/ahaGuide/AhaGuideController.js | 10 ++++++++-- .../ahaGuide/addBranchGuide/addBranchGuideView.jade | 2 +- client/directives/environment/environmentController.js | 9 --------- client/services/ahaGuideService.js | 7 +++++++ 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index e39600720..8c1abad14 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -134,9 +134,7 @@ function ControllerApp( } }) .then(function(updatedOrg) { - if (keypather.has(updatedOrg, 'metadata.hasAha') && keypather.has(updatedOrg, 'metadata.hasConfirmedSetup')) { - currentOrg.poppa.attrs.metadata = updatedOrg.metadata; - } + ahaGuide.updateCurrentOrg(updatedOrg); $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); }); } diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index ead61481b..2bb71b1fb 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -21,10 +21,13 @@ function AhaGuideController( .then(function (instances) { AGC.instances = instances; if (!instances.models.length) { - patchOrgMetadata(currentOrg.poppa.id(), { + return patchOrgMetadata(currentOrg.poppa.id(), { metadata: { hasConfirmedSetup: false } + }) + .then(function(updatedOrg) { + ahaGuide.updateCurrentOrg(updatedOrg); }); } updateCaption(AGC.subStep); @@ -122,7 +125,10 @@ function AhaGuideController( metadata: { hasAha: false } - }); + }) + .then(function(updatedOrg) { + ahaGuide.updateCurrentOrg(updatedOrg); + }) }, showSidebar: function () { $rootScope.$broadcast('close-popovers'); diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index ae9659888..35a7f955f 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -12,7 +12,7 @@ xlink:href = "#icons-octicons-branch" ) use( - ng-if = "!AGC.showError && ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "!AGC.showError && AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 17f9be365..f69500e66 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -22,8 +22,6 @@ function EnvironmentController( fetchUser, keypather, ModalService, - // used to reset aha guide - patchOrgMetadata, pageName, instancesByPod ) { @@ -37,13 +35,6 @@ function EnvironmentController( EC.toggleSidebar = function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; - // reset aha guide!!! will be removed!!! - patchOrgMetadata(currentOrg.poppa.id(), { - metadata: { - hasAha: true, - hasConfirmedSetup: false - } - }); }; $scope.$on('show-aha-sidebar', EC.toggleSidebar); diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 39b2f6e62..6564b5a9a 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -220,12 +220,19 @@ function ahaGuide( return keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); } + function updateCurrentOrg(updatedOrg) { + if (keypather.has(updatedOrg, 'metadata.hasAha') && keypather.has(updatedOrg, 'metadata.hasConfirmedSetup')) { + currentOrg.poppa.attrs.metadata = updatedOrg.metadata; + } + } + return { stepList: stepList, getCurrentStep: getCurrentStep, steps: STEPS, isInGuide: isInGuide, hasConfirmedSetup: hasConfirmedSetup, + updateCurrentOrg: updateCurrentOrg, isChoosingOrg: function() { return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; }, From 2cefca6d91cc4f1110e8a4282ed221c1a1600da5 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 10:19:42 -0700 Subject: [PATCH 349/577] Created overlay div rather than two container icons that prevents event from bubbling to containing div and changing state. Much cleaner --- .../styles/scss/components/aha-guide.scss | 6 ++++++ client/controllers/controllerApp.js | 4 +++- .../components/ahaGuide/AhaGuideController.js | 2 +- .../setUpRepositoryGuideView.jade | 9 +-------- client/directives/navBar/viewNav.jade | 17 +++++------------ 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/client/assets/styles/scss/components/aha-guide.scss b/client/assets/styles/scss/components/aha-guide.scss index 397386374..a8bf7f321 100644 --- a/client/assets/styles/scss/components/aha-guide.scss +++ b/client/assets/styles/scss/components/aha-guide.scss @@ -177,3 +177,9 @@ .aha-tips > .iconnables { margin-left: 6px; } + +.aha-overlay-div { + position: absolute; + height: 100%; + width: 100%; +} \ No newline at end of file diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 8c1abad14..5307da0d4 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -116,7 +116,9 @@ function ControllerApp( CA.showAhaNavPopover = !keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); }); - CA.showAhaConfirmation = function() { + CA.showAhaConfirmation = function(event) { + event.stopPropagation(); + event.preventDefault(); CA.showAhaNavPopover = false; ModalService.showModal({ controller: 'ConfirmationModalController', diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 2bb71b1fb..44b57633c 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -128,7 +128,7 @@ function AhaGuideController( }) .then(function(updatedOrg) { ahaGuide.updateCurrentOrg(updatedOrg); - }) + }); }, showSidebar: function () { $rootScope.$broadcast('close-popovers'); diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 60ec3b5e9..b2a50f528 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -98,9 +98,6 @@ p.p( ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. - p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'hasContainer'" - ) Choose a template to configure. .grid-block.vertical.aha-text( @@ -113,7 +110,6 @@ p.p( ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError" ) Uh oh, there was a build error! Inspect your logs for debug info. - //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. .grid-block.vertical.aha-text( @@ -123,13 +119,10 @@ p.p.small.text-gray-light {{ AGC.title }} p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'hasContainer'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" ) Choose a template to configure. //- Step 9: p.p( ng-if = "AGC.subStep === 8 && !AGC.showError" ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. - - //- Step 10 (in the nav popover): - //- p.p Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index baba428d2..fb52867a3 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -32,27 +32,20 @@ a.a.disabled( | Containers a.a( - ng-if = "(!$root.featureFlags.aha && (dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length)) || ($root.featureFlags.containersViewTemplateControls || ($root.featureFlags.aha && CA.ahaGuide.isInGuide() && CA.instancesByPod.models.length && CA.ahaGuide.getCurrentStep() > CA.ahaGuide.steps.ADD_FIRST_REPO))" + ng-if = "(dataApp.state.includes('base.instances') || !CA.instancesByPod || CA.instancesByPod.models.length) || $root.featureFlags.containersViewTemplateControls" ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) + .aha-overlay-div( + ng-if = "$root.featureFlags.aha && CA.ahaGuide.isAddingFirstRepo() && CA.instancesByPod.models.length && !CA.ahaGuide.hasConfirmedSetup()" + ng-click = "CA.showAhaConfirmation($event)" + ) svg.iconnables.icons-server-dark use( xlink:href = "#icons-server-dark" ) | Containers -a.a( - ng-if = "$root.featureFlags.aha && CA.ahaGuide.isAddingFirstRepo() && CA.instancesByPod.models.length && !CA.ahaGuide.hasConfirmedSetup()" - ng-click = "CA.showAhaConfirmation()" -) - svg.iconnables.icons-server-dark - use( - xlink:href = "#icons-server-dark" - ) - | Containers - - a.a.btn-docs( href = "https://support.runnable.com" target = "_blank" From 38438991198d529479a583aecfd90026910101d6 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 11:21:32 -0700 Subject: [PATCH 350/577] 4.20.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c0a8e54e6..4c9f5af98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.9", + "version": "4.20.10", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 05c8962ff89438a216e00601ec0b891a710f01dd Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 12:32:04 -0700 Subject: [PATCH 351/577] Fix edge case which caused unbind to be undefined. --- client/directives/popovers/popOverController.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index ee16eb41e..ea6b1a0c7 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -15,6 +15,7 @@ function PopOverController( var POC = this; POC.unbindDocumentClick = angular.noop; POC.unbindPopoverOpened = angular.noop; + POC.unbindSpecificPopoverOpened = angular.noop; POC.isPopoverActive = function () { return $scope.active; From 0d8ed156e1ebe9a9c9a02e4fa436bd09d0669edc Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 12:38:20 -0700 Subject: [PATCH 352/577] Updated grunt-jade hash --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c9f5af98..6046202d6 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "grunt-contrib-jade": "^0.15.0", "grunt-contrib-jshint": "0.11.2", "grunt-contrib-uglify": "^0.9.2", - "grunt-jade-plugin": "git://github.com/Runnable/grunt-jade-plugin.git#604fba490db0c8cf9ee4ce0c51ef91acf44ac573", + "grunt-jade-plugin": "git://github.com/Runnable/grunt-jade-plugin.git#612d948fec72ac31907cebe74031c8bfaee2c003", "grunt-newer": "^1.1.1", "grunt-sass": "1.1.0", "grunt-timer": "0.6.0", From 1c6404c43d4be7fd109cb503186b58224d67e1b9 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 12:38:26 -0700 Subject: [PATCH 353/577] 4.20.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6046202d6..39ec223f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.10", + "version": "4.20.11", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 074609a021ea0fc366e69a75fd9afcf2827b3d43 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 13:00:43 -0700 Subject: [PATCH 354/577] Added a function on serverModalController to check whether an instance's container has any open ports --- .../toolbar/webViewToolbarView.jade | 6 ++-- .../setupMirrorServerModalController.js | 1 + .../setupServerModalController.js | 1 + .../modals/serverModalController.js | 5 +++ .../controllers/serverModalController.unit.js | 31 ++++++++++++++++++- .../setupServerModalController.unit.js | 1 + 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/client/directives/activePanel/toolbar/webViewToolbarView.jade b/client/directives/activePanel/toolbar/webViewToolbarView.jade index e5bead9b7..12e31bff0 100644 --- a/client/directives/activePanel/toolbar/webViewToolbarView.jade +++ b/client/directives/activePanel/toolbar/webViewToolbarView.jade @@ -7,12 +7,14 @@ a.p.monospace.text-overflow( use( xlink:href = "#icons-link-external" ) -.grid-block.shrink.align-center.btn.btn-xs.btn-web-state +.grid-block.shrink.align-center.btn.btn-xs.btn-web-state( + ng-if = "!SMC.hasOpenPorts()" +) svg.iconnables.icons-alert use( xlink:href = "#icons-alert-alt" ) - | {{!SMC.state.ports.length && SMC.state.advanced !== 'isMirroringDockerfile' ? 'No exposed ports.' : 'Bind to all interfaces.'}} + | No exposed ports. //- |   //- a.link( //- href = "#" diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 406cac967..8f8f23196 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -42,6 +42,7 @@ function SetupMirrorServerModalController( 'getNumberOfOpenTabs': parentController.getNumberOfOpenTabs.bind(SMC), 'getUpdatePromise': parentController.getUpdatePromise.bind(SMC), 'handleInstanceUpdate': parentController.handleInstanceUpdate.bind(SMC), + 'hasOpenPorts': parentController.hasOpenPorts.bind(SMC), 'insertHostName': parentController.insertHostName.bind(SMC), 'isDirty': parentController.isDirty.bind(SMC), 'openDockerfile': parentController.openDockerfile.bind(SMC), diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index a1a62e6a2..67634a1a3 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -46,6 +46,7 @@ function SetupServerModalController( 'getNumberOfOpenTabs': parentController.getNumberOfOpenTabs.bind(SMC), 'getUpdatePromise': parentController.getUpdatePromise.bind(SMC), 'handleInstanceUpdate': parentController.handleInstanceUpdate.bind(SMC), + 'hasOpenPorts': parentController.hasOpenPorts.bind(SMC), 'insertHostName': parentController.insertHostName.bind(SMC), 'isDirty': parentController.isDirty.bind(SMC), 'openDockerfile': parentController.openDockerfile.bind(SMC), diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 03a91f25b..d55676af5 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -261,6 +261,11 @@ function ServerModalController( } }; + this.hasOpenPorts = function() { + var ports = keypather.get(this, 'instance.attrs.container.ports'); + return !!ports; + }; + this.onEnvChange = function (newEnvArray, oldEnvArray) { var SMC = this; if (!newEnvArray) { return; } diff --git a/test/unit/controllers/serverModalController.unit.js b/test/unit/controllers/serverModalController.unit.js index 4bafb5b16..edad160ce 100644 --- a/test/unit/controllers/serverModalController.unit.js +++ b/test/unit/controllers/serverModalController.unit.js @@ -1033,7 +1033,6 @@ describe('serverModalController'.bold.underline.blue, function () { }); }); - describe('Env change', function () { beforeEach(setup.bind(null, {})); @@ -1054,4 +1053,34 @@ describe('serverModalController'.bold.underline.blue, function () { ); }); }); + + describe('Checking ports', function() { + beforeEach(function() { + SMC.instance = ctx.instance; + }); + + it('should return true when there are ports on an instance', function() { + SMC.instance.attrs.container = { + ports: { + "3000/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "64607" + } + ], + "80/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "64608" + } + ] + } + } + expect(SMC.hasOpenPorts()).to.equal(true); + }); + + it('should return false when there are no ports on an instance', function() { + expect(SMC.hasOpenPorts()).to.equal(false); + }); + }) }); diff --git a/test/unit/controllers/setupServerModalController.unit.js b/test/unit/controllers/setupServerModalController.unit.js index 1db5f5eb4..1ab876d3b 100644 --- a/test/unit/controllers/setupServerModalController.unit.js +++ b/test/unit/controllers/setupServerModalController.unit.js @@ -78,6 +78,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { this.getNumberOfOpenTabs = sinon.spy(); this.getUpdatePromise = sinon.spy(); this.handleInstanceUpdate = sinon.spy(); + this.hasOpenPorts = sinon.spy(); this.insertHostName = sinon.spy(); this.isDirty = sinon.spy(); this.openDockerfile = sinon.spy(); From 6c4e7fc1e1de4d0d84e7a9ac463547383e753c2f Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 13:00:48 -0700 Subject: [PATCH 355/577] Fixing jade bugs and updating plugin hash --- client/directives/components/explorer/fileTreeDirItemView.jade | 2 +- .../environment/modals/forms/formLogs/viewFormLogs.jade | 1 - package.json | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/directives/components/explorer/fileTreeDirItemView.jade b/client/directives/components/explorer/fileTreeDirItemView.jade index fda349ca7..bc2e5ce92 100644 --- a/client/directives/components/explorer/fileTreeDirItemView.jade +++ b/client/directives/components/explorer/fileTreeDirItemView.jade @@ -84,7 +84,7 @@ li.file( ng-readonly = "!fs.state.renaming" select-on = "fs.state.renaming" value = "{{fs.attrs.name}}" - ) {{fs.attrs.name}} + ) span.item-name {{fs.attrs.name}} li.folder.in( diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 6c26b4184..538e26c47 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -53,7 +53,6 @@ pre.pre.log-wrapper( ng-if = "SMC.instance" ng-show = "SMC.page === 'build'" ng-style = "($root.featureFlags.themeToggle || $root.featureFlags.fullScreenToggle) && {'padding-right': '42px'}" - scroll-glue ) //- cmd logs page .term-js.term-log( diff --git a/package.json b/package.json index 39ec223f9..eb4d160ce 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "grunt-contrib-jade": "^0.15.0", "grunt-contrib-jshint": "0.11.2", "grunt-contrib-uglify": "^0.9.2", - "grunt-jade-plugin": "git://github.com/Runnable/grunt-jade-plugin.git#612d948fec72ac31907cebe74031c8bfaee2c003", + "grunt-jade-plugin": "git://github.com/Runnable/grunt-jade-plugin.git#6de63c1bcd841e5f03828558afe7c982a839c1d1", "grunt-newer": "^1.1.1", "grunt-sass": "1.1.0", "grunt-timer": "0.6.0", From bf94a68c7fbcd150443007378283f06660c09bd6 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 13:01:03 -0700 Subject: [PATCH 356/577] 4.20.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eb4d160ce..0e7ac5ac9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.11", + "version": "4.20.12", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 5cd7b26fae643644e55579561696ea33cf0d7c80 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 13:11:28 -0700 Subject: [PATCH 357/577] 4.20.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e7ac5ac9..88e63491a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.12", + "version": "4.20.13", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 450043e1a7469627d21ed895a43a2b38369c9b62 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 13:22:47 -0700 Subject: [PATCH 358/577] Fixed to re-introduce the cached addfirstrepo value --- client/directives/environment/environmentController.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index f69500e66..e50941e6a 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -101,15 +101,16 @@ function EnvironmentController( $scope.data = { }; $scope.data.instances = instancesByPod; - if (ahaGuide.isAddingFirstRepo() && instancesByPod.models.length === 0) { + var isAddFirstRepo = ahaGuide.isAddingFirstRepo(); + + if (isAddFirstRepo && instancesByPod.models.length === 0) { EC.showCreateTemplate = false; EC.showSidebar = true; } - var isAddingFirstRepo = ahaGuide.isAddingFirstRepo; // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { - if (instance.attrs.build.successful && instance.getRepoName() && isAddingFirstRepo()) { + if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { $rootScope.$broadcast('launchAhaNavPopover'); } if (instance.hasDockerfileMirroring()) { From 798a61ca85a5b9b3d89f50ad8a746bda0842bb9a Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 13:32:21 -0700 Subject: [PATCH 359/577] Fixing tests! --- .../controllers/controllerInstances.unit.js | 83 +++++++------------ 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/test/unit/controllers/controllerInstances.unit.js b/test/unit/controllers/controllerInstances.unit.js index 4ab2d82c0..2a0a3bb81 100644 --- a/test/unit/controllers/controllerInstances.unit.js +++ b/test/unit/controllers/controllerInstances.unit.js @@ -398,27 +398,22 @@ describe('ControllerInstances'.bold.underline.blue, function () { expect(CIS.poppedInstance.attrs.shouldNotAutofork).to.equal(true); sinon.assert.calledOnce(masterInstance2.update); sinon.assert.calledWithExactly(masterInstance2.update, {shouldNotAutofork: masterInstance2.attrs.shouldNotAutofork}); - }) + }); }); - - describe('using various searches in the search filter'.blue, function () { + + describe.only('using various searches in the search filter'.blue, function () { var childInstance; var childInstance2; var masterInstance; var masterInstance2; - beforeEach(function () { + beforeEach(function () { + setup('Myztiq'); childInstance = { - attrs: { - name: 'feature-AWESOME', - lowerName: 'feature-awesome' - } + getBranchName: sinon.stub().returns('awesome') }; childInstance2 = { - attrs: { - name: 'deezNutz', - lowerName: 'deeznutz' - } + getBranchName: sinon.stub().returns('deeznutz') }; masterInstance = { getRepoAndBranchName: sinon.stub().returns('master'), @@ -438,7 +433,7 @@ describe('ControllerInstances'.bold.underline.blue, function () { }, children: { models: [] - }, + } }; }); @@ -479,67 +474,51 @@ describe('ControllerInstances'.bold.underline.blue, function () { }); it('should return all masterInstances', function () { - CIS.instancesByPod = [ masterInstance, masterInstance2 ]; + CIS.instancesByPod = { + models: [ masterInstance, masterInstance2 ] + }; CIS.searchBranches = null; var results = CIS.getFilteredInstanceList(); expect(results.length).to.deep.equal(2); }); - it('should return only one masterInstance with a branch containing "feature"', function () { - CIS.instancesByPod = [ masterInstance, masterInstance2 ]; - CIS.searchBranches = 'FEAT'; + it('should return only one masterInstance with a branch containing "MyFirst"', function () { + CIS.instancesByPod = { models: [ masterInstance, masterInstance2 ] }; + CIS.searchBranches = 'MyFirst'; var results = CIS.getFilteredInstanceList(); expect(results.length).to.deep.equal(1); }); - it('should still return only one masterInstance with a branch containing "feature"', function () { - CIS.instancesByPod = [ masterInstance, masterInstance2 ]; - CIS.searchBranches = 'feature'; + it('should still return only one masterInstance with a branch containing "myfirst"', function () { + CIS.instancesByPod = { models: [ masterInstance, masterInstance2 ] }; + CIS.searchBranches = 'myfirst'; var results = CIS.getFilteredInstanceList(); expect(results.length).to.deep.equal(1); }); it('should only show parents matching the search query', function () { - var searchTerms = [ null, 'DEEZ', 'post', 'API']; - var results = searchTerms.map(function(search) { + var searchTerms = [ null, 'DEEZ', 'post', 'awes']; + var results = searchTerms.map(function (search) { CIS.searchBranches = search; return [ CIS.shouldShowParent(masterInstance), CIS.shouldShowParent(masterInstance2)]; }); - expect(masterInstance.getRepoAndBranchName.called).to.deep.equal(true); - expect(masterInstance2.getRepoAndBranchName.called).to.deep.equal(true); - expect(results).to.deep.equal([[true,true],[true,false],[false,true],[true,false]]); + expect(results[0]).to.deep.equal([true, true], 'null'); + expect(results[1]).to.deep.equal([true, false], 'DEEZ'); + expect(results[2]).to.deep.equal([false, false], 'post'); + expect(results[3]).to.deep.equal([true, false], 'awes'); }); it('should only show children matching the search query'.green, function () { - var searchTerms = [ null, 'DEEZ', 'post', 'FEATURE']; - var results = searchTerms.map(function(search) { + var searchTerms = [ null, 'DEEZ', 'post', 'FEATURE', 'awes']; + var results = searchTerms.map(function (search) { CIS.searchBranches = search; - return masterInstance.children.models.map(function(child) { - return CIS.shouldShowChild(child); - }); + return [CIS.shouldShowChild(childInstance), CIS.shouldShowChild(childInstance2)]; }); - expect(results).to.deep.equal([[true,true],[false,true],[false,false],[true,false]]); + expect(results[0]).to.deep.equal([true, true], 'null'); + expect(results[1]).to.deep.equal([false, true], 'DEEZ'); + expect(results[2]).to.deep.equal([false, false], 'post'); + expect(results[3]).to.deep.equal([false, false], 'FEATURE'); + expect(results[4]).to.deep.equal([true, false], 'aws'); }); - - it('should only show branches matching the search query', function() { - // polyfill - String.prototype.includes = function (search) { - return this.indexOf(search) !== -1; - } - CIS.instanceBranches = [ - {attrs: {name:'brian'}},{attrs:{name:'carl'}},{attrs:{name:'dennis'}} - ]; - var searchTerms = ['BRIAN', null, 'n', 'mike love', 'AlJaRdInE']; - - var results = searchTerms.map(function(query) { - CIS.branchQuery = query; - return CIS.getFilteredBranches(); - }); - expect(results).to.deep.equal([[{attrs: {name:'brian'}}], - CIS.instanceBranches, - [{attrs: {name:'brian'}},{attrs:{name:'dennis'}}], - [], - []]); - }) }); }); From 43ce7b6e1b9dd3e1d86ffbbcd14f320dcbf792c1 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 13:32:40 -0700 Subject: [PATCH 360/577] Cleanup and update from aha-guide-milestone-3 --- client/directives/environment/modals/serverModalController.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index d55676af5..8a4b49fc3 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -262,8 +262,7 @@ function ServerModalController( }; this.hasOpenPorts = function() { - var ports = keypather.get(this, 'instance.attrs.container.ports'); - return !!ports; + return !!keypather.get(this, 'instance.attrs.container.ports'); }; this.onEnvChange = function (newEnvArray, oldEnvArray) { From 297004003c7ccb45b19ab67b555affedaf348bf7 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 13:33:24 -0700 Subject: [PATCH 361/577] ONLY --- test/unit/controllers/controllerInstances.unit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/controllers/controllerInstances.unit.js b/test/unit/controllers/controllerInstances.unit.js index 2a0a3bb81..45a271c67 100644 --- a/test/unit/controllers/controllerInstances.unit.js +++ b/test/unit/controllers/controllerInstances.unit.js @@ -401,7 +401,7 @@ describe('ControllerInstances'.bold.underline.blue, function () { }); }); - describe.only('using various searches in the search filter'.blue, function () { + describe('using various searches in the search filter'.blue, function () { var childInstance; var childInstance2; var masterInstance; From 1f215063788202b9b4faa814ecb52a5817a853a9 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Thu, 15 Sep 2016 15:17:29 -0700 Subject: [PATCH 362/577] 4.20.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 88e63491a..0d207812c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.13", + "version": "4.20.14", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 6b6ab479335323557a2cc4e72886be782347547c Mon Sep 17 00:00:00 2001 From: henrymollman Date: Thu, 15 Sep 2016 15:52:58 -0700 Subject: [PATCH 363/577] Aha guide milestone 3 (#1728) * Added toggle for shouldNotAutofork property on instances, and updated property when toggled * Added more logic for current org and big poppa state * Updated aha-guide-milestone-3 with aha-guide-2 changes * Added popover open on page load * Fixed closing of popover after successful add * Added animations for paragraphs in aha guide * Fixed disabling branches and searching * Fixing opening popover on 'popover-closed' event * Fixed bad merge * Added runnabot functionality/checks in milestone 3 * Added caption for hasContainer status, added more logic for container view, removed logs and other bugs * Missed merge resolution * Removed traces of hascontainer * Added exited early and error indications to user, removed hasContainer property and created a better transition to setup runnabot and proper checking for choose organization aha checks * Tested intercom against exited early, added deleted container error state * Little cleanup * Fixed tests * Addressed PR comments * Implemented confirm setup and has aha false * Addressed PR comments * More cleanup and PR comment addressing * Changes, fixes, removing remnants of hardcoded hasaha hasconfirmedsetup * PR comments * Addressed more PR comments that were missed * Missed one change * used keypather properly * Addressed PR comments * Created overlay div rather than two container icons that prevents event from bubbling to containing div and changing state. Much cleaner * Fixed to re-introduce the cached addfirstrepo value * Nate's PR comments * use keypather on instances models * Don't do instance-based aha stuffed if the user isn't logged in as any org * fix spacing * Prevented message from being hidden when aha flag is disabled --- .../styles/scss/components/aha-guide.scss | 6 + .../scss/popover/popover-branch-menu.scss | 1 - client/config/routes.js | 4 - client/controllers/controllerApp.js | 48 ++++++-- client/controllers/controllerInstance.js | 7 -- client/controllers/controllerInstances.js | 38 ++++-- .../toolbar/webViewToolbarView.jade | 7 +- .../components/ahaGuide/AhaGuideController.js | 59 +++++++-- .../addBranchGuide/addBranchGuideDirective.js | 1 + .../addBranchGuide/addBranchGuideView.jade | 28 +++-- .../components/ahaGuide/ahaGuideView.jade | 8 +- .../ahaSidebar/ahaSidebarDirective.js | 1 + .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 21 ++-- .../components/createSandboxGuideView.jade | 10 +- .../components/setUpRunnabotGuideView.jade | 2 + .../setUpRepositoryGuideView.jade | 116 ++++++++++++++---- .../environmentBody/viewCardGrid.jade | 2 +- .../environment/environmentController.js | 7 +- .../environment/environmentView.jade | 17 ++- .../environment/modals/confirmSetupView.jade | 10 +- .../branchMenuPopoverView.jade | 16 ++- .../branchMenuPopover/introAddBranch.jade | 36 ++++++ client/directives/modals/directiveModal.js | 6 +- .../modals/directiveModalManager.js | 2 +- .../chooseOrganizationModalController.js | 2 + .../chooseOrganizationModalView.jade | 30 +++-- client/directives/navBar/viewNav.jade | 6 +- .../directives/popovers/popOverController.js | 8 ++ client/services/ahaGuideService.js | 55 +++++++-- .../createAndBuildNewContainerService.js | 5 +- client/services/patchOrgMetadata.js | 22 ++++ .../instances/viewInstancesList.jade | 16 ++- client/templates/viewOrgSelect.jade | 5 +- .../chooseOrganizationModalController.unit.js | 5 + .../directives/modals/directiveModal.unit.js | 6 +- 35 files changed, 460 insertions(+), 153 deletions(-) create mode 100644 client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade create mode 100644 client/directives/instances/instance/branchMenuPopover/introAddBranch.jade create mode 100644 client/services/patchOrgMetadata.js diff --git a/client/assets/styles/scss/components/aha-guide.scss b/client/assets/styles/scss/components/aha-guide.scss index 397386374..a8bf7f321 100644 --- a/client/assets/styles/scss/components/aha-guide.scss +++ b/client/assets/styles/scss/components/aha-guide.scss @@ -177,3 +177,9 @@ .aha-tips > .iconnables { margin-left: 6px; } + +.aha-overlay-div { + position: absolute; + height: 100%; + width: 100%; +} \ No newline at end of file diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 9871e8f2d..2a73b9a07 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -1,7 +1,6 @@ .popover-branch-menu, .popover-template-menu { max-width: 360px; - min-height: 105px; width: 100%; .popover-content.popover-content { diff --git a/client/config/routes.js b/client/config/routes.js index dd1720d38..a390ec389 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -188,10 +188,6 @@ module.exports = [ activeAccount, currentOrg ) { - // TODO: AHA - Remove this temporary change ot turn aha on - activeOrg.hasAha = true; - activeOrg.hasConfirmedSetup = false; - currentOrg.poppa = activeOrg; currentOrg.github = activeAccount; } diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 181070337..877edf948 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -11,6 +11,7 @@ function ControllerApp( $state, $timeout, $window, + ahaGuide, configAPIHost, configEnvironment, configLoginURL, @@ -21,19 +22,19 @@ function ControllerApp( keypather, ModalService, pageName, + patchOrgMetadata, + promisify, currentOrg, user, orgs, activeAccount ) { // Load ace after 10 seconds. Should improve user experience overall.. - $timeout(function () { - $ocLazyLoad.load('ui.ace'); - }, 10000); - this.activeAccount = activeAccount; this.user = user; var CA = this; + CA.ahaGuide = ahaGuide; + CA.currentOrg = currentOrg; fetchInstancesByPod() .then(function (instancesByPod) { @@ -88,14 +89,8 @@ function ControllerApp( $rootScope.resetFeatureFlags = featureFlags.reset; this.featureFlagsChanged = featureFlags.changed; $rootScope.ahaGuide = {}; - var completedMilestones = keypather.get($localStorage, 'ahaGuide.completedMilestones'); var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); - if (!completedMilestones) { - completedMilestones = {}; - keypather.set($localStorage, 'ahaGuide.completedMilestones', completedMilestones); - } - if (!ahaGuideToggles) { ahaGuideToggles = { showAha: true, @@ -105,7 +100,6 @@ function ControllerApp( keypather.set($localStorage, 'ahaGuide.ahaGuideToggles', ahaGuideToggles); } - $rootScope.ahaGuide.completedMilestones = $localStorage.ahaGuide.completedMilestones; $rootScope.ahaGuide.ahaGuideToggles = $localStorage.ahaGuide.ahaGuideToggles; $scope.$watch(function () { @@ -118,10 +112,38 @@ function ControllerApp( }); CA.showAhaNavPopover = false; - $rootScope.$on('launchAhaNavPopover', function () { - CA.showAhaNavPopover = true; + $scope.$on('launchAhaNavPopover', function () { + CA.showAhaNavPopover = !keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); }); + CA.showAhaConfirmation = function(event) { + event.stopPropagation(); + event.preventDefault(); + CA.showAhaNavPopover = false; + ModalService.showModal({ + controller: 'ConfirmationModalController', + controllerAs: 'CMC', + templateUrl: 'confirmSetupView' + }) + .then(function(modal) { + return modal.close; + }) + .then(function(confirmed) { + if (confirmed) { + return patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasConfirmedSetup: true + } + }) + .then(function(updatedOrg) { + ahaGuide.updateCurrentOrg(updatedOrg); + $state.go('base.instances', {userName: CA.activeAccount.oauthName()}); + }); + } + }) + .catch(errs.handler); + }; + /** * broadcast to child scopes when click event propagates up * to top level controller scope. diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index 9378f8d31..9f808fd2f 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -29,8 +29,6 @@ function ControllerInstance( pageName, setLastInstance ) { - // TODO: Aha - Remove this hardcoding - currentOrg.poppa.hasConfirmedSetup = true; var CIS = this; CIS.showSidebar = false; @@ -38,11 +36,6 @@ function ControllerInstance( CIS.showSidebar = !CIS.showSidebar; }; $scope.$on('show-aha-sidebar', CIS.toggleSidebar); - - if (ahaGuide.isAddingFirstRepo()) { - console.log('Toggle first branch thingy'); - } - var dataInstance = $scope.dataInstance = { data: { unsavedAcvs: [] diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index eb5735f6d..2ffc0a0c1 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -10,6 +10,7 @@ function ControllerInstances( $localStorage, $scope, $state, + ahaGuide, keypather, setLastOrg, errs, @@ -23,14 +24,31 @@ function ControllerInstances( ) { var CIS = this; var userName = $state.params.userName; + CIS.isInGuide = ahaGuide.isInGuide; + CIS.isAddingFirstBranch = ahaGuide.isAddingFirstBranch; + CIS.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; + CIS.currentOrg = currentOrg; CIS.searchBranches = null; CIS.instanceBranches = null; + CIS.isPopoverOpen = true; CIS.unbuiltBranches = null; CIS.branchQuery = null; CIS.$storage = $localStorage.$default({ instanceListIsClosed: false }); + $scope.$on('popover-closed', function(event, pop) { + if (keypather.get(pop, 'data') !== 'ahaTemplate' && CIS.isAddingFirstBranch()) { + CIS.isPopoverOpen = true; + } + }); + + $scope.$on('popover-opened', function(event, pop) { + if (keypather.get(pop, 'data') !== 'ahaTemplate') { + CIS.isPopoverOpen = false; + } + }); + fetchInstancesByPod() .then(function (instancesByPod) { @@ -171,10 +189,10 @@ function ControllerInstances( return unbuiltBranches; }; - this.popInstanceOpen = function (instance) { + this.popInstanceOpen = function (instance, open) { + CIS.instanceBranches = null; CIS.poppedInstance = instance; loading('fetchingBranches', true); - CIS.instanceBranches = null; return CIS.getAllBranches(instance) .then(function (branches) { CIS.totalInstanceBranches = branches.models.length; @@ -197,16 +215,19 @@ function ControllerInstances( loading('buildingForkedBranch', true); promisify(CIS.poppedInstance, 'fork')(branchName, sha) .then(function (instance) { - var newInstance = instance.children.models.filter(function(childInstance) { + var newInstances = instance.children.models.filter(function(childInstance) { return childInstance.attrs.name === branchName + '-' + instance.attrs.name; - })[0]; + }); loading(branchName, false); loading('buildingForkedBranch', false); closePopover(); - $state.go('base.instances.instance', { - instanceName: newInstance.attrs.name - }); - }); + if (newInstances.length) { + $state.go('base.instances.instance', { + instanceName: newInstances[0].attrs.name + }); + } + }) + .catch(errs.handler); }; this.editInstance = function (instance) { @@ -230,5 +251,4 @@ function ControllerInstances( CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; }); }; - } diff --git a/client/directives/activePanel/toolbar/webViewToolbarView.jade b/client/directives/activePanel/toolbar/webViewToolbarView.jade index f98f2b9df..e5bead9b7 100644 --- a/client/directives/activePanel/toolbar/webViewToolbarView.jade +++ b/client/directives/activePanel/toolbar/webViewToolbarView.jade @@ -7,15 +7,12 @@ a.p.monospace.text-overflow( use( xlink:href = "#icons-link-external" ) -.grid-block.shrink.align-center.btn.btn-xs.btn-web-state( - ng-click = "state.error = !state.error" -) +.grid-block.shrink.align-center.btn.btn-xs.btn-web-state svg.iconnables.icons-alert use( xlink:href = "#icons-alert-alt" ) - | {{state.error ? 'No exposed ports.' : ''}} - | {{!state.error ? 'Bind to all interfaces.' : ''}} + | {{!SMC.state.ports.length && SMC.state.advanced !== 'isMirroringDockerfile' ? 'No exposed ports.' : 'Bind to all interfaces.'}} //- |   //- a.link( //- href = "#" diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 45f6dcfc9..92c374d92 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -9,18 +9,33 @@ function AhaGuideController( $rootScope, ahaGuide, currentOrg, + errs, fetchInstancesByPod, - keypather + keypather, + patchOrgMetadata ) { var AGC = this; var animatedPanelListener = angular.noop; AGC.instances = null; - fetchInstancesByPod() - .then(function (instances) { - AGC.instances = instances; - updateCaption(AGC.subStep); - }); + if (keypather.has(currentOrg, 'poppa.id')) { + fetchInstancesByPod() + .then(function (instances) { + AGC.instances = instances; + if (!keypather.get(instances, 'models.length')) { + return patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasConfirmedSetup: false + } + }) + .then(function(updatedOrg) { + ahaGuide.updateCurrentOrg(updatedOrg); + }); + } + updateCaption(AGC.subStep); + }) + .catch(errs.handler); + } var alertListener = $scope.$on('alert', function (event, alert) { // alerts on container creation success @@ -30,8 +45,17 @@ function AhaGuideController( } }); - $scope.$on('buildStatusUpdated', function (event, buildStatus) { - handleBuildUpdate(buildStatus); + $scope.$on('buildStatusUpdated', function(event, buildStatus) { + if (ahaGuide.isAddingFirstRepo()) { + handleBuildUpdate(buildStatus); + } + }); + + $scope.$on('exitedEarly', function(event, didExitEarly) { + if (didExitEarly) { + AGC.showError = true; + updateCaption('exitedEarly'); + } }); var stopTabUpdate = $scope.$on('updatedTab', function(event, tabName) { @@ -42,8 +66,11 @@ function AhaGuideController( } }); + AGC.isInGuide = ahaGuide.isInGuide; + AGC.hasConfirmedSetup = ahaGuide.hasConfirmedSetup; AGC.isBuildSuccessful = false; AGC.ahaGuide = ahaGuide; + AGC.showError = $scope.showError; // get the current milestone var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; @@ -59,9 +86,6 @@ function AhaGuideController( if (status === 'dockLoaded') { animatedPanelListener(); } - if (ahaGuide.isAddingFirstRepo() && keypather.get(AGC, 'instances.models.length') > 0 && status !== 'complete') { - status = 'hasContainer'; - } AGC.subStep = status; AGC.subStepIndex = currentMilestone.subSteps[status].step; AGC.caption = currentMilestone.subSteps[status].caption; @@ -88,6 +112,9 @@ function AhaGuideController( if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('exitedEarly', true); } + if (AGC.subStepIndex < 6) { + $rootScope.$broadcast('changed-animated-panel', 'addRepository'); + } }); animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { @@ -97,8 +124,14 @@ function AhaGuideController( AGC.popoverActions = { endGuide: function () { $rootScope.$broadcast('close-popovers'); - // TODO: AHA - Make this save - currentOrg.poppa.hasAha = false; + return patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasAha: false + } + }) + .then(function(updatedOrg) { + ahaGuide.updateCurrentOrg(updatedOrg); + }); }, showSidebar: function () { $rootScope.$broadcast('close-popovers'); diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js index 1a6e93cef..5c529e85b 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js @@ -15,6 +15,7 @@ function addBranchGuide( steps: ahaGuide.steps, getCurrentStep: ahaGuide.getCurrentStep }; + $scope.subStep = $scope.AGC.subStep; } }; } diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index e9da6b876..35a7f955f 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -1,29 +1,37 @@ .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-33': ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH,\ - 'aha-meter-100': ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ + 'aha-error': AGC.errorState || AGC.showError,\ + 'aha-meter-33': AGC.ahaGuide.isAddingFirstBranch(),\ + 'aha-meter-66': AGC.ahaGuide.isAddingFirstBranch() && subStep === 'dockLoading',\ + 'aha-meter-100': AGC.ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables use( - ng-if = "ahaGuide.getCurrentStep() === ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "!AGC.showError && AGC.ahaGuide.isAddingFirstBranch()" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "!AGC.showError && AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) + + svg.iconnables.icons-alert( + ng-if = "AGC.showError" + ) + use( + xlink:href = "#icons-alert-alt" + ) + .grid-block.vertical.aha-text p.p.small.text-gray-light Add your First Branch p.p( - ng-if = "state.showSubStep === 1" + ng-if = "subStep === 'addBranch'" ) Click the ‘Add Branch’ button next to any repo name. p.p( - ng-if = "state.showSubStep === 2" + ng-if = "subStep === 'dockLoading'" ) Select a branch to add. //- show in the branch menu if the repository has no branches. p.p( - ng-if = "state.showSubStep === 3" - ) Aw, no branches. Try another repository or - a.link skip this step - | . + ng-if = "subStep === 'deletedTemplate'" + ) You've deleted your repository template. Create another one to continue. \ No newline at end of file diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index bf1995736..fecff80b6 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -1,5 +1,5 @@ .grid-block.align-center( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.CHOOSE_ORGANIZATION" + ng-if = "AGC.ahaGuide.isChoosingOrg()" ng-include = "'createSandboxGuideView'" ) @@ -9,18 +9,18 @@ ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "AGC.ahaGuide.isAddingFirstBranch()" add-branch-guide ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.getCurrentStep() === AGC.ahaGuide.steps.SETUP_RUNNABOT" + ng-if = "AGC.ahaGuide.isSettingUpRunnabot()" ng-include = "'setUpRunnabotGuideView'" ) button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "AGC.ahaGuide.getCurrentStep() !== AGC.ahaGuide.steps.CHOOSE_ORGANIZATION" + ng-if = "!AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpRunnabot()" pop-over pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index 2832f1dd3..abd723f5d 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -16,6 +16,7 @@ function ahaSidebar( link: function ($scope) { $scope.steps = ahaGuide.steps; $scope.getCurrentStep = ahaGuide.getCurrentStep; + $scope.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; $scope.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; } }; diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index d68b07cd6..ed8654e71 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -2,11 +2,16 @@ ng-if = "!showOverview" ) header.grid-block.align-center.justify-center.aha-sidebar-header - h4.grid-content.strong.text-center.h4 + h4.grid-content.strong.text-center.h4( + ng-if = "!isSettingUpRunnabot()" + ) //- During ahas 1-3: | Setup Guide + h4.grid-content.strong.text-center.h4( + ng-if = "isSettingUpRunnabot()" + ) //- During aha 4: - //- | You did it! + | You did it! svg.grid-content.shrink.iconnables.icons-close( ng-click = "toggleSidebar()" ng-if = "!showOverview" @@ -28,7 +33,9 @@ ) Get Started //- During ahas 1-3 -.grid-block.shrink.vertical.aha-guide-wrapper +.grid-block.shrink.vertical.aha-guide-wrapper( + ng-if = "getCurrentStep() < steps.SETUP_RUNNABOT" +) .grid-block.shrink.align-center.padding-sm.aha-guide.disabled .grid-block.shrink.aha-meter.aha-meter-100 svg.iconnables @@ -87,7 +94,7 @@ p.p.strong Add your First Branch p.small Your branches will update on every commit you make. - .grid-block.vertical.align-center.form-github( - ng-if = "getCurrentStep() === steps.SETUP_RUNNABOT" - github-integration - ) +.grid-block.vertical.align-center.form-github( + ng-if = "isSettingUpRunnabot()" + github-integration +) diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index 408270ccf..b19235d96 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -14,4 +14,12 @@ ) .grid-block.vertical.aha-text p.p.small.text-gray-light {{ AGC.title }} - p.p {{ AGC.caption }} + p.p( + ng-if = "AGC.subStep === 'orgSelection'" + ) Choose an organization to create your environment for. + p.p( + ng-if = "AGC.subStep === 'dockLoading'" + ) Hang tight! + p.p( + ng-if = "AGC.subStep === 'dockLoaded'" + ) Continue to start configuring your project. diff --git a/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade new file mode 100644 index 000000000..bc352c4a5 --- /dev/null +++ b/client/directives/components/ahaGuide/components/setUpRunnabotGuideView.jade @@ -0,0 +1,2 @@ +.grid-block.vertical.runnabot-text + p.p Get the most out of Runnabot by adding branches automatically. diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index a88fe609d..9784c323c 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -1,16 +1,35 @@ .grid-block.shrink.aha-meter.js-animate( class = "{{ AGC.className }}" - ng-class = "{'aha-error': AGC.showError}" + ng-class = "{'aha-error': AGC.showError || AGC.errorState}" ) svg.iconnables( - ng-if = "!AGC.showError" + ng-if = "!AGC.showError && !AGC.errorState" ) use( - ng-if = "ASC.getCurrentStep() === ASC.steps.CHOOSE_ORGANIZATION && AGC.subStep !== 'complete' && AGC.subStep !== 'hasContainer'" + ng-if = "AGC.ahaGuide.isAddingFirstRepo() && AGC.subStep !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AGC.subStep === 'complete' || AGC.subStep === 'hasContainer'" + ng-if = "AGC.subStep === 'complete' || AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" + xlink:href = "#icons-check" + ) + svg.iconnables.icons-alert( + ng-if = "AGC.showError || AGC.errorState" + ) + use( + xlink:href = "#icons-alert-alt" + ) + +.grid-block.shrink.aha-meter.js-animate( + class = "aha-meter-100" + ng-class = "{'aha-error': AGC.showError || AGC.errorState}" + ng-if = "!state.showVerification && AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" +) + svg.iconnables( + ng-if = "!AGC.showError" + ) + use( + ng-if = "AGC.subStep === 'complete'" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( @@ -20,37 +39,86 @@ xlink:href = "#icons-alert-alt" ) -.grid-block.vertical.aha-text +.grid-block.vertical.aha-text( + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.ahaGuide.isAddingFirstRepo()" +) p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-if = "$root.featureFlags.aha && !AGC.showError" - ) {{ AGC.caption }} - - //- Step 8: + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'addRepository'" + ) Add your repository by clicking ‘Create Template’. p.p( - ng-if = "AGC.subStep === 7" - ) - | {{!AGC.showError ? 'We‘re building! Build time varies depending on your template.' : ''}} - | {{AGC.showError ? 'Uh oh, there was a build error! Inspect your logs for debug info.' : ''}} - //- | IF DETENTION ERROR: Your container is running! But it looks like something has not been set up correctly. - span.span( - ng-if = "AGC.showErrorType === 'exitedEarly'" - ) Your repository isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'containerSelection'" + ) Select a repository to configure. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" + ) How would you like to configure your repo? + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" + ) Give your configuration a name. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'repository'" + ) What does your repository run? + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'commands'" + ) Choose commands and packages. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" + ) If your app needs additional configuration… + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" + ) We’ve imported your dockerfile, click ‘Save & Build’ to build it! + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" + ) We‘re building! Build time varies depending on your template. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'exitedEarly'" + ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, a.link( ng-click = "askEngineers()" ) ask our engineers | ! + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" + ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. + p.p( + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" + ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. + + +.grid-block.vertical.aha-text( + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 6" +) + p.p.small.text-gray-light {{ AGC.title }} + p.p( + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" + ) {{ AGC.caption }} + p.p( + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError" + ) Uh oh, there was a build error! Inspect your logs for debug info. - //- If template repo is deleted: - //- p.p( - //- ng-class = "{'p-slide js-animate': AGC.showSubStep}" - //- ) You‘ve deleted your repository template. Create another one to continue. +.grid-block.vertical.aha-text( + class = "{{ AGC.className }}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && !AGC.ahaGuide.isAddingFirstRepo()" +) + p.p.small.text-gray-light {{ AGC.title }} + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" + ) Choose a template to configure. //- Step 9: p.p( ng-if = "AGC.subStep === 8 && !AGC.showError" ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. - - //- Step 10 (in the nav popover): - //- p.p Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index 0737085a9..295cdcfdf 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -20,7 +20,7 @@ //- empty state .card.gray.disabled.load.empty.p( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "!$root.featureFlags.aha && !EC.isInGuide() && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" + ng-if = "(!$root.featureFlags.aha || !EC.isInGuide()) && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" ) Create a repository template to get started! //- server card diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 9bbb7a74b..e50941e6a 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -15,13 +15,13 @@ function EnvironmentController( $state, $timeout, ahaGuide, + currentOrg, favico, fetchDockerfileForContextVersion, fetchOrgMembers, fetchUser, keypather, ModalService, - pageName, instancesByPod ) { @@ -101,12 +101,13 @@ function EnvironmentController( $scope.data = { }; $scope.data.instances = instancesByPod; - if (ahaGuide.isAddingFirstRepo() && instancesByPod.models.length === 0) { + var isAddFirstRepo = ahaGuide.isAddingFirstRepo(); + + if (isAddFirstRepo && instancesByPod.models.length === 0) { EC.showCreateTemplate = false; EC.showSidebar = true; } - var isAddFirstRepo = ahaGuide.isAddingFirstRepo(); // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 3cc60f59a..2f2db42d4 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -42,7 +42,7 @@ //- environment page .grid-block.environment-wrapper( - ng-class = "{'empty': EC.isAddingFirstRepo() && data.instances.models.length === 0}" + ng-class = "{'empty': EC.isInGuide() && EC.isAddingFirstRepo() && data.instances.models.length === 0}" ) header.grid-block.align-center.environment-header( ng-include = "'viewEnvironmentHeader'" @@ -51,18 +51,25 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.showExitedEarly" + ng-if = "$root.featureFlags.aha && EC.showExitedEarly && data.instances.models.length" aha-guide error-state = "true" sub-step = 'exitedEarly' sub-step-index = 7 ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha && EC.isInGuide() && !EC.isAddingFirstRepo() && !data.instances.models.length" + aha-guide + error-state = "true" + sub-step = "deletedTemplate" + ) + .grid-block.environment-body.justify-center.clearfix( - ng-class = "{'align-center justify-center': EC.showCreateTemplate && data.instances.models.length === 0}" + ng-class = "{'align-center justify-center': EC.showCreateTemplate && !data.instances.models.length}" ) .modal-dialog.modal-sm( - ng-if = "EC.isInGuide() && EC.showCreateTemplate && !data.instances.models.length" + ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.isAddingFirstRepo() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( aha-guide @@ -92,5 +99,5 @@ aha-sidebar toggle-sidebar = "EC.toggleSidebar" show-overview = "!EC.showCreateTemplate" - ng-if = "$root.featureFlags.aha && EC.showSidebar" + ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.showSidebar" ) diff --git a/client/directives/environment/modals/confirmSetupView.jade b/client/directives/environment/modals/confirmSetupView.jade index d89c3fa17..7c4fafc3d 100644 --- a/client/directives/environment/modals/confirmSetupView.jade +++ b/client/directives/environment/modals/confirmSetupView.jade @@ -5,7 +5,7 @@ .modal-dialog.modal-sm .modal-body svg.iconnables.icons-close( - ng-click = "SMC.actions.close()" + ng-click = "CMC.actions.cancel()" ) use( xlink:href = "#icons-close" @@ -17,5 +17,9 @@ a.link chat with our devs | . footer.modal-footer.clearfix - button.btn.btn-md.btn-cancel.gray.float-left Go Back - button.btn.btn-md.green.float-right It‘s Running! + button.btn.btn-md.btn-cancel.gray.float-left( + ng-click = "CMC.actions.cancel()" + ) Go Back + button.btn.btn-md.green.float-right( + ng-click = "$root.$broadcast('confirmedSetup');CMC.actions.confirm()" + ) It‘s Running! diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 91e25cf1b..05353bc4e 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -2,12 +2,26 @@ ng-class = "{'in': active}" ng-style = "popoverStyle.getStyle(CIS.instanceBranches)" ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha && CIS.instanceBranches.length && CIS.isAddingFirstBranch()" + aha-guide + step-index = 2 + sub-step = "dockLoading" + ) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha && CIS.instanceBranches && !CIS.instanceBranches.length && CIS.isAddingFirstBranch()" + aha-guide + step-index = 2 + sub-step = "dockLoaded" + ) + .arrow.white( ng-style = "popoverStyle.getArrowStyle(CIS.instanceBranches)" ) .grid-block.vertical.popover-content.empty( ng-if = "$root.featureFlags.autoIsolationSetup" ) + svg.svg.grid-block use( xlink:href = "#icons-branch-burst" @@ -18,7 +32,7 @@ ) Set Up Branches animated-panel-container.popover-views( - ng-if = "!$root.featureFlags.autoIsolationSetup" + ng-if = "!$root.featureFlags.autoIsolationSetup && !CIS.isPopoverOpen" ) //- this should be the default panel when auto-isolation is implemented animated-panel( diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade new file mode 100644 index 000000000..eb4dcd9b8 --- /dev/null +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -0,0 +1,36 @@ +.popover.menu.right.popover-branch-menu( + ng-class = "{'in': active}" + ng-style = "popoverStyle.getStyle()" +) + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isAddingFirstBranch()" + aha-guide + step-index = 2 + sub-step = "addBranch" + ) + + .grid-block.shrink.align-center.justify-center.padding-sm( + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isSettingUpRunnabot()" + aha-guide + step-index = 3 + sub-step = "addBranch" + ) + + .arrow.white + + animated-panel-container.popover-views( + ng-if = "!$root.featureFlags.autoIsolationSetup && $root.isLoading.fetchingBranches" + ) + animated-panel( + default = "true" + name = "addBranch" + ) + .popover-view.fade( + class = "in" + ) + .popover-content( + ) + .spinner-wrapper.spinner-sm.spinner-gray.spinner-center.in( + ng-if = "$root.isLoading.fetchingBranches" + ng-include = "'spinner'" + ) diff --git a/client/directives/modals/directiveModal.js b/client/directives/modals/directiveModal.js index 9ca2a5dd3..1e46ba86d 100755 --- a/client/directives/modals/directiveModal.js +++ b/client/directives/modals/directiveModal.js @@ -9,7 +9,8 @@ function modal() { return { restrict: 'A', scope: { - data: '=?modalData', // Contains modal specific data + controller: '=?modalController', // Contains modal specific data + controllerAs: '@?modalControllerAs', // the property name used to access controller actions: '=?modalActions', // Contains modal specific actions template: '@modalTemplate', currentModel: '=?modalCurrentModel', // The object that contains the data to display @@ -19,8 +20,9 @@ function modal() { link: function ($scope, element, attrs) { function openModal() { $scope.$emit('open-modal', { - data: $scope.data, actions: $scope.actions, + controller: $scope.controller, + controllerAs: $scope.controllerAs, template: $scope.template, currentModel: $scope.currentModel, stateModel: $scope.stateModel diff --git a/client/directives/modals/directiveModalManager.js b/client/directives/modals/directiveModalManager.js index 54f7d1ecc..4b1823a30 100644 --- a/client/directives/modals/directiveModalManager.js +++ b/client/directives/modals/directiveModalManager.js @@ -58,7 +58,7 @@ function modalManager( } $scope.currentModalScope = currentModalScope = $scope.$new(true); - currentModalScope.data = options.data; + currentModalScope[options.controllerAs] = options.controller; currentModalScope.actions = options.actions; currentModalScope.template = options.template; currentModalScope.openFlag = options.openFlag; diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index 235beb7c2..51aaceecf 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -7,6 +7,7 @@ function ChooseOrganizationModalController( $rootScope, $scope, $state, + ahaGuide, createNewSandboxForUserService, errs, featureFlags, @@ -84,6 +85,7 @@ function ChooseOrganizationModalController( return selectedOrgName.toLowerCase() === org.oauthName().toLowerCase(); }); }; + COMC.isChoosingOrg = ahaGuide.isChoosingOrg; // Polling stuff COMC.cancelPolling = function () { diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 4af5a3f5d..12a0be358 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -8,16 +8,14 @@ ) .grid-block.shrink.modal-dialog.modal-orgs( ng-class = "{\ - 'modal-lg': data.allAccounts.length > 1,\ - 'modal-sm': data.allAccounts.length <= 1\ + 'modal-lg': COS.allAccounts.length > 1,\ + 'modal-sm': COS.allAccounts.length <= 1\ }" ) .grid-block.shrink.align-center.justify-center.padding-md.aha-guide( aha-guide - ng-if = "$root.featureFlags.aha" - step-index = 0 + ng-if = "$root.featureFlags.aha && COS.isChoosingOrg()" sub-step = "orgSelection" - sub-step-index = 0 ) animated-panel-container animated-panel.modal-body.grid-block.vertical.padding-sm( @@ -37,7 +35,7 @@ .grid-block.shrink.justify-center.align-center.padding-xs.well.gray.aha-tips.fade( ng-class = "{'in': isActivePanel()}" - ng-if = "$root.featureFlags.aha && data.allAccounts.length" + ng-if = "$root.featureFlags.aha && COS.allAccounts.length" ) svg.grid-content.shrink.iconnables use( @@ -52,7 +50,7 @@ //- empty state .empty.well.gray.padding-lg( - ng-if = "!data.allAccounts.length" + ng-if = "!COS.allAccounts.length" ) h3.h3.empty.text-gray.text-center We couldn’t find any organizations. small.small.empty.text-center Check if you’ve granted access to your organization @@ -63,15 +61,15 @@ | . If you don’t have permission to grant access, you’ll have to ask your admin to give the go ahead. form.grid-block.list.fade( - name = "data.orgSelectorForm" + name = "COS.orgSelectorForm" ng-class = "{'in': isActivePanel()}" - ng-if = "data.allAccounts.length" + ng-if = "COS.allAccounts.length" ) //- add .active class if this org is selected //- add [disabled] property when loading NOT class! label.grid-block.align-center.list-item.btn.white( - ng-class = "{'active': org.oauthName() === data.selectedOrgName}" - ng-repeat = "org in data.allAccounts" + ng-class = "{'active': org.oauthName() === COS.selectedOrgName}" + ng-repeat = "org in COS.allAccounts" title = "{{org.oauthName()}}" ) img.grid-block.shrink( @@ -81,7 +79,7 @@ ) span.grid-block.text-left.text-overflow {{org.oauthName()}} input.checkbox.hidden( - ng-model = "data.selectedOrgName" + ng-model = "COS.selectedOrgName" value = "{{org.oauthName()}}" type = "radio" ) @@ -94,14 +92,14 @@ //- hide the footer if no orgs are found footer.grid-block.vertical.modal-footer.fade( ng-class = "{'in': isActivePanel()}" - ng-if = "data.allAccounts.length" + ng-if = "COS.allAccounts.length" ) //- disabled until an org is selected button.btn.btn-md.green( ng-click = "\ - actions.createOrCheckDock(data.selectedOrgName, goToPanel);\ + actions.createOrCheckDock(COS.selectedOrgName, goToPanel);\ " - ng-disabled = "!data.selectedOrgName" + ng-disabled = "!COS.selectedOrgName" ) Confirm Organization animated-panel.modal-body.grid-block.vertical( @@ -133,7 +131,7 @@ ng-class = "{'in': isActivePanel()}" ) button.btn.btn-md.green( - ng-click = "actions.selectAccount(data.selectedOrgName)" + ng-click = "actions.selectAccount(COS.selectedOrgName)" ) Go to Runnable .grid-block.justify-center.modal-outer-footer( grace-period-footer diff --git a/client/directives/navBar/viewNav.jade b/client/directives/navBar/viewNav.jade index bfcdde751..fb52867a3 100644 --- a/client/directives/navBar/viewNav.jade +++ b/client/directives/navBar/viewNav.jade @@ -6,7 +6,7 @@ //- aha menu --- This should be triggered via an event! .popover.right.in.popover-aha( - ng-if = "CA.showAhaNavPopover" + ng-if = "$root.featureFlags.aha && CA.showAhaNavPopover" ng-include = "'ahaPopoverView'" ) @@ -36,6 +36,10 @@ a.a( ui-sref = "base.instances({ userName: CA.activeAccount.oauthName() })" ui-sref-active = "active" ) + .aha-overlay-div( + ng-if = "$root.featureFlags.aha && CA.ahaGuide.isAddingFirstRepo() && CA.instancesByPod.models.length && !CA.ahaGuide.hasConfirmedSetup()" + ng-click = "CA.showAhaConfirmation($event)" + ) svg.iconnables.icons-server-dark use( xlink:href = "#icons-server-dark" diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index ea6b1a0c7..0012ba7e4 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -27,6 +27,10 @@ function PopOverController( POC.unbindDocumentClick(); POC.unbindPopoverOpened(); POC.unbindSpecificPopoverOpened(); + $rootScope.$broadcast('popover-closed', { + template: $scope.template, + data: $scope.data + }); // We need a closure because they could technically re-open the popover and we want to manage THIS scope and THIS element. (function (popoverElementScope, popoverElement) { //Give the transition some time to finish! @@ -41,6 +45,10 @@ function PopOverController( }(POC.popoverElementScope, POC.popoverElement)); }; POC.openPopover = function () { + $rootScope.$broadcast('popover-opened', { + template: $scope.template, + data: $scope.data + }); $scope.popoverOptions = $scope.popoverOptions || {}; if (!exists($scope.popoverOptions.top) && !exists($scope.popoverOptions.bottom)) { diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index ccc0f13cd..6564b5a9a 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -28,7 +28,7 @@ function ahaGuide( var stepList = {}; stepList[STEPS.CHOOSE_ORGANIZATION] = { - title: 'Create your Sandbox', + title: 'Create your Environment', subSteps: { orgSelection: { caption: 'Choose an organization to create your sandbox for.', @@ -53,7 +53,7 @@ function ahaGuide( title: 'Add your First Repository', subSteps: { addRepository: { - caption: 'Add a repository by clicking ‘Add Template’.', + caption: 'Add a repository by clicking ‘Create Template’.', className: 'aha-meter-10', step: 0 }, @@ -137,11 +137,6 @@ function ahaGuide( caption: 'Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches.', className: 'aha-meter-100', step: 9 - }, - hasContainer: { - caption: 'Choose a template to configure.', - className: 'aha-meter-100', - step: 9 } }, buildStatus: { @@ -169,11 +164,24 @@ function ahaGuide( dockLoaded: { caption: 'Continue to start configuring your project.', className: 'aha-meter-100' + }, + deletedTemplate: { + caption: 'You\'ve deleted your repository template. Create another one to continue.', + className: 'aha-meter-20' } }, panelSteps: { } }; + stepList[STEPS.SETUP_RUNNABOT] = { + subSteps: { + setupRunnabot: { + caption: 'Get the most out of Runnabot by adding branches automatically', + className: 'aha-meter-50' + } + } + }; + var cachedStep; $rootScope.$watch(function () { cachedStep = null; @@ -185,14 +193,14 @@ function ahaGuide( if (!cachedStep) { if ($rootScope.featureFlags.aha && !keypather.get(currentOrg, 'poppa.id')) { cachedStep = STEPS.CHOOSE_ORGANIZATION; - } else if (!$rootScope.featureFlags.aha || !currentOrg.poppa.hasAha) { + } else if (!$rootScope.featureFlags.aha || !isInGuide()) { cachedStep = STEPS.COMPLETED; - } else if (!currentOrg.poppa.hasConfirmedSetup) { + } else if (!hasConfirmedSetup()) { cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched var hasBranchLaunched = instances.some(function (instance) { - return instance.attrs.hasBranchLaunched; + return instance.attrs.hasAddedBranches; }); if (hasBranchLaunched) { cachedStep = STEPS.SETUP_RUNNABOT; @@ -204,8 +212,18 @@ function ahaGuide( return cachedStep; } - function isInGuide() { - return $rootScope.featureFlags.aha && currentOrg.poppa.hasAha && getCurrentStep() !== STEPS.COMPLETED; + function isInGuide () { + return keypather.get(currentOrg, 'poppa.attrs.metadata.hasAha'); + } + + function hasConfirmedSetup () { + return keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); + } + + function updateCurrentOrg(updatedOrg) { + if (keypather.has(updatedOrg, 'metadata.hasAha') && keypather.has(updatedOrg, 'metadata.hasConfirmedSetup')) { + currentOrg.poppa.attrs.metadata = updatedOrg.metadata; + } } return { @@ -213,8 +231,19 @@ function ahaGuide( getCurrentStep: getCurrentStep, steps: STEPS, isInGuide: isInGuide, + hasConfirmedSetup: hasConfirmedSetup, + updateCurrentOrg: updateCurrentOrg, + isChoosingOrg: function() { + return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; + }, isAddingFirstRepo: function () { return getCurrentStep() === STEPS.ADD_FIRST_REPO; - } + }, + isAddingFirstBranch: function() { + return getCurrentStep() === STEPS.ADD_FIRST_BRANCH; + }, + isSettingUpRunnabot: function() { + return getCurrentStep() === STEPS.SETUP_RUNNABOT; + }, }; } diff --git a/client/services/createAndBuildNewContainerService.js b/client/services/createAndBuildNewContainerService.js index f6355ea38..db346b010 100644 --- a/client/services/createAndBuildNewContainerService.js +++ b/client/services/createAndBuildNewContainerService.js @@ -19,7 +19,8 @@ function createAndBuildNewContainer( eventTracking, fetchInstancesByPod, fetchPlan, - fetchUser + fetchUser, + keypather ) { return function (createPromiseForState, containerName, options) { options = options || {}; @@ -34,7 +35,7 @@ function createAndBuildNewContainer( plan: fetchPlan() }) .then(function (response) { - oldPlanId = response.plan.next.id; + oldPlanId = keypather.get(response, 'plan.next.id'); var instanceOptions = { name: containerName, owner: { diff --git a/client/services/patchOrgMetadata.js b/client/services/patchOrgMetadata.js new file mode 100644 index 000000000..4a9301ebe --- /dev/null +++ b/client/services/patchOrgMetadata.js @@ -0,0 +1,22 @@ +'use strict'; + +require('app') + .factory('patchOrgMetadata', patchOrgMetadata); + +function patchOrgMetadata( + $http, + configAPIHost, + errs +) { + return function (orgId, params) { + return $http({ + method: 'patch', + url: configAPIHost + '/auth/whitelist/' + orgId, + data: params + }) + .then(function(response) { + return response.data; + }) + .catch(errs.handler); + }; +} \ No newline at end of file diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index d1e745655..bbc881cfe 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -70,20 +70,32 @@ p.p.text-center.text-gray-light.padding-sm( span.grid-content.text-overflow( title = "{{masterInstance.getName()}}" ) {{masterInstance.getName()}} - //- div instead of button so safari doesn’t get weird with alignment .grid-block.align-center.shrink.btn.btn-xxs.white( - ng-class = "{'active': state.active}" ng-if = "$root.featureFlags.addBranches" ng-click = "CIS.popInstanceOpen(masterInstance)" + tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-4,\"top\":24}" pop-over pop-over-controller = "CIS" pop-over-options = "{\"verticallyCentered\":true,\"left\":87,\"pinToViewPort\":true}" pop-over-template = "branchMenuPopoverView" + pop-over-data = "'branchSelect'" ) Add Branch + //- '+' button for adding branches and configuring clusters svg.iconnables.icons-arrow-forward use( xlink:href = "#icons-arrow-down" ) + .stepOneUncloseablePopover( + ng-if = "$root.featureFlags.aha && CIS.isInGuide() && $index === 0 && CIS.shouldShowParent(masterInstance) && (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)" + pop-over + pop-over-active = "CIS.isPopoverOpen" + pop-over-controller = "CIS" + pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" + pop-over-template = "introAddBranch" + pop-over-trigger = "activeAttr" + pop-over-uncloseable = "CIS.isAddingFirstBranch()" + pop-over-data = "'ahaTemplate'" + ) //- repo config button (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( diff --git a/client/templates/viewOrgSelect.jade b/client/templates/viewOrgSelect.jade index d1bb2a251..75282a982 100644 --- a/client/templates/viewOrgSelect.jade +++ b/client/templates/viewOrgSelect.jade @@ -1,7 +1,8 @@ div( modal modal-actions = "actions" - modal-data = "COS" + modal-controller = "COS" + modal-controller-as = "COS" modal-open-flag = "true" modal-template = "chooseOrganizationModalView" -) \ No newline at end of file +) diff --git a/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js b/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js index d4206e0db..57c868a07 100644 --- a/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js +++ b/test/unit/directives/modals/chooseOrganizationModal/chooseOrganizationModalController.unit.js @@ -10,6 +10,7 @@ var $q; var apiMocks = require('../../../apiMocks/index'); var user = require('../../../apiMocks').user; +var mockAhaGuide; var mockWhitelistedOrgs; var mockGrantedOrgs; var mockCreateNewSandboxForUserService; @@ -85,8 +86,12 @@ describe('ChooseOrganizationModalController', function () { mockState = { go: sinon.stub() }; + mockAhaGuide = { + isChoosingOrg: sinon.stub() + }; angular.mock.module('app', function ($provide) { $provide.value('$state', mockState); + $provide.value('ahaGuide', mockAhaGuide); $provide.factory('createNewSandboxForUserService', function ($q) { mockCreateNewSandboxForUserService = sinon.stub().returns($q.when(true)); return mockCreateNewSandboxForUserService; diff --git a/test/unit/directives/modals/directiveModal.unit.js b/test/unit/directives/modals/directiveModal.unit.js index 28d8909ec..b2ae04d94 100644 --- a/test/unit/directives/modals/directiveModal.unit.js +++ b/test/unit/directives/modals/directiveModal.unit.js @@ -73,7 +73,7 @@ describe('directiveModal'.bold.underline.blue, function () { ctx = {}; ctx.template = directiveTemplate.attribute('modal', { - 'modal-data': 'data', + 'modal-controller': 'controller', 'modal-actions': 'actions', 'modal-template': 'viewModalError', 'modal-current-model': 'currentModel', @@ -93,7 +93,7 @@ describe('directiveModal'.bold.underline.blue, function () { expect($elScope.$emit.calledWith('open-modal'), 'Called with').to.equal(true); var lastCallOptions = $elScope.$emit.lastCall.args[1]; - expect(lastCallOptions.data, 'Called with options.data').to.equal(inputScope.data); + expect(lastCallOptions.controller, 'Called with options.data').to.equal(inputScope.controller); expect(lastCallOptions.actions, 'Called with options.actions').to.equal(inputScope.actions); expect(lastCallOptions.template, 'Called with options.template').to.equal('viewModalError'); expect(lastCallOptions.currentModel, 'Called with options.currentModel').to.equal(inputScope.currentModel); @@ -115,7 +115,7 @@ describe('directiveModal'.bold.underline.blue, function () { expect($elScope.$emit.calledWith('open-modal'), 'Called with').to.equal(true); var lastCallOptions = $elScope.$emit.lastCall.args[1]; - expect(lastCallOptions.data, 'Called with options.data').to.equal(inputScope.data); + expect(lastCallOptions.controller, 'Called with options.data').to.equal(inputScope.controller); expect(lastCallOptions.actions, 'Called with options.actions').to.equal(inputScope.actions); expect(lastCallOptions.template, 'Called with options.template').to.equal('viewModalError'); expect(lastCallOptions.currentModel, 'Called with options.currentModel').to.equal(inputScope.currentModel); From 0d913e15297310b9983a9d01682a1e8987353f44 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 15:53:56 -0700 Subject: [PATCH 364/577] 4.21.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d207812c..29fbceeb8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.20.14", + "version": "4.21.0", "private": true, "description": "Frontend for Runnable.io", "scripts": { From be19717dce6764427509873a64ef895d2b9ef321 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 16:12:21 -0700 Subject: [PATCH 365/577] Minor change to webviewtoolbar --- .../activePanel/toolbar/webViewToolbarView.jade | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/client/directives/activePanel/toolbar/webViewToolbarView.jade b/client/directives/activePanel/toolbar/webViewToolbarView.jade index def02fa8b..31b50e737 100644 --- a/client/directives/activePanel/toolbar/webViewToolbarView.jade +++ b/client/directives/activePanel/toolbar/webViewToolbarView.jade @@ -7,24 +7,11 @@ a.p.monospace.text-overflow( use( xlink:href = "#icons-link-external" ) -<<<<<<< HEAD .grid-block.shrink.align-center.btn.btn-xs.btn-web-state( ng-if = "!SMC.hasOpenPorts()" ) -======= -.grid-block.shrink.align-center.btn.btn-xs.btn-web-state ->>>>>>> 0d913e15297310b9983a9d01682a1e8987353f44 svg.iconnables.icons-alert use( xlink:href = "#icons-alert-alt" ) -<<<<<<< HEAD | No exposed ports. -======= - | {{!SMC.state.ports.length && SMC.state.advanced !== 'isMirroringDockerfile' ? 'No exposed ports.' : 'Bind to all interfaces.'}} ->>>>>>> 0d913e15297310b9983a9d01682a1e8987353f44 - //- |   - //- a.link( - //- href = "#" - //- target = "_blank" - //- ) Learn More From 4cfb3abfe8b58402a2941fe49774190f42a75648 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 16:13:48 -0700 Subject: [PATCH 366/577] Flipped blankDockerfile featureflag to On --- client/services/featureFlagService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 944bfe907..8e22e465a 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -13,7 +13,7 @@ function featureFlags( autoIsolation: false, autoIsolationSetup: false, backup: false, - blankDockerfile: false, // allows users to skip the verification flow + blankDockerfile: true, // allows users to skip the verification flow billing: true, cardStatus: false, connections: false, From e13d4fd1fe6bf0544807d9528129db36d6efae75 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 16:14:55 -0700 Subject: [PATCH 367/577] Enabled terminal in config modal feature flag --- client/services/featureFlagService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 944bfe907..f9c8650a4 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -17,7 +17,7 @@ function featureFlags( billing: true, cardStatus: false, connections: false, - configTerminal: false, // flag for terminal in config view + configTerminal: true, // flag for terminal in config view containersViewTemplateControls: false, containersViewEmptyState: false, dockerfileMirroringMultiple: false, From 5bd1be8a49e12e231f0f788dd18ae93e0d19cca4 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 16:16:12 -0700 Subject: [PATCH 368/577] Enabled webview toolbar feature flag --- client/services/featureFlagService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 944bfe907..185b01ce6 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -49,7 +49,7 @@ function featureFlags( trial: false, // sets account to trial mode undoDelete: false, // undo delete configuration webhooks: false, - webToolbar: false, // webview toolbar + webToolbar: true, // webview toolbar whitelistIpFiltering: false }; From ba696a62a8fd7efa7170cf6af8c363da48a6834f Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Thu, 15 Sep 2016 16:25:33 -0700 Subject: [PATCH 369/577] Keep a reference to the instances Collection object, not the models array. Also, use keypather to check that models array is valid --- client/services/ahaGuideService.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6564b5a9a..38eaa8597 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -21,7 +21,7 @@ function ahaGuide( function refreshInstances() { return fetchInstancesByPod() .then(function (fetchedInstances) { - instances = fetchedInstances.models; + instances = fetchedInstances; }); } refreshInstances(); @@ -199,7 +199,7 @@ function ahaGuide( cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched - var hasBranchLaunched = instances.some(function (instance) { + var hasBranchLaunched = keypather.get(instances, 'models.length') && instances.models.some(function (instance) { return instance.attrs.hasAddedBranches; }); if (hasBranchLaunched) { From 29beac3ebbc228d21293eeea4bc0921b434b0b65 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 15 Sep 2016 16:53:06 -0700 Subject: [PATCH 370/577] Prevented terminal from being accessed when the instance is not running --- .../environment/modals/forms/formLogs/viewFormLogs.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 538e26c47..409e89422 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -14,7 +14,7 @@ button.btn.btn-xs.white( ng-class = "{'active': SMC.page === 'terminal'}" ng-click = "SMC.page = 'terminal'" - ng-disabled = "!SMC.instance.containers.models.length" + ng-disabled = "!SMC.instance.containers.models.length && SMC.instance.status() !== 'running'" ng-if = "$root.featureFlags.configTerminal" ) Terminal From 37199bc62bf37e8ea25d10159a1ca5e2fcf64ca7 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 16 Sep 2016 14:06:05 -0700 Subject: [PATCH 371/577] Fixed bug where clicking on triple dots would close the popover. --- client/controllers/controllerInstances.js | 8 ++++---- .../directives/components/ahaGuide/ahaGuideView.jade | 3 ++- client/directives/popovers/popOverController.js | 2 -- client/directives/popovers/popOverDirective.js | 11 +++++------ 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 2ffc0a0c1..af0b5afea 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -37,14 +37,14 @@ function ControllerInstances( instanceListIsClosed: false }); - $scope.$on('popover-closed', function(event, pop) { - if (keypather.get(pop, 'data') !== 'ahaTemplate' && CIS.isAddingFirstBranch()) { + $scope.$on('popover-closed', function (event, pop) { + if (keypather.get(pop, 'data') === 'branchSelect') { CIS.isPopoverOpen = true; } }); - $scope.$on('popover-opened', function(event, pop) { - if (keypather.get(pop, 'data') !== 'ahaTemplate') { + $scope.$on('popover-opened', function (event, pop) { + if (keypather.get(pop, 'data') === 'branchSelect') { CIS.isPopoverOpen = false; } }); diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index fecff80b6..ccd042067 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -22,10 +22,11 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" ng-if = "!AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpRunnabot()" pop-over + pop-over-actions = "AGC.popoverActions" pop-over-active = "ahaMenuGuidePopover.data.show" + pop-over-no-broadcast = "true" pop-over-options = "{\"centered\":true,\"top\":36}" pop-over-template = "ahaGuideMenuPopoverView" - pop-over-actions = "AGC.popoverActions" ) svg.iconnables use( diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index 0012ba7e4..fbebd47c2 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -58,8 +58,6 @@ function PopOverController( $scope.popoverOptions.left = 0; } - $rootScope.$broadcast('close-popovers'); - $timeout(function () { // If the click has no target we should close the popover. // If the click has a target and that target is on the page but not on our popover we should close the popover. diff --git a/client/directives/popovers/popOverDirective.js b/client/directives/popovers/popOverDirective.js index 97adc8c49..480760a63 100755 --- a/client/directives/popovers/popOverDirective.js +++ b/client/directives/popovers/popOverDirective.js @@ -9,14 +9,14 @@ require('app') var scopeVars = { - data: '=? popOverData', - popoverOptions: '=? popOverOptions', - noBroadcast: '=? popOverNoBroadcast', actions: '=? popOverActions', active: '=? popOverActive', - template: '= popOverTemplate', controller: '=? popOverController', controllerAs: '@? popOverControllerAs', + data: '=? popOverData', + noBroadcast: '=? popOverNoBroadcast', + popoverOptions: '=? popOverOptions', + template: '= popOverTemplate', userCannotClose: '=? popOverUncloseable' }; @@ -25,8 +25,7 @@ function popOver( $document, keypather, $log, - exists, - $timeout + exists ) { return { restrict: 'A', From ba2350e11f1c0906fff3ed6b32eca28bb142c84d Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 16 Sep 2016 14:32:26 -0700 Subject: [PATCH 372/577] Prevent the popover from showing when the sidebar is closed. --- client/controllers/controllerInstances.js | 10 +++++++--- .../branchMenuPopover/branchMenuPopoverView.jade | 4 ++-- client/templates/instances/viewInstancesList.jade | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 2ffc0a0c1..2b563cd9e 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -30,22 +30,26 @@ function ControllerInstances( CIS.currentOrg = currentOrg; CIS.searchBranches = null; CIS.instanceBranches = null; - CIS.isPopoverOpen = true; CIS.unbuiltBranches = null; CIS.branchQuery = null; CIS.$storage = $localStorage.$default({ instanceListIsClosed: false }); + var shouldShowPopover = true; + CIS.isPopoverOpen = function () { + return shouldShowPopover && ahaGuide.isInGuide() && !CIS.$storage.instanceListIsClosed; + }; + $scope.$on('popover-closed', function(event, pop) { if (keypather.get(pop, 'data') !== 'ahaTemplate' && CIS.isAddingFirstBranch()) { - CIS.isPopoverOpen = true; + shouldShowPopover = true; } }); $scope.$on('popover-opened', function(event, pop) { if (keypather.get(pop, 'data') !== 'ahaTemplate') { - CIS.isPopoverOpen = false; + shouldShowPopover = false; } }); diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 05353bc4e..ec1b433a2 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -14,7 +14,7 @@ step-index = 2 sub-step = "dockLoaded" ) - + .arrow.white( ng-style = "popoverStyle.getArrowStyle(CIS.instanceBranches)" ) @@ -32,7 +32,7 @@ ) Set Up Branches animated-panel-container.popover-views( - ng-if = "!$root.featureFlags.autoIsolationSetup && !CIS.isPopoverOpen" + ng-if = "!$root.featureFlags.autoIsolationSetup && !CIS.isPopoverOpen()" ) //- this should be the default panel when auto-isolation is implemented animated-panel( diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index bbc881cfe..211c0db93 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -88,7 +88,7 @@ p.p.text-center.text-gray-light.padding-sm( .stepOneUncloseablePopover( ng-if = "$root.featureFlags.aha && CIS.isInGuide() && $index === 0 && CIS.shouldShowParent(masterInstance) && (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)" pop-over - pop-over-active = "CIS.isPopoverOpen" + pop-over-active = "CIS.isPopoverOpen()" pop-over-controller = "CIS" pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" From 3d897d88e19864e365ccf64aa33e3df11a04f643 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 16 Sep 2016 14:36:33 -0700 Subject: [PATCH 373/577] Added broadcast back in! --- client/directives/popovers/popOverController.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index fbebd47c2..0012ba7e4 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -58,6 +58,8 @@ function PopOverController( $scope.popoverOptions.left = 0; } + $rootScope.$broadcast('close-popovers'); + $timeout(function () { // If the click has no target we should close the popover. // If the click has a target and that target is on the page but not on our popover we should close the popover. From be5b3ca7a872267870ebbcfbb68a86e4792e0559 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 16 Sep 2016 14:38:08 -0700 Subject: [PATCH 374/577] Fixed bug where I forgot to wrap the broadcast in logic! --- client/directives/popovers/popOverController.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/directives/popovers/popOverController.js b/client/directives/popovers/popOverController.js index 0012ba7e4..30d0985c8 100644 --- a/client/directives/popovers/popOverController.js +++ b/client/directives/popovers/popOverController.js @@ -58,7 +58,10 @@ function PopOverController( $scope.popoverOptions.left = 0; } - $rootScope.$broadcast('close-popovers'); + if (!$scope.noBroadcast) { + $rootScope.$broadcast('close-popovers'); + } + $timeout(function () { // If the click has no target we should close the popover. From e3ea1fb93ec1340b2259a3c33f4d84b3601dfb6f Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 16 Sep 2016 14:41:21 -0700 Subject: [PATCH 375/577] Updated logic to target isAddingFirstBranch specifically instead of if in ahaGuide at all. --- client/controllers/controllerInstances.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 2b563cd9e..16ccda223 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -38,7 +38,7 @@ function ControllerInstances( var shouldShowPopover = true; CIS.isPopoverOpen = function () { - return shouldShowPopover && ahaGuide.isInGuide() && !CIS.$storage.instanceListIsClosed; + return shouldShowPopover && ahaGuide.isAddingFirstBranch() && !CIS.$storage.instanceListIsClosed; }; $scope.$on('popover-closed', function(event, pop) { From f66b15561ac36bd11ed2f3b612c5c18612481cc0 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 16 Sep 2016 14:46:36 -0700 Subject: [PATCH 376/577] 4.21.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 29fbceeb8..4551c27e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.0", + "version": "4.21.1", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 59fc1140265661231dfc17bbdfa6f479b4b0d8a2 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 16 Sep 2016 14:51:32 -0700 Subject: [PATCH 377/577] Added static aha popover content for non dynamic popovers --- .../components/ahaGuide/AhaGuideController.js | 40 +++---------------- .../components/ahaGuide/ahaGuideView.jade | 7 +++- .../components/ahaGuide/ahaPopoverView.jade | 5 +-- .../setUpRepositoryGuideView.jade | 5 +-- .../staticAhaGuideTemplates.jade | 25 ++++++++++++ .../environmentBody/viewCardGrid.jade | 2 +- .../environment/environmentController.js | 18 +++++++++ .../environment/environmentView.jade | 9 ++--- .../newContainerModalView.jade | 1 - client/services/ahaGuideService.js | 22 ++++++++-- 10 files changed, 80 insertions(+), 54 deletions(-) create mode 100644 client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 92c374d92..6febcd2b9 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -18,24 +18,6 @@ function AhaGuideController( var animatedPanelListener = angular.noop; AGC.instances = null; - if (keypather.has(currentOrg, 'poppa.id')) { - fetchInstancesByPod() - .then(function (instances) { - AGC.instances = instances; - if (!keypather.get(instances, 'models.length')) { - return patchOrgMetadata(currentOrg.poppa.id(), { - metadata: { - hasConfirmedSetup: false - } - }) - .then(function(updatedOrg) { - ahaGuide.updateCurrentOrg(updatedOrg); - }); - } - updateCaption(AGC.subStep); - }) - .catch(errs.handler); - } var alertListener = $scope.$on('alert', function (event, alert) { // alerts on container creation success @@ -45,7 +27,7 @@ function AhaGuideController( } }); - $scope.$on('buildStatusUpdated', function(event, buildStatus) { + var buildLogListener = $scope.$on('buildStatusUpdated', function(event, buildStatus) { if (ahaGuide.isAddingFirstRepo()) { handleBuildUpdate(buildStatus); } @@ -53,7 +35,8 @@ function AhaGuideController( $scope.$on('exitedEarly', function(event, didExitEarly) { if (didExitEarly) { - AGC.showError = true; + AGC.errorState = true; + buildLogListener(); updateCaption('exitedEarly'); } }); @@ -70,7 +53,7 @@ function AhaGuideController( AGC.hasConfirmedSetup = ahaGuide.hasConfirmedSetup; AGC.isBuildSuccessful = false; AGC.ahaGuide = ahaGuide; - AGC.showError = $scope.showError; + AGC.errorState = $scope.errorState; // get the current milestone var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; @@ -112,9 +95,6 @@ function AhaGuideController( if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('exitedEarly', true); } - if (AGC.subStepIndex < 6) { - $rootScope.$broadcast('changed-animated-panel', 'addRepository'); - } }); animatedPanelListener = $rootScope.$on('changed-animated-panel', function (e, panel) { @@ -122,17 +102,7 @@ function AhaGuideController( }); AGC.popoverActions = { - endGuide: function () { - $rootScope.$broadcast('close-popovers'); - return patchOrgMetadata(currentOrg.poppa.id(), { - metadata: { - hasAha: false - } - }) - .then(function(updatedOrg) { - ahaGuide.updateCurrentOrg(updatedOrg); - }); - }, + endGuide: ahaGuide.endGuide, showSidebar: function () { $rootScope.$broadcast('close-popovers'); $rootScope.$broadcast('show-aha-sidebar'); diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index fecff80b6..96287740a 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -3,6 +3,11 @@ ng-include = "'createSandboxGuideView'" ) +.grid-block.align-center( + ng-if = "staticAddRepo || showAhaNavPopover" + ng-include = "'staticAhaGuideTemplates'" +) + .grid-block.align-center( ng-if = "AGC.ahaGuide.isAddingFirstRepo()" ng-include = "'setUpRepositoryGuideView'" @@ -25,7 +30,7 @@ button.btn.btn-xs.white.btn-menu( pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-options = "{\"centered\":true,\"top\":36}" pop-over-template = "ahaGuideMenuPopoverView" - pop-over-actions = "AGC.popoverActions" + pop-over-actions = "AGC ? AGC.popoverActions : EC.popoverActions" ) svg.iconnables use( diff --git a/client/directives/components/ahaGuide/ahaPopoverView.jade b/client/directives/components/ahaGuide/ahaPopoverView.jade index 6c8631ff1..a99f6da91 100644 --- a/client/directives/components/ahaGuide/ahaPopoverView.jade +++ b/client/directives/components/ahaGuide/ahaPopoverView.jade @@ -1,9 +1,8 @@ .arrow.white .popover-content .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - aha-guide - step-index = 1 - sub-step = "complete" + ng-include = "'ahaGuideView'" + ng-init = "showAhaNavPopover = true" ) .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 9784c323c..066cdb598 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -81,7 +81,7 @@ ) We‘re building! Build time varies depending on your template. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'exitedEarly'" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.subStep === 'exitedEarly'" ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, a.link( ng-click = "askEngineers()" @@ -100,9 +100,6 @@ ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 6" ) p.p.small.text-gray-light {{ AGC.title }} - p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" - ) {{ AGC.caption }} p.p( ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError" ) Uh oh, there was a build error! Inspect your logs for debug info. diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade new file mode 100644 index 000000000..ae640a621 --- /dev/null +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade @@ -0,0 +1,25 @@ +.grid-block.shrink.aha-meter.js-animate( + ng-class = "{\ + 'aha-meter-10': staticAddRepo,\ + 'aha-meter-100': showAhaNavPopover\ + }" +) + svg.iconnables( + ) + use( + ng-if = "staticAddRepo" + xlink:href = "#icons-octicons-repo" + ) + use( + ng-if = "showAhaNavPopover" + xlink:href = "#icons-check" + ) + +.grid-block.vertical.aha-text + p.p.small.text-gray-light Add your First Repository + p.p( + ng-if = "staticAddRepo" + ) Add your repository by clicking ‘Create Template’. + p.p( + ng-if = "showAhaNavPopover" + ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. diff --git a/client/directives/environment/environmentBody/viewCardGrid.jade b/client/directives/environment/environmentBody/viewCardGrid.jade index 295cdcfdf..8249c3951 100644 --- a/client/directives/environment/environmentBody/viewCardGrid.jade +++ b/client/directives/environment/environmentBody/viewCardGrid.jade @@ -20,7 +20,7 @@ //- empty state .card.gray.disabled.load.empty.p( ng-class = "{'deprecated': !$root.featureFlags.cardStatus}" - ng-if = "(!$root.featureFlags.aha || !EC.isInGuide()) && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" + ng-if = "!$root.featureFlags.aha && !$root.isLoading.sidebar && data.instances && !data.instances.models.length" ) Create a repository template to get started! //- server card diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index e50941e6a..8c8f4752e 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -23,11 +23,13 @@ function EnvironmentController( keypather, ModalService, pageName, + patchOrgMetadata, instancesByPod ) { var EC = this; EC.showInviteButton = false; + EC.endGuide = ahaGuide.endGuide; EC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; EC.isInGuide = ahaGuide.isInGuide; EC.showCreateTemplate = true; @@ -35,7 +37,21 @@ function EnvironmentController( EC.toggleSidebar = function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; + patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasAha: true, + hasConfirmedSetup: false + } + }) + .then(function(updatedOrg) { + ahaGuide.updateCurrentOrg(updatedOrg); + }); }; + EC.popoverActions = { + showSidebar: EC.toggleSidebar, + endGuide: EC.endGuide + }; + $scope.$on('show-aha-sidebar', EC.toggleSidebar); $scope.$on('exitedEarly', function (event, didExitEarly) { @@ -112,6 +128,8 @@ function EnvironmentController( instancesByPod.forEach(function (instance) { if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { $rootScope.$broadcast('launchAhaNavPopover'); + } else if (isAddFirstRepo) { + EC.showExitedEarly = true; } if (instance.hasDockerfileMirroring()) { return fetchDockerfileForContextVersion(instance.contextVersion) diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 2f2db42d4..1fff598de 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -51,9 +51,9 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.showExitedEarly && data.instances.models.length" + ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.showExitedEarly && data.instances.models.length" aha-guide - error-state = "true" + error-state = "EC.showExitedEarly" sub-step = 'exitedEarly' sub-step-index = 7 ) @@ -72,9 +72,8 @@ ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.isAddingFirstRepo() && EC.showCreateTemplate && !data.instances.models.length" ) .grid-block.align-center.aha-guide.padding-md( - aha-guide - sub-step = "addRepository" - sub-step-index = 0 + ng-include = "'ahaGuideView'" + ng-init = "staticAddRepo = true" ) .grid-block.card-grid.clearfix( diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 53bd10dd2..2759f5330 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -3,7 +3,6 @@ aha-guide ng-class = "{'p-slide js-animate': AGC.state.subStepIndex > 0}" ng-if = "MC.ahaGuide.isAddingFirstRepo()" - step-index = 1 sub-step = "containerSelection" sub-step-index = 1 ) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6564b5a9a..fff246ceb 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -15,7 +15,8 @@ function ahaGuide( $rootScope, currentOrg, fetchInstancesByPod, - keypather + keypather, + patchOrgMetadata ) { var instances = []; function refreshInstances() { @@ -226,12 +227,25 @@ function ahaGuide( } } + function endGuide () { + $rootScope.$broadcast('close-popovers'); + return patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasAha: false + } + }) + .then(function(updatedOrg) { + updateCurrentOrg(updatedOrg); + }); + } + return { - stepList: stepList, + endGuide: endGuide, getCurrentStep: getCurrentStep, - steps: STEPS, - isInGuide: isInGuide, hasConfirmedSetup: hasConfirmedSetup, + isInGuide: isInGuide, + stepList: stepList, + steps: STEPS, updateCurrentOrg: updateCurrentOrg, isChoosingOrg: function() { return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; From f86bf3663e3be0d7baabfbac479e6cd12d343562 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Fri, 16 Sep 2016 14:53:12 -0700 Subject: [PATCH 378/577] Cleaning up tooltip that no longer exists --- client/templates/instances/viewInstancesList.jade | 1 - 1 file changed, 1 deletion(-) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index bbc881cfe..cf653218f 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -73,7 +73,6 @@ p.p.text-center.text-gray-light.padding-sm( .grid-block.align-center.shrink.btn.btn-xxs.white( ng-if = "$root.featureFlags.addBranches" ng-click = "CIS.popInstanceOpen(masterInstance)" - tooltip-options = "{\"class\":\"bottom center text-center\",\"left\":-4,\"top\":24}" pop-over pop-over-controller = "CIS" pop-over-options = "{\"verticallyCentered\":true,\"left\":87,\"pinToViewPort\":true}" From e2ea0831537f94d775ed8e46d0c76114595f211f Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 15:01:39 -0700 Subject: [PATCH 379/577] fix build log error being clipped --- .../environment/modals/forms/formLogs/viewFormLogs.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 538e26c47..06b3f0051 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -88,7 +88,7 @@ pre.pre.log-wrapper( use( xlink:href = "#icons-life-preserver" ) - small.grid-content.shrink.small + small.grid-content.small //- If build error: | Build problems? Sometimes rebuilding the container can resolve errors, otherwise inspect your build logs. //- IF CMD error: From f8c082491295f33dc61b0aea4b043d8406d7f543 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 16 Sep 2016 16:09:11 -0700 Subject: [PATCH 380/577] 4.21.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4551c27e6..453f63b74 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.1", + "version": "4.21.2", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 23319eab0d97ab2beb1f919dd07601eeab8bfbda Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 16:34:51 -0700 Subject: [PATCH 381/577] add-env-url-tooltip --- client/assets/styles/scss/components/aha-popover.scss | 11 +++++++++++ .../activePanel/toolbar/webViewToolbarView.jade | 3 ++- .../setUpRepositoryGuideView.jade | 11 +++-------- .../modals/forms/formLogs/viewFormLogs.jade | 9 +++++++++ client/services/featureFlagService.js | 1 + 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 19b8fb652..46ce6b71a 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -15,6 +15,17 @@ } } + &.popover-sm { + color: $gray; + line-height: $input-xs; + max-width: none; + width: auto; + + .float-left + .float-right { + margin-left: 15px; + } + } + .arrow { @include media(xxs) { display: none; diff --git a/client/directives/activePanel/toolbar/webViewToolbarView.jade b/client/directives/activePanel/toolbar/webViewToolbarView.jade index e5bead9b7..9d5e0f1a0 100644 --- a/client/directives/activePanel/toolbar/webViewToolbarView.jade +++ b/client/directives/activePanel/toolbar/webViewToolbarView.jade @@ -2,11 +2,12 @@ small.small.sans-serif.label-url.hidden-xxxs URL: a.p.monospace.text-overflow( ng-href = "http://{{SMC.state.instance.getContainerHostname()}}" target = "_blank" -) {{ SMC.state.instance.getContainerHostname() }} +) {{SMC.state.instance.getContainerHostname()}} svg.iconnables.icons-external use( xlink:href = "#icons-link-external" ) + .grid-block.shrink.align-center.btn.btn-xs.btn-web-state svg.iconnables.icons-alert use( diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 9784c323c..0588eb0d9 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -19,7 +19,7 @@ use( xlink:href = "#icons-alert-alt" ) - + .grid-block.shrink.aha-meter.js-animate( class = "aha-meter-100" ng-class = "{'aha-error': AGC.showError || AGC.errorState}" @@ -89,8 +89,8 @@ | ! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" - ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. + ng-if = "($root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success') || (AGC.subStep === 8 && !AGC.showError)" + ) Your build finished! Check that it looks good, then click ‘Done’. p.p( ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. @@ -117,8 +117,3 @@ ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" ) Choose a template to configure. - - //- Step 9: - p.p( - ng-if = "AGC.subStep === 8 && !AGC.showError" - ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 06b3f0051..66da66a99 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -45,6 +45,15 @@ pre.pre.log-wrapper( ng-if = "SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" ) + .popover.bottom.padding-sm.popover-aha.popover-sm.in( + ng-class = "{'sans-serif': $root.featureFlags.ahaUrlPopover}" + ng-if = "$root.featureFlags.ahaUrlPopover && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" + style = "left: 15px; top: 60px;" + ) + .arrow.white + small.small.text-gray.float-left Use this URL to check out your application. + button.btn.btn-xs.gray.float-right Dismiss + //- build logs page .build-log-wrapper( build-logs diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 944bfe907..13e5d5ddd 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -9,6 +9,7 @@ function featureFlags( var defaultFeatureFlags = { addBranches: true, aha: false, + ahaUrlPopover: false, allowIsolatedUpdate: false, autoIsolation: false, autoIsolationSetup: false, From 810e13ef3a8ce27ce4d3521108bdcdfdd38ed0f8 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 16:41:52 -0700 Subject: [PATCH 382/577] fix alignment, add dismissible stuff --- .../modals/forms/formLogs/viewFormLogs.jade | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 66da66a99..6111b0222 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -45,14 +45,19 @@ pre.pre.log-wrapper( ng-if = "SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" ) - .popover.bottom.padding-sm.popover-aha.popover-sm.in( - ng-class = "{'sans-serif': $root.featureFlags.ahaUrlPopover}" + .popover.bottom.padding-sm.popover-aha.popover-sm( + ng-class = "{\ + 'in': $root.featureFlags.ahaUrlPopover,\ + 'sans-serif': $root.featureFlags.ahaUrlPopover\ + }" ng-if = "$root.featureFlags.ahaUrlPopover && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" - style = "left: 15px; top: 60px;" + style = "left: 12px; top: 60px;" ) .arrow.white small.small.text-gray.float-left Use this URL to check out your application. - button.btn.btn-xs.gray.float-right Dismiss + button.btn.btn-xs.gray.float-right( + ng-click = "$root.featureFlags.ahaUrlPopover = false" + ) Dismiss //- build logs page .build-log-wrapper( From 4f708b8dca13c0799ee1b1efbc56d28487e31369 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 16 Sep 2016 16:59:56 -0700 Subject: [PATCH 383/577] Add method in ahaGuideService to save the furthestSubset (currently only used by addBranches) Add unit tests for code --- .../addBranchGuide/addBranchGuideDirective.js | 1 + .../addBranchGuide/addBranchGuideView.jade | 10 ++-- .../ahaSidebar/ahaSidebarDirective.js | 2 + .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 5 +- client/services/ahaGuideService.js | 44 ++++++++++++++-- test/unit/services/ahaGuideService.unit.js | 52 +++++++++++++++++++ 6 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 test/unit/services/ahaGuideService.unit.js diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js index 5c529e85b..51c54a9e0 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideDirective.js @@ -16,6 +16,7 @@ function addBranchGuide( getCurrentStep: ahaGuide.getCurrentStep }; $scope.subStep = $scope.AGC.subStep; + ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH, $scope.subStep); } }; } diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 35a7f955f..284ca2c3d 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -6,18 +6,20 @@ 'aha-meter-100': AGC.ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) - svg.iconnables + svg.iconnables( + ng-if = "!AGC.showError && !AGC.errorState" + ) use( - ng-if = "!AGC.showError && AGC.ahaGuide.isAddingFirstBranch()" + ng-if = "AGC.ahaGuide.isAddingFirstBranch()" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "!AGC.showError && AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( - ng-if = "AGC.showError" + ng-if = "AGC.errorState || AGC.showError" ) use( xlink:href = "#icons-alert-alt" diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js index abd723f5d..392e82798 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarDirective.js @@ -18,6 +18,8 @@ function ahaSidebar( $scope.getCurrentStep = ahaGuide.getCurrentStep; $scope.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; $scope.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; + $scope.isAddingFirstBranch = ahaGuide.isAddingFirstBranch; + $scope.getFurthestSubstep = ahaGuide.furthestSubstep; } }; } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index ed8654e71..43318fd37 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -77,8 +77,9 @@ ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-0': getCurrentStep() <= steps.ADD_FIRST_BRANCH,\ - 'aha-meter-100': getCurrentStep() > steps.ADD_FIRST_BRANCH\ + 'aha-meter-33': getFurthestSubstep() === 'addBranch',\ + 'aha-meter-66': isAddingFirstBranch() && getFurthestSubstep(steps.ADD_FIRST_BRANCH) === 'dockLoading',\ + 'aha-meter-100': getCurrentStep() > steps.ADD_FIRST_BRANCH\ }" ) svg.iconnables diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6564b5a9a..380478f4d 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -155,22 +155,27 @@ function ahaGuide( subSteps: { addBranch: { caption: 'Almost done! Click the + button next to a repo name to add a branch.', - className: 'aha-meter-33' + className: 'aha-meter-33', + value: 33 }, dockLoading: { caption: 'Hang tight!', - className: 'aha-meter-66' + className: 'aha-meter-66', + value: 66 }, dockLoaded: { caption: 'Continue to start configuring your project.', - className: 'aha-meter-100' + className: 'aha-meter-100', + value: 100 }, deletedTemplate: { caption: 'You\'ve deleted your repository template. Create another one to continue.', - className: 'aha-meter-20' + className: 'aha-meter-20', + value: -1 } }, - panelSteps: { } + panelSteps: { }, + defaultSubstep: 'addBranch' }; stepList[STEPS.SETUP_RUNNABOT] = { @@ -182,6 +187,34 @@ function ahaGuide( } }; + var cachedSubstep = {}; + +/** + * Furthest Substep getter/setter + * + * When setting the substep, the new subStep must have a value greater than the previous step to + * be updated + * + * @param step {Number} Which step to reference when looking at the substep + * @param newSubstep {String} new substep to go to + * @returns {String} substep currently on + */ + function furthestSubstep(step, newSubstep) { + if (arguments.length > 1) { + if (!cachedSubstep[step]) { + cachedSubstep[step] = newSubstep; + } else { + var newStepValue = keypather.get(stepList[step], 'subSteps.' + newSubstep + '.value'); + var oldSubstepValue = keypather.get(stepList[step], 'subSteps.' + cachedSubstep[step] + '.value'); + if (newStepValue === -1 || newStepValue > oldSubstepValue) { + // automatically allow switch when an error state + cachedSubstep[step] = newSubstep; + } + } + } + return cachedSubstep[step] || stepList[step].defaultSubstep; + } + var cachedStep; $rootScope.$watch(function () { cachedStep = null; @@ -233,6 +266,7 @@ function ahaGuide( isInGuide: isInGuide, hasConfirmedSetup: hasConfirmedSetup, updateCurrentOrg: updateCurrentOrg, + furthestSubstep: furthestSubstep, isChoosingOrg: function() { return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; }, diff --git a/test/unit/services/ahaGuideService.unit.js b/test/unit/services/ahaGuideService.unit.js new file mode 100644 index 000000000..dde85ef23 --- /dev/null +++ b/test/unit/services/ahaGuideService.unit.js @@ -0,0 +1,52 @@ +'use strict'; + +describe('ahaGuide'.bold.underline.blue, function () { + var ahaGuide; + function initState () { + + angular.mock.module('app'); + + angular.mock.inject(function (_ahaGuide_) { + ahaGuide = _ahaGuide_; + }); + } + beforeEach(initState); + + describe('furthestSubstep'.bold, function () { + describe('getter', function () { + it('should get the default if nothing is set', function () { + var result = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH); + expect(result).to.equal(ahaGuide.stepList[ahaGuide.steps.ADD_FIRST_BRANCH].defaultSubstep); + }); + it('should get the value given right before', function () { + var setResult = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH, 'dockLoaded'); + var result = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH); + expect(result).to.not.equal(ahaGuide.stepList[ahaGuide.steps.ADD_FIRST_BRANCH].defaultSubstep); + expect(result).to.equal(setResult); + expect(result).to.equal('dockLoaded'); + }); + }); + describe('setter', function () { + it('should set the value', function () { + ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH, 'dockLoaded'); + var result = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH); + expect(result).to.not.equal(ahaGuide.stepList[ahaGuide.steps.ADD_FIRST_BRANCH].defaultSubstep); + expect(result).to.equal('dockLoaded'); + }); + it('should not set the value to a substep that has a lower value', function () { + var result = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH, 'dockLoaded'); + expect(result).to.equal('dockLoaded'); + result = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH, 'dockLoading'); + expect(result).to.not.equal('dockLoading'); + expect(result).to.equal('dockLoaded'); + }); + it('should allow error states to overwrite anywhere', function () { + var result = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH, 'dockLoaded'); + expect(result).to.equal('dockLoaded'); + result = ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_BRANCH, 'deletedTemplate'); + expect(result).to.not.equal('dockLoaded'); + expect(result).to.equal('deletedTemplate'); + }); + }); + }); +}); From 2084671b558ecae0c94656f540b4d702c72a0076 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 16 Sep 2016 17:57:07 -0700 Subject: [PATCH 384/577] Fixed issue w/ multiple templates and error states --- client/controllers/controllerApp.js | 13 ------------- .../components/ahaGuide/AhaGuideController.js | 1 - .../components/ahaGuide/ahaGuideDirective.js | 2 +- .../components/ahaGuide/ahaGuideView.jade | 5 +++++ .../environment/environmentController.js | 19 +++++-------------- .../environment/environmentView.jade | 4 ++-- client/services/ahaGuideService.js | 3 +-- 7 files changed, 14 insertions(+), 33 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 877edf948..1751d245d 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -88,19 +88,6 @@ function ControllerApp( $rootScope.featureFlags = featureFlags.flags; $rootScope.resetFeatureFlags = featureFlags.reset; this.featureFlagsChanged = featureFlags.changed; - $rootScope.ahaGuide = {}; - var ahaGuideToggles = keypather.get($localStorage, 'ahaGuide.toggles'); - - if (!ahaGuideToggles) { - ahaGuideToggles = { - showAha: true, - exitedEarly: false, - showError: false - }; - keypather.set($localStorage, 'ahaGuide.ahaGuideToggles', ahaGuideToggles); - } - - $rootScope.ahaGuide.ahaGuideToggles = $localStorage.ahaGuide.ahaGuideToggles; $scope.$watch(function () { return errs.errors.length; diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 6febcd2b9..d5ebaacbf 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -35,7 +35,6 @@ function AhaGuideController( $scope.$on('exitedEarly', function(event, didExitEarly) { if (didExitEarly) { - AGC.errorState = true; buildLogListener(); updateCaption('exitedEarly'); } diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 6acf1832c..20a18ac64 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -18,7 +18,7 @@ function ahaGuide( scope: { subStep: '@', subStepIndex: '=?', - errorState: '=?' + errorState: '@?' } }; } diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 96287740a..2c028a7d4 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -8,6 +8,11 @@ ng-include = "'staticAhaGuideTemplates'" ) +.grid-block.align-center( + ng-if = "exitedEarly" + ng-include = "'staticAhaGuideTemplates'" +) + .grid-block.align-center( ng-if = "AGC.ahaGuide.isAddingFirstRepo()" ng-include = "'setUpRepositoryGuideView'" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 8c8f4752e..34f6bdeb5 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -23,7 +23,6 @@ function EnvironmentController( keypather, ModalService, pageName, - patchOrgMetadata, instancesByPod ) { var EC = this; @@ -37,15 +36,6 @@ function EnvironmentController( EC.toggleSidebar = function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; - patchOrgMetadata(currentOrg.poppa.id(), { - metadata: { - hasAha: true, - hasConfirmedSetup: false - } - }) - .then(function(updatedOrg) { - ahaGuide.updateCurrentOrg(updatedOrg); - }); }; EC.popoverActions = { showSidebar: EC.toggleSidebar, @@ -55,7 +45,7 @@ function EnvironmentController( $scope.$on('show-aha-sidebar', EC.toggleSidebar); $scope.$on('exitedEarly', function (event, didExitEarly) { - EC.showExitedEarly = didExitEarly; + EC.showErrorState = didExitEarly; if (!didExitEarly) { $rootScope.$broadcast('launchAhaNavPopover'); } @@ -126,11 +116,12 @@ function EnvironmentController( // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { - if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { + if (instance.status() === 'running' && instance.getRepoName() && isAddFirstRepo) { $rootScope.$broadcast('launchAhaNavPopover'); - } else if (isAddFirstRepo) { - EC.showExitedEarly = true; + } else { + EC.showErrorState = true; } + if (instance.hasDockerfileMirroring()) { return fetchDockerfileForContextVersion(instance.contextVersion) .then(function (dockerfile) { diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 1fff598de..9fd828b28 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -51,9 +51,9 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.showExitedEarly && data.instances.models.length" + ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.isAddingFirstRepo() && EC.showErrorState && data.instances.models.length" aha-guide - error-state = "EC.showExitedEarly" + error-state = "true" sub-step = 'exitedEarly' sub-step-index = 7 ) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index fff246ceb..a506df6f4 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -126,8 +126,7 @@ function ahaGuide( exitedEarly: { caption: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', className: 'aha-meter-80', - step: 7, - errorState: true + step: 7 }, success: { caption: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', From e789b8c6ce545df59d88b11d83753e3b24013780 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 16 Sep 2016 18:27:35 -0700 Subject: [PATCH 385/577] Add helper to know when the auto-launching aha popover should show --- client/controllers/controllerInstances.js | 1 + .../branchMenuPopover/introAddBranch.jade | 2 +- client/services/ahaGuideService.js | 18 +++++++++++++++++- .../templates/instances/viewInstancesList.jade | 6 +++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index af0b5afea..be772c633 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -27,6 +27,7 @@ function ControllerInstances( CIS.isInGuide = ahaGuide.isInGuide; CIS.isAddingFirstBranch = ahaGuide.isAddingFirstBranch; CIS.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; + CIS.isSettingUpAutoLaunch = ahaGuide.isSettingUpAutoLaunch; CIS.currentOrg = currentOrg; CIS.searchBranches = null; CIS.instanceBranches = null; diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade index eb4dcd9b8..c9ff79dd7 100644 --- a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -10,7 +10,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm( - ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isSettingUpRunnabot()" + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isSettingUpAutoLaunch()" aha-guide step-index = 3 sub-step = "addBranch" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6564b5a9a..896d93778 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -15,16 +15,27 @@ function ahaGuide( $rootScope, currentOrg, fetchInstancesByPod, + isRunnabotPartOfOrg, keypather ) { var instances = []; + var hasRunnabot = false; function refreshInstances() { return fetchInstancesByPod() .then(function (fetchedInstances) { instances = fetchedInstances.models; }); } + function refreshHasRunnabot() { + if (hasRunnabot) { return; } + return isRunnabotPartOfOrg(keypather.get(currentOrg, 'github.attrs.login')) + .then(function (runnabot) { + hasRunnabot = runnabot; + }); + } + refreshInstances(); + refreshHasRunnabot(); var stepList = {}; stepList[STEPS.CHOOSE_ORGANIZATION] = { @@ -188,6 +199,7 @@ function ahaGuide( }); $rootScope.$on('$stateChangeSuccess', function () { refreshInstances(); + refreshHasRunnabot(); }); function getCurrentStep() { if (!cachedStep) { @@ -195,6 +207,7 @@ function ahaGuide( cachedStep = STEPS.CHOOSE_ORGANIZATION; } else if (!$rootScope.featureFlags.aha || !isInGuide()) { cachedStep = STEPS.COMPLETED; + refreshHasRunnabot(); } else if (!hasConfirmedSetup()) { cachedStep = STEPS.ADD_FIRST_REPO; } else { @@ -243,7 +256,10 @@ function ahaGuide( return getCurrentStep() === STEPS.ADD_FIRST_BRANCH; }, isSettingUpRunnabot: function() { - return getCurrentStep() === STEPS.SETUP_RUNNABOT; + return getCurrentStep() === STEPS.SETUP_RUNNABOT && !hasRunnabot; }, + isSettingUpAutoLaunch: function() { + return getCurrentStep() === STEPS.SETUP_RUNNABOT && hasRunnabot; + } }; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index cf653218f..c0d51e829 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -85,7 +85,11 @@ p.p.text-center.text-gray-light.padding-sm( xlink:href = "#icons-arrow-down" ) .stepOneUncloseablePopover( - ng-if = "$root.featureFlags.aha && CIS.isInGuide() && $index === 0 && CIS.shouldShowParent(masterInstance) && (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)" + ng-if = "\ + $root.featureFlags.aha && CIS.isInGuide() && $index === 0 &&\ + CIS.shouldShowParent(masterInstance) && CIS.isSettingUpAutoLaunch()\ + (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)\ + " pop-over pop-over-active = "CIS.isPopoverOpen" pop-over-controller = "CIS" From cdf15d1f6a016b86418872063deacdcd6c7c853e Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 19:06:29 -0700 Subject: [PATCH 386/577] fix aha guide modal position --- client/assets/styles/scss/components/aha-modals.scss | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/client/assets/styles/scss/components/aha-modals.scss b/client/assets/styles/scss/components/aha-modals.scss index 9c0e82175..f7a87ef0c 100644 --- a/client/assets/styles/scss/components/aha-modals.scss +++ b/client/assets/styles/scss/components/aha-modals.scss @@ -23,15 +23,7 @@ } + .modal-dialog { - margin-top: 45px; - - @include media(lg) { - margin-top: 120px; - } - - @media (max-height: $screen-xs), (max-width: $screen-sm) { - margin-top: 120px; - } + margin-top: 120px; } .spinner-wrapper, From 02748c1bd6214fd792740086eb161873cc933717 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 19:35:13 -0700 Subject: [PATCH 387/577] add new step in milestone 2 --- .../styles/scss/layout/environment-header.scss | 12 ++++++------ .../viewEnvironmentHeader.jade | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/client/assets/styles/scss/layout/environment-header.scss b/client/assets/styles/scss/layout/environment-header.scss index 58c3e7cde..b64897332 100644 --- a/client/assets/styles/scss/layout/environment-header.scss +++ b/client/assets/styles/scss/layout/environment-header.scss @@ -16,13 +16,8 @@ } } - .btn-aha { - right: 0; - top: 3px; - } - // new server button - .green { + > .green { display: table; margin: 0 auto; @@ -54,4 +49,9 @@ } } } + + .btn-aha { + right: 0; + top: 3px; + } } diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 8d9470b8a..c326a27dc 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -9,6 +9,24 @@ button.grid-block.shrink.btn.btn-md.green( ) | Create Template +//- This is the same markup as the aha guide popover. Just stubbing out a new one here. +.popover.bottom.in.popover-aha( + style = "left: 0; margin: 0 auto; right: 0; top: 54px;" +) + .arrow.white + .popover-content + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide + .grid-block.shrink.aha-meter.js-animate.aha-meter-10 + svg.iconnables + use( + xlink:href = "#icons-octicons-repo" + ) + .grid-block.vertical.aha-text + p.p.small.text-gray-light Add a Repository + p.p To add a database or a service, click ‘Create Template’. + .grid-block.justify-right.popover-footer + button.grid-block.shrink.btn.btn-sm.green Got It + button.grid-block.shrink.btn.btn-sm.gray.btn-aha( ng-click = "EC.toggleSidebar()" ng-if = "$root.featureFlags.aha" From 9ad580cd9819b744159736cbf0857d7ff0e57b6f Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 19:36:44 -0700 Subject: [PATCH 388/577] remove "your first" copy from aha titles --- .../ahaGuide/addBranchGuide/addBranchGuideView.jade | 2 +- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 35a7f955f..ce88977bf 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -24,7 +24,7 @@ ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Add your First Branch + p.p.small.text-gray-light Add a Branch p.p( ng-if = "subStep === 'addBranch'" ) Click the ‘Add Branch’ button next to any repo name. diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index ed8654e71..e31040e2a 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -69,7 +69,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Add your First Repository + p.p.strong Add a Repository p.small Set up your project and get it running! .grid-block.shrink.align-center.padding-sm.aha-guide( @@ -91,7 +91,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Add your First Branch + p.p.strong Add a Branch p.small Your branches will update on every commit you make. .grid-block.vertical.align-center.form-github( From b05674c277669fb58aee8c1358fd55d7360cc01f Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 19:46:24 -0700 Subject: [PATCH 389/577] update aha titles --- .../environmentHeader/viewEnvironmentHeader.jade | 1 + client/services/ahaGuideService.js | 6 +++--- client/services/featureFlagService.js | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index c326a27dc..ec95fc49f 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -11,6 +11,7 @@ button.grid-block.shrink.btn.btn-md.green( //- This is the same markup as the aha guide popover. Just stubbing out a new one here. .popover.bottom.in.popover-aha( + ng-if = "$root.featureFlags.newMilestone2Step" style = "left: 0; margin: 0 auto; right: 0; top: 54px;" ) .arrow.white diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6564b5a9a..ac4637aa2 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -28,7 +28,7 @@ function ahaGuide( var stepList = {}; stepList[STEPS.CHOOSE_ORGANIZATION] = { - title: 'Create your Environment', + title: 'Choose your Organization', subSteps: { orgSelection: { caption: 'Choose an organization to create your sandbox for.', @@ -50,7 +50,7 @@ function ahaGuide( } }; stepList[STEPS.ADD_FIRST_REPO] = { - title: 'Add your First Repository', + title: 'Add a Repository', subSteps: { addRepository: { caption: 'Add a repository by clicking ‘Create Template’.', @@ -151,7 +151,7 @@ function ahaGuide( }; stepList[STEPS.ADD_FIRST_BRANCH] = { - title: 'Add your First Branch', + title: 'Add a Branch', subSteps: { addBranch: { caption: 'Almost done! Click the + button next to a repo name to add a branch.', diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 13e5d5ddd..ae316e321 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -37,8 +37,9 @@ function featureFlags( multilineStartCmd: false, multipleRepositoryContainers: false, // for adding multiple containers with the same repository navListFilter: false, - nextPayment: false, // show the next payment date under payment summary + newMilestone2Step: false, newUserPrompt: false, // modal for new users + nextPayment: false, // show the next payment date under payment summary noBuildLogs: true, optionsInModal: false, // allows delete in modal renameContainer: false, From 2ca2b4e02da928bd7d97999d41f8a704761ed987 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 19:50:55 -0700 Subject: [PATCH 390/577] add step count to milestones --- .../environmentHeader/viewEnvironmentHeader.jade | 2 +- client/services/ahaGuideService.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index ec95fc49f..7a6488f3e 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -23,7 +23,7 @@ button.grid-block.shrink.btn.btn-md.green( xlink:href = "#icons-octicons-repo" ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Add a Repository + p.p.small.text-gray-light Step 2: Add a Repository p.p To add a database or a service, click ‘Create Template’. .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green Got It diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index ac4637aa2..609090cd7 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -28,7 +28,7 @@ function ahaGuide( var stepList = {}; stepList[STEPS.CHOOSE_ORGANIZATION] = { - title: 'Choose your Organization', + title: 'Step 1: Choose your Organization', subSteps: { orgSelection: { caption: 'Choose an organization to create your sandbox for.', @@ -50,7 +50,7 @@ function ahaGuide( } }; stepList[STEPS.ADD_FIRST_REPO] = { - title: 'Add a Repository', + title: 'Step 2: Add a Repository', subSteps: { addRepository: { caption: 'Add a repository by clicking ‘Create Template’.', @@ -151,7 +151,7 @@ function ahaGuide( }; stepList[STEPS.ADD_FIRST_BRANCH] = { - title: 'Add a Branch', + title: 'Step 3: Add a Branch', subSteps: { addBranch: { caption: 'Almost done! Click the + button next to a repo name to add a branch.', From 3146499dc1da890c714d3a790b02779956d0865b Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 16 Sep 2016 20:05:24 -0700 Subject: [PATCH 391/577] add documentation link --- .../environment/modals/forms/formLogs/viewFormLogs.jade | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 6111b0222..fd5ca73ea 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -104,9 +104,13 @@ pre.pre.log-wrapper( ) small.grid-content.small //- If build error: - | Build problems? Sometimes rebuilding the container can resolve errors, otherwise inspect your build logs. + | Build problems? Sometimes rebuilding the container can resolve errors, otherwise inspect your build logs. //- IF CMD error: - //- | Your container is having trouble running. Check the CMD Logs and your CMD Command. + //- | Your container is having trouble running. Check the CMD Logs and your CMD Command. + a.link( + href = "https://support.runnable.com" + target = "_blank" + ) View Documentation button.grid-content.shrink.btn.btn-xs.orange( ng-click = "SMC.rebuild(true, true)" ) Rebuild From a0aadd9ebb0ba2e026bc67257b6ed1224c1c2888 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sat, 17 Sep 2016 15:44:56 -0700 Subject: [PATCH 392/577] Added web view toolbar tip for checking URL --- .../modals/forms/formLogs/viewFormLogs.jade | 10 +++------- .../setupMirrorServerModalController.js | 1 + .../modalSetupServer/setupServerModalController.js | 1 + client/services/featureFlagService.js | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 6111b0222..f1390b722 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -45,18 +45,14 @@ pre.pre.log-wrapper( ng-if = "SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" ) - .popover.bottom.padding-sm.popover-aha.popover-sm( - ng-class = "{\ - 'in': $root.featureFlags.ahaUrlPopover,\ - 'sans-serif': $root.featureFlags.ahaUrlPopover\ - }" - ng-if = "$root.featureFlags.ahaUrlPopover && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" + .popover.bottom.padding-sm.popover-aha.popover-sm.in.sans-serif( + ng-if = "SMC.showUrlToolbar && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" style = "left: 12px; top: 60px;" ) .arrow.white small.small.text-gray.float-left Use this URL to check out your application. button.btn.btn-xs.gray.float-right( - ng-click = "$root.featureFlags.ahaUrlPopover = false" + ng-click = "SMC.showUrlToolbar = false" ) Dismiss //- build logs page diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 406cac967..dfbd8845c 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -30,6 +30,7 @@ function SetupMirrorServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; + SMC.showUrlToolbar = SMC.isAddingFirstRepo(); var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index a1a62e6a2..5e20b6aa9 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -34,6 +34,7 @@ function SetupServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; + SMC.showUrlToolbar = SMC.isAddingFirstRepo(); var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 13e5d5ddd..944bfe907 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -9,7 +9,6 @@ function featureFlags( var defaultFeatureFlags = { addBranches: true, aha: false, - ahaUrlPopover: false, allowIsolatedUpdate: false, autoIsolation: false, autoIsolationSetup: false, From c8c81072ee085cb17ad7a509b5d550629c3129e3 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sat, 17 Sep 2016 16:46:09 -0700 Subject: [PATCH 393/577] Added new milestone 2 step --- .../activePanel/toolbar/toolbarDirective.js | 27 +++++++++++++++++++ .../environment/environmentController.js | 18 ++++++++----- .../viewEnvironmentHeader.jade | 15 ++++++----- .../environment/environmentView.jade | 2 +- client/services/featureFlagService.js | 1 - 5 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 client/directives/activePanel/toolbar/toolbarDirective.js diff --git a/client/directives/activePanel/toolbar/toolbarDirective.js b/client/directives/activePanel/toolbar/toolbarDirective.js new file mode 100644 index 000000000..a9cd0a278 --- /dev/null +++ b/client/directives/activePanel/toolbar/toolbarDirective.js @@ -0,0 +1,27 @@ +'use strict'; + +require('app') + .directive('toolbarDirective', toolbarDirective); + +function toolbarDirective( + +) { + return { + restrict: 'A', + scope: { + template: '= toolbarTemplate', + showToolbar: '=' + }, + link: function ($scope, elem, attrs) { + if (!$scope.template) { + // Check if the string is set by checking the attrs + if (attrs.toolbarTemplate) { + $scope.template = attrs.toolbarTemplate; + } else { + return $log.error('Toolbar needs a template'); + } + } + $scope.showToolbar = true; + } + }; +} diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index e50941e6a..bf18ccf76 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -32,11 +32,6 @@ function EnvironmentController( EC.isInGuide = ahaGuide.isInGuide; EC.showCreateTemplate = true; EC.showOverview = true; - EC.toggleSidebar = function () { - EC.showSidebar = !EC.showSidebar; - EC.showCreateTemplate = true; - }; - $scope.$on('show-aha-sidebar', EC.toggleSidebar); $scope.$on('exitedEarly', function (event, didExitEarly) { EC.showExitedEarly = didExitEarly; @@ -111,7 +106,7 @@ function EnvironmentController( // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { - $rootScope.$broadcast('launchAhaNavPopover'); + EC.showAddServicePopover = true; } if (instance.hasDockerfileMirroring()) { return fetchDockerfileForContextVersion(instance.contextVersion) @@ -158,7 +153,18 @@ function EnvironmentController( subTab: 'billingForm' } }); + }, + toggleSidebar: function () { + EC.showSidebar = !EC.showSidebar; + EC.showCreateTemplate = true; + }, + createTemplate: function() { + EC.showAddServicePopover = false; + EC.triggerModal.newContainer(); } }; + + $scope.$on('show-aha-sidebar', EC.actions.toggleSidebar); + } diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 7a6488f3e..dc4657370 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -1,7 +1,7 @@ //- new server button button.grid-block.shrink.btn.btn-md.green( ng-class = "{ 'scale-in-modal': EC.isAddingFirstRepo() }" - ng-click = "EC.triggerModal.newContainer()" + ng-click = "EC.actions.createTemplate()" ) svg.iconnables.icons-add.float-left use( @@ -9,27 +9,28 @@ button.grid-block.shrink.btn.btn-md.green( ) | Create Template -//- This is the same markup as the aha guide popover. Just stubbing out a new one here. .popover.bottom.in.popover-aha( - ng-if = "$root.featureFlags.newMilestone2Step" + ng-if = "$root.featureFlags.aha && EC.showAddServicePopover" style = "left: 0; margin: 0 auto; right: 0; top: 54px;" ) .arrow.white .popover-content .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide - .grid-block.shrink.aha-meter.js-animate.aha-meter-10 + .grid-block.shrink.aha-meter.js-animate.aha-meter-100 svg.iconnables use( - xlink:href = "#icons-octicons-repo" + xlink:href = "#icons-check" ) .grid-block.vertical.aha-text p.p.small.text-gray-light Step 2: Add a Repository p.p To add a database or a service, click ‘Create Template’. .grid-block.justify-right.popover-footer - button.grid-block.shrink.btn.btn-sm.green Got It + button.grid-block.shrink.btn.btn-sm.green( + ng-click = "EC.showAddServicePopover = false" + ) Got It button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "EC.toggleSidebar()" + ng-click = "EC.actions.toggleSidebar()" ng-if = "$root.featureFlags.aha" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 2f2db42d4..afb0bf7f7 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -97,7 +97,7 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar - toggle-sidebar = "EC.toggleSidebar" + toggle-sidebar = "EC.actions.toggleSidebar" show-overview = "!EC.showCreateTemplate" ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.showSidebar" ) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index af2ffc760..1a2b7ca9b 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -36,7 +36,6 @@ function featureFlags( multilineStartCmd: false, multipleRepositoryContainers: false, // for adding multiple containers with the same repository navListFilter: false, - newMilestone2Step: false, newUserPrompt: false, // modal for new users nextPayment: false, // show the next payment date under payment summary noBuildLogs: true, From b57ee320781ffff12d401be49b4d4d3f917476a3 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sat, 17 Sep 2016 18:49:40 -0700 Subject: [PATCH 394/577] Refactored to make better use of events and broadcasts. Made aha-guide always open on template page --- .../styles/scss/components/aha-guide.scss | 15 +++++- .../components/ahaGuide/AhaGuideController.js | 50 +++++++++++++++---- .../components/ahaGuide/ahaGuideDirective.js | 4 +- .../components/ahaGuide/ahaGuideView.jade | 5 -- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 - .../components/createSandboxGuideView.jade | 4 +- .../setUpRepositoryGuideView.jade | 21 ++++---- .../environment/environmentController.js | 17 +++---- .../environment/environmentView.jade | 26 +++++----- client/services/ahaGuideService.js | 17 ------- 10 files changed, 90 insertions(+), 71 deletions(-) diff --git a/client/assets/styles/scss/components/aha-guide.scss b/client/assets/styles/scss/components/aha-guide.scss index a8bf7f321..a8bf7a48b 100644 --- a/client/assets/styles/scss/components/aha-guide.scss +++ b/client/assets/styles/scss/components/aha-guide.scss @@ -1,3 +1,16 @@ +.environment-view-aha-guide { + > .aha-guide { + margin: 0 auto 15px; + max-width: 450px; + + .p-slide { + font-size: 15px; + position: relative; + top: 0; + } + } +} + .aha-guide { color: $gray; overflow: hidden; @@ -182,4 +195,4 @@ position: absolute; height: 100%; width: 100%; -} \ No newline at end of file +} diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index d5ebaacbf..e7c738917 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -16,8 +16,24 @@ function AhaGuideController( ) { var AGC = this; var animatedPanelListener = angular.noop; - - AGC.instances = null; + if (keypather.has(currentOrg, 'poppa.attrs.id')) { + fetchInstancesByPod() + .then(function (instances) { + instances.forEach(function (instance) { + var repoName = instance.getRepoName(); + if (instance.status() === 'running' && repoName) { + $rootScope.$broadcast('launchAhaNavPopover'); + } else if (repoName){ + AGC.showError = true; + AGC.errorState = 'nonRunningContainer'; + $rootScope.$broadcast('ahaGuideError', { + cause: AGC.errorState + }); + } + }) + }) + .catch(errs.handler); + } var alertListener = $scope.$on('alert', function (event, alert) { // alerts on container creation success @@ -33,10 +49,20 @@ function AhaGuideController( } }); - $scope.$on('exitedEarly', function(event, didExitEarly) { - if (didExitEarly) { - buildLogListener(); + $scope.$on('ahaGuideError', function(event, info) { + if (info.cause === 'exitedEarly') { + AGC.showError = true; + AGC.errorState = info.cause; updateCaption('exitedEarly'); + } else if (info.cause === 'nonRunningContainer') { + AGC.showError = true; + AGC.errorState = info.cause; + } else if (info.cause === 'buildFailed') { + AGC.showError = true; + AGC.errorState = info.cause; + } else if (info.isClear) { + AGC.showError = false; + AGC.errorState = null; } }); @@ -69,21 +95,25 @@ function AhaGuideController( animatedPanelListener(); } AGC.subStep = status; - AGC.subStepIndex = currentMilestone.subSteps[status].step; - AGC.caption = currentMilestone.subSteps[status].caption; AGC.className = currentMilestone.subSteps[status].className; + AGC.subStepIndex = currentMilestone.subSteps[status].step; } function handleBuildUpdate(update) { var buildStatus = update.status; if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { AGC.showError = true; + $rootScope.$broadcast('ahaGuideError', { + cause: 'buildFailed' + }); } else if (buildStatus === 'starting') { AGC.showError = false; } else if (buildStatus === 'running') { AGC.isBuildSuccessful = true; updateCaption('success'); - $rootScope.$broadcast('exitedEarly', false); + $rootScope.$broadcast('ahaGuideError', { + isClear: true + }); } AGC.buildStatus = buildStatus; AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; @@ -92,7 +122,9 @@ function AhaGuideController( $scope.$on('$destroy', function () { animatedPanelListener(); if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { - $rootScope.$broadcast('exitedEarly', true); + $rootScope.$broadcast('ahaGuideError', { + cause: 'exitedEarly' + }); } }); diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index 20a18ac64..eb072d04e 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -16,9 +16,9 @@ function ahaGuide( controllerAs: 'AGC', bindToController: true, scope: { - subStep: '@', + subStep: '@?', subStepIndex: '=?', - errorState: '@?' + errorState: '=?' } }; } diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 2d3bb7ab4..4bae2663d 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -8,11 +8,6 @@ ng-include = "'staticAhaGuideTemplates'" ) -.grid-block.align-center( - ng-if = "exitedEarly" - ng-include = "'staticAhaGuideTemplates'" -) - .grid-block.align-center( ng-if = "AGC.ahaGuide.isAddingFirstRepo()" ng-include = "'setUpRepositoryGuideView'" diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index ed8654e71..617d1d36b 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -54,8 +54,6 @@ ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-error': $root.ahaGuide.ahaGuideToggles.showError,\ - 'aha-meter-70': $root.ahaGuide.ahaGuideToggles.exitedEarly,\ 'aha-meter-100': getCurrentStep() > steps.ADD_FIRST_REPO\ }" ) diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index b19235d96..db67e2d3d 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -5,11 +5,11 @@ ) svg.iconnables use( - ng-if = "$root.featureFlags.aha && AGC.subStep !== 'dockLoaded'" + ng-if = "AGC.subStep !== 'dockLoaded'" xlink:href = "#icons-cog" ) use( - ng-if = "$root.featureFlags.aha && AGC.subStep === 'dockLoaded'" + ng-if = "AGC.subStep === 'dockLoaded'" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 066cdb598..41f84d1b5 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -79,14 +79,6 @@ ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" ) We‘re building! Build time varies depending on your template. - p.p( - ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.subStep === 'exitedEarly'" - ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, - a.link( - ng-click = "askEngineers()" - ) ask our engineers - | ! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" @@ -97,13 +89,22 @@ .grid-block.vertical.aha-text( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 6" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 5" ) p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.errorState === 'buildFailed'" ) Uh oh, there was a build error! Inspect your logs for debug info. + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "$root.featureFlags.aha && AGC.isInGuide() && (AGC.errorState === 'nonRunningContainer' || AGC.subStep === 'exitedEarly')" + ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, + a.link( + ng-click = "askEngineers()" + ) ask our engineers + | ! + .grid-block.vertical.aha-text( class = "{{ AGC.className }}" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 34f6bdeb5..6dc9e740b 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -43,13 +43,14 @@ function EnvironmentController( }; $scope.$on('show-aha-sidebar', EC.toggleSidebar); - - $scope.$on('exitedEarly', function (event, didExitEarly) { - EC.showErrorState = didExitEarly; - if (!didExitEarly) { + $scope.$on('ahaGuideError', function(event, info) { + if (info.isClear) { + EC.errorState = null; $rootScope.$broadcast('launchAhaNavPopover'); + } else { + EC.errorState = info.cause; } - }); + }) var unbindUpdateTeammateInvitation = $rootScope.$on('updateTeammateInvitations', function (event, invitesCreated) { if (invitesCreated) { @@ -116,12 +117,6 @@ function EnvironmentController( // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { - if (instance.status() === 'running' && instance.getRepoName() && isAddFirstRepo) { - $rootScope.$broadcast('launchAhaNavPopover'); - } else { - EC.showErrorState = true; - } - if (instance.hasDockerfileMirroring()) { return fetchDockerfileForContextVersion(instance.contextVersion) .then(function (dockerfile) { diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 9fd828b28..bdbd212f2 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -50,20 +50,22 @@ ng-if = "!EC.isInGuide() || EC.showCreateTemplate" ) - .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.isAddingFirstRepo() && EC.showErrorState && data.instances.models.length" - aha-guide - error-state = "true" - sub-step = 'exitedEarly' - sub-step-index = 7 + .environment-view-aha-guide( + ng-if = "$root.featureFlags.aha && EC.isInGuide()" ) + .grid-block.align-center.justify-center.padding-sm.aha-guide( + ng-show = "EC.isAddingFirstRepo() && EC.errorState && data.instances.models.length" + aha-guide + error-state = "EC.errorState" + sub-step-index = 7 + ) - .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.isInGuide() && !EC.isAddingFirstRepo() && !data.instances.models.length" - aha-guide - error-state = "true" - sub-step = "deletedTemplate" - ) + .grid-block.align-center.justify-center.padding-sm.aha-guide( + ng-if = "$root.featureFlags.aha && EC.isInGuide() && !EC.isAddingFirstRepo() && !data.instances.models.length" + aha-guide + error-state = "deletedTemplate" + sub-step = "deletedTemplate" + ) .grid-block.environment-body.justify-center.clearfix( ng-class = "{'align-center justify-center': EC.showCreateTemplate && !data.instances.models.length}" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index a506df6f4..d34247200 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -54,87 +54,70 @@ function ahaGuide( title: 'Add your First Repository', subSteps: { addRepository: { - caption: 'Add a repository by clicking ‘Create Template’.', className: 'aha-meter-10', step: 0 }, containerSelection: { - caption: 'Select a repository to configure.', className: 'aha-meter-20', step: 1 }, dockerfileMirroring: { - caption: 'How would you like to configure your repo?', className: 'aha-meter-30', step: 2 }, nameContainer: { - caption: 'Give your configuration a name.', className: 'aha-meter-40', step: 3 }, repository: { - caption: 'What does your repository run?', className: 'aha-meter-50', step: 4 }, commands: { - caption: 'Choose commands and packages.', className: 'aha-meter-60', step: 5 }, buildfiles: { - caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, default: { - caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, env: { - caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, files: { - caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, filesMirror: { - caption: 'We’ve imported your dockerfile, click ‘Save & Build’ to build it!', className: 'aha-meter-70', step: 6 }, ports: { - caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, translation: { - caption: 'If your app needs additional configuration…', className: 'aha-meter-70', step: 6 }, logs: { - caption: 'We‘re building! Build time varies depending on your template.', className: 'aha-meter-80', step: 7 }, exitedEarly: { - caption: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', className: 'aha-meter-80', step: 7 }, success: { - caption: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', className: 'aha-meter-90', step: 8 }, complete: { - caption: 'Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches.', className: 'aha-meter-100', step: 9 } From f8932025ead50226d43ad148ad5c21297e6e930f Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 15:54:01 -0700 Subject: [PATCH 395/577] Fixed lint errors --- client/directives/components/ahaGuide/AhaGuideController.js | 2 +- client/directives/environment/environmentController.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index e7c738917..018cecb31 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -30,7 +30,7 @@ function AhaGuideController( cause: AGC.errorState }); } - }) + }); }) .catch(errs.handler); } diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 6dc9e740b..b1097538d 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -50,7 +50,7 @@ function EnvironmentController( } else { EC.errorState = info.cause; } - }) + }); var unbindUpdateTeammateInvitation = $rootScope.$on('updateTeammateInvitations', function (event, invitesCreated) { if (invitesCreated) { From 18cf7751ec583d4f3145307da6159e5bbbec40db Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sun, 18 Sep 2016 16:12:30 -0700 Subject: [PATCH 396/577] fix tests by stubbing out isRunnablePartOfOrg (Maybe I should actually stub out AhaGuide? I wasn't sure if it's logic was being used or not) --- test/unit/controllers/controllerApp.unit.js | 5 +++++ test/unit/controllers/controllerInstances.unit.js | 5 +++++ .../controllers/setupMirrorServerModalController.unit.js | 5 +++++ test/unit/controllers/setupServerModalController.unit.js | 6 ++++++ 4 files changed, 21 insertions(+) diff --git a/test/unit/controllers/controllerApp.unit.js b/test/unit/controllers/controllerApp.unit.js index 3e52ef5d0..43cdc89a4 100644 --- a/test/unit/controllers/controllerApp.unit.js +++ b/test/unit/controllers/controllerApp.unit.js @@ -16,6 +16,7 @@ describe('controllerApp'.bold.underline.blue, function () { var mockLocalStorage; var mockCurrentOrg; var showModalStub; + var isRunnabotPartOfOrgStub; var mockFeatureFlags; function createMasterPods() { ctx.masterPods = runnable.newInstances( @@ -88,6 +89,10 @@ describe('controllerApp'.bold.underline.blue, function () { $provide.value('ModalService', { showModal: showModalStub }); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); $provide.value('featureFlags', mockFeatureFlags); $provide.value('currentOrg', mockCurrentOrg); }); diff --git a/test/unit/controllers/controllerInstances.unit.js b/test/unit/controllers/controllerInstances.unit.js index 45a271c67..d99a8da7d 100644 --- a/test/unit/controllers/controllerInstances.unit.js +++ b/test/unit/controllers/controllerInstances.unit.js @@ -11,6 +11,7 @@ var $controller, promisify, mockOrg, currentOrg; +var isRunnabotPartOfOrgStub; var apiMocks = require('../apiMocks/index'); var mockFetch = new (require('../fixtures/mockFetch'))(); var runnable = window.runnable; @@ -105,6 +106,10 @@ describe('ControllerInstances'.bold.underline.blue, function () { $provide.value('user', ctx.fakeuser); $provide.value('activeAccount', ctx.fakeuser); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); $provide.factory('setLastOrg', function ($q) { return sinon.stub().returns($q.when()); diff --git a/test/unit/controllers/setupMirrorServerModalController.unit.js b/test/unit/controllers/setupMirrorServerModalController.unit.js index 59d600f56..0caeb0230 100644 --- a/test/unit/controllers/setupMirrorServerModalController.unit.js +++ b/test/unit/controllers/setupMirrorServerModalController.unit.js @@ -45,6 +45,7 @@ describe('setupMirrorServerModalController'.bold.underline.blue, function () { var populateDockerfileStub; var fetchDockerfileFromSourceStub; var fetchInstancesByPodStub; + var isRunnabotPartOfOrgStub; var closeSpy; var showModalStub; var closeModalStub; @@ -93,6 +94,10 @@ describe('setupMirrorServerModalController'.bold.underline.blue, function () { updateDockerfileFromStateStub = sinon.stub().returns($q.when(dockerfile)); return updateDockerfileFromStateStub; }); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); $provide.factory('createAndBuildNewContainer', createAndBuildNewContainerMock.fetch()); $provide.factory('repositoryFormDirective', function () { return { diff --git a/test/unit/controllers/setupServerModalController.unit.js b/test/unit/controllers/setupServerModalController.unit.js index 1db5f5eb4..b682f7242 100644 --- a/test/unit/controllers/setupServerModalController.unit.js +++ b/test/unit/controllers/setupServerModalController.unit.js @@ -43,6 +43,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { var updateDockerfileFromStateStub; var fetchDockerfileFromSourceStub; var fetchInstancesByPodStub; + var isRunnabotPartOfOrgStub; var closeSpy; var showModalStub; var closeModalStub; @@ -114,6 +115,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { fetchInstancesByPodStub = sinon.stub().returns($q.when(instances)); return fetchInstancesByPodStub; }); + $provide.factory('updateDockerfileFromState', function ($q) { updateDockerfileFromStateStub = sinon.stub().returns($q.when(dockerfile)); return updateDockerfileFromStateStub; @@ -122,6 +124,10 @@ describe('setupServerModalController'.bold.underline.blue, function () { fetchRepoDockerfilesStub = sinon.stub().returns($q.when([dockerfile])); return fetchRepoDockerfilesStub; }); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); $provide.factory('createAndBuildNewContainer', createAndBuildNewContainerMock.fetch()); $provide.factory('repositoryFormDirective', function () { return { From 85b9444c8b5c0e21ffc2f3127a6c0db5e1ee24d3 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sun, 18 Sep 2016 16:42:05 -0700 Subject: [PATCH 397/577] Check if any of the instances already have auto-launch. If they do, set to completed --- client/services/ahaGuideService.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 6564b5a9a..405ba26d8 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -199,11 +199,18 @@ function ahaGuide( cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched - var hasBranchLaunched = instances.some(function (instance) { - return instance.attrs.hasAddedBranches; + var hasBranchLaunched = false; + var hasAutoLaunch = false; + instances.some(function (instance) { + hasBranchLaunched = hasBranchLaunched || instance.attrs.hasAddedBranches; + hasAutoLaunch = hasAutoLaunch || !instance.attrs.shouldNotAutofork; + // This will short circuit once we have found both of these true + return hasAutoLaunch && hasBranchLaunched; }); if (hasBranchLaunched) { cachedStep = STEPS.SETUP_RUNNABOT; + } else if (hasAutoLaunch) { + cachedStep = STEPS.COMPLETED; } else { cachedStep = STEPS.ADD_FIRST_BRANCH; } From 4488c0a500cee01747661e5fb48b2d405ea6c71a Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 17:11:33 -0700 Subject: [PATCH 398/577] Addressed PR comments, cleaned up SVG iconnable issue --- .../components/ahaGuide/AhaGuideController.js | 2 +- .../ahaGuide/addBranchGuide/addBranchGuideView.jade | 10 ++++++---- .../components/ahaGuide/ahaGuideDirective.js | 2 +- client/directives/environment/environmentView.jade | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 018cecb31..a5353773d 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -16,7 +16,7 @@ function AhaGuideController( ) { var AGC = this; var animatedPanelListener = angular.noop; - if (keypather.has(currentOrg, 'poppa.attrs.id')) { + if (keypather.has(currentOrg, 'poppa.attrs.id') && ahaGuide.isAddingFirstRepo()) { fetchInstancesByPod() .then(function (instances) { instances.forEach(function (instance) { diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 35a7f955f..484d7c765 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -6,13 +6,15 @@ 'aha-meter-100': AGC.ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) - svg.iconnables + svg.iconnables( + ng-if = "!AGC.showError" + ) use( - ng-if = "!AGC.showError && AGC.ahaGuide.isAddingFirstBranch()" + ng-if = "AGC.ahaGuide.isAddingFirstBranch()" xlink:href = "#icons-octicons-branch" ) use( - ng-if = "!AGC.showError && AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" + ng-if = "AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_BRANCH" xlink:href = "#icons-check" ) @@ -34,4 +36,4 @@ //- show in the branch menu if the repository has no branches. p.p( ng-if = "subStep === 'deletedTemplate'" - ) You've deleted your repository template. Create another one to continue. \ No newline at end of file + ) You've deleted your repository template. Create another one to continue. diff --git a/client/directives/components/ahaGuide/ahaGuideDirective.js b/client/directives/components/ahaGuide/ahaGuideDirective.js index eb072d04e..86fd00e14 100644 --- a/client/directives/components/ahaGuide/ahaGuideDirective.js +++ b/client/directives/components/ahaGuide/ahaGuideDirective.js @@ -18,7 +18,7 @@ function ahaGuide( scope: { subStep: '@?', subStepIndex: '=?', - errorState: '=?' + errorState: '@?' } }; } diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index bdbd212f2..19ed28f6b 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -61,9 +61,9 @@ ) .grid-block.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && EC.isInGuide() && !EC.isAddingFirstRepo() && !data.instances.models.length" + ng-if = "EC.isInGuide() && !EC.isAddingFirstRepo() && !data.instances.models.length" aha-guide - error-state = "deletedTemplate" + error-state = "EC.errorState" sub-step = "deletedTemplate" ) From b0a5572ad35308524f296f38224ee19550ac3151 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sun, 18 Sep 2016 17:12:23 -0700 Subject: [PATCH 399/577] full-repo was undefined --- .../components/mirrorDockerfile/mirrorDockerfileView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index 0fd830fb5..f1f47e75e 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -113,7 +113,7 @@ small.grid-block.shrink.align-center.small.text-gray.padding-xxs( .grid-block.vertical.shrink.well.gray.padding-sm.well-add-dockerfile( add-dockerfile branch-name = "MDC.branchName" - full-repo = "MDC.fullRepo" + full-repo = "MDC.getFullRepo()" ng-if = "viewState.showAddDockerfile" view-state = "viewState" ) From 835ca48787d2a8d8996fe5ebb04a242472ea0706 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sun, 18 Sep 2016 17:22:59 -0700 Subject: [PATCH 400/577] 4.21.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 453f63b74..501863a01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.2", + "version": "4.21.3", "private": true, "description": "Frontend for Runnable.io", "scripts": { From acbe883cc9abbed69c62357e252ff79f71e267a4 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 17:43:08 -0700 Subject: [PATCH 401/577] Removed unneeded root.featureflag.aha checks and unused template --- .../setUpRepositoryGuideView.jade | 28 +++++++++---------- .../addBranchAhaPopoverView.jade | 7 ----- 2 files changed, 14 insertions(+), 21 deletions(-) delete mode 100644 client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 41f84d1b5..890662083 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -45,60 +45,60 @@ p.p.small.text-gray-light {{ AGC.title }} p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'addRepository'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'addRepository'" ) Add your repository by clicking ‘Create Template’. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'containerSelection'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'containerSelection'" ) Select a repository to configure. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" ) How would you like to configure your repo? p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" ) Give your configuration a name. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'repository'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'repository'" ) What does your repository run? p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'commands'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'commands'" ) Choose commands and packages. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" + ng-if = "AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" ) If your app needs additional configuration… p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" ) We’ve imported your dockerfile, click ‘Save & Build’ to build it! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" ) We‘re building! Build time varies depending on your template. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. .grid-block.vertical.aha-text( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 5" + ng-if = "AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 5" ) p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.errorState === 'buildFailed'" + ng-if = "AGC.isInGuide() && AGC.showError && AGC.errorState === 'buildFailed'" ) Uh oh, there was a build error! Inspect your logs for debug info. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && (AGC.errorState === 'nonRunningContainer' || AGC.subStep === 'exitedEarly')" + ng-if = "AGC.isInGuide() && (AGC.errorState === 'nonRunningContainer' || AGC.subStep === 'exitedEarly')" ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, a.link( ng-click = "askEngineers()" diff --git a/client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade b/client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade deleted file mode 100644 index 6fc125ee3..000000000 --- a/client/directives/popovers/addBranchAhaPopover/addBranchAhaPopoverView.jade +++ /dev/null @@ -1,7 +0,0 @@ -.popover.right.popover-add-branches( - ng-class = "{'in': active}" - ng-style = "popoverStyle.getStyle()" -) - .grid-block( - ng-include = "'ahaPopoverView'" - ) From 9b06d2b9590fb3e95897a554de685ec04f179f7c Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 17:45:26 -0700 Subject: [PATCH 402/577] 4.21.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 501863a01..b168537a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.3", + "version": "4.21.4", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 1cbd14226e760df6d351191492338cc3ef0ace9d Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 18:03:22 -0700 Subject: [PATCH 403/577] Added SMC method to editServerModalController --- .../modals/modalEditServer/editServerModalController.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/environment/modals/modalEditServer/editServerModalController.js b/client/directives/environment/modals/modalEditServer/editServerModalController.js index 858490714..f870b7fb7 100644 --- a/client/directives/environment/modals/modalEditServer/editServerModalController.js +++ b/client/directives/environment/modals/modalEditServer/editServerModalController.js @@ -32,6 +32,7 @@ function EditServerModalController( 'enableMirrorMode': parentController.enableMirrorMode.bind(SMC), 'getNumberOfOpenTabs': parentController.getNumberOfOpenTabs.bind(SMC), 'getUpdatePromise': parentController.getUpdatePromise.bind(SMC), + 'hasOpenPorts': parentController.hasOpenPorts.bind(SMC), 'insertHostName': parentController.insertHostName.bind(SMC), 'isDirty': parentController.isDirty.bind(SMC), 'openDockerfile': parentController.openDockerfile.bind(SMC), From c6800742a3f36490deb09c89cd680b3b13c34d0a Mon Sep 17 00:00:00 2001 From: sundippatel Date: Sun, 18 Sep 2016 18:15:03 -0700 Subject: [PATCH 404/577] Stop unique events when user clicks buttons. Segment is complaining about us sending them too many unique events, which we're sending because we include the name of the button the user clicks on in the event name. --- client/services/serviceEventTracking.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 94af19857..76158191e 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -311,7 +311,7 @@ EventTracking.prototype.trackClicked = function (data) { var self = this; self._mixpanel('track', 'clicked - ' + _keypather.get(data, 'text'), data); self.analytics.ready(function () { - self.analytics.track('Clicked - ' + _keypather.get(data, 'text'), data); + self.analytics.track('Click', data); }); return self; }; From 5b71cbf3cbe9c4aba49c8427629773ddddd91f05 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Sun, 18 Sep 2016 18:38:36 -0700 Subject: [PATCH 405/577] 4.21.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b168537a8..309cb9c98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.4", + "version": "4.21.5", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 20b91c406640682c1069800a69b39bed633aaed0 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 18:49:02 -0700 Subject: [PATCH 406/577] Added argument to getFurthestStep call and ensured that no progress is shown for milestone that hasn't started --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 43318fd37..cb2dec3bc 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -77,7 +77,7 @@ ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-33': getFurthestSubstep() === 'addBranch',\ + 'aha-meter-33': isAddingFirstBranch() && getFurthestSubstep(steps.ADD_FIRST_BRANCH) === 'addBranch',\ 'aha-meter-66': isAddingFirstBranch() && getFurthestSubstep(steps.ADD_FIRST_BRANCH) === 'dockLoading',\ 'aha-meter-100': getCurrentStep() > steps.ADD_FIRST_BRANCH\ }" From 8b8e87d5a91fe5b86036e6481d741c5265fff55d Mon Sep 17 00:00:00 2001 From: runnabro Date: Sun, 18 Sep 2016 19:12:24 -0700 Subject: [PATCH 407/577] remove aha feature flags --- .../setUpRepositoryGuideView.jade | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 0588eb0d9..9ea4852df 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -40,48 +40,48 @@ ) .grid-block.vertical.aha-text( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.ahaGuide.isAddingFirstRepo()" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.ahaGuide.isAddingFirstRepo()" ) p.p.small.text-gray-light {{ AGC.title }} p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'addRepository'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'addRepository'" ) Add your repository by clicking ‘Create Template’. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'containerSelection'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'containerSelection'" ) Select a repository to configure. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" ) How would you like to configure your repo? p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" ) Give your configuration a name. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'repository'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'repository'" ) What does your repository run? p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'commands'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'commands'" ) Choose commands and packages. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" + ng-if = "AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" ) If your app needs additional configuration… p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" ) We’ve imported your dockerfile, click ‘Save & Build’ to build it! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" ) We‘re building! Build time varies depending on your template. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'exitedEarly'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'exitedEarly'" ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, a.link( ng-click = "askEngineers()" @@ -89,31 +89,31 @@ | ! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "($root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success') || (AGC.subStep === 8 && !AGC.showError)" + ng-if = "(AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success') || (AGC.subStep === 8 && !AGC.showError)" ) Your build finished! Check that it looks good, then click ‘Done’. p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. .grid-block.vertical.aha-text( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 6" + ng-if = "AGC.isInGuide() && AGC.showError && AGC.subStepIndex > 6" ) p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" + ng-if = "AGC.isInGuide() && !AGC.showError" ) {{ AGC.caption }} p.p( - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && AGC.showError" + ng-if = "AGC.isInGuide() && AGC.showError" ) Uh oh, there was a build error! Inspect your logs for debug info. .grid-block.vertical.aha-text( class = "{{ AGC.className }}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError && !AGC.ahaGuide.isAddingFirstRepo()" + ng-if = "AGC.isInGuide() && !AGC.showError && !AGC.ahaGuide.isAddingFirstRepo()" ) p.p.small.text-gray-light {{ AGC.title }} p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "$root.featureFlags.aha && AGC.isInGuide() && !AGC.showError" + ng-if = "AGC.isInGuide() && !AGC.showError" ) Choose a template to configure. From c1feab573560bed12909e50df677223ba38de025 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 19:15:44 -0700 Subject: [PATCH 408/577] 4.21.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 309cb9c98..d7ffdb3b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.5", + "version": "4.21.6", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 7c5050165d5642c4c5261c15ae5493d11e3c7ce3 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 19:20:03 -0700 Subject: [PATCH 409/577] 4.21.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d7ffdb3b7..7fd7dc443 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.6", + "version": "4.21.7", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 777f923537b99a08d0137cbe716eecd316bddbd4 Mon Sep 17 00:00:00 2001 From: runnabro Date: Sun, 18 Sep 2016 19:35:04 -0700 Subject: [PATCH 410/577] remove not needed sub step --- .../ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 7938b15ad..85cfc0640 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -89,7 +89,7 @@ | ! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "(AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success') || (AGC.subStep === 8 && !AGC.showError)" + ng-if = "(AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success') || !AGC.showError" ) Your build finished! Check that it looks good, then click ‘Done’. p.p( ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" From 25fe3888841e0823aba0fae698af9908627ef702 Mon Sep 17 00:00:00 2001 From: runnabro Date: Sun, 18 Sep 2016 19:40:47 -0700 Subject: [PATCH 411/577] fix dismiss button at xxs --- client/assets/styles/scss/components/aha-popover.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index 46ce6b71a..efd2d2948 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -23,6 +23,12 @@ .float-left + .float-right { margin-left: 15px; + + @include media(xxs) { + float: left; + margin-left: 0; + margin-top: 3px; + } } } From f59cf531aef7818a60a14216900404b2cbda791b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 20:33:58 -0700 Subject: [PATCH 412/577] Added reset eutton and proper toggling of popovers --- .../activePanel/toolbar/toolbarDirective.js | 27 ---------- .../components/ahaGuide/AhaGuideController.js | 54 +++++++++++++++---- .../setUpRepositoryGuideView.jade | 4 -- .../environment/environmentController.js | 21 ++++---- 4 files changed, 56 insertions(+), 50 deletions(-) delete mode 100644 client/directives/activePanel/toolbar/toolbarDirective.js diff --git a/client/directives/activePanel/toolbar/toolbarDirective.js b/client/directives/activePanel/toolbar/toolbarDirective.js deleted file mode 100644 index a9cd0a278..000000000 --- a/client/directives/activePanel/toolbar/toolbarDirective.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -require('app') - .directive('toolbarDirective', toolbarDirective); - -function toolbarDirective( - -) { - return { - restrict: 'A', - scope: { - template: '= toolbarTemplate', - showToolbar: '=' - }, - link: function ($scope, elem, attrs) { - if (!$scope.template) { - // Check if the string is set by checking the attrs - if (attrs.toolbarTemplate) { - $scope.template = attrs.toolbarTemplate; - } else { - return $log.error('Toolbar needs a template'); - } - } - $scope.showToolbar = true; - } - }; -} diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index a5353773d..f394dfb36 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -16,30 +16,40 @@ function AhaGuideController( ) { var AGC = this; var animatedPanelListener = angular.noop; + if (keypather.has(currentOrg, 'poppa.attrs.id') && ahaGuide.isAddingFirstRepo()) { fetchInstancesByPod() .then(function (instances) { - instances.forEach(function (instance) { - var repoName = instance.getRepoName(); - if (instance.status() === 'running' && repoName) { - $rootScope.$broadcast('launchAhaNavPopover'); - } else if (repoName){ + if (instances.models.length) { + var config = checkContainerInstances(instances); + if (!config.workingRepoInstance) { AGC.showError = true; AGC.errorState = 'nonRunningContainer'; $rootScope.$broadcast('ahaGuideError', { cause: AGC.errorState }); + } else if (ahaGuide.isAddingFirstRepo() && AGC.subStepIndex === 7) { + callPopover(config); } - }); + } else if (ahaGuide.isAddingFirstBranch()) { + AGC.showError = true; + } }) .catch(errs.handler); } - var alertListener = $scope.$on('alert', function (event, alert) { + $scope.$on('alert', function (event, alert) { // alerts on container creation success - if (alert.type === 'success') { + if (alert.text === 'Container Created' && alert.type === 'success') { updateCaption('logs'); - alertListener(); + fetchInstancesByPod() + .then(function (instances) { + var config = checkContainerInstances(instances); + if (config) { + callPopover(config); + } + }) + .catch(errs.handler); } }); @@ -114,17 +124,43 @@ function AhaGuideController( $rootScope.$broadcast('ahaGuideError', { isClear: true }); + currentMilestone.isBuildSuccessful = true; } AGC.buildStatus = buildStatus; AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; } + function checkContainerInstances (instances) { + if (!instances) { + return null; + } + var config = {}; + instances.forEach(function(instance) { + if (instance.getRepoName() && instance.status() === 'running') { + config.workingRepoInstance = true; + } else if (!instance.getRepoName()) { + config.nonRepoInstance = true; + } + }); + return config; + } + + function callPopover(config) { + if (config.workingRepoInstance && config.nonRepoInstance) { + $rootScope.$broadcast('launchAhaNavPopover'); + } else if (config.workingRepoInstance) { + $rootScope.$broadcast('show-add-services-popover'); + } + } + $scope.$on('$destroy', function () { animatedPanelListener(); if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { $rootScope.$broadcast('ahaGuideError', { cause: 'exitedEarly' }); + } else if (ahaGuide.isAddingFirstRepo() && AGC.subStep === 'success') { + $rootScope.$broadcast('show-add-services-popover'); } }); diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 587583e4f..c858f3cd8 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -82,10 +82,6 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" - ) Looking good! Check out your URL, and click ‘Done’ if it looks good to you too. - p.p( - ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "(AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success') || !AGC.showError" ) Your build finished! Check that it looks good, then click ‘Done’. p.p( ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index d97a4b605..1f3ad03e1 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -20,10 +20,11 @@ function EnvironmentController( fetchDockerfileForContextVersion, fetchOrgMembers, fetchUser, + instancesByPod, keypather, ModalService, pageName, - instancesByPod + patchOrgMetadata ) { var EC = this; @@ -33,20 +34,11 @@ function EnvironmentController( EC.isInGuide = ahaGuide.isInGuide; EC.showCreateTemplate = true; EC.showOverview = true; - EC.toggleSidebar = function () { - EC.showSidebar = !EC.showSidebar; - EC.showCreateTemplate = true; - }; - EC.popoverActions = { - showSidebar: EC.toggleSidebar, - endGuide: EC.endGuide - }; $scope.$on('show-aha-sidebar', EC.toggleSidebar); $scope.$on('ahaGuideError', function(event, info) { if (info.isClear) { EC.errorState = null; - $rootScope.$broadcast('launchAhaNavPopover'); } else { EC.errorState = info.cause; } @@ -169,6 +161,15 @@ function EnvironmentController( toggleSidebar: function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; + patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasAha: true, + hasConfirmedSetup: false + } + }) + .then(function(updatedOrg) { + ahaGuide.updateCurrentOrg(updatedOrg); + }); }, createTemplate: function() { EC.showAddServicePopover = false; From 78c4d7ca40d79f20cd4b5d1d281fd85307bd4cb2 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 20:46:44 -0700 Subject: [PATCH 413/577] Changed copy --- .../ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 587583e4f..5e61ca92e 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -58,7 +58,7 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" - ) Give your configuration a name. + ) Give your template a name. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'repository'" From 2b3e07c6c25a3c4bb9ca6baa1b3618d3ae5dc97a Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Sun, 18 Sep 2016 22:48:32 -0700 Subject: [PATCH 414/577] Only check for non build failures --- .../components/ahaGuide/AhaGuideController.js | 36 +++++++++---------- .../setUpRepositoryGuideView.jade | 2 +- .../environment/environmentController.js | 13 +++---- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index f394dfb36..4bc34c618 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -25,8 +25,8 @@ function AhaGuideController( if (!config.workingRepoInstance) { AGC.showError = true; AGC.errorState = 'nonRunningContainer'; - $rootScope.$broadcast('ahaGuideError', { - cause: AGC.errorState + $rootScope.$broadcast('ahaGuideEvent', { + error: AGC.errorState }); } else if (ahaGuide.isAddingFirstRepo() && AGC.subStepIndex === 7) { callPopover(config); @@ -59,17 +59,17 @@ function AhaGuideController( } }); - $scope.$on('ahaGuideError', function(event, info) { - if (info.cause === 'exitedEarly') { + $scope.$on('ahaGuideEvent', function(event, info) { + if (info.error === 'exitedEarly') { AGC.showError = true; - AGC.errorState = info.cause; + AGC.errorState = info.error; updateCaption('exitedEarly'); - } else if (info.cause === 'nonRunningContainer') { + } else if (info.error === 'nonRunningContainer') { AGC.showError = true; - AGC.errorState = info.cause; - } else if (info.cause === 'buildFailed') { + AGC.errorState = info.error; + } else if (info.error === 'buildFailed') { AGC.showError = true; - AGC.errorState = info.cause; + AGC.errorState = info.error; } else if (info.isClear) { AGC.showError = false; AGC.errorState = null; @@ -113,18 +113,18 @@ function AhaGuideController( var buildStatus = update.status; if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { AGC.showError = true; - $rootScope.$broadcast('ahaGuideError', { - cause: 'buildFailed' + $rootScope.$broadcast('ahaGuideEvent', { + error: 'buildFailed' }); } else if (buildStatus === 'starting') { AGC.showError = false; - } else if (buildStatus === 'running') { + // as long as the build was successful that's ok AGC.isBuildSuccessful = true; + } else if (buildStatus === 'running') { updateCaption('success'); - $rootScope.$broadcast('ahaGuideError', { + $rootScope.$broadcast('ahaGuideEvent', { isClear: true }); - currentMilestone.isBuildSuccessful = true; } AGC.buildStatus = buildStatus; AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; @@ -136,7 +136,7 @@ function AhaGuideController( } var config = {}; instances.forEach(function(instance) { - if (instance.getRepoName() && instance.status() === 'running') { + if (instance.getRepoName() && instance.status() !== 'building' && instance.status() !== 'buildFailed') { config.workingRepoInstance = true; } else if (!instance.getRepoName()) { config.nonRepoInstance = true; @@ -156,10 +156,10 @@ function AhaGuideController( $scope.$on('$destroy', function () { animatedPanelListener(); if (AGC.subStepIndex === 7 && !AGC.isBuildSuccessful) { - $rootScope.$broadcast('ahaGuideError', { - cause: 'exitedEarly' + $rootScope.$broadcast('ahaGuideEvent', { + error: 'exitedEarly' }); - } else if (ahaGuide.isAddingFirstRepo() && AGC.subStep === 'success') { + } else if (ahaGuide.isAddingFirstRepo() && AGC.isBuildSuccessful) { $rootScope.$broadcast('show-add-services-popover'); } }); diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index c858f3cd8..18d69bece 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -94,7 +94,7 @@ p.p.small.text-gray-light {{ AGC.title }} p.p( ng-if = "AGC.isInGuide() && AGC.showError && AGC.errorState === 'buildFailed'" - ) Uh oh, there was a build error! Inspect your logs for debug info. + ) Uh oh, there was an error! Inspect your logs for debug info. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 1f3ad03e1..0b09115b8 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -36,11 +36,13 @@ function EnvironmentController( EC.showOverview = true; $scope.$on('show-aha-sidebar', EC.toggleSidebar); - $scope.$on('ahaGuideError', function(event, info) { + $scope.$on('ahaGuideEvent', function(event, info) { if (info.isClear) { EC.errorState = null; + } else if (info.buildSuccessful) { + EC.showAddServicePopover = true; } else { - EC.errorState = info.cause; + EC.errorState = info.error; } }); @@ -109,9 +111,6 @@ function EnvironmentController( // Asynchronously fetch the Dockerfile and check for working instances instancesByPod.forEach(function (instance) { - if (instance.attrs.build.successful && instance.getRepoName() && isAddFirstRepo) { - EC.showAddServicePopover = true; - } if (instance.hasDockerfileMirroring()) { return fetchDockerfileForContextVersion(instance.contextVersion) .then(function (dockerfile) { @@ -179,5 +178,7 @@ function EnvironmentController( $scope.$on('show-aha-sidebar', EC.actions.toggleSidebar); - + $scope.$on('show-add-services-popover', function() { + EC.showAddServicePopover = true; + }); } From 3c0f9c2dd6a7f12575f9fe7a4214ae15b374d416 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 11:19:11 -0400 Subject: [PATCH 415/577] 4.21.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fd7dc443..f325a7512 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.7", + "version": "4.21.8", "private": true, "description": "Frontend for Runnable.io", "scripts": { From f8fc641b7f6c5bed5c0d724f747515d95b05fc51 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 11:40:02 -0400 Subject: [PATCH 416/577] Updated logic for showing the sidebar popover to be more specific to the status of the config. --- client/controllers/controllerInstances.js | 28 ++++++++----------- .../instances/viewInstancesList.jade | 11 +++++++- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index ce7788792..e3f0034e0 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -10,17 +10,17 @@ function ControllerInstances( $localStorage, $scope, $state, + activeAccount, ahaGuide, - keypather, - setLastOrg, + currentOrg, errs, + fetchInstancesByPod, + keypather, loading, ModalService, - fetchInstancesByPod, - activeAccount, - user, promisify, - currentOrg + setLastOrg, + user ) { var CIS = this; var userName = $state.params.userName; @@ -36,27 +36,23 @@ function ControllerInstances( instanceListIsClosed: false }); - var shouldShowPopover = true; - CIS.isPopoverOpen = function () { - return shouldShowPopover && ahaGuide.isAddingFirstBranch() && !CIS.$storage.instanceListIsClosed; - }; - - $scope.$on('popover-closed', function(event, pop) { + CIS.shouldshowPopover = true; + $scope.$on('popover-closed', function (event, pop) { if (keypather.get(pop, 'data') === 'branchSelect') { - shouldShowPopover = true; + CIS.shouldShowPopover = true; } }); - $scope.$on('popover-opened', function(event, pop) { + $scope.$on('popover-opened', function (event, pop) { if (keypather.get(pop, 'data') === 'branchSelect') { - shouldShowPopover = false; + CIS.shouldShowPopover = false; } }); fetchInstancesByPod() .then(function (instancesByPod) { - // If the state has already changed don't continue with old data. Let the new one execute. + // If the state has already changed don' t continue with old data. Let the new one execute. if (userName !== $state.params.userName) { return; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index bccddf910..ac4656652 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -85,7 +85,16 @@ p.p.text-center.text-gray-light.padding-sm( xlink:href = "#icons-arrow-down" ) .stepOneUncloseablePopover( - ng-if = "$root.featureFlags.aha && CIS.isInGuide() && $index === 0 && CIS.shouldShowParent(masterInstance) && (!masterInstance.attrs.hasAddedBranches || masterInstance.attrs.shouldNotAutofork)" + ng-if = "$root.featureFlags.aha &&\ + $index === 0 &&\ + CIS.shouldshowPopover &&\ + !CIS.$storage.instanceListIsClosed &&\ + CIS.shouldShowParent(masterInstance) &&\ + (\ + (CIS.isAddingFirstBranch() && !masterInstance.attrs.hasAddedBranches) ||\ + (CIS.isSettingUpRunnabot() && masterInstance.attrs.shouldNotAutofork)\ + )\ + " pop-over pop-over-active = "CIS.isPopoverOpen()" pop-over-controller = "CIS" From 2c9485d268f3123093b0aeb3f0639deeec4891fd Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 11:57:35 -0400 Subject: [PATCH 417/577] Hide the sidebar toggle when not in the guide. --- .../environment/environmentHeader/viewEnvironmentHeader.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 7a6488f3e..b604fcd49 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -30,7 +30,7 @@ button.grid-block.shrink.btn.btn-md.green( button.grid-block.shrink.btn.btn-sm.gray.btn-aha( ng-click = "EC.toggleSidebar()" - ng-if = "$root.featureFlags.aha" + ng-if = "$root.featureFlags.aha && EC.isInGuide()" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" ) From 1f45707fc65aa3c71b5ce68054c659f15502e586 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 09:38:47 -0700 Subject: [PATCH 418/577] Fixed terminal page disabling --- .../environment/modals/forms/formLogs/viewFormLogs.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index 409e89422..49b688c81 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -14,7 +14,7 @@ button.btn.btn-xs.white( ng-class = "{'active': SMC.page === 'terminal'}" ng-click = "SMC.page = 'terminal'" - ng-disabled = "!SMC.instance.containers.models.length && SMC.instance.status() !== 'running'" + ng-disabled = "!SMC.instance.containers.models.length || SMC.instance.status() !== 'running'" ng-if = "$root.featureFlags.configTerminal" ) Terminal From a438fc8fdfdfe994e0c6107d0760c717b26c5a6d Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 13:29:09 -0400 Subject: [PATCH 419/577] isPopoverOpen() -> shouldShowPopover --- client/templates/instances/viewInstancesList.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index ac4656652..b5f602e43 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -96,7 +96,7 @@ p.p.text-center.text-gray-light.padding-sm( )\ " pop-over - pop-over-active = "CIS.isPopoverOpen()" + pop-over-active = "CIS.shouldShowPopover" pop-over-controller = "CIS" pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" From 242bcc7122d4c9cdf5ee90fa4b10a289f0b262f8 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 13:34:49 -0400 Subject: [PATCH 420/577] Fixing stupid mistake. --- client/controllers/controllerInstances.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index e3f0034e0..f693b9be3 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -36,7 +36,7 @@ function ControllerInstances( instanceListIsClosed: false }); - CIS.shouldshowPopover = true; + CIS.shouldShowPopover = true; $scope.$on('popover-closed', function (event, pop) { if (keypather.get(pop, 'data') === 'branchSelect') { CIS.shouldShowPopover = true; From 1d864de029a3a334d02b4e5968a540ab0d4676b5 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 13:38:40 -0400 Subject: [PATCH 421/577] Casing --- client/templates/instances/viewInstancesList.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index b5f602e43..9901dd999 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -87,7 +87,7 @@ p.p.text-center.text-gray-light.padding-sm( .stepOneUncloseablePopover( ng-if = "$root.featureFlags.aha &&\ $index === 0 &&\ - CIS.shouldshowPopover &&\ + CIS.shouldShowPopover &&\ !CIS.$storage.instanceListIsClosed &&\ CIS.shouldShowParent(masterInstance) &&\ (\ From bf464d92ac9458f5b2b96b9ed9ccbaad4aa20bf7 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 13:53:49 -0400 Subject: [PATCH 422/577] Fixed logic so we are in the right stages at the right moments. --- client/services/ahaGuideService.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 01d568d98..e87b50994 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -223,12 +223,12 @@ function ahaGuide( // This will short circuit once we have found both of these true return hasAutoLaunch && hasBranchLaunched; }); - if (hasBranchLaunched) { + if (!hasBranchLaunched) { + cachedStep = STEPS.ADD_FIRST_BRANCH; + } else if (!hasAutoLaunch) { cachedStep = STEPS.SETUP_RUNNABOT; - } else if (hasAutoLaunch) { - cachedStep = STEPS.COMPLETED; } else { - cachedStep = STEPS.ADD_FIRST_BRANCH; + cachedStep = STEPS.COMPLETED; } } } From a6f64a5ffc596eef5f5f37c7797de2968e7db4d0 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 11:06:06 -0700 Subject: [PATCH 423/577] Fixed failing tests... --- test/unit/controllers/setupMirrorServerModalController.unit.js | 1 + test/unit/controllers/setupServerModalController.unit.js | 1 + 2 files changed, 2 insertions(+) diff --git a/test/unit/controllers/setupMirrorServerModalController.unit.js b/test/unit/controllers/setupMirrorServerModalController.unit.js index 59d600f56..e20256905 100644 --- a/test/unit/controllers/setupMirrorServerModalController.unit.js +++ b/test/unit/controllers/setupMirrorServerModalController.unit.js @@ -191,6 +191,7 @@ describe('setupMirrorServerModalController'.bold.underline.blue, function () { keypather.set($rootScope, 'dataApp.data.activeAccount.oauthName', sinon.mock().returns('myOauthName')); $scope = $rootScope.$new(); + $rootScope.featureFlags = {}; SMC = $controller('SetupMirrorServerModalController', { $scope: $scope, instanceName: opts.instanceName || instanceName, diff --git a/test/unit/controllers/setupServerModalController.unit.js b/test/unit/controllers/setupServerModalController.unit.js index 1db5f5eb4..d8b1e3dc5 100644 --- a/test/unit/controllers/setupServerModalController.unit.js +++ b/test/unit/controllers/setupServerModalController.unit.js @@ -200,6 +200,7 @@ describe('setupServerModalController'.bold.underline.blue, function () { keypather.set($rootScope, 'dataApp.data.activeAccount.oauthName', sinon.mock().returns('myOauthName')); $scope = $rootScope.$new(); + $rootScope.featureFlags = {}; SMC = $controller('SetupServerModalController', { $scope: $scope, dockerfileType: false, From 67619e82c754d44ac6f08e6b5e1f744793cc7cfa Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 14:12:33 -0400 Subject: [PATCH 424/577] 4.21.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f325a7512..55553e63c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.8", + "version": "4.21.9", "private": true, "description": "Frontend for Runnable.io", "scripts": { From e3d8b8347df999425a8b67c0fd097017e3514090 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 15:38:54 -0400 Subject: [PATCH 425/577] 4.21.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 55553e63c..87d6937b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.9", + "version": "4.21.10", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 8a8c4521bea81c4a8acbe8d9233630e2ec127f7e Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 16:02:24 -0400 Subject: [PATCH 426/577] 4.21.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87d6937b6..baffe1bb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.10", + "version": "4.21.11", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 8970ae2bc8df02dbdfdbc55a66cf678e2c643b1b Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 16:07:53 -0400 Subject: [PATCH 427/577] 4.22.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index baffe1bb6..860cbb7ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.21.11", + "version": "4.22.0", "private": true, "description": "Frontend for Runnable.io", "scripts": { From d652f9e58e90496fe0000d6d4cdfaee423856a18 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 16:09:20 -0400 Subject: [PATCH 428/577] 4.23.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 860cbb7ae..3a2b0350e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.22.0", + "version": "4.23.0", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 2576d9c2680cdcee62b4666a90c7de97c7886f11 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 16:18:55 -0400 Subject: [PATCH 429/577] 4.23.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a2b0350e..2e76656ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.0", + "version": "4.23.1", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 01411292c79aab25584415987046c8fced8b3ac1 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 16:53:54 -0400 Subject: [PATCH 430/577] instances.models --- client/services/ahaGuideService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 5c01c861a..fa4bb1a0a 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -218,7 +218,7 @@ function ahaGuide( var hasBranchLaunched = false; var hasAutoLaunch = false; if (keypather.get(instances, 'models.length')) { - instances.some(function (instance) { + instances.models.some(function (instance) { hasBranchLaunched = hasBranchLaunched || instance.attrs.hasAddedBranches; hasAutoLaunch = hasAutoLaunch || !instance.attrs.shouldNotAutofork; // This will short circuit once we have found both of these true From ff15c939eedac1eb6f81c4b76a1caa32c48fd330 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 14:04:07 -0700 Subject: [PATCH 431/577] Cleaned up unused code and making sure popovers only appear for 1 nonrepo container, 1 working repo container --- .../components/ahaGuide/AhaGuideController.js | 23 +++++++++++-------- .../environment/environmentController.js | 22 +++--------------- .../viewEnvironmentHeader.jade | 2 +- .../modals/forms/formLogs/viewFormLogs.jade | 10 +++++--- .../setupMirrorServerModalController.js | 1 - .../setupServerModalController.js | 1 - 6 files changed, 24 insertions(+), 35 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 4bc34c618..bcff6a70e 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -16,6 +16,8 @@ function AhaGuideController( ) { var AGC = this; var animatedPanelListener = angular.noop; + // dismiss add service popover if open + $rootScope.$broadcast('show-add-services-popover', false) if (keypather.has(currentOrg, 'poppa.attrs.id') && ahaGuide.isAddingFirstRepo()) { fetchInstancesByPod() @@ -29,7 +31,7 @@ function AhaGuideController( error: AGC.errorState }); } else if (ahaGuide.isAddingFirstRepo() && AGC.subStepIndex === 7) { - callPopover(config); + callPopover(config, instances); } } else if (ahaGuide.isAddingFirstBranch()) { AGC.showError = true; @@ -46,7 +48,7 @@ function AhaGuideController( .then(function (instances) { var config = checkContainerInstances(instances); if (config) { - callPopover(config); + callPopover(config, instances); } }) .catch(errs.handler); @@ -119,12 +121,12 @@ function AhaGuideController( } else if (buildStatus === 'starting') { AGC.showError = false; // as long as the build was successful that's ok - AGC.isBuildSuccessful = true; - } else if (buildStatus === 'running') { - updateCaption('success'); $rootScope.$broadcast('ahaGuideEvent', { isClear: true }); + AGC.isBuildSuccessful = true; + } else if (buildStatus === 'running') { + updateCaption('success'); } AGC.buildStatus = buildStatus; AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; @@ -145,11 +147,12 @@ function AhaGuideController( return config; } - function callPopover(config) { - if (config.workingRepoInstance && config.nonRepoInstance) { + // this only calls popovers for one specific group. they have built a repo and nonrepo instance only. + function callPopover(config, instances) { + if (config.workingRepoInstance && config.nonRepoInstance && instances.models.length === 2) { $rootScope.$broadcast('launchAhaNavPopover'); - } else if (config.workingRepoInstance) { - $rootScope.$broadcast('show-add-services-popover'); + } else if (config.workingRepoInstance && instances.models.length === 1) { + $rootScope.$broadcast('show-add-services-popover', true); } } @@ -160,7 +163,7 @@ function AhaGuideController( error: 'exitedEarly' }); } else if (ahaGuide.isAddingFirstRepo() && AGC.isBuildSuccessful) { - $rootScope.$broadcast('show-add-services-popover'); + $rootScope.$broadcast('show-add-services-popover', true); } }); diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 0b09115b8..0ac19fc9d 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -23,8 +23,7 @@ function EnvironmentController( instancesByPod, keypather, ModalService, - pageName, - patchOrgMetadata + pageName ) { var EC = this; @@ -39,8 +38,6 @@ function EnvironmentController( $scope.$on('ahaGuideEvent', function(event, info) { if (info.isClear) { EC.errorState = null; - } else if (info.buildSuccessful) { - EC.showAddServicePopover = true; } else { EC.errorState = info.error; } @@ -160,25 +157,12 @@ function EnvironmentController( toggleSidebar: function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; - patchOrgMetadata(currentOrg.poppa.id(), { - metadata: { - hasAha: true, - hasConfirmedSetup: false - } - }) - .then(function(updatedOrg) { - ahaGuide.updateCurrentOrg(updatedOrg); - }); - }, - createTemplate: function() { - EC.showAddServicePopover = false; - EC.triggerModal.newContainer(); } }; $scope.$on('show-aha-sidebar', EC.actions.toggleSidebar); - $scope.$on('show-add-services-popover', function() { - EC.showAddServicePopover = true; + $scope.$on('show-add-services-popover', function(event, toggle) { + EC.showAddServicePopover = toggle; }); } diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index dc4657370..2f52bddd0 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -1,7 +1,7 @@ //- new server button button.grid-block.shrink.btn.btn-md.green( ng-class = "{ 'scale-in-modal': EC.isAddingFirstRepo() }" - ng-click = "EC.actions.createTemplate()" + ng-click = "EC.triggerModal.newContainer()" ) svg.iconnables.icons-add.float-left use( diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index eb4cab684..fdd0aea54 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -45,14 +45,18 @@ pre.pre.log-wrapper( ng-if = "SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" ) - .popover.bottom.padding-sm.popover-aha.popover-sm.in.sans-serif( - ng-if = "SMC.showUrlToolbar && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" + .popover.bottom.padding-sm.popover-aha.popover-sm( + ng-class = "{\ + 'in': $root.featureFlags.ahaUrlPopover,\ + 'sans-serif': $root.featureFlags.ahaUrlPopover\ + }" + ng-if = "$root.featureFlags.ahaUrlPopover && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" style = "left: 12px; top: 60px;" ) .arrow.white small.small.text-gray.float-left Use this URL to check out your application. button.btn.btn-xs.gray.float-right( - ng-click = "SMC.showUrlToolbar = false" + ng-click = "$root.featureFlags.ahaUrlPopover = false" ) Dismiss //- build logs page diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index dfbd8845c..406cac967 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -30,7 +30,6 @@ function SetupMirrorServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; - SMC.showUrlToolbar = SMC.isAddingFirstRepo(); var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 5e20b6aa9..a1a62e6a2 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -34,7 +34,6 @@ function SetupServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; - SMC.showUrlToolbar = SMC.isAddingFirstRepo(); var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { From 058cea993df524713ad7d94beff793c8743e3e1f Mon Sep 17 00:00:00 2001 From: Myztiq Date: Mon, 19 Sep 2016 17:21:30 -0400 Subject: [PATCH 432/577] Redirect when aha guide is unfinished --- client/config/routes.js | 21 ++++++++++++++++++++- client/services/ahaGuideService.js | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/client/config/routes.js b/client/config/routes.js index a390ec389..17ae791c7 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -211,7 +211,26 @@ module.exports = [ url: '^/:userName/', templateUrl: 'viewInstances', controller: 'ControllerInstances', - controllerAs: 'CIS' + controllerAs: 'CIS', + resolve: { + hasConfirmedSetup: function ( + $rootScope, + $state, + $stateParams, + $timeout, + ahaGuide, + featureFlags, + populateCurrentOrgService // Unused, but required so things are properly populated! + ) { + if (featureFlags.flags.aha && ahaGuide.isInGuide() && !ahaGuide.hasConfirmedSetup()) { + $timeout(function () { + $state.go('base.config', { + userName: $stateParams.userName + }); + }); + } + } + } }, { state: 'base.instances.instance', abstract: false, diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index e87b50994..e44a97c67 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -281,6 +281,6 @@ function ahaGuide( }, isSettingUpRunnabot: function() { return getCurrentStep() === STEPS.SETUP_RUNNABOT; - }, + } }; } From db75d6a387e3a1a36c6d2acd6256ec873771b0fd Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 14:26:35 -0700 Subject: [PATCH 433/577] Fixing popover actions for static popover --- .../directives/components/ahaGuide/ahaGuideView.jade | 2 +- client/directives/environment/environmentController.js | 8 ++++---- .../environmentHeader/viewEnvironmentHeader.jade | 2 +- client/directives/environment/environmentView.jade | 2 +- .../modals/forms/formLogs/viewFormLogs.jade | 10 +++------- .../setupMirrorServerModalController.js | 1 + .../modalSetupServer/setupServerModalController.js | 1 + 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 4bae2663d..01f0364d7 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -27,7 +27,7 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" ng-if = "!AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpRunnabot()" pop-over - pop-over-actions = "AGC ? AGC.popoverActions : EC.popoverActions" + pop-over-actions = "AGC ? AGC.popoverActions : EC.actions" pop-over-active = "ahaMenuGuidePopover.data.show" pop-over-no-broadcast = "true" pop-over-options = "{\"centered\":true,\"top\":36}" diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 0ac19fc9d..a5ded5eaf 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -28,7 +28,6 @@ function EnvironmentController( var EC = this; EC.showInviteButton = false; - EC.endGuide = ahaGuide.endGuide; EC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; EC.isInGuide = ahaGuide.isInGuide; EC.showCreateTemplate = true; @@ -154,14 +153,15 @@ function EnvironmentController( } }); }, - toggleSidebar: function () { + showSidebar: function () { EC.showSidebar = !EC.showSidebar; EC.showCreateTemplate = true; - } + }, + endGuide: ahaGuide.endGuide }; - $scope.$on('show-aha-sidebar', EC.actions.toggleSidebar); + $scope.$on('show-aha-sidebar', EC.actions.showSidebar); $scope.$on('show-add-services-popover', function(event, toggle) { EC.showAddServicePopover = toggle; }); diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 16294a631..a5d9100e3 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -30,7 +30,7 @@ button.grid-block.shrink.btn.btn-md.green( ) Got It button.grid-block.shrink.btn.btn-sm.gray.btn-aha( - ng-click = "EC.actions.toggleSidebar()" + ng-click = "EC.actions.showSidebar()" ng-if = "$root.featureFlags.aha && EC.isInGuide()" tooltip = "Setup Guide" tooltip-options = "{\"class\":\"left\",\"right\":42,\"top\":0}" diff --git a/client/directives/environment/environmentView.jade b/client/directives/environment/environmentView.jade index 0e3bdd670..c89bf7988 100755 --- a/client/directives/environment/environmentView.jade +++ b/client/directives/environment/environmentView.jade @@ -98,7 +98,7 @@ .grid-block.vertical.aha-sidebar.padding-sm.js-animate( aha-sidebar - toggle-sidebar = "EC.actions.toggleSidebar" + toggle-sidebar = "EC.actions.showSidebar" show-overview = "!EC.showCreateTemplate" ng-if = "$root.featureFlags.aha && EC.isInGuide() && EC.showSidebar" ) diff --git a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade index fdd0aea54..eb4cab684 100644 --- a/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade +++ b/client/directives/environment/modals/forms/formLogs/viewFormLogs.jade @@ -45,18 +45,14 @@ pre.pre.log-wrapper( ng-if = "SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" ) - .popover.bottom.padding-sm.popover-aha.popover-sm( - ng-class = "{\ - 'in': $root.featureFlags.ahaUrlPopover,\ - 'sans-serif': $root.featureFlags.ahaUrlPopover\ - }" - ng-if = "$root.featureFlags.ahaUrlPopover && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" + .popover.bottom.padding-sm.popover-aha.popover-sm.in.sans-serif( + ng-if = "SMC.showUrlToolbar && SMC.page === 'run' && !SMC.showDebugCmd && $root.featureFlags.webToolbar" style = "left: 12px; top: 60px;" ) .arrow.white small.small.text-gray.float-left Use this URL to check out your application. button.btn.btn-xs.gray.float-right( - ng-click = "$root.featureFlags.ahaUrlPopover = false" + ng-click = "SMC.showUrlToolbar = false" ) Dismiss //- build logs page diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 8f8f23196..8245e7e42 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -30,6 +30,7 @@ function SetupMirrorServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; + SMC.showUrlToolbar = SMC.isAddingFirstRepo(); var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { diff --git a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js index 67634a1a3..94264d480 100644 --- a/client/directives/environment/modals/modalSetupServer/setupServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupServerModalController.js @@ -34,6 +34,7 @@ function SetupServerModalController( ) { var SMC = this; // Server Modal Controller (shared with EditServerModalController) SMC.isAddingFirstRepo = ahaGuide.isAddingFirstRepo; + SMC.showUrlToolbar = SMC.isAddingFirstRepo(); var parentController = $controller('ServerModalController as SMC', { $scope: $scope }); angular.extend(SMC, { From 2914b664e1fcdc7c3fb3ea25693849654c79d91a Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 14:26:49 -0700 Subject: [PATCH 434/577] send configurationMethod to createNewBuildService and set the property there --- .../newContainerModalController.js | 2 +- client/services/serviceCreateNewBuild.js | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/client/directives/modals/modalNewContainer/newContainerModalController.js b/client/directives/modals/modalNewContainer/newContainerModalController.js index 5c73b8929..9df7bf714 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalController.js +++ b/client/directives/modals/modalNewContainer/newContainerModalController.js @@ -183,7 +183,7 @@ function NewContainerModalController( } else { dockerfilePath = ''; } - return createNewBuildAndFetchBranch(currentOrg.github, repo, dockerfilePath) + return createNewBuildAndFetchBranch(currentOrg.github, repo, dockerfilePath, configurationMethod) .then(function (repoBuildAndBranch) { repoBuildAndBranch.instanceName = instanceName; if (configurationMethod === 'dockerfile' && dockerfile) { diff --git a/client/services/serviceCreateNewBuild.js b/client/services/serviceCreateNewBuild.js index 167b18423..94efd9a73 100644 --- a/client/services/serviceCreateNewBuild.js +++ b/client/services/serviceCreateNewBuild.js @@ -13,6 +13,7 @@ function createNewBuild( return function (activeAccount, opts) { opts = opts || {}; var dockerfilePath = opts.dockerfilePath; + var configurationMethod = opts.configurationMethod; var thisUser, version; function createContext(user) { return promisify(user, 'createContext')({ @@ -32,6 +33,11 @@ function createNewBuild( buildDockerfilePath: dockerfilePath }); } + if (configurationMethod === 'blankDockerfile') { + return promisify(version, 'update')({ + advanced: true, + }); + } return version; }); } @@ -68,7 +74,7 @@ function createNewBuildAndFetchBranch( fetchStackData, promisify ) { - return function (activeAccount, repo, dockerfilePath) { + return function (activeAccount, repo, dockerfilePath, configurationMethod) { var inputs = { repo: repo, masterBranch: null, @@ -76,7 +82,10 @@ function createNewBuildAndFetchBranch( }; return fetchStackData(repo) .then(function () { - return createNewBuild(activeAccount, { dockerfilePath: dockerfilePath }); + return createNewBuild(activeAccount, { + configurationMethod: configurationMethod, + dockerfilePath: dockerfilePath + }); }) .then(function (buildWithVersion) { inputs.build = buildWithVersion; From bc33a8707fb3df978d1ebb0ecdf53bfec60a9087 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 14:41:33 -0700 Subject: [PATCH 435/577] JSHint fix --- client/directives/components/ahaGuide/AhaGuideController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index bcff6a70e..9fc814746 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -17,7 +17,7 @@ function AhaGuideController( var AGC = this; var animatedPanelListener = angular.noop; // dismiss add service popover if open - $rootScope.$broadcast('show-add-services-popover', false) + $rootScope.$broadcast('show-add-services-popover', false); if (keypather.has(currentOrg, 'poppa.attrs.id') && ahaGuide.isAddingFirstRepo()) { fetchInstancesByPod() From 578e55653b205c0c3ecda90513b4ac09ef2a1434 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 14:46:31 -0700 Subject: [PATCH 436/577] 4.23.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2e76656ba..4603d5f06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.1", + "version": "4.23.2", "private": true, "description": "Frontend for Runnable.io", "scripts": { From d467419dfb807744cdda0cf3b10e6065cf368d68 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 15:14:24 -0700 Subject: [PATCH 437/577] use isSettingUpAutoLaunch in most places where isSettingUpRunnabot should be --- client/directives/components/ahaGuide/ahaGuideView.jade | 2 +- client/templates/instances/viewInstancesList.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 4bae2663d..7c1f711c7 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -19,7 +19,7 @@ ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.isSettingUpRunnabot()" + ng-if = "AGC.ahaGuide.isSettingUpAutoLaunch()" ng-include = "'setUpRunnabotGuideView'" ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index c4c1f515c..7f9bb5c2a 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -101,7 +101,7 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" pop-over-trigger = "activeAttr" - pop-over-uncloseable = "CIS.isAddingFirstBranch()" + pop-over-uncloseable = "CIS.isSettingUpAutoLaunch()" pop-over-data = "'ahaTemplate'" ) From 45cd8197ace2bc775571d1f63ee2ecb7a30581bf Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 15:16:58 -0700 Subject: [PATCH 438/577] 4.23.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4603d5f06..ada041ae4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.2", + "version": "4.23.3", "private": true, "description": "Frontend for Runnable.io", "scripts": { From a858553e0473f4d0e5b8076bb90149e9e2e5d992 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 15:38:09 -0700 Subject: [PATCH 439/577] turn on GI --- client/services/featureFlagService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 258034f58..d8ea2b6e0 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -25,7 +25,7 @@ function featureFlags( emptyFolder: false, // shows empty folder markup fullScreen: false, // toggles full screen fullScreenToggle: false, // toggles the button that toggles full screen - gitHubIntegration: false, + gitHubIntegration: true, hostnameNotifications: false, hostnameTool: false, imAfraidOfTheDark: false, // toggles theme From 4eaf9e566e20ce3786ddc91128ac9172d9f261f2 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 15:49:43 -0700 Subject: [PATCH 440/577] 4.23.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ada041ae4..039e415f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.3", + "version": "4.23.4", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 3c127316d701b3d232dbf64e80737b22ebeda148 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 19 Sep 2016 15:58:13 -0700 Subject: [PATCH 441/577] add contingency plan --- .../chooseOrganizationModalView.jade | 17 +++++++++++++++-- client/services/featureFlagService.js | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 12a0be358..157aa557e 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -109,14 +109,27 @@ ng-class = "{'in': isActivePanel()}" ) //- dock spinning up - p.p.text-gray.padding-xs.text-center We’re spinning up infrastructure for your org. It’ll take about + p.p.text-gray.padding-xs.text-center( + ng-if = "!$root.featureFlags.contingencyPlan" + ) We’re spinning up infrastructure for your org. It’ll take about strong.strong 10 minutes | . We’ll email you and update this page when it’s ready. - .grid-block.align-center.justify-center.padding-sm + .grid-block.align-center.justify-center.padding-sm( + ng-if = "!$root.featureFlags.contingencyPlan" + ) .spinner-wrapper.spinner-md.spinner-gray( ng-include = "'spinner'" ) //- ng-if = "isActivePanel()" + + p.p.text-gray.text-center.strong( + ng-if = "$root.featureFlags.contingencyPlan" + ) We’re running slower than normal due to high demand. + p.p.text-gray.text-center.padding-xs( + ng-if = "$root.featureFlags.contingencyPlan" + ) We’ll email you at + span taylor@runnable.com + | as soon we’re done spinning up your infrastructure. Thanks for your patience. animated-panel.modal-body.grid-block.vertical( name = "dockLoaded" ) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 4e1ba26cc..5735ddf02 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -20,6 +20,7 @@ function featureFlags( configTerminal: true, // flag for terminal in config view containersViewTemplateControls: false, containersViewEmptyState: false, + contingencyPlan: false, dockerfileMirroringMultiple: false, editAnyInstance: false, emptyFolder: false, // shows empty folder markup From f48612a3dca867f65d690b8687dba1af55393692 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 19 Sep 2016 15:58:22 -0700 Subject: [PATCH 442/577] hang tight -> bear with us --- .../ahaGuide/components/createSandboxGuideView.jade | 2 +- client/services/ahaGuideService.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index db67e2d3d..35010bf0f 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -19,7 +19,7 @@ ) Choose an organization to create your environment for. p.p( ng-if = "AGC.subStep === 'dockLoading'" - ) Hang tight! + ) Bear with us! p.p( ng-if = "AGC.subStep === 'dockLoaded'" ) Continue to start configuring your project. diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index e87b50994..e22d68c0d 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -36,7 +36,7 @@ function ahaGuide( className: 'aha-meter-33' }, dockLoading: { - caption: 'Hang tight!', + caption: 'Bear with us!', className: 'aha-meter-66' }, dockLoaded: { @@ -142,7 +142,7 @@ function ahaGuide( value: 33 }, dockLoading: { - caption: 'Hang tight!', + caption: 'Bear with us!', className: 'aha-meter-66', value: 66 }, From 20f744f984d58f98ef200bd6f716b8955b9ecbcd Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 16:20:01 -0700 Subject: [PATCH 443/577] add ahaService external call when GithubIntegration controller finds Runnabot --- .../githubIntegrationController.js | 8 ++++++-- client/services/ahaGuideService.js | 2 ++ .../githubIntegrationController.unit.js | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js index 64735063a..fc8114367 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationController.js +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -9,6 +9,7 @@ function GithubIntegrationController( $interval, $q, $scope, + ahaGuide, currentOrg, errs, fetchGithubUserIsAdminOfOrg, @@ -24,8 +25,11 @@ function GithubIntegrationController( return isRunnabotPartOfOrg(org) .then(function (hasRunnabot) { GIC.hasRunnabot = hasRunnabot; - if (hasRunnabot && GIC.pollingInterval) { - $interval.cancel(GIC.pollingInterval); + if (hasRunnabot) { + if (GIC.pollingInterval) { + $interval.cancel(GIC.pollingInterval); + } + return ahaGuide.hasRunnabot(); } }) .catch(errs.handler); diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 439abf8dd..d932f15e7 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -32,6 +32,7 @@ function ahaGuide( return isRunnabotPartOfOrg(keypather.get(currentOrg, 'github.attrs.login')) .then(function (runnabot) { hasRunnabot = runnabot; + return hasRunnabot; }); } @@ -280,6 +281,7 @@ function ahaGuide( endGuide: endGuide, getCurrentStep: getCurrentStep, hasConfirmedSetup: hasConfirmedSetup, + hasRunnabot: refreshHasRunnabot, isInGuide: isInGuide, stepList: stepList, steps: STEPS, diff --git a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js index 8c1f53a17..812975f53 100644 --- a/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js +++ b/test/unit/directives/components/githubIntegration/githubIntegrationController.unit.js @@ -9,6 +9,7 @@ describe('Github Integration Controller'.bold.underline.blue, function() { var GIC; var isRunnabotPartOfOrgMock; var isRunnabotPartOfOrgResult; + var ahaGuideMock; var fetchGithubUserIsAdminOfOrgMock; var fetchGithubUserIsAdminOfOrgResult; var errsMock; @@ -33,6 +34,9 @@ describe('Github Integration Controller'.bold.underline.blue, function() { errsMock = { handler: sinon.spy() }; + ahaGuideMock = { + hasRunnabot: sinon.stub().returns() + }; angular.mock.module('app'); angular.mock.module(function ($provide) { $provide.value('currentOrg', mockCurrentOrg); @@ -44,6 +48,9 @@ describe('Github Integration Controller'.bold.underline.blue, function() { }; return isRunnabotPartOfOrgMock; }); + $provide.factory('ahaGuide', function () { + return ahaGuideMock; + }); $provide.factory('fetchGithubUserIsAdminOfOrg', function ($q) { fetchGithubUserIsAdminOfOrgMock = sinon.stub().returns($q.when(fetchGithubUserIsAdminOfOrgResult)); fetchGithubUserIsAdminOfOrgMock.cache = { @@ -108,6 +115,13 @@ describe('Github Integration Controller'.bold.underline.blue, function() { sinon.assert.calledWith($interval.cancel, GIC.pollingInterval); }); + it('should update ahaGuide when hasRunnabot', function () { + isRunnabotPartOfOrgResult = true; + injectSetupCompile(); + $scope.$digest(); + sinon.assert.calledOnce(ahaGuideMock.hasRunnabot); + }); + it('should stop interval when $destroyed', function () { isRunnabotPartOfOrgResult = true; injectSetupCompile(); From dae64cf875c227b710c041d264767d6268f7d7f9 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 16:24:44 -0700 Subject: [PATCH 444/577] Reduce unnecessary calls --- .../directives/components/ahaGuide/AhaGuideController.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 9fc814746..bab2e0dbf 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -137,10 +137,14 @@ function AhaGuideController( return null; } var config = {}; + var status; + var repoName; instances.forEach(function(instance) { - if (instance.getRepoName() && instance.status() !== 'building' && instance.status() !== 'buildFailed') { + status = instance.status(); + repoName = instance.getRepoName(); + if (repoName && status !== 'building' && status !== 'buildFailed') { config.workingRepoInstance = true; - } else if (!instance.getRepoName()) { + } else if (!repoName) { config.nonRepoInstance = true; } }); From 71826e9ddf567d9fb322f92a1a6762a38e3d1c45 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 16:55:35 -0700 Subject: [PATCH 445/577] 4.23.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 039e415f8..c23f3442d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.4", + "version": "4.23.5", "private": true, "description": "Frontend for Runnable.io", "scripts": { From f48ea34a38b96cf3d5430dcd8dda67dbc7fc0a00 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 17:33:29 -0700 Subject: [PATCH 446/577] Added jsdoc, removed hyphen case and unneeded listener --- client/controllers/controllerInstance.js | 2 +- .../components/ahaGuide/AhaGuideController.js | 18 ++++++++++++------ .../environment/environmentController.js | 6 ++---- .../instance/instanceHeaderDirective.js | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index 9f808fd2f..14deff10e 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -35,7 +35,7 @@ function ControllerInstance( CIS.toggleSidebar = function () { CIS.showSidebar = !CIS.showSidebar; }; - $scope.$on('show-aha-sidebar', CIS.toggleSidebar); + $scope.$on('showAhaSidebar', CIS.toggleSidebar); var dataInstance = $scope.dataInstance = { data: { unsavedAcvs: [] diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index bab2e0dbf..680ae5491 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -17,7 +17,7 @@ function AhaGuideController( var AGC = this; var animatedPanelListener = angular.noop; // dismiss add service popover if open - $rootScope.$broadcast('show-add-services-popover', false); + $rootScope.$broadcast('showAddServicesPopover', false); if (keypather.has(currentOrg, 'poppa.attrs.id') && ahaGuide.isAddingFirstRepo()) { fetchInstancesByPod() @@ -131,7 +131,10 @@ function AhaGuideController( AGC.buildStatus = buildStatus; AGC.caption = currentMilestone.buildStatus[buildStatus] || AGC.caption; } - + /** this checks all instances and whether there is a built repo instance and non repo instance + * @param {object} instances an object containing a collection of instances + * @return {object} config an object with two boolean properties, nonRepoInstance and workingRepoInstance + */ function checkContainerInstances (instances) { if (!instances) { return null; @@ -151,12 +154,15 @@ function AhaGuideController( return config; } - // this only calls popovers for one specific group. they have built a repo and nonrepo instance only. + /** this only calls popovers for one specific group. they have built a repo and nonrepo instance only. + * @param {object} config an object with two boolean properties, nonRepoInstance and workingRepoInstance + * @param {object} instances an object containing a collection of instances + */ function callPopover(config, instances) { if (config.workingRepoInstance && config.nonRepoInstance && instances.models.length === 2) { $rootScope.$broadcast('launchAhaNavPopover'); } else if (config.workingRepoInstance && instances.models.length === 1) { - $rootScope.$broadcast('show-add-services-popover', true); + $rootScope.$broadcast('showAddServicesPopover', true); } } @@ -167,7 +173,7 @@ function AhaGuideController( error: 'exitedEarly' }); } else if (ahaGuide.isAddingFirstRepo() && AGC.isBuildSuccessful) { - $rootScope.$broadcast('show-add-services-popover', true); + $rootScope.$broadcast('showAddServicesPopover', true); } }); @@ -179,7 +185,7 @@ function AhaGuideController( endGuide: ahaGuide.endGuide, showSidebar: function () { $rootScope.$broadcast('close-popovers'); - $rootScope.$broadcast('show-aha-sidebar'); + $rootScope.$broadcast('showAhaSidebar'); } }; } diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index a5ded5eaf..ff4ea3c3e 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -32,8 +32,6 @@ function EnvironmentController( EC.isInGuide = ahaGuide.isInGuide; EC.showCreateTemplate = true; EC.showOverview = true; - - $scope.$on('show-aha-sidebar', EC.toggleSidebar); $scope.$on('ahaGuideEvent', function(event, info) { if (info.isClear) { EC.errorState = null; @@ -161,8 +159,8 @@ function EnvironmentController( }; - $scope.$on('show-aha-sidebar', EC.actions.showSidebar); - $scope.$on('show-add-services-popover', function(event, toggle) { + $scope.$on('showAhaSidebar', EC.actions.showSidebar); + $scope.$on('showAddServicesPopover', function(event, toggle) { EC.showAddServicePopover = toggle; }); } diff --git a/client/directives/instances/instance/instanceHeaderDirective.js b/client/directives/instances/instance/instanceHeaderDirective.js index c4ba9f36d..7f2b1f32e 100644 --- a/client/directives/instances/instance/instanceHeaderDirective.js +++ b/client/directives/instances/instance/instanceHeaderDirective.js @@ -34,7 +34,7 @@ function instanceHeader( }); }); $scope.toggleSidebar = function () { - $rootScope.$broadcast('show-aha-sidebar'); + $rootScope.$broadcast('showAhaSidebar'); }; } }; From c589122fee87b89fc07970e904cbe14141f1096a Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 19 Sep 2016 18:35:07 -0700 Subject: [PATCH 447/577] update copy --- .../addBranchGuide/addBranchGuideView.jade | 2 +- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 10 +++++----- .../components/createSandboxGuideView.jade | 2 +- .../setUpRepositoryGuideView.jade | 20 +++++++++---------- .../staticAhaGuideTemplates.jade | 4 ++-- .../githubIntegrationView.jade | 3 ++- .../mirrorDockerfileView.jade | 2 +- .../viewEnvironmentHeader.jade | 2 +- .../environment/modals/confirmSetupView.jade | 18 +++++++++++------ .../modals/forms/guideForm/guideFormView.jade | 7 ++++--- .../chooseOrganizationModalView.jade | 2 +- client/services/ahaGuideService.js | 6 +++--- 12 files changed, 43 insertions(+), 35 deletions(-) diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 3071851b9..920195143 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -26,7 +26,7 @@ ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Add a Branch + p.p.small.text-gray-light Step 3: Add a Branch p.p( ng-if = "subStep === 'addBranch'" ) Click the ‘Add Branch’ button next to any repo name. diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 7fd210b38..87c1bfdb2 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -11,7 +11,7 @@ ng-if = "isSettingUpRunnabot()" ) //- During aha 4: - | You did it! + | You did it! 👏 svg.grid-content.shrink.iconnables.icons-close( ng-click = "toggleSidebar()" ng-if = "!showOverview" @@ -27,7 +27,7 @@ header.grid-block.vertical.shrink.align-center.justify-center.aha-sidebar-header h4.grid-content.shrink.text-center.h4 Let‘s get running! 👋 .grid-block.shrink.vertical.padding-sm - p.grid-content.shrink.text-center.p It’ll take a few steps to get everything set up. But don’t worry — we’re here to help! + p.grid-content.shrink.text-center.p It takes just three steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.shrink.btn.btn-md.green( ng-click = "toggleSidebar()" ) Get Started @@ -43,7 +43,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Choose your Organization + p.p.strong Step 1: Choose your Organization p.small This is the first step to success. .grid-block.shrink.align-center.padding-sm.aha-guide( @@ -68,7 +68,7 @@ ) .grid-block.vertical.aha-text p.p.strong Add a Repository - p.small Set up your project and get it running! + p.small Add your templates and get them running! .grid-block.shrink.align-center.padding-sm.aha-guide( ng-class = "{'disabled': getCurrentStep() !== steps.ADD_FIRST_BRANCH}" @@ -90,7 +90,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Add a Branch + p.p.strong Step 3: Add a Branch p.small Your branches will update on every commit you make. .grid-block.vertical.align-center.form-github( diff --git a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade index db67e2d3d..25dcdcdec 100644 --- a/client/directives/components/ahaGuide/components/createSandboxGuideView.jade +++ b/client/directives/components/ahaGuide/components/createSandboxGuideView.jade @@ -16,7 +16,7 @@ p.p.small.text-gray-light {{ AGC.title }} p.p( ng-if = "AGC.subStep === 'orgSelection'" - ) Choose an organization to create your environment for. + ) Select the organization you want to use with Runnable. p.p( ng-if = "AGC.subStep === 'dockLoading'" ) Hang tight! diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 5e61ca92e..5560e1ddc 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -46,15 +46,15 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'addRepository'" - ) Add your repository by clicking ‘Create Template’. + ) First, add your repository by clicking ‘Create Template’. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'containerSelection'" - ) Select a repository to configure. + ) Select a service to configure. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'dockerfileMirroring'" - ) How would you like to configure your repo? + ) How would you like to configure your repository? p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'nameContainer'" @@ -66,19 +66,19 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'commands'" - ) Choose commands and packages. + ) Configure commands and packages. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" - ) If your app needs additional configuration… + ) Configure additional settings (if necessary). p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" - ) We’ve imported your dockerfile, click ‘Save & Build’ to build it! + ) We’ve imported your Dockerfile. Click ‘Save & Build’ to build it! p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'logs'" - ) We‘re building! Build time varies depending on your template. + ) We‘re building! Build time varies depending on your build commands. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" @@ -86,10 +86,10 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "(AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success') || !AGC.showError" - ) Your build finished! Check that it looks good, then click ‘Done’. + ) Your build finished! Verify that it looks good, then click ‘Done’. p.p( ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" - ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. + ) Once you’re done configuring, head to your containers to start adding branches. .grid-block.vertical.aha-text( @@ -103,7 +103,7 @@ p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && (AGC.errorState === 'nonRunningContainer' || AGC.subStep === 'exitedEarly')" - ) Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, + ) Your template isn’t running yet! Check the logs to debug any issues. If you’re stumped, a.link( ng-click = "askEngineers()" ) ask our engineers diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade index ae640a621..53e06546a 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/staticAhaGuideTemplates.jade @@ -16,10 +16,10 @@ ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Add your First Repository + p.p.small.text-gray-light Step 2: Configure your Application p.p( ng-if = "staticAddRepo" ) Add your repository by clicking ‘Create Template’. p.p( ng-if = "showAhaNavPopover" - ) Add more templates if your project requires it. Once you’re done, head to your containers to start adding branches. + ) Once you’re done configuring, head to your containers to start adding branches. diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index 4b45612ee..15670efcc 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -61,6 +61,7 @@ a.grid-content.shrink.btn.btn-md.green( br | of your org to invite Runnabot. - span + //- hiding until praful writes his doc + //- span br a.small.link More about Runnabot diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index f1f47e75e..8d2504147 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -21,7 +21,7 @@ use( xlink:href = "#icons-file-new" ) - .grid-content Set up with Runnable + .grid-content Start with our setup wizard. //- if there is only one, [check] by default input.checkbox( name = "dockerfile" diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index b604fcd49..7f1687db6 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -24,7 +24,7 @@ button.grid-block.shrink.btn.btn-md.green( ) .grid-block.vertical.aha-text p.p.small.text-gray-light Step 2: Add a Repository - p.p To add a database or a service, click ‘Create Template’. + p.p To add a database or other service to your application, click ‘Create Template’. .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green Got It diff --git a/client/directives/environment/modals/confirmSetupView.jade b/client/directives/environment/modals/confirmSetupView.jade index 7c4fafc3d..1a2153993 100644 --- a/client/directives/environment/modals/confirmSetupView.jade +++ b/client/directives/environment/modals/confirmSetupView.jade @@ -2,7 +2,7 @@ img.img( src = "/build/images/runnabear-working.png" ) - .modal-dialog.modal-sm + .modal-dialog.modal-md .modal-body svg.iconnables.icons-close( ng-click = "CMC.actions.cancel()" @@ -11,15 +11,21 @@ xlink:href = "#icons-close" ) .grid-block.vertical.padding-md - h3.grid-content.h3.text-center Is your project running? - p.grid-content.p.text-center.text-gray We recommend finishing setup before continuing. If you need help getting your project running, + h3.grid-content.h3.text-center Is your application set up? + p.grid-content.p.text-center.text-gray Go back to resolve any configuration issues or to add any other templates. Need more help? Head over to our + a.link( + href = "https://support.runnable.com/" + target = "_blank" + ) docs + | or //- Opens Intercom chat, and starts with "I need help setting up!": - a.link chat with our devs - | . + a.link chat + | with our devs. + p.grid-content.p.text-center.text-gray If you’re done, continue to the Containers page. footer.modal-footer.clearfix button.btn.btn-md.btn-cancel.gray.float-left( ng-click = "CMC.actions.cancel()" ) Go Back button.btn.btn-md.green.float-right( ng-click = "$root.$broadcast('confirmedSetup');CMC.actions.confirm()" - ) It‘s Running! + ) Continue diff --git a/client/directives/environment/modals/forms/guideForm/guideFormView.jade b/client/directives/environment/modals/forms/guideForm/guideFormView.jade index 890a0c53f..7ee073646 100644 --- a/client/directives/environment/modals/forms/guideForm/guideFormView.jade +++ b/client/directives/environment/modals/forms/guideForm/guideFormView.jade @@ -1,8 +1,9 @@ -p.p.grid-content.shrink.text-center.text-gray.padding-sm You have the basic parts of your application set up! Many applications require additional configuration. Use our tools to change options specific to your application before building. +p.p.grid-content.shrink.text-center.text-gray.padding-sm You have the basic parts of your application set up and ready to build! If your application requires additional configuration, use our tools to change options before building. a.grid-content.shrink.link.small.text-gray( - href = "#" + href = "https://support.runnable.com/hc/en-us/categories/201194573-Quickstarts" + target = "_blank" ) View Setup Guide svg.iconnables.icons-external use( xlink:href= "#icons-link-external" - ) \ No newline at end of file + ) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 12a0be358..cfe2e89db 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -26,7 +26,7 @@ p.p.padding-xs.text-center.fade( ng-class = "{'in': isActivePanel()}" ng-if = "!$root.featureFlags.aha" - ) Choose an organization to use on Runnable. If you don’t see your organization, check if you’ve granted access + ) Select the organization you want to use with Runnable.. If you don’t see your organization, check if you’ve granted access a.link( href = "https://github.com/settings/connections/applications/d42d6634d4070c9d9bf9" target = "_blank" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 28f8d4d30..c63f2ec39 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -32,7 +32,7 @@ function ahaGuide( title: 'Step 1: Choose your Organization', subSteps: { orgSelection: { - caption: 'Choose an organization to create your sandbox for.', + caption: 'Select the organization you want to use with Runnable.', className: 'aha-meter-33' }, dockLoading: { @@ -123,8 +123,8 @@ function ahaGuide( } }, buildStatus: { - building: 'We‘re building! Build time varies depending on your template.', - starting: 'We‘re building! Build time varies depending on your template.', + building: 'We‘re building! Build time varies depending on your build commands.', + starting: 'We‘re building! Build time varies depending on your build commands.', running: 'Looking good! Check out your URL, and click ‘Done’ if it looks good to you too.', stopped: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', cmdFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', From 22281f46a6c24ec4fbc407bcf163e927209e5e6a Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 18:50:16 -0700 Subject: [PATCH 448/577] being dumb --- client/services/ahaGuideService.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index d932f15e7..c2905f36b 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -224,7 +224,6 @@ function ahaGuide( cachedStep = STEPS.CHOOSE_ORGANIZATION; } else if (!$rootScope.featureFlags.aha || !isInGuide()) { cachedStep = STEPS.COMPLETED; - refreshHasRunnabot(); } else if (!hasConfirmedSetup()) { cachedStep = STEPS.ADD_FIRST_REPO; } else { From 05ca63c48aa53179faea5981f24cad2690918506 Mon Sep 17 00:00:00 2001 From: thejsj Date: Mon, 19 Sep 2016 18:58:04 -0700 Subject: [PATCH 449/577] 4.23.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c23f3442d..bbc45505b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.5", + "version": "4.23.6", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 850d4d9200aceb15a4ce90665b36554d953b8ab0 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 19 Sep 2016 19:08:26 -0700 Subject: [PATCH 450/577] link to docs for "chat with our devs" --- client/directives/environment/modals/confirmSetupView.jade | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/directives/environment/modals/confirmSetupView.jade b/client/directives/environment/modals/confirmSetupView.jade index 1a2153993..5379fde30 100644 --- a/client/directives/environment/modals/confirmSetupView.jade +++ b/client/directives/environment/modals/confirmSetupView.jade @@ -19,7 +19,10 @@ ) docs | or //- Opens Intercom chat, and starts with "I need help setting up!": - a.link chat + a.link( + href = "https://support.runnable.com/hc/en-us/articles/212930166" + target = "_blank" + ) chat | with our devs. p.grid-content.p.text-center.text-gray If you’re done, continue to the Containers page. footer.modal-footer.clearfix From 155603ce6f4cf4368155d661170fa51c6f14717f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 19 Sep 2016 20:02:31 -0700 Subject: [PATCH 451/577] fix "ask our engineers" --- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 5560e1ddc..092a8b51e 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -105,7 +105,8 @@ ng-if = "AGC.isInGuide() && (AGC.errorState === 'nonRunningContainer' || AGC.subStep === 'exitedEarly')" ) Your template isn’t running yet! Check the logs to debug any issues. If you’re stumped, a.link( - ng-click = "askEngineers()" + href = "https://support.runnable.com/hc/en-us/articles/212930166" + target = "_blank" ) ask our engineers | ! From 2ad1fa99438393e96ca0734a76516f341e755d22 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 19 Sep 2016 20:27:58 -0700 Subject: [PATCH 452/577] more copy updates --- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 4 ++-- client/directives/components/buildLogs/buildLogsView.jade | 2 +- .../components/mirrorDockerfile/mirrorDockerfileView.jade | 2 +- .../modalChooseOrganization/chooseOrganizationModalView.jade | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 092a8b51e..140feb544 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -107,8 +107,8 @@ a.link( href = "https://support.runnable.com/hc/en-us/articles/212930166" target = "_blank" - ) ask our engineers - | ! + ) chat with our devs + | . .grid-block.vertical.aha-text( diff --git a/client/directives/components/buildLogs/buildLogsView.jade b/client/directives/components/buildLogs/buildLogsView.jade index b1dadb311..dbec4ecaa 100644 --- a/client/directives/components/buildLogs/buildLogsView.jade +++ b/client/directives/components/buildLogs/buildLogsView.jade @@ -24,7 +24,7 @@ | or a.link.icons-intercom( ng-click = "BLC.actions.openIntercom()" - ) chat with a dev + ) chat with our devs .pre.build-log( ng-if = "\ diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index 8d2504147..94d289f30 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -21,7 +21,7 @@ use( xlink:href = "#icons-file-new" ) - .grid-content Start with our setup wizard. + .grid-content Start with our setup guide. //- if there is only one, [check] by default input.checkbox( name = "dockerfile" diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index cfe2e89db..5d05eb283 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -26,7 +26,7 @@ p.p.padding-xs.text-center.fade( ng-class = "{'in': isActivePanel()}" ng-if = "!$root.featureFlags.aha" - ) Select the organization you want to use with Runnable.. If you don’t see your organization, check if you’ve granted access + ) Select the organization you want to use with Runnable. If you don’t see your organization, check if you’ve granted access a.link( href = "https://github.com/settings/connections/applications/d42d6634d4070c9d9bf9" target = "_blank" From c0bd13f8ae85275b5194361a00135b73cf8812e6 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 20:41:09 -0700 Subject: [PATCH 453/577] Edited aha guide controller to not care about non repo instance --- client/directives/components/ahaGuide/AhaGuideController.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 680ae5491..a9c559101 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -159,8 +159,9 @@ function AhaGuideController( * @param {object} instances an object containing a collection of instances */ function callPopover(config, instances) { - if (config.workingRepoInstance && config.nonRepoInstance && instances.models.length === 2) { + if (config.workingRepoInstance && instances.models.length === 2) { $rootScope.$broadcast('launchAhaNavPopover'); + AGC.showAhaNavPopover = true; } else if (config.workingRepoInstance && instances.models.length === 1) { $rootScope.$broadcast('showAddServicesPopover', true); } @@ -172,7 +173,7 @@ function AhaGuideController( $rootScope.$broadcast('ahaGuideEvent', { error: 'exitedEarly' }); - } else if (ahaGuide.isAddingFirstRepo() && AGC.isBuildSuccessful) { + } else if (ahaGuide.isAddingFirstRepo() && AGC.isBuildSuccessful && !AGC.showAhaNavPopover) { $rootScope.$broadcast('showAddServicesPopover', true); } }); From 148b8a72505dbbcea5e4df744f5d025eb13919dd Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 20:44:49 -0700 Subject: [PATCH 454/577] fix popover for auto-launch fix other auto-launch related things --- client/directives/components/ahaGuide/ahaGuideView.jade | 2 +- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 +- client/templates/instances/viewInstancesList.jade | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 7c1f711c7..c2d885ab7 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -25,7 +25,7 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpRunnabot()" + ng-if = "!AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpAutoLaunch()" pop-over pop-over-actions = "AGC ? AGC.popoverActions : EC.popoverActions" pop-over-active = "ahaMenuGuidePopover.data.show" diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 7fd210b38..192ca765f 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -34,7 +34,7 @@ //- During ahas 1-3 .grid-block.shrink.vertical.aha-guide-wrapper( - ng-if = "getCurrentStep() < steps.SETUP_RUNNABOT" + ng-if = "!isSettingUpRunnabot()" ) .grid-block.shrink.align-center.padding-sm.aha-guide.disabled .grid-block.shrink.aha-meter.aha-meter-100 diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 7f9bb5c2a..c4c1f515c 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -101,7 +101,7 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" pop-over-trigger = "activeAttr" - pop-over-uncloseable = "CIS.isSettingUpAutoLaunch()" + pop-over-uncloseable = "CIS.isAddingFirstBranch()" pop-over-data = "'ahaTemplate'" ) From 3688fc3e0fcc6e00f99cbc660782a24f464c7fe4 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 20:52:37 -0700 Subject: [PATCH 455/577] Flag set to true --- client/services/featureFlagService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index b5947d01e..2c6bb53e1 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -8,7 +8,7 @@ function featureFlags( ) { var defaultFeatureFlags = { addBranches: true, - aha: false, + aha: true, allowIsolatedUpdate: false, autoIsolation: false, autoIsolationSetup: false, From 48b501da226a4d79520612683a05cb68f9ae0455 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 21:07:29 -0700 Subject: [PATCH 456/577] 4.23.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bbc45505b..8625cf091 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.6", + "version": "4.23.7", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 1b0b0b76b3f940f91884fa23865edef088486e8b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 21:54:01 -0700 Subject: [PATCH 457/577] 4.23.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8625cf091..487580cf2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.7", + "version": "4.23.8", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 1c25a5391f18ff91a83529ceb36778edf63b19c1 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Mon, 19 Sep 2016 22:10:20 -0700 Subject: [PATCH 458/577] fix copy --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 87c1bfdb2..8c3fa500a 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -27,7 +27,7 @@ header.grid-block.vertical.shrink.align-center.justify-center.aha-sidebar-header h4.grid-content.shrink.text-center.h4 Let‘s get running! 👋 .grid-block.shrink.vertical.padding-sm - p.grid-content.shrink.text-center.p It takes just three steps to get everything set up. But don’t worry — we’re here to help! + p.grid-content.shrink.text-center.p It takes just 3 steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.shrink.btn.btn-md.green( ng-click = "toggleSidebar()" ) Get Started @@ -67,7 +67,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Add a Repository + p.p.strong Step 2: Add a Repository p.small Add your templates and get them running! .grid-block.shrink.align-center.padding-sm.aha-guide( From 72b6dd967005c66b2a9acb458640cd1152b4a756 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 22:35:10 -0700 Subject: [PATCH 459/577] First commit for feature --- .../components/ahaGuide/AhaGuideController.js | 10 ++- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 15 +++- .../setUpRepositoryGuideView.jade | 21 +++-- client/services/ahaGuideService.js | 90 +++++++++++-------- 4 files changed, 91 insertions(+), 45 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index a9c559101..5ecf7ec19 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -30,11 +30,16 @@ function AhaGuideController( $rootScope.$broadcast('ahaGuideEvent', { error: AGC.errorState }); - } else if (ahaGuide.isAddingFirstRepo() && AGC.subStepIndex === 7) { - callPopover(config, instances); + } else if (ahaGuide.isAddingFirstRepo()) { + if (AGC.subStepIndex === 7) { + callPopover(config, instances); + updateCaption('complete'); + } } } else if (ahaGuide.isAddingFirstBranch()) { AGC.showError = true; + } else { + ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_REPO, 'addRepository'); } }) .catch(errs.handler); @@ -109,6 +114,7 @@ function AhaGuideController( AGC.subStep = status; AGC.className = currentMilestone.subSteps[status].className; AGC.subStepIndex = currentMilestone.subSteps[status].step; + ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_REPO, status); } function handleBuildUpdate(update) { diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 7fd210b38..104ffe79b 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -54,16 +54,25 @@ ) .grid-block.shrink.aha-meter( ng-class = "{\ - 'aha-meter-100': getCurrentStep() > steps.ADD_FIRST_REPO\ + 'aha-meter-11': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'addRepository',\ + 'aha-meter-22': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'containerSelection',\ + 'aha-meter-33': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'dockerfileMirroring',\ + 'aha-meter-44': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'nameContainer',\ + 'aha-meter-55': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'repository',\ + 'aha-meter-66': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'commands',\ + 'aha-meter-77': isAddingFirstRepo() && (getFurthestSubstep(steps.ADD_FIRST_REPO) === 'buildFiles' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'default' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'env' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'files' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'filesMirror' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'ports' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'translation'),\ + 'aha-meter-88': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'logs',\ + 'aha-meter-88': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'exitedEarly',\ + 'aha-meter-100': (isAddingFirstRepo() && (getFurthestSubstep(steps.ADD_FIRST_REPO) === 'success' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'complete')) || getCurrentStep() > steps.ADD_FIRST_REPO,\ }" ) svg.iconnables use( - ng-if = "getCurrentStep() <= steps.ADD_FIRST_REPO" + ng-if = "getCurrentStep() <= steps.ADD_FIRST_REPO && getFurthestSubstep(steps.ADD_FIRST_REPO) !== 'complete')" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "getCurrentStep() > steps.ADD_FIRST_REPO" + ng-if = "getCurrentStep() > steps.ADD_FIRST_REPO || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'complete')" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 239d794d7..9f372cdf6 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -1,16 +1,27 @@ .grid-block.shrink.aha-meter.js-animate( - class = "{{ AGC.className }}" - ng-class = "{'aha-error': AGC.showError || AGC.errorState}" + ng-class = "{\ + 'aha-error': AGC.showError || AGC.errorState,\ + 'aha-meter-11': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'addRepository',\ + 'aha-meter-22': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'containerSelection',\ + 'aha-meter-33': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'dockerfileMirroring',\ + 'aha-meter-44': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'nameContainer',\ + 'aha-meter-55': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'repository',\ + 'aha-meter-66': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'commands',\ + 'aha-meter-77': (AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'buildFiles' || AGC.ahaGuide.furthestStep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'default' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'env' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'files' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'filesMirror' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'ports' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'translation'),\ + 'aha-meter-88': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'logs',\ + 'aha-meter-88': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'exitedEarly',\ + 'aha-meter-100': ((AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'success' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'complete')) || getCurrentStep() > steps.ADD_FIRST_REPO,\ + }" ) svg.iconnables( ng-if = "!AGC.showError && !AGC.errorState" ) use( - ng-if = "AGC.ahaGuide.isAddingFirstRepo() && AGC.subStep !== 'complete'" + ng-if = "AGC.ahaGuide.isAddingFirstRepo() && AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) !== 'complete'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AGC.subStep === 'complete' || AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'complete' || AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( @@ -29,7 +40,7 @@ ng-if = "!AGC.showError" ) use( - ng-if = "AGC.subStep === 'complete'" + ng-if = "AGC.subStep === 'complete' || AGC.isBuildSuccessful" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index c2905f36b..9a6d50946 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -60,78 +60,97 @@ function ahaGuide( orgSelection: 0, dockLoading: 1, dockLoaded: 2 - } + }, + defaultSubstep: 'orgSelection' }; + stepList[STEPS.ADD_FIRST_REPO] = { title: 'Step 2: Add a Repository', subSteps: { addRepository: { - className: 'aha-meter-10', - step: 0 + className: 'aha-meter-11', + step: 0, + value: 10 }, containerSelection: { - className: 'aha-meter-20', - step: 1 + className: 'aha-meter-22', + step: 1, + value: 20 }, dockerfileMirroring: { - className: 'aha-meter-30', - step: 2 + className: 'aha-meter-33', + step: 2, + value: 30 }, nameContainer: { - className: 'aha-meter-40', - step: 3 + className: 'aha-meter-44', + step: 3, + value: 40 }, repository: { - className: 'aha-meter-50', - step: 4 + className: 'aha-meter-55', + step: 4, + value: 50 }, commands: { - className: 'aha-meter-60', - step: 5 + className: 'aha-meter-66', + step: 5, + value: 60 }, buildfiles: { - className: 'aha-meter-70', - step: 6 + className: 'aha-meter-77', + step: 6, + value: 70 }, default: { - className: 'aha-meter-70', - step: 6 + className: 'aha-meter-77', + step: 6, + value: 70 }, env: { - className: 'aha-meter-70', - step: 6 + className: 'aha-meter-77', + step: 6, + value: 70 }, files: { - className: 'aha-meter-70', - step: 6 + className: 'aha-meter-77', + step: 6, + value: 70 }, filesMirror: { - className: 'aha-meter-70', - step: 6 + className: 'aha-meter-77', + step: 6, + value: 70 }, ports: { - className: 'aha-meter-70', - step: 6 + className: 'aha-meter-77', + step: 6, + value: 70 }, translation: { - className: 'aha-meter-70', - step: 6 + className: 'aha-meter-77', + step: 6, + value: 70 }, logs: { - className: 'aha-meter-80', - step: 7 + className: 'aha-meter-88', + step: 7, + value: 80 }, exitedEarly: { - className: 'aha-meter-80', - step: 7 + className: 'aha-meter-88', + step: 7, + value: 80 }, success: { - className: 'aha-meter-90', - step: 8 + className: 'aha-meter-100', + step: 8, + value: 90 }, complete: { className: 'aha-meter-100', - step: 9 + step: 9, + value: 100 } }, buildStatus: { @@ -142,7 +161,8 @@ function ahaGuide( cmdFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', buildFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' - } + }, + defaultSubstep: 'addRepository' }; stepList[STEPS.ADD_FIRST_BRANCH] = { From b50b6c76bbf90c65cbaa8c60395f3c0665c1f2bd Mon Sep 17 00:00:00 2001 From: thejsj Date: Mon, 19 Sep 2016 22:37:20 -0700 Subject: [PATCH 460/577] Add email to contigency plan --- .../modalChooseOrganization/chooseOrganizationModalView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 157aa557e..bc89aa4e0 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -128,7 +128,7 @@ p.p.text-gray.text-center.padding-xs( ng-if = "$root.featureFlags.contingencyPlan" ) We’ll email you at - span taylor@runnable.com + span {{ COS.user.attrs.email }} | as soon we’re done spinning up your infrastructure. Thanks for your patience. animated-panel.modal-body.grid-block.vertical( name = "dockLoaded" From b7af5b3ad9b64b239572f1e46fec001699963af0 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 22:57:04 -0700 Subject: [PATCH 461/577] Add checkers in EC and CIS to check if the Aha sidebar should be shown --- client/config/routes.js | 12 +++++++++++- client/controllers/controllerInstance.js | 14 ++++++++++++++ .../environment/environmentController.js | 13 +++++++++++++ client/services/ahaGuideService.js | 8 ++++---- test/unit/controllers/controllerInstance.unit.js | 2 ++ .../unit/environment/environmentController.unit.js | 1 + 6 files changed, 45 insertions(+), 5 deletions(-) diff --git a/client/config/routes.js b/client/config/routes.js index 17ae791c7..250f5827f 100755 --- a/client/config/routes.js +++ b/client/config/routes.js @@ -213,6 +213,10 @@ module.exports = [ controller: 'ControllerInstances', controllerAs: 'CIS', resolve: { + instancesByPod: function (fetchInstancesByPod, $stateParams, $state) { + $state.params.userName = $stateParams.userName; + return fetchInstancesByPod(); + }, hasConfirmedSetup: function ( $rootScope, $state, @@ -237,7 +241,13 @@ module.exports = [ url: '^/:userName/:instanceName', templateUrl: 'viewInstance', controller: 'ControllerInstance', - controllerAs: 'CI' + controllerAs: 'CI', + resolve: { + instancesByPod: function (fetchInstancesByPod, $stateParams, $state) { + $state.params.userName = $stateParams.userName; + return fetchInstancesByPod(); + } + } } ]; Object.freeze(module.exports); diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index 14deff10e..a76780512 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -26,6 +26,7 @@ function ControllerInstance( keypather, loading, OpenItems, + instancesByPod, pageName, setLastInstance ) { @@ -209,4 +210,17 @@ function ControllerInstance( favico.setInstanceState(keypather.get($scope, 'dataInstance.data.instance')); }); }); + + if (ahaGuide.isInGuide()) { + if (keypather.get(instancesByPod, 'models.length')) { + if (instancesByPod.models.some(function (instance) { + return instance.attrs.hasAddedBranches || keypather.get(instance, 'children.models.length'); + })) { + // timeout for the animation + $timeout(function () { + CIS.showSidebar = true; + }); + } + } + } } diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index ff4ea3c3e..6107fdd8c 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -163,4 +163,17 @@ function EnvironmentController( $scope.$on('showAddServicesPopover', function(event, toggle) { EC.showAddServicePopover = toggle; }); + + if (ahaGuide.isInGuide()) { + if (keypather.get(instancesByPod, 'models.length')) { + if (instancesByPod.models.some(function (instance) { + return instance.attrs.hasAddedBranches || keypather.get(instance, 'children.models.length'); + })) { + // timeout for the animation + $timeout(function () { + EC.showSidebar = true; + }); + } + } + } } diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 34cc1ec08..01033c03e 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -232,7 +232,7 @@ function ahaGuide( var hasAutoLaunch = false; if (keypather.get(instances, 'models.length')) { instances.models.some(function (instance) { - hasBranchLaunched = hasBranchLaunched || instance.attrs.hasAddedBranches; + hasBranchLaunched = hasBranchLaunched || instance.attrs.hasAddedBranches || keypather.get(instance, 'children.models.length'); hasAutoLaunch = hasAutoLaunch || !instance.attrs.shouldNotAutofork; // This will short circuit once we have found both of these true return hasAutoLaunch && hasBranchLaunched; @@ -271,9 +271,9 @@ function ahaGuide( hasAha: false } }) - .then(function(updatedOrg) { - updateCurrentOrg(updatedOrg); - }); + .then(function (updatedOrg) { + updateCurrentOrg(updatedOrg); + }); } return { diff --git a/test/unit/controllers/controllerInstance.unit.js b/test/unit/controllers/controllerInstance.unit.js index abcca6489..08cea70b9 100644 --- a/test/unit/controllers/controllerInstance.unit.js +++ b/test/unit/controllers/controllerInstance.unit.js @@ -63,10 +63,12 @@ describe('controllerInstance'.bold.underline.blue, function () { $provide.value('ahaGuide', { isAddingFirstRepo: sinon.stub().returns(false), getCurrentStep: sinon.stub().returns(1), + isInGuide: sinon.stub().returns(true), steps: { ADD_FIRST_BRANCH: 123 } }); + $provide.value('instancesByPod', {}); $provide.value('favico', mockFavico); $provide.factory('fetchUser', function ($q) { return function () { diff --git a/test/unit/environment/environmentController.unit.js b/test/unit/environment/environmentController.unit.js index 5634df436..7eb7abaf5 100644 --- a/test/unit/environment/environmentController.unit.js +++ b/test/unit/environment/environmentController.unit.js @@ -73,6 +73,7 @@ describe('environmentController'.bold.underline.blue, function () { $provide.value('ahaGuide', { isAddingFirstRepo: sinon.stub().returns(false), getCurrentStep: sinon.stub(), + isInGuide: sinon.stub().returns(true), steps: { ADD_FIRST_REPO: 'addFirstRepo?!' } From 20ddbd5f24f55436839b307b608dd27fb788a8ca Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 23:24:42 -0700 Subject: [PATCH 462/577] watch for org changes --- client/controllers/controllerApp.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index 1751d245d..c22ebc03d 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -73,10 +73,11 @@ function ControllerApp( actions: {}, state: $state }; - - if (user.socket) { - user.socket.joinOrgRoom(activeAccount.oauthId()); - } + $scope.$watch('dataApp.data.activeAccount', function (activeAccount) { + if (user.socket) { + user.socket.joinOrgRoom(activeAccount.oauthId()); + } + }); $rootScope.pageName = pageName; From f632e4ee117c46da320537d442e8aaedf6f6fc6a Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 19 Sep 2016 23:27:08 -0700 Subject: [PATCH 463/577] Store last step for use --- .../components/ahaGuide/AhaGuideController.js | 3 ++- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 8 ++++---- .../setUpRepositoryGuideView.jade | 16 ++++++---------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 5ecf7ec19..88586d223 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -27,13 +27,14 @@ function AhaGuideController( if (!config.workingRepoInstance) { AGC.showError = true; AGC.errorState = 'nonRunningContainer'; + updateCaption('exitedEarly'); $rootScope.$broadcast('ahaGuideEvent', { error: AGC.errorState }); } else if (ahaGuide.isAddingFirstRepo()) { if (AGC.subStepIndex === 7) { callPopover(config, instances); - updateCaption('complete'); + updateCaption('success'); } } } else if (ahaGuide.isAddingFirstBranch()) { diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index cfd26cbdb..59ea7f116 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -60,19 +60,19 @@ 'aha-meter-44': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'nameContainer',\ 'aha-meter-55': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'repository',\ 'aha-meter-66': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'commands',\ - 'aha-meter-77': isAddingFirstRepo() && (getFurthestSubstep(steps.ADD_FIRST_REPO) === 'buildFiles' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'default' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'env' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'files' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'filesMirror' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'ports' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'translation'),\ + 'aha-meter-77': isAddingFirstRepo() && (getFurthestSubstep(steps.ADD_FIRST_REPO) === 'buildfiles' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'default' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'env' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'files' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'filesMirror' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'ports' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'translation'),\ 'aha-meter-88': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'logs',\ 'aha-meter-88': isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'exitedEarly',\ - 'aha-meter-100': (isAddingFirstRepo() && (getFurthestSubstep(steps.ADD_FIRST_REPO) === 'success' || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'complete')) || getCurrentStep() > steps.ADD_FIRST_REPO,\ + 'aha-meter-100': (isAddingFirstRepo() && getFurthestSubstep(steps.ADD_FIRST_REPO) === 'success') || getCurrentStep() > steps.ADD_FIRST_REPO,\ }" ) svg.iconnables use( - ng-if = "getCurrentStep() <= steps.ADD_FIRST_REPO && getFurthestSubstep(steps.ADD_FIRST_REPO) !== 'complete')" + ng-if = "getFurthestSubstep(steps.ADD_FIRST_REPO) !== 'success'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "getCurrentStep() > steps.ADD_FIRST_REPO || getFurthestSubstep(steps.ADD_FIRST_REPO) === 'complete')" + ng-if = "getFurthestSubstep(steps.ADD_FIRST_REPO) === 'success'" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 90bea4ff0..433c28034 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -7,21 +7,20 @@ 'aha-meter-44': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'nameContainer',\ 'aha-meter-55': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'repository',\ 'aha-meter-66': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'commands',\ - 'aha-meter-77': (AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'buildFiles' || AGC.ahaGuide.furthestStep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'default' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'env' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'files' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'filesMirror' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'ports' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'translation'),\ - 'aha-meter-88': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'logs',\ - 'aha-meter-88': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'exitedEarly',\ - 'aha-meter-100': ((AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'success' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'complete')) || getCurrentStep() > steps.ADD_FIRST_REPO,\ + 'aha-meter-77': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'buildfiles' || AGC.ahaGuide.furthestStep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'default' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'env' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'files' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'filesMirror' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'ports' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'translation',\ + 'aha-meter-88': AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'logs' || AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'exitedEarly',\ + 'aha-meter-100': (AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'success') || getCurrentStep() > steps.ADD_FIRST_REPO,\ }" ) svg.iconnables( ng-if = "!AGC.showError && !AGC.errorState" ) use( - ng-if = "AGC.ahaGuide.isAddingFirstRepo() && AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) !== 'complete'" + ng-if = "AGC.ahaGuide.isAddingFirstRepo() && AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) !== 'success'" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'complete' || AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" + ng-if = "AGC.ahaGuide.furthestSubstep(AGC.ahaGuide.steps.ADD_FIRST_REPO) === 'success' || AGC.ahaGuide.getCurrentStep() > AGC.ahaGuide.steps.ADD_FIRST_REPO" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( @@ -40,7 +39,7 @@ ng-if = "!AGC.showError" ) use( - ng-if = "AGC.subStep === 'complete' || AGC.isBuildSuccessful" + ng-if = "AGC.subStep === 'success' || AGC.isBuildSuccessful" xlink:href = "#icons-check" ) svg.iconnables.icons-alert( @@ -94,9 +93,6 @@ ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'success'" ) Your build finished! Verify that it looks good, then click ‘Done’. - p.p( - ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'complete'" - ) Once you’re done configuring, head to your containers to start adding branches. .grid-block.vertical.aha-text( From 17ec79eab625fc3dcb9950ade8ff52dffe573cdf Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 23:37:11 -0700 Subject: [PATCH 464/577] 4.23.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 487580cf2..8edb61df0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.8", + "version": "4.23.9", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 2dc62743a8061304b131d6a03593413e12877ea2 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Mon, 19 Sep 2016 23:39:01 -0700 Subject: [PATCH 465/577] 4.23.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8edb61df0..662208315 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.9", + "version": "4.23.10", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 2cb8d6130fd2c0e3a81798510ee33921daa46e3f Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 00:12:33 -0700 Subject: [PATCH 466/577] Fixed broken aha end triggering --- client/controllers/controllerInstance.js | 2 +- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 +- client/services/ahaGuideService.js | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index f41bbcbde..01f8c10a5 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -34,7 +34,7 @@ function ControllerInstance( var CIS = this; CIS.showSidebar = false; CIS.toggleSidebar = function (end) { - if (end) { + if (end === 'end') { ahaGuide.endGuide(); } CIS.showSidebar = !CIS.showSidebar; diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index bf9b7ddb8..ef6ae0147 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -14,7 +14,7 @@ | You did it! 👏 svg.grid-content.shrink.iconnables.icons-close( ng-click = "toggleSidebar()" - ng-if = "!showOverview && isAddingFirstBranch()" + ng-if = "!showOverview && (isAddingFirstBranch() || isAddingFirstRepo())" ) use( xlink:href = "#icons-close" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 2b9a9bee1..8541cdd80 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -28,12 +28,12 @@ function ahaGuide( }); } function refreshHasRunnabot() { - if (hasRunnabot) { - endGuide(); - return; - } + if (hasRunnabot) { return; } return isRunnabotPartOfOrg(keypather.get(currentOrg, 'github.attrs.login')) .then(function (runnabot) { + if (runnabot) { + endGuide(); + } hasRunnabot = runnabot; return hasRunnabot; }); From 698970a2e6a6de3d621198d92e955f72bbfb7e8d Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 00:33:15 -0700 Subject: [PATCH 467/577] Close sidebar when ready --- client/controllers/controllerInstance.js | 1 + client/templates/viewInstance.jade | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/controllers/controllerInstance.js b/client/controllers/controllerInstance.js index 01f8c10a5..35a7f0a26 100644 --- a/client/controllers/controllerInstance.js +++ b/client/controllers/controllerInstance.js @@ -33,6 +33,7 @@ function ControllerInstance( var CIS = this; CIS.showSidebar = false; + CIS.isInGuide = ahaGuide.isInGuide; CIS.toggleSidebar = function (end) { if (end === 'end') { ahaGuide.endGuide(); diff --git a/client/templates/viewInstance.jade b/client/templates/viewInstance.jade index 821e682d3..998c2054c 100644 --- a/client/templates/viewInstance.jade +++ b/client/templates/viewInstance.jade @@ -61,5 +61,5 @@ aha-sidebar toggle-sidebar = "CI.toggleSidebar" show-overview = "false" - ng-if = "$root.featureFlags.aha && CI.showSidebar" + ng-if = "$root.featureFlags.aha && CI.isInGuide() && CI.showSidebar" ) From 3777794bc7b60de01f69c30b79307254c521c115 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 00:45:42 -0700 Subject: [PATCH 468/577] Fix tests --- .../instanceHeader/instanceHeaderDirective.unit.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/unit/directives/components/instanceHeader/instanceHeaderDirective.unit.js b/test/unit/directives/components/instanceHeader/instanceHeaderDirective.unit.js index fd8c50e62..2b7977633 100644 --- a/test/unit/directives/components/instanceHeader/instanceHeaderDirective.unit.js +++ b/test/unit/directives/components/instanceHeader/instanceHeaderDirective.unit.js @@ -4,6 +4,7 @@ var $rootScope, $scope; var element; var $compile; +var isRunnabotPartOfOrgStub; var keypather; var $q; var $elScope; @@ -74,6 +75,10 @@ describe('instanceHeaderDirective'.bold.underline.blue, function () { link: angular.noop }; }); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); }); angular.mock.inject(function (_$compile_, _$timeout_, _$rootScope_, _$q_) { $rootScope = _$rootScope_; From 6f4a64ae6eace2aeb8e72a95c847f473196ef162 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 00:51:54 -0700 Subject: [PATCH 469/577] 5.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 662208315..9a30ad75d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "4.23.10", + "version": "5.0.0", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 9b4eb111d77bbd4b394e7709bddc6b1007d58bfd Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 01:23:22 -0700 Subject: [PATCH 470/577] The add services popover will remain open if not dismissed before clicking containers. --- client/controllers/controllerApp.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/controllers/controllerApp.js b/client/controllers/controllerApp.js index c22ebc03d..c90b31d71 100755 --- a/client/controllers/controllerApp.js +++ b/client/controllers/controllerApp.js @@ -108,6 +108,7 @@ function ControllerApp( event.stopPropagation(); event.preventDefault(); CA.showAhaNavPopover = false; + $rootScope.$broadcast('showAddServicesPopover', false); ModalService.showModal({ controller: 'ConfirmationModalController', controllerAs: 'CMC', From 8dbbe7da46739c90fc1445f42f6a2d21a5ebcedb Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 02:18:49 -0700 Subject: [PATCH 471/577] add shitty polling for now --- .../buildLogs/buildLogsController.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/client/directives/components/buildLogs/buildLogsController.js b/client/directives/components/buildLogs/buildLogsController.js index f99d58e65..1304dabef 100644 --- a/client/directives/components/buildLogs/buildLogsController.js +++ b/client/directives/components/buildLogs/buildLogsController.js @@ -6,7 +6,9 @@ function BuildLogsController( $scope, $rootScope, $timeout, + ahaGuide, errs, + keypather, launchDebugContainer, loading, updateInstanceWithNewBuild, @@ -58,9 +60,25 @@ function BuildLogsController( if (oldStream) { closeStream(oldStream); } + var pollingCount = 10; + function pollForCv() { + promisify(BLC.instance, 'fetch')() + .then(function (instance) { + keypather.get($scope, 'BLC.instance', instance); + }) + .finally(function () { + pollingCount--; + if (pollingCount > 0) { + $timeout(pollForCv, 1000); + } + }); + } BLC.streamFailure = false; var stream = null; if (BLC.instance) { + if (ahaGuide.isInGuide()) { + $timeout(pollForCv, 1000); + } BLC.buildStatus = 'starting'; BLC.buildLogs = []; BLC.buildLogTiming = {}; From e2c09346a8836054528bf9096d3edfa5ffb6e55e Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 02:20:31 -0700 Subject: [PATCH 472/577] add check to stop early --- client/directives/components/buildLogs/buildLogsController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/buildLogs/buildLogsController.js b/client/directives/components/buildLogs/buildLogsController.js index 1304dabef..323413d99 100644 --- a/client/directives/components/buildLogs/buildLogsController.js +++ b/client/directives/components/buildLogs/buildLogsController.js @@ -64,11 +64,11 @@ function BuildLogsController( function pollForCv() { promisify(BLC.instance, 'fetch')() .then(function (instance) { - keypather.get($scope, 'BLC.instance', instance); + keypather.set($scope, 'BLC.instance', instance); }) .finally(function () { pollingCount--; - if (pollingCount > 0) { + if (pollingCount > 0 && keypather.get($scope, 'BLC.instance.attrs.contextVersion.build.dockerContainer')) { $timeout(pollForCv, 1000); } }); From c47b5b3656f06bfde9253d4dc0bf7e13bfd3381e Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 02:23:08 -0700 Subject: [PATCH 473/577] Tests --- test/unit/controllers/buildLogController.unit.js | 1 + .../components/buildLogs/buildLogsController.unit.js | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/test/unit/controllers/buildLogController.unit.js b/test/unit/controllers/buildLogController.unit.js index 06b4a6619..ed3696921 100644 --- a/test/unit/controllers/buildLogController.unit.js +++ b/test/unit/controllers/buildLogController.unit.js @@ -30,6 +30,7 @@ describe('BuildLogController'.bold.underline.blue, function () { $provide.value('primus', mockPrimus); $provide.value('$log', ctx.$log); $provide.value('errs', ctx.errs); + }); angular.mock.inject(function ( _$controller_, diff --git a/test/unit/directives/components/buildLogs/buildLogsController.unit.js b/test/unit/directives/components/buildLogs/buildLogsController.unit.js index e46c60522..c3ebf70c0 100644 --- a/test/unit/directives/components/buildLogs/buildLogsController.unit.js +++ b/test/unit/directives/components/buildLogs/buildLogsController.unit.js @@ -18,6 +18,7 @@ describe('BuildLogsController'.bold.underline.blue, function () { var mockCreateDebugContainer; var mockDebugContainer; var mockErrs; + var isRunnabotPartOfOrgStub; function setup(useInstance, dontIncludeBuildDockerContainer) { mockInstance = { @@ -76,6 +77,11 @@ describe('BuildLogsController'.bold.underline.blue, function () { mockCreateDebugContainer = sinon.stub().returns($q.when(mockDebugContainer)); return mockCreateDebugContainer; }); + + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); }); angular.mock.inject(function ( _$controller_, From d0b99f09f5bd78b71bdf7016c84654566703daec Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 02:28:57 -0700 Subject: [PATCH 474/577] 5.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a30ad75d..efd32fd8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.0", + "version": "5.0.1", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 4b3b5a5e31b11d91662e2ca74af206c9d3950641 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 02:39:48 -0700 Subject: [PATCH 475/577] oops --- client/directives/components/buildLogs/buildLogsController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/buildLogs/buildLogsController.js b/client/directives/components/buildLogs/buildLogsController.js index 323413d99..96930dcfe 100644 --- a/client/directives/components/buildLogs/buildLogsController.js +++ b/client/directives/components/buildLogs/buildLogsController.js @@ -68,7 +68,7 @@ function BuildLogsController( }) .finally(function () { pollingCount--; - if (pollingCount > 0 && keypather.get($scope, 'BLC.instance.attrs.contextVersion.build.dockerContainer')) { + if (pollingCount > 0 && !keypather.get($scope, 'BLC.instance.attrs.contextVersion.build.dockerContainer')) { $timeout(pollForCv, 1000); } }); From 1af2585f72d3b83c49b41970c384bf8e300f1e97 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 02:42:20 -0700 Subject: [PATCH 476/577] 5.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index efd32fd8d..3e5f58a79 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.1", + "version": "5.0.2", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 99d1b21076218eed741ed8b2eeee966c219864c0 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 08:25:31 -0700 Subject: [PATCH 477/577] 5.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a30ad75d..efd32fd8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.0", + "version": "5.0.1", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 057544a6c14978e56605d56b8c46f1e9952af147 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 08:26:56 -0700 Subject: [PATCH 478/577] 5.0.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3e5f58a79..5db8101d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.2", + "version": "5.0.3", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 18f82d57a010fa37e6e7cd1fa22e303ac6298f8b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 09:00:00 -0700 Subject: [PATCH 479/577] Changed X in aha sidebar to always show and close, removed unused template and cleaned up whitespace --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 +- .../autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade | 8 -------- client/services/ahaGuideService.js | 1 - 3 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index ef6ae0147..49279dbd7 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -14,7 +14,7 @@ | You did it! 👏 svg.grid-content.shrink.iconnables.icons-close( ng-click = "toggleSidebar()" - ng-if = "!showOverview && (isAddingFirstBranch() || isAddingFirstRepo())" + ng-if = "!showOverview && !isSettingUpRunnabot()" ) use( xlink:href = "#icons-close" diff --git a/client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade b/client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade deleted file mode 100644 index 8591f5063..000000000 --- a/client/directives/popovers/autoLaunchAhaPopover/autoLaunchAhaPopoverView.jade +++ /dev/null @@ -1,8 +0,0 @@ -//- if the user just added Runnabot and no repos have auto-launch enabled - this should point to the first repo in instances-list that has had a branch -.popover.right.padding-sm.in( - ng-class = "{'in': active}" - ng-style = "popoverStyle.getStyle()" -) - .arrow.white - p.p Get the most out of Runnabot by adding branches automatically. diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 8541cdd80..ff2e396ef 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -266,7 +266,6 @@ function ahaGuide( } else if (!hasAutoLaunch) { cachedStep = STEPS.SETUP_RUNNABOT; } else { - cachedStep = STEPS.COMPLETED; } } From bd0a5a248ae54d19e38f11f114a5c3e7f9df1fac Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 20 Sep 2016 09:16:13 -0700 Subject: [PATCH 480/577] 5.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5db8101d4..816086fbe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.3", + "version": "5.0.4", "private": true, "description": "Frontend for Runnable.io", "scripts": { From b2f4756a19325aa6972838a71e7590c46c45b9ce Mon Sep 17 00:00:00 2001 From: Praful Rana Date: Tue, 20 Sep 2016 09:46:32 -0700 Subject: [PATCH 481/577] Update ahaGuideService.js --- client/services/ahaGuideService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index ff2e396ef..dba29ced4 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -68,7 +68,7 @@ function ahaGuide( }; stepList[STEPS.ADD_FIRST_REPO] = { - title: 'Step 2: Add a Repository', + title: 'Step 2: Configure your Application', subSteps: { addRepository: { className: 'aha-meter-11', From 76a30012691bd21634d0c2609ffa362d3c6cf272 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 20 Sep 2016 10:12:01 -0700 Subject: [PATCH 482/577] more copy fixes --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 2 +- .../environment/environmentHeader/viewEnvironmentHeader.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 49279dbd7..229247c2c 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -84,7 +84,7 @@ xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.strong Step 2: Add a Repository + p.p.strong Step 2: Configure your Application p.small Add your templates and get them running! .grid-block.shrink.align-center.padding-sm.aha-guide( diff --git a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade index 15afd33b5..10179e918 100644 --- a/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade +++ b/client/directives/environment/environmentHeader/viewEnvironmentHeader.jade @@ -22,7 +22,7 @@ button.grid-block.shrink.btn.btn-md.green( xlink:href = "#icons-check" ) .grid-block.vertical.aha-text - p.p.small.text-gray-light Step 2: Add a Repository + p.p.small.text-gray-light Step 2: Configure your Application p.p To add a database or other service to your application, click ‘Create Template’. .grid-block.justify-right.popover-footer button.grid-block.shrink.btn.btn-sm.green( From 9a137245cf5bd367969aef0f22ecac813540a2a7 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Tue, 20 Sep 2016 10:57:43 -0700 Subject: [PATCH 483/577] remove period to match other options --- .../components/mirrorDockerfile/mirrorDockerfileView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade index 94d289f30..ade231cda 100644 --- a/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade +++ b/client/directives/components/mirrorDockerfile/mirrorDockerfileView.jade @@ -21,7 +21,7 @@ use( xlink:href = "#icons-file-new" ) - .grid-content Start with our setup guide. + .grid-content Start with our setup guide //- if there is only one, [check] by default input.checkbox( name = "dockerfile" From 0c4af10ad55ce74aff0c16da06220feb97a767dd Mon Sep 17 00:00:00 2001 From: Myztiq Date: Tue, 20 Sep 2016 17:32:13 -0400 Subject: [PATCH 484/577] Clicking `Create Template` now closes all popovers --- client/directives/environment/environmentController.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/environment/environmentController.js b/client/directives/environment/environmentController.js index 6107fdd8c..21b7c9a32 100755 --- a/client/directives/environment/environmentController.js +++ b/client/directives/environment/environmentController.js @@ -64,6 +64,7 @@ function EnvironmentController( EC.triggerModal = { newContainer: function () { + $rootScope.$broadcast('close-popovers'); return ModalService.showModal({ controller: 'NewContainerModalController', controllerAs: 'MC', // Shared From debc1745e064548130083774b28af7b486238d3e Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Tue, 20 Sep 2016 15:03:45 -0700 Subject: [PATCH 485/577] remove the polling I added as a stop gap --- .../buildLogs/buildLogsController.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/client/directives/components/buildLogs/buildLogsController.js b/client/directives/components/buildLogs/buildLogsController.js index 96930dcfe..f99d58e65 100644 --- a/client/directives/components/buildLogs/buildLogsController.js +++ b/client/directives/components/buildLogs/buildLogsController.js @@ -6,9 +6,7 @@ function BuildLogsController( $scope, $rootScope, $timeout, - ahaGuide, errs, - keypather, launchDebugContainer, loading, updateInstanceWithNewBuild, @@ -60,25 +58,9 @@ function BuildLogsController( if (oldStream) { closeStream(oldStream); } - var pollingCount = 10; - function pollForCv() { - promisify(BLC.instance, 'fetch')() - .then(function (instance) { - keypather.set($scope, 'BLC.instance', instance); - }) - .finally(function () { - pollingCount--; - if (pollingCount > 0 && !keypather.get($scope, 'BLC.instance.attrs.contextVersion.build.dockerContainer')) { - $timeout(pollForCv, 1000); - } - }); - } BLC.streamFailure = false; var stream = null; if (BLC.instance) { - if (ahaGuide.isInGuide()) { - $timeout(pollForCv, 1000); - } BLC.buildStatus = 'starting'; BLC.buildLogs = []; BLC.buildLogTiming = {}; From 0b0bfca060d35cb3f6c9a4c5bc926b41dec975fb Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Tue, 20 Sep 2016 16:12:43 -0700 Subject: [PATCH 486/577] updated segment to purge dynamically created events --- layout.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layout.jade b/layout.jade index bcf24831d..1f2351e5e 100644 --- a/layout.jade +++ b/layout.jade @@ -47,7 +47,7 @@ html( if env === 'production' script. !function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","page","once","off","on"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t Date: Tue, 20 Sep 2016 17:03:02 -0700 Subject: [PATCH 487/577] 5.0.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 816086fbe..6d99c8b19 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.4", + "version": "5.0.5", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 9cf2ffdb0ff3cd798b6ed9f71ee4449cb330bb36 Mon Sep 17 00:00:00 2001 From: Myztiq Date: Wed, 21 Sep 2016 11:27:53 -0400 Subject: [PATCH 488/577] Updated logic to determine if we should seutp runnabot based on the fact if runnabot has been invited vs if it's been completed. --- client/services/ahaGuideService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index ff2e396ef..70fcc06cf 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -263,7 +263,7 @@ function ahaGuide( } if (!hasBranchLaunched) { cachedStep = STEPS.ADD_FIRST_BRANCH; - } else if (!hasAutoLaunch) { + } else if (!hasRunnabot) { cachedStep = STEPS.SETUP_RUNNABOT; } else { cachedStep = STEPS.COMPLETED; From f2d5c0756a6cbf279d570be0641f59a1a95ad3e5 Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 21 Sep 2016 11:56:31 -0700 Subject: [PATCH 489/577] add mix panel event on org select --- client/services/serviceEventTracking.js | 1 + layout.jade | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 76158191e..a3b1c43ea 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -372,6 +372,7 @@ EventTracking.prototype.visitedOrgSelectPage = function () { var self = this; var eventName = 'Visited org-select page'; + self._mixpanel('track', eventName); self.analytics.ready(function () { self.analytics.track(eventName); }); diff --git a/layout.jade b/layout.jade index 1f2351e5e..ad52d6422 100644 --- a/layout.jade +++ b/layout.jade @@ -123,9 +123,10 @@ html( if (env === 'staging') script. - (function(f,b){if(!b.__SV){var a,e,i,g;window.mixpanel=b;b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;"undefined"!==typeof d?c=b[d]=[]:d="mixpanel";c.people=c.people||[];c.toString=function(b){var a="mixpanel";"mixpanel"!==d&&(a+="."+d);b||(a+=" (stub)");return a};c.people.toString=function(){return c.toString(1)+".people (stub)"};i="disable track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.set_once people.increment people.append people.union people.track_charge people.clear_charges people.delete_user".split(" "); - for(g=0;g Date: Wed, 21 Sep 2016 11:58:02 -0700 Subject: [PATCH 490/577] add aha popover for branch URL --- .../styles/scss/layout/instance-header.scss | 1 + .../instance/instanceHeaderView.jade | 22 +++++++++++++++++++ client/services/featureFlagService.js | 1 + 3 files changed, 24 insertions(+) diff --git a/client/assets/styles/scss/layout/instance-header.scss b/client/assets/styles/scss/layout/instance-header.scss index ffca063fa..45f4b5ad9 100644 --- a/client/assets/styles/scss/layout/instance-header.scss +++ b/client/assets/styles/scss/layout/instance-header.scss @@ -88,6 +88,7 @@ align-items: top; display: flex; padding: 0 12px 12px; + position: relative; width: 100%; // status, dns mappings, save diff --git a/client/directives/instances/instance/instanceHeaderView.jade b/client/directives/instances/instance/instanceHeaderView.jade index d83afc059..459fe2a22 100644 --- a/client/directives/instances/instance/instanceHeaderView.jade +++ b/client/directives/instances/instance/instanceHeaderView.jade @@ -84,3 +84,25 @@ open-items = "openItems" save-open-items-button ) + + .popover.bottom.in.popover-aha( + ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaBranchUrlStep" + style = "left: auto; top: 48px; right: 12px;" + ) + .arrow.white( + style = "left: auto; right: 59px;" + ) + .popover-content + .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide + .grid-block.shrink.aha-meter.js-animate.aha-meter-100 + svg.iconnables + use( + xlink:href = "#icons-check" + ) + .grid-block.vertical.aha-text + p.p.small.text-gray-light Step 3: Add a Branch + p.p Nice work! Now you can see the web output of your branch by visiting its URL. + .grid-block.justify-right.popover-footer + button.grid-block.shrink.btn.btn-sm.green( + ng-click = "EC.showAddServicePopover = false" + ) Got It diff --git a/client/services/featureFlagService.js b/client/services/featureFlagService.js index 466119733..242959269 100644 --- a/client/services/featureFlagService.js +++ b/client/services/featureFlagService.js @@ -9,6 +9,7 @@ function featureFlags( var defaultFeatureFlags = { addBranches: true, aha: true, + ahaBranchUrlStep: false, allowIsolatedUpdate: false, autoIsolation: false, autoIsolationSetup: false, From f8c077bce1d105de41fc6cd2caf6fba1277262eb Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 21 Sep 2016 12:10:10 -0700 Subject: [PATCH 491/577] fix mix panel script --- layout.jade | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/layout.jade b/layout.jade index ad52d6422..15d9e12c3 100644 --- a/layout.jade +++ b/layout.jade @@ -120,8 +120,7 @@ html( (function(f,b){if(!b.__SV){var a,e,i,g;window.mixpanel=b;b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;"undefined"!==typeof d?c=b[d]=[]:d="mixpanel";c.people=c.people||[];c.toString=function(b){var a="mixpanel";"mixpanel"!==d&&(a+="."+d);b||(a+=" (stub)");return a};c.people.toString=function(){return c.toString(1)+".people (stub)"};i="disable track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.set_once people.increment people.append people.union people.track_charge people.clear_charges people.delete_user".split(" "); for(g=0;g Date: Wed, 21 Sep 2016 13:12:48 -0700 Subject: [PATCH 492/577] Changed auto launch to occur outside of aha guide logic, fixed sidebar issue when auto forking and removed some aha feature flag checks --- client/controllers/controllerInstances.js | 27 ++++++++++++++++++- .../components/ahaGuide/ahaGuideView.jade | 4 +-- .../branchMenuPopover/introAddBranch.jade | 11 ++++---- client/services/ahaGuideService.js | 18 +++++-------- .../instances/viewInstancesList.jade | 5 ++-- 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 738d0aaad..a7e29bc11 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -8,6 +8,7 @@ require('app') function ControllerInstances( $filter, $localStorage, + $rootScope, $scope, $state, activeAccount, @@ -27,8 +28,8 @@ function ControllerInstances( CIS.isInGuide = ahaGuide.isInGuide; CIS.isAddingFirstBranch = ahaGuide.isAddingFirstBranch; CIS.isSettingUpRunnabot = ahaGuide.isSettingUpRunnabot; - CIS.isSettingUpAutoLaunch = ahaGuide.isSettingUpAutoLaunch; CIS.currentOrg = currentOrg; + CIS.showAutofork = null; CIS.searchBranches = null; CIS.instanceBranches = null; CIS.unbuiltBranches = null; @@ -108,6 +109,17 @@ function ControllerInstances( }, {location: 'replace'}); } } + + if (instances.models.length) { + ahaGuide.hasRunnabot() + .then(function(runnabot) { + if (runnabot) { + CIS.showAutofork = instances.models.every(function(instance) { + return instance.attrs.shouldNotAutofork; + }); + } + }); + } }) .catch(errs.handler); @@ -247,6 +259,19 @@ function ControllerInstances( this.setAutofork = function () { CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; + if (CIS.isInGuide() && !CIS.poppedInstance.attrs.shouldNotAutofork) { + var children = keypather.get(CIS, 'poppedInstance.children'); + var childWatcher = $scope.$watchCollection(function() { + return children.models; + }, function() { + if (children.models.length) { + $rootScope.$broadcast('showAhaSidebar'); + childWatcher(); + } + }); + } else if (!CIS.poppedInstance.attrs.shouldNotAutofork) { + CIS.showAutofork = false; + } promisify(CIS.poppedInstance, 'update')({ shouldNotAutofork: CIS.poppedInstance.attrs.shouldNotAutofork }) .catch(function () { CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 695d8cb17..70bf99dc0 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -19,13 +19,13 @@ ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.isSettingUpAutoLaunch()" + ng-if = "showAutofork" ng-include = "'setUpRunnabotGuideView'" ) button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpAutoLaunch()" + ng-if = "AGC.isInGuide() && !AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpAutoLaunch()" pop-over pop-over-actions = "AGC ? AGC.popoverActions : EC.actions" pop-over-active = "ahaMenuGuidePopover.data.show" diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade index c9ff79dd7..f244f4707 100644 --- a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -3,17 +3,16 @@ ng-style = "popoverStyle.getStyle()" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isAddingFirstBranch()" + ng-if = "!$root.isLoading.fetchingBranches && CIS.isAddingFirstBranch()" aha-guide step-index = 2 sub-step = "addBranch" ) - .grid-block.shrink.align-center.justify-center.padding-sm( - ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isSettingUpAutoLaunch()" - aha-guide - step-index = 3 - sub-step = "addBranch" + .grid-block.shrink.align-center.justify-center.padding-sm.show-autofork( + ng-if = "!CIS.isInGuide() && !$root.isLoading.fetchingBranches && CIS.showAutofork" + ng-include = "'ahaGuideView'" + ng-init = "showAutofork = true" ) .arrow.white diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index ff2e396ef..97092a7e0 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -28,10 +28,10 @@ function ahaGuide( }); } function refreshHasRunnabot() { - if (hasRunnabot) { return; } + if (hasRunnabot) { return true; } return isRunnabotPartOfOrg(keypather.get(currentOrg, 'github.attrs.login')) .then(function (runnabot) { - if (runnabot) { + if (runnabot && isInGuide()) { endGuide(); } hasRunnabot = runnabot; @@ -245,25 +245,22 @@ function ahaGuide( if (!cachedStep) { if ($rootScope.featureFlags.aha && !keypather.get(currentOrg, 'poppa.id')) { cachedStep = STEPS.CHOOSE_ORGANIZATION; - } else if (!$rootScope.featureFlags.aha || !isInGuide()) { + } else if (!isInGuide()) { cachedStep = STEPS.COMPLETED; } else if (!hasConfirmedSetup()) { cachedStep = STEPS.ADD_FIRST_REPO; } else { // loop over instances and see if any has ever had a branch launched var hasBranchLaunched = false; - var hasAutoLaunch = false; if (keypather.get(instances, 'models.length')) { instances.models.some(function (instance) { - hasBranchLaunched = hasBranchLaunched || instance.attrs.hasAddedBranches || keypather.get(instance, 'children.models.length'); - hasAutoLaunch = hasAutoLaunch || !instance.attrs.shouldNotAutofork; - // This will short circuit once we have found both of these true - return hasAutoLaunch && hasBranchLaunched; + hasBranchLaunched = instance.attrs.hasAddedBranches || keypather.get(instance, 'children.models.length'); + return hasBranchLaunched; }); } if (!hasBranchLaunched) { cachedStep = STEPS.ADD_FIRST_BRANCH; - } else if (!hasAutoLaunch) { + } else if (!hasRunnabot) { cachedStep = STEPS.SETUP_RUNNABOT; } else { cachedStep = STEPS.COMPLETED; @@ -320,9 +317,6 @@ function ahaGuide( }, isSettingUpRunnabot: function() { return getCurrentStep() === STEPS.SETUP_RUNNABOT && !hasRunnabot; - }, - isSettingUpAutoLaunch: function() { - return getCurrentStep() === STEPS.SETUP_RUNNABOT && hasRunnabot; } }; } diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index c4c1f515c..00cd3fa64 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -85,14 +85,13 @@ p.p.text-center.text-gray-light.padding-sm( xlink:href = "#icons-arrow-down" ) .stepOneUncloseablePopover( - ng-if = "$root.featureFlags.aha &&\ - $index === 0 &&\ + ng-if = "$index === 0 &&\ CIS.shouldShowPopover &&\ !CIS.$storage.instanceListIsClosed &&\ CIS.shouldShowParent(masterInstance) &&\ (\ (CIS.isAddingFirstBranch() && !masterInstance.attrs.hasAddedBranches) ||\ - (CIS.isSettingUpAutoLaunch() && masterInstance.attrs.shouldNotAutofork)\ + (CIS.showAutofork && masterInstance.attrs.shouldNotAutofork)\ )\ " pop-over From e08ba37b3f7198d619edcfd53a429d3e37a45405 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 21 Sep 2016 13:48:27 -0700 Subject: [PATCH 493/577] PR comments --- client/directives/components/ahaGuide/ahaGuideView.jade | 4 ++-- .../instances/instance/branchMenuPopover/introAddBranch.jade | 4 ++-- client/templates/instances/viewInstancesList.jade | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index 70bf99dc0..c2956e089 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -19,13 +19,13 @@ ) .grid-block.align-center( - ng-if = "showAutofork" + ng-if = "AGC.ahaGuide.isSettingUpAutoLaunch()" ng-include = "'setUpRunnabotGuideView'" ) button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "AGC.isInGuide() && !AGC.ahaGuide.isChoosingOrg() && !AGC.ahaGuide.isSettingUpAutoLaunch()" + ng-if = "!AGC.ahaGuide.isChoosingOrg()" pop-over pop-over-actions = "AGC ? AGC.popoverActions : EC.actions" pop-over-active = "ahaMenuGuidePopover.data.show" diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade index f244f4707..1d2a645e0 100644 --- a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -3,14 +3,14 @@ ng-style = "popoverStyle.getStyle()" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( - ng-if = "!$root.isLoading.fetchingBranches && CIS.isAddingFirstBranch()" + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.isAddingFirstBranch()" aha-guide step-index = 2 sub-step = "addBranch" ) .grid-block.shrink.align-center.justify-center.padding-sm.show-autofork( - ng-if = "!CIS.isInGuide() && !$root.isLoading.fetchingBranches && CIS.showAutofork" + ng-if = "$root.featureFlags.aha && !CIS.isInGuide() && !$root.isLoading.fetchingBranches && CIS.showAutofork" ng-include = "'ahaGuideView'" ng-init = "showAutofork = true" ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 00cd3fa64..c4c1f515c 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -85,13 +85,14 @@ p.p.text-center.text-gray-light.padding-sm( xlink:href = "#icons-arrow-down" ) .stepOneUncloseablePopover( - ng-if = "$index === 0 &&\ + ng-if = "$root.featureFlags.aha &&\ + $index === 0 &&\ CIS.shouldShowPopover &&\ !CIS.$storage.instanceListIsClosed &&\ CIS.shouldShowParent(masterInstance) &&\ (\ (CIS.isAddingFirstBranch() && !masterInstance.attrs.hasAddedBranches) ||\ - (CIS.showAutofork && masterInstance.attrs.shouldNotAutofork)\ + (CIS.isSettingUpAutoLaunch() && masterInstance.attrs.shouldNotAutofork)\ )\ " pop-over From ce55f52b12e1266056974f3f88247239c4944931 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 21 Sep 2016 14:07:51 -0700 Subject: [PATCH 494/577] clean up .popover-aha --- .../styles/scss/components/aha-popover.scss | 31 ++++++++++--------- .../styles/scss/layout/instance-header.scss | 1 - .../instance/instanceHeaderView.jade | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index efd2d2948..d8cfcf9a1 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -1,20 +1,7 @@ .popover.popover-aha { - left: 75px; max-width: none; - top: 66px; width: 450px; - @include media(xxs) { - left: 15px; - right: 15px; - top: 60px; - width: calc(100vw - 30px); - - &.right { - margin-left: 0; - } - } - &.popover-sm { color: $gray; line-height: $input-xs; @@ -32,9 +19,23 @@ } } - .arrow { + .layout-navigation & { + left: 75px; + top: 72px; + @include media(xxs) { - display: none; + left: 7px; + margin-left: 0; + top: 234px; + width: calc(100vw - 22px); + } + + .arrow { + @include media(xxs) { + left: 30px; + top: -6px; + transform: rotate(90deg); + } } } diff --git a/client/assets/styles/scss/layout/instance-header.scss b/client/assets/styles/scss/layout/instance-header.scss index 45f4b5ad9..6d3d9771e 100644 --- a/client/assets/styles/scss/layout/instance-header.scss +++ b/client/assets/styles/scss/layout/instance-header.scss @@ -115,7 +115,6 @@ } .icons-link-external { - left: 1px; margin: 0 3px; top: -1px; width: 15px; diff --git a/client/directives/instances/instance/instanceHeaderView.jade b/client/directives/instances/instance/instanceHeaderView.jade index 459fe2a22..f2c465e30 100644 --- a/client/directives/instances/instance/instanceHeaderView.jade +++ b/client/directives/instances/instance/instanceHeaderView.jade @@ -87,7 +87,7 @@ .popover.bottom.in.popover-aha( ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaBranchUrlStep" - style = "left: auto; top: 48px; right: 12px;" + style = "left: auto; top: 42px; right: 12px;" ) .arrow.white( style = "left: auto; right: 59px;" From 7efe864b901a61f9de7c15b9f83a18d1cf4835f8 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 21 Sep 2016 14:18:40 -0700 Subject: [PATCH 495/577] update runnabot text --- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 7 ++++++- .../gitHubIntegration/githubIntegrationView.jade | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 49279dbd7..40f0b9850 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -8,10 +8,15 @@ //- During ahas 1-3: | Setup Guide h4.grid-content.strong.text-center.h4( - ng-if = "isSettingUpRunnabot()" + ng-if = "isSettingUpRunnabot() && !$root.featureFlags.ahaBranchUrlStep" ) //- During aha 4: | You did it! 👏 + h4.grid-content.strong.text-center.h4( + ng-if = "isSettingUpRunnabot() && $root.featureFlags.ahaBranchUrlStep" + ) + //- During aha 4: + | One more thing… svg.grid-content.shrink.iconnables.icons-close( ng-click = "toggleSidebar()" ng-if = "!showOverview && !isSettingUpRunnabot()" diff --git a/client/directives/components/gitHubIntegration/githubIntegrationView.jade b/client/directives/components/gitHubIntegration/githubIntegrationView.jade index 15670efcc..1519f6365 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationView.jade +++ b/client/directives/components/gitHubIntegration/githubIntegrationView.jade @@ -1,4 +1,10 @@ -p.grid-content.shrink.p.text-center Now you can invite our bot to your GitHub org to get notifications on your pull requests: +p.grid-content.shrink.p.text-center( + ng-if = "!$root.featureFlags.ahaBranchUrlStep" +) Now you can invite our bot to your GitHub org to get notifications on your pull requests: + +p.grid-content.shrink.p.text-center( + ng-if = "$root.featureFlags.ahaBranchUrlStep" +) Invite our bot to your GitHub org to get notifications on your pull requests: img.grid-content.shrink.img.img-comment( alt = "Runnabot sample comment on a GitHub pull request." From 595619d77c594ae59dfd063a1083d76268e13779 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 21 Sep 2016 14:47:40 -0700 Subject: [PATCH 496/577] Added new popover element for auto fork with individual logic --- client/controllers/controllerInstances.js | 15 ++++-------- .../components/ahaGuide/ahaGuideView.jade | 4 ++-- .../githubIntegrationController.js | 2 ++ .../branchMenuPopover/introAddBranch.jade | 2 +- .../instances/viewInstancesList.jade | 23 +++++++++++++++---- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index a7e29bc11..7a6d4ef4f 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -51,6 +51,10 @@ function ControllerInstances( } }); + $scope.$on('showAutoLaunchPopover', function() { + CIS.showAutofork = true; + }) + fetchInstancesByPod() .then(function (instancesByPod) { @@ -109,17 +113,6 @@ function ControllerInstances( }, {location: 'replace'}); } } - - if (instances.models.length) { - ahaGuide.hasRunnabot() - .then(function(runnabot) { - if (runnabot) { - CIS.showAutofork = instances.models.every(function(instance) { - return instance.attrs.shouldNotAutofork; - }); - } - }); - } }) .catch(errs.handler); diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index c2956e089..f4d29b9a7 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -19,13 +19,13 @@ ) .grid-block.align-center( - ng-if = "AGC.ahaGuide.isSettingUpAutoLaunch()" + ng-if = "showAutofork" ng-include = "'setUpRunnabotGuideView'" ) button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "!AGC.ahaGuide.isChoosingOrg()" + ng-if = "AGC.isInGuide() && !AGC.ahaGuide.isChoosingOrg()" pop-over pop-over-actions = "AGC ? AGC.popoverActions : EC.actions" pop-over-active = "ahaMenuGuidePopover.data.show" diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js index fc8114367..318f7e717 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationController.js +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -8,6 +8,7 @@ require('app') function GithubIntegrationController( $interval, $q, + $rootScope, $scope, ahaGuide, currentOrg, @@ -50,6 +51,7 @@ function GithubIntegrationController( }); GIC.pollCheckRunnabot = function () { + $rootScope.$broadcast('showAutoLaunchPopover'); GIC.pollingInterval = $interval(checkRunnabot, 2000); }; diff --git a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade index 1d2a645e0..746fc1b11 100644 --- a/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade +++ b/client/directives/instances/instance/branchMenuPopover/introAddBranch.jade @@ -10,7 +10,7 @@ ) .grid-block.shrink.align-center.justify-center.padding-sm.show-autofork( - ng-if = "$root.featureFlags.aha && !CIS.isInGuide() && !$root.isLoading.fetchingBranches && CIS.showAutofork" + ng-if = "$root.featureFlags.aha && !$root.isLoading.fetchingBranches && CIS.showAutofork" ng-include = "'ahaGuideView'" ng-init = "showAutofork = true" ) diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index c4c1f515c..59a1e4266 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -90,10 +90,7 @@ p.p.text-center.text-gray-light.padding-sm( CIS.shouldShowPopover &&\ !CIS.$storage.instanceListIsClosed &&\ CIS.shouldShowParent(masterInstance) &&\ - (\ - (CIS.isAddingFirstBranch() && !masterInstance.attrs.hasAddedBranches) ||\ - (CIS.isSettingUpAutoLaunch() && masterInstance.attrs.shouldNotAutofork)\ - )\ + (CIS.isAddingFirstBranch() && !masterInstance.attrs.hasAddedBranches)\ " pop-over pop-over-active = "CIS.shouldShowPopover" @@ -105,6 +102,24 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-data = "'ahaTemplate'" ) + .autoForkPopover( + ng-if = "$root.featureFlags.aha &&\ + $index === 0 &&\ + !CIS.$storage.instanceListIsClosed &&\ + CIS.shouldShowParent(masterInstance) &&\ + !CIS.isAddingFirstBranch() &&\ + (CIS.showAutofork && masterInstance.attrs.shouldNotAutofork)\ + " + pop-over + pop-over-active = "CIS.showAutofork" + pop-over-controller = "CIS" + pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" + pop-over-template = "introAddBranch" + pop-over-trigger = "activeAttr" + pop-over-uncloseable = "CIS.isInGuide()" + pop-over-data = "'ahaTemplate'" + ) + //- repo config button (pre auto-isolation) svg.grid-block.shrink.iconnables.icons-gear( ng-click = "CIS.editInstance(masterInstance)" From 5f72eb18f9fa946bab1d247985e913f19a6650a4 Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 21 Sep 2016 15:15:19 -0700 Subject: [PATCH 497/577] track org select --- .../chooseOrganizationModalController.js | 4 ++++ .../chooseOrganizationModalView.jade | 1 + client/services/serviceEventTracking.js | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index 51aaceecf..663e33908 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -10,6 +10,7 @@ function ChooseOrganizationModalController( ahaGuide, createNewSandboxForUserService, errs, + eventTracking, featureFlags, fetchWhitelistForDockCreated, keypather, @@ -38,6 +39,9 @@ function ChooseOrganizationModalController( }; $scope.actions = { + selectedOrg: function(selectedOrgName) { + eventTracking.selectedOrg(selectedOrgName); + }, selectAccount: function (selectedOrgName) { $state.go('base.instances', { userName: selectedOrgName diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index c0948e443..58f1ad83d 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -79,6 +79,7 @@ ) span.grid-block.text-left.text-overflow {{org.oauthName()}} input.checkbox.hidden( + ng-change = "actions.selectedOrg(org.oauthName())" ng-model = "COS.selectedOrgName" value = "{{org.oauthName()}}" type = "radio" diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index a3b1c43ea..654ec35c5 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -365,6 +365,7 @@ EventTracking.prototype.createdNonRepoContainer = function (containerName) { /** * Track user visit to /orgSelect page * Reports to: + * - mixpanel * - segment * @return this */ @@ -379,6 +380,23 @@ EventTracking.prototype.visitedOrgSelectPage = function () { return self; }; +/** + * Track user clicks on an org on the orgSelect page + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.selectedOrg = function (org) { + var self = this; + var eventName = 'Selected an org'; + + self._mixpanel('track', eventName, { + org: org + }); + return self; +}; + + /** * Track org click on /orgSelect page * Reports to: From 8057452992153c3eed7ee109d4aa5b914eb97a55 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 21 Sep 2016 15:31:58 -0700 Subject: [PATCH 498/577] Popover logic back in aha guide service --- .../components/gitHubIntegration/githubIntegrationController.js | 1 - client/services/ahaGuideService.js | 1 + client/templates/instances/viewInstancesList.jade | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js index 318f7e717..09e9ebf34 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationController.js +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -51,7 +51,6 @@ function GithubIntegrationController( }); GIC.pollCheckRunnabot = function () { - $rootScope.$broadcast('showAutoLaunchPopover'); GIC.pollingInterval = $interval(checkRunnabot, 2000); }; diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 97092a7e0..68fc30f1d 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -33,6 +33,7 @@ function ahaGuide( .then(function (runnabot) { if (runnabot && isInGuide()) { endGuide(); + $rootScope.$broadcast('showAutoLaunchPopover'); } hasRunnabot = runnabot; return hasRunnabot; diff --git a/client/templates/instances/viewInstancesList.jade b/client/templates/instances/viewInstancesList.jade index 59a1e4266..d7a786939 100644 --- a/client/templates/instances/viewInstancesList.jade +++ b/client/templates/instances/viewInstancesList.jade @@ -116,7 +116,6 @@ p.p.text-center.text-gray-light.padding-sm( pop-over-options = "{\"verticallyCentered\":true,\"left\":6}" pop-over-template = "introAddBranch" pop-over-trigger = "activeAttr" - pop-over-uncloseable = "CIS.isInGuide()" pop-over-data = "'ahaTemplate'" ) From a03708a0a94ebd1a7cc161e9188a780c01a5cbd6 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 21 Sep 2016 15:42:28 -0700 Subject: [PATCH 499/577] broadcast called after response that guide is indeed ended --- client/services/ahaGuideService.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 68fc30f1d..da5eae9b8 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -32,8 +32,10 @@ function ahaGuide( return isRunnabotPartOfOrg(keypather.get(currentOrg, 'github.attrs.login')) .then(function (runnabot) { if (runnabot && isInGuide()) { - endGuide(); - $rootScope.$broadcast('showAutoLaunchPopover'); + endGuide() + .then(function() { + $rootScope.$broadcast('showAutoLaunchPopover'); + }); } hasRunnabot = runnabot; return hasRunnabot; From c0b11c3b589f08babfeb3df2641c0283fe9ceaf4 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 21 Sep 2016 16:07:49 -0700 Subject: [PATCH 500/577] Added semicolon --- client/controllers/controllerInstances.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 7a6d4ef4f..22a4e1dda 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -53,7 +53,7 @@ function ControllerInstances( $scope.$on('showAutoLaunchPopover', function() { CIS.showAutofork = true; - }) + }); fetchInstancesByPod() .then(function (instancesByPod) { From b04cf3d937768c101363eaddd220f2e1ce13fcf7 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 21 Sep 2016 16:31:00 -0700 Subject: [PATCH 501/577] update api-client to latest for the best fixes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 816086fbe..0f12b7304 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ ], "dependencies": { "101": "0.14.1", - "@runnable/api-client": "v9.2.1", + "@runnable/api-client": "v9.2.2", "angular": "1.3.15", "angular-animate": "1.3.15", "angular-clipboard": "1.4.x", From c9f0925e6de6ce1f1cf2bf83d0c1c0aaa8fbef15 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 21 Sep 2016 16:32:59 -0700 Subject: [PATCH 502/577] fix text-overflow --- client/assets/styles/scss/popover/popover-branch-menu.scss | 6 ++++++ .../instance/branchMenuPopover/branchMenuPopoverView.jade | 6 +++++- .../instance/branchMenuPopover/templateMenuPopoverView.jade | 6 +++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 2a73b9a07..80d447478 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -55,6 +55,12 @@ .popover-list-item { padding-right: 9px; + + .iconnables.icons-branch { + color: $gray-light; + height: 18px; + margin-right: 0; + } } // empty state diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index ec1b433a2..7611e5be2 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -140,7 +140,11 @@ ng-repeat = "branch in CIS.getFilteredBranches()" ng-click = "CIS.forkBranchFromInstance(branch, POC.closePopover);" ) - .grid-content {{ branch.attrs.name }} + svg.grid-content.shrink.iconnables.icons-branch + use( + xlink:href = "#icons-branch-alt" + ) + .grid-content.text-overflow {{ branch.attrs.name }} button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!$root.isLoading[branch.attrs.name]" ) diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 522dc0746..db0ddb731 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -58,7 +58,7 @@ xlink:href = "#icons-repository" ) .grid-block.vertical - .grid-content button-clicker + .grid-content.text-overflow button-clicker .grid-block( ng-if = "$root.featureFlags.inviteFlows" ) @@ -94,7 +94,7 @@ xlink:href = "#icons-repository" ) .grid-block.vertical - .grid-content api + .grid-content.text-overflow api .grid-block( ng-if = "$root.featureFlags.inviteFlows" ) @@ -124,7 +124,7 @@ xlink:href = "#icons-repository" ) .grid-block.vertical - .grid-content runnable.com + .grid-content.text-overflow runnable.com .grid-block( ng-if = "$root.featureFlags.inviteFlows" ) From e6ef2b0efb7ab46f9066421ae083094c4647fb3e Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 21 Sep 2016 16:34:17 -0700 Subject: [PATCH 503/577] send event names to mix panel --- .../chooseOrganizationModalView.jade | 6 +++--- client/directives/ngclick.js | 1 + client/services/serviceEventTracking.js | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index 58f1ad83d..f6c1a04e6 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -97,9 +97,8 @@ ) //- disabled until an org is selected button.btn.btn-md.green( - ng-click = "\ - actions.createOrCheckDock(COS.selectedOrgName, goToPanel);\ - " + event-name = "Org Confirmed" + ng-click = "actions.createOrCheckDock(COS.selectedOrgName, goToPanel)" ng-disabled = "!COS.selectedOrgName" ) Confirm Organization @@ -145,6 +144,7 @@ ng-class = "{'in': isActivePanel()}" ) button.btn.btn-md.green( + event-name = "Nav to Runnable (after infrastructure wait)" ng-click = "actions.selectAccount(COS.selectedOrgName)" ) Go to Runnable .grid-block.justify-center.modal-outer-footer( diff --git a/client/directives/ngclick.js b/client/directives/ngclick.js index 3a1415d24..67582e8f6 100644 --- a/client/directives/ngclick.js +++ b/client/directives/ngclick.js @@ -22,6 +22,7 @@ function ngClick( }); eventTracking.trackClicked({ attrs: cleanedAttrs, + eventName: attrs.eventName, text: text }); } diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 654ec35c5..238b08ea9 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -309,7 +309,8 @@ EventTracking.prototype.update = function () { */ EventTracking.prototype.trackClicked = function (data) { var self = this; - self._mixpanel('track', 'clicked - ' + _keypather.get(data, 'text'), data); + + self._mixpanel('track', 'Click', data); self.analytics.ready(function () { self.analytics.track('Click', data); }); @@ -388,7 +389,7 @@ EventTracking.prototype.visitedOrgSelectPage = function () { */ EventTracking.prototype.selectedOrg = function (org) { var self = this; - var eventName = 'Selected an org'; + var eventName = 'Org Selected'; self._mixpanel('track', eventName, { org: org From 3ff66351f806fead135a03172ea9bd382683257a Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 21 Sep 2016 16:40:58 -0700 Subject: [PATCH 504/577] fix function --- .../chooseOrganizationModalController.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js index 663e33908..fabc0b918 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalController.js @@ -39,9 +39,7 @@ function ChooseOrganizationModalController( }; $scope.actions = { - selectedOrg: function(selectedOrgName) { - eventTracking.selectedOrg(selectedOrgName); - }, + selectedOrg: eventTracking.selectedOrg.bind(eventTracking), selectAccount: function (selectedOrgName) { $state.go('base.instances', { userName: selectedOrgName From 27b97d8eb55e1a95581c1bdc252fb9cb535db8a4 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 21 Sep 2016 16:52:30 -0700 Subject: [PATCH 505/577] replace icons in add buttons with text --- .../scss/components/buttons/buttons.scss | 11 ++++++ .../pages/newRepositorySelectionView.jade | 6 +--- .../pages/templateSelectSectionView.jade | 6 +--- .../branchMenuPopoverView.jade | 6 +--- .../templateMenuPopoverView.jade | 36 ++++--------------- 5 files changed, 20 insertions(+), 45 deletions(-) diff --git a/client/assets/styles/scss/components/buttons/buttons.scss b/client/assets/styles/scss/components/buttons/buttons.scss index c254c8d7c..a15f9de09 100755 --- a/client/assets/styles/scss/components/buttons/buttons.scss +++ b/client/assets/styles/scss/components/buttons/buttons.scss @@ -541,4 +541,15 @@ border-color: $green; color: $white; } + + .popover-branch-menu &, + .popover-template-menu & { + padding: 0 6px; + width: auto; + } + + .modal-server-select & { + padding: 0 9px; + width: auto; + } } diff --git a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade index e9f262cdf..b77e9808d 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade @@ -98,11 +98,7 @@ ul.list.list-servers( ) button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add( ng-if = "!repo.loading" - ) - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + ) Create .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green.in( ng-if = "repo.loading" ng-include = "'spinner'" diff --git a/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade index b186c633b..b95be3765 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade @@ -34,8 +34,4 @@ ul.list.list-servers( width = "36" ) .grid-content {{dependency.attrs.name}} - button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add Create diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 7611e5be2..2ba818d22 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -147,11 +147,7 @@ .grid-content.text-overflow {{ branch.attrs.name }} button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!$root.isLoading[branch.attrs.name]" - ) - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + ) Add .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "$root.isLoading[branch.attrs.name]" ng-include = "'spinner'" diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index db0ddb731..6b5318b90 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -77,11 +77,7 @@ button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!state.loading" - ) - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + ) Create .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "state.loading" ng-include = "'spinner'" @@ -111,11 +107,7 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Create li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) @@ -141,11 +133,7 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Create .popover-content( ng-if = "state.tab === 'nonRepo'" ng-init = "state.servicesLoaded = null" @@ -179,11 +167,7 @@ .grid-content Cassandra button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!state.loading" - ) - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + ) Create .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "state.loading" ng-include = "'spinner'" @@ -197,11 +181,7 @@ width = "24" ) .grid-content Consul-Server - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Create li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) @@ -211,8 +191,4 @@ width = "24" ) .grid-content ElasticSearch - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add - svg.iconnables.icons-add - use( - xlink:href = "#icons-add" - ) + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Create From 0faba4a950c10d9157fc0f8e3e861c64e430e051 Mon Sep 17 00:00:00 2001 From: runnabro Date: Wed, 21 Sep 2016 16:57:40 -0700 Subject: [PATCH 506/577] prepend event-names with data- --- .../modalChooseOrganization/chooseOrganizationModalView.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade index f6c1a04e6..668cb157d 100644 --- a/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade +++ b/client/directives/modals/modalChooseOrganization/chooseOrganizationModalView.jade @@ -97,7 +97,7 @@ ) //- disabled until an org is selected button.btn.btn-md.green( - event-name = "Org Confirmed" + data-event-name = "Org Confirmed" ng-click = "actions.createOrCheckDock(COS.selectedOrgName, goToPanel)" ng-disabled = "!COS.selectedOrgName" ) Confirm Organization @@ -144,7 +144,7 @@ ng-class = "{'in': isActivePanel()}" ) button.btn.btn-md.green( - event-name = "Nav to Runnable (after infrastructure wait)" + data-event-name = "Nav to Runnable (after infrastructure wait)" ng-click = "actions.selectAccount(COS.selectedOrgName)" ) Go to Runnable .grid-block.justify-center.modal-outer-footer( From 8628836c0cf726aba0fee07cfc6b29f386af2463 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 21 Sep 2016 17:20:51 -0700 Subject: [PATCH 507/577] 5.0.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 72b64dbea..9c3fd9075 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.5", + "version": "5.0.6", "private": true, "description": "Frontend for Runnable.io", "scripts": { From f663f0f38ee1c0f7a2d82a01cd909a654bb60f16 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 21 Sep 2016 17:22:01 -0700 Subject: [PATCH 508/577] 5.0.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c3fd9075..e37535e27 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.6", + "version": "5.0.7", "private": true, "description": "Frontend for Runnable.io", "scripts": { From c88ff4bc512b92953f10b517ad3cb4cdab8dd7d5 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 21 Sep 2016 17:59:07 -0700 Subject: [PATCH 509/577] Added tests for ahaguide and ahaservice --- .../controllers/ahaGuideController.unit.js | 196 ++++++++++++++++++ test/unit/services/ahaGuideService.unit.js | 137 +++++++++++- 2 files changed, 329 insertions(+), 4 deletions(-) create mode 100644 test/unit/controllers/ahaGuideController.unit.js diff --git a/test/unit/controllers/ahaGuideController.unit.js b/test/unit/controllers/ahaGuideController.unit.js new file mode 100644 index 000000000..f2631f57a --- /dev/null +++ b/test/unit/controllers/ahaGuideController.unit.js @@ -0,0 +1,196 @@ +'use strict'; + +var $controller; +var $rootScope; +var $scope; +var $window; +var keypather; +var mockCurrentOrg; +var isRunnabotPartOfOrgStub; +var mockAhaGuideMethods; +var eventStatus; + +var apiMocks = require('../apiMocks/index'); + +describe('ahaGuideController'.bold.underline.blue, function () { + var ctx = {}; + var AGC; + var mockSteps = { + CHOOSE_ORGANIZATION: 1, + ADD_FIRST_REPO: 2, + ADD_FIRST_BRANCH: 3, + SETUP_RUNNABOT: 4, + COMPLETED: -1 + }; + + function createMasterPods() { + ctx.masterPods = runnable.newInstances( + [apiMocks.instances.building, apiMocks.instances.runningWithContainers[0]], + {noStore: true} + ); + return ctx.masterPods; + } + + mockAhaGuideMethods = { + endGuide: sinon.stub(), + getCurrentStep: sinon.stub(), + hasConfirmedSetup: sinon.stub(), + hasRunnabot: sinon.stub(), + isInGuide: sinon.stub(), + furthestSubstep: sinon.stub(), + isChoosingOrg: sinon.stub(), + isAddingFirstRepo: sinon.stub(), + isAddingFirstBranch: sinon.stub(), + steps: mockSteps, + stepList: { + 2: { + title: 'Step 2: Add a Repository', + subSteps: { + addRepository: { + step: 0 + }, + containerSelection: { + step: 1 + }, + logs: { + step: 7 + } + }, + buildStatus: { + starting: 'We‘re building! Build time varies depending on your build commands.', + crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' + } + } + }, + } + + function setup() { + mockCurrentOrg = { + poppa: { + attrs: { + hasPaymentMethod: false, + id: 101, + metadata: { + hasAha: true, + hasConfirmedSetup: false + } + } + } + }; + + ctx = {}; + ctx.fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); + angular.mock.module('app'); + ctx.fakeOrg1 = { + attrs: angular.copy(apiMocks.user), + oauthName: function () { + return 'org1'; + } + }; + ctx.fakeOrg2 = { + attrs: angular.copy(apiMocks.user), + oauthName: function () { + return 'org2'; + } + }; + ctx.fakeOrgs = {models: [ctx.fakeOrg1, ctx.fakeOrg2]}; + ctx.stateParams = { + userName: 'username', + instanceName: 'instancename' + }; + angular.mock.module('app', function ($provide) { + $provide.factory('fetchInstancesByPod', ctx.fetchInstancesByPodMock.autoTrigger(createMasterPods())); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); + $provide.value('currentOrg', mockCurrentOrg); + $provide.value('ahaGuide', mockAhaGuideMethods); + }); + angular.mock.inject(function ( + _$controller_, + _$rootScope_, + _$window_, + _keypather_ + ) { + $controller = _$controller_; + $rootScope = _$rootScope_; + $window = _$window_; + keypather = _keypather_; + + $scope = $rootScope.$new(); + }); + + $rootScope.featureFlags = { + aha: true + }; + + var controllerInitFn = $controller('AhaGuideController', { + '$scope': $scope + }, true); + + AGC = controllerInitFn(); + $rootScope.$apply(); + } + + describe('managing steps and substeps for milestone 2', function() { + beforeEach(function() { + mockAhaGuideMethods.getCurrentStep.returns(2); + mockAhaGuideMethods.isAddingFirstRepo.returns(true); + setup(); + $scope.$on('ahaGuideEvent', function(event, status) { + eventStatus = status; + }) + }) + + it('should update the subStep and index based on a panel change', function() { + $scope.$emit('changed-animated-panel', 'addRepository'); + $scope.$digest(); + expect(AGC.subStep).to.equal('addRepository'); + expect(AGC.subStepIndex).to.equal(0); + sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'addRepository'); + $scope.$digest(); + $scope.$emit('changed-animated-panel', 'containerSelection'); + $scope.$digest(); + expect(AGC.subStep).to.equal('containerSelection'); + expect(AGC.subStepIndex).to.equal(1); + sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'containerSelection'); + }); + + it('should update the caption and build status based on an update', function() { + $rootScope.$broadcast('buildStatusUpdated', {status:'starting'}); + $scope.$digest(); + expect(AGC.caption).to.equal('We‘re building! Build time varies depending on your build commands.'); + expect(AGC.buildStatus).to.equal('starting'); + expect(eventStatus).to.deep.equal({isClear:true}); + $rootScope.$broadcast('buildStatusUpdated', {status:'crashed'}); + $scope.$digest(); + expect(AGC.buildStatus).to.equal('crashed'); + expect(AGC.caption).to.equal('Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!'); + expect(AGC.showError).to.equal(true); + expect(eventStatus).to.deep.equal({error:'buildFailed'}); + }); + + it('should update the caption on alert', function() { + $rootScope.$broadcast('alert', {text:'Container Created',type:'success'}); + expect(AGC.subStep).to.equal('logs'); + expect(AGC.subStepIndex).to.equal(7); + sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'logs'); + }); + }) +}); + + + + + + + + + + + + + + + diff --git a/test/unit/services/ahaGuideService.unit.js b/test/unit/services/ahaGuideService.unit.js index dde85ef23..a1a1ae6d6 100644 --- a/test/unit/services/ahaGuideService.unit.js +++ b/test/unit/services/ahaGuideService.unit.js @@ -1,17 +1,146 @@ 'use strict'; +var mockOrg; +var keypather; +var $rootScope; +var isRunnabotPartOfOrgStub; +var patchOrgMetadataStub; +var apiMocks = require('../apiMocks/index'); +var masterPods; +var mockInstance; +var testRunnabot; +var fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); + describe('ahaGuide'.bold.underline.blue, function () { + var ctx; var ahaGuide; + mockInstance = { + models: [{ + attrs: { + name: 'instance', + hasAddedBranches: true + } + }, { + attrs: { + name: 'instance2' + } + }, { + attrs: { + name: 'instance2-copy' + } + }, { + attrs: { + name: 'instance2-copy2' + } + }] + }; + function setOrg () { + mockOrg = { + poppa: { + id: sinon.stub().returns(101), + attrs: { + hasPaymentMethod: false, + metadata: { + hasAha: true, + hasConfirmedSetup: false + } + } + } + }; + } + setOrg(); function initState () { - angular.mock.module('app'); - - angular.mock.inject(function (_ahaGuide_) { + angular.mock.module(function($provide) { + $provide.value('currentOrg', mockOrg); + $provide.factory('fetchInstancesByPod', fetchInstancesByPodMock.fetch()); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when(testRunnabot)); + return isRunnabotPartOfOrgStub; + }); + $provide.factory('patchOrgMetadata', function ($q) { + patchOrgMetadataStub = sinon.stub().returns($q.when()); + return patchOrgMetadataStub; + }); + }) + angular.mock.inject(function ( + _ahaGuide_, + _keypather_, + _$rootScope_ + ) { ahaGuide = _ahaGuide_; + keypather = _keypather_; + $rootScope = _$rootScope_; }); + $rootScope.featureFlags = { + aha: true + }; } - beforeEach(initState); + beforeEach(initState); + describe('returning the org\'s aha progress', function () { + beforeEach(function() { + mockOrg.poppa.attrs.metadata.hasAha = true; + mockOrg.poppa.attrs.metadata.hasConfirmedSetup = false; + }); + afterEach(function() { + setOrg(); + }) + it('should return true when the user\'s aha property is active', function () { + var userInGuide = ahaGuide.isInGuide(); + expect(userInGuide).to.equal(true); + }); + it('should return false when not', function () { + mockOrg.poppa.attrs.metadata.hasAha = false; + var userInGuide = ahaGuide.isInGuide(); + expect(userInGuide).to.equal(false); + }); + it('should return true when the user has confirmed setup', function () { + var userConfirmedSetup = ahaGuide.hasConfirmedSetup(); + expect(userConfirmedSetup).to.equal(false); + }); + it('should return true when the user has confirmed setup', function () { + mockOrg.poppa.attrs.metadata.hasConfirmedSetup = true; + var userConfirmedSetup = ahaGuide.hasConfirmedSetup(); + expect(userConfirmedSetup).to.equal(true); + }); + }); + describe('getting the current milestone, pre runnabot', function () { + it('should return the choose org step when no poppa id', function () { + mockOrg.poppa.id = null; + var currentStep = ahaGuide.getCurrentStep(); + var chooseOrgStep = ahaGuide.isChoosingOrg(); + expect(currentStep).to.equal(1); + expect(chooseOrgStep).to.equal(true); + }); + it('should return the add first repo step if setup is not confirmed', function () { + mockOrg.poppa.id = sinon.stub().returns(101); + var currentStep = ahaGuide.getCurrentStep(); + var addRepoStep = ahaGuide.isAddingFirstRepo(); + expect(currentStep).to.equal(2); + expect(addRepoStep).to.equal(true); + }); + it('should return the add first branch step if setup is confirmed', function () { + mockOrg.poppa.attrs.metadata.hasConfirmedSetup = true; + var currentStep = ahaGuide.getCurrentStep(); + var addFirstBranch = ahaGuide.isAddingFirstBranch(); + expect(currentStep).to.equal(3); + expect(addFirstBranch).to.equal(true); + }); + }); + describe('getting the current setupRunnabot milestone', function () { + beforeEach(function() { + mockOrg.poppa.attrs.metadata.hasConfirmedSetup = true; + fetchInstancesByPodMock.triggerPromise(mockInstance); + $rootScope.$digest(); + }); + it('should reflect the runnabot step', function() { + var currentStep = ahaGuide.getCurrentStep(); + var addRunnabot = ahaGuide.isSettingUpRunnabot(); + expect(currentStep).to.equal(4); + expect(addRunnabot).to.equal(true); + }); + }); describe('furthestSubstep'.bold, function () { describe('getter', function () { it('should get the default if nothing is set', function () { From 55368dc9b4e4dda3d64c3ae187017f3f9ffa2d9d Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 21 Sep 2016 18:03:58 -0700 Subject: [PATCH 510/577] responsiveness --- .../styles/scss/components/aha-popover.scss | 19 +++++++++++++++++++ client/assets/styles/scss/globals/var.scss | 3 +-- .../styles/scss/layout/instance-header.scss | 1 - .../instance/instanceHeaderView.jade | 3 +-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss index d8cfcf9a1..306d57218 100644 --- a/client/assets/styles/scss/components/aha-popover.scss +++ b/client/assets/styles/scss/components/aha-popover.scss @@ -39,6 +39,25 @@ } } + .instance-header-properties & { + left: auto; + position: fixed; + right: 12px; + top: 96px; + + @media (max-width: 810px) { + max-width: calc(100vw - 30px); + right: 15px; + top: 15px; + } + + .arrow { + @media (max-width: 810px) { + display: none; + } + } + } + .popover-content { @extend %padding-sm; } diff --git a/client/assets/styles/scss/globals/var.scss b/client/assets/styles/scss/globals/var.scss index 59dbd0bac..c3c9d90b8 100755 --- a/client/assets/styles/scss/globals/var.scss +++ b/client/assets/styles/scss/globals/var.scss @@ -121,8 +121,7 @@ $z-show: 10000; // views $z-views: 1000; $z-views-active-panel: 1001; -$z-views-header: 1002; -$z-views-sidebar: 1003; +$z-views-sidebar: 1002; // modals $z-modal-backdrop: 2000; diff --git a/client/assets/styles/scss/layout/instance-header.scss b/client/assets/styles/scss/layout/instance-header.scss index 6d3d9771e..0c974dca2 100644 --- a/client/assets/styles/scss/layout/instance-header.scss +++ b/client/assets/styles/scss/layout/instance-header.scss @@ -3,7 +3,6 @@ background: $white; flex: 0 0 auto; position: relative; - z-index: $z-views-header; } .instance-header-title { diff --git a/client/directives/instances/instance/instanceHeaderView.jade b/client/directives/instances/instance/instanceHeaderView.jade index f2c465e30..eb4382f83 100644 --- a/client/directives/instances/instance/instanceHeaderView.jade +++ b/client/directives/instances/instance/instanceHeaderView.jade @@ -85,9 +85,8 @@ save-open-items-button ) - .popover.bottom.in.popover-aha( + .popover.bottom.in.popover-aha.in( ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaBranchUrlStep" - style = "left: auto; top: 42px; right: 12px;" ) .arrow.white( style = "left: auto; right: 59px;" From fd1dc4c914b75c384420474004a92480f1e30025 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Wed, 21 Sep 2016 18:06:38 -0700 Subject: [PATCH 511/577] Used watch instead of watchCollection --- client/controllers/controllerInstances.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 22a4e1dda..9cb195454 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -254,9 +254,9 @@ function ControllerInstances( CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; if (CIS.isInGuide() && !CIS.poppedInstance.attrs.shouldNotAutofork) { var children = keypather.get(CIS, 'poppedInstance.children'); - var childWatcher = $scope.$watchCollection(function() { - return children.models; - }, function() { + var childWatcher = $scope.$watch(function () { + return keypather.get(children, 'models.length'); + }, function () { if (children.models.length) { $rootScope.$broadcast('showAhaSidebar'); childWatcher(); From 327d38bed03ba119c035783bc4be39670f98737e Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 10:48:23 -0700 Subject: [PATCH 512/577] Fixed bug with edit header modal not displaying text after user progressed to milestone 3 --- client/directives/components/ahaGuide/AhaGuideController.js | 2 -- .../components/ahaGuide/ahaSidebar/ahaSidebarView.jade | 4 ++-- .../modals/modalNewContainer/newContainerModalView.jade | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 88586d223..fb2ddce93 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -37,8 +37,6 @@ function AhaGuideController( updateCaption('success'); } } - } else if (ahaGuide.isAddingFirstBranch()) { - AGC.showError = true; } else { ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_REPO, 'addRepository'); } diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index 229247c2c..3b4a3ee7d 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -76,11 +76,11 @@ ) svg.iconnables use( - ng-if = "getFurthestSubstep(steps.ADD_FIRST_REPO) !== 'success'" + ng-if = "getFurthestSubstep(steps.ADD_FIRST_REPO) !== 'success' && isAddingFirstRepo()" xlink:href = "#icons-octicons-repo" ) use( - ng-if = "getFurthestSubstep(steps.ADD_FIRST_REPO) === 'success'" + ng-if = "getFurthestSubstep(steps.ADD_FIRST_REPO) === 'success' || getCurrentStep() > steps.ADD_FIRST_REPO" xlink:href = "#icons-check" ) .grid-block.vertical.aha-text diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index 2759f5330..b235c54c9 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -73,7 +73,7 @@ xlink:href = "#icons-arrow-down" ) h1.modal-heading( - ng-if = "!MC.ahaGuide.isInGuide()" + ng-if = "!MC.ahaGuide.isAddingFirstRepo()" ) Setup Method svg.iconnables.icons-close( ng-click = "MC.close()" @@ -116,7 +116,7 @@ xlink:href = "#icons-arrow-down" ) h1.modal-heading.text-overflow( - ng-if = "!MC.ahaGuide.isInGuide()" + ng-if = "!MC.ahaGuide.isAddingFirstRepo()" ) Template Name svg.iconnables.icons-close( ng-click = "MC.close()" From da7e28b7c3f6459338239d8c6230f4a07e632263 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 11:03:40 -0700 Subject: [PATCH 513/577] Changed text appearing in aha guide when user is building with a blank dockerfile --- .../setupRepositoryGuide/setUpRepositoryGuideView.jade | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 433c28034..030f68cb0 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -79,8 +79,12 @@ ) Configure commands and packages. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'buildfiles' || AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" + ng-if = "AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" ) Configure additional settings (if necessary). + p.p( + ng-class = "{'p-slide js-animate': AGC.subStepIndex}" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'buildfiles'" + ) When you’re done editing your Dockerfile, click ‘Save and Build’. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" ng-if = "AGC.isInGuide() && !AGC.showError && AGC.subStep === 'filesMirror'" From 85b51ab2abe2f6da90e1a82802eb2e35bf9eda63 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 11:12:48 -0700 Subject: [PATCH 514/577] split aha popover styles into their own files --- .../styles/scss/components/aha-popover.scss | 64 ------------------- client/assets/styles/scss/index.scss | 4 +- .../scss/popover/popover-aha-containers.scss | 19 ++++++ .../styles/scss/popover/popover-aha-url.scss | 18 ++++++ .../styles/scss/popover/popover-aha.scss | 25 ++++++++ .../instance/instanceHeaderView.jade | 2 +- 6 files changed, 66 insertions(+), 66 deletions(-) delete mode 100644 client/assets/styles/scss/components/aha-popover.scss create mode 100644 client/assets/styles/scss/popover/popover-aha-containers.scss create mode 100644 client/assets/styles/scss/popover/popover-aha-url.scss create mode 100644 client/assets/styles/scss/popover/popover-aha.scss diff --git a/client/assets/styles/scss/components/aha-popover.scss b/client/assets/styles/scss/components/aha-popover.scss deleted file mode 100644 index 306d57218..000000000 --- a/client/assets/styles/scss/components/aha-popover.scss +++ /dev/null @@ -1,64 +0,0 @@ -.popover.popover-aha { - max-width: none; - width: 450px; - - &.popover-sm { - color: $gray; - line-height: $input-xs; - max-width: none; - width: auto; - - .float-left + .float-right { - margin-left: 15px; - - @include media(xxs) { - float: left; - margin-left: 0; - margin-top: 3px; - } - } - } - - .layout-navigation & { - left: 75px; - top: 72px; - - @include media(xxs) { - left: 7px; - margin-left: 0; - top: 234px; - width: calc(100vw - 22px); - } - - .arrow { - @include media(xxs) { - left: 30px; - top: -6px; - transform: rotate(90deg); - } - } - } - - .instance-header-properties & { - left: auto; - position: fixed; - right: 12px; - top: 96px; - - @media (max-width: 810px) { - max-width: calc(100vw - 30px); - right: 15px; - top: 15px; - } - - .arrow { - @media (max-width: 810px) { - display: none; - } - } - } - - .popover-content { - @extend %padding-sm; - } -} diff --git a/client/assets/styles/scss/index.scss b/client/assets/styles/scss/index.scss index 0885ce88f..8c7c9a441 100755 --- a/client/assets/styles/scss/index.scss +++ b/client/assets/styles/scss/index.scss @@ -62,7 +62,6 @@ @import "components/aha-button"; @import "components/aha-guide"; @import "components/aha-modals"; -@import "components/aha-popover"; @import "components/aha-sidebar"; @import "components/animated-panel"; @import "components/badges"; @@ -159,6 +158,9 @@ @import "popover/popover-account-menu"; @import "popover/popover-add-branches"; @import "popover/popover-add-tab"; +@import "popover/popover-aha"; +@import "popover/popover-aha-containers"; +@import "popover/popover-aha-url"; @import "popover/popover-branch-menu"; @import "popover/popover-card-status"; @import "popover/popover-container-menu"; diff --git a/client/assets/styles/scss/popover/popover-aha-containers.scss b/client/assets/styles/scss/popover/popover-aha-containers.scss new file mode 100644 index 000000000..c60f948bf --- /dev/null +++ b/client/assets/styles/scss/popover/popover-aha-containers.scss @@ -0,0 +1,19 @@ +.popover.popover-aha-containers { + left: 75px; + top: 72px; + + @include media(xxs) { + left: 7px; + margin-left: 0; + top: 234px; + width: calc(100vw - 22px); + } + + .arrow { + @include media(xxs) { + left: 30px; + top: -6px; + transform: rotate(90deg); + } + } +} diff --git a/client/assets/styles/scss/popover/popover-aha-url.scss b/client/assets/styles/scss/popover/popover-aha-url.scss new file mode 100644 index 000000000..da26b56f7 --- /dev/null +++ b/client/assets/styles/scss/popover/popover-aha-url.scss @@ -0,0 +1,18 @@ +.popover.popover-aha-url { + left: auto; + position: fixed; + right: 12px; + top: 96px; + + @media (max-width: 810px) { + max-width: calc(100vw - 30px); + right: 15px; + top: 15px; + } + + .arrow { + @media (max-width: 810px) { + display: none; + } + } +} diff --git a/client/assets/styles/scss/popover/popover-aha.scss b/client/assets/styles/scss/popover/popover-aha.scss new file mode 100644 index 000000000..5283b3797 --- /dev/null +++ b/client/assets/styles/scss/popover/popover-aha.scss @@ -0,0 +1,25 @@ +.popover.popover-aha { + max-width: none; + width: 450px; + + &.popover-sm { + color: $gray; + line-height: $input-xs; + max-width: none; + width: auto; + + .float-left + .float-right { + margin-left: 15px; + + @include media(xxs) { + float: left; + margin-left: 0; + margin-top: 3px; + } + } + } + + .popover-content { + @extend %padding-sm; + } +} diff --git a/client/directives/instances/instance/instanceHeaderView.jade b/client/directives/instances/instance/instanceHeaderView.jade index eb4382f83..0bbd0228c 100644 --- a/client/directives/instances/instance/instanceHeaderView.jade +++ b/client/directives/instances/instance/instanceHeaderView.jade @@ -85,7 +85,7 @@ save-open-items-button ) - .popover.bottom.in.popover-aha.in( + .popover.bottom.in.popover-aha.popover-aha-url.in( ng-if = "$root.featureFlags.aha && $root.featureFlags.ahaBranchUrlStep" ) .arrow.white( From 088ef08cd65816a320484156cb025322ff68e3cf Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 11:22:30 -0700 Subject: [PATCH 515/577] Fixed issue with duplicate errors on environment page after exited early and build failed --- .../ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 433c28034..f16345f0e 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -100,7 +100,7 @@ ) p.p.small.text-gray-light {{ AGC.title }} p.p( - ng-if = "AGC.isInGuide() && AGC.showError && AGC.errorState === 'buildFailed'" + ng-if = "AGC.isInGuide() && AGC.showError && AGC.errorState === 'buildFailed' && AGC.subStep === 'logs'" ) Uh oh, there was an error! Inspect your logs for debug info. p.p( From 1a049f06eb5ea1e414fedda562ce35a4134dc13f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 11:43:59 -0700 Subject: [PATCH 516/577] fix text color in active state --- client/assets/styles/scss/components/lists.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/client/assets/styles/scss/components/lists.scss b/client/assets/styles/scss/components/lists.scss index dd273cb86..8d108d6cb 100644 --- a/client/assets/styles/scss/components/lists.scss +++ b/client/assets/styles/scss/components/lists.scss @@ -81,6 +81,7 @@ &:active:not(.disabled) .btn-add { @extend %green; + color: $white; .iconnables { color: $white; From 17c24cd57a7efd37f7d0981d045f74f89f12e2f4 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 12:28:40 -0700 Subject: [PATCH 517/577] Edited watch --- client/controllers/controllerInstances.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 9cb195454..1265fb30f 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -253,11 +253,8 @@ function ControllerInstances( this.setAutofork = function () { CIS.poppedInstance.attrs.shouldNotAutofork = !CIS.poppedInstance.attrs.shouldNotAutofork; if (CIS.isInGuide() && !CIS.poppedInstance.attrs.shouldNotAutofork) { - var children = keypather.get(CIS, 'poppedInstance.children'); - var childWatcher = $scope.$watch(function () { - return keypather.get(children, 'models.length'); - }, function () { - if (children.models.length) { + var childWatcher = $scope.$watch('CIS.poppedInstance.children.models.length', function (length) { + if (length) { $rootScope.$broadcast('showAhaSidebar'); childWatcher(); } From 606b57f775f64c70a4a3b871e1b900b28acb75c3 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 13:00:49 -0700 Subject: [PATCH 518/577] Fixed bug that would show the wrong color for the error icon --- client/directives/components/ahaGuide/AhaGuideController.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 88586d223..1ac41595d 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -122,6 +122,7 @@ function AhaGuideController( var buildStatus = update.status; if (buildStatus === 'buildFailed' || buildStatus === 'stopped' || buildStatus === 'crashed') { AGC.showError = true; + AGC.errorState = 'nonRunningContainer'; $rootScope.$broadcast('ahaGuideEvent', { error: 'buildFailed' }); From ff1820cddc3e7891b2c8bc6c5992699b057c2a1c Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 13:36:13 -0700 Subject: [PATCH 519/577] Used includes rather than check each individual substep in ng-if --- client/directives/components/ahaGuide/AhaGuideController.js | 1 + .../ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade | 2 +- client/services/ahaGuideService.js | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 88586d223..4fed0581d 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -97,6 +97,7 @@ function AhaGuideController( AGC.isBuildSuccessful = false; AGC.ahaGuide = ahaGuide; AGC.errorState = $scope.errorState; + AGC.configSteps = ahaGuide.stepList[ahaGuide.steps.ADD_FIRST_REPO].configSubsteps; // get the current milestone var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; diff --git a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade index 030f68cb0..cd2832c59 100644 --- a/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade +++ b/client/directives/components/ahaGuide/setupRepositoryGuide/setUpRepositoryGuideView.jade @@ -79,7 +79,7 @@ ) Configure commands and packages. p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" - ng-if = "AGC.isInGuide() && !AGC.showError && (AGC.subStep === 'default' || AGC.subStep === 'env' || AGC.subStep === 'files' || AGC.subStep === 'ports' || AGC.subStep === 'translation')" + ng-if = "AGC.isInGuide() && !AGC.showError && AGC.configSteps.includes(AGC.subStep)" ) Configure additional settings (if necessary). p.p( ng-class = "{'p-slide js-animate': AGC.subStepIndex}" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index bbdd531e1..e7a96ac2a 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -165,6 +165,7 @@ function ahaGuide( crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!', buildFailed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' }, + configSubsteps: ['default', 'env', 'files', 'ports', 'translation'], defaultSubstep: 'addRepository' }; From c7db5ef181c62595f43992c20fea6c1f3c53a877 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 13:50:04 -0700 Subject: [PATCH 520/577] add titles for text-overflow --- .../styles/scss/popover/popover-branch-menu.scss | 4 ++++ .../branchMenuPopover/branchMenuPopoverView.jade | 4 +++- .../branchMenuPopover/templateMenuPopoverView.jade | 12 +++++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 80d447478..05942a742 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -110,4 +110,8 @@ margin-right: 18px; width: 18px; } + + .btn-add { + margin-left: 15px; + } } diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 2ba818d22..5e5bbc464 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -144,7 +144,9 @@ use( xlink:href = "#icons-branch-alt" ) - .grid-content.text-overflow {{ branch.attrs.name }} + .grid-content.text-overflow( + title = "{{ branch.attrs.name }}" + ) {{ branch.attrs.name }} button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!$root.isLoading[branch.attrs.name]" ) Add diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 6b5318b90..f6ba6ba75 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -58,7 +58,9 @@ xlink:href = "#icons-repository" ) .grid-block.vertical - .grid-content.text-overflow button-clicker + .grid-content.text-overflow( + title = "button-clicker" + ) button-clicker .grid-block( ng-if = "$root.featureFlags.inviteFlows" ) @@ -90,7 +92,9 @@ xlink:href = "#icons-repository" ) .grid-block.vertical - .grid-content.text-overflow api + .grid-content.text-overflow( + title = "api" + ) api .grid-block( ng-if = "$root.featureFlags.inviteFlows" ) @@ -116,7 +120,9 @@ xlink:href = "#icons-repository" ) .grid-block.vertical - .grid-content.text-overflow runnable.com + .grid-content.text-overflow( + title = "runnable.com" + ) runnable.com .grid-block( ng-if = "$root.featureFlags.inviteFlows" ) From c826df721f982cf4d528683f1476b73b6abf721f Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 14:08:12 -0700 Subject: [PATCH 521/577] Changed css styles for setup confirmation modal to move modal 43 pixels below current position. Moved runnabear image as well --- client/assets/styles/scss/modals/modals-confirm-setup.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/assets/styles/scss/modals/modals-confirm-setup.scss b/client/assets/styles/scss/modals/modals-confirm-setup.scss index 1d83bd2a7..57c0f004c 100644 --- a/client/assets/styles/scss/modals/modals-confirm-setup.scss +++ b/client/assets/styles/scss/modals/modals-confirm-setup.scss @@ -5,9 +5,10 @@ position: relative; width: 180px; z-index: 1; + top: 43px; } .modal-dialog { - margin-top: -13px; + margin-top: 30px; } } From c10c1833874d0054e5e8a42638e8488a78212491 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 14:44:00 -0700 Subject: [PATCH 522/577] Removed unused rootscope dependency --- .../components/gitHubIntegration/githubIntegrationController.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/directives/components/gitHubIntegration/githubIntegrationController.js b/client/directives/components/gitHubIntegration/githubIntegrationController.js index 09e9ebf34..fc8114367 100644 --- a/client/directives/components/gitHubIntegration/githubIntegrationController.js +++ b/client/directives/components/gitHubIntegration/githubIntegrationController.js @@ -8,7 +8,6 @@ require('app') function GithubIntegrationController( $interval, $q, - $rootScope, $scope, ahaGuide, currentOrg, From 999a155598617c674ea94c56e47be2eee9d104bc Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 15:25:30 -0700 Subject: [PATCH 523/577] Possible funnel --- .../components/ahaGuide/AhaGuideController.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 88586d223..3151c5a45 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -7,6 +7,7 @@ require('app') function AhaGuideController( $scope, $rootScope, + $state, ahaGuide, currentOrg, errs, @@ -16,6 +17,7 @@ function AhaGuideController( ) { var AGC = this; var animatedPanelListener = angular.noop; + mixpanelEvent(); // dismiss add service popover if open $rootScope.$broadcast('showAddServicesPopover', false); @@ -196,4 +198,12 @@ function AhaGuideController( $rootScope.$broadcast('showAhaSidebar'); } }; + + function mixpanelEvent () { + console.log($state); + /* if $state.current.templateUrul === 'environmentView' + if $state.current.state === 'base.config' + if $state.current.controller === 'EnvironmentController' + */ + } } From 9da72895168c8ee93c65f1e0555bafb87ea689c3 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 22 Sep 2016 16:08:57 -0700 Subject: [PATCH 524/577] add segment tracking for selecting an org --- client/services/serviceEventTracking.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 238b08ea9..6e9b18e87 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -394,6 +394,9 @@ EventTracking.prototype.selectedOrg = function (org) { self._mixpanel('track', eventName, { org: org }); + self.analytics.ready(function () { + self.analytics.track(eventName, {org: org}); + }); return self; }; @@ -413,3 +416,4 @@ EventTracking.prototype.waitingForInfrastructure = function (orgName) { }); return self; }; + From 70a40e92ab29fdca138cb568ebe65055492876ce Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 16:18:04 -0700 Subject: [PATCH 525/577] This adds a reset button for the aha guide. It will appear in the feature flags menu --- client/controllers/featureFlagsController.js | 6 +++++- .../popoverAccountMenu/viewPopoverAccountMenu.jade | 10 ++++++++++ client/services/ahaGuideService.js | 13 +++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/client/controllers/featureFlagsController.js b/client/controllers/featureFlagsController.js index fb413d6c5..29c74dad4 100644 --- a/client/controllers/featureFlagsController.js +++ b/client/controllers/featureFlagsController.js @@ -4,7 +4,11 @@ require('app') .controller('FeatureFlagsController', FeatureFlagsController); function FeatureFlagsController( - $localStorage + $localStorage, + ahaGuide ) { this.$localStorage = $localStorage; + this.resetAha = function() { + ahaGuide.resetGuide(); + }; } diff --git a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade index 87dc041ac..7abd8b489 100644 --- a/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade +++ b/client/directives/accountsSelect/popoverAccountMenu/viewPopoverAccountMenu.jade @@ -182,6 +182,16 @@ style = "background-position: 6px center !important; padding-left: 24px !important;" type = "search" ) + label.list-item.popover-list-item.text-overflow( + style = "display: block; padding: 0 39px 0 15px;" + ) Reset Aha Guide + .toggle-wrapper( + style = "position: absolute; right: 12px; top: 11px;" + ) + input.toggle-input( + ng-click = "FFC.resetAha()" + type = "button" + ) label.list-item.popover-list-item.text-overflow( ng-repeat = "(flag, value) in $root.featureFlags" ng-show = "!searchText || flag.indexOf(searchText) > -1" diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index bbdd531e1..b6c6728dc 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -299,8 +299,21 @@ function ahaGuide( }); } + function resetGuide() { + return patchOrgMetadata(currentOrg.poppa.id(), { + metadata: { + hasAha: true, + hasConfirmedSetup: false + } + }) + .then(function (updatedOrg) { + updateCurrentOrg(updatedOrg); + }); + } + return { endGuide: endGuide, + resetGuide: resetGuide, getCurrentStep: getCurrentStep, hasConfirmedSetup: hasConfirmedSetup, hasRunnabot: refreshHasRunnabot, From 138257331efdd83c2e24a8858458b2df2da3a934 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 16:20:48 -0700 Subject: [PATCH 526/577] Fix spacing --- .../controllers/ahaGuideController.unit.js | 311 +++++++++--------- test/unit/services/ahaGuideService.unit.js | 3 +- 2 files changed, 149 insertions(+), 165 deletions(-) diff --git a/test/unit/controllers/ahaGuideController.unit.js b/test/unit/controllers/ahaGuideController.unit.js index f2631f57a..3b11e7d1b 100644 --- a/test/unit/controllers/ahaGuideController.unit.js +++ b/test/unit/controllers/ahaGuideController.unit.js @@ -13,15 +13,15 @@ var eventStatus; var apiMocks = require('../apiMocks/index'); describe('ahaGuideController'.bold.underline.blue, function () { - var ctx = {}; - var AGC; - var mockSteps = { - CHOOSE_ORGANIZATION: 1, - ADD_FIRST_REPO: 2, - ADD_FIRST_BRANCH: 3, - SETUP_RUNNABOT: 4, - COMPLETED: -1 - }; + var ctx = {}; + var AGC; + var mockSteps = { + CHOOSE_ORGANIZATION: 1, + ADD_FIRST_REPO: 2, + ADD_FIRST_BRANCH: 3, + SETUP_RUNNABOT: 4, + COMPLETED: -1 + }; function createMasterPods() { ctx.masterPods = runnable.newInstances( @@ -31,166 +31,151 @@ describe('ahaGuideController'.bold.underline.blue, function () { return ctx.masterPods; } - mockAhaGuideMethods = { - endGuide: sinon.stub(), - getCurrentStep: sinon.stub(), - hasConfirmedSetup: sinon.stub(), - hasRunnabot: sinon.stub(), - isInGuide: sinon.stub(), - furthestSubstep: sinon.stub(), - isChoosingOrg: sinon.stub(), - isAddingFirstRepo: sinon.stub(), - isAddingFirstBranch: sinon.stub(), - steps: mockSteps, - stepList: { - 2: { - title: 'Step 2: Add a Repository', - subSteps: { - addRepository: { - step: 0 - }, - containerSelection: { - step: 1 - }, - logs: { - step: 7 - } - }, - buildStatus: { - starting: 'We‘re building! Build time varies depending on your build commands.', - crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' - } - } - }, - } - - function setup() { - mockCurrentOrg = { - poppa: { - attrs: { - hasPaymentMethod: false, - id: 101, - metadata: { - hasAha: true, - hasConfirmedSetup: false - } - } - } - }; + mockAhaGuideMethods = { + endGuide: sinon.stub(), + getCurrentStep: sinon.stub(), + hasConfirmedSetup: sinon.stub(), + hasRunnabot: sinon.stub(), + isInGuide: sinon.stub(), + furthestSubstep: sinon.stub(), + isChoosingOrg: sinon.stub(), + isAddingFirstRepo: sinon.stub(), + isAddingFirstBranch: sinon.stub(), + steps: mockSteps, + stepList: { + 2: { + title: 'Step 2: Add a Repository', + subSteps: { + addRepository: { + step: 0 + }, + containerSelection: { + step: 1 + }, + logs: { + step: 7 + } + }, + buildStatus: { + starting: 'We‘re building! Build time varies depending on your build commands.', + crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' + } + } + }, + } - ctx = {}; - ctx.fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); - angular.mock.module('app'); - ctx.fakeOrg1 = { - attrs: angular.copy(apiMocks.user), - oauthName: function () { - return 'org1'; - } - }; - ctx.fakeOrg2 = { - attrs: angular.copy(apiMocks.user), - oauthName: function () { - return 'org2'; - } - }; - ctx.fakeOrgs = {models: [ctx.fakeOrg1, ctx.fakeOrg2]}; - ctx.stateParams = { - userName: 'username', - instanceName: 'instancename' - }; - angular.mock.module('app', function ($provide) { - $provide.factory('fetchInstancesByPod', ctx.fetchInstancesByPodMock.autoTrigger(createMasterPods())); - $provide.factory('isRunnabotPartOfOrg', function ($q) { - isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); - return isRunnabotPartOfOrgStub; - }); - $provide.value('currentOrg', mockCurrentOrg); - $provide.value('ahaGuide', mockAhaGuideMethods); - }); - angular.mock.inject(function ( - _$controller_, - _$rootScope_, - _$window_, - _keypather_ - ) { - $controller = _$controller_; - $rootScope = _$rootScope_; - $window = _$window_; - keypather = _keypather_; + function setup() { + mockCurrentOrg = { + poppa: { + attrs: { + hasPaymentMethod: false, + id: 101, + metadata: { + hasAha: true, + hasConfirmedSetup: false + } + } + } + }; - $scope = $rootScope.$new(); - }); + ctx = {}; + ctx.fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); + angular.mock.module('app'); + ctx.fakeOrg1 = { + attrs: angular.copy(apiMocks.user), + oauthName: function () { + return 'org1'; + } + }; + ctx.fakeOrg2 = { + attrs: angular.copy(apiMocks.user), + oauthName: function () { + return 'org2'; + } + }; + ctx.fakeOrgs = {models: [ctx.fakeOrg1, ctx.fakeOrg2]}; + ctx.stateParams = { + userName: 'username', + instanceName: 'instancename' + }; + angular.mock.module('app', function ($provide) { + $provide.factory('fetchInstancesByPod', ctx.fetchInstancesByPodMock.autoTrigger(createMasterPods())); + $provide.factory('isRunnabotPartOfOrg', function ($q) { + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); + return isRunnabotPartOfOrgStub; + }); + $provide.value('currentOrg', mockCurrentOrg); + $provide.value('ahaGuide', mockAhaGuideMethods); + }); + angular.mock.inject(function ( + _$controller_, + _$rootScope_, + _$window_, + _keypather_ + ) { + $controller = _$controller_; + $rootScope = _$rootScope_; + $window = _$window_; + keypather = _keypather_; + + $scope = $rootScope.$new(); + }); $rootScope.featureFlags = { - aha: true + aha: true }; - var controllerInitFn = $controller('AhaGuideController', { - '$scope': $scope - }, true); - - AGC = controllerInitFn(); - $rootScope.$apply(); - } + var controllerInitFn = $controller('AhaGuideController', { + '$scope': $scope + }, true); - describe('managing steps and substeps for milestone 2', function() { - beforeEach(function() { - mockAhaGuideMethods.getCurrentStep.returns(2); - mockAhaGuideMethods.isAddingFirstRepo.returns(true); - setup(); - $scope.$on('ahaGuideEvent', function(event, status) { - eventStatus = status; - }) - }) - - it('should update the subStep and index based on a panel change', function() { - $scope.$emit('changed-animated-panel', 'addRepository'); - $scope.$digest(); - expect(AGC.subStep).to.equal('addRepository'); - expect(AGC.subStepIndex).to.equal(0); - sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'addRepository'); - $scope.$digest(); - $scope.$emit('changed-animated-panel', 'containerSelection'); - $scope.$digest(); - expect(AGC.subStep).to.equal('containerSelection'); - expect(AGC.subStepIndex).to.equal(1); - sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'containerSelection'); - }); - - it('should update the caption and build status based on an update', function() { - $rootScope.$broadcast('buildStatusUpdated', {status:'starting'}); - $scope.$digest(); - expect(AGC.caption).to.equal('We‘re building! Build time varies depending on your build commands.'); - expect(AGC.buildStatus).to.equal('starting'); - expect(eventStatus).to.deep.equal({isClear:true}); - $rootScope.$broadcast('buildStatusUpdated', {status:'crashed'}); - $scope.$digest(); - expect(AGC.buildStatus).to.equal('crashed'); - expect(AGC.caption).to.equal('Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!'); - expect(AGC.showError).to.equal(true); - expect(eventStatus).to.deep.equal({error:'buildFailed'}); - }); + AGC = controllerInitFn(); + $rootScope.$apply(); + } - it('should update the caption on alert', function() { - $rootScope.$broadcast('alert', {text:'Container Created',type:'success'}); - expect(AGC.subStep).to.equal('logs'); - expect(AGC.subStepIndex).to.equal(7); - sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'logs'); - }); - }) + describe('managing steps and substeps for milestone 2', function() { + beforeEach(function() { + mockAhaGuideMethods.getCurrentStep.returns(2); + mockAhaGuideMethods.isAddingFirstRepo.returns(true); + setup(); + $scope.$on('ahaGuideEvent', function(event, status) { + eventStatus = status; + }) + }) + + it('should update the subStep and index based on a panel change', function() { + $scope.$emit('changed-animated-panel', 'addRepository'); + $scope.$digest(); + expect(AGC.subStep).to.equal('addRepository'); + expect(AGC.subStepIndex).to.equal(0); + sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'addRepository'); + $scope.$digest(); + $scope.$emit('changed-animated-panel', 'containerSelection'); + $scope.$digest(); + expect(AGC.subStep).to.equal('containerSelection'); + expect(AGC.subStepIndex).to.equal(1); + sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'containerSelection'); + }); + + it('should update the caption and build status based on an update', function() { + $rootScope.$broadcast('buildStatusUpdated', {status:'starting'}); + $scope.$digest(); + expect(AGC.caption).to.equal('We‘re building! Build time varies depending on your build commands.'); + expect(AGC.buildStatus).to.equal('starting'); + expect(eventStatus).to.deep.equal({isClear:true}); + $rootScope.$broadcast('buildStatusUpdated', {status:'crashed'}); + $scope.$digest(); + expect(AGC.buildStatus).to.equal('crashed'); + expect(AGC.caption).to.equal('Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!'); + expect(AGC.showError).to.equal(true); + expect(eventStatus).to.deep.equal({error:'buildFailed'}); + }); + + it('should update the caption on alert', function() { + $rootScope.$broadcast('alert', {text:'Container Created',type:'success'}); + expect(AGC.subStep).to.equal('logs'); + expect(AGC.subStepIndex).to.equal(7); + sinon.assert.calledWith(mockAhaGuideMethods.furthestSubstep, 2, 'logs'); + }); + }) }); - - - - - - - - - - - - - - - diff --git a/test/unit/services/ahaGuideService.unit.js b/test/unit/services/ahaGuideService.unit.js index a1a1ae6d6..7928184ce 100644 --- a/test/unit/services/ahaGuideService.unit.js +++ b/test/unit/services/ahaGuideService.unit.js @@ -8,7 +8,6 @@ var patchOrgMetadataStub; var apiMocks = require('../apiMocks/index'); var masterPods; var mockInstance; -var testRunnabot; var fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); describe('ahaGuide'.bold.underline.blue, function () { @@ -55,7 +54,7 @@ describe('ahaGuide'.bold.underline.blue, function () { $provide.value('currentOrg', mockOrg); $provide.factory('fetchInstancesByPod', fetchInstancesByPodMock.fetch()); $provide.factory('isRunnabotPartOfOrg', function ($q) { - isRunnabotPartOfOrgStub = sinon.stub().returns($q.when(testRunnabot)); + isRunnabotPartOfOrgStub = sinon.stub().returns($q.when(false)); return isRunnabotPartOfOrgStub; }); $provide.factory('patchOrgMetadata', function ($q) { From 0a995fcec60f1869056cedcbe42eeee9fa98073f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 16:51:04 -0700 Subject: [PATCH 527/577] update repository icons --- client/templates/svg/svgDefs.jade | 93 ++++++++++++++----------------- 1 file changed, 41 insertions(+), 52 deletions(-) diff --git a/client/templates/svg/svgDefs.jade b/client/templates/svg/svgDefs.jade index b314cbbc9..c07ac9a3f 100755 --- a/client/templates/svg/svgDefs.jade +++ b/client/templates/svg/svgDefs.jade @@ -291,14 +291,12 @@ svg(xmlns='http://www.w3.org/2000/svg') symbol#icons-redirect(viewBox='0 0 16 35.173') path(d='M16,2V0C7.163,0,0,7.163,0,16c0,6.937,4.421,12.826,10.595,15.042l-4.764,2.224c-0.5,0.233-0.717,0.828-0.483,1.329c0.144,0.31,0.429,0.511,0.743,0.563c0.193,0.032,0.397,0.009,0.587-0.08l6.859-3.202c0.493-0.23,0.711-0.811,0.492-1.308l-3.046-6.93c-0.224-0.505-0.813-0.734-1.318-0.513c-0.505,0.223-0.735,0.812-0.513,1.318l2.064,4.695C5.848,27.179,2,22.037,2,16C2,8.28,8.28,2,16,2z') symbol#icons-repository(viewBox='0 0 18 18') - path(fill='#E6E6E6', d='M3.371,16.534c-1.213,0-2.905-0.66-2.905-1.734V13c0-1.442,2.23-1.484,2.484-1.484h10.628c0.4,0,0.419-0.001,0.604-0.012c0.128-0.007,0.92-0.041,0.92-0.041l0.078-0.034c0.126-0.053,0.243-0.114,0.353-0.185V14c0,0.941-0.323,2.534-1.534,2.534H3.371z') - path(fill='#808080', d='M15.068,11.93V14c0,0.831-0.284,2.068-1.068,2.068H3.371c-1.098,0-2.439-0.585-2.439-1.268V13c0-1.007,1.936-1.018,2.018-1.018H13.58c0.419,0,0.437-0.001,0.632-0.012c0.127-0.007,0.337-0.019,0.825-0.038L15.068,11.93M16,9.697c-0.069,0.66-0.484,1.085-1,1.303c-1.188,0.047-0.759,0.049-1.42,0.049H2.951C1.531,11.049,0,11.581,0,13v1.8C0,16.219,1.952,17,3.371,17H14c1.419,0,2-1.581,2-3V9.697L16,9.697z') - path(fill='#B3B3B3', d='M0.466,3c0.004-1.278,1.255-2.534,2.524-2.534h10.134c1.316,0.005,2.385,1.109,2.38,2.462L15.478,9.86c-0.11,0.366-0.365,0.567-0.588,0.678c-0.439,0.018-0.636,0.028-0.758,0.035c-0.17,0.01-0.187,0.011-0.553,0.011H2.951c-1.009,0-1.878,0.239-2.484,0.67V3z') - path(fill='#808080', d='M2.99,0.932l0.01,0h10.121c1.061,0.004,1.921,0.898,1.917,1.993l-0.027,6.858c-0.033,0.084-0.101,0.198-0.25,0.293c-0.364,0.015-0.54,0.025-0.652,0.031c-0.164,0.009-0.178,0.009-0.529,0.009H2.951c-0.753,0-1.44,0.125-2.018,0.36V3.003C0.936,1.888,2.067,0.932,2.99,0.932 M2.99,0C1.521,0,0.006,1.392,0,3v9h0.347c0.529-0.672,1.59-0.951,2.604-0.951H13.58c0.662,0,0.233-0.003,1.42-0.049c0.451-0.191,0.81-0.551,0.943-1.076l0.028-6.994c0.006-1.612-1.268-2.923-2.846-2.93H3C2.997,0,2.994,0,2.99,0L2.99,0z') - path(fill='#999999', d='M0.466,3C0.47,1.876,1.438,0.77,2.534,0.519v10.082c-0.842,0.061-1.552,0.288-2.067,0.654V3z') - path(fill='#808080', d='M2.068,1.209v8.969c-0.411,0.059-0.792,0.16-1.135,0.299V3.003C0.935,2.251,1.45,1.572,2.068,1.209 M2.99,0C1.521,0,0.006,1.392,0,3v9h0.347c0.529-0.672,1.59-0.951,2.604-0.951H3V0C2.997,0,2.994,0,2.99,0L2.99,0z') - polygon(fill='#EF9CA4', points='5.985,15.289 4.506,16.769 4.527,12.5 7.498,12.5 7.477,16.78') - path(fill='#F25058', d='M6.995,13l-0.013,2.579l-0.29-0.29l-0.707-0.707l-0.707,0.707l-0.266,0.266L5.024,13H6.995 M8,12H4.029L4,17.982l1.985-1.985l1.985,1.985L8,12L8,12z') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:gray;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#ef9ca4;stroke:#f25058;stroke-linejoin:round') + path(d='M5.5,11.5V0.5H14A2.5,2.5,0,0,1,16.5,3v8.5H5.5Z', style='fill:#bbb;stroke:#888;stroke-miterlimit:10') + path(d='M1.5,13.5V3A2.5,2.5,0,0,1,4,.5H5.5v13h-4Z', style='fill:#a1a1a1;stroke:#888;stroke-miterlimit:10') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:#888;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#ef9ca4;stroke:#f25058;stroke-linejoin:round') symbol#icons-repository-alt(viewBox='0 0 12 14.546') path(d='M12,0.909v10.909c-0.011,0.256-0.11,0.469-0.297,0.639c-0.188,0.17-0.422,0.261-0.703,0.27H6v1.818l-1.5-1.364L3,14.546v-1.818H1c-0.281-0.01-0.516-0.1-0.703-0.27C0.109,12.287,0.01,12.074,0,11.819V0.909C0.01,0.654,0.109,0.441,0.297,0.27S0.719,0.01,1,0h10c0.281,0.01,0.516,0.1,0.703,0.27S11.989,0.654,12,0.909z M11,10.001H1v1.818h2v-0.909h3v0.909h5V10.001zM11,0.909H2v8.182H11V0.909z M4,1.818H3v0.909h1V1.818z M4,3.637H3v0.909h1V3.637z M4,5.455H3v0.909h1V5.455z M4,8.182H3V7.273h1V8.182z') symbol#icons-search(viewBox='0 0 30 30') @@ -522,53 +520,44 @@ svg(xmlns='http://www.w3.org/2000/svg') path(fill='#3CCB5A', d='M12.5,9c1.93,0,3.5,1.57,3.5,3.5S14.43,16,12.5,16S9,14.43,9,12.5S10.57,9,12.5,9 M12.5,8C10.015,8,8,10.015,8,12.5s2.015,4.5,4.5,4.5s4.5-2.015,4.5-4.5S14.985,8,12.5,8L12.5,8z') polygon(fill='#3CCB5A', points='15,12 13,12 13,10 12,10 12,12 10,12 10,13 12,13 12,15 13,15 13,13 15,13 ') symbol#icons-new-repository-server(viewBox='0 0 18 18') - path(fill='#B3B3B3', d='M0.466,11.534V3c0.005-1.325,1.147-2.534,2.397-2.534h10.261c1.316,0.005,2.385,1.109,2.38,2.462l-0.027,7.053c-0.204,0.874-1.039,1.553-2.021,1.553H0.466z') - path(fill='#808080', d='M2.863,0.932l0.01,0h10.249c1.061,0.004,1.921,0.898,1.917,1.993l-0.028,6.943c-0.196,0.711-0.823,1.199-1.554,1.199H0.932V3.003C0.936,1.939,1.874,0.932,2.863,0.932 M2.863,0C1.394,0,0.006,1.392,0,3v9h13.457c1.227,0,2.232-0.867,2.486-2.017l0.028-7.053c0.006-1.612-1.268-2.923-2.846-2.93H2.873C2.87,0,2.866,0,2.863,0L2.863,0z') - path(fill='#E6E6E6', d='M3.371,15.534c-1.213,0-2.905-0.66-2.905-1.734V13c0-1.442,2.23-1.484,2.484-1.484h10.628c0.4,0,0.419-0.001,0.604-0.012c0.128-0.007,0.92-0.041,0.92-0.041l0.078-0.034c0.126-0.053,0.243-0.114,0.353-0.185V13c0,0.941-0.323,2.534-1.534,2.534H3.371z') - path(fill='#808080', d='M15.068,11.93V13c0,0.831-0.284,2.068-1.068,2.068H3.371c-1.098,0-2.439-0.585-2.439-1.268V13c0-1.007,1.936-1.018,2.018-1.018H13.58c0.419,0,0.437-0.001,0.632-0.012c0.127-0.007,0.337-0.019,0.825-0.038L15.068,11.93M16,9.697c-0.069,0.66-0.484,1.085-1,1.303c-1.188,0.047-0.759,0.049-1.42,0.049H2.951C1.531,11.049,0,11.581,0,13v0.8C0,15.219,1.952,16,3.371,16H14c1.419,0,2-1.581,2-3V9.697L16,9.697z') - polygon(fill='#EF9CA4', points='5.001,15.29 3.506,16.774 3.527,12.5 6.5,12.5 6.5,16.791 ') - path(fill='#F25058', d='M6,13v2.583L5.708,15.29l-0.704-0.706l-0.708,0.703l-0.284,0.282L4.024,13H6 M7,12H3.029L3,17.982l2-1.985L7,18V12L7,12z') - circle(fill='#FFFFFF', cx='12.5', cy='12.5', r='5.5') - path(fill='#EBFFEE', d='M12.5,16.5c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S14.706,16.5,12.5,16.5z') - path(fill='#3CCB5A', d='M12.5,9c1.93,0,3.5,1.57,3.5,3.5S14.43,16,12.5,16S9,14.43,9,12.5S10.57,9,12.5,9 M12.5,8C10.015,8,8,10.015,8,12.5s2.015,4.5,4.5,4.5s4.5-2.015,4.5-4.5S14.985,8,12.5,8L12.5,8z') - polygon(fill='#3CCB5A', points='15,12 13,12 13,10 12,10 12,12 10,12 10,13 12,13 12,15 13,15 13,13 15,13 ') - path(fill='#999999', d='M0.446,3c0.004-1.094,1.022-2.244,2.107-2.501v11.066c-0.607,0.029-1.464,0.134-2.107,0.466V3z') - path(fill='#808080', d='M2.107,1.162v9.98c-0.451,0.041-0.857,0.117-1.215,0.227l0-8.366C0.895,2.313,1.444,1.555,2.107,1.162M2.992,0C1.522,0,0.006,1.525,0,3v10.344c0-1.283,2.45-1.344,2.922-1.344C2.972,11.999,3,12,3,12V0C2.997,0,2.995,0,2.992,0L2.992,0z') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:gray;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#ef9ca4;stroke:#f25058;stroke-linejoin:round') + path(d='M5.5,11.5V0.5H14A2.5,2.5,0,0,1,16.5,3v8.5H5.5Z', style='fill:#bbb;stroke:#888;stroke-miterlimit:10') + path(d='M1.5,13.5V3A2.5,2.5,0,0,1,4,.5H5.5v13h-4Z', style='fill:#a1a1a1;stroke:#888;stroke-miterlimit:10') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:#888;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#ef9ca4;stroke:#f25058;stroke-linejoin:round') + circle(cx='13.5', cy='13.5', r='5.5', style='fill:#fff') + circle(cx='13.5', cy='13.5', r='4', style='fill:#ebffee;stroke:#3ccb5a;stroke-miterlimit:10') + line(x1='11', y1='13.5', x2='16', y2='13.5', style='fill:none;stroke:#3ccb5a;stroke-miterlimit:10') + line(x1='13.5', y1='16', x2='13.5', y2='11', style='fill:none;stroke:#3ccb5a;stroke-miterlimit:10') symbol#icons-repository-additional(viewBox='0 0 18 18') - path(fill='#B3B3B3', d='M0.6,11.6l0-8.7c0-1.3,1-2.4,2.2-2.4l10.3,0.1c1.3,0,2.4,1.1,2.4,2.5l0,7.1c-0.2,0.9-1,1.6-2,1.6H0.6z') - path(fill='#808080', d='M2.9,0l0,0.9L13.1,1C14.2,1,15,1.9,15,3l0,6.9c-0.2,0.7-0.8,1.2-1.6,1.2H1.1l0-8.2c0-1.1,0.8-2,1.7-2V0M2.9,0C1.4,0,0.2,1.3,0.2,2.9l0,9.1h13.3c1.2,0,2.2-0.9,2.5-2L16,3c0-1.6-1.3-2.9-2.8-2.9L2.9,0C2.9,0,2.9,0,2.9,0L2.9,0z') - path(fill='#E6E6E6', d='M3.4,16.6c-1.2,0-2.9-0.7-2.9-1.7v-1.8c0-1.4,2.2-1.5,2.5-1.5h10.6c0.4,0,0.4,0,0.6,0c0.1,0,0.9,0,0.9,0l0.1,0c0.1-0.1,0.2-0.1,0.4-0.2v2.8c0,0.9-0.3,2.5-1.5,2.5H3.4z') - path(fill='#808080', d='M15.1,12v2.1c0,0.8-0.3,2.1-1.1,2.1H3.4c-1.1,0-2.4-0.6-2.4-1.3v-1.8c0-1,1.9-1,2-1h10.6c0.4,0,0.4,0,0.6,0C14.3,12,14.5,12,15.1,12L15.1,12 M16,9.7c-0.1,0.7-0.5,1.1-1,1.3c-1.2,0-0.8,0-1.4,0H3c-1.4,0-3,0.5-3,2v1.8c0,1.4,2,2.2,3.4,2.2H14c1.4,0,2-1.6,2-3V9.7L16,9.7z') - path(fill='#A68AC4', d='M6.3,15.7c-0.1-0.1-0.2-0.1-0.4-0.1s-0.3,0-0.4,0.1l-1.1,1.1l0-4.3h3l0,4.3L6.3,15.7z') - path(fill='#834FAB', d='M7,13.1l0,2.6l-0.3-0.3C6.5,15.1,6.2,15,6,15s-0.5,0.1-0.7,0.3L5,15.6l0-2.6H7 M8,12.1H4l0,6l2-2l2,2L8,12.1L8,12.1z') - path(fill='#999999', d='M0.6,11.5l0-8.6c0-1.2,0.8-2.2,1.7-2.4v11H0.6z') - path(fill='#808080', d='M1.9,1.2V11H1.1l0-8.1C1.1,2.2,1.5,1.6,1.9,1.2 M2.9,0C1.4,0,0.2,1.3,0.2,2.9l0,9.1h2.7L2.9,0C2.9,0,2.9,0,2.9,0L2.9,0z') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:gray;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#ef9ca4;stroke:#f25058;stroke-linejoin:round') + path(d='M5.5,11.5V0.5H14A2.5,2.5,0,0,1,16.5,3v8.5H5.5Z', style='fill:#bbb;stroke:#888;stroke-miterlimit:10') + path(d='M1.5,13.5V3A2.5,2.5,0,0,1,4,.5H5.5v13h-4Z', style='fill:#a1a1a1;stroke:#888;stroke-miterlimit:10') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:#888;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#a68ac4;stroke:#834fab;stroke-linejoin:round') symbol#icons-repository-delete(viewBox='0 0 18 18') - path(fill='#B3B3B3', d='M0.6,11.6l0-8.7c0-1.3,1-2.4,2.2-2.4h10.3c1.3,0,2.4,1.1,2.4,2.5l0,7.1c-0.2,0.9-1,1.6-2,1.6H0.6z') - path(fill='#808080', d='M2.9,1L2.9,1l10.3,0C14.2,1,15,1.9,15,3l0,6.9c-0.2,0.7-0.8,1.2-1.6,1.2H1.1l0-8.2C1.1,1.8,1.9,1,2.9,1M2.9,0.1c-1.5,0-2.7,1.2-2.7,2.9l0,9.1h13.3c1.2,0,2.2-0.9,2.5-2L16,3c0-1.6-1.3-2.9-2.8-2.9L2.9,0.1C2.9,0.1,2.9,0.1,2.9,0.1L2.9,0.1z') - path(fill='#E6E6E6', d='M3.4,15.6c-1.2,0-2.9-0.7-2.9-1.7v-0.8c0-1.4,2.2-1.5,2.5-1.5h10.6c0.4,0,0.4,0,0.6,0c0.1,0,0.9,0,0.9,0l0.1,0c0.1-0.1,0.2-0.1,0.4-0.2v1.8c0,0.9-0.3,2.5-1.5,2.5H3.4z') - path(fill='#808080', d='M15.1,12v1.1c0,0.8-0.3,2.1-1.1,2.1H3.4c-1.1,0-2.4-0.6-2.4-1.3v-0.8c0-1,1.9-1,2-1h10.6c0.4,0,0.4,0,0.6,0C14.3,12,14.5,12,15.1,12L15.1,12 M16,9.7c-0.1,0.7-0.5,1.1-1,1.3c-1.2,0-0.8,0-1.4,0H3c-1.4,0-3,0.5-3,2v0.8c0,1.4,2,2.2,3.4,2.2H14c1.4,0,2-1.6,2-3V9.7L16,9.7z') - path(fill='#999999', d='M0.6,10.5l0-7.9c0-1.1,0.8-2,1.8-2.2v10H0.6z') - path(fill='#808080', d='M2,1.1v8.9H1.1l0-7.4C1.1,2,1.5,1.4,2,1.1 M2.9,0C1.4,0,0.2,1.2,0.2,2.7l0,8.3h2.7L2.9,0C2.9,0,2.9,0,2.9,0L2.9,0z') - path(fill='#A68AC4', d='M5.4,15.7c-0.1-0.1-0.2-0.1-0.4-0.1c-0.1,0-0.3,0-0.4,0.1l-1.1,1.1l0-4.3h3v4.3L5.4,15.7z') - path(fill='#834FAB', d='M6,13.1v2.6l-0.3-0.3C5.5,15.1,5.3,15,5,15c-0.3,0-0.5,0.1-0.7,0.3L4,15.6l0-2.6H6 M7,12.1H3l0,6l2-2l2,2V12.1L7,12.1z') - circle(fill='#FFFFFF', cx='12.5', cy='12.6', r='5.5') - path(fill='#FFF0F1', d='M12.5,16.6c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S14.7,16.6,12.5,16.6z') - path(fill='#F25058', d='M12.5,9.1c1.9,0,3.5,1.6,3.5,3.5s-1.6,3.5-3.5,3.5S9,14.5,9,12.6S10.6,9.1,12.5,9.1 M12.5,8.1c-2.5,0-4.5,2-4.5,4.5s2,4.5,4.5,4.5s4.5-2,4.5-4.5S15,8.1,12.5,8.1L12.5,8.1z') - rect(x='10', y='12.1', fill='#F25058', width='5', height='1') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:gray;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#ef9ca4;stroke:#f25058;stroke-linejoin:round') + path(d='M5.5,11.5V0.5H14A2.5,2.5,0,0,1,16.5,3v8.5H5.5Z', style='fill:#bbb;stroke:#888;stroke-miterlimit:10') + path(d='M1.5,13.5V3A2.5,2.5,0,0,1,4,.5H5.5v13h-4Z', style='fill:#a1a1a1;stroke:#888;stroke-miterlimit:10') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:#888;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#a68ac4;stroke:#834fab;stroke-linejoin:round') + circle(cx='13.5', cy='13.5', r='5.5', style='fill:#fff') + circle(cx='13.5', cy='13.5', r='4', style='fill:#fff0f1;stroke:#f25058;stroke-miterlimit:10') + line(x1='11', y1='13.5', x2='16', y2='13.5', style='fill:none;stroke:#f25058;stroke-miterlimit:10') symbol#icons-repository-new(viewBox='0 0 18 18') - path(fill='#B3B3B3', d='M0.6,11.6l0-8.7c0-1.3,1-2.4,2.2-2.4h10.3c1.3,0,2.4,1.1,2.4,2.5l0,7.1c-0.2,0.9-1,1.6-2,1.6H0.6z') - path(fill='#808080', d='M2.9,1L2.9,1l10.3,0C14.2,1,15,1.9,15,3l0,6.9c-0.2,0.7-0.8,1.2-1.6,1.2H1.1l0-8.2C1.1,1.8,1.9,1,2.9,1M2.9,0.1c-1.5,0-2.7,1.2-2.7,2.9l0,9.1h13.3c1.2,0,2.2-0.9,2.5-2L16,3c0-1.6-1.3-2.9-2.8-2.9L2.9,0.1C2.9,0.1,2.9,0.1,2.9,0.1L2.9,0.1z') - path(fill='#E6E6E6', d='M3.4,15.6c-1.2,0-2.9-0.7-2.9-1.7v-0.8c0-1.4,2.2-1.5,2.5-1.5h10.6c0.4,0,0.4,0,0.6,0c0.1,0,0.9,0,0.9,0l0.1,0c0.1-0.1,0.2-0.1,0.4-0.2v1.8c0,0.9-0.3,2.5-1.5,2.5H3.4z') - path(fill='#808080', d='M15.1,12v1.1c0,0.8-0.3,2.1-1.1,2.1H3.4c-1.1,0-2.4-0.6-2.4-1.3v-0.8c0-1,1.9-1,2-1h10.6c0.4,0,0.4,0,0.6,0C14.3,12,14.5,12,15.1,12L15.1,12 M16,9.7c-0.1,0.7-0.5,1.1-1,1.3c-1.2,0-0.8,0-1.4,0H3c-1.4,0-3,0.5-3,2v0.8c0,1.4,2,2.2,3.4,2.2H14c1.4,0,2-1.6,2-3V9.7L16,9.7z') - path(fill='#A68AC4', d='M5.4,15.7c-0.1-0.1-0.2-0.1-0.4-0.1c-0.1,0-0.3,0-0.4,0.1l-1.1,1.1l0-4.3h3v4.3L5.4,15.7z') - path(fill='#834FAB', d='M6,13.1v2.6l-0.3-0.3C5.5,15.1,5.3,15,5,15c-0.3,0-0.5,0.1-0.7,0.3L4,15.6l0-2.6H6 M7,12.1H3l0,6l2-2l2,2V12.1L7,12.1z') - path(fill='#999999', d='M0.6,10.5l0-7.9c0-1.1,0.8-2,1.8-2.2v10H0.6z') - path(fill='#808080', d='M2,1.1v8.9H1.1l0-7.4C1.1,2,1.5,1.4,2,1.1 M2.9,0C1.4,0,0.2,1.2,0.2,2.7l0,8.3h2.7L2.9,0C2.9,0,2.9,0,2.9,0L2.9,0z') - circle(fill='#FFFFFF', cx='12.5', cy='12.6', r='5.5') - path(fill='#EBFFEE', d='M12.5,16.6c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S14.7,16.6,12.5,16.6z') - path(fill='#3CCB5A', d='M12.5,9.1c1.9,0,3.5,1.6,3.5,3.5s-1.6,3.5-3.5,3.5S9,14.5,9,12.6S10.6,9.1,12.5,9.1 M12.5,8.1c-2.5,0-4.5,2-4.5,4.5s2,4.5,4.5,4.5s4.5-2,4.5-4.5S15,8.1,12.5,8.1L12.5,8.1z') - polygon(fill='#3CCB5A', points='15,12.1 13,12.1 13,10.1 12,10.1 12,12.1 10,12.1 10,13.1 12,13.1 12,15.1 13,15.1 13,13.1 15,13.1 ') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:gray;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#ef9ca4;stroke:#f25058;stroke-linejoin:round') + path(d='M5.5,11.5V0.5H14A2.5,2.5,0,0,1,16.5,3v8.5H5.5Z', style='fill:#bbb;stroke:#888;stroke-miterlimit:10') + path(d='M1.5,13.5V3A2.5,2.5,0,0,1,4,.5H5.5v13h-4Z', style='fill:#a1a1a1;stroke:#888;stroke-miterlimit:10') + path(d='M4,16.5a2.5,2.5,0,0,1,0-5H14a2.505,2.505,0,0,0,2.45-2H16.5V14A2.5,2.5,0,0,1,14,16.5H4Z', style='fill:#e6e6e6;stroke:#888;stroke-miterlimit:10') + polyline(points='8.5 12 8.5 17.25 7 16.25 5.5 17.25 5.5 12', style='fill:#a68ac4;stroke:#834fab;stroke-linejoin:round') + circle(cx='13.5', cy='13.5', r='5.5', style='fill:#fff') + circle(cx='13.5', cy='13.5', r='4', style='fill:#ebffee;stroke:#3ccb5a;stroke-miterlimit:10') + line(x1='11', y1='13.5', x2='16', y2='13.5', style='fill:none;stroke:#3ccb5a;stroke-miterlimit:10') + line(x1='13.5', y1='16', x2='13.5', y2='11', style='fill:none;stroke:#3ccb5a;stroke-miterlimit:10') symbol#icons-server-delete(viewBox='0 0 18 18') path(fill='#E6E6E6', d='M8,15.185c-0.129,0-0.258-0.03-0.374-0.088l-6.664-3.332C0.677,11.622,0.5,11.336,0.5,11.018v-6.35c0-0.318,0.177-0.604,0.462-0.747l6.665-3.332C7.742,0.531,7.871,0.5,8,0.5s0.258,0.031,0.374,0.088l6.665,3.332C15.323,4.063,15.5,4.35,15.5,4.667v6.35c0,0.313-0.182,0.606-0.462,0.747l-6.665,3.332C8.258,15.154,8.129,15.185,8,15.185z') path(fill='#999999', d='M8,1c0.052,0,0.104,0.012,0.15,0.035l6.665,3.332C14.929,4.425,15,4.54,15,4.668v6.35c0,0.128-0.071,0.243-0.185,0.3L8.15,14.649C8.104,14.673,8.052,14.685,8,14.685c-0.052,0-0.104-0.012-0.15-0.035l-6.665-3.332C1.071,11.26,1,11.145,1,11.017v-6.35c0-0.128,0.071-0.243,0.185-0.3L7.85,1.035C7.896,1.012,7.948,1,8,1 M8,0C7.795,0,7.591,0.047,7.403,0.141L0.738,3.473C0.286,3.7,0,4.162,0,4.668v6.35c0,0.506,0.286,0.968,0.738,1.194l6.665,3.332C7.591,15.638,7.795,15.685,8,15.685s0.409-0.047,0.597-0.141l6.665-3.332C15.714,11.985,16,11.523,16,11.017v-6.35c0-0.506-0.286-0.968-0.738-1.194L8.597,0.141C8.409,0.047,8.205,0,8,0L8,0z') From 3a8135882a081a5d129188e159a5b41008e400a3 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 16:52:56 -0700 Subject: [PATCH 528/577] 5.0.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e37535e27..50eccd2d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.7", + "version": "5.0.8", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 2e10f1bcff8d8158d9e1305caab70bbccae37638 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 22 Sep 2016 17:31:00 -0700 Subject: [PATCH 529/577] update button copy --- .../pages/newRepositorySelectionView.jade | 2 +- .../pages/templateSelectSectionView.jade | 2 +- .../branchMenuPopover/templateMenuPopoverView.jade | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade index b77e9808d..36c7ed8c0 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade @@ -98,7 +98,7 @@ ul.list.list-servers( ) button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add( ng-if = "!repo.loading" - ) Create + ) Select .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green.in( ng-if = "repo.loading" ng-include = "'spinner'" diff --git a/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade index b95be3765..74c931a8b 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/templateSelectSectionView.jade @@ -34,4 +34,4 @@ ul.list.list-servers( width = "36" ) .grid-content {{dependency.attrs.name}} - button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add Create + button.grid-content.shrink.btn.btn-sm.btn-icon.btn-add Select diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index f6ba6ba75..b1bb87287 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -111,7 +111,7 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Create + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Choose li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) @@ -139,7 +139,7 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Create + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Choose .popover-content( ng-if = "state.tab === 'nonRepo'" ng-init = "state.servicesLoaded = null" @@ -173,7 +173,7 @@ .grid-content Cassandra button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!state.loading" - ) Create + ) Choose .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "state.loading" ng-include = "'spinner'" @@ -187,7 +187,7 @@ width = "24" ) .grid-content Consul-Server - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Create + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Choose li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) @@ -197,4 +197,4 @@ width = "24" ) .grid-content ElasticSearch - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Create + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Choose From 7436db5917bab1734171894425f5cd9228088128 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 22 Sep 2016 17:36:33 -0700 Subject: [PATCH 530/577] remove unused styles --- .../assets/styles/scss/layout/instance.scss | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/client/assets/styles/scss/layout/instance.scss b/client/assets/styles/scss/layout/instance.scss index 33bc08726..1d1092c09 100644 --- a/client/assets/styles/scss/layout/instance.scss +++ b/client/assets/styles/scss/layout/instance.scss @@ -2,28 +2,8 @@ .instance-wrapper { height: 100vh; overflow: hidden; - overflow-x: auto; position: relative; - &.empty { - background-color: $gray-lightest; - background-image: url(/build/images/confetti.png); - flex-direction: row; - - > .instance { - min-width: 600px; - } - - .instance-header { - background: transparent; - flex: 0 0 60px; - } - } - - > .instance-wrapper { - min-width: 600px; - } - > .spinner-wrapper { .modal-open & { From f8db48b4fa4614c49a5c809013786d42bcc97add Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 17:49:42 -0700 Subject: [PATCH 531/577] move override styles to override files --- .../styles/scss/components/buttons/buttons.scss | 11 ----------- .../styles/scss/modals/modals-server-select.scss | 5 +++++ .../styles/scss/popover/popover-branch-menu.scss | 5 +++++ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/client/assets/styles/scss/components/buttons/buttons.scss b/client/assets/styles/scss/components/buttons/buttons.scss index a15f9de09..c254c8d7c 100755 --- a/client/assets/styles/scss/components/buttons/buttons.scss +++ b/client/assets/styles/scss/components/buttons/buttons.scss @@ -541,15 +541,4 @@ border-color: $green; color: $white; } - - .popover-branch-menu &, - .popover-template-menu & { - padding: 0 6px; - width: auto; - } - - .modal-server-select & { - padding: 0 9px; - width: auto; - } } diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index 78aae7a6e..fedc82da3 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -127,6 +127,11 @@ font-size: 18px; height: 60px; } + + .modal-server-select & { + padding: 0 9px; + width: auto; + } } // repository/template list diff --git a/client/assets/styles/scss/popover/popover-branch-menu.scss b/client/assets/styles/scss/popover/popover-branch-menu.scss index 05942a742..1ed58dce3 100644 --- a/client/assets/styles/scss/popover/popover-branch-menu.scss +++ b/client/assets/styles/scss/popover/popover-branch-menu.scss @@ -38,6 +38,11 @@ padding: 4px; } } + + .btn-add { + padding: 0 6px; + width: auto; + } } .popover-branch-menu { From 5d849b7aa43b0dcda7a2f3d25aad062fb294c3c2 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 17:50:25 -0700 Subject: [PATCH 532/577] Choose -> Select --- .../branchMenuPopover/templateMenuPopoverView.jade | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index b1bb87287..74e56dc68 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -111,7 +111,7 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Choose + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Select li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) @@ -139,7 +139,7 @@ ng-if = "!$root.featureFlags.inviteFlows" ) Updated 3 days ago - button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Choose + button.grid-block.shrink.btn.btn-xs.btn-icon.btn-add Select .popover-content( ng-if = "state.tab === 'nonRepo'" ng-init = "state.servicesLoaded = null" @@ -173,7 +173,7 @@ .grid-content Cassandra button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!state.loading" - ) Choose + ) Select .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "state.loading" ng-include = "'spinner'" @@ -187,7 +187,7 @@ width = "24" ) .grid-content Consul-Server - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Choose + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Select li.grid-block.align-center.list-item.popover-list-item.multi-line( ng-class = "{'disabled': state.loading}" ) @@ -197,4 +197,4 @@ width = "24" ) .grid-content ElasticSearch - button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Choose + button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add Select From e1bbfe4e0c15f4d7832247a7b03786f2213013ad Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 17:53:44 -0700 Subject: [PATCH 533/577] missed one --- .../instance/branchMenuPopover/templateMenuPopoverView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade index 74e56dc68..aed80d6ef 100644 --- a/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/templateMenuPopoverView.jade @@ -79,7 +79,7 @@ button.grid-content.shrink.btn.btn-xs.btn-icon.btn-add( ng-if = "!state.loading" - ) Create + ) Select .grid-content.shrink.spinner-wrapper.spinner-sm.spinner-green( ng-if = "state.loading" ng-include = "'spinner'" From 899590ce72b7539c4a8f9f27061986c27a7a68ea Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Thu, 22 Sep 2016 17:53:51 -0700 Subject: [PATCH 534/577] fix use of wrong class --- client/assets/styles/scss/modals/modals-server-select.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/modals/modals-server-select.scss b/client/assets/styles/scss/modals/modals-server-select.scss index fedc82da3..25e530c98 100644 --- a/client/assets/styles/scss/modals/modals-server-select.scss +++ b/client/assets/styles/scss/modals/modals-server-select.scss @@ -128,7 +128,7 @@ height: 60px; } - .modal-server-select & { + .btn-add { padding: 0 9px; width: auto; } From 23676178a567d86d8d50b05f72238de374430350 Mon Sep 17 00:00:00 2001 From: runnabro Date: Thu, 22 Sep 2016 18:10:20 -0700 Subject: [PATCH 535/577] add tracking when aha starts --- .../components/ahaGuide/AhaGuideController.js | 6 +++++- client/services/serviceEventTracking.js | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 3151c5a45..d6a3e5c2c 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -11,6 +11,7 @@ function AhaGuideController( ahaGuide, currentOrg, errs, + eventTracking, fetchInstancesByPod, keypather, patchOrgMetadata @@ -201,7 +202,10 @@ function AhaGuideController( function mixpanelEvent () { console.log($state); - /* if $state.current.templateUrul === 'environmentView' + if ($state.current.templateUrl === 'environmentView') { + eventTracking.startMilestone2($state); + } + /* if $state.current.templateUrl === 'environmentView' if $state.current.state === 'base.config' if $state.current.controller === 'EnvironmentController' */ diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 6e9b18e87..9df6d25b1 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -417,3 +417,16 @@ EventTracking.prototype.waitingForInfrastructure = function (orgName) { return self; }; +/** + * Track start of milestone 2 + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.startMilestone2 = function () { + var self = this; + var eventName = 'Visited template page and started milestone 2'; + + self._mixpanel('track', eventName); + return self; +}; From 2c3c0cd7627c96d2e057fcdd8c8dcf2bef50fdc5 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 18:41:40 -0700 Subject: [PATCH 536/577] PR comments --- .../controllers/ahaGuideController.unit.js | 118 +++++++++--------- test/unit/services/ahaGuideService.unit.js | 79 ++++++------ 2 files changed, 96 insertions(+), 101 deletions(-) diff --git a/test/unit/controllers/ahaGuideController.unit.js b/test/unit/controllers/ahaGuideController.unit.js index 3b11e7d1b..ed8efbf79 100644 --- a/test/unit/controllers/ahaGuideController.unit.js +++ b/test/unit/controllers/ahaGuideController.unit.js @@ -5,6 +5,10 @@ var $rootScope; var $scope; var $window; var keypather; +var fakeOrgs; +var fetchInstancesByPodMock; +var getCurrentStepStub; +var isAddingFirstRepoStub; var mockCurrentOrg; var isRunnabotPartOfOrgStub; var mockAhaGuideMethods; @@ -13,7 +17,6 @@ var eventStatus; var apiMocks = require('../apiMocks/index'); describe('ahaGuideController'.bold.underline.blue, function () { - var ctx = {}; var AGC; var mockSteps = { CHOOSE_ORGANIZATION: 1, @@ -23,45 +26,15 @@ describe('ahaGuideController'.bold.underline.blue, function () { COMPLETED: -1 }; + getCurrentStepStub = sinon.stub(); + isAddingFirstRepoStub = sinon.stub(); + function createMasterPods() { - ctx.masterPods = runnable.newInstances( + var masterPods = runnable.newInstances( [apiMocks.instances.building, apiMocks.instances.runningWithContainers[0]], {noStore: true} ); - return ctx.masterPods; - } - - mockAhaGuideMethods = { - endGuide: sinon.stub(), - getCurrentStep: sinon.stub(), - hasConfirmedSetup: sinon.stub(), - hasRunnabot: sinon.stub(), - isInGuide: sinon.stub(), - furthestSubstep: sinon.stub(), - isChoosingOrg: sinon.stub(), - isAddingFirstRepo: sinon.stub(), - isAddingFirstBranch: sinon.stub(), - steps: mockSteps, - stepList: { - 2: { - title: 'Step 2: Add a Repository', - subSteps: { - addRepository: { - step: 0 - }, - containerSelection: { - step: 1 - }, - logs: { - step: 7 - } - }, - buildStatus: { - starting: 'We‘re building! Build time varies depending on your build commands.', - crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' - } - } - }, + return masterPods; } function setup() { @@ -77,29 +50,58 @@ describe('ahaGuideController'.bold.underline.blue, function () { } } }; - - ctx = {}; - ctx.fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); - angular.mock.module('app'); - ctx.fakeOrg1 = { - attrs: angular.copy(apiMocks.user), - oauthName: function () { - return 'org1'; - } - }; - ctx.fakeOrg2 = { - attrs: angular.copy(apiMocks.user), - oauthName: function () { - return 'org2'; - } + mockAhaGuideMethods = { + endGuide: sinon.stub(), + getCurrentStep: getCurrentStepStub, + hasConfirmedSetup: sinon.stub(), + hasRunnabot: sinon.stub(), + isInGuide: sinon.stub(), + furthestSubstep: sinon.stub(), + isChoosingOrg: sinon.stub(), + isAddingFirstRepo: isAddingFirstRepoStub, + isAddingFirstBranch: sinon.stub(), + steps: mockSteps, + stepList: { + 2: { + title: 'Step 2: Add a Repository', + subSteps: { + addRepository: { + step: 0 + }, + containerSelection: { + step: 1 + }, + logs: { + step: 7 + } + }, + buildStatus: { + starting: 'We‘re building! Build time varies depending on your build commands.', + crashed: 'Your template isn‘t running yet! Check the logs to debug any issues. If you‘re stumped, ask our engineers!' + } + } + }, }; - ctx.fakeOrgs = {models: [ctx.fakeOrg1, ctx.fakeOrg2]}; - ctx.stateParams = { - userName: 'username', - instanceName: 'instancename' + fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); + angular.mock.module('app'); + fakeOrgs = { + models: [ + { + attrs: angular.copy(apiMocks.user), + oauthName: function () { + return 'org1'; + } + }, + { + attrs: angular.copy(apiMocks.user), + oauthName: function () { + return 'org2'; + } + } + ] }; angular.mock.module('app', function ($provide) { - $provide.factory('fetchInstancesByPod', ctx.fetchInstancesByPodMock.autoTrigger(createMasterPods())); + $provide.factory('fetchInstancesByPod', fetchInstancesByPodMock.autoTrigger(createMasterPods())); $provide.factory('isRunnabotPartOfOrg', function ($q) { isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); return isRunnabotPartOfOrgStub; @@ -135,8 +137,8 @@ describe('ahaGuideController'.bold.underline.blue, function () { describe('managing steps and substeps for milestone 2', function() { beforeEach(function() { - mockAhaGuideMethods.getCurrentStep.returns(2); - mockAhaGuideMethods.isAddingFirstRepo.returns(true); + getCurrentStepStub.returns(2); + isAddingFirstRepoStub.returns(true); setup(); $scope.$on('ahaGuideEvent', function(event, status) { eventStatus = status; diff --git a/test/unit/services/ahaGuideService.unit.js b/test/unit/services/ahaGuideService.unit.js index 7928184ce..6e2f147eb 100644 --- a/test/unit/services/ahaGuideService.unit.js +++ b/test/unit/services/ahaGuideService.unit.js @@ -11,48 +11,12 @@ var mockInstance; var fetchInstancesByPodMock = new (require('../fixtures/mockFetch'))(); describe('ahaGuide'.bold.underline.blue, function () { - var ctx; var ahaGuide; - mockInstance = { - models: [{ - attrs: { - name: 'instance', - hasAddedBranches: true - } - }, { - attrs: { - name: 'instance2' - } - }, { - attrs: { - name: 'instance2-copy' - } - }, { - attrs: { - name: 'instance2-copy2' - } - }] - }; - function setOrg () { - mockOrg = { - poppa: { - id: sinon.stub().returns(101), - attrs: { - hasPaymentMethod: false, - metadata: { - hasAha: true, - hasConfirmedSetup: false - } - } - } - }; - } - setOrg(); function initState () { angular.mock.module('app'); angular.mock.module(function($provide) { $provide.value('currentOrg', mockOrg); - $provide.factory('fetchInstancesByPod', fetchInstancesByPodMock.fetch()); + $provide.factory('fetchInstancesByPod', fetchInstancesByPodMock.fetch()); $provide.factory('isRunnabotPartOfOrg', function ($q) { isRunnabotPartOfOrgStub = sinon.stub().returns($q.when(false)); return isRunnabotPartOfOrgStub; @@ -75,15 +39,44 @@ describe('ahaGuide'.bold.underline.blue, function () { aha: true }; } - - beforeEach(initState); + beforeEach(function() { + mockOrg = { + poppa:{ + id: sinon.stub().returns(101), + attrs: { + metadata: { + hasAha:true, + hasConfirmedSetup:false + } + } + } + }; + mockInstance = { + models: [{ + attrs: { + name: 'instance', + hasAddedBranches: true + } + }, { + attrs: { + name: 'instance2' + } + }, { + attrs: { + name: 'instance2-copy' + } + }, { + attrs: { + name: 'instance2-copy2' + } + }] + }; + initState(); + }); describe('returning the org\'s aha progress', function () { - beforeEach(function() { + afterEach(function() { mockOrg.poppa.attrs.metadata.hasAha = true; mockOrg.poppa.attrs.metadata.hasConfirmedSetup = false; - }); - afterEach(function() { - setOrg(); }) it('should return true when the user\'s aha property is active', function () { var userInGuide = ahaGuide.isInGuide(); From 11a39b715ed8ad8f63ccc25e83d31186f42ef82b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Thu, 22 Sep 2016 18:46:00 -0700 Subject: [PATCH 537/577] Fixed missing ellipsis button in staticAddRepo modal --- client/directives/components/ahaGuide/ahaGuideView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/components/ahaGuide/ahaGuideView.jade b/client/directives/components/ahaGuide/ahaGuideView.jade index f4d29b9a7..d5d27a181 100644 --- a/client/directives/components/ahaGuide/ahaGuideView.jade +++ b/client/directives/components/ahaGuide/ahaGuideView.jade @@ -25,7 +25,7 @@ button.btn.btn-xs.white.btn-menu( ng-class = "{'active': ahaMenuGuidePopover.data.show}" - ng-if = "AGC.isInGuide() && !AGC.ahaGuide.isChoosingOrg()" + ng-if = "(AGC.isInGuide() && !AGC.ahaGuide.isChoosingOrg()) || staticAddRepo" pop-over pop-over-actions = "AGC ? AGC.popoverActions : EC.actions" pop-over-active = "ahaMenuGuidePopover.data.show" From 0d5132868b5d063354cff7d440824da8e390ea2e Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 23 Sep 2016 09:56:07 -0700 Subject: [PATCH 538/577] 5.0.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 50eccd2d0..8daecafe2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.8", + "version": "5.0.9", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 4de1d3d17dafd7cdbc5a8c2d3373e079294a3143 Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Fri, 23 Sep 2016 10:35:52 -0700 Subject: [PATCH 539/577] fix typo --- .../modalSetupServer/pages/newRepositorySelectionView.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade index 36c7ed8c0..c23eee241 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade @@ -30,7 +30,7 @@ ) .p.empty .h3.strong Uh oh! - | We couldn’t find any repositories for this organization. If you think you think this is a mistake, + | We couldn’t find any repositories for this organization. If you think this is a mistake, a.link( intercom-link intro-message = "This thing wont fetch my GitHub repos." From a555e7affe69e23ea77505e4aec07cfc74b4096e Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 23 Sep 2016 11:25:14 -0700 Subject: [PATCH 540/577] add milestone 2 tracking --- .../components/ahaGuide/AhaGuideController.js | 28 ++++---- client/services/serviceEventTracking.js | 64 ++++++++++++++++++- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index f8a65bb64..c87af87d0 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -18,7 +18,6 @@ function AhaGuideController( ) { var AGC = this; var animatedPanelListener = angular.noop; - mixpanelEvent(); // dismiss add service popover if open $rootScope.$broadcast('showAddServicesPopover', false); @@ -119,6 +118,22 @@ function AhaGuideController( AGC.className = currentMilestone.subSteps[status].className; AGC.subStepIndex = currentMilestone.subSteps[status].step; ahaGuide.furthestSubstep(ahaGuide.steps.ADD_FIRST_REPO, status); + + // tracking + switch (AGC.subStep) { + case 'containerSelection': + eventTracking.milestone2SelectTemplate(); + break; + case 'repository': + eventTracking.milestone2VerifyRepositoryTab(); + break; + case 'commands': + eventTracking.milestone2VerifyCommandsTab(); + break; + case 'success': + eventTracking.milestone2BuildSuccess(); + break; + } } function handleBuildUpdate(update) { @@ -200,15 +215,4 @@ function AhaGuideController( $rootScope.$broadcast('showAhaSidebar'); } }; - - function mixpanelEvent () { - console.log($state); - if ($state.current.templateUrl === 'environmentView') { - eventTracking.startMilestone2($state); - } - /* if $state.current.templateUrl === 'environmentView' - if $state.current.state === 'base.config' - if $state.current.controller === 'EnvironmentController' - */ - } } diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 9df6d25b1..026af6421 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -418,14 +418,72 @@ EventTracking.prototype.waitingForInfrastructure = function (orgName) { }; /** - * Track start of milestone 2 + * Milestone 2: Select repository * Reports to: * - mixpanel * @return this */ -EventTracking.prototype.startMilestone2 = function () { +EventTracking.prototype.milestone2SelectTemplate = function () { var self = this; - var eventName = 'Visited template page and started milestone 2'; + var eventName = 'Milestone 2: Select template'; + + self._mixpanel('track', eventName); + return self; +}; + +/** + * Milestone 2: Verify repository tab + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.milestone2VerifyRepositoryTab = function () { + var self = this; + var eventName = 'Milestone 2: Verify repository tab'; + + self._mixpanel('track', eventName); + return self; +}; + +/** + * Milestone 2: Verify commands tab + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.milestone2VerifyCommandsTab = function () { + var self = this; + var eventName = 'Milestone 2: Verify commands tab'; + + self._mixpanel('track', eventName); + return self; +}; + +/** + * Milestone 2: Trigger build + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.milestone2TriggerBuild = function (templateCount) { + var self = this; + var eventName = 'Milestone 2: Trigger build'; + + self._mixpanel('track', eventName, { + templateCount: templateCount + }); + return self; +}; + +/** + * Milestone 2: Container popover + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.milestone2BuildSuccess = function () { + var self = this; + var eventName = 'Milestone 2: Build success message (in modal)'; self._mixpanel('track', eventName); return self; From 8ef8a6fee7f6f5b212bacea7098ad545b7eb1990 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 23 Sep 2016 11:29:42 -0700 Subject: [PATCH 541/577] remove unused function --- client/services/serviceEventTracking.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 026af6421..b9c915ba9 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -459,22 +459,6 @@ EventTracking.prototype.milestone2VerifyCommandsTab = function () { return self; }; -/** - * Milestone 2: Trigger build - * Reports to: - * - mixpanel - * @return this - */ -EventTracking.prototype.milestone2TriggerBuild = function (templateCount) { - var self = this; - var eventName = 'Milestone 2: Trigger build'; - - self._mixpanel('track', eventName, { - templateCount: templateCount - }); - return self; -}; - /** * Milestone 2: Container popover * Reports to: From 308abe3b967fe1438c0d1c75686d0ee22a17bd10 Mon Sep 17 00:00:00 2001 From: Sundip Patel Date: Fri, 23 Sep 2016 13:39:11 -0700 Subject: [PATCH 542/577] Segment: force page call. needed before track calls. --- layout.jade | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/layout.jade b/layout.jade index 15d9e12c3..7d69f22f2 100644 --- a/layout.jade +++ b/layout.jade @@ -48,11 +48,12 @@ html( script. !function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","page","once","off","on"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t Date: Fri, 23 Sep 2016 13:41:16 -0700 Subject: [PATCH 543/577] shouldnt need this anymore --- layout.jade | 1 - 1 file changed, 1 deletion(-) diff --git a/layout.jade b/layout.jade index 7d69f22f2..e85706b3b 100644 --- a/layout.jade +++ b/layout.jade @@ -53,7 +53,6 @@ html( analytics.ready(function () { ga('require', 'linker'); ga('linker:autoLink', ['runnable.com', 'runnable.io']); - analytics.track('Logged in'); }); if env !== 'development' From 841622c33371675b1d178bfd13a7678b3588c68e Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 23 Sep 2016 14:40:20 -0700 Subject: [PATCH 544/577] Just ignore it. It's useless --- client/services/serviceHandleErr.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/services/serviceHandleErr.js b/client/services/serviceHandleErr.js index def9fa892..a4ba0e8eb 100644 --- a/client/services/serviceHandleErr.js +++ b/client/services/serviceHandleErr.js @@ -24,6 +24,10 @@ function errs ( $window.location = configAPIHost + '/auth/github?redirect=' + $window.location.protocol + '//' + $window.location.host + '/?auth'; return false; } + if (err.message === 'collection requires a client') { + // Fuck this error + return false; + } if (~noDisplayCodes.indexOf(keypather.get(err, 'data.statusCode'))) { return false; } return true; From 51331609bb9ffeb1e44d45f646eedfef039f26d8 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 23 Sep 2016 14:47:02 -0700 Subject: [PATCH 545/577] 5.0.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8daecafe2..2718c2db8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.9", + "version": "5.0.10", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 821e3f04142ab6208582ae41a233380cfa70f84f Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 23 Sep 2016 15:07:35 -0700 Subject: [PATCH 546/577] use pushed_at instead of updated_at --- .../modalSetupServer/pages/newRepositorySelectionView.jade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade index c23eee241..1e0d0a131 100644 --- a/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade +++ b/client/directives/environment/modals/modalSetupServer/pages/newRepositorySelectionView.jade @@ -57,7 +57,7 @@ ul.list.list-servers( ng-repeat = "\ repo in MC.githubRepos.models | \ repos: MC.repoFilter | \ - orderBy: '-attrs.updated_at' as noResults\ + orderBy: '-attrs.pushed_at' as noResults\ " ng-class = "{ \ 'active': repo.loading, \ @@ -81,10 +81,10 @@ ul.list.list-servers( ) span.small( ng-if = "$root.featureFlags.inviteFlows" - ) {{repo.attrs.updated_at | timeFrom}} + ) {{repo.attrs.pushed_at | timeFrom}} small.small( ng-if = "!$root.featureFlags.inviteFlows" - ) {{repo.attrs.updated_at | timeFrom}} + ) {{repo.attrs.pushed_at | timeFrom}} svg.iconnables.icons-server( ng-if = "$root.featureFlags.multipleRepositoryContainers" pop-over From 8f20e7c426f72b2c2126e30dbbad079c6a3765c6 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Fri, 23 Sep 2016 15:10:08 -0700 Subject: [PATCH 547/577] do it in this one, too --- .../views/viewPopoverFilesRepositorySelect.jade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade b/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade index 79e0edff2..a68136a3d 100644 --- a/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade +++ b/client/directives/repositorySelector/views/viewPopoverFilesRepositorySelect.jade @@ -46,7 +46,7 @@ repo in repoSelector.data.githubRepos.models | \ repos: repoSelector.data.repoFilter | \ allBut: data.appCodeVersions | \ - orderBy: '-attrs.updated_at'\ + orderBy: '-attrs.pushed_at'\ " ) .grid-content.text-overflow( @@ -63,12 +63,12 @@ ) span.small( ng-if = "$root.featureFlags.inviteFlows" - ) —{{repo.attrs.updated_at | timeFrom}} + ) —{{repo.attrs.pushed_at | timeFrom}} //- else small.small( ng-if = "!$root.featureFlags.inviteFlows" - ) Updated {{ repo.attrs.updated_at | timeFrom }} + ) Updated {{ repo.attrs.pushed_at | timeFrom }} svg.grid-content.shrink.iconnables.icons-arrow-down( ng-if = "!repo.loading" From 9d232b856b813c0f67d9f3f282a87f2fa7266323 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 23 Sep 2016 15:11:44 -0700 Subject: [PATCH 548/577] Added deep checking for dockerfiles and accompanying tests. Added polyfill for string repeat prototype method --- client/polyfills/repeat.js | 50 ++++++ client/services/serviceFetchDockerfile.js | 12 +- .../services/serviceFetchDockerfile.unit.js | 160 ++++++++++++++++++ 3 files changed, 218 insertions(+), 4 deletions(-) create mode 100644 client/polyfills/repeat.js diff --git a/client/polyfills/repeat.js b/client/polyfills/repeat.js new file mode 100644 index 000000000..fdaa603ad --- /dev/null +++ b/client/polyfills/repeat.js @@ -0,0 +1,50 @@ +'use strict'; + +if (!String.prototype.repeat) { + Object.defineProperty(String.prototype, 'repeat', { + enumerable: false, + configurable: true, + writable: true, + value: function(count) { + 'use strict'; + if (this == null) { + throw new TypeError('can\'t convert ' + this + ' to object'); + } + var str = '' + this; + count = +count; + if (count != count) { + count = 0; + } + if (count < 0) { + throw new RangeError('repeat count must be non-negative'); + } + if (count == Infinity) { + throw new RangeError('repeat count must be less than infinity'); + } + count = Math.floor(count); + if (str.length == 0 || count == 0) { + return ''; + } + // Ensuring count is a 31-bit integer allows us to heavily optimize the + // main part. But anyway, most current (August 2014) browsers can't handle + // strings 1 << 28 chars or longer, so: + if (str.length * count >= 1 << 28) { + throw new RangeError('repeat count must not overflow maximum string size'); + } + var rpt = ''; + for (;;) { + if ((count & 1) == 1) { + rpt += str; + } + count >>>= 1; + if (count == 0) { + break; + } + str += str; + } + // Could we try: + // return Array(count + 1).join(this); + return rpt; + } + }); +} diff --git a/client/services/serviceFetchDockerfile.js b/client/services/serviceFetchDockerfile.js index 1792ae9c0..63f4bbc7b 100644 --- a/client/services/serviceFetchDockerfile.js +++ b/client/services/serviceFetchDockerfile.js @@ -56,6 +56,7 @@ function doesDockerfileExist() { } function fetchDockerfileForContextVersion ( + $q, base64, doesDockerfileExist, fetchCommitsForFile, @@ -71,13 +72,16 @@ function fetchDockerfileForContextVersion ( if (buildDockerfilePath && repoFullName) { var branchName = keypather.get(acv, 'attrs.branch'); // Get everything before the last '/' and add a '/' at the end - var result = /^(\/?[^\/]*)\/([^\/]*)$/.exec(buildDockerfilePath); - if (result.length < 3) { + var nestedDirs = Math.max(buildDockerfilePath.split('/').length - 2, 1); + var nestedPathRegex = '\\/([^\\/]*)'.repeat(nestedDirs); + var dockerfileRegex = new RegExp('^(\\/?[^\\/]*)' + nestedPathRegex + '$'); + var result = dockerfileRegex.exec(buildDockerfilePath); + if (keypather.get(result, 'length') < 3) { throw new Error('BuilddockerfilePath is invalid'); } - var path = result && result[1] || ''; + var name = result && result.pop() || ''; + var path = result && result.slice(1).join('/') || ''; // Get everything after the last '/' - var name = result && result[2] || ''; return fetchRepoDockerfile(repoFullName, branchName, buildDockerfilePath) .then(doesDockerfileExist) .then(function (dockerfile) { diff --git a/test/unit/services/serviceFetchDockerfile.unit.js b/test/unit/services/serviceFetchDockerfile.unit.js index 34bd97c15..c7e85b4d3 100644 --- a/test/unit/services/serviceFetchDockerfile.unit.js +++ b/test/unit/services/serviceFetchDockerfile.unit.js @@ -12,6 +12,11 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { var res; var $rootScope; var $q; + var base64Mock; + var promisifyMock; + var keypather; + var moment; + var configAPIHost = 'http://api.runnable.io'; var $httpStub; var httpFactory = function ($q) { @@ -184,6 +189,161 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { }); }); + describe('fetchDockerfileForContextVersion', function($q) { + var doesDockerfileExistStub; + var fetchDockerfileForContextVersion; + var fetchRepoDockerfileStub; + var fetchCommitsForFileStub; + var dockerfileMock = { + content: 'this is a dockerfile', + sha: 'L337' + } + var base64Mock = function () { + return { + decode: sinon.stub().returns('hello henry') + } + }; + var contextVersionMock; + beforeEach(function() { + angular.mock.module('app'); + angular.mock.module(function ($provide) { + $provide.factory('doesDockerfileExist', function ($q) { + doesDockerfileExistStub = sinon.stub().returns($q.when(dockerfileMock)); + return doesDockerfileExistStub; + }); + $provide.factory('base64', base64Mock); + $provide.factory('promisify', function ($q) { + promisifyMock = sinon.spy(function (obj, key) { + return function () { + return $q.when(obj[key].apply(obj, arguments)); + }; + }); + return promisifyMock; + }); + $provide.factory('base64', base64Mock); + $provide.factory('fetchRepoDockerfile', function ($q) { + fetchRepoDockerfileStub = sinon.stub().returns($q.when(dockerfileMock)); + return fetchRepoDockerfileStub; + }); + $provide.factory('fetchCommitsForFile', function ($q) { + fetchCommitsForFileStub = sinon.stub().returns($q.when([ + { + commit: { + committer: { + date: '2016-08-18T23:11:41Z' + } + } + } + ])); + return fetchCommitsForFileStub; + }); + }); + angular.mock.inject(function ( + _$rootScope_, + _fetchDockerfileForContextVersion_, + _keypather_, + _moment_ + ) { + $rootScope = _$rootScope_; + fetchDockerfileForContextVersion = _fetchDockerfileForContextVersion_; + keypather = _keypather_; + moment = _moment_; + }); + contextVersionMock = { + attrs: { + buildDockerfilePath: '/Dockerfile' + }, + getMainAppCodeVersion: sinon.stub().returns({ + attrs: { + repo: 'testRepo', + branch: 'testBranch' + } + }), + fetchFile: sinon.stub().returns(function () {return true}), + newFile: sinon.stub().returns(true) + }; + }); + it('should not throw any errors for a typical dockerfile path', function () { + fetchDockerfileForContextVersion(contextVersionMock); + $rootScope.$digest(); + sinon.assert.calledOnce(fetchRepoDockerfileStub); + sinon.assert.calledWithExactly(fetchRepoDockerfileStub, 'testRepo', 'testBranch', '/Dockerfile'); + sinon.assert.calledOnce(doesDockerfileExistStub); + sinon.assert.calledOnce(fetchCommitsForFileStub); + sinon.assert.calledWithExactly(fetchCommitsForFileStub, 'testRepo', 'testBranch', '/Dockerfile'); + sinon.assert.calledOnce(contextVersionMock.newFile); + sinon.assert.calledWith(contextVersionMock.newFile, { + _id: dockerfileMock.sha, + id: dockerfileMock.sha, + body: 'hello henry', + isRemoteCopy: true, + name: 'Dockerfile', + path: '/', + lastUpdated: 'a month ago' + }) + }); + it('should not throw any errors for a dockerfile one directory deep', function () { + contextVersionMock.attrs.buildDockerfilePath = '/one/Dockerfile' + fetchDockerfileForContextVersion(contextVersionMock); + $rootScope.$digest(); + sinon.assert.calledOnce(fetchRepoDockerfileStub); + sinon.assert.calledWithExactly(fetchRepoDockerfileStub, 'testRepo', 'testBranch', '/one/Dockerfile'); + sinon.assert.calledOnce(doesDockerfileExistStub); + sinon.assert.calledOnce(fetchCommitsForFileStub); + sinon.assert.calledWithExactly(fetchCommitsForFileStub, 'testRepo', 'testBranch', '/one/Dockerfile'); + sinon.assert.calledOnce(contextVersionMock.newFile); + sinon.assert.calledWith(contextVersionMock.newFile, { + _id: dockerfileMock.sha, + id: dockerfileMock.sha, + body: 'hello henry', + isRemoteCopy: true, + name: 'Dockerfile', + path: '/one/', + lastUpdated: 'a month ago' + }) + }); + it('should not throw any errors for a dockerfile two directories deep', function () { + contextVersionMock.attrs.buildDockerfilePath = '/one/two/Dockerfile' + fetchDockerfileForContextVersion(contextVersionMock); + $rootScope.$digest(); + sinon.assert.calledOnce(fetchRepoDockerfileStub); + sinon.assert.calledWithExactly(fetchRepoDockerfileStub, 'testRepo', 'testBranch', '/one/two/Dockerfile'); + sinon.assert.calledOnce(doesDockerfileExistStub); + sinon.assert.calledOnce(fetchCommitsForFileStub); + sinon.assert.calledWithExactly(fetchCommitsForFileStub, 'testRepo', 'testBranch', '/one/two/Dockerfile'); + sinon.assert.calledOnce(contextVersionMock.newFile); + sinon.assert.calledWith(contextVersionMock.newFile, { + _id: dockerfileMock.sha, + id: dockerfileMock.sha, + body: 'hello henry', + isRemoteCopy: true, + name: 'Dockerfile', + path: '/one/two/', + lastUpdated: 'a month ago' + }) + }); + it('should not throw any errors for a dockerfile three directories deep', function () { + contextVersionMock.attrs.buildDockerfilePath = '/one/two/three/Dockerfile' + fetchDockerfileForContextVersion(contextVersionMock); + $rootScope.$digest(); + sinon.assert.calledOnce(fetchRepoDockerfileStub); + sinon.assert.calledWithExactly(fetchRepoDockerfileStub, 'testRepo', 'testBranch', '/one/two/three/Dockerfile'); + sinon.assert.calledOnce(doesDockerfileExistStub); + sinon.assert.calledOnce(fetchCommitsForFileStub); + sinon.assert.calledWithExactly(fetchCommitsForFileStub, 'testRepo', 'testBranch', '/one/two/three/Dockerfile'); + sinon.assert.calledOnce(contextVersionMock.newFile); + sinon.assert.calledWith(contextVersionMock.newFile, { + _id: dockerfileMock.sha, + id: dockerfileMock.sha, + body: 'hello henry', + isRemoteCopy: true, + name: 'Dockerfile', + path: '/one/two/three/', + lastUpdated: 'a month ago' + }) + }); + }); + describe('fetchCommitsForFile', function () { var fetchCommitsForFile; beforeEach(function () { From e3d25f84fcbb5435e132c4bbe144d1176c45cf62 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 23 Sep 2016 15:49:33 -0700 Subject: [PATCH 549/577] PR comments, better solution, fixed all issues --- client/polyfills/repeat.js | 78 +++++++++++------------ client/services/serviceFetchDockerfile.js | 9 +-- 2 files changed, 39 insertions(+), 48 deletions(-) diff --git a/client/polyfills/repeat.js b/client/polyfills/repeat.js index fdaa603ad..fc2d6239d 100644 --- a/client/polyfills/repeat.js +++ b/client/polyfills/repeat.js @@ -1,50 +1,44 @@ 'use strict'; if (!String.prototype.repeat) { - Object.defineProperty(String.prototype, 'repeat', { + Object.defineProperty(String.prototype, 'repeat', { enumerable: false, configurable: true, writable: true, value: function(count) { - 'use strict'; - if (this == null) { - throw new TypeError('can\'t convert ' + this + ' to object'); - } - var str = '' + this; - count = +count; - if (count != count) { - count = 0; - } - if (count < 0) { - throw new RangeError('repeat count must be non-negative'); - } - if (count == Infinity) { - throw new RangeError('repeat count must be less than infinity'); - } - count = Math.floor(count); - if (str.length == 0 || count == 0) { - return ''; - } - // Ensuring count is a 31-bit integer allows us to heavily optimize the - // main part. But anyway, most current (August 2014) browsers can't handle - // strings 1 << 28 chars or longer, so: - if (str.length * count >= 1 << 28) { - throw new RangeError('repeat count must not overflow maximum string size'); - } - var rpt = ''; - for (;;) { - if ((count & 1) == 1) { - rpt += str; - } - count >>>= 1; - if (count == 0) { - break; - } - str += str; - } - // Could we try: - // return Array(count + 1).join(this); - return rpt; - } - }); + if (this === null) { + throw new TypeError('can\'t convert ' + this + ' to object'); + } + var str = '' + this; + count = +count; + if (count !== count) { + count = 0; + } + if (count < 0) { + throw new RangeError('repeat count must be non-negative'); + } + if (count === Infinity) { + throw new RangeError('repeat count must be less than infinity'); + } + count = Math.floor(count); + if (str.length === 0 || count === 0) { + return ''; + } + if (str.length * count >= 1 << 28) { + throw new RangeError('repeat count must not overflow maximum string size'); + } + var rpt = ''; + for (;;) { + if ((count & 1) === 1) { + rpt += str; + } + count >>>= 1; + if (count === 0) { + break; + } + str += str; + } + return rpt; + } + }); } diff --git a/client/services/serviceFetchDockerfile.js b/client/services/serviceFetchDockerfile.js index 63f4bbc7b..b6ec423ac 100644 --- a/client/services/serviceFetchDockerfile.js +++ b/client/services/serviceFetchDockerfile.js @@ -72,15 +72,12 @@ function fetchDockerfileForContextVersion ( if (buildDockerfilePath && repoFullName) { var branchName = keypather.get(acv, 'attrs.branch'); // Get everything before the last '/' and add a '/' at the end - var nestedDirs = Math.max(buildDockerfilePath.split('/').length - 2, 1); - var nestedPathRegex = '\\/([^\\/]*)'.repeat(nestedDirs); - var dockerfileRegex = new RegExp('^(\\/?[^\\/]*)' + nestedPathRegex + '$'); - var result = dockerfileRegex.exec(buildDockerfilePath); + var result = /^((\/?[^\/]*)*)\/([^\/]*)$/.exec(buildDockerfilePath); if (keypather.get(result, 'length') < 3) { throw new Error('BuilddockerfilePath is invalid'); } - var name = result && result.pop() || ''; - var path = result && result.slice(1).join('/') || ''; + var name = result && result[result.length - 1] || ''; + var path = result && result[1] || ''; // Get everything after the last '/' return fetchRepoDockerfile(repoFullName, branchName, buildDockerfilePath) .then(doesDockerfileExist) From d352385a031f793b15ef9511e7d65f218b414102 Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 23 Sep 2016 17:48:36 -0700 Subject: [PATCH 550/577] remove $state --- client/directives/components/ahaGuide/AhaGuideController.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index c87af87d0..4c124d6c9 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -7,7 +7,6 @@ require('app') function AhaGuideController( $scope, $rootScope, - $state, ahaGuide, currentOrg, errs, From 6656cc8870d7553f6cadc791de22c30b3234418e Mon Sep 17 00:00:00 2001 From: runnabro Date: Fri, 23 Sep 2016 18:08:59 -0700 Subject: [PATCH 551/577] 5.0.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2718c2db8..c051aa5b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.10", + "version": "5.0.11", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 675f19e820b0306b9b2aa4b9a5b070e51da96abd Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Fri, 23 Sep 2016 18:24:12 -0700 Subject: [PATCH 552/577] PR comments and added error tests --- .../modals/serverModalController.js | 3 ++ client/services/serviceFetchDockerfile.js | 10 +++--- .../services/serviceFetchDockerfile.unit.js | 34 ++++++++++++++++--- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 8a4b49fc3..317391225 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -55,6 +55,9 @@ function ServerModalController( } state.dockerfile = dockerfile; return dockerfile; + }) + .catch(function(err) { + console.log(err); }); }; diff --git a/client/services/serviceFetchDockerfile.js b/client/services/serviceFetchDockerfile.js index b6ec423ac..1022f6474 100644 --- a/client/services/serviceFetchDockerfile.js +++ b/client/services/serviceFetchDockerfile.js @@ -56,7 +56,7 @@ function doesDockerfileExist() { } function fetchDockerfileForContextVersion ( - $q, + $q, base64, doesDockerfileExist, fetchCommitsForFile, @@ -74,16 +74,16 @@ function fetchDockerfileForContextVersion ( // Get everything before the last '/' and add a '/' at the end var result = /^((\/?[^\/]*)*)\/([^\/]*)$/.exec(buildDockerfilePath); if (keypather.get(result, 'length') < 3) { - throw new Error('BuilddockerfilePath is invalid'); + return $q.reject(new Error('Dockerfile path is invalid')); } - var name = result && result[result.length - 1] || ''; - var path = result && result[1] || ''; + var name = result[result.length - 1]; + var path = result[1]; // Get everything after the last '/' return fetchRepoDockerfile(repoFullName, branchName, buildDockerfilePath) .then(doesDockerfileExist) .then(function (dockerfile) { if (!dockerfile) { - return null; + return $q.reject(new Error('No Dockerfile in this repo')); } return fetchCommitsForFile(repoFullName, branchName, buildDockerfilePath) .then(function (commits) { diff --git a/test/unit/services/serviceFetchDockerfile.unit.js b/test/unit/services/serviceFetchDockerfile.unit.js index c7e85b4d3..417d1ad63 100644 --- a/test/unit/services/serviceFetchDockerfile.unit.js +++ b/test/unit/services/serviceFetchDockerfile.unit.js @@ -239,11 +239,13 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { }); }); angular.mock.inject(function ( + _$q_, _$rootScope_, _fetchDockerfileForContextVersion_, _keypather_, _moment_ ) { + $q = _$q_; $rootScope = _$rootScope_; fetchDockerfileForContextVersion = _fetchDockerfileForContextVersion_; keypather = _keypather_; @@ -263,7 +265,7 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { newFile: sinon.stub().returns(true) }; }); - it('should not throw any errors for a typical dockerfile path', function () { + it('should determine the correct path for a typical dockerfile', function () { fetchDockerfileForContextVersion(contextVersionMock); $rootScope.$digest(); sinon.assert.calledOnce(fetchRepoDockerfileStub); @@ -282,7 +284,7 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { lastUpdated: 'a month ago' }) }); - it('should not throw any errors for a dockerfile one directory deep', function () { + it('should determine the correct path for a dockerfile one directory deep', function () { contextVersionMock.attrs.buildDockerfilePath = '/one/Dockerfile' fetchDockerfileForContextVersion(contextVersionMock); $rootScope.$digest(); @@ -302,7 +304,7 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { lastUpdated: 'a month ago' }) }); - it('should not throw any errors for a dockerfile two directories deep', function () { + it('should determine the correct path for a dockerfile two directories deep', function () { contextVersionMock.attrs.buildDockerfilePath = '/one/two/Dockerfile' fetchDockerfileForContextVersion(contextVersionMock); $rootScope.$digest(); @@ -322,7 +324,7 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { lastUpdated: 'a month ago' }) }); - it('should not throw any errors for a dockerfile three directories deep', function () { + it('should determine the correct path for a dockerfile three directories deep', function () { contextVersionMock.attrs.buildDockerfilePath = '/one/two/three/Dockerfile' fetchDockerfileForContextVersion(contextVersionMock); $rootScope.$digest(); @@ -342,6 +344,30 @@ describe('serviceFetchDockerfile'.bold.underline.blue, function () { lastUpdated: 'a month ago' }) }); + it('should throw an error if the dockerfile path is not valid', function () { + contextVersionMock.attrs.buildDockerfilePath = 'Dockerfile' + var error; + var err; + fetchDockerfileForContextVersion(contextVersionMock) + .catch(function(err) { + error = err; + }) + $rootScope.$digest(); + sinon.assert.notCalled(fetchRepoDockerfileStub); + expect(error.message).to.equal('Dockerfile path is invalid'); + }); + it('should throw an error if the dockerfile cannot be retrieved from the repo', function () { + doesDockerfileExistStub.returns($q.when(null)); + var error; + fetchDockerfileForContextVersion(contextVersionMock) + .catch(function(err) { + error = err; + }); + $rootScope.$digest(); + sinon.assert.calledOnce(fetchRepoDockerfileStub); + sinon.assert.calledWithExactly(fetchRepoDockerfileStub, 'testRepo', 'testBranch', '/Dockerfile'); + expect(error.message).to.equal('No Dockerfile in this repo'); + }); }); describe('fetchCommitsForFile', function () { From daf1cd058e905e8d145737fdccde970f3fe073c9 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 26 Sep 2016 09:16:05 -0700 Subject: [PATCH 553/577] Forgot to remove this --- .../modals/serverModalController.js | 4 +- client/polyfills/repeat.js | 44 ------------------- 2 files changed, 1 insertion(+), 47 deletions(-) delete mode 100644 client/polyfills/repeat.js diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 317391225..5c9e7c6a0 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -56,9 +56,7 @@ function ServerModalController( state.dockerfile = dockerfile; return dockerfile; }) - .catch(function(err) { - console.log(err); - }); + .catch(errs.handler); }; this.isDirty = function () { diff --git a/client/polyfills/repeat.js b/client/polyfills/repeat.js deleted file mode 100644 index fc2d6239d..000000000 --- a/client/polyfills/repeat.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -if (!String.prototype.repeat) { - Object.defineProperty(String.prototype, 'repeat', { - enumerable: false, - configurable: true, - writable: true, - value: function(count) { - if (this === null) { - throw new TypeError('can\'t convert ' + this + ' to object'); - } - var str = '' + this; - count = +count; - if (count !== count) { - count = 0; - } - if (count < 0) { - throw new RangeError('repeat count must be non-negative'); - } - if (count === Infinity) { - throw new RangeError('repeat count must be less than infinity'); - } - count = Math.floor(count); - if (str.length === 0 || count === 0) { - return ''; - } - if (str.length * count >= 1 << 28) { - throw new RangeError('repeat count must not overflow maximum string size'); - } - var rpt = ''; - for (;;) { - if ((count & 1) === 1) { - rpt += str; - } - count >>>= 1; - if (count === 0) { - break; - } - str += str; - } - return rpt; - } - }); -} From 9072c51177841fbb54d7b74b105999308d01befa Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 10:58:55 -0700 Subject: [PATCH 554/577] add event for starting milestone 2 --- .../components/ahaGuide/AhaGuideController.js | 3 +++ client/services/serviceEventTracking.js | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 3e2b30ca5..aae86c343 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -119,6 +119,9 @@ function AhaGuideController( // tracking switch (AGC.subStep) { + case 'addRepository': + eventTracking.milestone2Started(); + break; case 'containerSelection': eventTracking.milestone2SelectTemplate(); break; diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index b9c915ba9..f299edd5c 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -417,6 +417,21 @@ EventTracking.prototype.waitingForInfrastructure = function (orgName) { return self; }; +/** + * Milestone 2: Started + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.milestone2Started = function () { + var self = this; + var eventName = 'Milestone 2: Started'; + + self._mixpanel('track', eventName); + return self; +}; + + /** * Milestone 2: Select repository * Reports to: From 337dd622e935f14bda165842a691e1fa5417d98f Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 10:59:14 -0700 Subject: [PATCH 555/577] 5.0.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c051aa5b3..996ec8cab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.11", + "version": "5.0.12", "private": true, "description": "Frontend for Runnable.io", "scripts": { From f15e449441065594807f70bc414c3b78a6d97c69 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 26 Sep 2016 12:56:36 -0700 Subject: [PATCH 556/577] Moved error handler to call in setupServerMirrorController --- .../modalSetupServer/setupMirrorServerModalController.js | 3 ++- client/directives/environment/modals/serverModalController.js | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 8245e7e42..8a406c15b 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -130,7 +130,8 @@ function SetupMirrorServerModalController( SMC.openDockerfile(SMC.state, SMC.openItems) .finally(function () { loading(SMC.name, false); - }); + }) + .catch(errs.handler); $scope.$on('resetStateContextVersion', function ($event, contextVersion, showSpinner) { $event.stopPropagation(); diff --git a/client/directives/environment/modals/serverModalController.js b/client/directives/environment/modals/serverModalController.js index 5c9e7c6a0..8a4b49fc3 100644 --- a/client/directives/environment/modals/serverModalController.js +++ b/client/directives/environment/modals/serverModalController.js @@ -55,8 +55,7 @@ function ServerModalController( } state.dockerfile = dockerfile; return dockerfile; - }) - .catch(errs.handler); + }); }; this.isDirty = function () { From 991724f2fedda5578246eb06722da7dc82851d63 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 26 Sep 2016 13:05:40 -0700 Subject: [PATCH 557/577] Added close function to error handling --- .../modalSetupServer/setupMirrorServerModalController.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js index 8a406c15b..bd5813748 100644 --- a/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js +++ b/client/directives/environment/modals/modalSetupServer/setupMirrorServerModalController.js @@ -131,7 +131,10 @@ function SetupMirrorServerModalController( .finally(function () { loading(SMC.name, false); }) - .catch(errs.handler); + .catch(function(err) { + errs.handler(err); + close(); + }); $scope.$on('resetStateContextVersion', function ($event, contextVersion, showSpinner) { $event.stopPropagation(); From 1c93ca3e3f5b3873645195a29e4f1a2cb2050385 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 13:13:19 -0700 Subject: [PATCH 558/577] add event for building --- .../components/ahaGuide/AhaGuideController.js | 3 +++ client/services/serviceEventTracking.js | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index aae86c343..181930992 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -131,6 +131,9 @@ function AhaGuideController( case 'commands': eventTracking.milestone2VerifyCommandsTab(); break; + case 'logs': + eventTracking.milestone2Building(); + break; case 'success': eventTracking.milestone2BuildSuccess(); break; diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index f299edd5c..b591f3f7a 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -385,6 +385,7 @@ EventTracking.prototype.visitedOrgSelectPage = function () { * Track user clicks on an org on the orgSelect page * Reports to: * - mixpanel + * - segment * @return this */ EventTracking.prototype.selectedOrg = function (org) { @@ -474,6 +475,20 @@ EventTracking.prototype.milestone2VerifyCommandsTab = function () { return self; }; +/** + * Milestone 2: Building + * Reports to: + * - mixpanel + * @return this + */ +EventTracking.prototype.milestone2Building = function () { + var self = this; + var eventName = 'Milestone 2: Building'; + + self._mixpanel('track', eventName); + return self; +}; + /** * Milestone 2: Container popover * Reports to: From eaa3552c29cfaf78cce8447b3fc3743918f9039f Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 13:13:50 -0700 Subject: [PATCH 559/577] 5.0.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 996ec8cab..a7f772994 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.12", + "version": "5.0.13", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 3b742889bb3468d2e08b74a80fb0a3b076779e2d Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 13:26:41 -0700 Subject: [PATCH 560/577] fix milestone 2 started tracking --- .../components/ahaGuide/AhaGuideController.js | 3 --- .../ahaGuide/ahaSidebar/ahaSidebarView.jade | 1 + client/services/serviceEventTracking.js | 15 --------------- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index 181930992..e08f48d5b 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -119,9 +119,6 @@ function AhaGuideController( // tracking switch (AGC.subStep) { - case 'addRepository': - eventTracking.milestone2Started(); - break; case 'containerSelection': eventTracking.milestone2SelectTemplate(); break; diff --git a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade index fdf49d347..b59dc1d37 100644 --- a/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade +++ b/client/directives/components/ahaGuide/ahaSidebar/ahaSidebarView.jade @@ -42,6 +42,7 @@ .grid-block.shrink.vertical.padding-sm p.grid-content.shrink.text-center.p It takes just 3 steps to get everything set up. But don’t worry — we’re here to help! button.grid-content.shrink.btn.btn-md.green( + data-event-name = "Milestone 2: Started" ng-click = "toggleSidebar()" ) Get Started diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index b591f3f7a..4ce655bd2 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -418,21 +418,6 @@ EventTracking.prototype.waitingForInfrastructure = function (orgName) { return self; }; -/** - * Milestone 2: Started - * Reports to: - * - mixpanel - * @return this - */ -EventTracking.prototype.milestone2Started = function () { - var self = this; - var eventName = 'Milestone 2: Started'; - - self._mixpanel('track', eventName); - return self; -}; - - /** * Milestone 2: Select repository * Reports to: From 4a89dcf7caf7c650564c6f045d223ad2bf0b8280 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 13:26:55 -0700 Subject: [PATCH 561/577] 5.0.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a7f772994..011904bd7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.13", + "version": "5.0.14", "private": true, "description": "Frontend for Runnable.io", "scripts": { From 684552bab7f3e838bded7c4ccc6565d8947ea41b Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 13:38:02 -0700 Subject: [PATCH 562/577] add disabled styles for back arrow --- client/assets/styles/scss/modals/modals.scss | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/assets/styles/scss/modals/modals.scss b/client/assets/styles/scss/modals/modals.scss index 2fc74185b..d23d49a13 100755 --- a/client/assets/styles/scss/modals/modals.scss +++ b/client/assets/styles/scss/modals/modals.scss @@ -143,6 +143,11 @@ position: absolute; top: 18px; z-index: 2; // fix overlap with container-title-wrapper + + &.disabled { + color: $gray-lighter; + cursor: not-allowed; + } } .modal-header > .icons-close, @@ -171,11 +176,11 @@ > .icons-arrow-backward { left: 15px; - &:hover { + &:hover:not(.disabled) { color: $gray; } - &:active { + &:active:not(.disabled) { color: $purple-light; } } From eb9693243c8fd15e1603a4eb6853d26be6f496ec Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 26 Sep 2016 13:44:09 -0700 Subject: [PATCH 563/577] 5.0.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 011904bd7..e5c798b7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.14", + "version": "5.0.15", "private": true, "description": "Frontend for Runnable.io", "scripts": { From d3b9a2d7aabad8bc74345181db3bf51be55d791f Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 13:48:10 -0700 Subject: [PATCH 564/577] add 2 user min copy --- .../forms/billingForm/planStatus/planStatusForm.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade index 27e8561b5..6493c2f5d 100644 --- a/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade +++ b/client/directives/modals/settingsModal/forms/billingForm/planStatus/planStatusForm.jade @@ -100,7 +100,7 @@ discount = "PSFC.discount" ) - p.grid-content.p.text-gray.text-center.padding-sm Your plan is automatically determined based on number of templates at the end of each billing cycle. + p.grid-content.p.text-gray.text-center.padding-sm All plans require at least 3 users. Your plan is automatically determined based on number of templates at the end of each billing cycle. .grid-block.justify-center button.grid-block.shrink.btn.btn-md.green( From 47929c410a35bfc9fd7b79ebdf9782c90687b959 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Mon, 26 Sep 2016 17:20:07 -0700 Subject: [PATCH 565/577] Re added missing template and updated ahaguide service to exit that milestone early --- .../components/ahaGuide/AhaGuideController.js | 9 +++++---- .../ahaGuide/addBranchGuide/addBranchGuideView.jade | 9 +++++++++ client/services/ahaGuideService.js | 10 ++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/client/directives/components/ahaGuide/AhaGuideController.js b/client/directives/components/ahaGuide/AhaGuideController.js index e08f48d5b..ca2bdc9e5 100644 --- a/client/directives/components/ahaGuide/AhaGuideController.js +++ b/client/directives/components/ahaGuide/AhaGuideController.js @@ -91,12 +91,13 @@ function AhaGuideController( } }); - AGC.isInGuide = ahaGuide.isInGuide; - AGC.hasConfirmedSetup = ahaGuide.hasConfirmedSetup; - AGC.isBuildSuccessful = false; AGC.ahaGuide = ahaGuide; - AGC.errorState = $scope.errorState; AGC.configSteps = ahaGuide.stepList[ahaGuide.steps.ADD_FIRST_REPO].configSubsteps; + AGC.errorState = $scope.errorState; + AGC.hasConfirmedSetup = ahaGuide.hasConfirmedSetup; + AGC.isBuildSuccessful = false; + AGC.isInGuide = ahaGuide.isInGuide; + AGC.skipBranchMilestone = ahaGuide.skipBranchMilestone; // get the current milestone var currentMilestone = ahaGuide.stepList[ahaGuide.getCurrentStep()]; diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index 920195143..fd64006c8 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -34,6 +34,15 @@ ng-if = "subStep === 'dockLoading'" ) Select a branch to add. //- show in the branch menu if the repository has no branches. + p.p( + ng-if = "subStep === 'dockLoaded'" + ) Aw, no branches! Try another repository or + a.link( + ng-click = "AGC.skipBranchMilestone()" + target = "_blank" + ) skip this step + | . + //- show in the branch menu if the repository has no branches. p.p( ng-if = "subStep === 'deletedTemplate'" ) You've deleted your repository template. Create another one to continue. diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 477ef0bfe..05fda3518 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -262,7 +262,7 @@ function ahaGuide( return hasBranchLaunched; }); } - if (!hasBranchLaunched) { + if (!hasBranchLaunched && !ahaGuide.skippedBranchMilestone) { cachedStep = STEPS.ADD_FIRST_BRANCH; } else if (!hasRunnabot) { cachedStep = STEPS.SETUP_RUNNABOT; @@ -282,12 +282,17 @@ function ahaGuide( return keypather.get(currentOrg, 'poppa.attrs.metadata.hasConfirmedSetup'); } - function updateCurrentOrg(updatedOrg) { + function updateCurrentOrg (updatedOrg) { if (keypather.has(updatedOrg, 'metadata.hasAha') && keypather.has(updatedOrg, 'metadata.hasConfirmedSetup')) { currentOrg.poppa.attrs.metadata = updatedOrg.metadata; } } + function skipBranchMilestone () { + ahaGuide.skippedBranchMilestone = true; + $rootScope.$broadcast('showAhaSidebar'); + } + function endGuide () { $rootScope.$broadcast('close-popovers'); return patchOrgMetadata(currentOrg.poppa.id(), { @@ -323,6 +328,7 @@ function ahaGuide( steps: STEPS, updateCurrentOrg: updateCurrentOrg, furthestSubstep: furthestSubstep, + skipBranchMilestone: skipBranchMilestone, isChoosingOrg: function() { return getCurrentStep() === STEPS.CHOOSE_ORGANIZATION; }, From 826f03821a2ba54b7ce56b171292c953b6478872 Mon Sep 17 00:00:00 2001 From: runnabro Date: Mon, 26 Sep 2016 17:43:08 -0700 Subject: [PATCH 566/577] actually add .disabled class --- .../modals/modalNewContainer/newContainerModalView.jade | 1 + 1 file changed, 1 insertion(+) diff --git a/client/directives/modals/modalNewContainer/newContainerModalView.jade b/client/directives/modals/modalNewContainer/newContainerModalView.jade index b235c54c9..25c91e622 100644 --- a/client/directives/modals/modalNewContainer/newContainerModalView.jade +++ b/client/directives/modals/modalNewContainer/newContainerModalView.jade @@ -110,6 +110,7 @@ ) header.modal-header svg.iconnables.icons-arrow-backward( + ng-class = "{'disabled': $root.isLoading[MC.name + 'SingleRepo']}" ng-click = "!$root.isLoading[MC.name + 'SingleRepo'] && goToPanel(MC.state.templateSource ? 'containerSelection' : 'dockerfileMirroring', 'back')" ) use( From 520d8a14a2b7b6b933b1af5a8550906c9595cea8 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 27 Sep 2016 10:36:13 -0700 Subject: [PATCH 567/577] Removing bad substep name --- .../ahaGuide/addBranchGuide/addBranchGuideView.jade | 6 +++--- .../instance/branchMenuPopover/branchMenuPopoverView.jade | 4 ++-- client/services/ahaGuideService.js | 6 ++---- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade index fd64006c8..aaf5d102d 100644 --- a/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade +++ b/client/directives/components/ahaGuide/addBranchGuide/addBranchGuideView.jade @@ -2,7 +2,7 @@ ng-class = "{\ 'aha-error': AGC.errorState || AGC.showError,\ 'aha-meter-33': AGC.ahaGuide.isAddingFirstBranch(),\ - 'aha-meter-66': AGC.ahaGuide.isAddingFirstBranch() && subStep === 'dockLoading',\ + 'aha-meter-66': AGC.ahaGuide.isAddingFirstBranch() && subStep === 'selectBranch',\ 'aha-meter-100': AGC.ahaGuide.getCurrentStep() > ahaGuide.steps.ADD_FIRST_BRANCH\ }" ) @@ -31,11 +31,11 @@ ng-if = "subStep === 'addBranch'" ) Click the ‘Add Branch’ button next to any repo name. p.p( - ng-if = "subStep === 'dockLoading'" + ng-if = "subStep === 'selectBranch'" ) Select a branch to add. //- show in the branch menu if the repository has no branches. p.p( - ng-if = "subStep === 'dockLoaded'" + ng-if = "subStep === 'noBranches'" ) Aw, no branches! Try another repository or a.link( ng-click = "AGC.skipBranchMilestone()" diff --git a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade index 5e5bbc464..621bd4f78 100644 --- a/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade +++ b/client/directives/instances/instance/branchMenuPopover/branchMenuPopoverView.jade @@ -6,13 +6,13 @@ ng-if = "$root.featureFlags.aha && CIS.instanceBranches.length && CIS.isAddingFirstBranch()" aha-guide step-index = 2 - sub-step = "dockLoading" + sub-step = "selectBranch" ) .grid-block.shrink.align-center.justify-center.padding-sm.aha-guide( ng-if = "$root.featureFlags.aha && CIS.instanceBranches && !CIS.instanceBranches.length && CIS.isAddingFirstBranch()" aha-guide step-index = 2 - sub-step = "dockLoaded" + sub-step = "noBranches" ) .arrow.white( diff --git a/client/services/ahaGuideService.js b/client/services/ahaGuideService.js index 05fda3518..1bc90be98 100644 --- a/client/services/ahaGuideService.js +++ b/client/services/ahaGuideService.js @@ -180,13 +180,11 @@ function ahaGuide( className: 'aha-meter-33', value: 33 }, - dockLoading: { - caption: 'Bear with us!', + selectBranch: { className: 'aha-meter-66', value: 66 }, - dockLoaded: { - caption: 'Continue to start configuring your project.', + noBranches: { className: 'aha-meter-100', value: 100 }, From 55018187c7e4c209d24e067edff3c3f1672e8d6a Mon Sep 17 00:00:00 2001 From: tosih Date: Tue, 27 Sep 2016 16:51:13 -0700 Subject: [PATCH 568/577] Fixed getAllBranches to get more pages. --- client/controllers/controllerInstances.js | 24 ++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index 1265fb30f..ed772e316 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -210,7 +210,29 @@ function ControllerInstances( this.getAllBranches = function (instance) { return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) .then(function (repo) { - return promisify(repo, 'fetchBranches')(); + var allBranches = []; + + function fetchPage(page) { + return promisify(repo, 'fetchBranches')({ + page: page + }).then(function (branchesCollection) { + allBranches = allBranches.concat(branchesCollection.models); + // recursive until result set returns fewer than + // 100 repos, indicating last paginated result + if (branchesCollection.models.length < 100) { + return allBranches; + } + return fetchPage(page + 1); + }); + } + return fetchPage(1) + .then(function (branchArray) { + var branches = repo.newBranches(branchArray, { + noStore: true + }); + repo.branches = branches; + return branches; + }); }); }; From 923c01c2c657ed05f41afa25fb6241afd444997b Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 27 Sep 2016 17:20:40 -0700 Subject: [PATCH 569/577] Made call to fetch repo branches Please enter the commit message for your changes. Lines starting --- client/controllers/controllerInstances.js | 25 ++--------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/client/controllers/controllerInstances.js b/client/controllers/controllerInstances.js index ed772e316..98feb56de 100644 --- a/client/controllers/controllerInstances.js +++ b/client/controllers/controllerInstances.js @@ -16,6 +16,7 @@ function ControllerInstances( currentOrg, errs, fetchInstancesByPod, + fetchRepoBranches, keypather, loading, ModalService, @@ -210,29 +211,7 @@ function ControllerInstances( this.getAllBranches = function (instance) { return promisify(currentOrg.github, 'fetchRepo')(instance.getRepoName()) .then(function (repo) { - var allBranches = []; - - function fetchPage(page) { - return promisify(repo, 'fetchBranches')({ - page: page - }).then(function (branchesCollection) { - allBranches = allBranches.concat(branchesCollection.models); - // recursive until result set returns fewer than - // 100 repos, indicating last paginated result - if (branchesCollection.models.length < 100) { - return allBranches; - } - return fetchPage(page + 1); - }); - } - return fetchPage(1) - .then(function (branchArray) { - var branches = repo.newBranches(branchArray, { - noStore: true - }); - repo.branches = branches; - return branches; - }); + return fetchRepoBranches(repo); }); }; From 8fa76910d4b38861c3ecf6eba99934904304bf6d Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 27 Sep 2016 17:45:44 -0700 Subject: [PATCH 570/577] Fixed tests --- .../controllers/controllerInstances.unit.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/test/unit/controllers/controllerInstances.unit.js b/test/unit/controllers/controllerInstances.unit.js index d99a8da7d..1692beeb8 100644 --- a/test/unit/controllers/controllerInstances.unit.js +++ b/test/unit/controllers/controllerInstances.unit.js @@ -12,6 +12,7 @@ var $controller, mockOrg, currentOrg; var isRunnabotPartOfOrgStub; +var fetchRepoBranchesStub; var apiMocks = require('../apiMocks/index'); var mockFetch = new (require('../fixtures/mockFetch'))(); var runnable = window.runnable; @@ -110,7 +111,12 @@ describe('ControllerInstances'.bold.underline.blue, function () { isRunnabotPartOfOrgStub = sinon.stub().returns($q.when()); return isRunnabotPartOfOrgStub; }); - + $provide.factory('fetchRepoBranches', function($q) { + fetchRepoBranchesStub = sinon.stub().returns($q.when({ + models: apiMocks.branches.bitcoinRepoBranches + })); + return fetchRepoBranchesStub; + }); $provide.factory('setLastOrg', function ($q) { return sinon.stub().returns($q.when()); }); @@ -345,18 +351,11 @@ describe('ControllerInstances'.bold.underline.blue, function () { it('should fetch branches for an instance when popInstanceOpen is called', function () { setup('myOrg'); - - var repo = { - fetchBranches: sinon.stub().returns($q.when({ - models: apiMocks.branches.bitcoinRepoBranches - })) - }; - - mockOrg.github.fetchRepo.returns($q.when(repo)); + mockOrg.github.fetchRepo.returns($q.when(true)); CIS.popInstanceOpen(masterInstance); $rootScope.$digest(); sinon.assert.calledOnce(mockOrg.github.fetchRepo); - sinon.assert.calledOnce(repo.fetchBranches); + sinon.assert.calledOnce(fetchRepoBranchesStub); expect(CIS.instanceBranches).to.deep.equal(apiMocks.branches.bitcoinRepoBranches); expect(CIS.totalInstanceBranches).to.equal(apiMocks.branches.bitcoinRepoBranches.length); }); From 411ea0df0ed98663503bc85e348520b463eb5ed2 Mon Sep 17 00:00:00 2001 From: Henry Mollman Date: Tue, 27 Sep 2016 18:10:46 -0700 Subject: [PATCH 571/577] 5.0.16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e5c798b7b..c56f39fb8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runnable-angular", - "version": "5.0.15", + "version": "5.0.16", "private": true, "description": "Frontend for Runnable.io", "scripts": { From cdadfaaf0e0916050339e4055c54a3150bc4920f Mon Sep 17 00:00:00 2001 From: Taylor Dolan Date: Wed, 28 Sep 2016 11:26:37 -0700 Subject: [PATCH 572/577] alphabetize properties --- client/assets/styles/scss/modals/modals-confirm-setup.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/assets/styles/scss/modals/modals-confirm-setup.scss b/client/assets/styles/scss/modals/modals-confirm-setup.scss index 57c0f004c..0e09120d7 100644 --- a/client/assets/styles/scss/modals/modals-confirm-setup.scss +++ b/client/assets/styles/scss/modals/modals-confirm-setup.scss @@ -3,9 +3,9 @@ > .img { height: auto; position: relative; + top: 43px; width: 180px; z-index: 1; - top: 43px; } .modal-dialog { From c812b169e9ea1ed901ba696910eb3735921f88c5 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 24 Aug 2016 14:09:56 -0700 Subject: [PATCH 573/577] Pass intercom app id in environment for Grunt build instead of hardcoded. --- Gruntfile.js | 1 + client/services/serviceEventTracking.js | 7 +------ layout.jade | 11 +++-------- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 7cccd6636..4280de436 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -287,6 +287,7 @@ module.exports = function(grunt) { var locals = { version: version, env: require('./client/config/json/environment.json').environment, + intercom_app_id: process.env.INTERCOM_APP_ID || 'xs5g95pd', commitHash: require('./client/config/json/commit.json').commitHash, commitTime: require('./client/config/json/commit.json').commitTime, apiHost: require('./client/config/json/api.json').host diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 4ce655bd2..c908951d7 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -28,17 +28,12 @@ function EventTracking( $window, assign, keypather, - configEnvironment, siftApiConfig ) { + INTERCOM_APP_ID = process.env.INTERCOM_APP_ID || 'xs5g95pd'; var self = this; SIFT_API_KEY = siftApiConfig; - if (configEnvironment === 'production') { - INTERCOM_APP_ID = 'wqzm3rju'; // production ID - } else { - INTERCOM_APP_ID = 'xs5g95pd'; // test ID - } _keypather = keypather; _$location = $location; diff --git a/layout.jade b/layout.jade index e85706b3b..c7ed97555 100644 --- a/layout.jade +++ b/layout.jade @@ -183,11 +183,6 @@ html( ) Dismiss //- Intercom - if env === 'production' - script( - src = "https://widget.intercom.io/widget/wqzm3rju" - ) - else - script( - src = "https://widget.intercom.io/widget/xs5g95pd" - ) + script( + src = "https://widget.intercom.io/widget/" + intercom_app_id + ) From f233ee0484ec37e914ebb7e9321e2081bd471ab5 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 24 Aug 2016 14:28:09 -0700 Subject: [PATCH 574/577] Fix variable to camelCase. --- Gruntfile.js | 2 +- layout.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 4280de436..bd6b4cec1 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -287,7 +287,7 @@ module.exports = function(grunt) { var locals = { version: version, env: require('./client/config/json/environment.json').environment, - intercom_app_id: process.env.INTERCOM_APP_ID || 'xs5g95pd', + intercomAppId: process.env.INTERCOM_APP_ID || 'xs5g95pd', commitHash: require('./client/config/json/commit.json').commitHash, commitTime: require('./client/config/json/commit.json').commitTime, apiHost: require('./client/config/json/api.json').host diff --git a/layout.jade b/layout.jade index c7ed97555..929c16c39 100644 --- a/layout.jade +++ b/layout.jade @@ -184,5 +184,5 @@ html( //- Intercom script( - src = "https://widget.intercom.io/widget/" + intercom_app_id + src = "https://widget.intercom.io/widget/" + intercomAppId ) From ab56cb4dd70e5e35971e1b23d67c747238357b07 Mon Sep 17 00:00:00 2001 From: tosih Date: Wed, 24 Aug 2016 15:56:19 -0700 Subject: [PATCH 575/577] Source config from file as process.env is unavailable. --- Gruntfile.js | 5 +++-- client/services/configs/serviceIntercomAppId.js | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 client/services/configs/serviceIntercomAppId.js diff --git a/Gruntfile.js b/Gruntfile.js index bd6b4cec1..c907d1946 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -287,7 +287,7 @@ module.exports = function(grunt) { var locals = { version: version, env: require('./client/config/json/environment.json').environment, - intercomAppId: process.env.INTERCOM_APP_ID || 'xs5g95pd', + intercomAppId: require('./client/config/json/environment.json').intercomAppId, commitHash: require('./client/config/json/commit.json').commitHash, commitTime: require('./client/config/json/commit.json').commitTime, apiHost: require('./client/config/json/api.json').host @@ -479,7 +479,8 @@ module.exports = function(grunt) { }, function (cb) { var configObj = { - environment: environment || process.env.NODE_ENV || 'development' + environment: environment || process.env.NODE_ENV || 'development', + intercomAppId: process.env.INTERCOM_APP_ID || 'xs5g95pd' }; var configJSON = JSON.stringify(configObj); fs.writeFile(path.join(clientPath, 'config', 'json', 'environment.json'), configJSON, function () { diff --git a/client/services/configs/serviceIntercomAppId.js b/client/services/configs/serviceIntercomAppId.js new file mode 100644 index 000000000..234b58cf7 --- /dev/null +++ b/client/services/configs/serviceIntercomAppId.js @@ -0,0 +1,4 @@ +'use strict'; + +require('app') + .value('intercomAppId', require('config/environment').intercomAppId); From 26387037fcc1497cc69b9a5b30b06748df491987 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 28 Sep 2016 14:07:22 -0700 Subject: [PATCH 576/577] fix --- client/services/serviceEventTracking.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/services/serviceEventTracking.js b/client/services/serviceEventTracking.js index 3ef0fd540..3c9583dd2 100644 --- a/client/services/serviceEventTracking.js +++ b/client/services/serviceEventTracking.js @@ -28,7 +28,7 @@ function EventTracking( $window, assign, keypather, - intercomAppId + intercomAppId, siftApiConfig ) { INTERCOM_APP_ID = intercomAppId; From f0b7cfa1c5e91972cf76927836b5d97efdf781c3 Mon Sep 17 00:00:00 2001 From: Nathan219 Date: Wed, 28 Sep 2016 14:14:31 -0700 Subject: [PATCH 577/577] fix layout to use locals --- layout.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layout.jade b/layout.jade index 929c16c39..04cca5047 100644 --- a/layout.jade +++ b/layout.jade @@ -184,5 +184,5 @@ html( //- Intercom script( - src = "https://widget.intercom.io/widget/" + intercomAppId + src = "https://widget.intercom.io/widget/#{locals.intercomAppId}" )