norma-library 0.5.147 → 0.5.149

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 (173) hide show
  1. package/.babelrc.json +18 -18
  2. package/.prettierignore +10 -10
  3. package/.prettierrc.json +20 -20
  4. package/.storybook/main.ts +20 -20
  5. package/.storybook/preview.ts +15 -15
  6. package/README.md +43 -43
  7. package/commitlint.config.js +1 -1
  8. package/dist/esm/components/UncontrolledTable/components/header/index.js +7 -7
  9. package/dist/esm/components/UncontrolledTable/components/header/index.js.map +1 -1
  10. package/dist/esm/components/UncontrolledTable/components/header/styles.js +2 -2
  11. package/dist/esm/components/UncontrolledTable/components/header/styles.js.map +1 -1
  12. package/dist/esm/components/UncontrolledTable/components/tbody/styles.js +7 -1
  13. package/dist/esm/components/UncontrolledTable/components/tbody/styles.js.map +1 -1
  14. package/dist/esm/components/UncontrolledTable/styles.js +7 -1
  15. package/dist/esm/components/UncontrolledTable/styles.js.map +1 -1
  16. package/dist/esm/utils/styledBreakpoints.d.ts +10 -0
  17. package/dist/esm/utils/styledBreakpoints.js +12 -0
  18. package/dist/esm/utils/styledBreakpoints.js.map +1 -0
  19. package/docs/index.md +118 -118
  20. package/package.json +136 -136
  21. package/src/components/Accordion.tsx +39 -39
  22. package/src/components/Avatar.tsx +17 -17
  23. package/src/components/Badge.tsx +14 -14
  24. package/src/components/Box/index.tsx +12 -12
  25. package/src/components/Box/interfaces.ts +3 -3
  26. package/src/components/Box/styles.tsx +22 -22
  27. package/src/components/Breadcrumb/index.tsx +27 -27
  28. package/src/components/Breadcrumb/interface.ts +8 -8
  29. package/src/components/Breadcrumb/styles.tsx +32 -32
  30. package/src/components/Button.tsx +26 -26
  31. package/src/components/Card.tsx +37 -37
  32. package/src/components/ChatMessage.tsx +87 -87
  33. package/src/components/ChatMessageBalloon/ChatMessageBalloon.style.ts +56 -56
  34. package/src/components/ChatMessageBalloon/ChatMessageBalloon.tsx +55 -55
  35. package/src/components/CheckBox.tsx +21 -21
  36. package/src/components/DateInput/index.tsx +34 -34
  37. package/src/components/DateInput/interface.ts +13 -13
  38. package/src/components/DateInput/styles.tsx +27 -27
  39. package/src/components/DatePicker.tsx +67 -67
  40. package/src/components/DropDown.tsx +24 -24
  41. package/src/components/IconButton.tsx +37 -37
  42. package/src/components/Icons.tsx +82 -82
  43. package/src/components/Modal.tsx +103 -103
  44. package/src/components/MultiSelectInput/components/MultiValue/index.tsx +44 -44
  45. package/src/components/MultiSelectInput/components/Option/index.tsx +62 -62
  46. package/src/components/MultiSelectInput/components/Option/styles.tsx +8 -8
  47. package/src/components/MultiSelectInput/index.tsx +60 -60
  48. package/src/components/MultiSelectInput/interfaces.ts +15 -15
  49. package/src/components/MultiSelectInput/styles.tsx +43 -43
  50. package/src/components/Paper.tsx +12 -12
  51. package/src/components/ProgressBar.tsx +71 -71
  52. package/src/components/RadioGroup.tsx +43 -43
  53. package/src/components/RangerSlider.tsx +65 -65
  54. package/src/components/Select.tsx +74 -74
  55. package/src/components/SelectInput/components/Option/index.tsx +61 -61
  56. package/src/components/SelectInput/components/Option/styles.tsx +8 -8
  57. package/src/components/SelectInput/index.tsx +45 -45
  58. package/src/components/SelectInput/interfaces.ts +15 -15
  59. package/src/components/SelectInput/styles.tsx +31 -31
  60. package/src/components/StatusModal/StatusModal.style.tsx +75 -75
  61. package/src/components/StatusModal/StatusModal.tsx +58 -58
  62. package/src/components/Svgs.tsx +506 -506
  63. package/src/components/Table/components/header/index.tsx +86 -86
  64. package/src/components/Table/components/header/styles.tsx +59 -59
  65. package/src/components/Table/components/index.tsx +8 -8
  66. package/src/components/Table/components/pagination/index.tsx +39 -39
  67. package/src/components/Table/components/pagination/styles.tsx +28 -28
  68. package/src/components/Table/components/tbody/index.tsx +30 -30
  69. package/src/components/Table/components/tbody/styles.tsx +4 -4
  70. package/src/components/Table/index.tsx +317 -317
  71. package/src/components/Table/interface.ts +23 -23
  72. package/src/components/Table/styles.tsx +117 -117
  73. package/src/components/Tabs.tsx +105 -105
  74. package/src/components/Tag.tsx +33 -33
  75. package/src/components/TextField.tsx +19 -19
  76. package/src/components/TextInput/index.tsx +37 -37
  77. package/src/components/TextInput/interface.ts +9 -9
  78. package/src/components/TextInput/styles.tsx +23 -23
  79. package/src/components/TimeLine.tsx +89 -89
  80. package/src/components/TimePicker.tsx +78 -78
  81. package/src/components/Typography/Text/index.tsx +20 -20
  82. package/src/components/Typography/Text/interfaces.ts +5 -5
  83. package/src/components/Typography/Text/styles.tsx +40 -40
  84. package/src/components/Typography/Title/index.tsx +22 -22
  85. package/src/components/Typography/Title/interfaces.ts +6 -6
  86. package/src/components/Typography/Title/styles.tsx +40 -40
  87. package/src/components/Typography/index.tsx +6 -6
  88. package/src/components/UncontrolledTable/components/header/index.tsx +65 -63
  89. package/src/components/UncontrolledTable/components/header/styles.tsx +63 -60
  90. package/src/components/UncontrolledTable/components/index.tsx +8 -8
  91. package/src/components/UncontrolledTable/components/pagination/index.tsx +43 -43
  92. package/src/components/UncontrolledTable/components/pagination/styles.tsx +28 -28
  93. package/src/components/UncontrolledTable/components/tbody/index.tsx +33 -33
  94. package/src/components/UncontrolledTable/components/tbody/styles.tsx +32 -25
  95. package/src/components/UncontrolledTable/index.tsx +221 -221
  96. package/src/components/UncontrolledTable/interface.ts +43 -43
  97. package/src/components/UncontrolledTable/styles.tsx +123 -116
  98. package/src/components/UncontrolledTabs/UncontrolledTabs.style.tsx +56 -56
  99. package/src/components/UncontrolledTabs/UncontrolledTabs.tsx +68 -68
  100. package/src/components/index.ts +24 -24
  101. package/src/helpers/alignments.ts +14 -14
  102. package/src/helpers/borders.ts +18 -18
  103. package/src/helpers/colors.ts +241 -241
  104. package/src/helpers/index.ts +5 -5
  105. package/src/helpers/radios.ts +24 -24
  106. package/src/helpers/sizes.ts +72 -72
  107. package/src/hooks/useClickOutside.tsx +18 -18
  108. package/src/index.ts +66 -66
  109. package/src/interfaces/Accordion.ts +12 -12
  110. package/src/interfaces/Avatar.tsx +15 -15
  111. package/src/interfaces/Badge.ts +19 -19
  112. package/src/interfaces/Button.ts +22 -22
  113. package/src/interfaces/Card.ts +11 -11
  114. package/src/interfaces/ChatMessage.ts +12 -12
  115. package/src/interfaces/ChatMessageBalloon.ts +17 -17
  116. package/src/interfaces/CheckBox.ts +27 -27
  117. package/src/interfaces/DatePicker.ts +13 -13
  118. package/src/interfaces/DropDown.ts +14 -14
  119. package/src/interfaces/IconButton.ts +22 -22
  120. package/src/interfaces/Icons.ts +17 -17
  121. package/src/interfaces/Modal.ts +18 -18
  122. package/src/interfaces/Paper.ts +12 -12
  123. package/src/interfaces/ProgressBar.ts +29 -29
  124. package/src/interfaces/RadioGroup.ts +23 -23
  125. package/src/interfaces/RangerSlider.ts +21 -21
  126. package/src/interfaces/Select.ts +17 -17
  127. package/src/interfaces/Tabs.ts +19 -19
  128. package/src/interfaces/Tag.ts +17 -17
  129. package/src/interfaces/TextField.ts +44 -44
  130. package/src/interfaces/TimeLine.ts +11 -11
  131. package/src/interfaces/TimePicker.ts +13 -13
  132. package/src/interfaces/index.ts +23 -23
  133. package/src/providers/NormaProvider.tsx +13 -13
  134. package/src/sample-data-2.json +178 -178
  135. package/src/sample-data.json +177 -177
  136. package/src/stories/Accordion.stories.tsx +65 -65
  137. package/src/stories/Avatar.stories.tsx +123 -123
  138. package/src/stories/Badge.stories.tsx +39 -39
  139. package/src/stories/Box.stories.tsx +35 -35
  140. package/src/stories/Breadcrumb.stories.tsx +44 -44
  141. package/src/stories/Button.stories.tsx +93 -93
  142. package/src/stories/Card.stories.tsx +39 -39
  143. package/src/stories/ChatMessage.stories.tsx +84 -84
  144. package/src/stories/ChatMessageBalloon.stories.tsx +108 -108
  145. package/src/stories/CheckBox.stories.tsx +88 -88
  146. package/src/stories/DateInput.stories.tsx +51 -51
  147. package/src/stories/DatePicker.stories.tsx +50 -50
  148. package/src/stories/DropDown.stories.tsx +57 -57
  149. package/src/stories/IconButton.stories.tsx +78 -78
  150. package/src/stories/Modal.stories.tsx +246 -246
  151. package/src/stories/ModalStatus.stories.tsx +46 -46
  152. package/src/stories/MultiSelectInput.stories.tsx +90 -90
  153. package/src/stories/Paper.stories.tsx +53 -53
  154. package/src/stories/ProgressBar.stories.tsx +116 -116
  155. package/src/stories/RadioGroup.stories.tsx +87 -87
  156. package/src/stories/RangerSlider.stories.tsx +149 -149
  157. package/src/stories/Select.stories.tsx +100 -100
  158. package/src/stories/SelectInput.stories.tsx +78 -78
  159. package/src/stories/Table.stories.tsx +372 -372
  160. package/src/stories/Tabs.stories.tsx +61 -61
  161. package/src/stories/Tag.stories.tsx +56 -56
  162. package/src/stories/Text.stories.tsx +37 -37
  163. package/src/stories/TextField.stories.tsx +310 -310
  164. package/src/stories/TextInput.stories.tsx +52 -52
  165. package/src/stories/TimeLine.stories.tsx +35 -35
  166. package/src/stories/TimePicker.stories.tsx +87 -87
  167. package/src/stories/Title.stories.tsx +43 -43
  168. package/src/stories/UncontrolledTable.stories.tsx +305 -305
  169. package/src/stories/UncontrolledTabs.stories.tsx +63 -63
  170. package/src/styles/globals.scss +17 -17
  171. package/src/types/index.ts +204 -204
  172. package/src/utils/styledBreakpoints.ts +25 -0
  173. package/vite.config.ts +15 -15
