@ssplib/react-components 0.0.224 → 0.0.226

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.
@@ -5,18 +5,24 @@ interface ColumnData {
5
5
  customComponent?: (content: string, obj: any) => JSX.Element;
6
6
  size?: number;
7
7
  }
8
- type FilterTypes = 'a-z' | 'z-a' | 'items' | 'date-interval' | 'data-a-z' | 'data-z-a' | 'select';
9
- export declare function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg, dataPath, tableName, csv, columnSize, action, useKC, statusKeyName, csvExcludeKeys, csvExcludeKeysCSV, csvExcludeKeysAll, csvCustomKeyNames, csvExcludeValidate, csvButtonTitle, csvNoZipText, csvAllButtonTitle, removeQuotes, normalize, csvShowAllButton, csvWithoutZip, itemCount, csvUpper, csvZipFileNamesKey, generateCsvZip, filters, hideTitleCSV, csvExcludeUpper, filterSeparator, filterStorageName, multipleDataPath, expandTextMaxLength, collapsedSize, customMargin, customMarginMobile, }: {
8
+ interface OrderBy {
9
+ label: string;
10
+ key: string;
11
+ type: 'string' | 'number';
12
+ }
13
+ export declare function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg, dataPath, tableName, csv, columnSize, action, useKC, statusKeyName, csvExcludeKeys, csvExcludeKeysCSV, csvExcludeKeysAll, csvCustomKeyNames, csvExcludeValidate, csvButtonTitle, csvNoZipText, csvAllButtonTitle, removeQuotes, normalize, csvShowAllButton, csvWithoutZip, itemCount, csvUpper, csvZipFileNamesKey, generateCsvZip, hideTitleCSV, csvExcludeUpper, multipleDataPath, expandTextMaxLength, collapsedSize, customMargin, customMarginMobile, filters, orderBy, id, }: {
14
+ id: string;
10
15
  mediaQueryLG?: {
11
16
  all: number;
12
17
  action: number;
13
18
  };
19
+ filters?: FilterValue[];
20
+ orderBy?: OrderBy[];
14
21
  customMargin?: number;
15
22
  customMarginMobile?: number;
16
23
  normalize?: boolean;
17
24
  csvUpper?: boolean;
18
25
  multipleDataPath?: string;
19
- filterStorageName?: string;
20
26
  removeQuotes?: boolean;
21
27
  columns: ColumnData[];
22
28
  tableName: string;
@@ -52,22 +58,21 @@ export declare function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg, data
52
58
  };
53
59
  dataPath?: string;
54
60
  useKC?: boolean;
55
- filters?: {
56
- [key: string]: {
57
- type: FilterTypes;
58
- keyName: string;
59
- name: string;
60
- listEndpoint?: string;
61
- selectList?: string[];
62
- referenceKey?: string;
63
- options?: {
64
- name: string;
65
- color: string;
66
- key: string;
67
- }[];
68
- }[];
69
- };
70
- filterSeparator?: string;
71
61
  }): JSX.Element;
62
+ type FilterType = 'string' | 'number' | 'date';
63
+ type FilterOperators = 'igual' | 'contem' | 'maior que' | 'menor que' | 'data exata' | 'após' | 'antes de' | 'entre' | 'tem um dos';
64
+ interface FilterValue {
65
+ label: string;
66
+ keyName: string;
67
+ type: FilterType;
68
+ operator: FilterOperators;
69
+ operators: FilterOperators[];
70
+ value: string | any[];
71
+ value2?: string | any[];
72
+ useList?: {
73
+ id: string;
74
+ label: string;
75
+ }[];
76
+ }
72
77
  declare const _default: React.MemoExoticComponent<typeof Table>;
73
78
  export default _default;
@@ -27,23 +27,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.Table = void 0;
30
+ const icons_material_1 = require("@mui/icons-material");
31
+ const Clear_1 = __importDefault(require("@mui/icons-material/Clear"));
30
32
  const FileDownload_1 = __importDefault(require("@mui/icons-material/FileDownload"));
33
+ const NavigateNextRounded_1 = __importDefault(require("@mui/icons-material/NavigateNextRounded"));
31
34
  const Search_1 = __importDefault(require("@mui/icons-material/Search"));
32
35
  const material_1 = require("@mui/material");
33
36
  const Grid_1 = __importDefault(require("@mui/material/Grid"));
34
37
  const Pagination_1 = __importDefault(require("@mui/material/Pagination"));
35
38
  const TextField_1 = __importDefault(require("@mui/material/TextField"));
36
39
  const Typography_1 = __importDefault(require("@mui/material/Typography"));
40
+ const x_date_pickers_1 = require("@mui/x-date-pickers");
41
+ const AdapterDayjs_1 = require("@mui/x-date-pickers/AdapterDayjs");
42
+ const dayjs_1 = __importDefault(require("dayjs"));
43
+ const jszip_1 = __importDefault(require("jszip"));
37
44
  const lodash_get_1 = __importDefault(require("lodash.get"));
38
45
  const react_1 = __importStar(require("react"));
39
46
  const auth_1 = require("../../../context/auth");
