@object-ui/plugin-detail 3.1.5 → 3.3.1

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.
Files changed (209) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +21 -1
  3. package/dist/AddressField-LgHnO2Lk.js +98 -0
  4. package/dist/AutoNumberField-xZCrU0eW.js +14 -0
  5. package/dist/{AvatarField-YGj51ozd.js → AvatarField-Dy2XGlPz.js} +16 -15
  6. package/dist/{BooleanField-CaA898Tk.js → BooleanField-C0Clfka5.js} +11 -10
  7. package/dist/CodeField-CHUa07B6.js +23 -0
  8. package/dist/ColorField-vxHqEhcS.js +38 -0
  9. package/dist/CurrencyField-DiWjYWDo.js +49 -0
  10. package/dist/DateField-DGaRPM4P.js +22 -0
  11. package/dist/DateTimeField-8QnpsI_h.js +30 -0
  12. package/dist/EmailField-CkVgMbpI.js +26 -0
  13. package/dist/FileField-5UPV7uek.js +149 -0
  14. package/dist/FormulaField-BUgt6-Pi.js +17 -0
  15. package/dist/GeolocationField-D9T_jgG6.js +118 -0
  16. package/dist/GridField-DE_HwiIN.js +49 -0
  17. package/dist/ImageField-Dswnqtzf.js +73 -0
  18. package/dist/LocationField-gjqbE6na.js +36 -0
  19. package/dist/LookupField-BcS3LRKc.js +901 -0
  20. package/dist/{MasterDetailField-I1A9oEGC.js → MasterDetailField-BF6_-X3A.js} +20 -19
  21. package/dist/NumberField-Dj2rYmrS.js +27 -0
  22. package/dist/ObjectField-BymIojwd.js +50 -0
  23. package/dist/{PasswordField-DBtluGJ1.js → PasswordField-ED_Xgqz-.js} +8 -7
  24. package/dist/PercentField-D-JKOxKC.js +61 -0
  25. package/dist/PhoneField-DSCaGYq7.js +26 -0
  26. package/dist/QRCodeField-CtcOUapi.js +73 -0
  27. package/dist/{RatingField-B_Mnr63i.js → RatingField-BDnyQFWy.js} +10 -9
  28. package/dist/RichTextField-CH6LVZQA.js +33 -0
  29. package/dist/SelectField-DE4dpkMV.js +36 -0
  30. package/dist/{SignatureField-CddhEK9u.js → SignatureField-B1wh3f5A.js} +18 -17
  31. package/dist/{SliderField-Df5hMzNc.js → SliderField-zoTCKh9n.js} +2 -1
  32. package/dist/SummaryField-BeBVT6VN.js +22 -0
  33. package/dist/TextAreaField-rfUGrRxh.js +37 -0
  34. package/dist/TextField-C_yM7ATQ.js +30 -0
  35. package/dist/TimeField-BcQmBZi9.js +22 -0
  36. package/dist/UrlField-BakaF6NI.js +31 -0
  37. package/dist/UserField-zS7y3eKb.js +76 -0
  38. package/dist/VectorField-CTZ4myDM.js +34 -0
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.js +1741 -1504
  41. package/dist/index.umd.cjs +43 -51
  42. package/dist/packages/plugin-detail/src/ActivityTimeline.d.ts.map +1 -0
  43. package/dist/packages/plugin-detail/src/CommentAttachment.d.ts.map +1 -0
  44. package/dist/packages/plugin-detail/src/CommentInput.d.ts.map +1 -0
  45. package/dist/packages/plugin-detail/src/DetailSection.d.ts.map +1 -0
  46. package/dist/packages/plugin-detail/src/DetailTabs.d.ts.map +1 -0
  47. package/dist/packages/plugin-detail/src/DetailView.d.ts +47 -0
  48. package/dist/packages/plugin-detail/src/DetailView.d.ts.map +1 -0
  49. package/dist/packages/plugin-detail/src/DetailView.stories.d.ts.map +1 -0
  50. package/dist/packages/plugin-detail/src/DiffView.d.ts.map +1 -0
  51. package/dist/packages/plugin-detail/src/FieldChangeItem.d.ts.map +1 -0
  52. package/dist/packages/plugin-detail/src/HeaderHighlight.d.ts.map +1 -0
  53. package/dist/packages/plugin-detail/src/InlineCreateRelated.d.ts.map +1 -0
  54. package/dist/packages/plugin-detail/src/MentionAutocomplete.d.ts.map +1 -0
  55. package/dist/packages/plugin-detail/src/PointInTimeRestore.d.ts.map +1 -0
  56. package/dist/packages/plugin-detail/src/ReactionPicker.d.ts.map +1 -0
  57. package/dist/packages/plugin-detail/src/RecordActivityTimeline.d.ts.map +1 -0
  58. package/dist/packages/plugin-detail/src/RecordChatterPanel.d.ts.map +1 -0
  59. package/dist/packages/plugin-detail/src/RecordComments.d.ts.map +1 -0
  60. package/dist/packages/plugin-detail/src/RecordNavigationEnhanced.d.ts.map +1 -0
  61. package/dist/{src → packages/plugin-detail/src}/RelatedList.d.ts +8 -0
  62. package/dist/packages/plugin-detail/src/RelatedList.d.ts.map +1 -0
  63. package/dist/packages/plugin-detail/src/RelationshipGraph.d.ts.map +1 -0
  64. package/dist/packages/plugin-detail/src/RichTextCommentInput.d.ts.map +1 -0
  65. package/dist/packages/plugin-detail/src/SectionGroup.d.ts.map +1 -0
  66. package/dist/packages/plugin-detail/src/SubscriptionToggle.d.ts.map +1 -0
  67. package/dist/packages/plugin-detail/src/ThreadedReplies.d.ts.map +1 -0
  68. package/dist/packages/plugin-detail/src/autoLayout.d.ts.map +1 -0
  69. package/dist/packages/plugin-detail/src/index.d.ts.map +1 -0
  70. package/dist/packages/plugin-detail/src/useDetailTranslation.d.ts.map +1 -0
  71. package/dist/plugin-detail.css +1 -2
  72. package/dist/rolldown-runtime-DnwLefa7.js +23 -0
  73. package/dist/{src-CXr1-vVl.js → src-DyUKLvMN.js} +29788 -37711
  74. package/dist/useFieldTranslation-BRgjC1oq.js +9 -0
  75. package/package.json +34 -12
  76. package/.turbo/turbo-build.log +0 -61
  77. package/dist/AddressField-DBkEyMcG.js +0 -93
  78. package/dist/AutoNumberField-Baa191z-.js +0 -14
  79. package/dist/CodeField-BU51nl1L.js +0 -22
  80. package/dist/ColorField-Cnf6ZM7c.js +0 -37
  81. package/dist/CurrencyField-Wg-XOId2.js +0 -51
  82. package/dist/DateField-Cth1ky_m.js +0 -21
  83. package/dist/DateTimeField-B0m6FhHL.js +0 -32
  84. package/dist/EmailField-Do7qT_L_.js +0 -28
  85. package/dist/FileField-aRJAdbQb.js +0 -151
  86. package/dist/FormulaField-DTMkagFx.js +0 -14
  87. package/dist/GeolocationField-RqpHWTEv.js +0 -113
  88. package/dist/GridField-D4IH0cpo.js +0 -51
  89. package/dist/ImageField-BYCFajjr.js +0 -75
  90. package/dist/LocationField-Bi_ew9sd.js +0 -35
  91. package/dist/LookupField-BjwlDPtt.js +0 -902
  92. package/dist/NumberField-D_NucQlp.js +0 -26
  93. package/dist/ObjectField-CG-LaM65.js +0 -52
  94. package/dist/PercentField-B6sO_J3i.js +0 -63
  95. package/dist/PhoneField-CcQAWwR6.js +0 -28
  96. package/dist/QRCodeField-CEjWs-J5.js +0 -72
  97. package/dist/RichTextField-qOEJl5Ai.js +0 -32
  98. package/dist/SelectField-C8hWu3gm.js +0 -30
  99. package/dist/SummaryField-DgiFm-Cr.js +0 -19
  100. package/dist/TextAreaField-DuriTqsD.js +0 -36
  101. package/dist/TextField-CGNSl7RU.js +0 -29
  102. package/dist/TimeField-YO58ctFg.js +0 -21
  103. package/dist/UrlField-1-BMM1jn.js +0 -33
  104. package/dist/UserField-B6GqxP_S.js +0 -78
  105. package/dist/VectorField-BkEjbSt0.js +0 -36
  106. package/dist/src/ActivityTimeline.d.ts.map +0 -1
  107. package/dist/src/CommentAttachment.d.ts.map +0 -1
  108. package/dist/src/CommentInput.d.ts.map +0 -1
  109. package/dist/src/DetailSection.d.ts.map +0 -1
  110. package/dist/src/DetailTabs.d.ts.map +0 -1
  111. package/dist/src/DetailView.d.ts +0 -23
  112. package/dist/src/DetailView.d.ts.map +0 -1
  113. package/dist/src/DetailView.stories.d.ts.map +0 -1
  114. package/dist/src/DiffView.d.ts.map +0 -1
  115. package/dist/src/FieldChangeItem.d.ts.map +0 -1
  116. package/dist/src/HeaderHighlight.d.ts.map +0 -1
  117. package/dist/src/InlineCreateRelated.d.ts.map +0 -1
  118. package/dist/src/MentionAutocomplete.d.ts.map +0 -1
  119. package/dist/src/PointInTimeRestore.d.ts.map +0 -1
  120. package/dist/src/ReactionPicker.d.ts.map +0 -1
  121. package/dist/src/RecordActivityTimeline.d.ts.map +0 -1
  122. package/dist/src/RecordChatterPanel.d.ts.map +0 -1
  123. package/dist/src/RecordComments.d.ts.map +0 -1
  124. package/dist/src/RecordNavigationEnhanced.d.ts.map +0 -1
  125. package/dist/src/RelatedList.d.ts.map +0 -1
  126. package/dist/src/RelationshipGraph.d.ts.map +0 -1
  127. package/dist/src/RichTextCommentInput.d.ts.map +0 -1
  128. package/dist/src/SectionGroup.d.ts.map +0 -1
  129. package/dist/src/SubscriptionToggle.d.ts.map +0 -1
  130. package/dist/src/ThreadedReplies.d.ts.map +0 -1
  131. package/dist/src/autoLayout.d.ts.map +0 -1
  132. package/dist/src/index.d.ts.map +0 -1
  133. package/dist/src/useDetailTranslation.d.ts.map +0 -1
  134. package/src/ActivityTimeline.tsx +0 -184
  135. package/src/CommentAttachment.tsx +0 -192
  136. package/src/CommentInput.tsx +0 -81
  137. package/src/DetailSection.tsx +0 -340
  138. package/src/DetailTabs.tsx +0 -73
  139. package/src/DetailView.stories.tsx +0 -334
  140. package/src/DetailView.tsx +0 -823
  141. package/src/DiffView.tsx +0 -231
  142. package/src/FieldChangeItem.tsx +0 -46
  143. package/src/HeaderHighlight.tsx +0 -88
  144. package/src/InlineCreateRelated.tsx +0 -291
  145. package/src/MentionAutocomplete.tsx +0 -123
  146. package/src/PointInTimeRestore.tsx +0 -261
  147. package/src/ReactionPicker.tsx +0 -106
  148. package/src/RecordActivityTimeline.tsx +0 -429
  149. package/src/RecordChatterPanel.tsx +0 -207
  150. package/src/RecordComments.tsx +0 -215
  151. package/src/RecordNavigationEnhanced.tsx +0 -211
  152. package/src/RelatedList.tsx +0 -413
  153. package/src/RelationshipGraph.tsx +0 -286
  154. package/src/RichTextCommentInput.tsx +0 -348
  155. package/src/SectionGroup.tsx +0 -101
  156. package/src/SubscriptionToggle.tsx +0 -60
  157. package/src/ThreadedReplies.tsx +0 -161
  158. package/src/__tests__/ActivityTimeline.test.tsx +0 -119
  159. package/src/__tests__/ActivityTimelineFiltering.test.tsx +0 -143
  160. package/src/__tests__/CommentInput.test.tsx +0 -57
  161. package/src/__tests__/DetailSection.test.tsx +0 -490
  162. package/src/__tests__/DetailView.test.tsx +0 -694
  163. package/src/__tests__/FieldChangeItem.test.tsx +0 -119
  164. package/src/__tests__/HeaderHighlight.test.tsx +0 -213
  165. package/src/__tests__/MentionAutocomplete.test.tsx +0 -97
  166. package/src/__tests__/ReactionPicker.test.tsx +0 -113
  167. package/src/__tests__/RecordActivityTimeline.test.tsx +0 -395
  168. package/src/__tests__/RecordChatterPanel.test.tsx +0 -265
  169. package/src/__tests__/RecordComments.test.tsx +0 -96
  170. package/src/__tests__/RecordCommentsPinSearch.test.tsx +0 -133
  171. package/src/__tests__/RelatedList.test.tsx +0 -160
  172. package/src/__tests__/SectionGroup.test.tsx +0 -101
  173. package/src/__tests__/SubscriptionToggle.test.tsx +0 -84
  174. package/src/__tests__/ThreadedReplies.test.tsx +0 -212
  175. package/src/__tests__/autoLayout.test.ts +0 -228
  176. package/src/__tests__/phase12-features.test.tsx +0 -583
  177. package/src/__tests__/roadmap-features.test.tsx +0 -478
  178. package/src/autoLayout.ts +0 -128
  179. package/src/index.tsx +0 -149
  180. package/src/useDetailTranslation.ts +0 -114
  181. package/tsconfig.json +0 -18
  182. package/vite.config.ts +0 -56
  183. package/vitest.config.ts +0 -13
  184. package/vitest.setup.ts +0 -1
  185. /package/dist/{src → packages/plugin-detail/src}/ActivityTimeline.d.ts +0 -0
  186. /package/dist/{src → packages/plugin-detail/src}/CommentAttachment.d.ts +0 -0
  187. /package/dist/{src → packages/plugin-detail/src}/CommentInput.d.ts +0 -0
  188. /package/dist/{src → packages/plugin-detail/src}/DetailSection.d.ts +0 -0
  189. /package/dist/{src → packages/plugin-detail/src}/DetailTabs.d.ts +0 -0
  190. /package/dist/{src → packages/plugin-detail/src}/DetailView.stories.d.ts +0 -0
  191. /package/dist/{src → packages/plugin-detail/src}/DiffView.d.ts +0 -0
  192. /package/dist/{src → packages/plugin-detail/src}/FieldChangeItem.d.ts +0 -0
  193. /package/dist/{src → packages/plugin-detail/src}/HeaderHighlight.d.ts +0 -0
  194. /package/dist/{src → packages/plugin-detail/src}/InlineCreateRelated.d.ts +0 -0
  195. /package/dist/{src → packages/plugin-detail/src}/MentionAutocomplete.d.ts +0 -0
  196. /package/dist/{src → packages/plugin-detail/src}/PointInTimeRestore.d.ts +0 -0
  197. /package/dist/{src → packages/plugin-detail/src}/ReactionPicker.d.ts +0 -0
  198. /package/dist/{src → packages/plugin-detail/src}/RecordActivityTimeline.d.ts +0 -0
  199. /package/dist/{src → packages/plugin-detail/src}/RecordChatterPanel.d.ts +0 -0
  200. /package/dist/{src → packages/plugin-detail/src}/RecordComments.d.ts +0 -0
  201. /package/dist/{src → packages/plugin-detail/src}/RecordNavigationEnhanced.d.ts +0 -0
  202. /package/dist/{src → packages/plugin-detail/src}/RelationshipGraph.d.ts +0 -0
  203. /package/dist/{src → packages/plugin-detail/src}/RichTextCommentInput.d.ts +0 -0
  204. /package/dist/{src → packages/plugin-detail/src}/SectionGroup.d.ts +0 -0
  205. /package/dist/{src → packages/plugin-detail/src}/SubscriptionToggle.d.ts +0 -0
  206. /package/dist/{src → packages/plugin-detail/src}/ThreadedReplies.d.ts +0 -0
  207. /package/dist/{src → packages/plugin-detail/src}/autoLayout.d.ts +0 -0
  208. /package/dist/{src → packages/plugin-detail/src}/index.d.ts +0 -0
  209. /package/dist/{src → packages/plugin-detail/src}/useDetailTranslation.d.ts +0 -0
