+ @if (showData) {
+
+
+ search
+
+
+
+
+
+
+
+ | Type |
+
+ {{ edit.productType }}
+ |
+
+
+
+ Product |
+ {{ edit.savingsProductName }} |
+
+
+
+ Submitted By |
+ {{ edit.makerUsername }} |
+
+
+
+ Submitted On |
+ {{ formatDate(edit.createdOn) }} |
+
+
+
+ Status |
+
+ {{ edit.status }}
+ |
+
+
+
+ Actions |
+
+
+
+
+ |
+
+
+
+
+
+
+
+ @if (selectedEdit) {
+
+
+ @if (diffRows.length === 0) {
+
Loading comparison…
+ } @else {
+
+
+
+ | Field |
+ Original |
+ Proposed |
+
+
+
+ @for (row of diffRows; track row.label) {
+
+ | {{ row.label }} |
+ {{ row.original }} |
+ {{ row.proposed }} |
+
+ }
+
+
+ }
+
+ }
+ }
+
+ @if (!showData) {
+
+
+
No pending savings product edits
+
There are no savings product edits awaiting approval at this time.
+
+ }
+
diff --git a/src/app/tasks/checker-inbox-and-tasks-tabs/pending-savings-products/pending-savings-products.component.scss b/src/app/tasks/checker-inbox-and-tasks-tabs/pending-savings-products/pending-savings-products.component.scss
new file mode 100644
index 000000000..892bb22f2
--- /dev/null
+++ b/src/app/tasks/checker-inbox-and-tasks-tabs/pending-savings-products/pending-savings-products.component.scss
@@ -0,0 +1,180 @@
+/**
+ * Copyright since 2025 Mifos Initiative
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+$border: #e2e8f0;
+$text-muted: #64748b;
+
+.psp-tab-content {
+ padding: 16px 0;
+}
+
+.psp-action-bar {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 16px;
+ flex-wrap: wrap;
+}
+
+.psp-search-field {
+ flex: 1;
+ min-width: 200px;
+ max-width: 320px;
+}
+
+.psp-btn {
+ font-size: 11.5px;
+ font-weight: 600;
+ border-radius: 8px !important;
+ height: 32px;
+ padding: 0 10px;
+ margin-right: 6px;
+
+ fa-icon {
+ margin-right: 4px;
+ font-size: 11px;
+ }
+}
+
+.psp-btn-view {
+ border-color: #2563eb;
+ color: #2563eb;
+
+ &:hover {
+ background: #eff6ff;
+ }
+}
+
+.psp-btn-approve {
+ border-color: #16a34a;
+ color: #16a34a;
+
+ &:hover {
+ background: #f0fdf4;
+ }
+}
+
+.psp-btn-reject {
+ border-color: #dc2626;
+ color: #dc2626;
+
+ &:hover {
+ background: #fef2f2;
+ }
+}
+
+.status-badge {
+ display: inline-flex;
+ align-items: center;
+ padding: 2px 10px;
+ border-radius: 20px;
+ font-size: 11px;
+ font-weight: 600;
+
+ &--pending {
+ background: #fef9c3;
+ color: #854d0e;
+ }
+
+ &--type {
+ background: #e0e7ff;
+ color: #3730a3;
+ }
+}
+
+.psp-diff-panel {
+ margin-top: 20px;
+ border: 1px solid $border;
+ border-radius: 12px;
+ background: #fff;
+ padding: 16px;
+}
+
+.psp-diff-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ h3 {
+ margin: 0;
+ font-size: 14px;
+ font-weight: 700;
+ }
+}
+
+.psp-diff-loading {
+ color: $text-muted;
+ font-size: 13px;
+}
+
+.psp-diff-table {
+ width: 100%;
+ border-collapse: collapse;
+ margin-top: 12px;
+ font-size: 12.5px;
+
+ th,
+ td {
+ text-align: left;
+ padding: 8px 10px;
+ border-bottom: 1px solid $border;
+ }
+
+ th {
+ color: $text-muted;
+ font-weight: 600;
+ }
+}
+
+.psp-diff-row--changed {
+ background: #fffbeb;
+
+ .psp-diff-original {
+ color: #b91c1c;
+ text-decoration: line-through;
+ }
+
+ .psp-diff-proposed {
+ color: #15803d;
+ font-weight: 600;
+ }
+}
+
+.empty-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 60px 24px;
+ background: #fff;
+ border: 1px dashed $border;
+ border-radius: 14px;
+ text-align: center;
+ margin: 16px 0;
+
+ .empty-icon {
+ font-size: 42px;
+ color: #cbd5e1;
+ margin-bottom: 14px;
+ }
+
+ .empty-title {
+ margin: 0 0 4px;
+ font-size: 15px;
+ font-weight: 700;
+ color: #0d1b2a;
+ }
+
+ .empty-text {
+ margin: 0;
+ font-size: 12.5px;
+ color: $text-muted;
+ max-width: 380px;
+ line-height: 1.5;
+ }
+}
diff --git a/src/app/tasks/checker-inbox-and-tasks-tabs/pending-savings-products/pending-savings-products.component.ts b/src/app/tasks/checker-inbox-and-tasks-tabs/pending-savings-products/pending-savings-products.component.ts
new file mode 100644
index 000000000..db9554f9d
--- /dev/null
+++ b/src/app/tasks/checker-inbox-and-tasks-tabs/pending-savings-products/pending-savings-products.component.ts
@@ -0,0 +1,217 @@
+/**
+ * Copyright since 2025 Mifos Initiative
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+import { Component, inject } from '@angular/core';
+import { ActivatedRoute, Router } from '@angular/router';
+import {
+ MatTableDataSource,
+ MatTable,
+ MatColumnDef,
+ MatHeaderCellDef,
+ MatHeaderCell,
+ MatCellDef,
+ MatCell,
+ MatHeaderRowDef,
+ MatHeaderRow,
+ MatRowDef,
+ MatRow
+} from '@angular/material/table';
+import { MatDialog } from '@angular/material/dialog';
+import { MatIcon } from '@angular/material/icon';
+import { MatIconButton } from '@angular/material/button';
+import { FaIconComponent } from '@fortawesome/angular-fontawesome';
+
+import { ProductsService } from 'app/products/products.service';
+import { ConfirmationDialogComponent } from 'app/shared/confirmation-dialog/confirmation-dialog.component';
+import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component';
+import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
+import { InputBase } from 'app/shared/form-dialog/formfield/model/input-base';
+import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
+
+@Component({
+ selector: 'mifosx-pending-savings-products',
+ templateUrl: './pending-savings-products.component.html',
+ styleUrls: ['./pending-savings-products.component.scss'],
+ imports: [
+ ...STANDALONE_SHARED_IMPORTS,
+ FaIconComponent,
+ MatTable,
+ MatColumnDef,
+ MatHeaderCellDef,
+ MatHeaderCell,
+ MatCellDef,
+ MatCell,
+ MatHeaderRowDef,
+ MatHeaderRow,
+ MatRowDef,
+ MatRow,
+ MatIcon,
+ MatIconButton
+ ]
+})
+export class PendingSavingsProductsComponent {
+ private route = inject(ActivatedRoute);
+ private router = inject(Router);
+ private dialog = inject(MatDialog);
+ private productsService = inject(ProductsService);
+
+ dataSource: MatTableDataSource