diff --git a/static/js/directives/ui/linear-workflow/linear-workflow.component.ts b/static/js/directives/ui/linear-workflow/linear-workflow.component.ts index e69de29bb..a82e01b54 100644 --- a/static/js/directives/ui/linear-workflow/linear-workflow.component.ts +++ b/static/js/directives/ui/linear-workflow/linear-workflow.component.ts @@ -0,0 +1,10 @@ +import { Component, Output, Input } from 'angular-ts-decorators'; + + +@Component({ + selector: 'linearWorkflow', + templateUrl: '/static/js/directives/ui/linear-workflow/linear-workflow.component.html' +}) +export class LinearWorkflowComponent implements ng.IComponentController { + +} diff --git a/static/js/quay.config.ts b/static/js/quay.config.ts new file mode 100644 index 000000000..164c98692 --- /dev/null +++ b/static/js/quay.config.ts @@ -0,0 +1,116 @@ +import { NgModule } from 'angular-ts-decorators'; +import { INJECTED_CONFIG, INJECTED_FEATURES, INJECTED_ENDPOINTS } from "./constants/injected-values.constant"; +import { NAME_PATTERNS } from "./constants/name-patterns.constant"; +import * as Raven from "raven-js"; +import * as angular from 'angular'; + + +var quayDependencies: any[] = [ + 'chieffancypants.loadingBar', + 'cfp.hotkeys', + 'angular-tour', + 'restangular', + 'angularMoment', + 'mgcrea.ngStrap', + 'ngCookies', + 'ngSanitize', + 'angular-md5', + 'pasvaz.bindonce', + 'ansiToHtml', + 'core-ui', + 'core-config-setup', + 'infinite-scroll', + 'react' +]; + +if (INJECTED_CONFIG && (INJECTED_CONFIG.MIXPANEL_KEY || + INJECTED_CONFIG.MUNCHKIN_KEY || + INJECTED_CONFIG.GOOGLE_ANALYTICS_KEY)) { + quayDependencies.push('angulartics'); +} +if (INJECTED_CONFIG && INJECTED_CONFIG.MIXPANEL_KEY) { + quayDependencies.push('angulartics.mixpanel'); +} +if (INJECTED_CONFIG && INJECTED_CONFIG.MUNCHKIN_KEY) { + quayDependencies.push('angulartics.marketo'); +} +if (INJECTED_CONFIG && INJECTED_CONFIG.GOOGLE_ANALYTICS_KEY) { + quayDependencies.push('angulartics.google.analytics'); +} +if (INJECTED_CONFIG && INJECTED_CONFIG.RECAPTCHA_SITE_KEY) { + quayDependencies.push('vcRecaptcha'); +} + + +/** + * Module for application-wide configuration. + */ +@NgModule({ + imports: quayDependencies, + declarations: [], + providers: [] +}) +export class QuayConfig { + + public config($provide: ng.auto.IProvideService, + $injector: ng.auto.IInjectorService, + INJECTED_CONFIG: any, + cfpLoadingBarProvider: any, + $tooltipProvider: any, + $compileProvider: ng.ICompileProvider, + RestangularProvider: any): void { + cfpLoadingBarProvider.includeSpinner = false; + + // decorate the tooltip getter + var tooltipFactory: any = $tooltipProvider.$get[$tooltipProvider.$get.length - 1]; + $tooltipProvider.$get[$tooltipProvider.$get.length - 1] = function($window: ng.IWindowService) { + if ('ontouchstart' in $window) { + var existing: any = tooltipFactory.apply(this, arguments); + return function(element) { + // Note: We only disable bs-tooltip's themselves. $tooltip is used for other things + // (such as the datepicker), so we need to be specific when canceling it. + if (element !== undefined && element.attr('bs-tooltip') == null) { + return existing.apply(this, arguments); + } + }; + } + + return tooltipFactory.apply(this, arguments); + }; + + if (!INJECTED_CONFIG['DEBUG']) { + $compileProvider.debugInfoEnabled(false); + } + + // Configure compile provider to add additional URL prefixes to the sanitization list. We use + // these on the Contact page. + $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|irc):/); + + // Configure the API provider. + RestangularProvider.setBaseUrl('/api/v1/'); + + // Configure analytics. + if (INJECTED_CONFIG && INJECTED_CONFIG.MIXPANEL_KEY) { + let $analyticsProvider: any = $injector.get('$analyticsProvider'); + $analyticsProvider.virtualPageviews(true); + } + + // Configure sentry. + if (INJECTED_CONFIG && INJECTED_CONFIG.SENTRY_PUBLIC_DSN) { + $provide.decorator("$exceptionHandler", function($delegate) { + return function(ex, cause) { + $delegate(ex, cause); + Raven.captureException(ex, {extra: {cause: cause}}); + }; + }); + } + } +} + + +angular + .module(QuayConfig.name) + .constant('NAME_PATTERNS', NAME_PATTERNS) + .constant('INJECTED_CONFIG', INJECTED_CONFIG) + .constant('INJECTED_FEATURES', INJECTED_FEATURES) + .constant('INJECTED_ENDPOINTS', INJECTED_ENDPOINTS); \ No newline at end of file diff --git a/static/js/quay.module.ts b/static/js/quay.module.ts index a318c4a38..e4c6099bf 100644 --- a/static/js/quay.module.ts +++ b/static/js/quay.module.ts @@ -1,5 +1,4 @@ import * as angular from "angular"; -import * as Raven from "raven-js"; import { ViewArrayImpl } from "./services/view-array/view-array.impl"; import { NAME_PATTERNS } from "./constants/name-patterns.constant"; import { INJECTED_CONFIG, INJECTED_FEATURES, INJECTED_ENDPOINTS } from "./constants/injected-values.constant"; @@ -9,56 +8,24 @@ import { QuayRoutes } from "./quay-routes.module"; import { DockerfilePathSelectComponent } from './directives/ui/dockerfile-path-select/dockerfile-path-select.component'; import { ManageTriggerCustomGitComponent } from './directives/ui/manage-trigger-custom-git/manage-trigger-custom-git.component'; import { ManageTriggerGithostComponent } from './directives/ui/manage-trigger-githost/manage-trigger-githost.component'; - - -var quayDependencies: any[] = [ - QuayRoutes, - 'chieffancypants.loadingBar', - 'cfp.hotkeys', - 'angular-tour', - 'restangular', - 'angularMoment', - 'mgcrea.ngStrap', - 'ngCookies', - 'ngSanitize', - 'angular-md5', - 'pasvaz.bindonce', - 'ansiToHtml', - 'core-ui', - 'core-config-setup', - 'infinite-scroll', - 'react' -]; - -if (INJECTED_CONFIG && (INJECTED_CONFIG.MIXPANEL_KEY || - INJECTED_CONFIG.MUNCHKIN_KEY || - INJECTED_CONFIG.GOOGLE_ANALYTICS_KEY)) { - quayDependencies.push('angulartics'); -} -if (INJECTED_CONFIG && INJECTED_CONFIG.MIXPANEL_KEY) { - quayDependencies.push('angulartics.mixpanel'); -} -if (INJECTED_CONFIG && INJECTED_CONFIG.MUNCHKIN_KEY) { - quayDependencies.push('angulartics.marketo'); -} -if (INJECTED_CONFIG && INJECTED_CONFIG.GOOGLE_ANALYTICS_KEY) { - quayDependencies.push('angulartics.google.analytics'); -} -if (INJECTED_CONFIG && INJECTED_CONFIG.RECAPTCHA_SITE_KEY) { - quayDependencies.push('vcRecaptcha'); -} +import { LinearWorkflowComponent } from './directives/ui/linear-workflow/linear-workflow.component'; +import { QuayConfig } from './quay.config'; /** * Main application module. */ @NgModule({ - imports: quayDependencies, + imports: [ + QuayRoutes, + QuayConfig, + ], declarations: [ RegexMatchViewComponent, DockerfilePathSelectComponent, ManageTriggerCustomGitComponent, ManageTriggerGithostComponent, + LinearWorkflowComponent, ], providers: [ ViewArrayImpl, @@ -66,58 +33,8 @@ if (INJECTED_CONFIG && INJECTED_CONFIG.RECAPTCHA_SITE_KEY) { }) export class quay { - public config($provide: ng.auto.IProvideService, - $injector: ng.auto.IInjectorService, - INJECTED_CONFIG: any, - cfpLoadingBarProvider: any, - $tooltipProvider: any, - $compileProvider: ng.ICompileProvider, - RestangularProvider: any): void { - cfpLoadingBarProvider.includeSpinner = false; + constructor() { - // decorate the tooltip getter - var tooltipFactory: any = $tooltipProvider.$get[$tooltipProvider.$get.length - 1]; - $tooltipProvider.$get[$tooltipProvider.$get.length - 1] = function($window: ng.IWindowService) { - if ('ontouchstart' in $window) { - var existing: any = tooltipFactory.apply(this, arguments); - return function(element) { - // Note: We only disable bs-tooltip's themselves. $tooltip is used for other things - // (such as the datepicker), so we need to be specific when canceling it. - if (element !== undefined && element.attr('bs-tooltip') == null) { - return existing.apply(this, arguments); - } - }; - } - - return tooltipFactory.apply(this, arguments); - }; - - if (!INJECTED_CONFIG['DEBUG']) { - $compileProvider.debugInfoEnabled(false); - } - - // Configure compile provider to add additional URL prefixes to the sanitization list. We use - // these on the Contact page. - $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|irc):/); - - // Configure the API provider. - RestangularProvider.setBaseUrl('/api/v1/'); - - // Configure analytics. - if (INJECTED_CONFIG && INJECTED_CONFIG.MIXPANEL_KEY) { - let $analyticsProvider: any = $injector.get('$analyticsProvider'); - $analyticsProvider.virtualPageviews(true); - } - - // Configure sentry. - if (INJECTED_CONFIG && INJECTED_CONFIG.SENTRY_PUBLIC_DSN) { - $provide.decorator("$exceptionHandler", function($delegate) { - return function(ex, cause) { - $delegate(ex, cause); - Raven.captureException(ex, {extra: {cause: cause}}); - }; - }); - } } public run($rootScope: QuayRunScope, @@ -239,7 +156,7 @@ interface QuayRunScope extends ng.IRootScopeService { } -// TODO: Move component registration to @NgModule and remove this. +// TODO: Make injected values into services and move to NgModule.providers, as constants are not supported in Angular 2 angular .module(quay.name) .constant('NAME_PATTERNS', NAME_PATTERNS)