From b06b511e93c62bcc63197412f9f789ae6624c1f1 Mon Sep 17 00:00:00 2001 From: sumukhswamy Date: Wed, 5 Feb 2025 14:39:33 -0800 Subject: [PATCH 1/3] Added parameters for supporting time from and time to in report generation Signed-off-by: sumukhswamy --- .../create/create_report_definition.tsx | 2 ++ .../report_definitions/utils/utils.tsx | 6 +++- server/model/backendModel.ts | 2 ++ server/model/index.ts | 28 +++++++++++++++++++ .../__tests__/savedSearchReportHelper.test.ts | 2 ++ .../converters/__tests__/backendToUi.test.ts | 4 +++ server/routes/utils/converters/backendToUi.ts | 22 +++++++++++---- server/routes/utils/converters/uiToBackend.ts | 4 +++ .../utils/__tests__/validationHelper.test.ts | 8 ++++++ 9 files changed, 72 insertions(+), 6 deletions(-) diff --git a/public/components/report_definitions/create/create_report_definition.tsx b/public/components/report_definitions/create/create_report_definition.tsx index f594bb60..490f3487 100644 --- a/public/components/report_definitions/create/create_report_definition.tsx +++ b/public/components/report_definitions/create/create_report_definition.tsx @@ -35,6 +35,7 @@ interface visualReportParams { header: string; footer: string; time_duration: string; + timeRangeParams: timeRangeParams; } interface dataReportParams { @@ -42,6 +43,7 @@ interface dataReportParams { base_url: string; report_format: string; time_duration: string; + timeRangeParams: timeRangeParams; } interface triggerType { trigger_type: string; diff --git a/public/components/report_definitions/utils/utils.tsx b/public/components/report_definitions/utils/utils.tsx index cf10f061..7327ad58 100644 --- a/public/components/report_definitions/utils/utils.tsx +++ b/public/components/report_definitions/utils/utils.tsx @@ -60,10 +60,14 @@ export const definitionInputValidation = async ( // if time range is invalid const nowDate = new Date(moment.now()); - if (timeRange.timeFrom > timeRange.timeTo || timeRange.timeTo > nowDate) { + if (timeRange.timeFrom > timeRange.timeTo || timeRange.timeTo > nowDate) { setShowTimeRangeError(true); error = true; } + else{ + metadata.report_params.core_params.timeFrom = timeRange.timeFrom; + metadata.report_params.core_params.timeTo = timeRange.timeTo; + } // if cron based and cron input is invalid if ( diff --git a/server/model/backendModel.ts b/server/model/backendModel.ts index d266297c..6319ac79 100644 --- a/server/model/backendModel.ts +++ b/server/model/backendModel.ts @@ -36,6 +36,8 @@ export type BackendReportDefinitionType = { format: { duration: string; fileFormat: BACKEND_REPORT_FORMAT; + timeFrom: string; + timeTo: string; limit?: number; header?: string; footer?: string; diff --git a/server/model/index.ts b/server/model/index.ts index 743b981c..b7f91764 100644 --- a/server/model/index.ts +++ b/server/model/index.ts @@ -42,6 +42,20 @@ export const dataReportSchema = schema.object({ } }, }), + timeFrom: schema.string({ + validate(value) { + if (isNaN(Date.parse(value))) { + return `invalid timeFrom: ${value}`; + } + }, + }), + timeTo: schema.string({ + validate(value) { + if (isNaN(Date.parse(value))) { + return `invalid timeTo: ${value}`; + } + }, + }), report_format: schema.oneOf([schema.literal(FORMAT.csv), schema.literal(FORMAT.xlsx)]), limit: schema.number({ defaultValue: DEFAULT_MAX_SIZE, min: 0 }), excel: schema.boolean({ defaultValue: true }), @@ -73,6 +87,20 @@ export const visualReportSchema = schema.object({ } }, }), + timeFrom: schema.string({ + validate(value) { + if (isNaN(Date.parse(value))) { + return `invalid timeFrom: ${value}`; + } + }, + }), + timeTo: schema.string({ + validate(value) { + if (isNaN(Date.parse(value))) { + return `invalid timeTo: ${value}`; + } + }, + }), }); export const intervalSchema = schema.object({ diff --git a/server/routes/utils/__tests__/savedSearchReportHelper.test.ts b/server/routes/utils/__tests__/savedSearchReportHelper.test.ts index 58b99fa5..d581d3c0 100644 --- a/server/routes/utils/__tests__/savedSearchReportHelper.test.ts +++ b/server/routes/utils/__tests__/savedSearchReportHelper.test.ts @@ -29,6 +29,8 @@ const input = { limit: 10000, excel: true, origin: 'http://localhost:5601', + timeFrom : '2012-07-29T09:23:55.300Z', + timeTo: '2020-07-29T06:43:55.301Z', }, }, delivery: { diff --git a/server/routes/utils/converters/__tests__/backendToUi.test.ts b/server/routes/utils/converters/__tests__/backendToUi.test.ts index 4877f807..a18552cf 100644 --- a/server/routes/utils/converters/__tests__/backendToUi.test.ts +++ b/server/routes/utils/converters/__tests__/backendToUi.test.ts @@ -40,6 +40,8 @@ const input: BackendReportInstanceType = { fileFormat: BACKEND_REPORT_FORMAT.pdf, header: '

test header

', footer: '

fake footer

', + timeFrom: "2020-11-11T09:52:00.000Z", + timeTo: "2020-11-11T10:22:00.000Z" }, trigger: { triggerType: BACKEND_TRIGGER_TYPE.cronSchedule, @@ -85,6 +87,8 @@ const output = { origin: 'http://localhost:5601', window_width: 1600, window_height: 800, + timeFrom: "2020-11-11T09:52:00.000Z", + timeTo: "2020-11-11T10:22:00.000Z" }, }, trigger: { diff --git a/server/routes/utils/converters/backendToUi.ts b/server/routes/utils/converters/backendToUi.ts index 290bb7b5..b36cb5ca 100644 --- a/server/routes/utils/converters/backendToUi.ts +++ b/server/routes/utils/converters/backendToUi.ts @@ -110,7 +110,7 @@ export const backendToUiReportDefinition = ( name, isEnabled, source: { type: sourceType, description, id: sourceId, origin }, - format: { fileFormat, duration, header, footer, limit }, + format: { fileFormat, duration, header, footer, limit, timeFrom: timeFrom, timeTo: timeTo }, trigger: { triggerType, schedule }, delivery, }, @@ -131,7 +131,9 @@ export const backendToUiReportDefinition = ( fileFormat, duration, baseUrl, - origin + origin, + timeFrom, + timeTo, ) : getVisualReportCoreParams( fileFormat, @@ -139,7 +141,9 @@ export const backendToUiReportDefinition = ( footer, duration, baseUrl, - origin + origin, + timeFrom, + timeTo, ), }, trigger: getUiTriggerParams( @@ -187,7 +191,9 @@ const getVisualReportCoreParams = ( footer: string = '', duration: string, baseUrl: string, - origin: string + origin: string, + timeFrom: string, + timeTo: string ): VisualReportSchemaType => { let res: VisualReportSchemaType = { base_url: baseUrl, @@ -196,6 +202,8 @@ const getVisualReportCoreParams = ( footer: footer, time_duration: duration, origin: origin, + timeFrom: timeFrom, + timeTo: timeTo, }; return res; }; @@ -234,7 +242,9 @@ const getDataReportCoreParams = ( fileFormat: BACKEND_REPORT_FORMAT, duration: string, baseUrl: string, - origin: string + origin: string, + timeFrom: string, + timeTo: string ): DataReportSchemaType => { let res: DataReportSchemaType = { base_url: baseUrl, @@ -243,6 +253,8 @@ const getDataReportCoreParams = ( time_duration: duration, saved_search_id: sourceId, origin: origin, + timeFrom: timeFrom, + timeTo: timeTo, }; return res; }; diff --git a/server/routes/utils/converters/uiToBackend.ts b/server/routes/utils/converters/uiToBackend.ts index 4a2064cd..c6285288 100644 --- a/server/routes/utils/converters/uiToBackend.ts +++ b/server/routes/utils/converters/uiToBackend.ts @@ -46,6 +46,8 @@ export const uiToBackendReportDefinition = ( footer, limit, origin, + timeFrom: timeFrom, + timeTo: timeTo, }, }, trigger, @@ -67,6 +69,8 @@ export const uiToBackendReportDefinition = ( ...(limit && { limit: limit }), ...(header && { header: header }), ...(footer && { footer: footer }), + ...(timeFrom && { timeFrom: timeFrom }), + ...(timeTo && { timeTo: timeTo }), }, trigger: getBackendTrigger(trigger), ...(getBackendDelivery(delivery) && { diff --git a/server/utils/__tests__/validationHelper.test.ts b/server/utils/__tests__/validationHelper.test.ts index e662ef11..f883bc0b 100644 --- a/server/utils/__tests__/validationHelper.test.ts +++ b/server/utils/__tests__/validationHelper.test.ts @@ -29,6 +29,8 @@ const createReportDefinitionInput: ReportDefinitionSchemaType = { report_format: FORMAT.pdf, time_duration: 'PT5M', origin: 'http://localhost:5601', + timeFrom: '2012-07-29T09:23:55.300Z', + timeTo:'2020-07-29T06:43:55.301Z' }, }, delivery: { @@ -61,6 +63,8 @@ const createReportDefinitionNotebookLegacyInput: ReportDefinitionSchemaType = { report_format: FORMAT.pdf, time_duration: 'PT5M', origin: 'http://localhost:5601', + timeFrom: '2012-07-29T09:23:55.300Z', + timeTo:'2020-07-29T06:43:55.301Z' }, }, delivery: { @@ -86,6 +90,8 @@ const createReportDefinitionNotebookInput: ReportDefinitionSchemaType = { report_format: FORMAT.pdf, time_duration: 'PT5M', origin: 'http://localhost:5601', + timeFrom: '2012-07-29T09:23:55.300Z', + timeTo:'2020-07-29T06:43:55.301Z' }, }, delivery: { @@ -111,6 +117,8 @@ const createReportDefinitionNotebookPostNavBarInput: ReportDefinitionSchemaType report_format: FORMAT.pdf, time_duration: 'PT5M', origin: 'http://localhost:5601', + timeFrom: '2012-07-29T09:23:55.300Z', + timeTo:'2020-07-29T06:43:55.301Z' }, }, delivery: { From e7775866e36152d734e4d81f8b3681d6841a551c Mon Sep 17 00:00:00 2001 From: sumukhswamy Date: Wed, 5 Feb 2025 15:30:14 -0800 Subject: [PATCH 2/3] linter changes Signed-off-by: sumukhswamy --- .../create/create_report_definition.tsx | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/public/components/report_definitions/create/create_report_definition.tsx b/public/components/report_definitions/create/create_report_definition.tsx index 490f3487..66696cb1 100644 --- a/public/components/report_definitions/create/create_report_definition.tsx +++ b/public/components/report_definitions/create/create_report_definition.tsx @@ -90,7 +90,12 @@ export interface timeRangeParams { timeTo: Date; } -export function CreateReport(props: { [x: string]: any; setBreadcrumbs?: any; httpClient?: any; chrome: any }) { +export function CreateReport(props: { + [x: string]: any; + setBreadcrumbs?: any; + httpClient?: any; + chrome: any; +}) { const { chrome } = props; let createReportDefinitionRequest: reportDefinitionParams = { @@ -108,7 +113,7 @@ export function CreateReport(props: { [x: string]: any; setBreadcrumbs?: any; ht configIds: [], title: '', textDescription: '', - htmlDescription: '' + htmlDescription: '', }, trigger: { trigger_type: '', @@ -212,7 +217,7 @@ export function CreateReport(props: { [x: string]: any; setBreadcrumbs?: any; ht addInvalidTimeRangeToastHandler(); }; - const removeToast = (removedToast: { id: string; }) => { + const removeToast = (removedToast: { id: string }) => { setToasts(toasts.filter((toast: any) => toast.id !== removedToast.id)); }; @@ -245,7 +250,7 @@ export function CreateReport(props: { [x: string]: any; setBreadcrumbs?: any; ht setShowTriggerIntervalNaNError, timeRange, setShowTimeRangeError, - setShowCronError, + setShowCronError ).then((response) => { error = response; }); @@ -261,16 +266,20 @@ export function CreateReport(props: { [x: string]: any; setBreadcrumbs?: any; ht 'Content-Type': 'application/json', }, }) - .then(async (resp: { scheduler_response: { reportDefinitionId: string; }; }) => { - //TODO: consider handle the on demand report generation from server side instead - if (metadata.trigger.trigger_type === 'On demand') { - const reportDefinitionId = - resp.scheduler_response.reportDefinitionId; - generateReportFromDefinitionId(reportDefinitionId, httpClient); + .then( + async (resp: { + scheduler_response: { reportDefinitionId: string }; + }) => { + //TODO: consider handle the on demand report generation from server side instead + if (metadata.trigger.trigger_type === 'On demand') { + const reportDefinitionId = + resp.scheduler_response.reportDefinitionId; + generateReportFromDefinitionId(reportDefinitionId, httpClient); + } + window.location.assign(`reports-dashboards#/create=success`); } - window.location.assign(`reports-dashboards#/create=success`); - }) - .catch((error: {body: { statusCode: number; }; }) => { + ) + .catch((error: { body: { statusCode: number } }) => { console.log('error in creating report definition: ' + error); if (error.body.statusCode === 403) { handleErrorOnCreateToast('permissions'); @@ -306,12 +315,16 @@ export function CreateReport(props: { [x: string]: any; setBreadcrumbs?: any; ht

- {!getNavGroupEnabled && i18n.translate('opensearch.reports.createReportDefinition.title', { - defaultMessage: 'Create report definition', - })} + {!getNavGroupEnabled && + i18n.translate( + 'opensearch.reports.createReportDefinition.title', + { + defaultMessage: 'Create report definition', + } + )}

- {!getNavGroupEnabled && } + {!getNavGroupEnabled && } Date: Wed, 5 Feb 2025 15:49:42 -0800 Subject: [PATCH 3/3] linter changes Signed-off-by: sumukhswamy --- .../create/create_report_definition.tsx | 60 +++++++------------ .../report_definitions/delivery/delivery.tsx | 4 +- .../report_settings/report_settings.tsx | 8 +-- .../report_trigger/report_trigger.tsx | 4 +- 4 files changed, 29 insertions(+), 47 deletions(-) diff --git a/public/components/report_definitions/create/create_report_definition.tsx b/public/components/report_definitions/create/create_report_definition.tsx index 66696cb1..ed6de787 100644 --- a/public/components/report_definitions/create/create_report_definition.tsx +++ b/public/components/report_definitions/create/create_report_definition.tsx @@ -23,35 +23,35 @@ import { } from '../../utils/utils'; import { definitionInputValidation } from '../utils/utils'; -interface reportParamsType { +interface ReportParamsType { report_name: string; report_source: string; description: string; - core_params: visualReportParams | dataReportParams; + core_params: VisualReportParams | DataReportParams; } -interface visualReportParams { +interface VisualReportParams { base_url: string; report_format: string; header: string; footer: string; time_duration: string; - timeRangeParams: timeRangeParams; + timeRangeParams: TimeRangeParams; } -interface dataReportParams { +interface DataReportParams { saved_search_id: number; base_url: string; report_format: string; time_duration: string; - timeRangeParams: timeRangeParams; + timeRangeParams: TimeRangeParams; } -interface triggerType { +interface TriggerType { trigger_type: string; trigger_params?: any; } -interface deliveryType { - configIds: Array; +interface DeliveryType { + configIds: string[]; title: string; textDescription: string; htmlDescription: string; @@ -79,13 +79,13 @@ interface Cron { }; } -export interface reportDefinitionParams { - report_params: reportParamsType; - delivery: deliveryType; - trigger: triggerType; +export interface ReportDefinitionParams { + report_params: ReportParamsType; + delivery: DeliveryType; + trigger: TriggerType; } -export interface timeRangeParams { +export interface TimeRangeParams { timeFrom: Date; timeTo: Date; } @@ -98,7 +98,7 @@ export function CreateReport(props: { }) { const { chrome } = props; - let createReportDefinitionRequest: reportDefinitionParams = { + let createReportDefinitionRequest: ReportDefinitionParams = { report_params: { report_name: '', report_source: '', @@ -199,36 +199,18 @@ export function CreateReport(props: { addErrorOnCreateToastHandler(errorType); }; - const addInvalidTimeRangeToastHandler = () => { - const errorToast = { - title: i18n.translate( - 'opensearch.reports.createReportDefinition.error.invalidTimeRange', - { defaultMessage: 'Invalid time range selected.' } - ), - color: 'danger', - iconType: 'alert', - id: 'timeRangeErrorToast', - }; - // @ts-ignore - setToasts(toasts.concat(errorToast)); - }; - - const handleInvalidTimeRangeToast = () => { - addInvalidTimeRangeToastHandler(); - }; - const removeToast = (removedToast: { id: string }) => { setToasts(toasts.filter((toast: any) => toast.id !== removedToast.id)); }; - let timeRange = { + const NewTimeRange = { timeFrom: new Date(), timeTo: new Date(), }; const createNewReportDefinition = async ( - metadata: reportDefinitionParams, - timeRange: timeRangeParams + metadata: ReportDefinitionParams, + timeRange: TimeRangeParams ) => { const { httpClient } = props; //TODO: need better handle @@ -329,8 +311,8 @@ export function CreateReport(props: { edit={false} editDefinitionId={''} // empty string since we are coming from create reportDefinitionRequest={createReportDefinitionRequest} - httpClientProps={props['httpClient']} - timeRange={timeRange} + httpClientProps={props.httpClient} + timeRange={NewTimeRange} showSettingsReportNameError={showSettingsReportNameError} settingsReportNameErrorMessage={settingsReportNameErrorMessage} showSettingsReportSourceError={showSettingsReportSourceError} @@ -359,7 +341,7 @@ export function CreateReport(props: { onClick={() => createNewReportDefinition( createReportDefinitionRequest, - timeRange + NewTimeRange ) } id={'createNewReportDefinition'} diff --git a/public/components/report_definitions/delivery/delivery.tsx b/public/components/report_definitions/delivery/delivery.tsx index 18bef26a..6dfa520d 100644 --- a/public/components/report_definitions/delivery/delivery.tsx +++ b/public/components/report_definitions/delivery/delivery.tsx @@ -25,7 +25,7 @@ import { testMessageFailureMessage, } from './delivery_constants'; import 'react-mde/lib/styles/css/react-mde-all.css'; -import { reportDefinitionParams } from '../create/create_report_definition'; +import { ReportDefinitionParams } from '../create/create_report_definition'; import ReactMDE from 'react-mde'; import { converter } from '../utils'; import { getAvailableNotificationsChannels } from '../../main/main_utils'; @@ -41,7 +41,7 @@ export let includeDelivery = false; export type ReportDeliveryProps = { edit: boolean; editDefinitionId: string; - reportDefinitionRequest: reportDefinitionParams; + reportDefinitionRequest: ReportDefinitionParams; httpClientProps: any; showDeliveryChannelError: boolean; deliveryChannelError: string; diff --git a/public/components/report_definitions/report_settings/report_settings.tsx b/public/components/report_definitions/report_settings/report_settings.tsx index 2eb0b4b9..7d886587 100644 --- a/public/components/report_definitions/report_settings/report_settings.tsx +++ b/public/components/report_definitions/report_settings/report_settings.tsx @@ -35,8 +35,8 @@ import { import ReactMde from 'react-mde'; import 'react-mde/lib/styles/css/react-mde-all.css'; import { - reportDefinitionParams, - timeRangeParams, + ReportDefinitionParams, + TimeRangeParams, } from '../create/create_report_definition'; import { parseInContextUrl, @@ -59,9 +59,9 @@ import { ReportTrigger } from '../report_trigger'; type ReportSettingProps = { edit: boolean; editDefinitionId: string; - reportDefinitionRequest: reportDefinitionParams; + reportDefinitionRequest: ReportDefinitionParams; httpClientProps: any; - timeRange: timeRangeParams; + timeRange: TimeRangeParams; showSettingsReportNameError: boolean; settingsReportNameErrorMessage: string; showSettingsReportSourceError: boolean; diff --git a/public/components/report_definitions/report_trigger/report_trigger.tsx b/public/components/report_definitions/report_trigger/report_trigger.tsx index 1e439ae6..a44cc146 100644 --- a/public/components/report_definitions/report_trigger/report_trigger.tsx +++ b/public/components/report_definitions/report_trigger/report_trigger.tsx @@ -21,7 +21,7 @@ import { EuiCompressedFieldNumber, } from '@elastic/eui'; import moment, { Moment } from 'moment'; -import { reportDefinitionParams } from '../create/create_report_definition'; +import { ReportDefinitionParams } from '../create/create_report_definition'; import { SCHEDULE_RECURRING_OPTIONS, INTERVAL_TIME_PERIODS, @@ -36,7 +36,7 @@ import { TimezoneSelect } from './timezone'; type ReportTriggerProps = { edit: boolean; editDefinitionId: string; - reportDefinitionRequest: reportDefinitionParams; + reportDefinitionRequest: ReportDefinitionParams; httpClientProps: any; showTriggerIntervalNaNError: boolean; showCronError: boolean;