Skip to content

Commit 9acef94

Browse files
authored
Improve smart filters (#1903)
1 parent 1120832 commit 9acef94

File tree

3 files changed

+63
-5
lines changed

3 files changed

+63
-5
lines changed

kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/AddFilter.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ const AddFilter: React.FC<FilterModalProps> = ({
4040
addFilter(data);
4141
} else {
4242
// other case is not applying the filter
43-
data.name = data.name ? data.name : 'Unsaved filter';
43+
const dataCodeLabel =
44+
data.code.length > 16 ? `${data.code.slice(0, 16)}...` : data.code;
45+
data.name = data.name || dataCodeLabel;
46+
4447
activeFilterHandler(data, -1);
4548
toggleIsOpen();
4649
}

kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/Filters.styled.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,17 +235,18 @@ export const ActiveSmartFilter = styled.div`
235235
align-items: center;
236236
justify-content: space-between;
237237
color: ${({ theme }) => theme.input.label.color};
238-
padding: 10px 2px;
238+
padding: 16px 8px;
239239
`;
240240

241241
export const DeleteSavedFilterIcon = styled.div`
242242
color: ${({ theme }) => theme.icons.closeIcon};
243243
border-left: 1px solid ${({ theme }) => theme.savedFilterDivider.color};
244244
display: flex;
245245
align-items: center;
246-
padding-left: 5px;
246+
padding-left: 6px;
247247
height: 24px;
248248
cursor: pointer;
249+
margin-left: 4px;
249250
`;
250251

251252
export const ConfirmDeletionText = styled.h3`

kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/__tests__/AddFilter.spec.tsx

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ const filters: MessageFilters[] = [
1212
{ name: 'name2', code: 'code2' },
1313
];
1414

15+
const editFilterMock = jest.fn();
16+
1517
const setupComponent = (props: Partial<FilterModalProps> = {}) =>
1618
render(
1719
<AddFilter
@@ -20,7 +22,7 @@ const setupComponent = (props: Partial<FilterModalProps> = {}) =>
2022
deleteFilter={jest.fn()}
2123
activeFilterHandler={jest.fn()}
2224
toggleEditModal={jest.fn()}
23-
editFilter={jest.fn()}
25+
editFilter={editFilterMock}
2426
filters={props.filters || filters}
2527
{...props}
2628
/>
@@ -83,6 +85,26 @@ describe('AddFilter component', () => {
8385
expect(addFilterBtn).toBeEnabled();
8486
expect(codeTextBox).toHaveValue(code);
8587
});
88+
89+
it('calls editFilter when edit button is clicked in saved filters', () => {
90+
const savedFiltersButton = screen.getByText('Saved Filters');
91+
expect(savedFiltersButton).toBeInTheDocument();
92+
93+
userEvent.click(savedFiltersButton);
94+
95+
const index = 0;
96+
97+
const editButton = screen.getAllByText('Edit')[index];
98+
userEvent.click(editButton);
99+
100+
const { code, name } = filters[index];
101+
102+
expect(editFilterMock).toHaveBeenCalledTimes(1);
103+
expect(editFilterMock).toHaveBeenCalledWith({
104+
index,
105+
filter: { code, name },
106+
});
107+
});
86108
});
87109

88110
describe('onSubmit with Filter being saved', () => {
@@ -91,6 +113,7 @@ describe('AddFilter component', () => {
91113
const toggleModelMock = jest.fn();
92114

93115
const codeValue = 'filter code';
116+
const longCodeValue = 'a long filter code';
94117
const nameValue = 'filter name';
95118

96119
beforeEach(async () => {
@@ -149,7 +172,7 @@ describe('AddFilter component', () => {
149172
expect(activeFilterHandlerMock).toHaveBeenCalledTimes(1);
150173
expect(activeFilterHandlerMock).toHaveBeenCalledWith(
151174
{
152-
name: 'Unsaved filter',
175+
name: codeValue,
153176
code: codeValue,
154177
saveFilter: false,
155178
},
@@ -184,5 +207,36 @@ describe('AddFilter component', () => {
184207
});
185208
});
186209
});
210+
211+
it('should use sliced code as the filter name if filter name is empty', async () => {
212+
const codeTextBox = screen.getAllByRole('textbox')[0];
213+
const nameTextBox = screen.getAllByRole('textbox')[1];
214+
const addFilterBtn = screen.getByRole('button', { name: /Add filter/i });
215+
216+
userEvent.clear(nameTextBox);
217+
userEvent.clear(codeTextBox);
218+
userEvent.paste(codeTextBox, longCodeValue);
219+
220+
expect(nameTextBox).toHaveValue('');
221+
expect(codeTextBox).toHaveValue(longCodeValue);
222+
223+
userEvent.click(addFilterBtn);
224+
225+
const filterName = `${longCodeValue.slice(0, 16)}...`;
226+
227+
await waitFor(() => {
228+
expect(activeFilterHandlerMock).toHaveBeenCalledTimes(1);
229+
expect(activeFilterHandlerMock).toHaveBeenCalledWith(
230+
{
231+
name: filterName,
232+
code: longCodeValue,
233+
saveFilter: false,
234+
},
235+
-1
236+
);
237+
expect(codeTextBox).toHaveValue('');
238+
expect(toggleModelMock).toHaveBeenCalled();
239+
});
240+
});
187241
});
188242
});

0 commit comments

Comments
 (0)