1
1
import { useTheme } from '@emotion/react' ;
2
2
import styled from '@emotion/styled' ;
3
- import { H2Title , IconChevronRight , IconHierarchy2 , IconPlus } from 'twenty-ui' ;
3
+ import {
4
+ H2Title ,
5
+ IconChevronRight ,
6
+ IconHierarchy2 ,
7
+ IconPlus ,
8
+ IconSearch ,
9
+ } from 'twenty-ui' ;
4
10
5
11
import { useDeleteOneObjectMetadataItem } from '@/object-metadata/hooks/useDeleteOneObjectMetadataItem' ;
6
12
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems' ;
@@ -18,6 +24,7 @@ import { getObjectTypeLabel } from '@/settings/data-model/utils/getObjectTypeLab
18
24
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath' ;
19
25
import { SettingsPath } from '@/types/SettingsPath' ;
20
26
import { Button } from '@/ui/input/button/components/Button' ;
27
+ import { TextInput } from '@/ui/input/components/TextInput' ;
21
28
import { SubMenuTopBarContainer } from '@/ui/layout/page/SubMenuTopBarContainer' ;
22
29
import { Section } from '@/ui/layout/section/components/Section' ;
23
30
import { SortableTableHeader } from '@/ui/layout/table/components/SortableTableHeader' ;
@@ -27,17 +34,19 @@ import { TableSection } from '@/ui/layout/table/components/TableSection';
27
34
import { useSortedArray } from '@/ui/layout/table/hooks/useSortedArray' ;
28
35
import { UndecoratedLink } from '@/ui/navigation/link/components/UndecoratedLink' ;
29
36
import { isNonEmptyArray } from '@sniptt/guards' ;
30
- import { useMemo } from 'react' ;
37
+ import { useMemo , useState } from 'react' ;
31
38
import { SETTINGS_OBJECT_TABLE_METADATA } from '~/pages/settings/data-model/constants/SettingsObjectTableMetadata' ;
32
39
import { SettingsObjectTableItem } from '~/pages/settings/data-model/types/SettingsObjectTableItem' ;
33
40
34
41
const StyledIconChevronRight = styled ( IconChevronRight ) `
35
42
color: ${ ( { theme } ) => theme . font . color . tertiary } ;
36
43
` ;
37
-
44
+ const StyledSearchInput = styled ( TextInput ) `
45
+ width: 100%;
46
+ ` ;
38
47
export const SettingsObjects = ( ) => {
39
48
const theme = useTheme ( ) ;
40
-
49
+ const [ searchTerm , setSearchTerm ] = useState ( '' ) ;
41
50
const { deleteOneObjectMetadataItem } = useDeleteOneObjectMetadataItem ( ) ;
42
51
const { updateOneObjectMetadataItem } = useUpdateOneObjectMetadataItem ( ) ;
43
52
@@ -102,7 +111,25 @@ export const SettingsObjects = () => {
102
111
inactiveObjectSettingsArray ,
103
112
SETTINGS_OBJECT_TABLE_METADATA ,
104
113
) ;
114
+ const filteredActiveObjectSettingsItems = useMemo (
115
+ ( ) =>
116
+ sortedActiveObjectSettingsItems . filter (
117
+ ( item ) =>
118
+ item . labelPlural . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ||
119
+ item . objectTypeLabel . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ,
120
+ ) ,
121
+ [ sortedActiveObjectSettingsItems , searchTerm ] ,
122
+ ) ;
105
123
124
+ const filteredInactiveObjectSettingsItems = useMemo (
125
+ ( ) =>
126
+ sortedInactiveObjectSettingsItems . filter (
127
+ ( item ) =>
128
+ item . labelPlural . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ||
129
+ item . objectTypeLabel . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ,
130
+ ) ,
131
+ [ sortedInactiveObjectSettingsItems , searchTerm ] ,
132
+ ) ;
106
133
return (
107
134
< SubMenuTopBarContainer
108
135
Icon = { IconHierarchy2 }
@@ -123,6 +150,14 @@ export const SettingsObjects = () => {
123
150
< SettingsObjectCoverImage />
124
151
< Section >
125
152
< H2Title title = "Existing objects" />
153
+
154
+ < StyledSearchInput
155
+ LeftIcon = { IconSearch }
156
+ placeholder = "Search an object..."
157
+ value = { searchTerm }
158
+ onChange = { setSearchTerm }
159
+ />
160
+
126
161
< Table >
127
162
< StyledObjectTableRow >
128
163
{ SETTINGS_OBJECT_TABLE_METADATA . fields . map (
@@ -141,27 +176,31 @@ export const SettingsObjects = () => {
141
176
</ StyledObjectTableRow >
142
177
{ isNonEmptyArray ( sortedActiveObjectSettingsItems ) && (
143
178
< TableSection title = "Active" >
144
- { sortedActiveObjectSettingsItems . map ( ( objectSettingsItem ) => (
145
- < SettingsObjectMetadataItemTableRow
146
- key = { objectSettingsItem . objectMetadataItem . namePlural }
147
- objectMetadataItem = { objectSettingsItem . objectMetadataItem }
148
- totalObjectCount = { objectSettingsItem . totalObjectCount }
149
- action = {
150
- < StyledIconChevronRight
151
- size = { theme . icon . size . md }
152
- stroke = { theme . icon . stroke . sm }
153
- />
154
- }
155
- link = { `/settings/objects/${ getObjectSlug (
156
- objectSettingsItem . objectMetadataItem ,
157
- ) } `}
158
- />
159
- ) ) }
179
+ { filteredActiveObjectSettingsItems . map (
180
+ ( objectSettingsItem ) => (
181
+ < SettingsObjectMetadataItemTableRow
182
+ key = { objectSettingsItem . objectMetadataItem . namePlural }
183
+ objectMetadataItem = {
184
+ objectSettingsItem . objectMetadataItem
185
+ }
186
+ totalObjectCount = { objectSettingsItem . totalObjectCount }
187
+ action = {
188
+ < StyledIconChevronRight
189
+ size = { theme . icon . size . md }
190
+ stroke = { theme . icon . stroke . sm }
191
+ />
192
+ }
193
+ link = { `/settings/objects/${ getObjectSlug (
194
+ objectSettingsItem . objectMetadataItem ,
195
+ ) } `}
196
+ />
197
+ ) ,
198
+ ) }
160
199
</ TableSection >
161
200
) }
162
201
{ isNonEmptyArray ( inactiveObjectMetadataItems ) && (
163
202
< TableSection title = "Inactive" >
164
- { sortedInactiveObjectSettingsItems . map (
203
+ { filteredInactiveObjectSettingsItems . map (
165
204
( objectSettingsItem ) => (
166
205
< SettingsObjectMetadataItemTableRow
167
206
key = { objectSettingsItem . objectMetadataItem . namePlural }
0 commit comments