diff --git a/src/app/operators/components/operator-examples/operator-examples.component.scss b/src/app/operators/components/operator-examples/operator-examples.component.scss
index ae9fda53..c3312554 100644
--- a/src/app/operators/components/operator-examples/operator-examples.component.scss
+++ b/src/app/operators/components/operator-examples/operator-examples.component.scss
@@ -1,12 +1,3 @@
-.code-block {
- position: relative;
-
- pre {
- margin-top: 0;
- padding-top: 0;
- }
-}
-
.menu-button {
position: absolute;
right: 0;
@@ -36,11 +27,3 @@
.code-example {
margin-bottom: 16px;
}
-
-.bin-wrapper {
- iframe {
- border: none;
- width: 100%;
- height: 350px;
- }
-}
diff --git a/src/app/operators/components/operator-extras/operator-extras.component.scss b/src/app/operators/components/operator-extras/operator-extras.component.scss
index 100097d3..8b137891 100644
--- a/src/app/operators/components/operator-extras/operator-extras.component.scss
+++ b/src/app/operators/components/operator-extras/operator-extras.component.scss
@@ -1,17 +1 @@
-.extra-tip {
- display: flex;
-}
-h3 {
- display: inline-block;
- vertical-align: middle;
- padding-left: 10px;
-}
-
-.tip-warning {
- color: rgb(244, 67, 54);
-}
-
-.tip-info {
- color: rgb(33, 150, 243);
-}
diff --git a/src/app/operators/components/operator-general/operator-general.component.html b/src/app/operators/components/operator-general/operator-general.component.html
new file mode 100644
index 00000000..4ff2a914
--- /dev/null
+++ b/src/app/operators/components/operator-general/operator-general.component.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/operators/components/operator-general/operator-general.component.scss b/src/app/operators/components/operator-general/operator-general.component.scss
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/src/app/operators/components/operator-general/operator-general.component.scss
@@ -0,0 +1 @@
+
diff --git a/src/app/operators/components/operator-general/operator-general.component.ts b/src/app/operators/components/operator-general/operator-general.component.ts
new file mode 100644
index 00000000..3b5530d3
--- /dev/null
+++ b/src/app/operators/components/operator-general/operator-general.component.ts
@@ -0,0 +1,61 @@
+import {
+ Component,
+ Input,
+ OnInit,
+ OnDestroy,
+ ViewEncapsulation
+} from '@angular/core';
+import { OperatorDoc, ALL_OPERATORS } from '../../../../operator-docs';
+import { CopierService } from '../../../core/services/copier.service';
+import { MatSnackBar } from '@angular/material';
+import { OperatorComponent } from '../operator/operator.component';
+import { ActivatedRoute } from '@angular/router';
+import { takeUntil } from 'rxjs/operators/takeUntil';
+import { Subject } from 'rxjs/Subject';
+
+@Component({
+ selector: 'app-operator-general',
+ templateUrl: './operator-general.component.html',
+ styleUrls: ['./operator-general.component.scss'],
+ encapsulation: ViewEncapsulation.None
+})
+export class OperatorGeneralComponent implements OnInit, OnDestroy {
+ public operator: OperatorDoc;
+ private _onDestroy = new Subject();
+ private readonly baseSourceUrl = 'https://github.com/ReactiveX/rxjs/blob/master/src/operators/';
+ private readonly baseSpecUrl = 'http://reactivex.io/rxjs/test-file/spec-js/operators';
+
+ constructor(
+ private _operatorComponent: OperatorComponent,
+ private _activateRoute: ActivatedRoute,
+ private _copierService: CopierService,
+ private _snackBar: MatSnackBar
+ ) {}
+
+ ngOnInit() {
+ this._activateRoute.params.pipe(takeUntil(this._onDestroy)).subscribe(_ => {
+ this.operator = this._operatorComponent.operator;
+ });
+ }
+
+ copyToClipboard(code: string) {
+ this._copierService.copyText(code);
+ this._snackBar.open(
+ 'The example has been copied to your clipboard!',
+ null,
+ { duration: 3000 }
+ );
+ }
+
+ get sourceUrl() {
+ return `${this.baseSourceUrl}/${this.operator.name}.ts`;
+ }
+
+ get specsUrl() {
+ return `${this.baseSpecUrl}/${this.operator.name}-spec.js.html`;
+ }
+
+ ngOnDestroy() {
+ this._onDestroy.next();
+ }
+}
diff --git a/src/app/operators/components/operator-header/operator-header.component.scss b/src/app/operators/components/operator-header/operator-header.component.scss
index 4b2b1153..338fa708 100644
--- a/src/app/operators/components/operator-header/operator-header.component.scss
+++ b/src/app/operators/components/operator-header/operator-header.component.scss
@@ -1,11 +1,7 @@
@import '../../operator-theme';
.operator-name {
- font-size:30px;
-}
-
-.signature {
- margin-bottom: 24px;
+ font-size: 30px;
}
mat-toolbar {
diff --git a/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.html b/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.html
new file mode 100644
index 00000000..e5ab7a37
--- /dev/null
+++ b/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.html
@@ -0,0 +1,13 @@
+
+
+
{{ example.name }}
+
{{ example.description }}
+
+
+
diff --git a/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.scss b/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.scss
new file mode 100644
index 00000000..eaabd511
--- /dev/null
+++ b/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.scss
@@ -0,0 +1,6 @@
+$stackblitz-blue: #0077cf;
+$stackblitz-grey: #353535;
+
+.frame-wrapper {
+ background-color: $stackblitz-blue;
+}
diff --git a/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.ts b/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.ts
new file mode 100644
index 00000000..9710bb91
--- /dev/null
+++ b/src/app/operators/components/operator-vendor-examples/operator-vendor-examples.component.ts
@@ -0,0 +1,35 @@
+import { Component, OnInit, OnDestroy, Input } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { OperatorComponent } from '../operator/operator.component';
+import { Subject } from 'rxjs/Subject';
+import { takeUntil } from 'rxjs/operators/takeUntil';
+import { VendorExample } from '../../../../operator-docs';
+
+@Component({
+ selector: 'app-operator-vendor-examples',
+ templateUrl: './operator-vendor-examples.component.html',
+ styleUrls: ['./operator-vendor-examples.component.scss']
+})
+export class OperatorVendorExamplesComponent implements OnInit, OnDestroy {
+ public examples: VendorExample[] = [];
+ private _onDestroy = new Subject();
+
+ constructor(
+ private _operatorComponent: OperatorComponent,
+ private _activedRoute: ActivatedRoute
+ ) {}
+
+ ngOnInit() {
+ this._activedRoute.params.pipe(takeUntil(this._onDestroy)).subscribe(p => {
+ this.examples = this._operatorComponent.operator.vendorExamples.filter(
+ e => {
+ return e.vendorName === p['vendor'];
+ }
+ );
+ });
+ }
+
+ ngOnDestroy() {
+ this._onDestroy.next();
+ }
+}
diff --git a/src/app/operators/components/operator/operator.component.html b/src/app/operators/components/operator/operator.component.html
index 6bb46994..dc57973b 100644
--- a/src/app/operators/components/operator/operator.component.html
+++ b/src/app/operators/components/operator/operator.component.html
@@ -1,39 +1,25 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/src/app/operators/components/operator/operator.component.scss b/src/app/operators/components/operator/operator.component.scss
index 621798a0..8b137891 100644
--- a/src/app/operators/components/operator/operator.component.scss
+++ b/src/app/operators/components/operator/operator.component.scss
@@ -1,19 +1 @@
-.main-operator-container {
- padding: 5px;
- display: flex;
- flex-direction: column;
- padding: 0 16px;
- margin-bottom: 32px;
-}
-.short-description {
- margin: 16px 0 32px;
-}
-
-.margin-bottom-32 {
- margin-bottom: 32px;
-}
-
-.margin-bottom-16 {
- margin-bottom: 16px;
-}
diff --git a/src/app/operators/components/operator/operator.component.ts b/src/app/operators/components/operator/operator.component.ts
index 9b3e9a6d..fced9f20 100644
--- a/src/app/operators/components/operator/operator.component.ts
+++ b/src/app/operators/components/operator/operator.component.ts
@@ -11,7 +11,7 @@ import { MatSnackBar } from '@angular/material';
import { pluck } from 'rxjs/operators';
import { CopierService } from '../../../core/services/copier.service';
import { SeoService } from '../../../core/services/seo.service';
-import { OperatorDoc } from '../../../../operator-docs/operator.model';
+import { OperatorDoc, VendorExample } from '../../../../operator-docs';
export const OPERATOR_TOKEN = new InjectionToken
('operators');
@@ -23,9 +23,8 @@ export const OPERATOR_TOKEN = new InjectionToken('operators');
export class OperatorComponent implements OnInit {
public operator: OperatorDoc;
public operatorsMap = new Map();
-
- private readonly baseSourceUrl = 'https://github.com/ReactiveX/rxjs/blob/master/src/operators/';
- private readonly baseSpecUrl = 'http://reactivex.io/rxjs/test-file/spec-js/operators';
+ public vendorExamples: string[];
+ public isVendor: boolean;
constructor(
private _router: Router,
@@ -45,6 +44,8 @@ export class OperatorComponent implements OnInit {
.subscribe((name: string) => {
if (this.operatorsMap.has(name)) {
this.operator = this.operatorsMap.get(name);
+ this.vendorExamples = this.compileVendorTabs(this.operator);
+ this.isVendor = this.isVendorRoute(this._router.url);
this.scrollToTop();
} else {
this.notfound();
@@ -67,74 +68,26 @@ export class OperatorComponent implements OnInit {
}
}
- copyToClipboard(code: string) {
- this._copierService.copyText(code);
- this._snackBar.open(
- 'The example has been copied to your clipboard!',
- null,
- { duration: 3000 }
- );
- }
-
- get operatorName() {
- return this.operator.name;
- }
-
- get signature() {
- return this.operator.signature || 'Signature Placeholder';
- }
-
- get marbleUrl() {
- return this.operator.marbleUrl;
- }
-
- get useInteractiveMarbles() {
- return this.operator.useInteractiveMarbles;
- }
-
- get shortDescription() {
- return (
- this.operator.shortDescription &&
- this.operator.shortDescription.description
- );
+ compileVendorTabs(operator: OperatorDoc) {
+ return operator.vendorExamples
+ ? operator.vendorExamples.reduce((acc: string[], curr: VendorExample) => {
+ if (!acc.includes(curr.vendorName)) {
+ return [...acc, curr.vendorName];
+ }
+ return acc;
+ }, [])
+ : [];
}
- get shortDescriptionExtras() {
+ isVendorRoute(url: string) {
+ // make this dynamic in future
return (
- this.operator.shortDescription && this.operator.shortDescription.extras
+ this._router.url.includes('Angular') || this._router.url.includes('React')
);
}
- get walkthrough() {
- return this.operator.walkthrough && this.operator.walkthrough.description;
- }
-
- get walkthroughExtras() {
- return this.operator.walkthrough && this.operator.walkthrough.extras;
- }
-
- get parameters() {
- return this.operator.parameters || [];
- }
-
- get examples() {
- return this.operator.examples || [];
- }
-
- get relatedOperators() {
- return this.operator.relatedOperators || [];
- }
-
- get sourceUrl() {
- return `${this.baseSourceUrl}/${this.operatorName}.ts`;
- }
-
- get specsUrl() {
- return `${this.baseSpecUrl}/${this.operatorName}-spec.js.html`;
- }
-
- get additionalResources() {
- return this.operator.additionalResources || [];
+ get signature() {
+ return this.operator.signature || 'Signature Placeholder';
}
private notfound() {
diff --git a/src/app/operators/operators-routing.module.ts b/src/app/operators/operators-routing.module.ts
index 7f349125..30f24f19 100644
--- a/src/app/operators/operators-routing.module.ts
+++ b/src/app/operators/operators-routing.module.ts
@@ -3,7 +3,9 @@ import { Routes, RouterModule } from '@angular/router';
import { OperatorsComponent } from './operators.component';
import { OperatorComponent } from './components/operator/operator.component';
+import { OperatorGeneralComponent } from './components/operator-general/operator-general.component';
import { ALL_OPERATORS } from '../../operator-docs';
+import { OperatorVendorExamplesComponent } from './components/operator-vendor-examples/operator-vendor-examples.component';
const routes: Routes = [
{
@@ -13,7 +15,17 @@ const routes: Routes = [
children: [
{
path: ':operator',
- component: OperatorComponent
+ component: OperatorComponent,
+ children: [
+ {
+ path: '',
+ component: OperatorGeneralComponent
+ },
+ {
+ path: ':vendor',
+ component: OperatorVendorExamplesComponent
+ }
+ ]
},
{
path: '',
diff --git a/src/app/operators/operators.module.ts b/src/app/operators/operators.module.ts
index c1ff69c0..6906e8c9 100644
--- a/src/app/operators/operators.module.ts
+++ b/src/app/operators/operators.module.ts
@@ -21,6 +21,8 @@ import { OperatorExtrasComponent } from './components/operator-extras/operator-e
import { AdditionalResourcesComponent } from './components/additional-resources/additional-resources.component';
import { MarbleDiagramComponent } from './components/marble-diagram/marble-diagram.component';
import { WalkthroughComponent } from './components/walkthrough/walkthrough.component';
+import { OperatorGeneralComponent } from './components/operator-general/operator-general.component';
+import { OperatorVendorExamplesComponent } from './components/operator-vendor-examples/operator-vendor-examples.component';
import { HighlightJsDirective } from './directives/highlight-js.directive';
import { SafeUrlPipe } from './pipes/safe-url.pipe';
import { MaterialModule } from '../material/material.module';
@@ -32,6 +34,8 @@ import { MaterialModule } from '../material/material.module';
OperatorHeaderComponent,
OperatorParametersComponent,
OperatorExamplesComponent,
+ OperatorGeneralComponent,
+ OperatorVendorExamplesComponent,
RelatedOperatorsComponent,
OperatorExtrasComponent,
AdditionalResourcesComponent,
diff --git a/src/operator-docs/operator.model.ts b/src/operator-docs/operator.model.ts
index 51b95b55..ac53aa15 100644
--- a/src/operator-docs/operator.model.ts
+++ b/src/operator-docs/operator.model.ts
@@ -1,4 +1,5 @@
-export type OperatorType = 'combination'
+export type OperatorType =
+ | 'combination'
| 'conditional'
| 'creation'
| 'error handling'
@@ -14,7 +15,7 @@ export interface OperatorReference {
}
export interface ExternalLink {
- platform: 'JSBin' | 'JSFiddle';
+ platform: 'JSBin' | 'JSFiddle' | 'Stackblitz';
url: string;
}
@@ -27,10 +28,15 @@ export interface OperatorParameters {
export interface OperatorExample {
name: string;
- code: string;
+ code?: string;
externalLink: ExternalLink;
}
+export interface VendorExample extends OperatorExample {
+ vendorName: 'Angular' | 'React';
+ description: string;
+}
+
export interface OperatorExtra {
type: 'Tip' | 'Warning';
text: string;
@@ -45,13 +51,14 @@ export interface OperatorDoc {
readonly parameters?: OperatorParameters[];
readonly shortDescription?: {
description: string;
- extras?: OperatorExtra[]
+ extras?: OperatorExtra[];
};
readonly walkthrough?: {
description: string;
- extras?: OperatorExtra[]
+ extras?: OperatorExtra[];
};
readonly examples?: OperatorExample[];
+ readonly vendorExamples?: VendorExample[];
readonly additionalResources?: OperatorReference[];
readonly relatedOperators?: string[];
}
diff --git a/src/styles.scss b/src/styles.scss
index 507f884f..779e98b9 100644
--- a/src/styles.scss
+++ b/src/styles.scss
@@ -1,6 +1,7 @@
@import '~@angular/material/theming';
@import './app/operators/operator-theme';
@import './styles/code-helpers';
+@import './styles/general';
@import './styles/icons';
@include mat-core();
diff --git a/src/styles/_general.scss b/src/styles/_general.scss
new file mode 100644
index 00000000..501c61ce
--- /dev/null
+++ b/src/styles/_general.scss
@@ -0,0 +1,15 @@
+.margin-bottom-32 {
+ margin-bottom: 32px;
+}
+
+.margin-top-32 {
+ margin-top: 32px;
+}
+
+.margin-top-16 {
+ margin-bottom: 16px;
+}
+
+.margin-bottom-16 {
+ margin-bottom: 16px;
+}
diff --git a/tsconfig.json b/tsconfig.json
index a6c016bf..affc9fc8 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -8,12 +8,7 @@
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es5",
- "typeRoots": [
- "node_modules/@types"
- ],
- "lib": [
- "es2017",
- "dom"
- ]
+ "typeRoots": ["node_modules/@types"],
+ "lib": ["es2017", "dom"]
}
}