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

Feat/vadc data dictionary table #1471

Merged
Merged
Show file tree
Hide file tree
Changes from 47 commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
a4dcd4d
Remove unnecessary outcome prop from histogram rendering (#1459)
tianj7 Nov 28, 2023
eac497a
feat(dataDictionaryAppPlaceholder): Initial commit
jarvisraymond-uchicago Dec 4, 2023
4a1489c
feat(dataDictionaryAppPlaceholder): Ran linter
jarvisraymond-uchicago Dec 4, 2023
0a7aa9a
feat(vadcDataDictionaryTable): Initial commit
jarvisraymond-uchicago Dec 6, 2023
cadd05b
feat(vadcDataDictionaryTable): created working table header abstraction
jarvisraymond-uchicago Dec 6, 2023
0ba3ab1
feat(vadcDataDictionaryTable): Wrote styles for tableHeaders and remo…
jarvisraymond-uchicago Dec 6, 2023
8033182
feat(vadcDataDictionaryTable): added entries header
jarvisraymond-uchicago Dec 6, 2023
ff2b8c2
feat(vadcDataDictionaryTable): Updated component sort logic
jarvisraymond-uchicago Dec 11, 2023
765ce22
feat(vadcDataDictionaryTable): Simplified functions for updating arro…
jarvisraymond-uchicago Dec 12, 2023
1d6c6dc
feat(vadcDataDictionaryTable): added secondary row to hold data viz a…
jarvisraymond-uchicago Dec 12, 2023
b5d9af8
feat(vadcDataDictionaryTable): Added search
jarvisraymond-uchicago Dec 13, 2023
4b77e09
feat(vadcDataDictionaryTable): Added search highlighting
jarvisraymond-uchicago Dec 13, 2023
6be6f93
feat(vadcDataDictionaryTable): Added search highlighting for hidden i…
jarvisraymond-uchicago Dec 13, 2023
a736de6
feat(vadcDataDictionaryTable): added pagination controls:
jarvisraymond-uchicago Dec 15, 2023
94855d4
feat(vadcDataDictionaryTable): Began converting JSX to TSX
jarvisraymond-uchicago Dec 18, 2023
f66f3d7
feat(vadcDataDictionaryTable): Converted remaining JSX to TSX, change…
jarvisraymond-uchicago Dec 19, 2023
b58a22f
feat(vadcDataDictionaryTable): Styled and updated expandable row
jarvisraymond-uchicago Dec 20, 2023
1922bc1
feat(vadcDataDictionaryTable): fixed length of highlight for expanded…
jarvisraymond-uchicago Dec 20, 2023
001f044
feat(vadcDataDictionaryTable): Changed location of search bar, made s…
jarvisraymond-uchicago Jan 2, 2024
e906c7c
feat(vadcDataDictionaryTable): Resolved ESLINT issues, got search hig…
jarvisraymond-uchicago Jan 2, 2024
d2877bf
feat(vadcDataDictionaryTable): added preprocessing function to add pe…
jarvisraymond-uchicago Jan 2, 2024
ca2cfca
feat(vadcDataDictionaryTable): Updated pagination logic, search logic…
jarvisraymond-uchicago Jan 9, 2024
46d3ef0
feat(vadcDataDictionaryTable): Fixed animation for dropdown row, sepe…
jarvisraymond-uchicago Jan 9, 2024
9b80cdc
feat(vadcDataDictionaryTable): Updated GenerateTableData
jarvisraymond-uchicago Jan 10, 2024
5cd902f
Merge branch 'master' into feat/vadcDataDictionaryTable
jarvisraymond-uchicago Jan 10, 2024
41db0b5
feat(vadcDataDictionaryTable): Removed console log statements
jarvisraymond-uchicago Jan 10, 2024
803db07
vadcDataDictionaryTable): removed console log
jarvisraymond-uchicago Jan 16, 2024
3061f03
feat(vadcDataDictionaryTable): made css more consistent
jarvisraymond-uchicago Jan 16, 2024
138e95e
feat(vadcDataDictionaryTable): Fixed bug in GenerateTableData, fixed …
jarvisraymond-uchicago Jan 16, 2024
d439707
feat(vadcDataDictionaryTable): Abstracted function checkIfCellContain…
jarvisraymond-uchicago Jan 16, 2024
a552315
feat(vadcDataDictionaryTable): Abstracted out remaining CheckSearchTe…
jarvisraymond-uchicago Jan 16, 2024
b1d1e4f
feat(vadcDataDictionaryTable): Wrote unit test for detail tables
jarvisraymond-uchicago Jan 16, 2024
71e41fa
feat(vadcDataDictionaryTable): added test for table row text
jarvisraymond-uchicago Jan 16, 2024
db67562
feat(vadcDataDictionaryTable): fixed linting issues
jarvisraymond-uchicago Jan 16, 2024
ffdb99e
feat(vadcDataDictionaryTable): Wrote unit tests for CheckSearchTermUtils
jarvisraymond-uchicago Jan 17, 2024
89e9fb8
feat(vadcDataDictionaryTable): Added tests for PreprocessTableData an…
jarvisraymond-uchicago Jan 17, 2024
53d5a16
feat(vadcDataDictionaryTable): Linted test files
jarvisraymond-uchicago Jan 17, 2024
f516484
feat(vadcDataDictionaryTable): Added working pagination controls test
jarvisraymond-uchicago Jan 17, 2024
8757d96
feat(vadcDataDictionaryTable): linted test file
jarvisraymond-uchicago Jan 17, 2024
13c2849
feat(vadcDataDictionaryTable): wrote unit test for entries header
jarvisraymond-uchicago Jan 17, 2024
9a090ba
feat(vadcDataDictionaryTable): Added working test for Header component
jarvisraymond-uchicago Jan 17, 2024
7c6b871
feat(vadcDataDictionaryTable): added test for ColumnHeaders
jarvisraymond-uchicago Jan 17, 2024
0937d7c
feat(vadcDataDictionaryTable): fixed test issues and eslint issues
jarvisraymond-uchicago Jan 17, 2024
09f06d8
feat(vadcDataDictionaryTable): removed unneeded comments and formated…
jarvisraymond-uchicago Jan 17, 2024
f1d5218
feat(vadcDataDictionaryTable): fixed off by one error in entries head…
jarvisraymond-uchicago Jan 17, 2024
7c43907
Merge branch 'feat/vadc_sprint01' into feat/vadcDataDictionaryTable
jarvisraymond-uchicago Jan 17, 2024
f86416b
feat(vadcDataDictionaryTable): ran linter
jarvisraymond-uchicago Jan 17, 2024
31aec3d
feat(vadcDataDictionaryTable): Reduced test data size, added explanat…
jarvisraymond-uchicago Jan 18, 2024
93381e9
feat(vadcDataDictionaryTable): Ran linter
jarvisraymond-uchicago Jan 18, 2024
99b9d80
feat(vadcDataDictionaryTable): removed unintentionally changed file
jarvisraymond-uchicago Jan 18, 2024
8a58e3a
feat(vadcDataDictionaryTable): Renamed folder to AtlasDataDictionary
jarvisraymond-uchicago Jan 23, 2024
a424948
feat(vadcDataDictionaryTable): changed references from data dictionar…
jarvisraymond-uchicago Jan 23, 2024
b5d975f
feat(vadcDataDictionaryTable): changed more references from data dic…
jarvisraymond-uchicago Jan 23, 2024
e979cea
feat(vadcDataDictionaryTable): Removed unneeded console log statement
jarvisraymond-uchicago Jan 23, 2024
d928c07
feat(vadcDataDictionaryTable): changed 2 more references from data di…
jarvisraymond-uchicago Jan 23, 2024
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
742 changes: 734 additions & 8 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"@fortawesome/react-fontawesome": "^0.2.0",
"@gen3/guppy": "^0.18.0",
"@gen3/ui-component": "^0.11.4",
"@mantine/core": "^6.0.21",
"@reactour/tour": "^2.12.0",
"@upsetjs/venn.js": "^1.4.2",
"antd": "^4.24.10",
Expand Down
31 changes: 31 additions & 0 deletions src/Analysis/DataDictionary/ColumnHeaders/ColumnHeaders.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import React from 'react';
import { render, fireEvent, screen } from '@testing-library/react';
import { ISortConfig } from '../Interfaces/Interfaces';
import '@testing-library/jest-dom/extend-expect';
import ColumnHeaders from './ColumnHeaders';

