norma-library 0.5.131 → 0.5.132

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 (182) 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/Box/styles.d.ts +1 -1
  9. package/dist/esm/components/Breadcrumb/styles.d.ts +4 -4
  10. package/dist/esm/components/ChatMessageBalloon/ChatMessageBalloon.style.d.ts +1 -1
  11. package/dist/esm/components/DateInput/styles.d.ts +2 -2
  12. package/dist/esm/components/Icons.d.ts +1 -1
  13. package/dist/esm/components/MultiSelectInput/components/Option/styles.d.ts +1 -1
  14. package/dist/esm/components/MultiSelectInput/styles.d.ts +2 -2
  15. package/dist/esm/components/ProgressBar.d.ts +1 -1
  16. package/dist/esm/components/ProgressBar.js +19 -8
  17. package/dist/esm/components/ProgressBar.js.map +1 -1
  18. package/dist/esm/components/SelectInput/components/Option/styles.d.ts +1 -1
  19. package/dist/esm/components/SelectInput/styles.d.ts +2 -2
  20. package/dist/esm/components/Table/components/header/styles.d.ts +8 -8
  21. package/dist/esm/components/Table/components/pagination/styles.d.ts +1 -1
  22. package/dist/esm/components/Table/components/tbody/styles.d.ts +1 -1
  23. package/dist/esm/components/Table/styles.d.ts +10 -10
  24. package/dist/esm/components/TextInput/styles.d.ts +3 -3
  25. package/dist/esm/components/Typography/Text/styles.d.ts +1 -1
  26. package/dist/esm/components/Typography/Title/styles.d.ts +1 -1
  27. package/dist/esm/components/UncontrolledTable/components/header/styles.d.ts +8 -8
  28. package/dist/esm/components/UncontrolledTable/components/pagination/styles.d.ts +1 -1
  29. package/dist/esm/components/UncontrolledTable/components/tbody/styles.d.ts +1 -1
  30. package/dist/esm/components/UncontrolledTable/styles.d.ts +10 -10
  31. package/dist/esm/components/UncontrolledTabs/UncontrolledTabs.style.d.ts +1 -1
  32. package/dist/esm/interfaces/ProgressBar.d.ts +5 -1
  33. package/docs/index.md +118 -118
  34. package/package.json +136 -136
  35. package/src/components/Accordion.tsx +39 -39
  36. package/src/components/Avatar.tsx +17 -17
  37. package/src/components/Badge.tsx +14 -14
  38. package/src/components/Box/index.tsx +12 -12
  39. package/src/components/Box/interfaces.ts +3 -3
  40. package/src/components/Box/styles.tsx +22 -22
  41. package/src/components/Breadcrumb/index.tsx +27 -27
  42. package/src/components/Breadcrumb/interface.ts +8 -8
  43. package/src/components/Breadcrumb/styles.tsx +32 -32
  44. package/src/components/Button.tsx +26 -26
  45. package/src/components/Card.tsx +37 -37
  46. package/src/components/ChatMessage.tsx +87 -87
  47. package/src/components/ChatMessageBalloon/ChatMessageBalloon.style.ts +56 -56
  48. package/src/components/ChatMessageBalloon/ChatMessageBalloon.tsx +55 -55
  49. package/src/components/CheckBox.tsx +21 -21
  50. package/src/components/DateInput/index.tsx +34 -34
  51. package/src/components/DateInput/interface.ts +13 -13
  52. package/src/components/DateInput/styles.tsx +27 -27
  53. package/src/components/DatePicker.tsx +67 -67
  54. package/src/components/DropDown.tsx +24 -24
  55. package/src/components/IconButton.tsx +37 -37
  56. package/src/components/Icons.tsx +82 -82
  57. package/src/components/Modal.tsx +113 -113
  58. package/src/components/MultiSelectInput/components/MultiValue/index.tsx +44 -44
  59. package/src/components/MultiSelectInput/components/Option/index.tsx +62 -62
  60. package/src/components/MultiSelectInput/components/Option/styles.tsx +8 -8
  61. package/src/components/MultiSelectInput/index.tsx +60 -60
  62. package/src/components/MultiSelectInput/interfaces.ts +15 -15
  63. package/src/components/MultiSelectInput/styles.tsx +43 -43
  64. package/src/components/Paper.tsx +12 -12
  65. package/src/components/ProgressBar.tsx +63 -50
  66. package/src/components/RadioGroup.tsx +43 -43
  67. package/src/components/RangerSlider.tsx +65 -65
  68. package/src/components/Select.tsx +74 -74
  69. package/src/components/SelectInput/components/Option/index.tsx +61 -61
  70. package/src/components/SelectInput/components/Option/styles.tsx +8 -8
  71. package/src/components/SelectInput/index.tsx +45 -45
  72. package/src/components/SelectInput/interfaces.ts +15 -15
  73. package/src/components/SelectInput/styles.tsx +31 -31
  74. package/src/components/Svgs.tsx +506 -506
  75. package/src/components/Table/components/header/index.tsx +86 -86
  76. package/src/components/Table/components/header/styles.tsx +59 -59
  77. package/src/components/Table/components/index.tsx +8 -8
  78. package/src/components/Table/components/pagination/index.tsx +39 -39
  79. package/src/components/Table/components/pagination/styles.tsx +28 -28
  80. package/src/components/Table/components/tbody/index.tsx +30 -30
  81. package/src/components/Table/components/tbody/styles.tsx +4 -4
  82. package/src/components/Table/index.tsx +317 -317
  83. package/src/components/Table/interface.ts +23 -23
  84. package/src/components/Table/styles.tsx +117 -117
  85. package/src/components/Tabs.tsx +105 -105
  86. package/src/components/Tag.tsx +33 -33
  87. package/src/components/TextField.tsx +19 -19
  88. package/src/components/TextInput/index.tsx +37 -37
  89. package/src/components/TextInput/interface.ts +9 -9
  90. package/src/components/TextInput/styles.tsx +23 -23
  91. package/src/components/TimeLine.tsx +89 -89
  92. package/src/components/TimePicker.tsx +78 -78
  93. package/src/components/Typography/Text/index.tsx +20 -20
  94. package/src/components/Typography/Text/interfaces.ts +5 -5
  95. package/src/components/Typography/Text/styles.tsx +40 -40
  96. package/src/components/Typography/Title/index.tsx +22 -22
  97. package/src/components/Typography/Title/interfaces.ts +6 -6
  98. package/src/components/Typography/Title/styles.tsx +40 -40
  99. package/src/components/Typography/index.tsx +6 -6
  100. package/src/components/UncontrolledTable/components/header/index.tsx +63 -63
  101. package/src/components/UncontrolledTable/components/header/styles.tsx +59 -59
  102. package/src/components/UncontrolledTable/components/index.tsx +8 -8
  103. package/src/components/UncontrolledTable/components/pagination/index.tsx +43 -43
  104. package/src/components/UncontrolledTable/components/pagination/styles.tsx +28 -28
  105. package/src/components/UncontrolledTable/components/tbody/index.tsx +30 -30
  106. package/src/components/UncontrolledTable/components/tbody/styles.tsx +4 -4
  107. package/src/components/UncontrolledTable/index.tsx +226 -226
  108. package/src/components/UncontrolledTable/interface.ts +42 -42
  109. package/src/components/UncontrolledTable/styles.tsx +120 -120
  110. package/src/components/UncontrolledTabs/UncontrolledTabs.style.tsx +51 -51
  111. package/src/components/UncontrolledTabs/UncontrolledTabs.tsx +68 -68
  112. package/src/components/index.ts +24 -24
  113. package/src/helpers/alignments.ts +14 -14
  114. package/src/helpers/borders.ts +18 -18
  115. package/src/helpers/colors.ts +206 -206
  116. package/src/helpers/index.ts +5 -5
  117. package/src/helpers/radios.ts +24 -24
  118. package/src/helpers/sizes.ts +72 -72
  119. package/src/index.ts +66 -66
  120. package/src/interfaces/Accordion.ts +12 -12
  121. package/src/interfaces/Avatar.tsx +15 -15
  122. package/src/interfaces/Badge.ts +19 -19
  123. package/src/interfaces/Button.ts +22 -22
  124. package/src/interfaces/Card.ts +11 -11
  125. package/src/interfaces/ChatMessage.ts +12 -12
  126. package/src/interfaces/ChatMessageBalloon.ts +17 -17
  127. package/src/interfaces/CheckBox.ts +27 -27
  128. package/src/interfaces/DatePicker.ts +13 -13
  129. package/src/interfaces/DropDown.ts +14 -14
  130. package/src/interfaces/IconButton.ts +22 -22
  131. package/src/interfaces/Icons.ts +17 -17
  132. package/src/interfaces/Modal.ts +16 -16
  133. package/src/interfaces/Paper.ts +12 -12
  134. package/src/interfaces/ProgressBar.ts +25 -19
  135. package/src/interfaces/RadioGroup.ts +23 -23
  136. package/src/interfaces/RangerSlider.ts +21 -21
  137. package/src/interfaces/Select.ts +17 -17
  138. package/src/interfaces/Tabs.ts +19 -19
  139. package/src/interfaces/Tag.ts +17 -17
  140. package/src/interfaces/TextField.ts +44 -44
  141. package/src/interfaces/TimeLine.ts +11 -11
  142. package/src/interfaces/TimePicker.ts +13 -13
  143. package/src/interfaces/index.ts +23 -23
  144. package/src/providers/NormaProvider.tsx +13 -13
  145. package/src/sample-data-2.json +178 -178
  146. package/src/sample-data.json +177 -177
  147. package/src/stories/Accordion.stories.tsx +65 -65
  148. package/src/stories/Avatar.stories.tsx +123 -123
  149. package/src/stories/Badge.stories.tsx +39 -39
  150. package/src/stories/Box.stories.tsx +35 -35
  151. package/src/stories/Breadcrumb.stories.tsx +44 -44
  152. package/src/stories/Button.stories.tsx +93 -93
  153. package/src/stories/Card.stories.tsx +39 -39
  154. package/src/stories/ChatMessage.stories.tsx +84 -84
  155. package/src/stories/ChatMessageBalloon.stories.tsx +108 -108
  156. package/src/stories/CheckBox.stories.tsx +88 -88
  157. package/src/stories/DateInput.stories.tsx +51 -51
  158. package/src/stories/DatePicker.stories.tsx +50 -50
  159. package/src/stories/DropDown.stories.tsx +57 -57
  160. package/src/stories/IconButton.stories.tsx +78 -78
  161. package/src/stories/Modal.stories.tsx +195 -195
  162. package/src/stories/MultiSelectInput.stories.tsx +90 -90
  163. package/src/stories/Paper.stories.tsx +53 -53
  164. package/src/stories/ProgressBar.stories.tsx +113 -95
  165. package/src/stories/RadioGroup.stories.tsx +87 -87
  166. package/src/stories/RangerSlider.stories.tsx +58 -58
  167. package/src/stories/Select.stories.tsx +100 -100
  168. package/src/stories/SelectInput.stories.tsx +78 -78
  169. package/src/stories/Table.stories.tsx +372 -372
  170. package/src/stories/Tabs.stories.tsx +61 -61
  171. package/src/stories/Tag.stories.tsx +56 -56
  172. package/src/stories/Text.stories.tsx +37 -37
  173. package/src/stories/TextField.stories.tsx +310 -310
  174. package/src/stories/TextInput.stories.tsx +52 -52
  175. package/src/stories/TimeLine.stories.tsx +35 -35
  176. package/src/stories/TimePicker.stories.tsx +87 -87
  177. package/src/stories/Title.stories.tsx +43 -43
  178. package/src/stories/UncontrolledTable.stories.tsx +337 -337
  179. package/src/stories/UncontrolledTabs.stories.tsx +63 -63
  180. package/src/styles/globals.scss +17 -17
  181. package/src/types/index.ts +204 -204
  182. 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