@@ -1,318 +1,318 @@
1
- import React, { useState, useMemo } from 'react'
2
- import * as S from "./styles"
3
- import {
4
- flexRender,
5
- getCoreRowModel,
6
- getSortedRowModel,
7
- useReactTable,
8
- getFilteredRowModel,
9
- ColumnFiltersState,
10
- getPaginationRowModel
11
- } from '@tanstack/react-table'
12
- import { format, isAfter, isBefore } from "date-fns"
13
- import { Button } from "@mui/material";
14
- import { TablePropos } from './interface';
15
- import { Pagination, Header, TBody } from "./components"
16
-
17
- const Table:React.FC<TablePropos> = ({ data, columns, onClick, onMouseOver, onMouseOut, showTotalResults, showSettings, pagination, rowCount, onChangePage, customTotalResult }) => {
18
- const [openFilterDialog, setOpenFilterDialog] = useState('')
19
- const [sorting, setSorting] = useState<any>([])
20
- const [openFilterOptions, setOpenFilterOptions] = useState(false)
21
- const [filterByColumn, setFilterByColumn] = useState<ColumnFiltersState>([])
22
- const [filterInputSelected, setFilterInputSelected] = useState<any>()
23
- const [globalFilters, setGlobalFilters] = useState<any>([])
24
- const [value, setValue] = useState<any>()
25
- const [orderSmallest, setOrderSmallest] = useState(false)
26
- const [orderLargest, setOrderLargest] = useState(false)
27
-
28
- const customFilterText = (row: any, value: string) => {
29
- const itensFinded = globalFilters.map((item: any) => {
30
- if (item.type === 'Horario Igual a') {
31
- return item.value === row.original[item.acessor]
32
- }
33
- if (item.type === 'Horario maior que') {
34
- const date = new Date()
35
- const rowDate = new Date()
36
- const hourSplited = item?.value?.split(':')
37
- const rowDateSplited = row.original[item.acessor].split(':')
38
-
39
- date.setHours(Number(hourSplited[0]), Number(hourSplited[1]), 0, 0)
40
- rowDate.setHours(Number(rowDateSplited[0]), Number(rowDateSplited[1]), 0 ,0)
41
-
42
- return isAfter(rowDate, date)
43
- }
44
- if (item.type === 'Horario menor que') {
45
- const date = new Date()
46
- const rowDate = new Date()
47
- const hourSplited = item?.value?.split(':')
48
- const rowDateSplited = row.original[item.acessor].split(':')
49
-
50
- date.setHours(Number(hourSplited[0]), Number(hourSplited[1]), 0, 0)
51
- rowDate.setHours(Number(rowDateSplited[0]), Number(rowDateSplited[1]), 0 ,0)
52
-
53
- return isBefore(rowDate, date)
54
- }
55
- if (item.type === 'Data Igual a') {
56
- const dateSplited = item?.value?.split('-')
57
- return row.original[item.acessor] === format(new Date(dateSplited[0], dateSplited[1] - 1, dateSplited[2], 0 , 0), "dd/MM/yyyy")
58
- }
59
- if (item.type === 'Data maior que') {
60
- const dateSplited = item?.value?.split('-')
61
- const rowDateSplited = row.original[item.acessor].split('/')
62
- return isAfter(new Date(rowDateSplited[2], rowDateSplited[1], rowDateSplited[0]), new Date(dateSplited[0], dateSplited[1], dateSplited[2]))
63
- }
64
- if (item.type === 'Data menor que') {
65
- const dateSplited = item?.value?.split('-')
66
- const rowDateSplited = row.original[item.acessor].split('/')
67
- return isBefore(new Date(rowDateSplited[2], rowDateSplited[1], rowDateSplited[0]), new Date(dateSplited[0], dateSplited[1], dateSplited[2]))
68
- }
69
- if (item.type === 'Igual a' && typeof value === 'number') {
70
- return row.original[item.acessor] === item.value
71
- }
72
- if (item.type === 'Igual a') {
73
- return row.original[item.acessor] === item.value
74
- }
75
- if (item.type === 'Contém') {
76
- return !!row.original[item.acessor].includes(item.value)
77
- }
78
- if (item.type === 'Não é igual a') {
79
- return row.original[item.acessor] !== item.value
80
- }
81
- if (item.type === 'Maior que') {
82
- return row.original[item.acessor] > item.value
83
- }
84
- if (item.type === 'Menor que') {
85
- return row.original[item.acessor] < item.value
86
- }
87
- })
88
-
89
- const result = itensFinded.every((item: any) => item)
90
-
91
- return result
92
- }
93
-
94
- const reactTableConfig = useMemo(() => {
95
- const config:any = {
96
- data,
97
- columns,
98
- filterFns:{
99
- 'customFilterText': customFilterText
100
- },
101
- state: {
102
- sorting: sorting,
103
- columnFilters: filterByColumn,
104
- },
105
- rowCount: rowCount || 10,
106
- getCoreRowModel: getCoreRowModel(),
107
- getSortedRowModel: getSortedRowModel(),
108
- getFilteredRowModel: getFilteredRowModel(),
109
- onSortingChange: setSorting,
110
- onColumnFiltersChange: setFilterByColumn
111
- }
112
- config.rowCount = rowCount || 10
113
-
114
- if(!pagination) {
115
- config.getPaginationRowModel = getPaginationRowModel()
116
- } else {
117
- config.state.pagination = pagination
118
- config.manualPagination = true
119
- config.pageCount = pagination.totalPages
120
- }
121
- return config
122
- }, [data, sorting, filterByColumn, columns, pagination])
123
-
124
- const table = useReactTable(reactTableConfig)
125
-
126
- return (
127
- <S.Container>
128
- <Header
129
- table={table}
130
- customTotalResult={customTotalResult}
131
- globalFilters={globalFilters}
132
- orderSmallest={orderSmallest}
133
- orderLargest={orderLargest}
134
- showTotalResults={showTotalResults}
135
- showSettings={showSettings}
136
- setGlobalFilters={setGlobalFilters}
137
- setOrderLargest={setOrderLargest}
138
- setOrderSmallest={setOrderSmallest}
139
- />
140
- <S.Content>
141
- <S.Table>
142
- <thead>
143
- {table.getHeaderGroups().map((headerGroup: any) => (
144
- <tr key={headerGroup.id}>
145
- {headerGroup.headers.map((header: any) => (
146
- <th key={header.id}>
147
- <div>
148
- <S.ColumnContent>
149
- <S.TextColumn>
150
- {header.isPlaceholder
151
- ? null
152
- : flexRender(
153
- header.column.columnDef.header,
154
- header.getContext()
155
- )}
156
- </S.TextColumn>
157
- <S.IconFilterDialog onClick={() => {
158
- setOpenFilterDialog(header.column.columnDef.accessorKey)
159
- }}>
160
- <svg fill='#666' focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ArrowDropDownIcon"><path d="m7 10 5 5 5-5z"></path></svg>
161
- </S.IconFilterDialog>
162
- </S.ColumnContent>
163
- { openFilterDialog === header.column.columnDef.accessorKey
164
- ? (
165
- <>
166
- <S.backgroundDialog onClick={() => {
167
- setOpenFilterDialog('')
168
- setOpenFilterOptions(false)
169
- }}></S.backgroundDialog>
170
- <S.FilterDialog>
171
- {
172
- openFilterOptions
173
- ? (
174
- <S.ListFilterDialog>
175
- <p className='label'>Selecione um filtro</p>
176
- <select className='select' value={filterInputSelected} onChange={(event) => {
177
- setFilterInputSelected(event.target.value)
178
- }}>
179
- <option>Selecione...</option>
180
- { header?.headerGroup?.headers[header.index].column.columnDef.type === 'text' ? <option>Igual a</option> : null }
181
- { header?.headerGroup?.headers[header.index].column.columnDef.type === 'text' ? <option>Não é igual a</option> : null }
182
- { header?.headerGroup?.headers[header.index].column.columnDef.type === 'text' ? <option>Contém</option> : null }
183
- { header?.headerGroup?.headers[header.index].column.columnDef.type === 'number' ? <option>Maior que</option> : null }
184
- { header?.headerGroup?.headers[header.index].column.columnDef.type === 'number' ? <option>Menor que</option> : null }
185
- { header?.headerGroup?.headers[header.index].column.columnDef.type === 'number' ? <option>Igual a</option> : null }
186
- { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'date' ? <option>Data Igual a</option> : null }
187
- { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'date' ? <option>Data maior que</option> : null }
188
- { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'date' ? <option>Data menor que</option> : null }
189
- { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'time' ? <option>Horario Igual a</option> : null }
190
- { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'time' ? <option>Horario maior que</option> : null }
191
- { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'time' ? <option>Horario menor que</option> : null }
192
- </select>
193
- <div>
194
- { header.column.getCanFilter()
195
- ? filterInputSelected === 'Igual a' ||
196
- filterInputSelected === 'Não é igual a' ||
197
- filterInputSelected === 'Contém' ||
198
- filterInputSelected === 'Maior que' ||
199
- filterInputSelected === 'Menor que' ||
200
- filterInputSelected === 'Data Igual a' ||
201
- filterInputSelected === 'Data maior que' ||
202
- filterInputSelected === 'Data menor que' ||
203
- filterInputSelected === 'Horario Igual a' ||
204
- filterInputSelected === 'Horario maior que' ||
205
- filterInputSelected === 'Horario menor que'
206
- ? (
207
- <div>
208
- <p className='label' style={{ marginTop: '10px' }}>Valor</p>
209
- <input
210
- type={header?.headerGroup?.headers[header.index].column.columnDef.type}
211
- className='select'
212
- style={{ width: '100%' }}
213
- value={value as any}
214
- onChange={event => {
215
- if (header?.headerGroup?.headers[header.index].column.columnDef.type === 'number') {
216
- setValue(Number(event.target.value))
217
- return
218
- }
219
- if (header?.headerGroup?.headers[header.index].column.columnDef.type === 'date') {
220
- setValue(event.target.value)
221
- return
222
- }
223
- setValue(event.target.value)
224
- }}
225
- />
226
- <Button
227
- color="primary"
228
- type={"submit"}
229
- disableElevation
230
- style={{
231
- marginTop: 8,
232
- width: '100%'
233
- }}
234
- variant="contained"
235
- onClick={() => {
236
- setGlobalFilters((current: any) => [...current,
237
- {
238
- acessor: header.column.columnDef.accessorKey,
239
- type: filterInputSelected,
240
- value: value
241
- }
242
- ])
243
- header.column.setFilterValue(value)
244
- setOpenFilterOptions(false)
245
- setOpenFilterDialog('')
246
- setFilterInputSelected(false)
247
- setValue(null)
248
- }}
249
- >
250
- Buscar
251
- </Button>
252
- </div>
253
- )
254
- : null
255
- : null
256
- }
257
- </div>
258
- </S.ListFilterDialog>
259
- )
260
- : (
261
- <S.ListFilterDialog>
262
- <S.OptionFilterDialog style={{
263
- background: orderSmallest ? 'rgba(0, 0, 0, 0.04)' : ''
264
- }}>
265
- <div className='icon'>
266
- <svg fill="#666" stroke="currentColor" strokeWidth="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="20" height="20"><path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m0 0l6.75-6.75M12 19.5l-6.75-6.75"></path></svg>
267
- </div>
268
- <p onClick={() => {
269
- header.column.toggleSorting()
270
- setOrderSmallest(true)
271
- setOrderLargest(false)
272
- }}>Menor primeiro</p>
273
- </S.OptionFilterDialog>
274
- <S.OptionFilterDialog style={{
275
- background: orderLargest ? 'rgba(0, 0, 0, 0.04)' : ''
276
- }}>
277
- <div className='icon rotate'>
278
- <svg fill="#666" stroke="currentColor" strokeWidth="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="20" height="20"><path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m0 0l6.75-6.75M12 19.5l-6.75-6.75"></path></svg>
279
- </div>
280
- <p onClick={() => {
281
- header.column.toggleSorting()
282
- setOrderLargest(true)
283
- setOrderSmallest(false)
284
- }}>Maior primeiro</p>
285
- </S.OptionFilterDialog>
286
- <S.OptionFilterDialog>
287
- <div className='icon'>
288
- <svg fill="none" stroke="currentColor" strokeWidth="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="16" height="16"><path strokeLinecap="round" strokeLinejoin="round" d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z"></path></svg>
289
- </div>
290
- <p onClick={() => setOpenFilterOptions(true)}>Filtrar por</p>
291
- </S.OptionFilterDialog>
292
- </S.ListFilterDialog>
293
- )
294
- }
295
- </S.FilterDialog>
296
- </>
297
- ) : null
298
- }
299
- </div>
300
- </th>
301
- ))}
302
- </tr>
303
- ))}
304
- </thead>
305
- <TBody
306
- table={table}
307
- onClick={onClick}
308
- onMouseOver={onMouseOver}
309
- onMouseOut={onMouseOut}
310
- />
311
- </S.Table>
312
- </S.Content>
313
- <Pagination table={table} onChangePage={onChangePage} />
314
- </S.Container>
315
- )
316
- }
317
-
1
+ import React, { useState, useMemo } from 'react'
2
+ import * as S from "./styles"
3
+ import {
4
+ flexRender,
5
+ getCoreRowModel,
6
+ getSortedRowModel,
7
+ useReactTable,
8
+ getFilteredRowModel,
9
+ ColumnFiltersState,
10
+ getPaginationRowModel
11
+ } from '@tanstack/react-table'
12
+ import { format, isAfter, isBefore } from "date-fns"
13
+ import { Button } from "@mui/material";
14
+ import { TablePropos } from './interface';
15
+ import { Pagination, Header, TBody } from "./components"
16
+
17
+ const Table:React.FC<TablePropos> = ({ data, columns, onClick, onMouseOver, onMouseOut, showTotalResults, showSettings, pagination, rowCount, onChangePage, customTotalResult }) => {
18
+ const [openFilterDialog, setOpenFilterDialog] = useState('')
19
+ const [sorting, setSorting] = useState<any>([])
20
+ const [openFilterOptions, setOpenFilterOptions] = useState(false)
21
+ const [filterByColumn, setFilterByColumn] = useState<ColumnFiltersState>([])
22
+ const [filterInputSelected, setFilterInputSelected] = useState<any>()
23
+ const [globalFilters, setGlobalFilters] = useState<any>([])
24
+ const [value, setValue] = useState<any>()
25
+ const [orderSmallest, setOrderSmallest] = useState(false)
26
+ const [orderLargest, setOrderLargest] = useState(false)
27
+
28
+ const customFilterText = (row: any, value: string) => {
29
+ const itensFinded = globalFilters.map((item: any) => {
30
+ if (item.type === 'Horario Igual a') {
31
+ return item.value === row.original[item.acessor]
32
+ }
33
+ if (item.type === 'Horario maior que') {
34
+ const date = new Date()
35
+ const rowDate = new Date()
36
+ const hourSplited = item?.value?.split(':')
37
+ const rowDateSplited = row.original[item.acessor].split(':')
38
+
39
+ date.setHours(Number(hourSplited[0]), Number(hourSplited[1]), 0, 0)
40
+ rowDate.setHours(Number(rowDateSplited[0]), Number(rowDateSplited[1]), 0 ,0)
41
+
42
+ return isAfter(rowDate, date)
43
+ }
44
+ if (item.type === 'Horario menor que') {
45
+ const date = new Date()
46
+ const rowDate = new Date()
47
+ const hourSplited = item?.value?.split(':')
48
+ const rowDateSplited = row.original[item.acessor].split(':')
49
+
50
+ date.setHours(Number(hourSplited[0]), Number(hourSplited[1]), 0, 0)
51
+ rowDate.setHours(Number(rowDateSplited[0]), Number(rowDateSplited[1]), 0 ,0)
52
+
53
+ return isBefore(rowDate, date)
54
+ }
55
+ if (item.type === 'Data Igual a') {
56
+ const dateSplited = item?.value?.split('-')
57
+ return row.original[item.acessor] === format(new Date(dateSplited[0], dateSplited[1] - 1, dateSplited[2], 0 , 0), "dd/MM/yyyy")
58
+ }
59
+ if (item.type === 'Data maior que') {
60
+ const dateSplited = item?.value?.split('-')
61
+ const rowDateSplited = row.original[item.acessor].split('/')
62
+ return isAfter(new Date(rowDateSplited[2], rowDateSplited[1], rowDateSplited[0]), new Date(dateSplited[0], dateSplited[1], dateSplited[2]))
63
+ }
64
+ if (item.type === 'Data menor que') {
65
+ const dateSplited = item?.value?.split('-')
66
+ const rowDateSplited = row.original[item.acessor].split('/')
67
+ return isBefore(new Date(rowDateSplited[2], rowDateSplited[1], rowDateSplited[0]), new Date(dateSplited[0], dateSplited[1], dateSplited[2]))
68
+ }
69
+ if (item.type === 'Igual a' && typeof value === 'number') {
70
+ return row.original[item.acessor] === item.value
71
+ }
72
+ if (item.type === 'Igual a') {
73
+ return row.original[item.acessor] === item.value
74
+ }
75
+ if (item.type === 'Contém') {
76
+ return !!row.original[item.acessor].includes(item.value)
77
+ }
78
+ if (item.type === 'Não é igual a') {
79
+ return row.original[item.acessor] !== item.value
80
+ }
81
+ if (item.type === 'Maior que') {
82
+ return row.original[item.acessor] > item.value
83
+ }
84
+ if (item.type === 'Menor que') {
85
+ return row.original[item.acessor] < item.value
86
+ }
87
+ })
88
+
89
+ const result = itensFinded.every((item: any) => item)
90
+
91
+ return result
92
+ }
93
+
94
+ const reactTableConfig = useMemo(() => {
95
+ const config:any = {
96
+ data,
97
+ columns,
98
+ filterFns:{
99
+ 'customFilterText': customFilterText
100
+ },
101
+ state: {
102
+ sorting: sorting,
103
+ columnFilters: filterByColumn,
104
+ },
105
+ rowCount: rowCount || 10,
106
+ getCoreRowModel: getCoreRowModel(),
107
+ getSortedRowModel: getSortedRowModel(),
108
+ getFilteredRowModel: getFilteredRowModel(),
109
+ onSortingChange: setSorting,
110
+ onColumnFiltersChange: setFilterByColumn
111
+ }
112
+ config.rowCount = rowCount || 10
113
+
114
+ if(!pagination) {
115
+ config.getPaginationRowModel = getPaginationRowModel()
116
+ } else {
117
+ config.state.pagination = pagination
118
+ config.manualPagination = true
119
+ config.pageCount = pagination.totalPages
120
+ }
121
+ return config
122
+ }, [data, sorting, filterByColumn, columns, pagination])
123
+
124
+ const table = useReactTable(reactTableConfig)
125
+
126
+ return (
127
+ <S.Container>
128
+ <Header
129
+ table={table}
130
+ customTotalResult={customTotalResult}
131
+ globalFilters={globalFilters}
132
+ orderSmallest={orderSmallest}
133
+ orderLargest={orderLargest}
134
+ showTotalResults={showTotalResults}
135
+ showSettings={showSettings}
136
+ setGlobalFilters={setGlobalFilters}
137
+ setOrderLargest={setOrderLargest}
138
+ setOrderSmallest={setOrderSmallest}
139
+ />
140
+ <S.Content>
141
+ <S.Table>
142
+ <thead>
143
+ {table.getHeaderGroups().map((headerGroup: any) => (
144
+ <tr key={headerGroup.id}>
145
+ {headerGroup.headers.map((header: any) => (
146
+ <th key={header.id}>
147
+ <div>
148
+ <S.ColumnContent>
149
+ <S.TextColumn>
150
+ {header.isPlaceholder
151
+ ? null
152
+ : flexRender(
153
+ header.column.columnDef.header,
154
+ header.getContext()
155
+ )}
156
+ </S.TextColumn>
157
+ <S.IconFilterDialog onClick={() => {
158
+ setOpenFilterDialog(header.column.columnDef.accessorKey)
159
+ }}>
160
+ <svg fill='#666' focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ArrowDropDownIcon"><path d="m7 10 5 5 5-5z"></path></svg>
161
+ </S.IconFilterDialog>
162
+ </S.ColumnContent>
163
+ { openFilterDialog === header.column.columnDef.accessorKey
164
+ ? (
165
+ <>
166
+ <S.backgroundDialog onClick={() => {
167
+ setOpenFilterDialog('')
168
+ setOpenFilterOptions(false)
169
+ }}></S.backgroundDialog>
170
+ <S.FilterDialog>
171
+ {
172
+ openFilterOptions
173
+ ? (
174
+ <S.ListFilterDialog>
175
+ <p className='label'>Selecione um filtro</p>
176
+ <select className='select' value={filterInputSelected} onChange={(event) => {
177
+ setFilterInputSelected(event.target.value)
178
+ }}>
179
+ <option>Selecione...</option>
180
+ { header?.headerGroup?.headers[header.index].column.columnDef.type === 'text' ? <option>Igual a</option> : null }
181
+ { header?.headerGroup?.headers[header.index].column.columnDef.type === 'text' ? <option>Não é igual a</option> : null }
182
+ { header?.headerGroup?.headers[header.index].column.columnDef.type === 'text' ? <option>Contém</option> : null }
183
+ { header?.headerGroup?.headers[header.index].column.columnDef.type === 'number' ? <option>Maior que</option> : null }
184
+ { header?.headerGroup?.headers[header.index].column.columnDef.type === 'number' ? <option>Menor que</option> : null }
185
+ { header?.headerGroup?.headers[header.index].column.columnDef.type === 'number' ? <option>Igual a</option> : null }
186
+ { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'date' ? <option>Data Igual a</option> : null }
187
+ { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'date' ? <option>Data maior que</option> : null }
188
+ { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'date' ? <option>Data menor que</option> : null }
189
+ { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'time' ? <option>Horario Igual a</option> : null }
190
+ { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'time' ? <option>Horario maior que</option> : null }
191
+ { header?.headerGroup?.headers[header.index]. column.columnDef.type === 'time' ? <option>Horario menor que</option> : null }
192
+ </select>
193
+ <div>
194
+ { header.column.getCanFilter()
195
+ ? filterInputSelected === 'Igual a' ||
196
+ filterInputSelected === 'Não é igual a' ||
197
+ filterInputSelected === 'Contém' ||
198
+ filterInputSelected === 'Maior que' ||
199
+ filterInputSelected === 'Menor que' ||
200
+ filterInputSelected === 'Data Igual a' ||
201
+ filterInputSelected === 'Data maior que' ||
202
+ filterInputSelected === 'Data menor que' ||
203
+ filterInputSelected === 'Horario Igual a' ||
204
+ filterInputSelected === 'Horario maior que' ||
205
+ filterInputSelected === 'Horario menor que'
206
+ ? (
207
+ <div>
208
+ <p className='label' style={{ marginTop: '10px' }}>Valor</p>
209
+ <input
210
+ type={header?.headerGroup?.headers[header.index].column.columnDef.type}
211
+ className='select'
212
+ style={{ width: '100%' }}
213
+ value={value as any}
214
+ onChange={event => {
215
+ if (header?.headerGroup?.headers[header.index].column.columnDef.type === 'number') {
216
+ setValue(Number(event.target.value))
217
+ return
218
+ }
219
+ if (header?.headerGroup?.headers[header.index].column.columnDef.type === 'date') {
220
+ setValue(event.target.value)
221
+ return
222
+ }
223
+ setValue(event.target.value)
224
+ }}
225
+ />
226
+ <Button
227
+ color="primary"
228
+ type={"submit"}
229
+ disableElevation
230
+ style={{
231
+ marginTop: 8,
232
+ width: '100%'
233
+ }}
234
+ variant="contained"
235
+ onClick={() => {
236
+ setGlobalFilters((current: any) => [...current,
237
+ {
238
+ acessor: header.column.columnDef.accessorKey,
239
+ type: filterInputSelected,
240
+ value: value
241
+ }
242
+ ])
243
+ header.column.setFilterValue(value)
244
+ setOpenFilterOptions(false)
245
+ setOpenFilterDialog('')
246
+ setFilterInputSelected(false)
247
+ setValue(null)
248
+ }}
249
+ >
250
+ Buscar
251
+ </Button>
252
+ </div>
253
+ )
254
+ : null
255
+ : null
256
+ }
257
+ </div>
258
+ </S.ListFilterDialog>
259
+ )
260
+ : (
261
+ <S.ListFilterDialog>
262
+ <S.OptionFilterDialog style={{
263
+ background: orderSmallest ? 'rgba(0, 0, 0, 0.04)' : ''
264
+ }}>
265
+ <div className='icon'>
266
+ <svg fill="#666" stroke="currentColor" strokeWidth="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="20" height="20"><path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m0 0l6.75-6.75M12 19.5l-6.75-6.75"></path></svg>
267
+ </div>
268
+ <p onClick={() => {
269
+ header.column.toggleSorting()
270
+ setOrderSmallest(true)
271
+ setOrderLargest(false)
272
+ }}>Menor primeiro</p>
273
+ </S.OptionFilterDialog>
274
+ <S.OptionFilterDialog style={{
275
+ background: orderLargest ? 'rgba(0, 0, 0, 0.04)' : ''
276
+ }}>
277
+ <div className='icon rotate'>
278
+ <svg fill="#666" stroke="currentColor" strokeWidth="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="20" height="20"><path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m0 0l6.75-6.75M12 19.5l-6.75-6.75"></path></svg>
279
+ </div>
280
+ <p onClick={() => {
281
+ header.column.toggleSorting()
282
+ setOrderLargest(true)
283
+ setOrderSmallest(false)
284
+ }}>Maior primeiro</p>
285
+ </S.OptionFilterDialog>
286
+ <S.OptionFilterDialog>
287
+ <div className='icon'>
288
+ <svg fill="none" stroke="currentColor" strokeWidth="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="16" height="16"><path strokeLinecap="round" strokeLinejoin="round" d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z"></path></svg>
289
+ </div>
290
+ <p onClick={() => setOpenFilterOptions(true)}>Filtrar por</p>
291
+ </S.OptionFilterDialog>
292
+ </S.ListFilterDialog>
293
+ )
294
+ }
295
+ </S.FilterDialog>
296
+ </>
297
+ ) : null
298
+ }
299
+ </div>
300
+ </th>
301
+ ))}
302
+ </tr>
303
+ ))}
304
+ </thead>
305
+ <TBody
306
+ table={table}
307
+ onClick={onClick}
308
+ onMouseOver={onMouseOver}
309
+ onMouseOut={onMouseOut}
310
+ />
311
+ </S.Table>
312
+ </S.Content>
313
+ <Pagination table={table} onChangePage={onChangePage} />
314
+ </S.Container>
315
+ )
316
+ }
317
+
318
318
  export default Table