diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.html
new file mode 100644
index 0000000000..92e46e8cf0
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.html
@@ -0,0 +1,33 @@
+
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.scss
new file mode 100644
index 0000000000..da03a5e40b
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.scss
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+:host {
+ .tb-add-doc-link-dialog {
+ width: 480px;
+ .mat-toolbar-single-row {
+ padding: 0 24px;
+ }
+ h2 {
+ color: rgba(0, 0, 0, 0.76);
+ }
+ .mat-icon {
+ color: rgba(0, 0, 0, 0.54);
+ }
+ }
+}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.ts
new file mode 100644
index 0000000000..8a7413b7dd
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.ts
@@ -0,0 +1,58 @@
+///
+/// Copyright © 2016-2023 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { Component, OnInit, SkipSelf } from '@angular/core';
+import { ErrorStateMatcher } from '@angular/material/core';
+import { MatDialogRef } from '@angular/material/dialog';
+import { Store } from '@ngrx/store';
+import { AppState } from '@core/core.state';
+import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
+import { DialogComponent } from '@shared/components/dialog.component';
+import { Router } from '@angular/router';
+import { DocumentationLink } from '@shared/models/user-settings.models';
+
+@Component({
+ selector: 'tb-add-doc-link-dialog',
+ templateUrl: './add-doc-link-dialog.component.html',
+ styleUrls: ['./add-doc-link-dialog.component.scss']
+})
+export class AddDocLinkDialogComponent extends
+ DialogComponent implements OnInit {
+
+ addDocLinkFormGroup: UntypedFormGroup;
+
+ constructor(protected store: Store,
+ protected router: Router,
+ @SkipSelf() private errorStateMatcher: ErrorStateMatcher,
+ public dialogRef: MatDialogRef,
+ public fb: UntypedFormBuilder) {
+ super(store, router, dialogRef);
+ }
+
+ ngOnInit(): void {
+ this.addDocLinkFormGroup = this.fb.group({
+ docLink: [{ icon: 'notifications' }, [Validators.required]]
+ });
+ }
+
+ cancel(): void {
+ this.dialogRef.close(null);
+ }
+
+ add(docLink: DocumentationLink): void {
+ this.dialogRef.close(docLink);
+ }
+}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.html
new file mode 100644
index 0000000000..a26b38f711
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+ Name
+
+
+ Name is required.
+
+
+
+ Link
+
+
+ Link is required.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ docLink.icon }}
+
+
{{ docLink.name }}
+
+
+
+
+
+
+
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.scss
new file mode 100644
index 0000000000..c933a2b1b2
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.scss
@@ -0,0 +1,61 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+:host {
+ .tb-edit-doc-link {
+ padding: 16px;
+ border: 1px solid rgba(0, 0, 0, 0.05);
+ box-shadow: 0 5px 16px rgba(0, 0, 0, 0.04);
+ border-radius: 10px;
+ &.edit-mode {
+ border: 1px solid rgba(48, 86, 128, 0.32);
+ }
+ }
+ .tb-doc-link {
+ height: 52px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: 12px;
+ background: #FFFFFF;
+ border: 1px solid rgba(0, 0, 0, 0.05);
+ box-shadow: 0 5px 16px rgba(0, 0, 0, 0.04);
+ border-radius: 10px;
+ .tb-doc-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ .tb-doc-icon-container {
+ height: 40px;
+ padding: 8px;
+ background: #F3F6FA;
+ border-radius: 6px;
+ margin-right: 8px;
+ }
+ .tb-doc-text {
+ font-weight: 400;
+ font-size: 14px;
+ line-height: 20px;
+ letter-spacing: 0.2px;
+ color: rgba(0, 0, 0, 0.87);
+ }
+ }
+ }
+ .tb-edit-buttons {
+ .mat-icon {
+ color: rgba(0, 0, 0, 0.38);
+ }
+ }
+}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.ts
new file mode 100644
index 0000000000..488330cf0d
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.ts
@@ -0,0 +1,190 @@
+///
+/// Copyright © 2016-2023 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { Component, EventEmitter, forwardRef, Input, OnInit, Output, SkipSelf } from '@angular/core';
+import {
+ ControlValueAccessor, FormGroupDirective,
+ NG_VALUE_ACCESSOR, NgForm,
+ UntypedFormBuilder, UntypedFormControl,
+ UntypedFormGroup,
+ Validators
+} from '@angular/forms';
+import { PageComponent } from '@shared/components/page.component';
+import { Store } from '@ngrx/store';
+import { AppState } from '@core/core.state';
+import { DocumentationLink } from '@shared/models/user-settings.models';
+import { ErrorStateMatcher } from '@angular/material/core';
+
+@Component({
+ selector: 'tb-doc-link',
+ templateUrl: './doc-link.component.html',
+ styleUrls: ['./doc-link.component.scss'],
+ providers: [
+ {
+ provide: NG_VALUE_ACCESSOR,
+ useExisting: forwardRef(() => DocLinkComponent),
+ multi: true
+ },
+ {provide: ErrorStateMatcher, useExisting: DocLinkComponent}
+ ]
+})
+export class DocLinkComponent extends PageComponent implements OnInit, ControlValueAccessor, ErrorStateMatcher {
+
+ @Input()
+ disabled: boolean;
+
+ @Input()
+ addOnly = false;
+
+ @Input()
+ disableEdit = false;
+
+ @Output()
+ docLinkAdded = new EventEmitter();
+
+ @Output()
+ docLinkAddCanceled = new EventEmitter();
+
+ @Output()
+ docLinkUpdated = new EventEmitter();
+
+ @Output()
+ docLinkDeleted = new EventEmitter();
+
+ @Output()
+ editModeChanged = new EventEmitter();
+
+ editMode = false;
+ addMode = false;
+
+ docLink: DocumentationLink;
+
+ private propagateChange = null;
+
+ public editDocLinkFormGroup: UntypedFormGroup;
+
+ private submitted = false;
+
+ constructor(protected store: Store,
+ private fb: UntypedFormBuilder,
+ @SkipSelf() private errorStateMatcher: ErrorStateMatcher) {
+ super(store);
+ }
+
+ ngOnInit(): void {
+ this.addMode = this.addOnly;
+ this.editDocLinkFormGroup = this.fb.group({
+ icon: [null, [Validators.required]],
+ name: [null, [Validators.required]],
+ link: [null, [Validators.required]]
+ });
+ }
+
+ isErrorState(control: UntypedFormControl | null, form: FormGroupDirective | NgForm | null): boolean {
+ const originalErrorState = this.errorStateMatcher.isErrorState(control, form);
+ const customErrorState = !!(control && control.invalid && this.submitted);
+ return originalErrorState || customErrorState;
+ }
+
+ registerOnChange(fn: any): void {
+ this.propagateChange = fn;
+ }
+
+ registerOnTouched(fn: any): void {
+ }
+
+ setDisabledState(isDisabled: boolean): void {
+ this.disabled = isDisabled;
+ if (isDisabled) {
+ this.editDocLinkFormGroup.disable({emitEvent: false});
+ } else {
+ this.editDocLinkFormGroup.enable({emitEvent: false});
+ }
+ }
+
+ writeValue(value: DocumentationLink): void {
+ this.docLink = value;
+ this.editDocLinkFormGroup.patchValue(
+ value, {emitEvent: false}
+ );
+ if (!this.editDocLinkFormGroup.valid) {
+ this.addMode = true;
+ this.editModeChanged.emit(true);
+ }
+ }
+
+ switchToEditMode() {
+ if (!this.disableEdit && !this.editMode) {
+ this.submitted = false;
+ this.editDocLinkFormGroup.patchValue(
+ this.docLink, {emitEvent: false}
+ );
+ this.editMode = true;
+ this.editModeChanged.emit(true);
+ }
+ }
+
+ apply() {
+ this.submitted = true;
+ this.updateModel();
+ if (this.editDocLinkFormGroup.valid) {
+ this.editMode = false;
+ this.editModeChanged.emit(false);
+ this.docLinkUpdated.next(this.editDocLinkFormGroup.value);
+ }
+ }
+
+ cancelEdit() {
+ this.submitted = false;
+ this.editMode = false;
+ this.editModeChanged.emit(false);
+ }
+
+ add() {
+ this.submitted = true;
+ this.updateModel();
+ if (this.editDocLinkFormGroup.valid) {
+ if (!this.addOnly) {
+ this.addMode = false;
+ this.editModeChanged.emit(false);
+ }
+ this.docLinkAdded.next(this.editDocLinkFormGroup.value);
+ }
+ }
+
+ cancelAdd() {
+ this.editModeChanged.emit(false);
+ this.docLinkAddCanceled.emit();
+ }
+
+ delete() {
+ this.docLinkDeleted.emit();
+ }
+
+ isEditing() {
+ return this.editMode || this.addMode;
+ }
+
+ private updateModel() {
+ if (this.editDocLinkFormGroup.valid) {
+ this.docLink = this.editDocLinkFormGroup.value;
+ this.propagateChange(this.editDocLinkFormGroup.value);
+ } else {
+ this.propagateChange(null);
+ }
+ }
+
+}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts
index 5b4ab7556f..a3b33c914e 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts
@@ -20,10 +20,20 @@ import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state';
import { Authority } from '@shared/models/authority.enum';
import { map } from 'rxjs';
-import { DocumentationLinks } from '@shared/models/user-settings.models';
+import { DocumentationLink, DocumentationLinks } from '@shared/models/user-settings.models';
import { UserSettingsService } from '@core/http/user-settings.service';
import { getCurrentAuthUser } from '@core/auth/auth.selectors';
import { WidgetContext } from '@home/models/widget-component.models';
+import {
+ ImportDialogCsvComponent,
+ ImportDialogCsvData
+} from '@home/components/import-export/import-dialog-csv.component';
+import { MatDialog } from '@angular/material/dialog';
+import { AddDocLinkDialogComponent } from '@home/components/widget/lib/home-page/add-doc-link-dialog.component';
+import {
+ EditDocLinksDialogComponent,
+ EditDocLinksDialogData
+} from '@home/components/widget/lib/home-page/edit-doc-links-dialog.component';
const defaultDocLinksMap = new Map(
[
@@ -103,13 +113,18 @@ export class DocLinksWidgetComponent extends PageComponent implements OnInit {
constructor(protected store: Store,
private cd: ChangeDetectorRef,
- private userSettingsService: UserSettingsService) {
+ private userSettingsService: UserSettingsService,
+ private dialog: MatDialog) {
super(store);
}
ngOnInit() {
this.settings = this.ctx.settings;
this.columns = this.settings.columns || 3;
+ this.loadDocLinks();
+ }
+
+ private loadDocLinks() {
this.userSettingsService.getDocumentationLinks().pipe(
map((documentationLinks) => {
if (!documentationLinks || !documentationLinks.links) {
@@ -127,10 +142,35 @@ export class DocLinksWidgetComponent extends PageComponent implements OnInit {
}
edit() {
-
+ this.dialog.open(EditDocLinksDialogComponent, {
+ disableClose: true,
+ autoFocus: false,
+ data: {
+ docLinks: this.documentationLinks
+ },
+ panelClass: ['tb-dialog', 'tb-fullscreen-dialog']
+ }).afterClosed().subscribe(
+ (result) => {
+ if (result) {
+ this.loadDocLinks();
+ }
+ });
}
addLink() {
-
+ this.dialog.open(AddDocLinkDialogComponent, {
+ disableClose: true,
+ autoFocus: false,
+ panelClass: ['tb-dialog', 'tb-fullscreen-dialog']
+ }).afterClosed().subscribe(
+ (docLink) => {
+ if (docLink) {
+ this.documentationLinks.links.push(docLink);
+ this.cd.markForCheck();
+ this.userSettingsService.updateDocumentationLinks(this.documentationLinks).subscribe();
+ }
+ });
}
}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.html
new file mode 100644
index 0000000000..68127a8d46
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.html
@@ -0,0 +1,63 @@
+
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.scss
new file mode 100644
index 0000000000..dd5db4d9e8
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.scss
@@ -0,0 +1,62 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+:host {
+ .tb-edit-doc-links-dialog {
+ width: 480px;
+ .mat-toolbar-single-row {
+ padding: 0 24px;
+ }
+ h2 {
+ color: rgba(0, 0, 0, 0.76);
+ }
+ .mat-icon {
+ color: rgba(0, 0, 0, 0.54);
+ }
+ .mat-mdc-dialog-content {
+ padding: 24px 24px 8px 24px;
+ }
+ .mdc-dialog__actions {
+ padding: 0 24px 24px;
+ }
+ }
+ .tb-drag-handle {
+ height: 24px;
+ margin-left: 12px;
+ .mat-icon {
+ color: rgba(0, 0, 0, 0.38);
+ }
+ }
+ .tb-add-doc-button {
+ height: 52px;
+ cursor: pointer;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ background: #FFFFFF;
+ padding: 12px;
+ border: 2px dashed rgba(0, 0, 0, 0.08);
+ border-radius: 10px;
+ .tb-add-icon {
+ color: rgba(0, 0, 0, 0.12);
+ }
+ &:hover {
+ .tb-add-icon {
+ color: rgba(0, 0, 0, 0.38);
+ }
+ }
+ }
+}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.ts
new file mode 100644
index 0000000000..eca41713c4
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-doc-links-dialog.component.ts
@@ -0,0 +1,114 @@
+///
+/// Copyright © 2016-2023 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { Component, Inject, OnInit } from '@angular/core';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { Store } from '@ngrx/store';
+import { AppState } from '@core/core.state';
+import { AbstractControl, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
+import { DialogComponent } from '@shared/components/dialog.component';
+import { Router } from '@angular/router';
+import { DocumentationLink, DocumentationLinks } from '@shared/models/user-settings.models';
+import { CdkDragDrop } from '@angular/cdk/drag-drop';
+import { UserSettingsService } from '@core/http/user-settings.service';
+
+export interface EditDocLinksDialogData {
+ docLinks: DocumentationLinks;
+}
+
+@Component({
+ selector: 'tb-edit-doc-links-dialog',
+ templateUrl: './edit-doc-links-dialog.component.html',
+ styleUrls: ['./edit-doc-links-dialog.component.scss']
+})
+export class EditDocLinksDialogComponent extends
+ DialogComponent implements OnInit {
+
+ updated = false;
+ addMode = false;
+ editMode = false;
+
+ docLinks = this.data.docLinks;
+ addingDocLink: Partial;
+
+ editDocLinksFormGroup: UntypedFormGroup;
+
+ constructor(protected store: Store,
+ protected router: Router,
+ @Inject(MAT_DIALOG_DATA) public data: EditDocLinksDialogData,
+ public dialogRef: MatDialogRef,
+ public fb: UntypedFormBuilder,
+ private userSettingsService: UserSettingsService) {
+ super(store, router, dialogRef);
+ }
+
+ ngOnInit(): void {
+ const docLinksControls: Array = [];
+ for (const docLink of this.docLinks.links) {
+ docLinksControls.push(this.fb.control(docLink, [Validators.required]));
+ }
+ this.editDocLinksFormGroup = this.fb.group({
+ links: this.fb.array(docLinksControls)
+ });
+ }
+
+ docLinksFormArray(): UntypedFormArray {
+ return this.editDocLinksFormGroup.get('links') as UntypedFormArray;
+ }
+
+ trackByDocLink(index: number, docLinkControl: AbstractControl): any {
+ return docLinkControl;
+ }
+
+ docLinkDrop(event: CdkDragDrop) {
+ const docLinksArray = this.editDocLinksFormGroup.get('links') as UntypedFormArray;
+ const docLink = docLinksArray.at(event.previousIndex);
+ docLinksArray.removeAt(event.previousIndex);
+ docLinksArray.insert(event.currentIndex, docLink);
+ this.update();
+ }
+
+ addLink() {
+ this.addingDocLink = { icon: 'notifications' };
+ this.addMode = true;
+ }
+
+ linkAdded(docLink: DocumentationLink) {
+ this.addMode = false;
+ const docLinksArray = this.editDocLinksFormGroup.get('links') as UntypedFormArray;
+ const docLinkControl = this.fb.control(docLink, [Validators.required]);
+ docLinksArray.push(docLinkControl);
+ this.update();
+ }
+
+ deleteLink(index: number) {
+ (this.editDocLinksFormGroup.get('links') as UntypedFormArray).removeAt(index);
+ this.update();
+ }
+
+ update() {
+ if (this.editDocLinksFormGroup.valid) {
+ const docLinks: DocumentationLinks = this.editDocLinksFormGroup.value;
+ this.userSettingsService.updateDocumentationLinks(docLinks).subscribe(() => {
+ this.updated = true;
+ });
+ }
+ }
+
+ close(): void {
+ this.dialogRef.close(this.updated);
+ }
+}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/home-page-widgets.module.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/home-page-widgets.module.ts
index feea87a664..b485e1adf0 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/home-page-widgets.module.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/home-page-widgets.module.ts
@@ -21,6 +21,9 @@ import { ClusterInfoTableComponent } from '@home/components/widget/lib/home-page
import { ConfiguredFeaturesComponent } from '@home/components/widget/lib/home-page/configured-features.component';
import { VersionInfoComponent } from '@home/components/widget/lib/home-page/version-info.component';
import { DocLinksWidgetComponent } from '@home/components/widget/lib/home-page/doc-links-widget.component';
+import { DocLinkComponent } from '@home/components/widget/lib/home-page/doc-link.component';
+import { AddDocLinkDialogComponent } from '@home/components/widget/lib/home-page/add-doc-link-dialog.component';
+import { EditDocLinksDialogComponent } from '@home/components/widget/lib/home-page/edit-doc-links-dialog.component';
@NgModule({
declarations:
@@ -28,7 +31,10 @@ import { DocLinksWidgetComponent } from '@home/components/widget/lib/home-page/d
ClusterInfoTableComponent,
ConfiguredFeaturesComponent,
VersionInfoComponent,
- DocLinksWidgetComponent
+ DocLinksWidgetComponent,
+ DocLinkComponent,
+ AddDocLinkDialogComponent,
+ EditDocLinksDialogComponent
],
imports: [
CommonModule,
@@ -38,7 +44,10 @@ import { DocLinksWidgetComponent } from '@home/components/widget/lib/home-page/d
ClusterInfoTableComponent,
ConfiguredFeaturesComponent,
VersionInfoComponent,
- DocLinksWidgetComponent
+ DocLinksWidgetComponent,
+ DocLinkComponent,
+ AddDocLinkDialogComponent,
+ EditDocLinksDialogComponent
]
})
export class HomePageWidgetsModule { }