const sortConfig: ISortConfig = { sortKey: '', direction: 'ascending' };
describe('ColumnHeaders', () => {
it('renders ColumnHeaders ', () => {
const handleSort = jest.fn();

render(
<table>
<ColumnHeaders handleSort={handleSort} sortConfig={sortConfig} />
</table>,
);
expect(screen.getByTestId('column-headers')).toBeInTheDocument();
});
it('calls handleSort when a column is clicked', () => {
const handleSort = jest.fn();
render(
<table>
<ColumnHeaders handleSort={handleSort} sortConfig={sortConfig} />
</table>,
);
fireEvent.click(
screen.getAllByRole('presentation', { name: 'caret-up' })[0],
);
expect(handleSort).toHaveBeenCalledTimes(1);
});
});
125 changes: 125 additions & 0 deletions src/Analysis/DataDictionary/ColumnHeaders/ColumnHeaders.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import React from 'react';
import Header from './Header';
import { ISortConfig } from '../Interfaces/Interfaces';

interface ITableHeadersProps {
handleSort: Function;
sortConfig: ISortConfig;
}

const headerItems = [
{
headerKey: '',
jsx: <React.Fragment />,
},
{
headerKey: 'vocabularyID',
jsx: (
<span>
Vocabulary
<br />
ID
</span>
),
},
{
headerKey: 'conceptID',
jsx: (
<span>
Concept
<br />
ID
</span>
),
},
{
headerKey: 'conceptCode',
jsx: (
<span>
Concept
<br />
Code
</span>
),
},
{
headerKey: 'conceptName',
jsx: (
<span>
Concept
<br />
Name
</span>
),
},
{
headerKey: 'conceptClassID',
jsx: (
<span>
Concept
<br />
Class&nbsp;ID
</span>
),
},
{
headerKey: 'numberOfPeopleWithVariable',
jsx: (
<span>
#&nbsp;/&nbsp;%&nbsp;of&nbsp;People
<br />
with&nbsp;Variable
</span>
),
},
{
headerKey: 'numberOfPeopleWhereValueIsFilled',
jsx: (
<span>
#&nbsp;/&nbsp;%&nbsp;of&nbsp;People
<br />
where&nbsp;Value&nbsp;is&nbsp;Filled
</span>
),
},
{
headerKey: 'numberOfPeopleWhereValueIsNull',
jsx: (
<span>
#&nbsp;/&nbsp;%&nbsp;of&nbsp;People
<br />
where&nbsp;Value&nbsp;is&nbsp;Null
</span>
),
},
{
headerKey: 'valueStoredAs',
jsx: (
<span>
Value
<br />
Stored&nbsp;As
</span>
),
},
{ headerKey: 'valueSummary', jsx: <span>Value&nbsp;Summary</span> },
];

