diff --git a/backend/controllers/shared/pageSettings.js b/backend/controllers/shared/pageSettings.js index 1c80bba8..44d063a7 100644 --- a/backend/controllers/shared/pageSettings.js +++ b/backend/controllers/shared/pageSettings.js @@ -1,7 +1,7 @@ import { Database } from '../../utils/database.js'; import { Logger } from '../../utils/logger.js'; import { Common } from '../../utils/common.js'; -import { CollectionsEnum } from '../../models/database.model.js'; +import { CollectionFieldsEnum, CollectionsEnum } from '../../models/database.model.js'; const logger = Logger; const common = Common; const databaseService = Database; @@ -17,11 +17,86 @@ export const getPageSettings = (req, res, next) => { }; export const savePageSettings = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Page Settings', msg: 'Saving Page Settings..' }); - return databaseService.insert(req.session.selectedNode, CollectionsEnum.PAGE_SETTINGS, req.updatedSettings).then((insertedSettings) => { - logger.log({ level: 'DEBUG', fileName: 'Page Settings', msg: 'Page Settings Updated', data: insertedSettings }); - return res.status(201).json(true); - }).catch((errRes) => { + req.body = [ + { + pageId: "payments", + tables: [ + { + recordsPerPage: 25, + sortBy: "created_at", + sortOrder: "Ascending", + showColumns: [ + "created_at", + "type", + "payment_hash", + "msatoshi_sent", + "msatoshi", + ], + }, + ], + }, + { + pageId: "invoices1", + tables: [ + { + tableId: "invoices1", + recordsPerPage: 10, + showColumns: [ + "msatoshi_received", + ], + }, + ], + }, + { + tables: [ + { + tableId: "invoices2", + sortBy: "expires_at", + sortOrder: "Descending", + showColumns: [ + "expires_at", + "paid_at", + "type", + "description", + "msatoshi", + "msatoshi_received", + ], + }, + ], + }, + { + pageId: "invoices3", + tables: [ + { + tableId: "invoices3", + sortBy: "expires_at", + sortOrder: "Descending", + showColumns: [ + "expires_at", + "paid_at", + "type", + "description", + "msatoshi", + "msatoshi_received", + ], + }, + ], + } + ]; + return Promise.all(req.body.map((page) => databaseService.update(req.session.selectedNode, CollectionsEnum.PAGE_SETTINGS, page, CollectionFieldsEnum.PAGE_ID, page.pageId))). + then((values) => { + logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values }); + res.status(201).json(values); + }). + catch((errRes) => { const err = common.handleError(errRes, 'Page Settings', 'Page Settings Update Error', req.session.selectedNode); return res.status(err.statusCode).json({ message: err.message, error: err.error }); }); + // return databaseService.insert(req.session.selectedNode, CollectionsEnum.PAGE_SETTINGS, req.body).then((insertedSettings) => { + // logger.log({ level: 'DEBUG', fileName: 'Page Settings', msg: 'Page Settings Updated', data: insertedSettings }); + // return res.status(201).json(true); + // }).catch((errRes) => { + // const err = common.handleError(errRes, 'Page Settings', 'Page Settings Update Error', req.session.selectedNode); + // return res.status(err.statusCode).json({ message: err.message, error: err.error }); + // }); }; diff --git a/backend/models/database.model.js b/backend/models/database.model.js index 5f6cb97e..c2c40302 100644 --- a/backend/models/database.model.js +++ b/backend/models/database.model.js @@ -16,6 +16,16 @@ export class Offer { this.lastUpdatedAt = lastUpdatedAt; } } +export const validateDocument = (collectionName, documentToValidate) => { + switch (collectionName) { + case CollectionsEnum.OFFERS: + return validateOffer(documentToValidate); + case CollectionsEnum.PAGE_SETTINGS: + return validatePageSettings(documentToValidate); + default: + return ({ isValid: false, error: 'Collection does not exist' }); + } +}; export const validateOffer = (documentToValidate) => { if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.BOLT12)) { return ({ isValid: false, error: CollectionFieldsEnum.BOLT12 + ' is mandatory.' }); @@ -38,8 +48,7 @@ export var SortOrderEnum; })(SortOrderEnum || (SortOrderEnum = {})); export var PageSettingsFieldsEnum; (function (PageSettingsFieldsEnum) { - PageSettingsFieldsEnum["PAYMENTS"] = "payments"; - PageSettingsFieldsEnum["INVOICES"] = "invoices"; + PageSettingsFieldsEnum["PAGE_ID"] = "pageId"; PageSettingsFieldsEnum["TABLES"] = "tables"; })(PageSettingsFieldsEnum || (PageSettingsFieldsEnum = {})); export var TableSettingsFieldsEnum; @@ -60,28 +69,49 @@ export class TableSetting { } } export class PageSettings { - constructor(pages) { - this.pages = pages; + constructor(pageId, tables) { + this.pageId = pageId; + this.tables = tables; } } export const validatePageSettings = (documentToValidate) => { - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.PAYMENTS)) { - return ({ isValid: false, error: CollectionFieldsEnum.PAYMENTS + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.INVOICES)) { - return ({ isValid: false, error: CollectionFieldsEnum.INVOICES + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.TABLES)) { - return ({ isValid: false, error: CollectionFieldsEnum.TABLES + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.TABLE_ID)) { - return ({ isValid: false, error: CollectionFieldsEnum.TABLE_ID + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.SHOW_COLUMNS)) { - return ({ isValid: false, error: CollectionFieldsEnum.SHOW_COLUMNS + ' is mandatory.' }); - } - if (documentToValidate[CollectionFieldsEnum.SHOW_COLUMNS].length < 3) { - return ({ isValid: false, error: CollectionFieldsEnum.SHOW_COLUMNS + ' should have at least 2 fields.' }); + const errorMessages = documentToValidate.reduce((docAcc, doc, pageIdx) => { + let newDocMsgs = ''; + if (!doc.hasOwnProperty(CollectionFieldsEnum.PAGE_ID)) { + newDocMsgs = newDocMsgs + ' ' + CollectionFieldsEnum.PAGE_ID + ' is mandatory.'; + } + if (!doc.hasOwnProperty(CollectionFieldsEnum.TABLES)) { + newDocMsgs = newDocMsgs + ' ' + CollectionFieldsEnum.TABLES + ' is mandatory.'; + } + newDocMsgs = newDocMsgs + ' ' + doc.tables.reduce((tableAcc, table, tableIdx) => { + if (!table.hasOwnProperty(CollectionFieldsEnum.TABLE_ID)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.TABLE_ID + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.SORT_BY)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SORT_BY + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.SORT_ORDER)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SORT_ORDER + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.RECORDS_PER_PAGE)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.RECORDS_PER_PAGE + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.SHOW_COLUMNS)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SHOW_COLUMNS + ' is mandatory.'; + } + if (table[CollectionFieldsEnum.SHOW_COLUMNS].length < 2) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SHOW_COLUMNS + ' should have at least 2 fields.'; + } + tableAcc = tableAcc.trim() !== '' ? ('table ' + (table.hasOwnProperty(CollectionFieldsEnum.TABLE_ID) ? table[CollectionFieldsEnum.TABLE_ID] : (tableIdx + 1)) + tableAcc) : ''; + return tableAcc; + }, ''); + if (newDocMsgs.trim() !== '') { + docAcc = docAcc + '\nFor page ' + (doc.hasOwnProperty(CollectionFieldsEnum.PAGE_ID) ? doc[CollectionFieldsEnum.PAGE_ID] : (pageIdx + 1)) + newDocMsgs; + } + return docAcc; + }, ''); + if (errorMessages !== '') { + return ({ isValid: false, error: errorMessages }); } return ({ isValid: true }); }; diff --git a/backend/utils/database.js b/backend/utils/database.js index cc819054..71c5ae40 100644 --- a/backend/utils/database.js +++ b/backend/utils/database.js @@ -3,7 +3,7 @@ import { join, dirname, sep } from 'path'; import { fileURLToPath } from 'url'; import { Common } from '../utils/common.js'; import { Logger } from '../utils/logger.js'; -import { CollectionsEnum, validateOffer } from '../models/database.model.js'; +import { validateDocument } from '../models/database.model.js'; export class DatabaseService { constructor() { this.common = Common; @@ -33,7 +33,7 @@ export class DatabaseService { if (!selectedNode || !selectedNode.index) { reject(new Error('Selected Node Config Not Found.')); } - const validationRes = this.validateDocument(CollectionsEnum.OFFERS, newDocument); + const validationRes = validateDocument(collectionName, newDocument); if (!validationRes.isValid) { reject(validationRes.error); } @@ -68,7 +68,7 @@ export class DatabaseService { } updatedDocument = foundDoc; } - const validationRes = this.validateDocument(CollectionsEnum.OFFERS, updatedDocument); + const validationRes = validateDocument(collectionName, updatedDocument); if (!validationRes.isValid) { reject(validationRes.error); } @@ -130,14 +130,6 @@ export class DatabaseService { } }); } - validateDocument(collectionName, documentToValidate) { - switch (collectionName) { - case CollectionsEnum.OFFERS: - return validateOffer(documentToValidate); - default: - return ({ isValid: false, error: 'Collection does not exist' }); - } - } saveDatabase(nodeIndex) { try { if (+nodeIndex < 1) { diff --git a/server/controllers/shared/pageSettings.ts b/server/controllers/shared/pageSettings.ts index 6f9ccf4c..5bb277aa 100644 --- a/server/controllers/shared/pageSettings.ts +++ b/server/controllers/shared/pageSettings.ts @@ -1,7 +1,7 @@ import { Database, DatabaseService } from '../../utils/database.js'; import { Logger, LoggerService } from '../../utils/logger.js'; import { Common, CommonService } from '../../utils/common.js'; -import { CollectionsEnum, PageSettings } from '../../models/database.model.js'; +import { CollectionFieldsEnum, CollectionsEnum, PageSettings } from '../../models/database.model.js'; const logger: LoggerService = Logger; const common: CommonService = Common; @@ -20,11 +20,86 @@ export const getPageSettings = (req, res, next) => { export const savePageSettings = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Page Settings', msg: 'Saving Page Settings..' }); - return databaseService.insert(req.session.selectedNode, CollectionsEnum.PAGE_SETTINGS, req.updatedSettings).then((insertedSettings) => { - logger.log({ level: 'DEBUG', fileName: 'Page Settings', msg: 'Page Settings Updated', data: insertedSettings }); - return res.status(201).json(true); - }).catch((errRes) => { - const err = common.handleError(errRes, 'Page Settings', 'Page Settings Update Error', req.session.selectedNode); - return res.status(err.statusCode).json({ message: err.message, error: err.error }); - }); + req.body = [ + { + pageId: "payments", + tables: [ + { + recordsPerPage: 25, + sortBy: "created_at", + sortOrder: "Ascending", + showColumns: [ + "created_at", + "type", + "payment_hash", + "msatoshi_sent", + "msatoshi", + ], + }, + ], + }, + { + pageId: "invoices1", + tables: [ + { + tableId: "invoices1", + recordsPerPage: 10, + showColumns: [ + "msatoshi_received", + ], + }, + ], + }, + { + tables: [ + { + tableId: "invoices2", + sortBy: "expires_at", + sortOrder: "Descending", + showColumns: [ + "expires_at", + "paid_at", + "type", + "description", + "msatoshi", + "msatoshi_received", + ], + }, + ], + }, + { + pageId: "invoices3", + tables: [ + { + tableId: "invoices3", + sortBy: "expires_at", + sortOrder: "Descending", + showColumns: [ + "expires_at", + "paid_at", + "type", + "description", + "msatoshi", + "msatoshi_received", + ], + }, + ], + } + ]; + return Promise.all(req.body.map((page) => databaseService.update(req.session.selectedNode, CollectionsEnum.PAGE_SETTINGS, page, CollectionFieldsEnum.PAGE_ID, page.pageId))). + then((values) => { + logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values }); + res.status(201).json(values); + }). + catch((errRes) => { + const err = common.handleError(errRes, 'Page Settings', 'Page Settings Update Error', req.session.selectedNode); + return res.status(err.statusCode).json({ message: err.message, error: err.error }); + }); + // return databaseService.insert(req.session.selectedNode, CollectionsEnum.PAGE_SETTINGS, req.body).then((insertedSettings) => { + // logger.log({ level: 'DEBUG', fileName: 'Page Settings', msg: 'Page Settings Updated', data: insertedSettings }); + // return res.status(201).json(true); + // }).catch((errRes) => { + // const err = common.handleError(errRes, 'Page Settings', 'Page Settings Update Error', req.session.selectedNode); + // return res.status(err.statusCode).json({ message: err.message, error: err.error }); + // }); }; diff --git a/server/models/database.model.ts b/server/models/database.model.ts index f36e365f..e3714a0f 100644 --- a/server/models/database.model.ts +++ b/server/models/database.model.ts @@ -19,6 +19,17 @@ export class Offer { } +export const validateDocument = (collectionName: CollectionsEnum, documentToValidate: any): any => { + switch (collectionName) { + case CollectionsEnum.OFFERS: + return validateOffer(documentToValidate); + case CollectionsEnum.PAGE_SETTINGS: + return validatePageSettings(documentToValidate); + default: + return ({ isValid: false, error: 'Collection does not exist' }); + } +}; + export const validateOffer = (documentToValidate): any => { if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.BOLT12)) { return ({ isValid: false, error: CollectionFieldsEnum.BOLT12 + ' is mandatory.' }); @@ -41,8 +52,7 @@ export enum SortOrderEnum { } export enum PageSettingsFieldsEnum { - PAYMENTS = 'payments', - INVOICES = 'invoices', + PAGE_ID = 'pageId', TABLES = 'tables' } @@ -69,32 +79,50 @@ export class TableSetting { export class PageSettings { constructor( - public pages: { - payments: { tables: TableSetting[] }; - invoices: { tables: TableSetting[] }; - } + public pageId: string, + public tables: TableSetting[] ) { } } export const validatePageSettings = (documentToValidate): any => { - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.PAYMENTS)) { - return ({ isValid: false, error: CollectionFieldsEnum.PAYMENTS + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.INVOICES)) { - return ({ isValid: false, error: CollectionFieldsEnum.INVOICES + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.TABLES)) { - return ({ isValid: false, error: CollectionFieldsEnum.TABLES + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.TABLE_ID)) { - return ({ isValid: false, error: CollectionFieldsEnum.TABLE_ID + ' is mandatory.' }); - } - if (!documentToValidate.hasOwnProperty(CollectionFieldsEnum.SHOW_COLUMNS)) { - return ({ isValid: false, error: CollectionFieldsEnum.SHOW_COLUMNS + ' is mandatory.' }); - } - if (documentToValidate[CollectionFieldsEnum.SHOW_COLUMNS].length < 3) { - return ({ isValid: false, error: CollectionFieldsEnum.SHOW_COLUMNS + ' should have at least 2 fields.' }); + const errorMessages = documentToValidate.reduce((docAcc, doc: PageSettings, pageIdx) => { + let newDocMsgs = ''; + if (!doc.hasOwnProperty(CollectionFieldsEnum.PAGE_ID)) { + newDocMsgs = newDocMsgs + ' ' + CollectionFieldsEnum.PAGE_ID + ' is mandatory.'; + } + if (!doc.hasOwnProperty(CollectionFieldsEnum.TABLES)) { + newDocMsgs = newDocMsgs + ' ' + CollectionFieldsEnum.TABLES + ' is mandatory.'; + } + newDocMsgs = newDocMsgs + ' ' + doc.tables.reduce((tableAcc, table: TableSetting, tableIdx) => { + if (!table.hasOwnProperty(CollectionFieldsEnum.TABLE_ID)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.TABLE_ID + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.SORT_BY)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SORT_BY + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.SORT_ORDER)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SORT_ORDER + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.RECORDS_PER_PAGE)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.RECORDS_PER_PAGE + ' is mandatory.'; + } + if (!table.hasOwnProperty(CollectionFieldsEnum.SHOW_COLUMNS)) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SHOW_COLUMNS + ' is mandatory.'; + } + if (table[CollectionFieldsEnum.SHOW_COLUMNS].length < 2) { + tableAcc = tableAcc + ' ' + CollectionFieldsEnum.SHOW_COLUMNS + ' should have at least 2 fields.'; + } + tableAcc = tableAcc.trim() !== '' ? ('table ' + (table.hasOwnProperty(CollectionFieldsEnum.TABLE_ID) ? table[CollectionFieldsEnum.TABLE_ID] : (tableIdx + 1)) + tableAcc) : ''; + return tableAcc; + }, ''); + if (newDocMsgs.trim() !== '') { + docAcc = docAcc + '\nFor page ' + (doc.hasOwnProperty(CollectionFieldsEnum.PAGE_ID) ? doc[CollectionFieldsEnum.PAGE_ID] : (pageIdx + 1)) + newDocMsgs; + } + return docAcc; + }, ''); + if (errorMessages !== '') { + return ({ isValid: false, error: errorMessages }); } return ({ isValid: true }); }; @@ -106,7 +134,7 @@ export enum CollectionsEnum { export type Collections = { Offers: Offer[]; - PageSettings: PageSettings; + PageSettings: PageSettings[]; } export const CollectionFieldsEnum = { ...OfferFieldsEnum, ...PageSettingsFieldsEnum, ...TableSettingsFieldsEnum }; diff --git a/server/utils/database.ts b/server/utils/database.ts index 85daf2c8..f5af9d15 100644 --- a/server/utils/database.ts +++ b/server/utils/database.ts @@ -3,7 +3,7 @@ import { join, dirname, sep } from 'path'; import { fileURLToPath } from 'url'; import { Common, CommonService } from '../utils/common.js'; import { Logger, LoggerService } from '../utils/logger.js'; -import { Collections, CollectionsEnum, validateOffer } from '../models/database.model.js'; +import { Collections, CollectionsEnum, validateDocument } from '../models/database.model.js'; import { CommonSelectedNode } from '../models/config.model.js'; export class DatabaseService { @@ -36,7 +36,7 @@ export class DatabaseService { if (!selectedNode || !selectedNode.index) { reject(new Error('Selected Node Config Not Found.')); } - const validationRes = this.validateDocument(CollectionsEnum.OFFERS, newDocument); + const validationRes = validateDocument(collectionName, newDocument); if (!validationRes.isValid) { reject(validationRes.error); } else { @@ -70,7 +70,7 @@ export class DatabaseService { } updatedDocument = foundDoc; } - const validationRes = this.validateDocument(CollectionsEnum.OFFERS, updatedDocument); + const validationRes = validateDocument(collectionName, updatedDocument); if (!validationRes.isValid) { reject(validationRes.error); } else { @@ -128,16 +128,6 @@ export class DatabaseService { }); } - validateDocument(collectionName: CollectionsEnum, documentToValidate: any) { - switch (collectionName) { - case CollectionsEnum.OFFERS: - return validateOffer(documentToValidate); - - default: - return ({ isValid: false, error: 'Collection does not exist' }); - } - } - saveDatabase(nodeIndex: number) { try { if (+nodeIndex < 1) { diff --git a/src/app/cln/store/cln.actions.ts b/src/app/cln/store/cln.actions.ts index 00fb1727..bfc19668 100644 --- a/src/app/cln/store/cln.actions.ts +++ b/src/app/cln/store/cln.actions.ts @@ -14,9 +14,9 @@ export const setChildNodeSettingsCL = createAction(CLNActions.SET_CHILD_NODE_SET export const fetchPageSettingsCL = createAction(CLNActions.FETCH_PAGE_SETTINGS_CLN); -export const setPageSettings = createAction(CLNActions.SET_PAGE_SETTINGS_CLN, props<{ payload: PageSettingsCLN }>()); +export const setPageSettings = createAction(CLNActions.SET_PAGE_SETTINGS_CLN, props<{ payload: PageSettingsCLN[] }>()); -export const savePageSettings = createAction(CLNActions.SAVE_PAGE_SETTINGS_CLN, props<{ payload: PageSettingsCLN }>()); +export const savePageSettings = createAction(CLNActions.SAVE_PAGE_SETTINGS_CLN, props<{ payload: PageSettingsCLN[] }>()); export const fetchInfoCL = createAction(CLNActions.FETCH_INFO_CLN, props<{ payload: { loadPage: string } }>()); diff --git a/src/app/cln/store/cln.reducers.ts b/src/app/cln/store/cln.reducers.ts index 2b36ed30..86237c26 100644 --- a/src/app/cln/store/cln.reducers.ts +++ b/src/app/cln/store/cln.reducers.ts @@ -219,13 +219,18 @@ export const CLNReducer = createReducer(initCLNState, }; }), on(setPageSettings, (state, { payload }) => { - const sortedPageSettings = Object.keys(CLN_DEFAULT_PAGE_SETTINGS).reduce((acc, page) => { - acc[page] = (payload && payload.hasOwnProperty(page)) ? payload[page] : CLN_DEFAULT_PAGE_SETTINGS[page]; - return acc; - }, {}); + const newPageSettings: PageSettingsCLN[] = []; + CLN_DEFAULT_PAGE_SETTINGS.forEach((page) => { + const pageIdx = payload.findIndex((p) => p.pageId === page.pageId); + if (pageIdx >= 0) { + newPageSettings.push(payload[pageIdx]); + } else { + newPageSettings.push(page); + } + }); return { ...state, - pageSettings: sortedPageSettings + pageSettings: newPageSettings }; }) ); diff --git a/src/app/cln/store/cln.state.ts b/src/app/cln/store/cln.state.ts index 20ccf2f7..f9e5c94d 100644 --- a/src/app/cln/store/cln.state.ts +++ b/src/app/cln/store/cln.state.ts @@ -7,7 +7,7 @@ import { PageSettingsCLN } from '../../shared/models/pageSettings'; export interface CLNState { apisCallStatus: ApiCallsListCL; nodeSettings: SelNodeChild | null; - pageSettings: PageSettingsCLN; + pageSettings: PageSettingsCLN[]; information: GetInfo; fees: Fees; feeRatesPerKB: FeeRates; diff --git a/src/app/shared/components/node-config/page-settings/page-settings.component.html b/src/app/shared/components/node-config/page-settings/page-settings.component.html index fe9ad8ed..c9c029b3 100644 --- a/src/app/shared/components/node-config/page-settings/page-settings.component.html +++ b/src/app/shared/components/node-config/page-settings/page-settings.component.html @@ -4,11 +4,11 @@ Page Settings - + - {{page.key | titlecase}} + {{page.pageId | titlecase}} -
+
diff --git a/src/app/shared/components/node-config/page-settings/page-settings.component.ts b/src/app/shared/components/node-config/page-settings/page-settings.component.ts index af2abf5e..e43dbd7c 100644 --- a/src/app/shared/components/node-config/page-settings/page-settings.component.ts +++ b/src/app/shared/components/node-config/page-settings/page-settings.component.ts @@ -4,12 +4,13 @@ import { takeUntil } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import { faPenRuler } from '@fortawesome/free-solid-svg-icons'; -import { CLN_TABLE_FIELDS_DEF, PAGE_SIZE_OPTIONS, ScreenSizeEnum, SORT_ORDERS } from '../../../services/consts-enums-functions'; +import { CLN_DEFAULT_PAGE_SETTINGS, CLN_TABLE_FIELDS_DEF, PAGE_SIZE_OPTIONS, ScreenSizeEnum, SORT_ORDERS } from '../../../services/consts-enums-functions'; import { LoggerService } from '../../../services/logger.service'; import { CommonService } from '../../../services/common.service'; import { RTLState } from '../../../../store/rtl.state'; import { TableSetting, PageSettingsCLN } from '../../../models/pageSettings'; import { clnPageSettings } from '../../../../cln/store/cln.selector'; +import { savePageSettings } from '../../../../cln/store/cln.actions'; @Component({ selector: 'rtl-page-settings', @@ -22,7 +23,8 @@ export class PageSettingsComponent implements OnInit, OnDestroy { public screenSize = ''; public screenSizeEnum = ScreenSizeEnum; public pageSizeOptions = PAGE_SIZE_OPTIONS; - public pageSettings: PageSettingsCLN | null = null; + public pageSettings: PageSettingsCLN[] = []; + public initialPageSettings: PageSettingsCLN[] = CLN_DEFAULT_PAGE_SETTINGS; public tableFieldsDef = CLN_TABLE_FIELDS_DEF; public sortOrders = SORT_ORDERS; unSubs: Array> = [new Subject(), new Subject()]; @@ -34,6 +36,7 @@ export class PageSettingsComponent implements OnInit, OnDestroy { ngOnInit() { this.store.select(clnPageSettings).pipe(takeUntil(this.unSubs[0])).subscribe((settings) => { this.pageSettings = settings.pageSettings; + this.initialPageSettings = JSON.parse(JSON.stringify(settings.pageSettings)); this.logger.info(settings); }); } @@ -44,19 +47,15 @@ export class PageSettingsComponent implements OnInit, OnDestroy { } } - onUpdatePageSettings() { - // if (this.selNode.settings.fiatConversion && !this.selNode.settings.currencyUnit) { - // return true; - // } - // this.store.dispatch(setChildNodeSettingsECL({ - // payload: { - // userPersona: this.selNode.settings.userPersona, channelBackupPath: this.selNode.settings.channelBackupPath, selCurrencyUnit: this.selNode.settings.currencyUnit, currencyUnits: this.selNode.settings.currencyUnits, fiatConversion: this.selNode.settings.fiatConversion, lnImplementation: this.selNode.lnImplementation, swapServerUrl: this.selNode.settings.swapServerUrl, boltzServerUrl: this.selNode.settings.boltzServerUrl - // } - // })); + onUpdatePageSettings(): boolean | void { + if (this.pageSettings.reduce((pacc, page) => pacc || (page.tables.reduce((acc, table) => !(table.recordsPerPage && table.sortBy && table.sortOrder && table.showColumns && table.showColumns.length >= 3), false)), false)) { + return true; + } + this.store.dispatch(savePageSettings({ payload: this.pageSettings })); } onResetPageSettings() { - // this.store.dispatch(setSelectedNode({ payload: { uiMessage: UI_MESSAGES.NO_SPINNER, prevLnNodeIndex: +prevIndex, currentLnNode: this.selNode, isInitialSetup: true } })); + this.pageSettings = this.initialPageSettings; } ngOnDestroy() { diff --git a/src/app/shared/models/pageSettings.ts b/src/app/shared/models/pageSettings.ts index c4eeef93..c6fdc5d2 100644 --- a/src/app/shared/models/pageSettings.ts +++ b/src/app/shared/models/pageSettings.ts @@ -12,8 +12,7 @@ export class TableSetting { export class PageSettingsCLN { - payments?: { seq?: number, tables?: TableSetting[] }; - invoices?: { seq?: number, tables?: TableSetting[] }; - utxos?: { seq?: number, tables?: TableSetting[] }; + pageId: string; + tables: TableSetting[]; } diff --git a/src/app/shared/services/consts-enums-functions.ts b/src/app/shared/services/consts-enums-functions.ts index 7be8a70f..aaaad3d5 100644 --- a/src/app/shared/services/consts-enums-functions.ts +++ b/src/app/shared/services/consts-enums-functions.ts @@ -674,18 +674,14 @@ export enum SortOrderEnum { export const SORT_ORDERS = ['Ascending', 'Descending']; -export const CLN_DEFAULT_PAGE_SETTINGS: PageSettingsCLN = { - payments: { seq: 1, tables: [{ tableId: 'payments', recordsPerPage: 10, sortBy: 'created_at', sortOrder: SortOrderEnum.DESCENDING, +export const CLN_DEFAULT_PAGE_SETTINGS: PageSettingsCLN[] = [ + { pageId: 'payments', tables: [{ tableId: 'payments', recordsPerPage: 10, sortBy: 'created_at', sortOrder: SortOrderEnum.DESCENDING, showColumns: ['created_at', 'type', 'payment_hash', 'msatoshi_sent', 'msatoshi'] }] }, - invoices: { seq: 2, tables: [{ tableId: 'invoices', recordsPerPage: 10, sortBy: 'expires_at', sortOrder: SortOrderEnum.DESCENDING, - showColumns: ['expires_at', 'paid_at', 'type', 'description', 'msatoshi', 'msatoshi_received'] }] }, - utxos: { seq: 3, tables: [{ tableId: 'utxos', recordsPerPage: 10, sortBy: 'expires_at', sortOrder: SortOrderEnum.DESCENDING, + { pageId: 'invoices', tables: [{ tableId: 'invoices', recordsPerPage: 10, sortBy: 'expires_at', sortOrder: SortOrderEnum.DESCENDING, showColumns: ['expires_at', 'paid_at', 'type', 'description', 'msatoshi', 'msatoshi_received'] }] } - -}; +]; export const CLN_TABLE_FIELDS_DEF = { payments: ['created_at', 'type', 'payment_hash', 'msatoshi_sent', 'msatoshi', 'amount_msat', 'amount_sent_msat', 'destination', 'status', 'memo'], - invoices: ['expires_at', 'paid_at', 'type', 'description', 'msatoshi', 'msatoshi_received', 'label', 'payment_hash', 'amount_msat', 'status', 'amount_received_msat'], - utxos: ['expires_at', 'paid_at', 'type', 'description', 'msatoshi', 'msatoshi_received', 'label', 'payment_hash', 'amount_msat', 'status', 'amount_received_msat'] + invoices: ['expires_at', 'paid_at', 'type', 'description', 'msatoshi', 'msatoshi_received', 'label', 'payment_hash', 'amount_msat', 'status', 'amount_received_msat'] };