40
- const icons_material_1 = require("@mui/icons-material");
41
- const FormProvider_1 = __importDefault(require("../../providers/FormProvider"));
42
- const DatePicker_1 = __importDefault(require("../date/DatePicker"));
43
- const dayjs_1 = __importDefault(require("dayjs"));
44
- const jszip_1 = __importDefault(require("jszip"));
45
- const NavigateNextRounded_1 = __importDefault(require("@mui/icons-material/NavigateNextRounded"));
46
- const axios_1 = __importDefault(require("axios"));
47
+ const Modal_1 = require("../../modal/Modal");
48
+ const CustomMenu_1 = __importDefault(require("../../utils//CustomMenu"));
47
49
  function removePunctuationAndAccents(text) {
48
50
  // Remove accents and diacritics
49
51
  const normalizedText = text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
@@ -53,31 +55,37 @@ function removePunctuationAndAccents(text) {
53
55
  }
54
56
  let startData = [];
55
57
  let isExpandAll = false;
58
+ let localTableName = '';
59
+ let orderAsc = false;
56
60
  function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
57
61
  user: 'Nenhum dado encontrado',
58
62
  public: 'Nenhum dado encontrado',
59
- }, dataPath = '', tableName = 'Dados', csv, columnSize, action, useKC = true, statusKeyName = '', csvExcludeKeys = [], csvExcludeKeysCSV = [], csvExcludeKeysAll = [], csvCustomKeyNames = {}, csvExcludeValidate = (key, value) => false, csvButtonTitle = 'Salvar .CSV', csvNoZipText = 'Salvar .CSV', csvAllButtonTitle = 'Salvar todos em CSV', removeQuotes = false, normalize = false, csvShowAllButton = false, csvWithoutZip = false, itemCount = 10, csvUpper = false, csvZipFileNamesKey = '', generateCsvZip = false, filters = {}, hideTitleCSV = false, csvExcludeUpper = [], filterSeparator = '|', filterStorageName = 'tableFilters', multipleDataPath = '', expandTextMaxLength = 50, collapsedSize = 53, customMargin = 4, customMarginMobile = 0, }) {
63
+ }, dataPath = '', tableName = 'Dados', csv, columnSize, action, useKC = true, statusKeyName = '', csvExcludeKeys = [], csvExcludeKeysCSV = [], csvExcludeKeysAll = [], csvCustomKeyNames = {}, csvExcludeValidate = (key, value) => false, csvButtonTitle = 'Salvar .CSV', csvNoZipText = 'Salvar .CSV', csvAllButtonTitle = 'Salvar todos em CSV', removeQuotes = false, normalize = false, csvShowAllButton = false, csvWithoutZip = false, itemCount = 10, csvUpper = false, csvZipFileNamesKey = '', generateCsvZip = false,
64
+ // filters = {},
65
+ // filterSeparator = '|',
66
+ hideTitleCSV = false, csvExcludeUpper = [], multipleDataPath = '', expandTextMaxLength = 50, collapsedSize = 53, customMargin = 4, customMarginMobile = 0, filters = [], orderBy = [], id, }) {
67
+ var _a;
60
68
  const [isLoading, setIsLoading] = (0, react_1.useState)(true);
61
69
  const [error, setError] = (0, react_1.useState)(null);
62
70
  const [data, setData] = (0, react_1.useState)(null);
63
71
  const { user, userLoaded } = (0, react_1.useContext)(auth_1.AuthContext);
64
72
  const [list, setList] = (0, react_1.useState)([]);
73
+ const [listClone, setListClone] = (0, react_1.useState)([]);
65
74
  //numero de items pra ser mostrado
66
75
  const [itemsCount, setItemsCount] = (0, react_1.useState)(itemCount);
67
76
  const [currentPage, setCurrentPage] = (0, react_1.useState)(0);
68
77
  const [paginationCount, setPagCount] = (0, react_1.useState)(1);
69
78
  const [listPage, setListPage] = (0, react_1.useState)(1);
70
- const [appliedFilters, setAppliedFilters] = (0, react_1.useState)([]);
71
79
  const [oldSelectState, setOldSelectState] = (0, react_1.useState)('');
72
80
  const [expandObj, setExpandObj] = (0, react_1.useState)({});
73
81
  const [showExpandObj, setShowExpandObj] = (0, react_1.useState)({});
74
82
  const [showExpandObjOnExited, setShowExpandObjOnExited] = (0, react_1.useState)({});
75
- // filters states
76
- const [filterCollapse, setFilterCollapse] = (0, react_1.useState)(Array(Object.keys(filters).length).fill(false));
77
- const [filterOpen, setFilterOpen] = (0, react_1.useState)(false);
83
+ const [filterKey, setFilterKey] = (0, react_1.useState)('filterKey');
78
84
  const theme = (0, material_1.useTheme)();
79
85
  const isSmall = (0, material_1.useMediaQuery)(theme.breakpoints.only('xs'));
86
+ const filterContainer = (0, react_1.useRef)(null);
80
87
  const lg = (0, material_1.useMediaQuery)(theme.breakpoints.up(2000));
88
+ localTableName = `tableFilter_${id}`;
81
89
  (0, react_1.useEffect)(() => {
82
90
  setError(null);
83
91
  if (userLoaded || !useKC) {
@@ -109,11 +117,6 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
109
117
  else {
110
118
  setData(value);
111
119
  startData = JSON.parse(JSON.stringify(value));
112
- const oldFilters = localStorage.getItem(filterStorageName);
113
- if (oldFilters) {
114
- const filters = JSON.parse(oldFilters);
115
- setAppliedFilters(filters);
116
- }
117
120
  }
118
121
  }
119
122
  setIsLoading(false);
@@ -142,8 +145,13 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
142
145
  (0, react_1.useEffect)(() => {
143
146
  if (isLoading || error || !getData(data))
144
147
  return;
145
- setList(getData(data));
146
- setPagCount(getCount(getData(data)));
148
+ const value = getData(data);
149
+ setList(value);
150
+ setListClone(value);
151
+ setPagCount(getCount(value));
152
+ if (localStorage.getItem(localTableName)) {
153
+ filtrar(JSON.parse(localStorage.getItem(localTableName)));
154
+ }
147
155
  }, [itemsCount, isLoading, data, getCount, error]);
148
156
  (0, react_1.useEffect)(() => {
149
157
  setCurrentPage(listPage - 1);
@@ -151,14 +159,15 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
151
159
  const onPaginationChange = (0, react_1.useCallback)((e, page) => {
152
160
  setListPage(page);
153
161
  }, []);
154
- const onInputChange = (0, react_1.useCallback)((e) => {
162
+ function onInputChange(e) {
163
+ console.log(listClone);
155
164
  const searchValue = e.target.value;
156
165
  if (searchValue === '') {
157
- setList(getData(data));
158
- setPagCount(getCount(getData(data)));
166
+ setList(listClone);
167
+ setPagCount(getCount(getData(list)));
159
168
  return;
160
169
  }
161
- const listData = getData(data);
170
+ const listData = getData(list);
162
171
  const newList = [];
163
172
  listData.forEach((x) => {
164
173
  const dataStr = [];
@@ -227,7 +236,7 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
227
236
  setPagCount(getCount(newList));
228
237
  setCurrentPage(0);
229
238
  setListPage(1);
230
- }, [getCount, data]);
239
+ }
231
240
  const getMaxItems = (0, react_1.useCallback)(() => {
232
241
  const start = currentPage * itemsCount;
233
242
  return list.slice(start, start + itemsCount);
@@ -427,284 +436,148 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
427
436
  link.setAttribute('download', `${csv === null || csv === void 0 ? void 0 : csv.fileName}.csv`);
428
437
  link.click();
429
438
  }, [list]);
430
- (0, react_1.useEffect)(() => {
431
- filterBasedOnList(appliedFilters);
432
- }, [appliedFilters]);
433
- const filterBasedOnList = (filteredList) => {
434
- var _a;
435
- let rawList = JSON.parse(JSON.stringify(Array.isArray(startData) ? startData : (_a = (0, lodash_get_1.default)(startData, dataPath)) !== null && _a !== void 0 ? _a : '[]'));
436
- if (filteredList.length <= 0 || rawList.length <= 0) {
437
- setList(rawList);
438
- setPagCount(getCount(rawList));
439
- setCurrentPage(0);
440
- setListPage(1);
441
- return;
439
+ function expandAll() {
440
+ let obj = {};
441
+ for (let i = 0; i < itemCount; i++) {
442
+ obj[i] = !isExpandAll;
442
443
  }
443
- let canContinue = true;
444
- // verificando todas as chaves existem, se a chave não existir, não pode continuar e nao faz nada
445
- filteredList
446
- .map((x) => x.keyName)
447
- .forEach((x) => {
448
- if (!canContinue)
449
- return;
450
- if (!Object.keys(rawList[0]).includes(x)) {
451
- canContinue = false;
452
- return;
453
- }
454
- });
455
- if (!canContinue) {
456
- setAppliedFilters([]);
457
- localStorage.setItem(filterStorageName, JSON.stringify([]));
458
- setList(rawList);
459
- setPagCount(getCount(rawList));
460
- setCurrentPage(0);
461
- setListPage(1);
444
+ setShowExpandObjOnExited(obj);
445
+ setExpandObj(obj);
446
+ isExpandAll = !isExpandAll;
447
+ }
448
+ function reset() {
449
+ setList(startData);
450
+ setListClone(startData);
451
+ setPagCount(getCount(startData));
452
+ setCurrentPage(0);
453
+ setListPage(1);
454
+ localStorage.removeItem(localTableName);
455
+ setFilterKey(new Date().getTime().toString());
456
+ }
457
+ function filtrar(filterData) {
458
+ if (!startData)
462
459
  return;
463
- }
464
- function category(type, keyName, uniqueName, customValue, referencekey) {
465
- if (type === 'a-z') {
466
- rawList = rawList.sort((a, b) => {
467
- const aValue = a[keyName];
468
- const bValue = b[keyName];
469
- let valueA = aValue;
470
- let valueB = bValue;
471
- if (typeof aValue === 'string' || typeof bValue === 'string') {
472
- valueA = String(aValue).toLowerCase();
473
- valueB = String(bValue).toLowerCase();
474
- }
475
- console.table({
476
- values: valueA + ' < ' + valueB,
477
- result: valueA < valueB,
478
- });
479
- if (valueA < valueB) {
480
- return -1;
481
- }
482
- if (valueA > valueB) {
483
- return 1;
484
- }
485
- return 0;
486
- });
487
- } //
488
- else if (type === 'z-a') {
489
- rawList = rawList.sort((a, b) => {
490
- const aValue = a[keyName];
491
- const bValue = b[keyName];
492
- let valueA = aValue;
493
- let valueB = bValue;
494
- if (typeof aValue === 'string' || typeof bValue === 'string') {
495
- valueA = String(aValue).toLowerCase();
496
- valueB = String(bValue).toLowerCase();
497
- }
498
- if (valueA < valueB) {
499
- return 1;
500
- }
501
- if (valueA > valueB) {
502
- return -1;
503
- }
504
- return 0;
505
- });
506
- } //
507
- else if (type === 'items' || type === 'select') {
508
- rawList = rawList
509
- .filter((x) => String(x[keyName])
510
- .toLowerCase()
511
- .includes(customValue !== null && customValue !== void 0 ? customValue : ''))
512
- .sort((a, b) => {
513
- const aValue = String(a[keyName]);
514
- const bValue = String(b[keyName]);
515
- const valueA = typeof aValue === 'number' ? aValue : aValue.toLowerCase();
516
- const valueB = typeof bValue === 'number' ? bValue : bValue.toLowerCase();
517
- if (valueA.includes(customValue !== null && customValue !== void 0 ? customValue : ''))
518
- return -1;
519
- if (valueB.includes(customValue !== null && customValue !== void 0 ? customValue : ''))
520
- return 1;
521
- if (valueA < valueB) {
522
- return -1;
523
- }
524
- if (valueA > valueB) {
525
- return 1;
526
- }
527
- return 0;
528
- });
529
- if (referencekey) {
530
- const data = [];
531
- let newFiltered = rawList.filter((x) => {
532
- const item = String(x[keyName]);
533
- const value = typeof item === 'number' ? item : item.toLowerCase();
534
- if (value === customValue) {
535
- data.push(x);
536
- return false;
537
- }
538
- return true;
539
- });
540
- data.sort((a, b) => {
541
- const aValue = String(a[referencekey]);
542
- const bValue = String(b[referencekey]);
543
- const valueA = typeof aValue === 'number' ? aValue : aValue.toLowerCase();
544
- const valueB = typeof bValue === 'number' ? bValue : bValue.toLowerCase();
545
- if (valueA < valueB) {
546
- return 1;
547
- }
548
- if (valueA > valueB) {
549
- return -1;
550
- }
551
- return 0;
552
- });
553
- data.forEach((x) => {
554
- newFiltered.unshift(x);
555
- });
556
- rawList = newFiltered;
557
- }
558
- } //
559
- else if (type === 'data-a-z') {
560
- rawList = rawList.sort((a, b) => {
561
- const aValue = a[keyName];
562
- const bValue = b[keyName];
563
- const separator = filterSeparator;
564
- const aDt = aValue.split(separator).map((k) => { var _a; return ((_a = k.match(/[0-9]+\/[0-9]+\/[0-9]+/)) !== null && _a !== void 0 ? _a : [])[0]; })[0];
565
- const bDt = bValue.split(separator).map((k) => { var _a; return ((_a = k.match(/[0-9]+\/[0-9]+\/[0-9]+/)) !== null && _a !== void 0 ? _a : [])[0]; })[0];
566
- if (!aDt && !bDt)
567
- return 0;
568
- const valueA = (0, dayjs_1.default)(aDt, 'D/M/YYYY');
569
- const valueB = (0, dayjs_1.default)(bDt, 'D/M/YYYY');
570
- if (valueA.isBefore(valueB)) {
571
- return -1;
572
- }
573
- if (valueA.isAfter(valueB)) {
574
- return 1;
460
+ let currentData = JSON.parse(JSON.stringify(startData));
461
+ filterData
462
+ .filter((dt) => dt.value)
463
+ .forEach((dt) => {
464
+ let filteredData = [];
465
+ switch (dt.type) {
466
+ case 'number':
467
+ switch (dt.operator) {
468
+ case 'igual':
469
+ currentData.forEach((cd) => {
470
+ const value = Number((0, lodash_get_1.default)(cd, dt.keyName, ''));
471
+ if (value === Number(dt.value)) {
472
+ filteredData.push(cd);
473
+ }
474
+ });
475
+ break;
476
+ case 'maior que':
477
+ currentData.forEach((cd) => {
478
+ const value = Number((0, lodash_get_1.default)(cd, dt.keyName, ''));
479
+ if (value > Number(dt.value)) {
480
+ filteredData.push(cd);
481
+ }
482
+ });
483
+ break;
484
+ case 'menor que':
485
+ currentData.forEach((cd) => {
486
+ const value = Number((0, lodash_get_1.default)(cd, dt.keyName, ''));
487
+ if (value < Number(dt.value)) {
488
+ filteredData.push(cd);
489
+ }
490
+ });
491
+ break;
575
492
  }
576
- return 0;
577
- });
578
- } //
579
- else if (type === 'data-z-a') {
580
- rawList = rawList.sort((a, b) => {
581
- const aValue = a[keyName], bValue = b[keyName], separator = filterSeparator, aDt = aValue.split(separator).map((k) => { var _a; return ((_a = k.match(/[0-9]+\/[0-9]+\/[0-9]+/)) !== null && _a !== void 0 ? _a : [])[0]; })[0], bDt = bValue.split(separator).map((k) => { var _a; return ((_a = k.match(/[0-9]+\/[0-9]+\/[0-9]+/)) !== null && _a !== void 0 ? _a : [])[0]; })[0];
582
- if (!aDt && !bDt)
583
- return 0;
584
- const valueA = (0, dayjs_1.default)(aDt, 'D/M/YYYY');
585
- const valueB = (0, dayjs_1.default)(bDt, 'D/M/YYYY');
586
- if (valueA.isBefore(valueB)) {
587
- return 1;
493
+ break;
494
+ case 'string':
495
+ switch (dt.operator) {
496
+ case 'igual':
497
+ currentData.forEach((cd) => {
498
+ const value = (0, lodash_get_1.default)(cd, dt.keyName, '');
499
+ if (value === dt.value) {
500
+ filteredData.push(cd);
501
+ }
502
+ });
503
+ break;
504
+ case 'contem':
505
+ currentData.forEach((cd) => {
506
+ const value = (0, lodash_get_1.default)(cd, dt.keyName, '');
507
+ if (value.includes(dt.value)) {
508
+ filteredData.push(cd);
509
+ }
510
+ });
511
+ break;
512
+ case 'tem um dos':
513
+ currentData.forEach((cd) => {
514
+ const value = (0, lodash_get_1.default)(cd, dt.keyName, '');
515
+ if (dt.value.map((x) => x.id).includes(value)) {
516
+ filteredData.push(cd);
517
+ }
518
+ });
519
+ break;
588
520
  }
589
- if (valueA.isAfter(valueB)) {
590
- return -1;
521
+ break;
522
+ case 'date':
523
+ switch (dt.operator) {
524
+ case 'data exata':
525
+ currentData.forEach((cd) => {
526
+ const value = (0, dayjs_1.default)((0, lodash_get_1.default)(cd, dt.keyName, ''), 'DD/MM/YYYY');
527
+ if (!value.isValid())
528
+ return;
529
+ if (value.isSame((0, dayjs_1.default)(dt.value, 'DD/MM/YYYY'))) {
530
+ filteredData.push(cd);
531
+ }
532
+ });
533
+ break;
534
+ case 'entre':
535
+ currentData.forEach((cd) => {
536
+ const value = (0, dayjs_1.default)((0, lodash_get_1.default)(cd, dt.keyName, ''), 'DD/MM/YYYY');
537
+ const dateA = (0, dayjs_1.default)(dt.value, 'DD/MM/YYYY');
538
+ const dateB = (0, dayjs_1.default)(dt.value2, 'DD/MM/YYYY');
539
+ console.log(dateA.isValid(), dateB.isValid());
540
+ if (!dateA.isValid() || !dateB.isValid())
541
+ return;
542
+ if ((value.isAfter(dateA) || value.isSame(dateA)) && (value.isBefore(dateB) || value.isSame(dateB))) {
543
+ filteredData.push(cd);
544
+ }
545
+ });
546
+ break;
591
547
  }
592
- return 0;
593
- });
548
+ break;
594
549
  }
595
- }
596
- function date(from, to, keyName) {
597
- const separator = filterSeparator;
598
- rawList = rawList.filter((x) => {
599
- const dts = String(x[keyName])
600
- .split(separator)
601
- .map((k) => { var _a, _b; return (_b = ((_a = k.match(/[0-9]+\/[0-9]+\/[0-9]+/)) !== null && _a !== void 0 ? _a : [])[0]) !== null && _b !== void 0 ? _b : ''; });
602
- let inside = false;
603
- dts.forEach((k) => {
604
- if (inside)
605
- return;
606
- const dt = (0, dayjs_1.default)(k, 'D/M/YYYY');
607
- const dtFrom = (0, dayjs_1.default)(from, 'D/M/YYYY');
608
- if (to) {
609
- const dtTo = (0, dayjs_1.default)(to, 'D/M/YYYY');
610
- if ((dtFrom.isBefore(dt) || dtFrom.isSame(dt)) && (dtTo.isAfter(dt) || dtTo.isSame(dt))) {
611
- inside = true;
612
- }
613
- } //
614
- else {
615
- if (dtFrom.isBefore(dt) || dtFrom.isSame(dt)) {
616
- inside = true;
617
- }
618
- }
619
- });
620
- return inside;
621
- });
622
- rawList = rawList.sort((a, b) => {
623
- const aValue = a[keyName];
624
- const bValue = b[keyName];
625
- const separator = filterSeparator;
626
- const aDt = aValue.split(separator).map((k) => { var _a; return ((_a = k.match(/[0-9]+\/[0-9]+\/[0-9]+/)) !== null && _a !== void 0 ? _a : [])[0]; })[0];
627
- const bDt = bValue.split(separator).map((k) => { var _a; return ((_a = k.match(/[0-9]+\/[0-9]+\/[0-9]+/)) !== null && _a !== void 0 ? _a : [])[0]; })[0];
628
- if (!aDt && !bDt)
629
- return 0;
630
- const valueA = (0, dayjs_1.default)(aDt, 'D/M/YYYY');
631
- const valueB = (0, dayjs_1.default)(bDt, 'D/M/YYYY');
632
- if (valueA.isBefore(valueB)) {
633
- return -1;
634
- }
635
- if (valueA.isAfter(valueB)) {
636
- return 1;
637
- }
638
- return 0;
639
- });
640
- }
641
- appliedFilters.forEach((x) => {
642
- if (!x.isDate)
643
- category(x.type, x.keyName, x.uniqueName, x.customValue, x.referencekey);
644
- else
645
- date(x.from, x.to, x.keyName);
550
+ console.log('filtred: ', filteredData);
551
+ currentData = filteredData;
646
552
  });
647
- setList(rawList);
648
- setPagCount(getCount(rawList));
553
+ setList(currentData);
554
+ setPagCount(getCount(currentData));
649
555
  setCurrentPage(0);
650
556
  setListPage(1);
651
- };
652
- const handleFilterOption = (type, keyName, uniqueName, customValue, referencekey) => {
653
- setAppliedFilters((s) => {
654
- const value = [
655
- ...s.filter((x) => (x.isDate ? true : x.keyName !== keyName)),
656
- {
657
- type,
658
- keyName,
659
- uniqueName,
660
- customValue,
661
- referencekey,
662
- },
663
- ];
664
- localStorage.setItem(filterStorageName, JSON.stringify(value));
665
- return value;
666
- });
667
- };
668
- const handleFilterReset = () => {
669
- const value = JSON.parse(JSON.stringify(Array.isArray(startData) ? startData : (0, lodash_get_1.default)(startData, dataPath)));
670
- setList(value);
671
- setAppliedFilters([]);
672
- localStorage.setItem(filterStorageName, JSON.stringify([]));
673
- };
674
- const removeFilter = (uniqueName) => {
675
- if (uniqueName === 'isDate')
676
- setAppliedFilters((s) => s.filter((x) => !x.isDate));
677
- else
678
- setAppliedFilters((s) => {
679
- const value = s.filter((x) => x.uniqueName !== uniqueName);
680
- localStorage.setItem(filterStorageName, JSON.stringify(value));
681
- return value;
682
- });
683
- };
684
- const handleDateFilter = (from, to, keyName) => {
685
- setAppliedFilters((s) => {
686
- const value = [
687
- ...s.filter((x) => !x.isDate),
688
- {
689
- isDate: true,
690
- from,
691
- to,
692
- keyName,
693
- id: from + keyName,
694
- },
695
- ];
696
- localStorage.setItem(filterStorageName, JSON.stringify(value));
697
- return value;
557
+ localStorage.setItem(localTableName, JSON.stringify(filterData));
558
+ setListClone(currentData);
559
+ }
560
+ function ordenar(order) {
561
+ let oldList = [...list];
562
+ oldList.sort((a, b) => {
563
+ const aValue = order.type === 'string' ? (0, lodash_get_1.default)(a, order.key, '') : Number((0, lodash_get_1.default)(a, order.key, 0));
564
+ const bValue = order.type === 'string' ? (0, lodash_get_1.default)(b, order.key, '') : Number((0, lodash_get_1.default)(b, order.key, 0));
565
+ if (orderAsc) {
566
+ if (aValue < bValue)
567
+ return -1;
568
+ if (aValue > bValue)
569
+ return 1;
570
+ }
571
+ else {
572
+ if (aValue > bValue)
573
+ return -1;
574
+ if (aValue < bValue)
575
+ return 1;
576
+ }
577
+ return 0;
698
578
  });
699
- };
700
- function expandAll() {
701
- let obj = {};
702
- for (let i = 0; i < itemCount; i++) {
703
- obj[i] = !isExpandAll;
704
- }
705
- setShowExpandObjOnExited(obj);
706
- setExpandObj(obj);
707
- isExpandAll = !isExpandAll;
579
+ orderAsc = !orderAsc;
580
+ setList(oldList);
708
581
  }
709
582
  // effect usado quando for mostrar "VER MAIS" e "VER MENOS"
710
583
  (0, react_1.useEffect)(() => {
@@ -719,6 +592,9 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
719
592
  });
720
593
  setShowExpandObj(obj);
721
594
  }, [list, itemsCount, currentPage]);
595
+ (0, react_1.useEffect)(() => {
596
+ console.log(filterContainer.current);
597
+ }, [filterContainer.current]);
722
598
  if (error)
723
599
  return (react_1.default.createElement(material_1.Box, { bgcolor: '#E2E8F0', padding: 2, marginX: 2 },
724
600
  react_1.default.createElement(Typography_1.default, { fontSize: 24, textAlign: 'center', fontFamily: 'Inter' },
@@ -735,7 +611,7 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
735
611
  return (react_1.default.createElement(react_1.default.Fragment, null,
736
612
  react_1.default.createElement(material_1.Box, { marginX: isSmall ? customMarginMobile : customMargin, bgcolor: 'white', p: 2, borderRadius: 6 },
737
613
  react_1.default.createElement(material_1.Stack, { spacing: 1.5, direction: { xs: 'column', md: 'row' } },
738
- react_1.default.createElement(material_1.Stack, { spacing: 1.5, direction: { xs: 'column', md: 'row' }, marginBottom: 2, height: { md: '40px', xs: 'inherit' }, width: '100%' },
614
+ react_1.default.createElement(material_1.Stack, { spacing: 1.5, direction: { xs: 'column', md: 'row' }, height: { md: '40px', xs: 'inherit' }, width: '100%' },
739
615
  react_1.default.createElement(TextField_1.default, { InputProps: {
740
616
  startAdornment: react_1.default.createElement(Search_1.default, { sx: { marginRight: 1, fill: '#c0c0c0' } }),
741
617
  sx: {
@@ -747,37 +623,40 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
747
623
  borderRadius: '50px',
748
624
  maxWidth: '600px',
749
625
  }, size: 'small', onChange: onInputChange, fullWidth: true, placeholder: `Pesquisar ${tableName}` }),
750
- Object.keys(filters).length > 0 && (react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(icons_material_1.FilterAlt, null), variant: 'contained', onClick: (e) => setFilterOpen(true), sx: {
751
- borderRadius: '8px',
626
+ Modal_1.MODAL.reparent(react_1.default.createElement(CriarFiltro, { key: filterKey, reset: reset, filtrar: filtrar, baseFilters: [...filters], filters: localStorage.getItem(localTableName) ? JSON.parse(localStorage.getItem(localTableName)) : [...filters] }), 0),
627
+ react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(icons_material_1.FilterAlt, null), variant: 'contained', onClick: (e) => Modal_1.MODAL.openReparented(0), sx: {
628
+ borderRadius: 3,
752
629
  paddingX: '24px',
753
630
  paddingY: '8px',
754
- minWidth: 200,
755
631
  backgroundColor: '#208FE8',
756
632
  textTransform: 'capitalize',
757
633
  } },
758
- react_1.default.createElement(material_1.Stack, { direction: 'row', marginLeft: 2, borderRadius: 5, padding: 0 },
759
- react_1.default.createElement("span", null, "Filtro"),
760
- react_1.default.createElement("span", { style: {
761
- whiteSpace: 'nowrap',
762
- marginLeft: 8,
763
- backgroundColor: '#15528f',
764
- borderRadius: 8,
765
- padding: '0px 8px',
766
- } },
767
- appliedFilters.length,
768
- " aplicado",
769
- appliedFilters.length > 1 ? 's' : '')))),
770
- react_1.default.createElement(material_1.Button, { variant: 'contained', startIcon: isExpandAll ? react_1.default.createElement(icons_material_1.KeyboardArrowUp, null) : react_1.default.createElement(icons_material_1.KeyboardArrowDown, null), sx: {
771
- backgroundColor: '#637082',
772
- ':hover': {
773
- backgroundColor: '#3c4757',
774
- },
775
- textTransform: 'capitalize',
776
- borderRadius: '8px',
777
- padding: '0px 8px',
778
- }, onClick: expandAll }, isExpandAll ? 'Recolher Todos' : 'Expandir Todos')),
779
- react_1.default.createElement(material_1.Stack, { alignItems: 'end', width: { xs: '100%', md: '20%' }, pb: 2, direction: { xs: 'row', md: 'column' }, spacing: { xs: 1, md: 0 } },
780
- react_1.default.createElement(Typography_1.default, { fontWeight: 600, textAlign: 'end' }, "Demandas cadastradas"),
634
+ react_1.default.createElement(material_1.Stack, { direction: 'row', borderRadius: 5, padding: 0 },
635
+ react_1.default.createElement("span", null, "Filtrar"))),
636
+ react_1.default.createElement(material_1.Stack, { direction: 'row', spacing: 1 },
637
+ react_1.default.createElement(CustomMenu_1.default, { data: orderBy.map((x) => ({
638
+ name: x.label,
639
+ onClick: () => ordenar(x),
640
+ })), btProps: {
641
+ startIcon: react_1.default.createElement(icons_material_1.KeyboardArrowDown, null),
642
+ fullWidth: true,
643
+ } }, "Ordenar"),
644
+ react_1.default.createElement(material_1.Button, { variant: 'contained', fullWidth: true, startIcon: isExpandAll ? react_1.default.createElement(icons_material_1.KeyboardArrowUp, null) : react_1.default.createElement(icons_material_1.KeyboardArrowDown, null), sx: {
645
+ backgroundColor: '#637082',
646
+ ':hover': {
647
+ backgroundColor: '#3c4757',
648
+ },
649
+ textTransform: 'capitalize',
650
+ borderRadius: 3,
651
+ padding: {
652
+ md: '0px 8px',
653
+ },
654
+ }, onClick: expandAll }, isExpandAll ? 'Recolher' : 'Expandir'))),
655
+ react_1.default.createElement(material_1.Stack, { alignItems: 'end', width: { xs: '100%', md: '20%' }, direction: { xs: 'row', md: 'column' }, spacing: { xs: 1, md: 0 } },
656
+ react_1.default.createElement(Typography_1.default, { fontWeight: 600, textAlign: 'end' },
657
+ "Registro de ",
658
+ tableName,
659
+ "s"),
781
660
  react_1.default.createElement(material_1.Stack, { justifyContent: 'center' },
782
661
  react_1.default.createElement(Typography_1.default, null,
783
662
  "Exibindo ",
@@ -786,6 +665,28 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
786
665
  currentPage * itemsCount + 1 + getMaxItems().length - 1,
787
666
  " de ",
788
667
  list.length)))),
668
+ localStorage.getItem(localTableName) && (react_1.default.createElement(material_1.Box, { display: 'inline-flex', flexWrap: 'wrap', padding: 0.5, borderRadius: 4, marginBottom: 1 }, JSON.parse((_a = localStorage.getItem(localTableName)) !== null && _a !== void 0 ? _a : '[]')
669
+ .filter((x) => x.value)
670
+ .map((x) => (react_1.default.createElement(material_1.Stack, { direction: 'row', spacing: 1, bgcolor: '#4e85c1', color: 'white', width: 'fit-content', paddingY: 0.5, borderRadius: 2, paddingX: 1, m: 0.5 },
671
+ react_1.default.createElement(Typography_1.default, { fontWeight: 700 }, x.label),
672
+ react_1.default.createElement(Typography_1.default, { fontStyle: 'italic' }, x.operator),
673
+ react_1.default.createElement(Typography_1.default, { bgcolor: 'white', borderRadius: 2, paddingX: 1, color: 'black' }, x.operator === 'tem um dos' ? x.value.map((x) => x.id).join(' - ') : x.value.toString()),
674
+ react_1.default.createElement(material_1.IconButton, { onClick: (e) => {
675
+ var _a;
676
+ let currentValue = JSON.parse((_a = localStorage.getItem(localTableName)) !== null && _a !== void 0 ? _a : '[]');
677
+ currentValue = currentValue.map((item) => {
678
+ if (item.label === x.label) {
679
+ return Object.assign(Object.assign(Object.assign({}, item), { value: '' }), (item.value2 ? { value2: '' } : {}));
680
+ }
681
+ return item;
682
+ });
683
+ filtrar(currentValue);
684
+ }, size: 'small', sx: {
685
+ padding: 0,
686
+ } },
687
+ react_1.default.createElement(Clear_1.default, { sx: {
688
+ fill: 'white',
689
+ } }))))))),
789
690
  react_1.default.createElement(material_1.Stack, { spacing: 0.2 }, getMaxItems().length <= 0 ? (react_1.default.createElement(material_1.Stack, { sx: { backgroundColor: '#E2E8F0', padding: 2, marginX: { xs: 2, md: 0 } }, justifyContent: 'center', alignItems: 'center' },
790
691
  react_1.default.createElement(Typography_1.default, { fontSize: 21, fontFamily: 'Inter', fontWeight: 600, textAlign: 'center' }, user ? emptyMsg.user : emptyMsg.public))) : (getMaxItems().map((x, index) => (react_1.default.createElement(material_1.Paper, { key: index, sx: {
791
692
  padding: 0.5,
@@ -872,90 +773,177 @@ function Table({ mediaQueryLG, columns, fetchFunc, emptyMsg = {
872
773
  }
873
774
  return paginationCount;
874
775
  }), sx: { bgcolor: 'white', borderRadius: '50px', height: '40px', width: '40px', minWidth: 0, border: 'solid 1px #E2E8F0' } },
875
- react_1.default.createElement(NavigateNextRounded_1.default, { sx: { transform: 'scale(1.5)' } })))),
876
- react_1.default.createElement(material_1.SwipeableDrawer, { anchor: isSmall ? 'bottom' : 'right', open: filterOpen, onClose: (e) => setFilterOpen(false), onOpen: (e) => setFilterOpen(true) },
877
- react_1.default.createElement(material_1.List, { sx: { minWidth: 310 } }, Object.keys(filters).map((f, fIndex) => (react_1.default.createElement(react_1.default.Fragment, { key: JSON.stringify({ f, fIndex }) },
878
- react_1.default.createElement(material_1.ListItemButton, { onClick: (e) => setFilterCollapse((s) => s.map((x, idx) => {
879
- if (idx === fIndex)
880
- return !x;
881
- return x;
882
- })), sx: {
883
- backgroundColor: '#ebeef2',
884
- } },
885
- react_1.default.createElement(material_1.ListItemIcon, null,
886
- react_1.default.createElement(icons_material_1.Circle, { transform: 'scale(0.4)' })),
887
- react_1.default.createElement(material_1.ListItemText, { primary: f }),
888
- filterCollapse[fIndex] ? react_1.default.createElement(icons_material_1.ExpandLess, null) : react_1.default.createElement(icons_material_1.ExpandMore, null)),
889
- react_1.default.createElement(material_1.Collapse, { in: filterCollapse[fIndex], timeout: 'auto', unmountOnExit: true },
890
- react_1.default.createElement(material_1.List, { component: 'div', disablePadding: true, sx: { backgroundColor: 'white' } }, filters[f].map((x, index) => (react_1.default.createElement(react_1.default.Fragment, { key: JSON.stringify({ f, index }) }, x.options ? (x.options.map((o) => (react_1.default.createElement(material_1.ListItemButton, { sx: Object.assign({ pl: 4, borderBottom: 1, borderColor: '#ebeef2' }, (appliedFilters.map((x) => x.uniqueName).includes(`${f}:${JSON.stringify(o)}`) && {
891
- bgcolor: '#b7e4c7',
892
- ':hover': { bgcolor: '#b7e4c7' },
893
- })) },
894
- react_1.default.createElement(material_1.ListItemText, { primary: o.name, onClick: (e) => handleFilterOption(x.type, x.keyName, `${f}:${JSON.stringify(o)}`, o.key, x.referenceKey), sx: { color: o.color, fontWeight: 600 } }),
895
- react_1.default.createElement(material_1.Box, null, appliedFilters.map((x) => x.uniqueName).includes(`${f}:${JSON.stringify(o)}`) && (react_1.default.createElement(material_1.Tooltip, { title: 'Remover' },
896
- react_1.default.createElement(material_1.IconButton, { sx: { bgcolor: '#c71c1c', height: '30px', width: '30px', ':hover': { bgcolor: 'red', border: '2px solid #9e2929' } }, onClick: (e) => removeFilter(`${f}:${JSON.stringify(o)}`) },
897
- react_1.default.createElement(icons_material_1.Delete, { sx: { fill: 'white', transform: 'scale(0.8, 0.8)' } }))))))))) : x.type === 'date-interval' ? (react_1.default.createElement(material_1.Box, { padding: 2 },
898
- react_1.default.createElement(FormProvider_1.default, { onSubmit: (d) => handleDateFilter(d['filterDtStart'], d['filterDtEnd'], x.keyName) },
899
- react_1.default.createElement(DatePicker_1.default, { name: 'filterDtStart', title: 'A partir de:', required: true }),
900
- react_1.default.createElement(material_1.Box, { marginTop: 2 }),
901
- react_1.default.createElement(DatePicker_1.default, { name: 'filterDtEnd', title: 'At\u00E9 (opcional):' }),
902
- react_1.default.createElement(material_1.Stack, { marginTop: 2 },
903
- react_1.default.createElement(material_1.Button, { type: 'submit', variant: 'outlined', startIcon: react_1.default.createElement(icons_material_1.CalendarToday, null), sx: { width: '100%' } }, "Filtrar por Data"),
904
- react_1.default.createElement(material_1.Box, null, appliedFilters.filter((x) => x.isDate).length > 0 && (react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(icons_material_1.Delete, { sx: { fill: 'white' } }), variant: 'contained', color: 'error', sx: { width: '100%', marginTop: 1 }, onClick: (e) => removeFilter('isDate') }, "Remover Filtro Data"))))))) : x.selectList ? (react_1.default.createElement(react_1.default.Fragment, null,
905
- react_1.default.createElement(material_1.Autocomplete, { options: x.selectList.map((x) => ({
906
- id: x.toLowerCase(),
907
- label: x,
908
- })), onFocus: (e) => console.log('ata'), onChange: (e, value) => {
909
- if (value) {
910
- const id = `${f}:${JSON.stringify(value)}`;
911
- handleFilterOption(x.type, x.keyName, id, value === null || value === void 0 ? void 0 : value.label.toLowerCase(), x.referenceKey);
912
- setOldSelectState(id);
913
- }
914
- else {
915
- removeFilter(oldSelectState);
916
- }
917
- }, sx: {
918
- margin: 1,
919
- }, size: 'small', renderInput: (params) => react_1.default.createElement(TextField_1.default, Object.assign({}, params, { label: 'Teste' })) }))) : x.listEndpoint ? (react_1.default.createElement(react_1.default.Fragment, null,
920
- react_1.default.createElement(FetchSelectAutoComplete, { url: x.listEndpoint, label: x.name, onChange: (e, value) => {
921
- if (value) {
922
- const id = `${f}:${JSON.stringify(value)}`;
923
- handleFilterOption(x.type, x.keyName, id, value === null || value === void 0 ? void 0 : value.id.toLowerCase(), x.referenceKey);
924
- setOldSelectState(id);
925
- }
926
- else {
927
- removeFilter(oldSelectState);
928
- }
929
- } }))) : (react_1.default.createElement(material_1.Stack, { direction: 'row', sx: Object.assign({}, (appliedFilters.map((x) => x.uniqueName).includes(`${f}:${JSON.stringify(x)}`) && {
930
- bgcolor: '#b7e4c7',
931
- ':hover': { bgcolor: '#b7e4c7' },
932
- })) },
933
- react_1.default.createElement(material_1.ListItemButton, { sx: {
934
- pl: 4,
935
- borderBottom: 1,
936
- borderColor: '#ebeef2',
937
- }, onClick: (e) => handleFilterOption(x.type, x.keyName, `${f}:${JSON.stringify(x)}`) },
938
- react_1.default.createElement(material_1.ListItemIcon, { sx: { minWidth: '25px' } }, x.type === 'a-z' || x.type === 'data-a-z' ? (react_1.default.createElement(icons_material_1.South, { transform: 'scale(0.5)' })) : x.type === 'z-a' || x.type === 'data-z-a' ? (react_1.default.createElement(icons_material_1.North, { transform: 'scale(0.5)' })) : null),
939
- react_1.default.createElement(material_1.ListItemText, { primary: x.name })),
940
- react_1.default.createElement(material_1.Stack, { justifyContent: 'center', marginX: 2 }, appliedFilters.map((x) => x.uniqueName).includes(`${f}:${JSON.stringify(x)}`) && (react_1.default.createElement(material_1.Tooltip, { title: 'Remover' },
941
- react_1.default.createElement(material_1.IconButton, { sx: { bgcolor: '#c71c1c', height: '30px', width: '30px', ':hover': { bgcolor: 'red', border: '2px solid #9e2929' } }, onClick: (e) => removeFilter(`${f}:${JSON.stringify(x)}`) },
942
- react_1.default.createElement(icons_material_1.Delete, { sx: { fill: 'white', transform: 'scale(0.8, 0.8)' } })))))))))))))))),
943
- react_1.default.createElement(material_1.Button, { variant: 'contained', onClick: handleFilterReset, startIcon: react_1.default.createElement(icons_material_1.RestartAlt, null), sx: { marginX: 2, marginBottom: 2 } }, "Reiniciar"))));
776
+ react_1.default.createElement(NavigateNextRounded_1.default, { sx: { transform: 'scale(1.5)' } }))))));
944
777
  }
945
778
  exports.Table = Table;
946
- function FetchSelectAutoComplete(props) {
947
- const [data, setData] = (0, react_1.useState)([]);
779
+ function CriarFiltro({ filters, baseFilters, filtrar, reset }) {
780
+ const [data, setData] = (0, react_1.useState)(filters);
781
+ const [resetFields, setResetFields] = (0, react_1.useState)(false);
782
+ function addRule(filter) {
783
+ setData((dt) => {
784
+ return [...dt, filter];
785
+ });
786
+ }
787
+ const [anchorEl, setAnchorEl] = react_1.default.useState(null);
788
+ const open = Boolean(anchorEl);
789
+ const handleClick = (event) => {
790
+ setAnchorEl(event.currentTarget);
791
+ };
792
+ const handleClose = () => {
793
+ setAnchorEl(null);
794
+ };
795
+ return (react_1.default.createElement(material_1.Box, null,
796
+ react_1.default.createElement(material_1.Menu, { open: open, onClose: handleClose, anchorEl: anchorEl }, baseFilters.map((x) => (react_1.default.createElement(material_1.MenuItem, { onClick: (e) => {
797
+ addRule(x);
798
+ setAnchorEl(null);
799
+ } }, x.label)))),
800
+ react_1.default.createElement(material_1.Stack, { direction: 'row', justifyContent: 'space-between' },
801
+ react_1.default.createElement(Typography_1.default, { fontWeight: 700, fontSize: 18 }, "Filtrar"),
802
+ react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(icons_material_1.Refresh, null), sx: {
803
+ textTransform: 'capitalize',
804
+ }, onClick: (e) => {
805
+ reset();
806
+ Modal_1.MODAL.close();
807
+ } }, "Limpar")),
808
+ react_1.default.createElement(material_1.Box, { marginBottom: 1 },
809
+ react_1.default.createElement(material_1.Alert, { severity: 'warning' }, "Preencha apenas os campos que deseja filtrar.")),
810
+ react_1.default.createElement(material_1.Stack, null, resetFields ? (data.map((d, idx) => (react_1.default.createElement(FilterRow, { filterValue: d, setReset: setResetFields, idx: idx, setDt: (valueData) => {
811
+ setData((dt) => {
812
+ let arr = [...dt];
813
+ arr[idx] = valueData;
814
+ return arr;
815
+ });
816
+ }, removeDt: () => {
817
+ setData((dt) => {
818
+ let arr = [...dt];
819
+ arr.splice(idx, 1);
820
+ return arr;
821
+ });
822
+ } })))) : (react_1.default.createElement(material_1.Box, null, data.map((d, idx) => (react_1.default.createElement(FilterRow, { filterValue: d, setReset: setResetFields, idx: idx, setDt: (valueData) => {
823
+ setData((dt) => {
824
+ let arr = [...dt];
825
+ arr[idx] = valueData;
826
+ return arr;
827
+ });
828
+ }, removeDt: () => {
829
+ setData((dt) => {
830
+ let arr = [...dt];
831
+ arr.splice(idx, 1);
832
+ return arr;
833
+ });
834
+ } })))))),
835
+ react_1.default.createElement(material_1.Stack, { direction: 'row', justifyContent: 'flex-end', marginTop: 1 },
836
+ react_1.default.createElement(material_1.Button, { variant: 'contained', color: 'success', startIcon: react_1.default.createElement(Search_1.default, null), sx: {
837
+ textTransform: 'capitalize',
838
+ }, onClick: (e) => {
839
+ filtrar(data);
840
+ Modal_1.MODAL.close();
841
+ } }, "Filtrar"))));
842
+ }
843
+ function FilterRow({ filterValue, setDt, removeDt, idx, setReset, }) {
844
+ const [currentOperator, setCurrentOperator] = (0, react_1.useState)(filterValue.operator);
845
+ const [data, setData] = (0, react_1.useState)(filterValue);
846
+ const theme = (0, material_1.useTheme)();
847
+ const isSmall = (0, material_1.useMediaQuery)(theme.breakpoints.only('xs'));
948
848
  (0, react_1.useEffect)(() => {
949
- axios_1.default
950
- .get(props.url)
951
- .then((dt) => {
952
- setData(dt.data);
953
- })
954
- .catch((e) => console.log('Erro ao buscar dados do filtro'));
955
- }, []);
956
- return (react_1.default.createElement(react_1.default.Fragment, null,
957
- react_1.default.createElement(material_1.Autocomplete, { options: data, onChange: props.onChange, sx: {
958
- margin: 1,
959
- }, size: 'small', renderInput: (params) => react_1.default.createElement(TextField_1.default, Object.assign({}, params, { label: props.label })) })));
849
+ setDt(data);
850
+ }, [data]);
851
+ return (react_1.default.createElement(material_1.Stack, { direction: 'row', alignItems: 'end', spacing: 1, width: '100%', bgcolor: idx % 2 === 0 ? '#ededed' : 'inherit', padding: 0.5, borderRadius: 2 },
852
+ !isSmall && (react_1.default.createElement(Typography_1.default, { width: '100%', alignContent: 'center', fontWeight: 600, color: '#323232' }, filterValue.label)),
853
+ react_1.default.createElement(material_1.FormControl, { sx: {
854
+ width: '100%',
855
+ } },
856
+ isSmall && react_1.default.createElement(Typography_1.default, null, filterValue.label),
857
+ react_1.default.createElement(material_1.Select, { onChange: (e) => {
858
+ const value = e.target.value;
859
+ setData((obj) => (Object.assign(Object.assign({}, obj), { operator: value, value: '' })));
860
+ setCurrentOperator(value);
861
+ }, defaultValue: currentOperator, size: 'small', sx: {
862
+ bgcolor: 'white',
863
+ }, fullWidth: true }, filterValue.operators.map((x) => (react_1.default.createElement(material_1.MenuItem, { value: x }, x))))),
864
+ react_1.default.createElement(FilterField, { filterValue: filterValue, operator: data.operator, onChange: (value, type = 'value') => {
865
+ setData((obj) => (Object.assign(Object.assign({}, obj), { [type]: value })));
866
+ } }),
867
+ react_1.default.createElement(material_1.IconButton, { onClick: (e) => {
868
+ setDt(Object.assign(Object.assign({}, data), { value: '' }));
869
+ setReset((s) => !s);
870
+ } },
871
+ react_1.default.createElement(icons_material_1.Refresh, null))));
872
+ }
873
+ function FilterField({ filterValue, operator, onChange }) {
874
+ switch (filterValue.type) {
875
+ case 'number':
876
+ return (react_1.default.createElement(TextField_1.default, { type: 'number', size: 'small', placeholder: 'Valor', defaultValue: filterValue.value, onChange: (e) => {
877
+ onChange(e.target.value);
878
+ }, sx: {
879
+ bgcolor: 'white',
880
+ }, fullWidth: true }));
881
+ case 'string':
882
+ if (filterValue.useList) {
883
+ switch (operator) {
884
+ case 'tem um dos':
885
+ return (react_1.default.createElement(material_1.Autocomplete, { multiple: true, id: 'tags-standard', onChange: (e, value) => {
886
+ onChange(value);
887
+ }, options: filterValue.useList, defaultValue: Array.isArray(filterValue.value) ? filterValue.value : [], renderInput: (params) => react_1.default.createElement(TextField_1.default, Object.assign({}, params, { variant: 'standard', placeholder: 'Escolha os valores', fullWidth: true })), fullWidth: true }));
888
+ case 'contem':
889
+ return (react_1.default.createElement(material_1.Box, { width: '100%' },
890
+ react_1.default.createElement(material_1.Autocomplete, { options: filterValue.useList, onChange: (e, value) => {
891
+ onChange(value ? value.id : '');
892
+ }, defaultValue: filterValue.value && typeof filterValue.value === 'string' ? filterValue.useList.find((item) => item.id === filterValue.value) : undefined, isOptionEqualToValue: (option, value) => option.label === value.label, renderInput: (params) => (react_1.default.createElement(TextField_1.default, Object.assign({}, params, { size: 'small', placeholder: 'Escolha um valor', fullWidth: true, sx: {
893
+ bgcolor: 'white',
894
+ } }))), fullWidth: true })));
895
+ }
896
+ }
897
+ return (react_1.default.createElement(TextField_1.default, { size: 'small', placeholder: 'Valor', defaultValue: filterValue.value, onChange: (e) => {
898
+ onChange(e.target.value);
899
+ }, sx: {
900
+ bgcolor: 'white',
901
+ }, fullWidth: true }));
902
+ case 'date':
903
+ switch (operator) {
904
+ case 'data exata':
905
+ return (react_1.default.createElement(x_date_pickers_1.LocalizationProvider, { adapterLocale: 'pt-br', dateAdapter: AdapterDayjs_1.AdapterDayjs },
906
+ react_1.default.createElement(x_date_pickers_1.DatePicker, { format: 'DD/MM/YYYY', onChange: (dt) => {
907
+ onChange(dt.isValid() ? dt.format('DD/MM/YYYY') : '');
908
+ }, defaultValue: filterValue.value ? (0, dayjs_1.default)(filterValue.value, 'DD/MM/YYYY') : undefined, sx: {
909
+ div: {
910
+ input: {
911
+ paddingX: 2,
912
+ paddingY: 1.05,
913
+ },
914
+ },
915
+ width: '100%',
916
+ bgcolor: 'white',
917
+ }, inputRef: (params) => react_1.default.createElement(TextField_1.default, Object.assign({}, params, { size: 'small', fullWidth: true })) })));
918
+ case 'entre':
919
+ return (react_1.default.createElement(x_date_pickers_1.LocalizationProvider, { adapterLocale: 'pt-br', dateAdapter: AdapterDayjs_1.AdapterDayjs },
920
+ react_1.default.createElement(x_date_pickers_1.DatePicker, { format: 'DD/MM/YYYY', onChange: (dt) => {
921
+ onChange(dt.isValid() ? dt.format('DD/MM/YYYY') : '');
922
+ }, defaultValue: filterValue.value ? (0, dayjs_1.default)(filterValue.value, 'DD/MM/YYYY') : undefined, sx: {
923
+ div: {
924
+ input: {
925
+ paddingX: 2,
926
+ paddingY: 1.05,
927
+ },
928
+ },
929
+ width: '100%',
930
+ bgcolor: 'white',
931
+ }, inputRef: (params) => react_1.default.createElement(TextField_1.default, Object.assign({}, params, { size: 'small', fullWidth: true })) }),
932
+ react_1.default.createElement(x_date_pickers_1.DatePicker, { format: 'DD/MM/YYYY', onChange: (dt) => {
933
+ onChange(dt.isValid() ? dt.format('DD/MM/YYYY') : '', 'value2');
934
+ }, defaultValue: filterValue.value2 ? (0, dayjs_1.default)(filterValue.value2, 'DD/MM/YYYY') : undefined, sx: {
935
+ div: {
936
+ input: {
937
+ paddingX: 2,
938
+ paddingY: 1.05,
939
+ },
940
+ },
941
+ width: '100%',
942
+ bgcolor: 'white',
943
+ }, inputRef: (params) => react_1.default.createElement(TextField_1.default, Object.assign({}, params, { size: 'small', fullWidth: true })) })));
944
+ }
945
+ break;
946
+ }
947
+ return react_1.default.createElement(react_1.default.Fragment, null);
960
948
  }
961
949
  exports.default = react_1.default.memo(Table);
@@ -1,6 +1,8 @@
1
1
  /// <reference types="react" />
2
2
  export declare let MODAL: {
3
3
  open: (customCompoment?: JSX.Element | JSX.Element[] | (() => JSX.Element)) => void;
4
+ reparent: (child: JSX.Element, id: string | number) => JSX.Element;
5
+ openReparented: (id: string | number) => void;
4
6
  close: () => void;
5
7
  };
6
8
  export declare function CustomModalProvider(): JSX.Element;
@@ -33,17 +33,37 @@ const react_1 = __importStar(require("react"));
33
33
  exports.MODAL = {
34
34
  open: () => { },
35
35
  close: () => { },
36
+ openReparented: () => { },
37
+ reparent: () => react_1.default.createElement(react_1.default.Fragment, null),
36
38
  };
39
+ function ReparentHelper() {
40
+ const ref = (0, react_1.useRef)(null);
41
+ return react_1.default.createElement("div", { ref: ref });
42
+ }
37
43
  function CustomModalProvider() {
38
44
  const [open, setOpen] = (0, react_1.useState)(false);
39
- const [content, setContent] = (0, react_1.useState)(react_1.default.createElement(react_1.default.Fragment, null));
45
+ const [content, setContent] = (0, react_1.useState)(null);
46
+ // const contentRef = useRef<JSX.Element | JSX.Element[]>(<></>)
40
47
  const handleClose = () => setOpen(false);
48
+ const containerRef = (0, react_1.useRef)(null);
41
49
  const theme = (0, material_1.useTheme)();
42
50
  const isDesktop = (0, material_1.useMediaQuery)(theme.breakpoints.up('sm'));
51
+ const [idRef, setIdRef] = (0, react_1.useState)({});
52
+ const [currentId, setCurrentId] = (0, react_1.useState)(-1321465654);
43
53
  (0, react_1.useEffect)(() => {
44
54
  exports.MODAL.open = (customCompoment) => {
45
55
  if (customCompoment)
46
56
  setContent(customCompoment);
57
+ setCurrentId(-1321465654);
58
+ setOpen(true);
59
+ };
60
+ exports.MODAL.reparent = (element, id) => {
61
+ setIdRef((obj) => (Object.assign(Object.assign({}, obj), { [id]: react_1.default.createElement(react_1.default.Fragment, null, element) })));
62
+ return react_1.default.createElement(react_1.default.Fragment, null);
63
+ };
64
+ exports.MODAL.openReparented = (id) => {
65
+ setCurrentId(id);
66
+ setContent(null);
47
67
  setOpen(true);
48
68
  };
49
69
  exports.MODAL.close = handleClose;
@@ -55,7 +75,9 @@ function CustomModalProvider() {
55
75
  } },
56
76
  react_1.default.createElement(material_1.Stack, { direction: 'row', onClick: handleClose, maxHeight: '8vh', height: '8vh', justifyContent: 'center', alignItems: 'center' },
57
77
  react_1.default.createElement(material_1.Typography, { fontWeight: 600, color: 'white' }, "Clique fora para fechar")),
58
- react_1.default.createElement(material_1.Box, { p: 2, maxHeight: '92vh', bgcolor: 'white', overflow: 'auto' }, content))) : (react_1.default.createElement(material_1.Modal, { open: open, onClose: handleClose },
78
+ react_1.default.createElement(material_1.Box, { p: 2, maxHeight: '92vh', bgcolor: 'white', overflow: 'auto' },
79
+ content,
80
+ idRef[currentId]))) : (react_1.default.createElement(material_1.Modal, { open: open, onClose: handleClose },
59
81
  react_1.default.createElement(material_1.Box, { sx: {
60
82
  position: 'absolute',
61
83
  top: '50%',
@@ -76,6 +98,8 @@ function CustomModalProvider() {
76
98
  react_1.default.createElement(CloseRounded_1.default, { sx: {
77
99
  transform: 'scale(.9)',
78
100
  } })),
79
- react_1.default.createElement(material_1.Box, { overflow: 'auto', maxHeight: '90vh', p: 2, marginTop: 4, borderTop: 'solid 1px gray', bgcolor: '#F9F9F9', borderRadius: 2 }, content))))));
101
+ react_1.default.createElement(material_1.Box, { overflow: 'auto', maxHeight: '90vh', p: 2, marginTop: 4, borderTop: 'solid 1px gray', bgcolor: '#F9F9F9', borderRadius: 2 },
102
+ content,
103
+ idRef[currentId]))))));
80
104
  }
81
105
  exports.CustomModalProvider = CustomModalProvider;
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ import { ButtonProps } from '@mui/material';
3
+ import tinycolor from 'tinycolor2';
4
+ interface CustomButton extends ButtonProps {
5
+ customColor?: tinycolor.ColorInput;
6
+ customFontColor?: tinycolor.ColorInput;
7
+ }
8
+ export default function Bt({ customColor, customFontColor, ...props }: CustomButton): JSX.Element;
9
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const material_1 = require("@mui/material");
18
+ const react_1 = __importDefault(require("react"));
19
+ const tinycolor2_1 = __importDefault(require("tinycolor2"));
20
+ function Bt(_a) {
21
+ var { customColor = '#383838', customFontColor = 'white' } = _a, props = __rest(_a, ["customColor", "customFontColor"]);
22
+ const bgColor = (0, tinycolor2_1.default)(customColor);
23
+ return (react_1.default.createElement(material_1.Button, Object.assign({}, props, { sx: {
24
+ bgcolor: bgColor.toHexString(),
25
+ color: (0, tinycolor2_1.default)(customFontColor).toHexString(),
26
+ ':hover': {
27
+ bgcolor: bgColor.darken(10).toHexString(),
28
+ },
29
+ boxShadow: 'none',
30
+ borderRadius: 3,
31
+ textTransform: 'capitalize',
32
+ paddingX: 2,
33
+ }, size: 'small' }), props.children));
34
+ }
35
+ exports.default = Bt;
@@ -0,0 +1,12 @@
1
+ import { ButtonProps } from '@mui/material';
2
+ import React from 'react';
3
+ interface MenuProps {
4
+ data: {
5
+ name: string;
6
+ onClick?: () => void;
7
+ }[];
8
+ btProps?: ButtonProps;
9
+ children?: React.ReactNode;
10
+ }
11
+ export default function CustomMenu({ data, ...props }: MenuProps): JSX.Element;
12
+ export {};
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const material_1 = require("@mui/material");
18
+ const react_1 = __importDefault(require("react"));
19
+ const Bt_1 = __importDefault(require("./Bt"));
20
+ function CustomMenu(_a) {
21
+ var { data = [] } = _a, props = __rest(_a, ["data"]);
22
+ const [anchorEl, setAnchorEl] = react_1.default.useState(null);
23
+ const open = Boolean(anchorEl);
24
+ const handleClick = (event) => {
25
+ setAnchorEl(event.currentTarget);
26
+ };
27
+ const handleClose = () => {
28
+ setAnchorEl(null);
29
+ };
30
+ return (react_1.default.createElement(react_1.default.Fragment, null,
31
+ react_1.default.createElement(Bt_1.default, Object.assign({}, props.btProps, { onClick: handleClick }), props.children),
32
+ react_1.default.createElement(material_1.Menu, { id: 'basic-menu', anchorEl: anchorEl, open: open, onClose: handleClose, MenuListProps: {
33
+ 'aria-labelledby': 'basic-button',
34
+ } }, data.map((x) => (react_1.default.createElement(material_1.MenuItem, { onClick: (e) => {
35
+ x.onClick && x.onClick();
36
+ handleClose();
37
+ } }, x.name))))));
38
+ }
39
+ exports.default = CustomMenu;
package/index.d.ts CHANGED
@@ -32,4 +32,6 @@ import { FixedAutoComplete } from './components/form/input/FixedAutoComplete';
32
32
  import DropFileUpload from './components/form/file/DropFileUpload';
33
33
  import { MODAL } from './components/modal/Modal';
34
34
  import { SspComponentsProvider } from './components/providers/SspComponentsProvider';
35
- export { CheckBox, CheckBoxWarning, DatePicker, TimePicker, FileUpload, ActiveInput, AutoComplete, FetchAutoComplete, Input, MaskInput, MultInput, OtherCheckBox, Stepper, StepperBlock, Switch, SwitchWatch, ToggleVisibility, Table, NavBar, FormProvider, OAuthProvider, AUTH_COOKIE_NAME, AuthContext, FormContext, KeycloakAuthProvider, CheckBoxAdditional, RequiredCheckBoxGroup, FixedAutoComplete, Category, Field, FieldLabel, File, DropFileUpload, MODAL, SspComponentsProvider, TabNavBar };
35
+ import Button from './components/utils/Bt';
36
+ import Menu from './components/utils/CustomMenu';
37
+ export { CheckBox, CheckBoxWarning, DatePicker, TimePicker, FileUpload, ActiveInput, AutoComplete, FetchAutoComplete, Input, MaskInput, MultInput, OtherCheckBox, Stepper, StepperBlock, Switch, SwitchWatch, ToggleVisibility, Table, NavBar, FormProvider, OAuthProvider, AUTH_COOKIE_NAME, AuthContext, FormContext, KeycloakAuthProvider, CheckBoxAdditional, RequiredCheckBoxGroup, FixedAutoComplete, Category, Field, FieldLabel, File, DropFileUpload, MODAL, SspComponentsProvider, TabNavBar, Button, Menu };
package/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TabNavBar = exports.SspComponentsProvider = exports.MODAL = exports.DropFileUpload = exports.File = exports.FieldLabel = exports.Field = exports.Category = exports.FixedAutoComplete = exports.RequiredCheckBoxGroup = exports.CheckBoxAdditional = exports.KeycloakAuthProvider = exports.FormContext = exports.AuthContext = exports.AUTH_COOKIE_NAME = exports.OAuthProvider = exports.FormProvider = exports.NavBar = exports.Table = exports.ToggleVisibility = exports.SwitchWatch = exports.Switch = exports.StepperBlock = exports.Stepper = exports.OtherCheckBox = exports.MultInput = exports.MaskInput = exports.Input = exports.FetchAutoComplete = exports.AutoComplete = exports.ActiveInput = exports.FileUpload = exports.TimePicker = exports.DatePicker = exports.CheckBoxWarning = exports.CheckBox = void 0;
6
+ exports.Menu = exports.Button = exports.TabNavBar = exports.SspComponentsProvider = exports.MODAL = exports.DropFileUpload = exports.File = exports.FieldLabel = exports.Field = exports.Category = exports.FixedAutoComplete = exports.RequiredCheckBoxGroup = exports.CheckBoxAdditional = exports.KeycloakAuthProvider = exports.FormContext = exports.AuthContext = exports.AUTH_COOKIE_NAME = exports.OAuthProvider = exports.FormProvider = exports.NavBar = exports.Table = exports.ToggleVisibility = exports.SwitchWatch = exports.Switch = exports.StepperBlock = exports.Stepper = exports.OtherCheckBox = exports.MultInput = exports.MaskInput = exports.Input = exports.FetchAutoComplete = exports.AutoComplete = exports.ActiveInput = exports.FileUpload = exports.TimePicker = exports.DatePicker = exports.CheckBoxWarning = exports.CheckBox = void 0;
7
7
  const CheckBox_1 = __importDefault(require("./components/form/checkbox/CheckBox"));
8
8
  exports.CheckBox = CheckBox_1.default;
9
9
  const CheckBoxWarning_1 = __importDefault(require("./components/form/checkbox/CheckBoxWarning"));
@@ -74,3 +74,7 @@ const Modal_1 = require("./components/modal/Modal");
74
74
  Object.defineProperty(exports, "MODAL", { enumerable: true, get: function () { return Modal_1.MODAL; } });
75
75
  const SspComponentsProvider_1 = require("./components/providers/SspComponentsProvider");
76
76
  Object.defineProperty(exports, "SspComponentsProvider", { enumerable: true, get: function () { return SspComponentsProvider_1.SspComponentsProvider; } });
77
+ const Bt_1 = __importDefault(require("./components/utils/Bt"));
78
+ exports.Button = Bt_1.default;
79
+ const CustomMenu_1 = __importDefault(require("./components/utils/CustomMenu"));
80
+ exports.Menu = CustomMenu_1.default;
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@ssplib/react-components",
3
- "version": "0.0.224",
3
+ "version": "0.0.226",
4
4
  "description": "SSP React Components",
5
5
  "main": "index.js",
6
6
  "author": "Pedro Henrique <sr.hudrick@gmail.com>",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
9
  "cookies-next": "^2.1.1",
10
+ "tinycolor2": "^1.6.0",
10
11
  "lodash.get": "^4.4.2",
11
12
  "jwt-decode": "^3.1.2",
12
13
  "react-hook-form": "^7.43.9",