Showing
8 changed files
with
239 additions
and
14 deletions
... | ... | @@ -5140,9 +5140,9 @@ |
5140 | 5140 | "dev": true |
5141 | 5141 | }, |
5142 | 5142 | "handlebars": { |
5143 | - "version": "4.5.1", | |
5144 | - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", | |
5145 | - "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", | |
5143 | + "version": "4.5.2", | |
5144 | + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.2.tgz", | |
5145 | + "integrity": "sha512-29Zxv/cynYB7mkT1rVWQnV7mGX6v7H/miQ6dbEpYTKq5eJBN7PsRB+ViYJlcT6JINTSu4dVB9kOqEun78h6Exg==", | |
5146 | 5146 | "dev": true, |
5147 | 5147 | "requires": { |
5148 | 5148 | "neo-async": "^2.6.0", |
... | ... | @@ -7411,6 +7411,97 @@ |
7411 | 7411 | "resolved": "https://registry.npmjs.org/ngx-color-picker/-/ngx-color-picker-8.2.0.tgz", |
7412 | 7412 | "integrity": "sha512-rzR+cByjNG9M/UskU5vNoH7cUc6oM8STTDFKOZmnlX4ALOuM1+61CBjsNTGETWfo9a/h5mbGX02oh5/iNAa7vA==" |
7413 | 7413 | }, |
7414 | + "ngx-flowchart": { | |
7415 | + "version": "git://github.com/thingsboard/ngx-flowchart.git#d26ee52089a6d9cf8147c5f162144825fceb3009", | |
7416 | + "from": "git://github.com/thingsboard/ngx-flowchart.git#master", | |
7417 | + "requires": { | |
7418 | + "@angular/animations": "~8.0.0", | |
7419 | + "@angular/common": "~8.0.0", | |
7420 | + "@angular/compiler": "~8.0.0", | |
7421 | + "@angular/core": "~8.0.0", | |
7422 | + "@angular/forms": "~8.0.0", | |
7423 | + "@angular/platform-browser": "~8.0.0", | |
7424 | + "@angular/platform-browser-dynamic": "~8.0.0", | |
7425 | + "@angular/router": "~8.0.0", | |
7426 | + "rxjs": "~6.4.0", | |
7427 | + "tslib": "^1.9.0", | |
7428 | + "zone.js": "~0.9.1" | |
7429 | + }, | |
7430 | + "dependencies": { | |
7431 | + "@angular/animations": { | |
7432 | + "version": "8.0.3", | |
7433 | + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.0.3.tgz", | |
7434 | + "integrity": "sha512-9zciJ4YRR0bodFSYgsgXdYMz8wKKyVjch7XZADGkWubXT8mGuwlpdPMlQ6n9Cwj8Ebu0u52WxMeQsX76K9RlYA==", | |
7435 | + "requires": { | |
7436 | + "tslib": "^1.9.0" | |
7437 | + } | |
7438 | + }, | |
7439 | + "@angular/common": { | |
7440 | + "version": "8.0.3", | |
7441 | + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.0.3.tgz", | |
7442 | + "integrity": "sha512-2YLYGVUf9eJZcocRmD3/9UHj4qFHt2t4ftDWJmrFM9zo2PZF+G5O9fASO7qoBbwpx3KFZtQO4dprKl2dFugRjg==", | |
7443 | + "requires": { | |
7444 | + "tslib": "^1.9.0" | |
7445 | + } | |
7446 | + }, | |
7447 | + "@angular/compiler": { | |
7448 | + "version": "8.0.3", | |
7449 | + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.0.3.tgz", | |
7450 | + "integrity": "sha512-1/vF8D6l1O6IfWiDtaj6nC+B8CtkVtFgXgooDzLBO6XAkaCuJCnhKT1HnpWG5GtVsGaY9MGoTl1vE9ZMDbRQjg==", | |
7451 | + "requires": { | |
7452 | + "tslib": "^1.9.0" | |
7453 | + } | |
7454 | + }, | |
7455 | + "@angular/core": { | |
7456 | + "version": "8.0.3", | |
7457 | + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.0.3.tgz", | |
7458 | + "integrity": "sha512-IIxrtIPNuv2+HudER9J1nmPGiGJ4aRpeiFM9V4lSiSFv50RzuaoG60XqYIpUyuBdgvyKigcrfSbu9+x1vyN0hw==", | |
7459 | + "requires": { | |
7460 | + "tslib": "^1.9.0" | |
7461 | + } | |
7462 | + }, | |
7463 | + "@angular/forms": { | |
7464 | + "version": "8.0.3", | |
7465 | + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.0.3.tgz", | |
7466 | + "integrity": "sha512-22s82QDRQ72K4vMYuNh3NAN+da9uanwoydnfKlp2rb9dZAb2QVX9NN6gSoMrkSSr2O9KTP6pWiw6A3/MW8sGRA==", | |
7467 | + "requires": { | |
7468 | + "tslib": "^1.9.0" | |
7469 | + } | |
7470 | + }, | |
7471 | + "@angular/platform-browser": { | |
7472 | + "version": "8.0.3", | |
7473 | + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.0.3.tgz", | |
7474 | + "integrity": "sha512-ceAPP2Ijmk2sZ1rnOU/WNlE3DtT6K6ljpjO9oUfXKMoSMdWirJKAraT3m/BAzmYwMSXpPBxA7c3paZjiLL6t5A==", | |
7475 | + "requires": { | |
7476 | + "tslib": "^1.9.0" | |
7477 | + } | |
7478 | + }, | |
7479 | + "@angular/platform-browser-dynamic": { | |
7480 | + "version": "8.0.3", | |
7481 | + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.0.3.tgz", | |
7482 | + "integrity": "sha512-ZjQjSYslSQAKzM4llvyMFxnSjFpbhT1U9FOdKwscPe475zAKX0087qsHrP2CRwkJRfwtdcmj9wMUQIPlzMpHLA==", | |
7483 | + "requires": { | |
7484 | + "tslib": "^1.9.0" | |
7485 | + } | |
7486 | + }, | |
7487 | + "@angular/router": { | |
7488 | + "version": "8.0.3", | |
7489 | + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.0.3.tgz", | |
7490 | + "integrity": "sha512-CU5pLTfQVUnTN93mdIKJrVjXiNldUkk30DPz4lpdxpZjYOqFGXeeSeQWmToHSofLPodNcAB4kkZ41VyXvlBu7w==", | |
7491 | + "requires": { | |
7492 | + "tslib": "^1.9.0" | |
7493 | + } | |
7494 | + }, | |
7495 | + "rxjs": { | |
7496 | + "version": "6.4.0", | |
7497 | + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", | |
7498 | + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", | |
7499 | + "requires": { | |
7500 | + "tslib": "^1.9.0" | |
7501 | + } | |
7502 | + } | |
7503 | + } | |
7504 | + }, | |
7414 | 7505 | "ngx-hm-carousel": { |
7415 | 7506 | "version": "1.7.2", |
7416 | 7507 | "resolved": "https://registry.npmjs.org/ngx-hm-carousel/-/ngx-hm-carousel-1.7.2.tgz", |
... | ... | @@ -10796,9 +10887,9 @@ |
10796 | 10887 | "dev": true |
10797 | 10888 | }, |
10798 | 10889 | "uglify-js": { |
10799 | - "version": "3.6.8", | |
10800 | - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.8.tgz", | |
10801 | - "integrity": "sha512-XhHJ3S3ZyMwP8kY1Gkugqx3CJh2C3O0y8NPiSxtm1tyD/pktLAkFZsFGpuNfTZddKDQ/bbDBLAd2YyA1pbi8HQ==", | |
10890 | + "version": "3.6.9", | |
10891 | + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz", | |
10892 | + "integrity": "sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==", | |
10802 | 10893 | "dev": true, |
10803 | 10894 | "optional": true, |
10804 | 10895 | "requires": { | ... | ... |
... | ... | @@ -59,6 +59,7 @@ |
59 | 59 | "moment": "^2.24.0", |
60 | 60 | "ngx-clipboard": "^12.2.0", |
61 | 61 | "ngx-color-picker": "^8.2.0", |
62 | + "ngx-flowchart": "git://github.com/thingsboard/ngx-flowchart.git#master", | |
62 | 63 | "ngx-hm-carousel": "^1.7.2", |
63 | 64 | "ngx-translate-messageformat-compiler": "^4.5.0", |
64 | 65 | "objectpath": "^1.2.2", | ... | ... |
1 | +<!-- | |
2 | + | |
3 | + Copyright © 2016-2019 The Thingsboard Authors | |
4 | + | |
5 | + Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | + you may not use this file except in compliance with the License. | |
7 | + You may obtain a copy of the License at | |
8 | + | |
9 | + http://www.apache.org/licenses/LICENSE-2.0 | |
10 | + | |
11 | + Unless required by applicable law or agreed to in writing, software | |
12 | + distributed under the License is distributed on an "AS IS" BASIS, | |
13 | + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | + See the License for the specific language governing permissions and | |
15 | + limitations under the License. | |
16 | + | |
17 | +--> | |
18 | +<div>Rule chain</div> | |
19 | +<fc-canvas></fc-canvas> | ... | ... |
1 | +/// | |
2 | +/// Copyright © 2016-2019 The Thingsboard Authors | |
3 | +/// | |
4 | +/// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | +/// you may not use this file except in compliance with the License. | |
6 | +/// You may obtain a copy of the License at | |
7 | +/// | |
8 | +/// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | +/// | |
10 | +/// Unless required by applicable law or agreed to in writing, software | |
11 | +/// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | +/// See the License for the specific language governing permissions and | |
14 | +/// limitations under the License. | |
15 | +/// | |
16 | + | |
17 | +import {Component, OnInit} from '@angular/core'; | |
18 | +import {UserService} from '@core/http/user.service'; | |
19 | +import {User} from '@shared/models/user.model'; | |
20 | +import {Authority} from '@shared/models/authority.enum'; | |
21 | +import {PageComponent} from '@shared/components/page.component'; | |
22 | +import {Store} from '@ngrx/store'; | |
23 | +import {AppState} from '@core/core.state'; | |
24 | +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; | |
25 | +import {HasConfirmForm} from '@core/guards/confirm-on-exit.guard'; | |
26 | +import {ActionAuthUpdateUserDetails} from '@core/auth/auth.actions'; | |
27 | +import {environment as env} from '@env/environment'; | |
28 | +import {TranslateService} from '@ngx-translate/core'; | |
29 | +import {ActionSettingsChangeLanguage} from '@core/settings/settings.actions'; | |
30 | +import {ChangePasswordDialogComponent} from '@modules/home/pages/profile/change-password-dialog.component'; | |
31 | +import {MatDialog} from '@angular/material'; | |
32 | +import {DialogService} from '@core/services/dialog.service'; | |
33 | +import {AuthService} from '@core/auth/auth.service'; | |
34 | +import {ActivatedRoute} from '@angular/router'; | |
35 | +import { Dashboard } from '@shared/models/dashboard.models'; | |
36 | +import { RuleChain } from '@shared/models/rule-chain.models'; | |
37 | + | |
38 | +@Component({ | |
39 | + selector: 'tb-rulechain-page', | |
40 | + templateUrl: './rulechain-page.component.html', | |
41 | + styleUrls: [] | |
42 | +}) | |
43 | +export class RuleChainPageComponent extends PageComponent implements OnInit { | |
44 | + | |
45 | + ruleChain: RuleChain; | |
46 | + | |
47 | + constructor(protected store: Store<AppState>, | |
48 | + private route: ActivatedRoute, | |
49 | + private userService: UserService, | |
50 | + private authService: AuthService, | |
51 | + private translate: TranslateService, | |
52 | + public dialog: MatDialog, | |
53 | + public dialogService: DialogService, | |
54 | + public fb: FormBuilder) { | |
55 | + super(store); | |
56 | + } | |
57 | + | |
58 | + ngOnInit() { | |
59 | + this.ruleChain = this.route.snapshot.data.ruleChain; | |
60 | + } | |
61 | + | |
62 | +} | ... | ... |
... | ... | @@ -14,12 +14,44 @@ |
14 | 14 | /// limitations under the License. |
15 | 15 | /// |
16 | 16 | |
17 | -import {NgModule} from '@angular/core'; | |
18 | -import {RouterModule, Routes} from '@angular/router'; | |
17 | +import { Injectable, NgModule } from '@angular/core'; | |
18 | +import { ActivatedRouteSnapshot, Resolve, RouterModule, Routes } from '@angular/router'; | |
19 | 19 | |
20 | 20 | import {EntitiesTableComponent} from '../../components/entity/entities-table.component'; |
21 | 21 | import {Authority} from '@shared/models/authority.enum'; |
22 | 22 | import {RuleChainsTableConfigResolver} from '@modules/home/pages/rulechain/rulechains-table-config.resolver'; |
23 | +import { Dashboard } from '@shared/models/dashboard.models'; | |
24 | +import { DashboardService } from '@core/http/dashboard.service'; | |
25 | +import { DashboardUtilsService } from '@core/services/dashboard-utils.service'; | |
26 | +import { Observable } from 'rxjs'; | |
27 | +import { map } from 'rxjs/operators'; | |
28 | +import { BreadCrumbConfig, BreadCrumbLabelFunction } from '@shared/components/breadcrumb'; | |
29 | +import { RuleChain } from '@shared/models/rule-chain.models'; | |
30 | +import { RuleChainService } from '@core/http/rule-chain.service'; | |
31 | +import { DashboardPageComponent } from '@home/pages/dashboard/dashboard-page.component'; | |
32 | +import { dashboardBreadcumbLabelFunction, DashboardResolver } from '@home/pages/dashboard/dashboard-routing.module'; | |
33 | +import { RuleChainPageComponent } from '@home/pages/rulechain/rulechain-page.component'; | |
34 | + | |
35 | + | |
36 | +@Injectable() | |
37 | +export class RuleChainResolver implements Resolve<RuleChain> { | |
38 | + | |
39 | + constructor(private ruleChainService: RuleChainService) { | |
40 | + } | |
41 | + | |
42 | + resolve(route: ActivatedRouteSnapshot): Observable<RuleChain> { | |
43 | + const ruleChainId = route.params.ruleChainId; | |
44 | + return this.ruleChainService.getRuleChain(ruleChainId); | |
45 | + } | |
46 | +} | |
47 | + | |
48 | +export const ruleChainBreadcumbLabelFunction: BreadCrumbLabelFunction = ((route, translate, component) => { | |
49 | + let label: string = component.ruleChain.name; | |
50 | + if (component.ruleChain.root) { | |
51 | + label += ` (${translate.instant('rulechain.root')})`; | |
52 | + } | |
53 | + return label; | |
54 | +}); | |
23 | 55 | |
24 | 56 | const routes: Routes = [ |
25 | 57 | { |
... | ... | @@ -41,6 +73,22 @@ const routes: Routes = [ |
41 | 73 | resolve: { |
42 | 74 | entitiesTableConfig: RuleChainsTableConfigResolver |
43 | 75 | } |
76 | + }, | |
77 | + { | |
78 | + path: ':ruleChainId', | |
79 | + component: RuleChainPageComponent, | |
80 | + data: { | |
81 | + breadcrumb: { | |
82 | + labelFunction: ruleChainBreadcumbLabelFunction, | |
83 | + icon: 'settings_ethernet' | |
84 | + } as BreadCrumbConfig, | |
85 | + auth: [Authority.TENANT_ADMIN], | |
86 | + title: 'rulechain.rulechain', | |
87 | + widgetEditMode: false | |
88 | + }, | |
89 | + resolve: { | |
90 | + ruleChain: RuleChainResolver | |
91 | + } | |
44 | 92 | } |
45 | 93 | ] |
46 | 94 | } |
... | ... | @@ -50,7 +98,8 @@ const routes: Routes = [ |
50 | 98 | imports: [RouterModule.forChild(routes)], |
51 | 99 | exports: [RouterModule], |
52 | 100 | providers: [ |
53 | - RuleChainsTableConfigResolver | |
101 | + RuleChainsTableConfigResolver, | |
102 | + RuleChainResolver | |
54 | 103 | ] |
55 | 104 | }) |
56 | 105 | export class RuleChainRoutingModule { } | ... | ... |
... | ... | @@ -21,6 +21,7 @@ import {RuleChainComponent} from '@modules/home/pages/rulechain/rulechain.compon |
21 | 21 | import {RuleChainRoutingModule} from '@modules/home/pages/rulechain/rulechain-routing.module'; |
22 | 22 | import {HomeComponentsModule} from '@modules/home/components/home-components.module'; |
23 | 23 | import { RuleChainTabsComponent } from '@home/pages/rulechain/rulechain-tabs.component'; |
24 | +import { RuleChainPageComponent } from './rulechain-page.component'; | |
24 | 25 | |
25 | 26 | @NgModule({ |
26 | 27 | entryComponents: [ |
... | ... | @@ -29,7 +30,8 @@ import { RuleChainTabsComponent } from '@home/pages/rulechain/rulechain-tabs.com |
29 | 30 | ], |
30 | 31 | declarations: [ |
31 | 32 | RuleChainComponent, |
32 | - RuleChainTabsComponent | |
33 | + RuleChainTabsComponent, | |
34 | + RuleChainPageComponent | |
33 | 35 | ], |
34 | 36 | imports: [ |
35 | 37 | CommonModule, | ... | ... |
... | ... | @@ -128,9 +128,7 @@ export class RuleChainsTableConfigResolver implements Resolve<EntityTableConfig< |
128 | 128 | if ($event) { |
129 | 129 | $event.stopPropagation(); |
130 | 130 | } |
131 | - // TODO: | |
132 | - // this.router.navigateByUrl(`customers/${customer.id.id}/users`); | |
133 | - this.dialogService.todo(); | |
131 | + this.router.navigateByUrl(`ruleChains/${ruleChain.id.id}`); | |
134 | 132 | } |
135 | 133 | |
136 | 134 | exportRuleChain($event: Event, ruleChain: RuleChain) { | ... | ... |
... | ... | @@ -21,6 +21,7 @@ import { LogoComponent } from './components/logo.component'; |
21 | 21 | import { TbSnackBarComponent, ToastDirective } from './components/toast.directive'; |
22 | 22 | import { BreadcrumbComponent } from '@app/shared/components/breadcrumb.component'; |
23 | 23 | import { NgxFlowModule, FlowInjectionToken } from '@flowjs/ngx-flow'; |
24 | +import { NgxFlowchartModule } from 'ngx-flowchart/dist/ngx-flowchart'; | |
24 | 25 | import Flow from '@flowjs/flow.js'; |
25 | 26 | |
26 | 27 | import { |
... | ... | @@ -235,7 +236,8 @@ import { FileInputComponent } from './components/file-input.component'; |
235 | 236 | HotkeyModule, |
236 | 237 | ColorPickerModule, |
237 | 238 | NgxHmCarouselModule, |
238 | - NgxFlowModule | |
239 | + NgxFlowModule, | |
240 | + NgxFlowchartModule | |
239 | 241 | ], |
240 | 242 | exports: [ |
241 | 243 | FooterComponent, |
... | ... | @@ -317,6 +319,7 @@ import { FileInputComponent } from './components/file-input.component'; |
317 | 319 | HotkeyModule, |
318 | 320 | ColorPickerModule, |
319 | 321 | NgxHmCarouselModule, |
322 | + NgxFlowchartModule, | |
320 | 323 | ColorPickerDialogComponent, |
321 | 324 | MaterialIconsDialogComponent, |
322 | 325 | ColorInputComponent, | ... | ... |