Skip to content

Commit

Permalink
Web Browser App: App2App communication - phase 1
Browse files Browse the repository at this point in the history
Signed-off-by: Leonty Chudinov <lchudinov@rocketsoftware.com>
  • Loading branch information
Leonty Chudinov committed Mar 23, 2020
1 parent 3c24c1d commit 0ea8edc
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 22 deletions.
35 changes: 32 additions & 3 deletions system-apps/web-browser-app/webClient/src/app/app.component.ts
Expand Up @@ -12,8 +12,9 @@

import { Component, Inject } from '@angular/core';
import { Angular2InjectionTokens } from 'pluginlib/inject-resources';

import { LocaleService, TranslationService } from 'angular-l10n';
import { WebBrowserLaunchMetadata, isLaunchMetadata } from './browser/shared';
import { NavigationService, ProxyService, SettingsService } from './browser/services';

@Component({
selector: 'app-root',
Expand All @@ -25,16 +26,44 @@ export class AppComponent {
constructor(
public locale: LocaleService,
public translation: TranslationService,
@Inject(Angular2InjectionTokens.PLUGIN_DEFINITION) public pluginDefinition: ZLUX.ContainerPluginDefinition,
@Inject(Angular2InjectionTokens.LOGGER) public log: ZLUX.ComponentLogger,
@Inject(Angular2InjectionTokens.LAUNCH_METADATA) public launchMetadata: any,
private navigation: NavigationService,
private proxy: ProxyService,
private settings: SettingsService,
) {
}

ngOnInit(): void {
this.log.info(`web browser started`);
}

provideZLUXDispatcherCallbacks(): ZLUX.ApplicationCallbacks {
return {
onMessage: (eventContext: any): Promise<any> => this.zluxOnMessage(eventContext)
}
}

private zluxOnMessage(eventContext: any): Promise<void> {
if (isLaunchMetadata(eventContext)) {
this.handleLaunchMetadata(eventContext.data);
return Promise.resolve();
}
return Promise.reject(`Event context missing or malformed`);
}

private handleLaunchMetadata(launchMetaData: Partial<WebBrowserLaunchMetadata>): void {
const { enableProxy, hideControls, url } = launchMetaData;
if (typeof enableProxy === 'boolean' && this.proxy.isEnabled() !== enableProxy) {
this.proxy.toggle();
}
if (typeof hideControls === 'boolean' && !this.settings.areControlsVisible() !== hideControls) {
this.settings.toggleControls();
}
if (typeof url === 'string') {
this.navigation.navigate(url);
}
}

}


Expand Down
Expand Up @@ -8,13 +8,12 @@
Copyright Contributors to the Zowe Project.
*/

import { Component, OnInit, OnDestroy, Optional, Inject, HostBinding } from '@angular/core';
import { Component, OnInit, OnDestroy, HostBinding } from '@angular/core';
import { FormControl } from '@angular/forms';
import { Subscription } from 'rxjs';
import { throttleTime } from 'rxjs/operators';
import { NavigationService, ProxyService } from '../services';
import { Angular2InjectionTokens } from 'pluginlib/inject-resources';
import { LaunchMetadata } from '../shared';
import { SettingsService } from '../services/settings.service';

@Component({
selector: 'app-address-bar',
Expand All @@ -27,18 +26,12 @@ export class AddressBarComponent implements OnInit, OnDestroy {
placeholder = 'URL';
proxyValueSubscription: Subscription;
proxyErrorSubscription: Subscription;
@HostBinding('hidden')
isHidden: boolean;

constructor(
private navigation: NavigationService,
private proxy: ProxyService,
@Optional() @Inject(Angular2InjectionTokens.LAUNCH_METADATA)
launchMetadata: Partial<LaunchMetadata>,
private settings: SettingsService,
) {
if (launchMetadata && launchMetadata.data && launchMetadata.data.hideControls) {
this.isHidden = true;
}
this.urlControl = new FormControl(navigation.startURL);
this.proxyControl = new FormControl(this.proxy.isEnabled());
this.proxyValueSubscription = this.proxyControl.valueChanges.pipe(
Expand All @@ -49,6 +42,10 @@ export class AddressBarComponent implements OnInit, OnDestroy {

ngOnInit() {
}

@HostBinding('hidden') get isHidden(): boolean {
return !this.settings.areControlsVisible();
}

navigate(): void {
if (this.urlControl.value) {
Expand Down Expand Up @@ -99,7 +96,7 @@ export class AddressBarComponent implements OnInit, OnDestroy {
this.proxyErrorSubscription.unsubscribe();
}
}

}


Expand Down
Expand Up @@ -14,7 +14,7 @@ import { BrowserComponent } from './browser/browser.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AddressBarComponent } from './address-bar/address-bar.component';
import { BrowserWindowComponent } from './browser-window/browser-window.component';
import { NavigationService, ProxyService } from './services';
import { NavigationService, ProxyService, SettingsService } from './services';

@NgModule({
imports: [
Expand All @@ -30,6 +30,7 @@ import { NavigationService, ProxyService } from './services';
providers: [
NavigationService,
ProxyService,
SettingsService,
],
exports: [
BrowserComponent
Expand Down
Expand Up @@ -10,6 +10,7 @@

export * from './navigation.service';
export * from './proxy.service';
export * from './settings.service';

/*
This program and the accompanying materials are
Expand Down
Expand Up @@ -12,7 +12,7 @@ import { Injectable, Inject, Optional } from '@angular/core';
import { Observable, ReplaySubject } from 'rxjs';
import { ProxyService } from './proxy.service';
import { switchMap } from 'rxjs/operators';
import { LaunchMetadata } from '../shared';
import { isLaunchMetadata } from '../shared';
import { Angular2InjectionTokens } from 'pluginlib/inject-resources';

@Injectable()
Expand All @@ -27,11 +27,10 @@ export class NavigationService {

constructor(
@Optional() @Inject(Angular2InjectionTokens.LAUNCH_METADATA)
launchMetadata: Partial<LaunchMetadata>,
launchMetadata: any,
private proxy: ProxyService
) {
console.log(`navigation service got launch metadata:\n${JSON.stringify(launchMetadata, null, 2)}`);
if (launchMetadata && launchMetadata.data && typeof launchMetadata.data.url === 'string') {
if (isLaunchMetadata(launchMetadata) && typeof launchMetadata.data.url === 'string') {
this.startURL = launchMetadata.data.url;
}
this.url$ = this.urlSubject.pipe(switchMap(url => this.proxy.process(url)));
Expand Down
Expand Up @@ -13,7 +13,7 @@ import { HttpClient } from '@angular/common/http';
import { Observable, BehaviorSubject, of, Subject } from 'rxjs';
import { Angular2InjectionTokens } from 'pluginlib/inject-resources';
import { map, tap, catchError, switchMap } from 'rxjs/operators';
import { LaunchMetadata } from '../shared';
import { isLaunchMetadata } from '../shared';


export interface ProxyServerResult {
Expand All @@ -33,10 +33,10 @@ export class ProxyService {
@Inject(Angular2InjectionTokens.PLUGIN_DEFINITION)
private pluginDefinition: ZLUX.ContainerPluginDefinition,
@Optional() @Inject(Angular2InjectionTokens.LAUNCH_METADATA)
launchMetadata: Partial<LaunchMetadata>,
launchMetadata: any,
) {
this.proxyServiceURL = ZoweZLUX.uriBroker.pluginRESTUri(this.pluginDefinition.getBasePlugin(), 'proxy', '');
if (launchMetadata && launchMetadata.data && launchMetadata.data.enableProxy) {
if (isLaunchMetadata(launchMetadata) && launchMetadata.data.enableProxy) {
this.enabled = true;
}
}
Expand Down
@@ -0,0 +1,46 @@
/*
This program and the accompanying materials are
made available under the terms of the Eclipse Public License v2.0 which accompanies
this distribution, and is available at https://www.eclipse.org/legal/epl-v20.html
SPDX-License-Identifier: EPL-2.0
Copyright Contributors to the Zowe Project.
*/

import { Injectable, Optional, Inject } from '@angular/core';
import { Angular2InjectionTokens } from 'pluginlib/inject-resources';
import { isLaunchMetadata } from '../shared';

@Injectable()
export class SettingsService {
private controlsVisible = true;

constructor(
@Optional() @Inject(Angular2InjectionTokens.LAUNCH_METADATA)
launchMetadata: any,
) {
if (isLaunchMetadata(launchMetadata) && launchMetadata.data.hideControls) {
this.controlsVisible = false;
}
}

toggleControls(): void {
this.controlsVisible = !this.controlsVisible;
}

areControlsVisible(): boolean {
return this.controlsVisible;
}
}


/*
This program and the accompanying materials are
made available under the terms of the Eclipse Public License v2.0 which accompanies
this distribution, and is available at https://www.eclipse.org/legal/epl-v20.html
SPDX-License-Identifier: EPL-2.0
Copyright Contributors to the Zowe Project.
*/
Expand Up @@ -18,6 +18,10 @@ export interface WebBrowserLaunchMetadata {
enableProxy: boolean;
}

export function isLaunchMetadata(data: any): data is LaunchMetadata {
return data && data.data != null && typeof data.data === 'object';
}


/*
This program and the accompanying materials are
Expand Down

0 comments on commit 0ea8edc

Please sign in to comment.