@akinon/ai-modal-table 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/__tests__/index.test.js +82 -0
- package/dist/cjs/__tests__/index.test.tsx +94 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.js +59 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.tsx +98 -0
- package/dist/cjs/ai-modal-table/index.d.ts +4 -0
- package/dist/cjs/ai-modal-table/index.d.ts.map +1 -0
- package/dist/cjs/ai-modal-table/index.js +54 -0
- package/dist/cjs/ai-table/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/__tests__/index.test.js +348 -0
- package/dist/cjs/ai-table/__tests__/index.test.tsx +572 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.js +1349 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.tsx +1637 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.js +400 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.tsx +534 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.js +465 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.tsx +597 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.js +453 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.tsx +601 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.js +430 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.tsx +629 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.js +382 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.tsx +507 -0
- package/dist/cjs/ai-table/components/content.d.ts +11 -0
- package/dist/cjs/ai-table/components/content.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/content.js +309 -0
- package/dist/cjs/ai-table/components/filters.d.ts +10 -0
- package/dist/cjs/ai-table/components/filters.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/filters.js +55 -0
- package/dist/cjs/ai-table/components/footer.d.ts +12 -0
- package/dist/cjs/ai-table/components/footer.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/footer.js +24 -0
- package/dist/cjs/ai-table/components/mapper.d.ts +11 -0
- package/dist/cjs/ai-table/components/mapper.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/mapper.js +21 -0
- package/dist/cjs/ai-table/components/pagination.d.ts +11 -0
- package/dist/cjs/ai-table/components/pagination.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/pagination.js +106 -0
- package/dist/cjs/ai-table/components/row-actions.d.ts +14 -0
- package/dist/cjs/ai-table/components/row-actions.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/row-actions.js +52 -0
- package/dist/cjs/ai-table/constants/index.d.ts +17 -0
- package/dist/cjs/ai-table/constants/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/constants/index.js +19 -0
- package/dist/cjs/ai-table/i18n/index.d.ts +3 -0
- package/dist/cjs/ai-table/i18n/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/index.js +14 -0
- package/dist/cjs/ai-table/i18n/translations/en.d.ts +8 -0
- package/dist/cjs/ai-table/i18n/translations/en.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/translations/en.js +9 -0
- package/dist/cjs/ai-table/i18n/translations/tr.d.ts +8 -0
- package/dist/cjs/ai-table/i18n/translations/tr.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/translations/tr.js +9 -0
- package/dist/cjs/ai-table/index.d.ts +4 -0
- package/dist/cjs/ai-table/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/index.js +71 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.js +146 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
- package/dist/cjs/ai-table/utils/data-format/index.d.ts +7 -0
- package/dist/cjs/ai-table/utils/data-format/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/data-format/index.js +43 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.js +291 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.js +48 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/types/index.d.ts +134 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +2 -0
- package/dist/esm/__tests__/index.test.d.ts +2 -0
- package/dist/esm/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/__tests__/index.test.js +80 -0
- package/dist/esm/__tests__/index.test.tsx +94 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.js +57 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.tsx +98 -0
- package/dist/esm/ai-modal-table/index.d.ts +4 -0
- package/dist/esm/ai-modal-table/index.d.ts.map +1 -0
- package/dist/esm/ai-modal-table/index.js +50 -0
- package/dist/esm/ai-table/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/__tests__/index.test.js +346 -0
- package/dist/esm/ai-table/__tests__/index.test.tsx +572 -0
- package/dist/esm/ai-table/components/__tests__/content.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/content.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/content.test.js +1347 -0
- package/dist/esm/ai-table/components/__tests__/content.test.tsx +1637 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.js +398 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.tsx +534 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.js +463 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.tsx +597 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.js +451 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.tsx +601 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.js +428 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.tsx +629 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.js +380 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.tsx +507 -0
- package/dist/esm/ai-table/components/content.d.ts +11 -0
- package/dist/esm/ai-table/components/content.d.ts.map +1 -0
- package/dist/esm/ai-table/components/content.js +305 -0
- package/dist/esm/ai-table/components/filters.d.ts +10 -0
- package/dist/esm/ai-table/components/filters.d.ts.map +1 -0
- package/dist/esm/ai-table/components/filters.js +51 -0
- package/dist/esm/ai-table/components/footer.d.ts +12 -0
- package/dist/esm/ai-table/components/footer.d.ts.map +1 -0
- package/dist/esm/ai-table/components/footer.js +20 -0
- package/dist/esm/ai-table/components/mapper.d.ts +11 -0
- package/dist/esm/ai-table/components/mapper.d.ts.map +1 -0
- package/dist/esm/ai-table/components/mapper.js +17 -0
- package/dist/esm/ai-table/components/pagination.d.ts +11 -0
- package/dist/esm/ai-table/components/pagination.d.ts.map +1 -0
- package/dist/esm/ai-table/components/pagination.js +102 -0
- package/dist/esm/ai-table/components/row-actions.d.ts +14 -0
- package/dist/esm/ai-table/components/row-actions.d.ts.map +1 -0
- package/dist/esm/ai-table/components/row-actions.js +48 -0
- package/dist/esm/ai-table/constants/index.d.ts +17 -0
- package/dist/esm/ai-table/constants/index.d.ts.map +1 -0
- package/dist/esm/ai-table/constants/index.js +16 -0
- package/dist/esm/ai-table/i18n/index.d.ts +3 -0
- package/dist/esm/ai-table/i18n/index.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/index.js +11 -0
- package/dist/esm/ai-table/i18n/translations/en.d.ts +8 -0
- package/dist/esm/ai-table/i18n/translations/en.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/translations/en.js +7 -0
- package/dist/esm/ai-table/i18n/translations/tr.d.ts +8 -0
- package/dist/esm/ai-table/i18n/translations/tr.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/translations/tr.js +7 -0
- package/dist/esm/ai-table/index.d.ts +4 -0
- package/dist/esm/ai-table/index.d.ts.map +1 -0
- package/dist/esm/ai-table/index.js +67 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.js +144 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
- package/dist/esm/ai-table/utils/data-format/index.d.ts +7 -0
- package/dist/esm/ai-table/utils/data-format/index.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/data-format/index.js +38 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.js +289 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.js +44 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/types/index.d.ts +134 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import '@testing-library/jest-dom/vitest';
|
|
2
|
+
|
|
3
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { IS_EDITING_INITIAL_VALUE } from '../../constants';
|
|
8
|
+
import { ActionButtons } from '../row-actions';
|
|
9
|
+
|
|
10
|
+
vi.mock('@akinon/ui-button', () => ({
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
Button: ({ children, icon, onClick, className, disabled, ...props }: any) => (
|
|
13
|
+
<button
|
|
14
|
+
onClick={onClick}
|
|
15
|
+
className={className}
|
|
16
|
+
disabled={disabled}
|
|
17
|
+
data-testid={`button-${icon}`}
|
|
18
|
+
data-icon={icon}
|
|
19
|
+
{...props}
|
|
20
|
+
>
|
|
21
|
+
{children}
|
|
22
|
+
</button>
|
|
23
|
+
)
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
vi.mock('@akinon/ui-layout', () => ({
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
Flex: ({ children, ...props }: any) => (
|
|
29
|
+
<div data-testid="flex" {...props}>
|
|
30
|
+
{children}
|
|
31
|
+
</div>
|
|
32
|
+
)
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
vi.mock('@akinon/ui-theme', () => ({
|
|
36
|
+
useToken: () => ({
|
|
37
|
+
token: { colorBorder: '#ccc' },
|
|
38
|
+
hashId: 'hash-id'
|
|
39
|
+
}),
|
|
40
|
+
getPrefixCls: vi.fn(cls => `ant-${cls}`)
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
vi.mock('@ant-design/cssinjs', () => ({
|
|
44
|
+
useStyleRegister: vi.fn((_config, cb) => {
|
|
45
|
+
cb();
|
|
46
|
+
return (node: React.ReactNode) => node;
|
|
47
|
+
})
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
describe('ActionButtons', () => {
|
|
51
|
+
const defaultProps = {
|
|
52
|
+
hasEdit: false,
|
|
53
|
+
isEditing: false,
|
|
54
|
+
isSelected: false,
|
|
55
|
+
rowId: 1,
|
|
56
|
+
setIsEditingPk: vi.fn(),
|
|
57
|
+
onToggleSelection: vi.fn(),
|
|
58
|
+
customActionButtons: undefined
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
beforeEach(() => {
|
|
62
|
+
vi.clearAllMocks();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const renderComponent = (props = {}) => {
|
|
66
|
+
return render(<ActionButtons {...defaultProps} {...props} />);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
describe('Rendering', () => {
|
|
70
|
+
it('should render flex container', () => {
|
|
71
|
+
renderComponent();
|
|
72
|
+
expect(screen.getByTestId('flex')).toBeInTheDocument();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should always render selection button', () => {
|
|
76
|
+
renderComponent();
|
|
77
|
+
expect(screen.getByTestId('button-katalogkontrol')).toBeInTheDocument();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should render edit button when hasEdit is true', () => {
|
|
81
|
+
renderComponent({ hasEdit: true });
|
|
82
|
+
expect(screen.getByTestId('button-edit')).toBeInTheDocument();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should not render edit button when hasEdit is false', () => {
|
|
86
|
+
renderComponent({ hasEdit: false });
|
|
87
|
+
expect(screen.queryByTestId('button-edit')).not.toBeInTheDocument();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should render custom action buttons when provided', () => {
|
|
91
|
+
const customActionButtons = vi.fn(() => (
|
|
92
|
+
<div data-testid="custom-button">Custom Action</div>
|
|
93
|
+
));
|
|
94
|
+
renderComponent({ customActionButtons });
|
|
95
|
+
|
|
96
|
+
expect(screen.getByTestId('custom-button')).toBeInTheDocument();
|
|
97
|
+
expect(customActionButtons).toHaveBeenCalledWith(1);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should not render custom action buttons when not provided', () => {
|
|
101
|
+
renderComponent({ customActionButtons: undefined });
|
|
102
|
+
expect(screen.queryByTestId('custom-button')).not.toBeInTheDocument();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should render multiple buttons in correct order', () => {
|
|
106
|
+
renderComponent({ hasEdit: true });
|
|
107
|
+
|
|
108
|
+
const buttons = screen.getAllByRole('button');
|
|
109
|
+
// Should have edit button and selection button
|
|
110
|
+
expect(buttons.length).toBeGreaterThanOrEqual(2);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe('Selection Button', () => {
|
|
115
|
+
it('should call onToggleSelection when selection button is clicked', () => {
|
|
116
|
+
const onToggleSelection = vi.fn();
|
|
117
|
+
renderComponent({ onToggleSelection, rowId: 1 });
|
|
118
|
+
|
|
119
|
+
fireEvent.click(screen.getByTestId('button-katalogkontrol'));
|
|
120
|
+
|
|
121
|
+
expect(onToggleSelection).toHaveBeenCalledWith(1);
|
|
122
|
+
expect(onToggleSelection).toHaveBeenCalledTimes(1);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('should pass correct rowId to onToggleSelection', () => {
|
|
126
|
+
const onToggleSelection = vi.fn();
|
|
127
|
+
renderComponent({ onToggleSelection, rowId: 'custom-id' });
|
|
128
|
+
|
|
129
|
+
fireEvent.click(screen.getByTestId('button-katalogkontrol'));
|
|
130
|
+
|
|
131
|
+
expect(onToggleSelection).toHaveBeenCalledWith('custom-id');
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('should apply selected styles when isSelected is true', () => {
|
|
135
|
+
renderComponent({ isSelected: true });
|
|
136
|
+
|
|
137
|
+
const button = screen.getByTestId('button-katalogkontrol');
|
|
138
|
+
expect(button).toHaveClass('bg-green-600');
|
|
139
|
+
expect(button).toHaveClass('border-green-600');
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('should not apply selected styles when isSelected is false', () => {
|
|
143
|
+
renderComponent({ isSelected: false });
|
|
144
|
+
|
|
145
|
+
const button = screen.getByTestId('button-katalogkontrol');
|
|
146
|
+
expect(button).not.toHaveClass('bg-green-600');
|
|
147
|
+
expect(button).not.toHaveClass('border-green-600');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('should have proper default styles for selection button', () => {
|
|
151
|
+
renderComponent({ isSelected: false });
|
|
152
|
+
|
|
153
|
+
const button = screen.getByTestId('button-katalogkontrol');
|
|
154
|
+
expect(button).toHaveClass('border');
|
|
155
|
+
expect(button).toHaveClass('border-ebonyClay-200');
|
|
156
|
+
expect(button).toHaveClass('bg-ebonyClay-400');
|
|
157
|
+
expect(button).toHaveClass('h-7');
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe('Edit Button', () => {
|
|
162
|
+
it('should call setIsEditingPk with rowId when edit button is clicked and not editing', () => {
|
|
163
|
+
const setIsEditingPk = vi.fn();
|
|
164
|
+
renderComponent({
|
|
165
|
+
hasEdit: true,
|
|
166
|
+
isEditing: false,
|
|
167
|
+
rowId: 1,
|
|
168
|
+
setIsEditingPk
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
172
|
+
|
|
173
|
+
expect(setIsEditingPk).toHaveBeenCalledWith(1);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('should call setIsEditingPk with IS_EDITING_INITIAL_VALUE when edit button is clicked and already editing', () => {
|
|
177
|
+
const setIsEditingPk = vi.fn();
|
|
178
|
+
renderComponent({
|
|
179
|
+
hasEdit: true,
|
|
180
|
+
isEditing: true,
|
|
181
|
+
rowId: 1,
|
|
182
|
+
setIsEditingPk
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
186
|
+
|
|
187
|
+
expect(setIsEditingPk).toHaveBeenCalledWith(IS_EDITING_INITIAL_VALUE);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('should pass correct rowId to setIsEditingPk', () => {
|
|
191
|
+
const setIsEditingPk = vi.fn();
|
|
192
|
+
renderComponent({
|
|
193
|
+
hasEdit: true,
|
|
194
|
+
isEditing: false,
|
|
195
|
+
rowId: 'custom-id',
|
|
196
|
+
setIsEditingPk
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
200
|
+
|
|
201
|
+
expect(setIsEditingPk).toHaveBeenCalledWith('custom-id');
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('should have proper styles for edit button', () => {
|
|
205
|
+
renderComponent({ hasEdit: true });
|
|
206
|
+
|
|
207
|
+
const button = screen.getByTestId('button-edit');
|
|
208
|
+
expect(button).toHaveClass('border');
|
|
209
|
+
expect(button).toHaveClass('border-ebonyClay-200');
|
|
210
|
+
expect(button).toHaveClass('bg-ebonyClay-400');
|
|
211
|
+
expect(button).toHaveClass('h-7');
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('should have correct icon for edit button', () => {
|
|
215
|
+
renderComponent({ hasEdit: true });
|
|
216
|
+
|
|
217
|
+
const button = screen.getByTestId('button-edit');
|
|
218
|
+
expect(button).toHaveAttribute('data-icon', 'edit');
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('should have correct icon for selection button', () => {
|
|
222
|
+
renderComponent();
|
|
223
|
+
|
|
224
|
+
const button = screen.getByTestId('button-katalogkontrol');
|
|
225
|
+
expect(button).toHaveAttribute('data-icon', 'katalogkontrol');
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
describe('Event Handling', () => {
|
|
230
|
+
it('should stop event propagation on selection button click', () => {
|
|
231
|
+
const onToggleSelection = vi.fn();
|
|
232
|
+
|
|
233
|
+
renderComponent({ onToggleSelection });
|
|
234
|
+
|
|
235
|
+
const button = screen.getByTestId('button-katalogkontrol');
|
|
236
|
+
fireEvent.click(button);
|
|
237
|
+
|
|
238
|
+
// Event propagation should be stopped (via fireEvent behavior)
|
|
239
|
+
expect(onToggleSelection).toHaveBeenCalled();
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('should only call onToggleSelection, not setIsEditingPk on selection button click', () => {
|
|
243
|
+
const onToggleSelection = vi.fn();
|
|
244
|
+
const setIsEditingPk = vi.fn();
|
|
245
|
+
renderComponent({ onToggleSelection, setIsEditingPk, hasEdit: true });
|
|
246
|
+
|
|
247
|
+
fireEvent.click(screen.getByTestId('button-katalogkontrol'));
|
|
248
|
+
|
|
249
|
+
expect(onToggleSelection).toHaveBeenCalledTimes(1);
|
|
250
|
+
expect(setIsEditingPk).not.toHaveBeenCalled();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
describe('Multiple Row IDs', () => {
|
|
255
|
+
it('should handle numeric rowId', () => {
|
|
256
|
+
const onToggleSelection = vi.fn();
|
|
257
|
+
renderComponent({ rowId: 42, onToggleSelection });
|
|
258
|
+
|
|
259
|
+
fireEvent.click(screen.getByTestId('button-katalogkontrol'));
|
|
260
|
+
|
|
261
|
+
expect(onToggleSelection).toHaveBeenCalledWith(42);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('should handle string rowId', () => {
|
|
265
|
+
const onToggleSelection = vi.fn();
|
|
266
|
+
renderComponent({ rowId: 'row-uuid-123', onToggleSelection });
|
|
267
|
+
|
|
268
|
+
fireEvent.click(screen.getByTestId('button-katalogkontrol'));
|
|
269
|
+
|
|
270
|
+
expect(onToggleSelection).toHaveBeenCalledWith('row-uuid-123');
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it('should handle rowId in edit button click', () => {
|
|
274
|
+
const setIsEditingPk = vi.fn();
|
|
275
|
+
renderComponent({
|
|
276
|
+
rowId: 'uuid-edit',
|
|
277
|
+
hasEdit: true,
|
|
278
|
+
isEditing: false,
|
|
279
|
+
setIsEditingPk
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
283
|
+
|
|
284
|
+
expect(setIsEditingPk).toHaveBeenCalledWith('uuid-edit');
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
describe('Custom Action Buttons', () => {
|
|
289
|
+
it('should call customActionButtons with correct rowId', () => {
|
|
290
|
+
const customActionButtons = vi.fn(() => (
|
|
291
|
+
<div data-testid="custom">Custom</div>
|
|
292
|
+
));
|
|
293
|
+
renderComponent({ customActionButtons, rowId: 'test-row' });
|
|
294
|
+
|
|
295
|
+
expect(customActionButtons).toHaveBeenCalledWith('test-row');
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
it('should render custom buttons before edit button when both exist', () => {
|
|
299
|
+
const customActionButtons = vi.fn(() => (
|
|
300
|
+
<button data-testid="custom-btn">Custom</button>
|
|
301
|
+
));
|
|
302
|
+
renderComponent({ customActionButtons, hasEdit: true });
|
|
303
|
+
|
|
304
|
+
const customBtn = screen.getByTestId('custom-btn');
|
|
305
|
+
const editBtn = screen.getByTestId('button-edit');
|
|
306
|
+
|
|
307
|
+
expect(customBtn).toBeInTheDocument();
|
|
308
|
+
expect(editBtn).toBeInTheDocument();
|
|
309
|
+
|
|
310
|
+
// Custom button should come before edit button in DOM
|
|
311
|
+
expect(customBtn.compareDocumentPosition(editBtn)).toBe(
|
|
312
|
+
Node.DOCUMENT_POSITION_FOLLOWING
|
|
313
|
+
);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('should not break when customActionButtons returns null', () => {
|
|
317
|
+
const customActionButtons = vi.fn(() => null);
|
|
318
|
+
renderComponent({ customActionButtons });
|
|
319
|
+
|
|
320
|
+
expect(screen.getByTestId('button-katalogkontrol')).toBeInTheDocument();
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
describe('Editing State', () => {
|
|
325
|
+
it('should toggle editing state on edit button click', () => {
|
|
326
|
+
const setIsEditingPk = vi.fn();
|
|
327
|
+
const { rerender } = renderComponent({
|
|
328
|
+
hasEdit: true,
|
|
329
|
+
isEditing: false,
|
|
330
|
+
rowId: 1,
|
|
331
|
+
setIsEditingPk
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
335
|
+
expect(setIsEditingPk).toHaveBeenCalledWith(1);
|
|
336
|
+
|
|
337
|
+
// Simulate editing state change
|
|
338
|
+
rerender(
|
|
339
|
+
<ActionButtons
|
|
340
|
+
{...defaultProps}
|
|
341
|
+
hasEdit={true}
|
|
342
|
+
isEditing={true}
|
|
343
|
+
rowId={1}
|
|
344
|
+
setIsEditingPk={setIsEditingPk}
|
|
345
|
+
/>
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
// Click again to exit editing
|
|
349
|
+
setIsEditingPk.mockClear();
|
|
350
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
351
|
+
expect(setIsEditingPk).toHaveBeenCalledWith(IS_EDITING_INITIAL_VALUE);
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
describe('Integration Tests', () => {
|
|
356
|
+
it('should handle all button interactions together', () => {
|
|
357
|
+
const setIsEditingPk = vi.fn();
|
|
358
|
+
const onToggleSelection = vi.fn();
|
|
359
|
+
const customActionButtons = vi.fn(() => (
|
|
360
|
+
<button data-testid="custom">Custom</button>
|
|
361
|
+
));
|
|
362
|
+
|
|
363
|
+
renderComponent({
|
|
364
|
+
hasEdit: true,
|
|
365
|
+
isEditing: false,
|
|
366
|
+
isSelected: false,
|
|
367
|
+
rowId: 'integration-test',
|
|
368
|
+
setIsEditingPk,
|
|
369
|
+
onToggleSelection,
|
|
370
|
+
customActionButtons
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// Click custom button
|
|
374
|
+
fireEvent.click(screen.getByTestId('custom'));
|
|
375
|
+
|
|
376
|
+
// Click edit button
|
|
377
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
378
|
+
expect(setIsEditingPk).toHaveBeenCalledWith('integration-test');
|
|
379
|
+
|
|
380
|
+
// Click selection button
|
|
381
|
+
fireEvent.click(screen.getByTestId('button-katalogkontrol'));
|
|
382
|
+
expect(onToggleSelection).toHaveBeenCalledWith('integration-test');
|
|
383
|
+
|
|
384
|
+
// Verify all callbacks were called correctly
|
|
385
|
+
expect(setIsEditingPk).toHaveBeenCalledTimes(1);
|
|
386
|
+
expect(onToggleSelection).toHaveBeenCalledTimes(1);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('should render correctly with all features enabled', () => {
|
|
390
|
+
const customActionButtons = vi.fn(() => (
|
|
391
|
+
<button data-testid="custom">Action</button>
|
|
392
|
+
));
|
|
393
|
+
|
|
394
|
+
renderComponent({
|
|
395
|
+
hasEdit: true,
|
|
396
|
+
isEditing: false,
|
|
397
|
+
isSelected: true,
|
|
398
|
+
customActionButtons
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
expect(screen.getByTestId('custom')).toBeInTheDocument();
|
|
402
|
+
expect(screen.getByTestId('button-edit')).toBeInTheDocument();
|
|
403
|
+
expect(screen.getByTestId('button-katalogkontrol')).toBeInTheDocument();
|
|
404
|
+
expect(screen.getByTestId('button-katalogkontrol')).toHaveClass(
|
|
405
|
+
'bg-green-600'
|
|
406
|
+
);
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
it('should render correctly with minimal features', () => {
|
|
410
|
+
renderComponent({
|
|
411
|
+
hasEdit: false,
|
|
412
|
+
customActionButtons: undefined
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
expect(screen.queryByTestId('button-edit')).not.toBeInTheDocument();
|
|
416
|
+
expect(screen.queryByTestId('custom')).not.toBeInTheDocument();
|
|
417
|
+
expect(screen.getByTestId('button-katalogkontrol')).toBeInTheDocument();
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
describe('Styling', () => {
|
|
422
|
+
it('should apply correct button size class', () => {
|
|
423
|
+
renderComponent({ hasEdit: true });
|
|
424
|
+
|
|
425
|
+
const editBtn = screen.getByTestId('button-edit');
|
|
426
|
+
const selectionBtn = screen.getByTestId('button-katalogkontrol');
|
|
427
|
+
|
|
428
|
+
expect(editBtn).toHaveClass('h-7');
|
|
429
|
+
expect(selectionBtn).toHaveClass('h-7');
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
it('should apply correct border classes', () => {
|
|
433
|
+
renderComponent({ hasEdit: true });
|
|
434
|
+
|
|
435
|
+
const editBtn = screen.getByTestId('button-edit');
|
|
436
|
+
const selectionBtn = screen.getByTestId('button-katalogkontrol');
|
|
437
|
+
|
|
438
|
+
expect(editBtn).toHaveClass('border', 'border-ebonyClay-200');
|
|
439
|
+
expect(selectionBtn).toHaveClass('border', 'border-ebonyClay-200');
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
it('should apply background color correctly', () => {
|
|
443
|
+
renderComponent({ hasEdit: true, isSelected: false });
|
|
444
|
+
|
|
445
|
+
const editBtn = screen.getByTestId('button-edit');
|
|
446
|
+
const selectionBtn = screen.getByTestId('button-katalogkontrol');
|
|
447
|
+
|
|
448
|
+
expect(editBtn).toHaveClass('bg-ebonyClay-400');
|
|
449
|
+
expect(selectionBtn).toHaveClass('bg-ebonyClay-400');
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
it('should override background when selected', () => {
|
|
453
|
+
renderComponent({ isSelected: true });
|
|
454
|
+
|
|
455
|
+
const selectionBtn = screen.getByTestId('button-katalogkontrol');
|
|
456
|
+
expect(selectionBtn).toHaveClass('bg-green-600');
|
|
457
|
+
expect(selectionBtn).toHaveClass('border-green-600');
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
describe('Props Combinations', () => {
|
|
462
|
+
it('should handle edit=true, select=true combination', () => {
|
|
463
|
+
renderComponent({ hasEdit: true, isSelected: true });
|
|
464
|
+
|
|
465
|
+
expect(screen.getByTestId('button-edit')).toHaveClass('bg-ebonyClay-400');
|
|
466
|
+
expect(screen.getByTestId('button-katalogkontrol')).toHaveClass(
|
|
467
|
+
'bg-green-600'
|
|
468
|
+
);
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
it('should handle edit=true, editing=true combination', () => {
|
|
472
|
+
const setIsEditingPk = vi.fn();
|
|
473
|
+
renderComponent({
|
|
474
|
+
hasEdit: true,
|
|
475
|
+
isEditing: true,
|
|
476
|
+
setIsEditingPk
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
480
|
+
expect(setIsEditingPk).toHaveBeenCalledWith(IS_EDITING_INITIAL_VALUE);
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it('should handle custom, edit, and select all together', () => {
|
|
484
|
+
const onToggleSelection = vi.fn();
|
|
485
|
+
const setIsEditingPk = vi.fn();
|
|
486
|
+
const customActionButtons = vi.fn(() => (
|
|
487
|
+
<button data-testid="custom">Custom</button>
|
|
488
|
+
));
|
|
489
|
+
|
|
490
|
+
renderComponent({
|
|
491
|
+
hasEdit: true,
|
|
492
|
+
isEditing: false,
|
|
493
|
+
isSelected: false,
|
|
494
|
+
onToggleSelection,
|
|
495
|
+
setIsEditingPk,
|
|
496
|
+
customActionButtons
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
fireEvent.click(screen.getByTestId('custom'));
|
|
500
|
+
fireEvent.click(screen.getByTestId('button-edit'));
|
|
501
|
+
fireEvent.click(screen.getByTestId('button-katalogkontrol'));
|
|
502
|
+
|
|
503
|
+
expect(setIsEditingPk).toHaveBeenCalledWith(expect.anything());
|
|
504
|
+
expect(onToggleSelection).toHaveBeenCalledWith(expect.anything());
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { TableBaseProps } from '../../types';
|
|
3
|
+
interface TableContentProps extends Omit<TableBaseProps, 'onChangeSelectedRows' | 'filters' | 'rowKey'> {
|
|
4
|
+
onToggleSelection: (rowId: number | string) => void;
|
|
5
|
+
expandedRows: Array<number | string>;
|
|
6
|
+
onToggleExpand: (rowId: number | string) => void;
|
|
7
|
+
rowKey: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const TableContent: ({ columns, customActionButtons, data, editDataIndexes, expandedRows, onEdit, onToggleExpand, onToggleSelection, rowKey, selectedRows, mapperConfig }: TableContentProps) => React.JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../../src/ai-table/components/content.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAA8B,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ9E,UAAU,iBACR,SAAQ,IAAI,CAAC,cAAc,EAAE,sBAAsB,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3E,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACpD,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,YAAY,GAAI,sJAY1B,iBAAiB,sBAihBnB,CAAC"}
|