Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use advanced settings for csv separator and visual report timezone #209

Merged
merged 3 commits into from
Nov 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,9 @@ const generateInContextReport = async (
};

fetch(
`../api/reporting/generateReport?timezone=${
Intl.DateTimeFormat().resolvedOptions().timeZone
}&dateFormat=${uiSettingsService.get('dateFormat')}`,
`../api/reporting/generateReport?${new URLSearchParams(
uiSettingsService.getSearchParams()
)}`,
{
headers: {
'Content-Type': 'application/json',
Expand Down
10 changes: 2 additions & 8 deletions dashboards-reports/public/components/main/main_utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -181,10 +181,7 @@ export const generateReportFromDefinitionId = async (
headers: {
'Content-Type': 'application/json',
},
query: {
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
dateFormat: uiSettingsService.get('dateFormat'),
},
query: uiSettingsService.getSearchParams(),
})
.then(async (response: any) => {
// for emailing a report, this API response doesn't have response body
Expand Down Expand Up @@ -217,10 +214,7 @@ export const generateReportById = async (
) => {
await httpClient
.get(`../api/reporting/generateReport/${reportId}`, {
query: {
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
dateFormat: uiSettingsService.get('dateFormat'),
},
query: uiSettingsService.getSearchParams(),
})
.then(async (response) => {
//TODO: duplicate code, extract to be a function that can reuse. e.g. handleResponse(response)
Expand Down
14 changes: 14 additions & 0 deletions dashboards-reports/public/components/utils/settings_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,18 @@ export const uiSettingsService = {
get: (key: string, defaultOverride?: any) => {
return uiSettings?.get(key, defaultOverride) || '';
},
getSearchParams: function () {
const rawTimeZone = this.get('dateFormat:tz');
const timezone =
!rawTimeZone || rawTimeZone === 'Browser'
? Intl.DateTimeFormat().resolvedOptions().timeZone
: rawTimeZone;
const dateFormat = this.get('dateFormat');
const csvSeparator = this.get('csv:separator');
return {
timezone,
dateFormat,
csvSeparator,
};
},
};
3 changes: 3 additions & 0 deletions dashboards-reports/server/routes/lib/createReport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ export const createReport = async (
// @ts-ignore
const dateFormat =
request.query.dateFormat || DATA_REPORT_CONFIG.excelDateFormat;
// @ts-ignore
const csvSeparator = request.query.csvSeparator || ',';
const {
basePath,
serverInfo: { protocol, port, hostname },
Expand Down Expand Up @@ -98,6 +100,7 @@ export const createReport = async (
report,
opensearchClient,
dateFormat,
csvSeparator,
isScheduledTask,
logger
);
Expand Down
7 changes: 5 additions & 2 deletions dashboards-reports/server/routes/report.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ export default function (router: IRouter, accessInfo: AccessInfoType) {
query: schema.object({
timezone: schema.maybe(schema.string()),
dateFormat: schema.maybe(schema.string()),
csvSeparator: schema.maybe(schema.string()),
}),
},
},
Expand Down Expand Up @@ -122,7 +123,8 @@ export default function (router: IRouter, accessInfo: AccessInfoType) {
}),
query: schema.object({
timezone: schema.string(),
dateFormat: schema.maybe(schema.string()),
dateFormat: schema.string(),
csvSeparator: schema.string(),
}),
},
},
Expand Down Expand Up @@ -188,7 +190,8 @@ export default function (router: IRouter, accessInfo: AccessInfoType) {
}),
query: schema.object({
timezone: schema.string(),
dateFormat: schema.maybe(schema.string()),
dateFormat: schema.string(),
csvSeparator: schema.string(),
}),
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ const input = {
},
};

const mockDateFormat = 'date_hour_minute_second_fraction';
const mockDateFormat = 'MM/DD/YYYY h:mm:ss.SSS a';

/**
* Max result window size in OpenSearch index settings.
Expand All @@ -84,6 +84,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -95,6 +96,7 @@ describe('test create saved search report', () => {
input,
mockOpenSearchClient([]),
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -105,6 +107,7 @@ describe('test create saved search report', () => {
input,
mockOpenSearchClient([]),
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -118,6 +121,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -137,6 +141,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand Down Expand Up @@ -170,6 +175,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand Down Expand Up @@ -206,6 +212,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand Down Expand Up @@ -234,6 +241,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand Down Expand Up @@ -266,6 +274,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -292,6 +301,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -304,6 +314,30 @@ describe('test create saved search report', () => {
);
}, 20000);

test('create report for data set with comma and custom separator', async () => {
const hits = [
hit({ category: ',c1', customer_gender: 'Ma,le' }),
hit({ category: 'c2,', customer_gender: 'M,ale' }),
hit({ category: ',,c3', customer_gender: 'Male,,,' }),
];
const client = mockOpenSearchClient(hits);
const { dataUrl } = await createSavedSearchReport(
input,
client,
mockDateFormat,
'|',
undefined,
mockLogger
);

expect(dataUrl).toEqual(
'category|customer_gender\n' +
',c1|Ma,le\n' +
'c2,|M,ale\n' +
',,c3|Male,,,'
);
}, 20000);

test('create report for data set with nested fields', async () => {
const hits = [
hit({
Expand All @@ -324,6 +358,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -348,6 +383,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand Down Expand Up @@ -378,6 +414,7 @@ describe('test create saved search report', () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand All @@ -404,6 +441,7 @@ test('create report for data set contains null field value', async () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand Down Expand Up @@ -434,6 +472,7 @@ test('create report for data set with metadata fields', async () => {
input,
client,
mockDateFormat,
',',
undefined,
mockLogger
);
Expand Down
4 changes: 2 additions & 2 deletions dashboards-reports/server/routes/utils/dataReportHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,10 @@ export const getOpenSearchData = (
};

//Convert the data to Csv format
export const convertToCSV = async (dataset) => {
export const convertToCSV = async (dataset, csvSeparator) => {
let convertedData: any = [];
const options = {
delimiter: { field: ',', eol: '\n' },
delimiter: { field: csvSeparator, eol: '\n' },
emptyFieldValue: ' ',
};
await converter.json2csvAsync(dataset[0], options).then((csv) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export async function createSavedSearchReport(
report: any,
client: ILegacyClusterClient | ILegacyScopedClusterClient,
dateFormat: string,
csvSeparator: string,
isScheduledTask: boolean = true,
logger: Logger
): Promise<CreateReportResultType> {
Expand All @@ -62,6 +63,7 @@ export async function createSavedSearchReport(
client,
params.core_params,
dateFormat,
csvSeparator,
isScheduledTask,
logger
);
Expand Down Expand Up @@ -148,6 +150,7 @@ async function generateReportData(
client: ILegacyClusterClient | ILegacyScopedClusterClient,
params: any,
dateFormat: string,
csvSeparator: string,
isScheduledTask: boolean,
logger: Logger
) {
Expand Down Expand Up @@ -277,6 +280,6 @@ async function generateReportData(
async function convertOpenSearchDataToCsv() {
const dataset: any = [];
dataset.push(getOpenSearchData(arrayHits, report, params, dateFormat));
return await convertToCSV(dataset);
return await convertToCSV(dataset, csvSeparator);
}
}