Skip to content

Commit

Permalink
Add milestoning setup in Query Option
Browse files Browse the repository at this point in the history
  • Loading branch information
Yannan Gao authored and Yannan Gao committed Jun 10, 2024
1 parent 574fad6 commit 68015b4
Show file tree
Hide file tree
Showing 21 changed files with 889 additions and 365 deletions.
15 changes: 15 additions & 0 deletions packages/legend-application-query-bootstrap/style/index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,10 @@
color: var(--color-legacylight-light-dark-grey-200);
}

.query-builder__projection__result-modifier-prompt__divider {
color: var(--color-legacylight-light-dark-grey-200);
}

.query-builder-property-expression-badge__content {
color: var(--color-legacylight-dark-grey-200);
}
Expand Down Expand Up @@ -1840,4 +1844,15 @@
}
}
}

.query-builder__projection__modal {
::-webkit-scrollbar-thumb {
height: 5rem;
background: var(--color-legacylight-light-grey-300);
outline-offset: -0.2rem;
border-radius: 0.4rem;
outline-color: var(--color-legacylight-light-grey-100);
border-color: var(--color-legacylight-light-grey-100);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ import {
getPackageableElementOptionFormatter,
type PackageableElementOption,
} from '@finos/legend-lego/graph-editor';
import { MilestoningParametersEditor } from './explorer/QueryBuilderMilestoningEditor.js';
import type { QueryBuilder_LegendApplicationPlugin_Extension } from '../stores/QueryBuilder_LegendApplicationPlugin_Extension.js';

export const getParameterValue = (
Expand Down Expand Up @@ -120,7 +119,6 @@ export const QueryBuilderClassSelector = observer(
noMatchMessage?: string | undefined;
}) => {
const { queryBuilderState, classes, onClassChange, noMatchMessage } = props;
const milestoningState = queryBuilderState.milestoningState;
const applicationStore = useApplicationStore();

// class
Expand Down Expand Up @@ -151,10 +149,6 @@ export const QueryBuilderClassSelector = observer(
onClassChange?.(val.value);
};

// milestoning
const showMilestoningEditor = (): void =>
milestoningState.setShowMilestoningEditor(true);

return (
<div className="query-builder__setup__config-group query-builder__setup__config-group--class">
<div className="query-builder__setup__config-group__item ">
Expand Down Expand Up @@ -192,22 +186,6 @@ export const QueryBuilderClassSelector = observer(
.TEMPORARY__isLightColorThemeEnabled,
})}
/>
{queryBuilderState.isQuerySupported && (
<button
className="btn--dark btn__icon--dark query-builder__setup__milestoning"
tabIndex={-1}
onClick={showMilestoningEditor}
disabled={!milestoningState.isMilestonedQuery}
title="Edit Milestoning Parameters"
>
<ClockIcon />
</button>
)}
{milestoningState.isMilestonedQuery && (
<MilestoningParametersEditor
queryBuilderState={queryBuilderState}
/>
)}
</div>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,9 +270,7 @@ test(
const queryBuilder = await waitFor(() =>
renderResult.getByTestId(QUERY_BUILDER_TEST_ID.QUERY_BUILDER),
);
fireEvent.click(
getByTitle(queryBuilder, 'Configure result set modifiers...'),
);
fireEvent.click(getByTitle(queryBuilder, 'Configure Query Options...'));
const modal = await waitFor(() => renderResult.getByRole('dialog'));

await waitFor(() => fireEvent.click(getByText(modal, 'Add Value')));
Expand Down Expand Up @@ -315,7 +313,7 @@ test(
fireEvent.click(getByTitle(queryBuilder, 'Clear all projection columns'));
const closeModal = await waitFor(() => renderResult.getByRole('dialog'));
fireEvent.click(getByText(closeModal, 'Proceed'));
await waitFor(() => renderResult.getByText('Query Options'));
await waitFor(() => renderResult.getByText('Set Query Options'));
const queryBuilderResultModifierPrompt = await waitFor(() =>
renderResult.getByTestId(
QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TDS_RESULT_MODIFIER_PROMPT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import type { Entity } from '@finos/legend-storage';
import { TEST__setUpQueryBuilder } from '../__test-utils__/QueryBuilderComponentTestUtils.js';
import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
import { TEST_DATA__ModelCoverageAnalysisResult_Milestoning } from '../../stores/__tests__/TEST_DATA__ModelCoverageAnalysisResult.js';
import { getParameterNameInput } from './QueryBuilderParametersPanel.test.js';

type QueryComparisonTestCase = [
string,
Expand Down Expand Up @@ -465,6 +466,140 @@ test(
},
);

test(
integrationTest(
'Query builder result modifier panel displays milestoning dates',
),
async () => {
const { renderResult, queryBuilderState } = await TEST__setUpQueryBuilder(
TEST_MilestoningModel,
stub_RawLambda(),
'my::map',
'my::runtime',
TEST_DATA__ModelCoverageAnalysisResult_Milestoning,
);
const _personClass =
queryBuilderState.graphManagerState.graph.getClass('my::Person');
await act(async () => {
queryBuilderState.changeClass(_personClass);
});
const queryBuilderSetup = await waitFor(() =>
renderResult.getByTestId(QUERY_BUILDER_TEST_ID.QUERY_BUILDER_SETUP),
);
await waitFor(() => getAllByText(queryBuilderSetup, 'Person'));

const resultModifierPromptPanel = await waitFor(() =>
renderResult.getByTestId(
QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TDS_RESULT_MODIFIER_PROMPT,
),
);
await waitFor(() =>
getAllByText(resultModifierPromptPanel, 'Business Date'),
);
await waitFor(() =>
getAllByText(resultModifierPromptPanel, 'businessDate'),
);

const queryOptionsButton = await waitFor(() =>
renderResult.getByRole('button', { name: 'Query Options' }),
);
fireEvent.click(queryOptionsButton);
const allVersionsToggle = await renderResult.findByText(
'Query All Milestoned Versions of the Root Class',
);
fireEvent.click(allVersionsToggle);
const applyButton = (await renderResult.findByRole('button', {
name: 'Apply',
})) as HTMLButtonElement;
await waitFor(() => fireEvent.click(applyButton));
await waitFor(() =>
getAllByText(resultModifierPromptPanel, 'All Versions'),
);
await waitFor(() => getAllByText(resultModifierPromptPanel, 'Yes'));
fireEvent.click(queryOptionsButton);
const allVersionInRangeToggle = await renderResult.findByText(
'Optionally apply a date range to get All Versions for',
);
fireEvent.click(allVersionInRangeToggle);
fireEvent.click(renderResult.getByRole('button', { name: 'Apply' }));
await waitFor(() =>
getAllByText(resultModifierPromptPanel, '(startDate - endDate)'),
);
fireEvent.click(queryOptionsButton);
fireEvent.click(allVersionInRangeToggle);
const cancelButton = (await renderResult.findByRole('button', {
name: 'Cancel',
})) as HTMLButtonElement;
fireEvent.click(cancelButton);
await waitFor(() =>
getAllByText(resultModifierPromptPanel, '(startDate - endDate)'),
);
},
);

test(
integrationTest(
'Query builder result modifier panel displays correct milestoning names after renaming milestoning parameters',
),
async () => {
const { renderResult, queryBuilderState } = await TEST__setUpQueryBuilder(
TEST_MilestoningModel,
stub_RawLambda(),
'my::map',
'my::runtime',
TEST_DATA__ModelCoverageAnalysisResult_Milestoning,
);
const _personClass =
queryBuilderState.graphManagerState.graph.getClass('my::Person');
await act(async () => {
queryBuilderState.changeClass(_personClass);
});
const queryBuilderSetup = await waitFor(() =>
renderResult.getByTestId(QUERY_BUILDER_TEST_ID.QUERY_BUILDER_SETUP),
);
await waitFor(() => getAllByText(queryBuilderSetup, 'Person'));

const parameterPanel = await waitFor(() =>
renderResult.getByTestId(QUERY_BUILDER_TEST_ID.QUERY_BUILDER_PARAMETERS),
);

const resultModifierPromptPanel = await waitFor(() =>
renderResult.getByTestId(
QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TDS_RESULT_MODIFIER_PROMPT,
),
);
await waitFor(() =>
getAllByText(resultModifierPromptPanel, 'Business Date'),
);
await waitFor(() =>
getAllByText(resultModifierPromptPanel, 'businessDate'),
);
fireEvent.click(getByText(parameterPanel, 'businessDate'));
const parameterNameInput = getParameterNameInput(renderResult);
fireEvent.change(parameterNameInput, {
target: { value: 'businessDateRenamed' },
});
const updateButton = (await renderResult.findByRole('button', {
name: 'Update',
})) as HTMLButtonElement;
fireEvent.click(updateButton);
await waitFor(() =>
getAllByText(resultModifierPromptPanel, 'businessDateRenamed'),
);
const queryOptionsButton = await waitFor(() =>
renderResult.getByRole('button', { name: 'Query Options' }),
);
fireEvent.click(queryOptionsButton);
const cancelButton = (await renderResult.findByRole('button', {
name: 'Cancel',
})) as HTMLButtonElement;
fireEvent.click(cancelButton);
await waitFor(() =>
getAllByText(resultModifierPromptPanel, 'businessDateRenamed'),
);
},
);

type QueryGetAllVersionsTestCase = [
string,
{
Expand Down Expand Up @@ -571,14 +706,23 @@ describe(
);
});

renderResult.getByTitle('Edit Milestoning Parameters');
fireEvent.click(renderResult.getByTitle('Edit Milestoning Parameters'));
const queryOptionsButton = await waitFor(() =>
renderResult.getByRole('button', { name: 'Query Options' }),
);
fireEvent.click(queryOptionsButton);

const dialog = await waitFor(() => renderResult.getByRole('dialog'));

fireEvent.click(
getByText(dialog, 'Query All Milestoned Versions of the Root Class'),
);

const applyButton = (await renderResult.findByRole('button', {
name: 'Apply',
})) as HTMLButtonElement;

await waitFor(() => fireEvent.click(applyButton));

const receivedOutput = queryBuilderState.buildQuery();

// Compare input JSON and output JSON for building a query
Expand Down Expand Up @@ -666,18 +810,19 @@ describe(
);
});

renderResult.getByTitle('Edit Milestoning Parameters');
fireEvent.click(renderResult.getByTitle('Edit Milestoning Parameters'));

const queryOptionsButton = await waitFor(() =>
renderResult.getByRole('button', { name: 'Query Options' }),
);
fireEvent.click(queryOptionsButton);
const dialog = await waitFor(() => renderResult.getByRole('dialog'));

// Check if we are setting start date and end date when allVersionsInRange() is selected
fireEvent.click(
getByText(
dialog,
'Optionally apply a date range to get All Versions for',
),
);

expect(getAllByText(dialog, 'startDate').length).toBe(2);
expect(getAllByText(dialog, 'endDate').length).toBe(2);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ import {
} from '@finos/legend-lego/code-editor/test';
import { guaranteeNonNullable } from '@finos/legend-shared';

const getParameterNameInput = (renderResult: RenderResult): HTMLInputElement =>
export const getParameterNameInput = (
renderResult: RenderResult,
): HTMLInputElement =>
getByRole(
guaranteeNonNullable(
renderResult.getByText('Parameter Name').parentElement,
Expand Down
Loading

0 comments on commit 68015b4

Please sign in to comment.