const ColumnHeaders = ({ handleSort, sortConfig }: ITableHeadersProps) => (
<thead className={'column-headers'} data-testid='column-headers'>
<tr>
{headerItems.map((item) => (
<Header
key={item.headerKey}
handleSort={handleSort}
headerJSX={item.jsx}
headerKey={item.headerKey}
sortConfig={sortConfig}
sortable={item.headerKey !== 'valueSummary' && item.headerKey !== ''}
/>
))}
</tr>
</thead>
);

export default ColumnHeaders;
101 changes: 101 additions & 0 deletions src/Analysis/DataDictionary/ColumnHeaders/Header.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import React from 'react';
import {
render, fireEvent, screen, cleanup,
} from '@testing-library/react';
import { ISortConfig } from '../Interfaces/Interfaces';
import Header from './Header'; // adjust the import path if necessary
import '@testing-library/jest-dom/extend-expect';

describe('Header component', () => {
afterEach(cleanup);
const defaultProps: any = {
handleSort: jest.fn(),
headerJSX: <div data-testid='header'>Test Header Text</div>,
headerKey: 'key1',
sortConfig: { key: 'key1', sortKey: '', direction: '' },
sortable: true,
};

it('renders the Header component correctly when sortable is true and there is no sort config', () => {
render(
<table>
<thead>
<tr>
<Header {...defaultProps} />
</tr>
</thead>
</table>,
);
expect(screen.getAllByText('Test Header Text').length).toBeGreaterThan(0);
});

it(`renders the Header component correctly when sortable is true and
there is a sort config with ascending direction`, () => {
const sortConfig: ISortConfig = {
sortKey: 'key1',
direction: 'ascending',
};
render(
<table>
<thead>
<tr>
<Header {...defaultProps} sortConfig={sortConfig} />
</tr>
</thead>
</table>,
);
expect(screen.getAllByText('Test Header Text').length).toBeGreaterThan(0);
const caretUpArrows = screen.getAllByRole('presentation', {
name: /caret-up/i,
});

let activeCaretUp = false;
caretUpArrows.forEach((caretUpArrow) => {
if (caretUpArrow.className.includes('active')) activeCaretUp = true;
});
expect(activeCaretUp).toBe(true);
});

it(`renders the Header component correctly when sortable is true and
there is a sort config with descending direction`, () => {
const sortConfig: ISortConfig = {
sortKey: 'key1',
direction: 'descending',
};
render(
<table>
<thead>
<tr>
<Header {...defaultProps} sortConfig={sortConfig} />
</tr>
</thead>
</table>,
);
expect(screen.getAllByText('Test Header Text').length).toBeGreaterThan(0);
const caretDownArrows = screen.getAllByRole('presentation', {
name: /caret-down/i,
});

let activeCaretDown = false;
caretDownArrows.forEach((caretDownArrow) => {
if (caretDownArrow.className.includes('active')) activeCaretDown = true;
});
expect(activeCaretDown).toBe(true);
});

it('calls handleSort function when header is clicked', () => {
const handleSort = jest.fn();
render(
<table>
<thead>
<tr>
<Header {...defaultProps} handleSort={handleSort} />
</tr>
</thead>
</table>,
);
fireEvent.click(screen.getAllByText('Test Header Text')[0]);
expect(handleSort).toHaveBeenCalledTimes(1);
expect(handleSort).toHaveBeenCalledWith('key1');
});
});
68 changes: 68 additions & 0 deletions src/Analysis/DataDictionary/ColumnHeaders/Header.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import React from 'react';
import { ISortConfig } from '../Interfaces/Interfaces';
import CaretUp from '../Icons/CaretUp';
import CaretDown from '../Icons/CaretDown';

