From 80fbecaa0cb05dc2d8adceff6ab5a6b50292da91 Mon Sep 17 00:00:00 2001 From: Clemente Raposo Date: Wed, 6 Nov 2024 13:06:51 +0000 Subject: [PATCH] Add record table widget --- .../record-table-widget.component.html | 35 ++++++++ .../record-table-widget.component.ts | 88 +++++++++++++++++++ .../record-table-widget.module.ts | 45 ++++++++++ .../sidebar-widget/sidebar-widget.manifest.ts | 12 ++- 4 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.html create mode 100644 core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.ts create mode 100644 core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.module.ts diff --git a/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.html b/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.html new file mode 100644 index 000000000..a3f0c4686 --- /dev/null +++ b/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.html @@ -0,0 +1,35 @@ + + + +
+
+ +
+
+
diff --git a/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.ts b/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.ts new file mode 100644 index 000000000..49b57eb9d --- /dev/null +++ b/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.component.ts @@ -0,0 +1,88 @@ +/** + * SuiteCRM is a customer relationship management program developed by SalesAgility Ltd. + * Copyright (C) 2024 SalesAgility Ltd. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SALESAGILITY, SALESAGILITY DISCLAIMS THE + * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * In accordance with Section 7(b) of the GNU Affero General Public License + * version 3, these Appropriate Legal Notices must retain the display of the + * "Supercharged by SuiteCRM" logo. If the display of the logos is not reasonably + * feasible for technical reasons, the Appropriate Legal Notices must display + * the words "Supercharged by SuiteCRM". + */ + +import {Component, OnInit, signal, WritableSignal} from '@angular/core'; +import {Observable, Subscription} from 'rxjs'; +import {BaseWidgetComponent} from '../../../widgets/base-widget.model'; +import {LanguageStore} from '../../../../store/language/language.store'; +import {SubpanelStore} from "../../../subpanel/store/subpanel/subpanel.store"; +import {SubpanelStoreFactory} from "../../../subpanel/store/subpanel/subpanel.store.factory"; +import {map, take} from "rxjs/operators"; +import {PanelCollapseMode} from "../../../../components/panel/panel.component"; + +@Component({ + selector: 'record-table-widget', + templateUrl: './record-table-widget.component.html', + styleUrls: [] +}) +export class RecordTableWidgetComponent extends BaseWidgetComponent implements OnInit { + panelHeaderButtonClass: string = 'btn btn-sm btn-outline-main'; + titleLabelKey = 'LBL_INSIGHTS'; + titleKey: WritableSignal = signal(''); + widgetCollapseMode: WritableSignal = signal('none'); + loading$: Observable; + loading = true; + protected subs: Subscription[] = []; + store: SubpanelStore; + + + constructor( + public language: LanguageStore, + protected subpanelFactory: SubpanelStoreFactory + ) { + super(); + } + + ngOnInit(): void { + + const recordTableConfig = this?.config?.options?.recordTable ?? null; + + this.store = this.subpanelFactory.create(); + const parentModule = this.context.module; + const parentRecordId = this.context.id; + const contextRecord$ = this.context$.pipe(map(context => this.context.record)); + this.store.init(parentModule, parentRecordId, recordTableConfig, contextRecord$); + this.store.recordList.setLoading(true); + this.initPanelTitleKey(recordTableConfig); + this.initPanelCollapseMode(); + + this.store.load().pipe(take(1)).subscribe(); + } + + protected initPanelTitleKey(recordTableConfig: any): void { + recordTableConfig.title_key = this?.config?.labelKey ?? recordTableConfig.title_key; + this.titleKey.set(this?.config?.labelKey ?? this.titleLabelKey); + } + + protected initPanelCollapseMode(): void { + let widgetCollapseMode: PanelCollapseMode = 'none'; + if (this?.config?.allowCollapse) { + widgetCollapseMode = 'collapsible'; + } + this.widgetCollapseMode.set(widgetCollapseMode as PanelCollapseMode); + this.store.panelCollapseMode.set(widgetCollapseMode); + } +} diff --git a/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.module.ts b/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.module.ts new file mode 100644 index 000000000..b302b7bdd --- /dev/null +++ b/core/app/core/src/lib/containers/sidebar-widget/components/record-table-widget/record-table-widget.module.ts @@ -0,0 +1,45 @@ +/** + * SuiteCRM is a customer relationship management program developed by SalesAgility Ltd. + * Copyright (C) 2024 SalesAgility Ltd. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SALESAGILITY, SALESAGILITY DISCLAIMS THE + * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * In accordance with Section 7(b) of the GNU Affero General Public License + * version 3, these Appropriate Legal Notices must retain the display of the + * "Supercharged by SuiteCRM" logo. If the display of the logos is not reasonably + * feasible for technical reasons, the Appropriate Legal Notices must display + * the words "Supercharged by SuiteCRM". + */ + +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {RecordTableWidgetComponent} from './record-table-widget.component'; +import {WidgetPanelModule} from '../../../../components/widget-panel/widget-panel.module'; +import {LoadingSpinnerModule} from '../../../../components/loading-spinner/loading-spinner.module'; +import {SubpanelModule} from "../../../subpanel/components/subpanel/subpanel.module"; + +@NgModule({ + declarations: [RecordTableWidgetComponent], + exports: [RecordTableWidgetComponent], + imports: [ + CommonModule, + WidgetPanelModule, + LoadingSpinnerModule, + SubpanelModule + ] +}) +export class RecordTableWidgetModule { +} diff --git a/core/app/core/src/lib/containers/sidebar-widget/components/sidebar-widget/sidebar-widget.manifest.ts b/core/app/core/src/lib/containers/sidebar-widget/components/sidebar-widget/sidebar-widget.manifest.ts index c271b1024..071f1c804 100644 --- a/core/app/core/src/lib/containers/sidebar-widget/components/sidebar-widget/sidebar-widget.manifest.ts +++ b/core/app/core/src/lib/containers/sidebar-widget/components/sidebar-widget/sidebar-widget.manifest.ts @@ -30,17 +30,23 @@ import {HistorySidebarWidgetModule} from '../history-sidebar-widget/history-side import {StatisticsSidebarWidgetComponent} from '../statistics-sidebar-widget/statistics-sidebar-widget.component'; import {ChartSidebarWidgetModule} from '../chart-sidebar-widget/chart-sidebar-widget.module'; import {ChartSidebarWidgetComponent} from '../chart-sidebar-widget/chart-sidebar-widget.component'; -import {RecordThreadSidebarWidgetComponent} from '../record-thread-sidebar-widget/record-thread-sidebar-widget.component'; +import { + RecordThreadSidebarWidgetComponent +} from '../record-thread-sidebar-widget/record-thread-sidebar-widget.component'; +import {RecordTableWidgetComponent} from "../record-table-widget/record-table-widget.component"; +import {RecordTableWidgetModule} from "../record-table-widget/record-table-widget.module"; export const sidebarWidgetModules = [ HistorySidebarWidgetModule, ChartSidebarWidgetModule, - StatisticsSidebarWidgetModule + StatisticsSidebarWidgetModule, + RecordTableWidgetModule ]; export const componentTypeMap = { 'history-timeline': HistorySidebarWidgetComponent, chart: ChartSidebarWidgetComponent, statistics: StatisticsSidebarWidgetComponent, - 'record-thread': RecordThreadSidebarWidgetComponent + 'record-thread': RecordThreadSidebarWidgetComponent, + 'record-table': RecordTableWidgetComponent };