From d01687ff3551a12cc81b1296a7c5a713c084956b Mon Sep 17 00:00:00 2001 From: Caio Fuzatto Date: Thu, 19 Jan 2023 14:49:11 -0300 Subject: [PATCH 1/3] feat: create table formater --- src/formater.handler.ts | 45 +++++++++++++++++++++++++++++++++++++++++ src/formater.type.ts | 11 ++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/formater.handler.ts create mode 100644 src/formater.type.ts diff --git a/src/formater.handler.ts b/src/formater.handler.ts new file mode 100644 index 0000000..20487fb --- /dev/null +++ b/src/formater.handler.ts @@ -0,0 +1,45 @@ +import { BaseRecord } from 'adminjs'; +import { Format } from './formater.type'; + +const formatKey = (record: BaseRecord, column: Format) => { + if (!column.key) return null; + return column.callback + ? column.callback(record.params[column.key]) + : record.params[column.key]; +}; + +const formatConcatKeys = (record: BaseRecord, column: Format) => { + if (!column.concat?.keys) return null; + return column.concat.keys + .map(key => record.params[key]) + .join(column.concat.separator); +}; + +const formatConcatKey = (record: BaseRecord, column: Format) => { + if (!column.concat?.key) return null; + let index = 0; + const array: string[] = []; + while (!!record.params[`${column.concat.key}.${index}`]) { + array.push(record.params[`${column.concat.key}.${index}`]); + index++; + } + return array.join(column.concat.separator); +}; + +export const formatRecords = (records: BaseRecord[], format: Format[]) => { + const formattedRecords = records.map(record => { + const formattedParams = {}; + format.forEach(column => { + if (column.key) formattedParams[column.name] = formatKey(record, column); + if (column.value) formattedParams[column.name] = column.value; + if (column.concat?.keys) + formattedParams[column.name] = formatConcatKeys(record, column); + if (column.concat?.key) + formattedParams[column.name] = formatConcatKey(record, column); + }); + + return { params: formattedParams }; + }); + + return formattedRecords; +}; diff --git a/src/formater.type.ts b/src/formater.type.ts new file mode 100644 index 0000000..c04808c --- /dev/null +++ b/src/formater.type.ts @@ -0,0 +1,11 @@ +export interface Format { + name: string; + key?: string; + callback?: (value: string) => string; + value?: string; + concat?: { + key?: string; + keys?: string[]; + separator: string; + }; +} \ No newline at end of file From 8a3fbd4c19a92d3735109f2ba7d5593c61ad6315 Mon Sep 17 00:00:00 2001 From: Caio Fuzatto Date: Thu, 19 Jan 2023 15:01:26 -0300 Subject: [PATCH 2/3] feat: add module configs --- src/config.default.ts | 10 ++++++++++ src/config.type.ts | 11 +++++++++++ src/formater.handler.ts | 12 ++++++------ src/formater.type.ts | 2 +- src/importExportFeature.ts | 31 ++++++++++++++++++------------- 5 files changed, 46 insertions(+), 20 deletions(-) create mode 100644 src/config.default.ts create mode 100644 src/config.type.ts diff --git a/src/config.default.ts b/src/config.default.ts new file mode 100644 index 0000000..0f3112a --- /dev/null +++ b/src/config.default.ts @@ -0,0 +1,10 @@ +import { Config } from "./config.type"; + +export const CONFIG_DEFAULT: Config = { + export: { + isVisible: true, + }, + import: { + isVisible: true, + } +} \ No newline at end of file diff --git a/src/config.type.ts b/src/config.type.ts new file mode 100644 index 0000000..9b4190e --- /dev/null +++ b/src/config.type.ts @@ -0,0 +1,11 @@ +import { Column } from "./formater.type"; + +export interface Config { + export?: { + isVisible?: boolean; + columns?: Column[] + }, + import?: { + isVisible?: boolean; + } +} \ No newline at end of file diff --git a/src/formater.handler.ts b/src/formater.handler.ts index 20487fb..20440c5 100644 --- a/src/formater.handler.ts +++ b/src/formater.handler.ts @@ -1,21 +1,21 @@ import { BaseRecord } from 'adminjs'; -import { Format } from './formater.type'; +import { Column } from './formater.type'; -const formatKey = (record: BaseRecord, column: Format) => { +const formatKey = (record: BaseRecord, column: Column) => { if (!column.key) return null; return column.callback ? column.callback(record.params[column.key]) : record.params[column.key]; }; -const formatConcatKeys = (record: BaseRecord, column: Format) => { +const formatConcatKeys = (record: BaseRecord, column: Column) => { if (!column.concat?.keys) return null; return column.concat.keys .map(key => record.params[key]) .join(column.concat.separator); }; -const formatConcatKey = (record: BaseRecord, column: Format) => { +const formatConcatKey = (record: BaseRecord, column: Column) => { if (!column.concat?.key) return null; let index = 0; const array: string[] = []; @@ -26,10 +26,10 @@ const formatConcatKey = (record: BaseRecord, column: Format) => { return array.join(column.concat.separator); }; -export const formatRecords = (records: BaseRecord[], format: Format[]) => { +export const formatRecords = (records: BaseRecord[], columns: Column[]) => { const formattedRecords = records.map(record => { const formattedParams = {}; - format.forEach(column => { + columns.forEach(column => { if (column.key) formattedParams[column.name] = formatKey(record, column); if (column.value) formattedParams[column.name] = column.value; if (column.concat?.keys) diff --git a/src/formater.type.ts b/src/formater.type.ts index c04808c..f1af5fb 100644 --- a/src/formater.type.ts +++ b/src/formater.type.ts @@ -1,4 +1,4 @@ -export interface Format { +export interface Column { name: string; key?: string; callback?: (value: string) => string; diff --git a/src/importExportFeature.ts b/src/importExportFeature.ts index 0303148..101fc66 100644 --- a/src/importExportFeature.ts +++ b/src/importExportFeature.ts @@ -3,23 +3,28 @@ import { bundleComponents } from './components/bundleComponents'; import { postActionHandler } from './utils'; import { exportHandler } from './export.handler'; import { importHandler } from './import.handler'; +import { Config } from './config.type'; +import { CONFIG_DEFAULT } from './config.default'; const { EXPORT_COMPONENT, IMPORT_COMPONENT } = bundleComponents(); -const importExportFeature = (): FeatureType => { +const importExportFeature = (config: Config = CONFIG_DEFAULT): FeatureType => { + const actions = {}; + if (config.export?.isVisible) + actions['export'] = { + handler: postActionHandler(exportHandler), + component: EXPORT_COMPONENT, + actionType: 'resource', + }; + if (config.export?.isVisible) + actions['import'] = { + handler: postActionHandler(importHandler), + component: IMPORT_COMPONENT, + actionType: 'resource', + }; + return buildFeature({ - actions: { - export: { - handler: postActionHandler(exportHandler), - component: EXPORT_COMPONENT, - actionType: 'resource', - }, - import: { - handler: postActionHandler(importHandler), - component: IMPORT_COMPONENT, - actionType: 'resource', - }, - }, + actions, }); }; From 002b47b926f225ecc65d33e849faab24bc9f254f Mon Sep 17 00:00:00 2001 From: Caio Fuzatto Date: Thu, 19 Jan 2023 16:02:44 -0300 Subject: [PATCH 3/3] feat: add exportHandler options --- src/config.default.ts | 10 ---------- src/config.type.ts | 11 ----------- src/export.handler.ts | 28 ++++++++++++++++++---------- src/formater.type.ts | 2 +- src/importExportFeature.ts | 18 +++++++++++------- src/options.default.ts | 10 ++++++++++ src/options.type.ts | 11 +++++++++++ 7 files changed, 51 insertions(+), 39 deletions(-) delete mode 100644 src/config.default.ts delete mode 100644 src/config.type.ts create mode 100644 src/options.default.ts create mode 100644 src/options.type.ts diff --git a/src/config.default.ts b/src/config.default.ts deleted file mode 100644 index 0f3112a..0000000 --- a/src/config.default.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Config } from "./config.type"; - -export const CONFIG_DEFAULT: Config = { - export: { - isVisible: true, - }, - import: { - isVisible: true, - } -} \ No newline at end of file diff --git a/src/config.type.ts b/src/config.type.ts deleted file mode 100644 index 9b4190e..0000000 --- a/src/config.type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Column } from "./formater.type"; - -export interface Config { - export?: { - isVisible?: boolean; - columns?: Column[] - }, - import?: { - isVisible?: boolean; - } -} \ No newline at end of file diff --git a/src/export.handler.ts b/src/export.handler.ts index 6dd42fa..8b10d28 100644 --- a/src/export.handler.ts +++ b/src/export.handler.ts @@ -1,18 +1,26 @@ import { Parsers } from './parsers'; import { getRecords } from './utils'; import { ActionHandler, ActionResponse } from 'adminjs'; +import { formatRecords } from './formater.handler'; +import { Column } from './formater.type'; -export const exportHandler: ActionHandler = async ( - request, - response, - context -) => { - const parser = Parsers[request.query?.type ?? 'json'].export; +export const exportHandlerFactory = (columns?: Column[]) => { + const exportHandler: ActionHandler = async ( + request, + response, + context + ) => { + const parser = Parsers[request.query?.type ?? 'json'].export; - const records = await getRecords(context); - const parsedData = parser(records); + const records = await getRecords(context); + const parsedData = parser( + columns ? formatRecords(records, columns) : records + ); - return { - exportedData: parsedData, + return { + exportedData: parsedData, + }; }; + + return exportHandler; }; diff --git a/src/formater.type.ts b/src/formater.type.ts index f1af5fb..330d9cd 100644 --- a/src/formater.type.ts +++ b/src/formater.type.ts @@ -8,4 +8,4 @@ export interface Column { keys?: string[]; separator: string; }; -} \ No newline at end of file +} diff --git a/src/importExportFeature.ts b/src/importExportFeature.ts index 101fc66..696e971 100644 --- a/src/importExportFeature.ts +++ b/src/importExportFeature.ts @@ -1,22 +1,26 @@ +import * as _ from 'lodash'; import { buildFeature, FeatureType } from 'adminjs'; import { bundleComponents } from './components/bundleComponents'; import { postActionHandler } from './utils'; -import { exportHandler } from './export.handler'; +import { exportHandlerFactory } from './export.handler'; import { importHandler } from './import.handler'; -import { Config } from './config.type'; -import { CONFIG_DEFAULT } from './config.default'; +import { Options } from './options.type'; +import { defaultOptions } from './options.default'; const { EXPORT_COMPONENT, IMPORT_COMPONENT } = bundleComponents(); -const importExportFeature = (config: Config = CONFIG_DEFAULT): FeatureType => { +const importExportFeature = (options: Options): FeatureType => { + const appOptions = _.merge({}, defaultOptions, options); const actions = {}; - if (config.export?.isVisible) + if (appOptions.export?.isVisible) actions['export'] = { - handler: postActionHandler(exportHandler), + handler: postActionHandler( + exportHandlerFactory(appOptions.export.columns) + ), component: EXPORT_COMPONENT, actionType: 'resource', }; - if (config.export?.isVisible) + if (appOptions.import?.isVisible) actions['import'] = { handler: postActionHandler(importHandler), component: IMPORT_COMPONENT, diff --git a/src/options.default.ts b/src/options.default.ts new file mode 100644 index 0000000..68e2a0e --- /dev/null +++ b/src/options.default.ts @@ -0,0 +1,10 @@ +import { Options } from './options.type'; + +export const defaultOptions: Options = { + export: { + isVisible: true, + }, + import: { + isVisible: true, + }, +}; diff --git a/src/options.type.ts b/src/options.type.ts new file mode 100644 index 0000000..7cf0063 --- /dev/null +++ b/src/options.type.ts @@ -0,0 +1,11 @@ +import { Column } from './formater.type'; + +export interface Options { + export?: { + isVisible?: boolean; + columns?: Column[]; + }; + import?: { + isVisible?: boolean; + }; +}