@@ -1,119 +0,0 @@
1
- /**
2
- * ObjectUI
3
- * Copyright (c) 2024-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
-
9
- import { describe, it, expect } from 'vitest';
10
- import { render, screen } from '@testing-library/react';
11
- import '@testing-library/jest-dom';
12
- import { ActivityTimeline } from '../ActivityTimeline';
13
- import type { ActivityEntry } from '@object-ui/types';
14
-
15
- const mockActivities: ActivityEntry[] = [
16
- {
17
- id: '1',
18
- type: 'create',
19
- user: 'Alice',
20
- timestamp: '2026-02-15T10:00:00Z',
21
- },
22
- {
23
- id: '2',
24
- type: 'field_change',
25
- field: 'status',
26
- oldValue: 'open',
27
- newValue: 'in_progress',
28
- user: 'Bob',
29
- timestamp: '2026-02-16T08:30:00Z',
30
- },
31
- {
32
- id: '3',
33
- type: 'status_change',
34
- field: 'stage',
35
- newValue: 'Completed',
36
- user: 'Charlie',
37
- timestamp: '2026-02-16T09:00:00Z',
38
- description: 'Moved to Completed stage',
39
- },
40
- {
41
- id: '4',
42
- type: 'comment',
43
- user: 'Alice',
44
- timestamp: '2026-02-16T09:30:00Z',
45
- description: 'Added a comment',
46
- },
47
- ];
48
-
49
- describe('ActivityTimeline', () => {
50
- it('should render activity heading with count', () => {
51
- render(<ActivityTimeline activities={mockActivities} />);
52
- expect(screen.getByText('Activity')).toBeInTheDocument();
53
- expect(screen.getByText('(4)')).toBeInTheDocument();
54
- });
55
-
56
- it('should render user names', () => {
57
- render(<ActivityTimeline activities={mockActivities} />);
58
- expect(screen.getAllByText('Alice')).toHaveLength(2);
59
- expect(screen.getByText('Bob')).toBeInTheDocument();
60
- expect(screen.getByText('Charlie')).toBeInTheDocument();
61
- });
62
-
63
- it('should show "No activity recorded" when empty', () => {
64
- render(<ActivityTimeline activities={[]} />);
65
- expect(screen.getByText('No activity recorded')).toBeInTheDocument();
66
- });
67
-
68
- it('should render field change description for field_change type', () => {
69
- render(
70
- <ActivityTimeline
71
- activities={[
72
- {
73
- id: '1',
74
- type: 'field_change',
75
- field: 'priority',
76
- oldValue: 'low',
77
- newValue: 'high',
78
- user: 'Eve',
79
- timestamp: '2026-02-16T10:00:00Z',
80
- },
81
- ]}
82
- />,
83
- );
84
- expect(screen.getByText(/Changed Priority from "low" to "high"/)).toBeInTheDocument();
85
- });
86
-
87
- it('should use description if provided', () => {
88
- render(
89
- <ActivityTimeline
90
- activities={[
91
- {
92
- id: '1',
93
- type: 'comment',
94
- user: 'Alice',
95
- timestamp: '2026-02-16T09:30:00Z',
96
- description: 'Added a comment',
97
- },
98
- ]}
99
- />,
100
- );
101
- expect(screen.getByText('Added a comment')).toBeInTheDocument();
102
- });
103
-
104
- it('should render create type with default description', () => {
105
- render(
106
- <ActivityTimeline
107
- activities={[
108
- {
109
- id: '1',
110
- type: 'create',
111
- user: 'Eve',
112
- timestamp: '2026-02-16T10:00:00Z',
113
- },
114
- ]}
115
- />,
116
- );
117
- expect(screen.getByText('Created this record')).toBeInTheDocument();
118
- });
119
- });
@@ -1,143 +0,0 @@
1
- /**
2
- * ObjectUI
3
- * Copyright (c) 2024-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
-
9
- import { describe, it, expect } from 'vitest';
10
- import { render, screen, fireEvent } from '@testing-library/react';
11
- import '@testing-library/jest-dom';
12
- import { ActivityTimeline } from '../ActivityTimeline';
13
- import type { ActivityEntry } from '@object-ui/types';
14
-
15
- const mockActivities: ActivityEntry[] = [
16
- {
17
- id: '1',
18
- type: 'create',
19
- user: 'Alice',
20
- timestamp: '2026-02-15T10:00:00Z',
21
- },
22
- {
23
- id: '2',
24
- type: 'field_change',
25
- field: 'status',
26
- oldValue: 'open',
27
- newValue: 'in_progress',
28
- user: 'Bob',
29
- timestamp: '2026-02-16T08:30:00Z',
30
- },
31
- {
32
- id: '3',
33
- type: 'comment',
34
- user: 'Charlie',
35
- timestamp: '2026-02-16T09:00:00Z',
36
- description: 'Added a comment on the record',
37
- },
38
- {
39
- id: '4',
40
- type: 'delete',
41
- user: 'Diana',
42
- timestamp: '2026-02-16T09:30:00Z',
43
- },
44
- {
45
- id: '5',
46
- type: 'comment',
47
- user: 'Eve',
48
- timestamp: '2026-02-16T10:00:00Z',
49
- description: 'Another comment here',
50
- },
51
- ];
52
-
53
- describe('ActivityTimeline - Filtering', () => {
54
- it('does not render filter controls when filterable is false/not provided', () => {
55
- render(<ActivityTimeline activities={mockActivities} />);
56
- expect(screen.queryByRole('group', { name: 'Activity type filter' })).not.toBeInTheDocument();
57
- });
58
-
59
- it('renders filter controls when filterable is true', () => {
60
- render(<ActivityTimeline activities={mockActivities} filterable />);
61
- const filterGroup = screen.getByRole('group', { name: 'Activity type filter' });
62
- expect(filterGroup).toBeInTheDocument();
63
-
64
- // Should have "All", "Field Changes", "Creates", "Deletes", "Comments", "Status Changes"
65
- expect(screen.getByText('All')).toBeInTheDocument();
66
- expect(screen.getByText('Comments')).toBeInTheDocument();
67
- expect(screen.getByText('Field Changes')).toBeInTheDocument();
68
- expect(screen.getByText('Creates')).toBeInTheDocument();
69
- expect(screen.getByText('Deletes')).toBeInTheDocument();
70
- });
71
-
72
- it('shows all activities by default', () => {
73
- render(<ActivityTimeline activities={mockActivities} filterable />);
74
- // Count should be (5)
75
- expect(screen.getByText('(5)')).toBeInTheDocument();
76
- });
77
-
78
- it('filters to only comments when Comments filter is selected', () => {
79
- render(<ActivityTimeline activities={mockActivities} filterable />);
80
-
81
- const commentsFilter = screen.getByText('Comments');
82
- fireEvent.click(commentsFilter);
83
-
84
- // Only 2 comment activities
85
- expect(screen.getByText('(2)')).toBeInTheDocument();
86
- expect(screen.getByText('Added a comment on the record')).toBeInTheDocument();
87
- expect(screen.getByText('Another comment here')).toBeInTheDocument();
88
- });
89
-
90
- it('filters to only field changes when Field Changes filter is selected', () => {
91
- render(<ActivityTimeline activities={mockActivities} filterable />);
92
-
93
- const fieldChangesFilter = screen.getByText('Field Changes');
94
- fireEvent.click(fieldChangesFilter);
95
-
96
- // Only 1 field_change activity
97
- expect(screen.getByText('(1)')).toBeInTheDocument();
98
- });
99
-
100
- it('shows all activities when All filter is re-selected', () => {
101
- render(<ActivityTimeline activities={mockActivities} filterable />);
102
-
103
- // First filter to comments only
104
- fireEvent.click(screen.getByText('Comments'));
105
- expect(screen.getByText('(2)')).toBeInTheDocument();
106
-
107
- // Then go back to All
108
- fireEvent.click(screen.getByText('All'));
109
- expect(screen.getByText('(5)')).toBeInTheDocument();
110
- });
111
-
112
- it('respects defaultFilter prop', () => {
113
- render(
114
- <ActivityTimeline
115
- activities={mockActivities}
116
- filterable
117
- defaultFilter="comment"
118
- />,
119
- );
120
-
121
- // Should start filtered to comments
122
- expect(screen.getByText('(2)')).toBeInTheDocument();
123
- });
124
-
125
- it('shows "No activity recorded" when filter has no results', () => {
126
- render(
127
- <ActivityTimeline
128
- activities={mockActivities}
129
- filterable
130
- defaultFilter="status_change"
131
- />,
132
- );
133
-
134
- expect(screen.getByText('No activity recorded')).toBeInTheDocument();
135
- });
136
-
137
- it('renders all activities without filter when filterable is not set', () => {
138
- render(<ActivityTimeline activities={mockActivities} />);
139
- expect(screen.getByText('(5)')).toBeInTheDocument();
140
- expect(screen.getByText('Alice')).toBeInTheDocument();
141
- expect(screen.getByText('Bob')).toBeInTheDocument();
142
- });
143
- });
@@ -1,57 +0,0 @@
1
- /**
2
- * ObjectUI
3
- * Copyright (c) 2024-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
-
9
- import { describe, it, expect, vi } from 'vitest';
10
- import { render, screen, fireEvent } from '@testing-library/react';
11
- import '@testing-library/jest-dom';
12
- import { CommentInput } from '../CommentInput';
13
-
14
- describe('CommentInput', () => {
15
- it('should render placeholder text', () => {
16
- const onSubmit = vi.fn();
17
- render(<CommentInput onSubmit={onSubmit} />);
18
- expect(screen.getByPlaceholderText('Leave a comment…')).toBeInTheDocument();
19
- });
20
-
21
- it('should render custom placeholder', () => {
22
- const onSubmit = vi.fn();
23
- render(<CommentInput onSubmit={onSubmit} placeholder="Type here…" />);
24
- expect(screen.getByPlaceholderText('Type here…')).toBeInTheDocument();
25
- });
26
-
27
- it('should disable submit when textarea is empty', () => {
28
- const onSubmit = vi.fn();
29
- render(<CommentInput onSubmit={onSubmit} />);
30
- expect(screen.getByLabelText('Submit comment')).toBeDisabled();
31
- });
32
-
33
- it('should enable submit when text is entered', () => {
34
- const onSubmit = vi.fn();
35
- render(<CommentInput onSubmit={onSubmit} />);
36
- fireEvent.change(screen.getByPlaceholderText('Leave a comment…'), {
37
- target: { value: 'Hello' },
38
- });
39
- expect(screen.getByLabelText('Submit comment')).not.toBeDisabled();
40
- });
41
-
42
- it('should call onSubmit with text when clicked', () => {
43
- const onSubmit = vi.fn().mockResolvedValue(undefined);
44
- render(<CommentInput onSubmit={onSubmit} />);
45
- fireEvent.change(screen.getByPlaceholderText('Leave a comment…'), {
46
- target: { value: 'Hello world' },
47
- });
48
- fireEvent.click(screen.getByLabelText('Submit comment'));
49
- expect(onSubmit).toHaveBeenCalledWith('Hello world');
50
- });
51
-
52
- it('should disable input when disabled prop is true', () => {
53
- const onSubmit = vi.fn();
54
- render(<CommentInput onSubmit={onSubmit} disabled />);
55
- expect(screen.getByPlaceholderText('Leave a comment…')).toBeDisabled();
56
- });
57
- });