interface IHeaderProps {
handleSort: Function;
headerJSX: JSX.IntrinsicElements;
headerKey: string;
sortConfig: ISortConfig;
sortable: Boolean;
}

const Header = ({
handleSort,
headerJSX,
headerKey,
sortConfig,
sortable,
}: IHeaderProps) => {
const getSortDirectionForCurrentColumn = () => {
if (sortConfig.sortKey === headerKey) {
return sortConfig.direction;
}
return null;
};

if (!sortable) {
return (
<th className='not-sortable' key={headerKey}>
{headerJSX}
</th>
);
}
return (
<th
data-testid='header'
key={headerKey}
onClick={() => handleSort(headerKey)}
>
<div className='table-column-sorters'>
<span className='ant-table-column-title'>{headerJSX}</span>
<span className='table-column-sorter-inner'>
<span
role='presentation'
aria-label='caret-up'
className={`table-column-sorter-up ${
getSortDirectionForCurrentColumn() === 'ascending' && 'active'
}`}
>
<CaretUp />
</span>
<span
role='presentation'
aria-label='caret-down'
className={`table-column-sorter-down ${
getSortDirectionForCurrentColumn() === 'descending' && 'active'
}`}
>
<CaretDown />
</span>
</span>
</div>
</th>
);
};

export default Header;
Loading
Loading