@orbe-agro/client-core 5.6.118 → 5.6.120
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.
- package/dist/@types/base/@types/filters/index.d.ts +60 -0
- package/dist/@types/base/@types/filters/index.d.ts.map +1 -0
- package/dist/@types/base/@types/index.d.ts +1 -0
- package/dist/@types/base/@types/index.d.ts.map +1 -1
- package/dist/@types/base/components/filters/DynamicFilterField.d.ts +23 -0
- package/dist/@types/base/components/filters/DynamicFilterField.d.ts.map +1 -0
- package/dist/@types/base/components/filters/DynamicFilterPanel.d.ts +30 -0
- package/dist/@types/base/components/filters/DynamicFilterPanel.d.ts.map +1 -0
- package/dist/@types/base/components/filters/index.d.ts +3 -0
- package/dist/@types/base/components/filters/index.d.ts.map +1 -0
- package/dist/@types/base/components/index.d.ts +1 -0
- package/dist/@types/base/components/index.d.ts.map +1 -1
- package/dist/@types/base/configs/endpoints.config/centralNfe/centralNfe.d.ts +4 -0
- package/dist/@types/base/configs/endpoints.config/centralNfe/centralNfe.d.ts.map +1 -1
- package/dist/@types/base/configs/endpoints.config/centralNfe/config/nfe.d.ts +4 -0
- package/dist/@types/base/configs/endpoints.config/centralNfe/config/nfe.d.ts.map +1 -1
- package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts +5 -0
- package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts.map +1 -1
- package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts +1 -0
- package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts.map +1 -1
- package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts +1 -0
- package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts.map +1 -1
- package/dist/@types/base/hooks/filters/useFilterMetadata.d.ts +26 -0
- package/dist/@types/base/hooks/filters/useFilterMetadata.d.ts.map +1 -0
- package/dist/@types/base/hooks/index.d.ts +1 -0
- package/dist/@types/base/hooks/index.d.ts.map +1 -1
- package/dist/@types/base/services/modules/centralNfe/nfe/NfeService.d.ts +1 -0
- package/dist/@types/base/services/modules/centralNfe/nfe/NfeService.d.ts.map +1 -1
- package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts +2 -0
- package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts.map +1 -1
- package/dist/@types/base/utils/filters/groupFilterFields.d.ts +15 -0
- package/dist/@types/base/utils/filters/groupFilterFields.d.ts.map +1 -0
- package/dist/@types/base/utils/index.d.ts +1 -0
- package/dist/@types/base/utils/index.d.ts.map +1 -1
- package/dist/base/@types/filters/index.js +2 -0
- package/dist/base/@types/filters/index.js.map +1 -0
- package/dist/base/@types/index.js +1 -0
- package/dist/base/@types/index.js.map +1 -1
- package/dist/base/components/filters/DynamicFilterField.js +156 -0
- package/dist/base/components/filters/DynamicFilterField.js.map +1 -0
- package/dist/base/components/filters/DynamicFilterPanel.js +19 -0
- package/dist/base/components/filters/DynamicFilterPanel.js.map +1 -0
- package/dist/base/components/filters/index.js +7 -0
- package/dist/base/components/filters/index.js.map +1 -0
- package/dist/base/components/index.js +11 -6
- package/dist/base/components/index.js.map +1 -1
- package/dist/base/configs/endpoints.config/centralNfe/config/nfe.js +1 -0
- package/dist/base/configs/endpoints.config/centralNfe/config/nfe.js.map +1 -1
- package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js +2 -1
- package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js.map +1 -1
- package/dist/base/hooks/filters/useFilterMetadata.js +23 -0
- package/dist/base/hooks/filters/useFilterMetadata.js.map +1 -0
- package/dist/base/hooks/index.js +2 -0
- package/dist/base/hooks/index.js.map +1 -1
- package/dist/base/index.js +230 -222
- package/dist/base/index.js.map +1 -1
- package/dist/base/services/modules/centralNfe/index.js +2 -1
- package/dist/base/services/modules/centralNfe/nfe/NfeService.js +7 -0
- package/dist/base/services/modules/centralNfe/nfe/NfeService.js.map +1 -1
- package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js +7 -0
- package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js.map +1 -1
- package/dist/base/utils/filters/groupFilterFields.js +56 -0
- package/dist/base/utils/filters/groupFilterFields.js.map +1 -0
- package/dist/base/utils/index.js +2 -0
- package/dist/base/utils/index.js.map +1 -1
- package/lib/base/@types/filters/index.ts +87 -0
- package/lib/base/@types/index.ts +1 -0
- package/lib/base/components/filters/DynamicFilterField.tsx +213 -0
- package/lib/base/components/filters/DynamicFilterPanel.tsx +50 -0
- package/lib/base/components/filters/index.ts +2 -0
- package/lib/base/components/index.ts +4 -1
- package/lib/base/configs/endpoints.config/centralNfe/config/nfe.ts +1 -0
- package/lib/base/configs/endpoints.config/originacao/config/saldoTicket.ts +2 -1
- package/lib/base/hooks/filters/useFilterMetadata.ts +43 -0
- package/lib/base/hooks/index.ts +2 -1
- package/lib/base/services/modules/centralNfe/nfe/NfeService.ts +8 -0
- package/lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts +8 -0
- package/lib/base/utils/filters/groupFilterFields.ts +93 -0
- package/lib/base/utils/index.ts +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NfeService.js","sources":["../../../../../../lib/base/services/modules/centralNfe/nfe/NfeService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport endpointConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\n\nconst NFE_ENDPOINT = endpointConfig.centralNfe.nfe;\n\nexport async function apiFindMonitorNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.findMonitor.endpoint,\n method: NFE_ENDPOINT.findMonitor.httpMethod,\n data: body,\n })\n}\n\nexport async function apiCountNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.count.endpoint,\n method: NFE_ENDPOINT.count.httpMethod,\n data: body,\n })\n}\n\nexport async function apiFindOneNfe(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.findOne.endpoint}/${id}`,\n method: NFE_ENDPOINT.findOne.httpMethod\n })\n}\n\nexport async function apiUpdateNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.update.endpoint,\n method: NFE_ENDPOINT.update.httpMethod,\n data: body,\n })\n}\n\nexport async function downloadPdfByChaveAcesso(chaveAcesso: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.downloadPdfByChaveAcesso.endpoint}/${chaveAcesso}`,\n method: NFE_ENDPOINT.downloadPdfByChaveAcesso.httpMethod\n })\n}\n\nexport async function buscaValidacaoImposto(id: number, numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.validacaoImposto.endpoint\n .replace('{id}', id.toString())\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.validacaoImposto.httpMethod\n })\n}\n\nexport async function addLancamentoManual(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.addLancamentoManual.endpoint,\n method: NFE_ENDPOINT.addLancamentoManual.httpMethod,\n data: body\n })\n}\n\nexport async function apiDesvincularOrdemCompra(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.desvincularOrdemCompra.endpoint,\n method: NFE_ENDPOINT.desvincularOrdemCompra.httpMethod,\n data: body\n })\n}\n\nexport async function apiEstornarPedidoCompra(numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarPedidoCompra.endpoint\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiEstornarOperacao(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarOperacao.endpoint\n .replace('{id}', id.toString()),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiSetNfeLock(idNfe: number, lock: boolean) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.lock.endpoint,\n method: NFE_ENDPOINT.lock.httpMethod,\n params: {\n idNfe,\n lock\n }\n })\n}"],"names":["endpointConfig"],"mappings":";;AAGA,MAAM,eAAeA,yBAAe,WAAW;AAE/C,eAAsB,kBAAkB,MAAM;AAC1C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,YAAY;AAAA,IAC9B,QAAQ,aAAa,YAAY;AAAA,IACjC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,YAAY,MAAM;AACpC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,MAAM;AAAA,IACxB,QAAQ,aAAa,MAAM;AAAA,IAC3B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,cAAc,IAAY;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,QAAQ,QAAQ,IAAI,EAAE;AAAA,IAC3C,QAAQ,aAAa,QAAQ;AAAA,EAAA,CAChC;AACL;AAEA,eAAsB,aAAa,MAAM;AACrC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,OAAO;AAAA,IACzB,QAAQ,aAAa,OAAO;AAAA,IAC5B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,yBAAyB,aAAqB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,yBAAyB,QAAQ,IAAI,WAAW;AAAA,IACrE,QAAQ,aAAa,yBAAyB;AAAA,EAAA,CACjD;AACL;AAEA,eAAsB,sBAAsB,IAAY,cAAsB;AAC1E,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,SAAA,CAAU,EAC7B,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,iBAAiB;AAAA,EAAA,CACzC;AACL;AAEA,eAAsB,oBAAoB,MAAM;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,oBAAoB;AAAA,IACtC,QAAQ,aAAa,oBAAoB;AAAA,IACzC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,0BAA0B,MAAM;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,uBAAuB;AAAA,IACzC,QAAQ,aAAa,uBAAuB;AAAA,IAC5C,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,wBAAwB,cAAsB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,qBAAqB,SAClC,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,oBAAoB,IAAY;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,UAAU;AAAA,IAClC,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,cAAc,OAAe,MAAe;AAC9D,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,KAAK;AAAA,IACvB,QAAQ,aAAa,KAAK;AAAA,IAC1B,QAAQ;AAAA,MACJ;AAAA,MACA;AAAA,IAAA;AAAA,EACJ,CACH;AACL;"}
|
|
1
|
+
{"version":3,"file":"NfeService.js","sources":["../../../../../../lib/base/services/modules/centralNfe/nfe/NfeService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport endpointConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\n\nconst NFE_ENDPOINT = endpointConfig.centralNfe.nfe;\n\nexport async function apiFindMonitorNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.findMonitor.endpoint,\n method: NFE_ENDPOINT.findMonitor.httpMethod,\n data: body,\n })\n}\n\nexport async function apiCountNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.count.endpoint,\n method: NFE_ENDPOINT.count.httpMethod,\n data: body,\n })\n}\n\nexport async function apiFindOneNfe(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.findOne.endpoint}/${id}`,\n method: NFE_ENDPOINT.findOne.httpMethod\n })\n}\n\nexport async function apiUpdateNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.update.endpoint,\n method: NFE_ENDPOINT.update.httpMethod,\n data: body,\n })\n}\n\nexport async function downloadPdfByChaveAcesso(chaveAcesso: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.downloadPdfByChaveAcesso.endpoint}/${chaveAcesso}`,\n method: NFE_ENDPOINT.downloadPdfByChaveAcesso.httpMethod\n })\n}\n\nexport async function buscaValidacaoImposto(id: number, numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.validacaoImposto.endpoint\n .replace('{id}', id.toString())\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.validacaoImposto.httpMethod\n })\n}\n\nexport async function addLancamentoManual(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.addLancamentoManual.endpoint,\n method: NFE_ENDPOINT.addLancamentoManual.httpMethod,\n data: body\n })\n}\n\nexport async function apiDesvincularOrdemCompra(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.desvincularOrdemCompra.endpoint,\n method: NFE_ENDPOINT.desvincularOrdemCompra.httpMethod,\n data: body\n })\n}\n\nexport async function apiEstornarPedidoCompra(numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarPedidoCompra.endpoint\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiEstornarOperacao(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarOperacao.endpoint\n .replace('{id}', id.toString()),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiFinalizarPedido(numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.finalizarPedido.endpoint\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.finalizarPedido.httpMethod\n })\n}\n\nexport async function apiSetNfeLock(idNfe: number, lock: boolean) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.lock.endpoint,\n method: NFE_ENDPOINT.lock.httpMethod,\n params: {\n idNfe,\n lock\n }\n })\n}"],"names":["endpointConfig"],"mappings":";;AAGA,MAAM,eAAeA,yBAAe,WAAW;AAE/C,eAAsB,kBAAkB,MAAM;AAC1C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,YAAY;AAAA,IAC9B,QAAQ,aAAa,YAAY;AAAA,IACjC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,YAAY,MAAM;AACpC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,MAAM;AAAA,IACxB,QAAQ,aAAa,MAAM;AAAA,IAC3B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,cAAc,IAAY;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,QAAQ,QAAQ,IAAI,EAAE;AAAA,IAC3C,QAAQ,aAAa,QAAQ;AAAA,EAAA,CAChC;AACL;AAEA,eAAsB,aAAa,MAAM;AACrC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,OAAO;AAAA,IACzB,QAAQ,aAAa,OAAO;AAAA,IAC5B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,yBAAyB,aAAqB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,yBAAyB,QAAQ,IAAI,WAAW;AAAA,IACrE,QAAQ,aAAa,yBAAyB;AAAA,EAAA,CACjD;AACL;AAEA,eAAsB,sBAAsB,IAAY,cAAsB;AAC1E,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,SAAA,CAAU,EAC7B,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,iBAAiB;AAAA,EAAA,CACzC;AACL;AAEA,eAAsB,oBAAoB,MAAM;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,oBAAoB;AAAA,IACtC,QAAQ,aAAa,oBAAoB;AAAA,IACzC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,0BAA0B,MAAM;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,uBAAuB;AAAA,IACzC,QAAQ,aAAa,uBAAuB;AAAA,IAC5C,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,wBAAwB,cAAsB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,qBAAqB,SAClC,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,oBAAoB,IAAY;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,UAAU;AAAA,IAClC,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,mBAAmB,cAAsB;AAC3D,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,gBAAgB,SAC7B,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,gBAAgB;AAAA,EAAA,CACxC;AACL;AAEA,eAAsB,cAAc,OAAe,MAAe;AAC9D,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,KAAK;AAAA,IACvB,QAAQ,aAAa,KAAK;AAAA,IAC1B,QAAQ;AAAA,MACJ;AAAA,MACA;AAAA,IAAA;AAAA,EACJ,CACH;AACL;"}
|
|
@@ -43,11 +43,18 @@ async function apiUpdateStatusSaldoTicket(id, status, tipoSaldo, justificativa)
|
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
|
+
async function apiFindSaldoFilterMetadata() {
|
|
47
|
+
return ApiService.fetchDataWithAxios({
|
|
48
|
+
url: SALDO_TICKET_ORIGINACAO_ENDPOINT.filterMetadata,
|
|
49
|
+
method: "get"
|
|
50
|
+
});
|
|
51
|
+
}
|
|
46
52
|
export {
|
|
47
53
|
apiBuscarSaldoContrato,
|
|
48
54
|
apiBuscarSaldoDisponivel,
|
|
49
55
|
apiFindAllSaldo,
|
|
50
56
|
apiFindHistoricoByIdSaldo,
|
|
57
|
+
apiFindSaldoFilterMetadata,
|
|
51
58
|
apiFindSaldoMetrics,
|
|
52
59
|
apiUpdateStatusSaldoTicket
|
|
53
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saldoTicketService.js","sources":["../../../../../../lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport { TSaldoContratoResponse } from \"@base/@types/api/response/originacao/TSaldoContratoResponse\";\nimport endpointNavigationConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\nimport { TQueryResponse } from \"@base/@types/api\";\nimport { TFindAllSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllSaldoResponse\";\nimport { TFindAllMetricsSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllMetricsSaldoResponse\";\nimport { TEntityHistoricoResponse } from \"@base/@types/api/response/originacao/TEntityHistoricoResponse\";\nimport { StatusSaldoTicket } from \"@base/@types/enums/originacao/StatusSaldoTicket\";\nimport { TipoSaldo } from \"@base/@types/enums/originacao/TipoSaldo\";\n\nconst SALDO_TICKET_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.saldoTicket;\n\nexport async function apiBuscarSaldoContrato(id: number | string) {\n return ApiService.fetchDataWithAxios<TSaldoContratoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoContrato(String(id)),\n method: \"get\",\n });\n}\n\nexport async function apiFindAllSaldo(params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TFindAllSaldoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAll(params),\n method: \"get\",\n });\n}\n\nexport async function apiFindHistoricoByIdSaldo(id: number | string, params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TEntityHistoricoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.historicoById(String(id), params),\n method: \"get\",\n });\n}\n\n\nexport async function apiBuscarSaldoDisponivel(data) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoDisponivel,\n method: \"post\",\n data\n });\n}\n\nexport async function apiFindSaldoMetrics(params?: string) {\n return ApiService.fetchDataWithAxios<TFindAllMetricsSaldoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAllMetrics(params),\n method: \"get\",\n });\n}\n\nexport async function apiUpdateStatusSaldoTicket(\n id: number | string,\n status: StatusSaldoTicket,\n tipoSaldo: TipoSaldo,\n justificativa: string\n) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.updateStatus(String(id)),\n method: \"patch\",\n data: {\n status,\n tipoSaldo,\n justificativa\n }\n });\n}"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"saldoTicketService.js","sources":["../../../../../../lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport { TSaldoContratoResponse } from \"@base/@types/api/response/originacao/TSaldoContratoResponse\";\nimport endpointNavigationConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\nimport { TQueryResponse } from \"@base/@types/api\";\nimport { TFindAllSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllSaldoResponse\";\nimport { TFindAllMetricsSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllMetricsSaldoResponse\";\nimport { TEntityHistoricoResponse } from \"@base/@types/api/response/originacao/TEntityHistoricoResponse\";\nimport { StatusSaldoTicket } from \"@base/@types/enums/originacao/StatusSaldoTicket\";\nimport { TipoSaldo } from \"@base/@types/enums/originacao/TipoSaldo\";\nimport { IFilterFieldDescriptor } from \"@base/@types/filters\";\n\nconst SALDO_TICKET_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.saldoTicket;\n\nexport async function apiBuscarSaldoContrato(id: number | string) {\n return ApiService.fetchDataWithAxios<TSaldoContratoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoContrato(String(id)),\n method: \"get\",\n });\n}\n\nexport async function apiFindAllSaldo(params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TFindAllSaldoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAll(params),\n method: \"get\",\n });\n}\n\nexport async function apiFindHistoricoByIdSaldo(id: number | string, params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TEntityHistoricoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.historicoById(String(id), params),\n method: \"get\",\n });\n}\n\n\nexport async function apiBuscarSaldoDisponivel(data) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoDisponivel,\n method: \"post\",\n data\n });\n}\n\nexport async function apiFindSaldoMetrics(params?: string) {\n return ApiService.fetchDataWithAxios<TFindAllMetricsSaldoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAllMetrics(params),\n method: \"get\",\n });\n}\n\nexport async function apiUpdateStatusSaldoTicket(\n id: number | string,\n status: StatusSaldoTicket,\n tipoSaldo: TipoSaldo,\n justificativa: string\n) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.updateStatus(String(id)),\n method: \"patch\",\n data: {\n status,\n tipoSaldo,\n justificativa\n }\n });\n}\n\nexport async function apiFindSaldoFilterMetadata() {\n return ApiService.fetchDataWithAxios<IFilterFieldDescriptor[]>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.filterMetadata,\n method: \"get\",\n });\n}"],"names":[],"mappings":";;AAWA,MAAM,mCAAmC,yBAAyB,WAAW;AAE7E,eAAsB,uBAAuB,IAAqB;AAChE,SAAO,WAAW,mBAA2C;AAAA,IAC3D,KAAK,iCAAiC,oBAAoB,OAAO,EAAE,CAAC;AAAA,IACpE,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,gBAAgB,QAAiB;AACrD,SAAO,WAAW,mBAA0D;AAAA,IAC1E,KAAK,iCAAiC,QAAQ,MAAM;AAAA,IACpD,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,0BAA0B,IAAqB,QAAiB;AACpF,SAAO,WAAW,mBAA6D;AAAA,IAC7E,KAAK,iCAAiC,cAAc,OAAO,EAAE,GAAG,MAAM;AAAA,IACtE,QAAQ;AAAA,EAAA,CACT;AACH;AAGA,eAAsB,yBAAyB,MAAM;AACnD,SAAO,WAAW,mBAAmB;AAAA,IACnC,KAAK,iCAAiC;AAAA,IACtC,QAAQ;AAAA,IACR;AAAA,EAAA,CACD;AACH;AAEA,eAAsB,oBAAoB,QAAiB;AACzD,SAAO,WAAW,mBAAiD;AAAA,IACjE,KAAK,iCAAiC,eAAe,MAAM;AAAA,IAC3D,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,2BACpB,IACA,QACA,WACA,eACA;AACA,SAAO,WAAW,mBAAmB;AAAA,IACnC,KAAK,iCAAiC,aAAa,OAAO,EAAE,CAAC;AAAA,IAC7D,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,CACD;AACH;AAEA,eAAsB,6BAA6B;AACjD,SAAO,WAAW,mBAA6C;AAAA,IAC7D,KAAK,iCAAiC;AAAA,IACtC,QAAQ;AAAA,EAAA,CACT;AACH;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
function groupFilterFields(fields) {
|
|
2
|
+
const rangeGroupMap = /* @__PURE__ */ new Map();
|
|
3
|
+
for (const field of fields) {
|
|
4
|
+
if (field.rangeGroup) {
|
|
5
|
+
if (!rangeGroupMap.has(field.rangeGroup)) {
|
|
6
|
+
rangeGroupMap.set(field.rangeGroup, []);
|
|
7
|
+
}
|
|
8
|
+
rangeGroupMap.get(field.rangeGroup).push(field);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const result = [];
|
|
12
|
+
const rangeGroupInserted = /* @__PURE__ */ new Set();
|
|
13
|
+
for (const field of fields) {
|
|
14
|
+
if (field.rangeGroup) {
|
|
15
|
+
if (!rangeGroupInserted.has(field.rangeGroup)) {
|
|
16
|
+
rangeGroupInserted.add(field.rangeGroup);
|
|
17
|
+
const groupFields = rangeGroupMap.get(field.rangeGroup);
|
|
18
|
+
if (groupFields.length < 2) {
|
|
19
|
+
result.push({ kind: "standalone", descriptor: groupFields[0] });
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const sorted = [...groupFields].sort((a, b) => {
|
|
23
|
+
const aIsDe = /De$/i.test(a.field);
|
|
24
|
+
const bIsDe = /De$/i.test(b.field);
|
|
25
|
+
if (aIsDe && !bIsDe) return -1;
|
|
26
|
+
if (!aIsDe && bIsDe) return 1;
|
|
27
|
+
return a.field.localeCompare(b.field);
|
|
28
|
+
});
|
|
29
|
+
const rangeGroup = {
|
|
30
|
+
kind: "range",
|
|
31
|
+
rangeGroup: field.rangeGroup,
|
|
32
|
+
label: deriveRangeLabel(sorted),
|
|
33
|
+
startField: sorted[0],
|
|
34
|
+
endField: sorted[1]
|
|
35
|
+
};
|
|
36
|
+
result.push(rangeGroup);
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
const standalone = {
|
|
40
|
+
kind: "standalone",
|
|
41
|
+
descriptor: field
|
|
42
|
+
};
|
|
43
|
+
result.push(standalone);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
function deriveRangeLabel(fields) {
|
|
49
|
+
if (fields.length === 0) return "";
|
|
50
|
+
const raw = fields[0].label;
|
|
51
|
+
return raw.replace(/\s+(De|Até|Ate)$/i, "").trim() || raw;
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
groupFilterFields
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=groupFilterFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupFilterFields.js","sources":["../../../../lib/base/utils/filters/groupFilterFields.ts"],"sourcesContent":["import type {\n IFilterFieldDescriptor,\n IFilterRangeGroup,\n TFilterRenderItem,\n IFilterStandaloneField,\n} from '@base/@types/filters'\n\n/**\n * Agrupa IFilterFieldDescriptors em itens renderizáveis.\n *\n * - Campos com o mesmo rangeGroup não-nulo são fundidos em um único IFilterRangeGroup.\n * - Todos os demais campos se tornam IFilterStandaloneField.\n * - A ordem da lista original é preservada: o grupo aparece na posição do seu primeiro campo.\n * - Se um rangeGroup tiver menos de 2 campos, cada um é tratado como standalone (fallback seguro).\n *\n * @example\n * // dataEnvioDe + dataEnvioAte (mesmo rangeGroup) → IFilterRangeGroup { startField, endField }\n * // id, operacao, businessPartnerId → IFilterStandaloneField[]\n */\nexport function groupFilterFields(fields: IFilterFieldDescriptor[]): TFilterRenderItem[] {\n // Primeiro passo: coletar todos os campos de cada rangeGroup\n const rangeGroupMap = new Map<string, IFilterFieldDescriptor[]>()\n for (const field of fields) {\n if (field.rangeGroup) {\n if (!rangeGroupMap.has(field.rangeGroup)) {\n rangeGroupMap.set(field.rangeGroup, [])\n }\n rangeGroupMap.get(field.rangeGroup)!.push(field)\n }\n }\n\n // Segundo passo: percorrer os campos mantendo a ordem, inserindo o grupo\n // na posição do seu primeiro membro\n const result: TFilterRenderItem[] = []\n const rangeGroupInserted = new Set<string>()\n\n for (const field of fields) {\n if (field.rangeGroup) {\n // Apenas insere o grupo uma vez (na posição do primeiro campo)\n if (!rangeGroupInserted.has(field.rangeGroup)) {\n rangeGroupInserted.add(field.rangeGroup)\n const groupFields = rangeGroupMap.get(field.rangeGroup)!\n\n // Fallback seguro: se o backend enviar apenas um campo do par, trata como standalone\n if (groupFields.length < 2) {\n result.push({ kind: 'standalone', descriptor: groupFields[0] })\n continue\n }\n\n // Garante que o campo \"De\" (início) vem antes de \"Ate\"/\"Até\" (fim).\n // Não pode usar localeCompare simples pois \"Ate\" < \"De\" alfabeticamente.\n const sorted = [...groupFields].sort((a, b) => {\n const aIsDe = /De$/i.test(a.field)\n const bIsDe = /De$/i.test(b.field)\n if (aIsDe && !bIsDe) return -1\n if (!aIsDe && bIsDe) return 1\n return a.field.localeCompare(b.field)\n })\n\n const rangeGroup: IFilterRangeGroup = {\n kind: 'range',\n rangeGroup: field.rangeGroup,\n label: deriveRangeLabel(sorted),\n startField: sorted[0],\n endField: sorted[1],\n }\n result.push(rangeGroup)\n }\n } else {\n const standalone: IFilterStandaloneField = {\n kind: 'standalone',\n descriptor: field,\n }\n result.push(standalone)\n }\n }\n\n return result\n}\n\n/**\n * Deriva um label legível para o grupo de range.\n * Remove sufixos \"De\", \"Até\" e \"Ate\" do label do primeiro campo.\n *\n * @example\n * // \"Data Envio De\" → \"Data Envio\"\n * // \"Data Envio Até\" → \"Data Envio\"\n */\nfunction deriveRangeLabel(fields: IFilterFieldDescriptor[]): string {\n if (fields.length === 0) return ''\n const raw = fields[0].label\n return raw.replace(/\\s+(De|Até|Ate)$/i, '').trim() || raw\n}\n"],"names":[],"mappings":"AAmBO,SAAS,kBAAkB,QAAuD;AAErF,QAAM,oCAAoB,IAAA;AAC1B,aAAW,SAAS,QAAQ;AACxB,QAAI,MAAM,YAAY;AAClB,UAAI,CAAC,cAAc,IAAI,MAAM,UAAU,GAAG;AACtC,sBAAc,IAAI,MAAM,YAAY,CAAA,CAAE;AAAA,MAC1C;AACA,oBAAc,IAAI,MAAM,UAAU,EAAG,KAAK,KAAK;AAAA,IACnD;AAAA,EACJ;AAIA,QAAM,SAA8B,CAAA;AACpC,QAAM,yCAAyB,IAAA;AAE/B,aAAW,SAAS,QAAQ;AACxB,QAAI,MAAM,YAAY;AAElB,UAAI,CAAC,mBAAmB,IAAI,MAAM,UAAU,GAAG;AAC3C,2BAAmB,IAAI,MAAM,UAAU;AACvC,cAAM,cAAc,cAAc,IAAI,MAAM,UAAU;AAGtD,YAAI,YAAY,SAAS,GAAG;AACxB,iBAAO,KAAK,EAAE,MAAM,cAAc,YAAY,YAAY,CAAC,GAAG;AAC9D;AAAA,QACJ;AAIA,cAAM,SAAS,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM;AAC3C,gBAAM,QAAQ,OAAO,KAAK,EAAE,KAAK;AACjC,gBAAM,QAAQ,OAAO,KAAK,EAAE,KAAK;AACjC,cAAI,SAAS,CAAC,MAAO,QAAO;AAC5B,cAAI,CAAC,SAAS,MAAO,QAAO;AAC5B,iBAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,QACxC,CAAC;AAED,cAAM,aAAgC;AAAA,UAClC,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,OAAO,iBAAiB,MAAM;AAAA,UAC9B,YAAY,OAAO,CAAC;AAAA,UACpB,UAAU,OAAO,CAAC;AAAA,QAAA;AAEtB,eAAO,KAAK,UAAU;AAAA,MAC1B;AAAA,IACJ,OAAO;AACH,YAAM,aAAqC;AAAA,QACvC,MAAM;AAAA,QACN,YAAY;AAAA,MAAA;AAEhB,aAAO,KAAK,UAAU;AAAA,IAC1B;AAAA,EACJ;AAEA,SAAO;AACX;AAUA,SAAS,iBAAiB,QAA0C;AAChE,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,MAAM,OAAO,CAAC,EAAE;AACtB,SAAO,IAAI,QAAQ,qBAAqB,EAAE,EAAE,UAAU;AAC1D;"}
|
package/dist/base/utils/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { getLogoFilename } from "./logo.js";
|
|
2
2
|
import { validateEmail } from "./validateEmail/validateEmail.js";
|
|
3
|
+
import { groupFilterFields } from "./filters/groupFilterFields.js";
|
|
3
4
|
export {
|
|
4
5
|
getLogoFilename,
|
|
6
|
+
groupFilterFields,
|
|
5
7
|
validateEmail
|
|
6
8
|
};
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Tipos para o sistema de filtros dinâmicos guiados por metadados do backend.
|
|
2
|
+
// Este padrão é compartilhado entre todos os microfrontends que implementam
|
|
3
|
+
// o endpoint /filter-metadata.
|
|
4
|
+
//
|
|
5
|
+
// Convenção de nomenclatura seguida no projeto:
|
|
6
|
+
// I* → interfaces (objetos com estrutura definida)
|
|
7
|
+
// T* → type aliases (unions, primitivos, tipos genéricos)
|
|
8
|
+
|
|
9
|
+
export type TFilterDataType = 'NUMBER' | 'STRING' | 'DATE' | 'ENUM'
|
|
10
|
+
|
|
11
|
+
export type TFilterOperator = 'EQUALS' | 'BETWEEN' | 'LIKE' | 'IN'
|
|
12
|
+
|
|
13
|
+
export interface IFilterAllowedValue {
|
|
14
|
+
value: string
|
|
15
|
+
label: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface IFilterLookup {
|
|
19
|
+
resource: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Shape exata retornada pelo endpoint /filter-metadata do backend */
|
|
23
|
+
export interface IFilterFieldDescriptor {
|
|
24
|
+
field: string
|
|
25
|
+
label: string
|
|
26
|
+
dataType: TFilterDataType
|
|
27
|
+
operator: TFilterOperator
|
|
28
|
+
rangeGroup: string | null
|
|
29
|
+
multiSelect: boolean
|
|
30
|
+
allowedValues: IFilterAllowedValue[] | null
|
|
31
|
+
lookup: IFilterLookup | null
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Estruturas processadas após o agrupamento de campos de range
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
/** Dois campos DATE+BETWEEN com o mesmo rangeGroup fundidos em uma unidade renderizável */
|
|
39
|
+
export interface IFilterRangeGroup {
|
|
40
|
+
kind: 'range'
|
|
41
|
+
rangeGroup: string
|
|
42
|
+
/** Label derivado: remove sufixo "De"/"Até" do primeiro campo */
|
|
43
|
+
label: string
|
|
44
|
+
startField: IFilterFieldDescriptor
|
|
45
|
+
endField: IFilterFieldDescriptor
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Campo standalone: qualquer campo que não faça parte de um rangeGroup */
|
|
49
|
+
export interface IFilterStandaloneField {
|
|
50
|
+
kind: 'standalone'
|
|
51
|
+
descriptor: IFilterFieldDescriptor
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Union discriminada usada pelo renderizador — evita lógica if/else espalhada */
|
|
55
|
+
export type TFilterRenderItem = IFilterRangeGroup | IFilterStandaloneField
|
|
56
|
+
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Contrato do Lookup Registry
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Props mínimas que o sistema genérico precisa passar para um componente de lookup.
|
|
63
|
+
* O componente deve armazenar o valor PRIMITIVO (id, codigo, etc.) sob `name`
|
|
64
|
+
* no react-hook-form — nunca o objeto completo.
|
|
65
|
+
*/
|
|
66
|
+
export interface ILookupComponentProps {
|
|
67
|
+
/** Nome do campo no react-hook-form (= nome do param na API) */
|
|
68
|
+
name: string
|
|
69
|
+
/** Label vindo dos metadados do backend */
|
|
70
|
+
label: string
|
|
71
|
+
disabled?: boolean
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Mapa de resource string → componente React de lookup.
|
|
76
|
+
* Cada microfrontend define o seu próprio registry com os componentes adequados.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* const myRegistry: TLookupComponentRegistry = {
|
|
80
|
+
* 'business-partner': BusinessPartnerLookup,
|
|
81
|
+
* 'safra': SafraLookup,
|
|
82
|
+
* }
|
|
83
|
+
*/
|
|
84
|
+
export type TLookupComponentRegistry = Record<
|
|
85
|
+
string,
|
|
86
|
+
React.ComponentType<ILookupComponentProps>
|
|
87
|
+
>
|
package/lib/base/@types/index.ts
CHANGED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Controller, useFormContext } from 'react-hook-form'
|
|
3
|
+
import { DatePicker, FormItem, Input, Select } from '@/components/ui'
|
|
4
|
+
import DatePickerRange from '@/components/ui/DatePicker/DatePickerRange'
|
|
5
|
+
import type {
|
|
6
|
+
TFilterRenderItem,
|
|
7
|
+
IFilterStandaloneField,
|
|
8
|
+
IFilterRangeGroup,
|
|
9
|
+
TLookupComponentRegistry,
|
|
10
|
+
} from '@base/@types/filters'
|
|
11
|
+
|
|
12
|
+
interface DynamicFilterFieldProps {
|
|
13
|
+
item: TFilterRenderItem
|
|
14
|
+
lookupRegistry?: TLookupComponentRegistry
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Renderiza o componente de formulário correto para um TFilterRenderItem.
|
|
19
|
+
*
|
|
20
|
+
* Regras de renderização:
|
|
21
|
+
* - `kind === 'range'` → DatePickerRange (dois campos DATE+BETWEEN fundidos)
|
|
22
|
+
* - `kind === 'standalone'`:
|
|
23
|
+
* - `lookup != null` → componente do lookupRegistry (async select)
|
|
24
|
+
* - `allowedValues != null` → Select com opções fixas (ENUM)
|
|
25
|
+
* - `dataType === 'DATE'` → DatePicker
|
|
26
|
+
* - `dataType === 'NUMBER'` → Input type="number"
|
|
27
|
+
* - `dataType === 'STRING'` → Input type="text"
|
|
28
|
+
*
|
|
29
|
+
* Deve ser usado DENTRO de um FormProvider.
|
|
30
|
+
*/
|
|
31
|
+
const DynamicFilterField: React.FC<DynamicFilterFieldProps> = ({ item, lookupRegistry }) => {
|
|
32
|
+
if (item.kind === 'range') {
|
|
33
|
+
return <RangeField item={item} />
|
|
34
|
+
}
|
|
35
|
+
return <StandaloneField item={item} lookupRegistry={lookupRegistry} />
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Range field: DatePickerRange gerenciando dois campos reais no form
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
interface RangeFieldProps {
|
|
43
|
+
item: IFilterRangeGroup
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const RangeField: React.FC<RangeFieldProps> = ({ item }) => {
|
|
47
|
+
const { setValue, watch } = useFormContext()
|
|
48
|
+
|
|
49
|
+
const startValue = watch(item.startField.field)
|
|
50
|
+
const endValue = watch(item.endField.field)
|
|
51
|
+
|
|
52
|
+
// Reconstrói o tuple [Date|null, Date|null] a partir das strings armazenadas.
|
|
53
|
+
// Usa 'T00:00:00' para forçar parse em horário local (sem isso, 'YYYY-MM-DD'
|
|
54
|
+
// é interpretado como UTC midnight e exibe um dia anterior no fuso UTC-3).
|
|
55
|
+
const rangeValue: [Date | null, Date | null] = [
|
|
56
|
+
startValue ? new Date(`${startValue}T00:00:00`) : null,
|
|
57
|
+
endValue ? new Date(`${endValue}T00:00:00`) : null,
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
const handleChange = (value: [Date | null, Date | null]) => {
|
|
61
|
+
const [start, end] = value ?? [null, null]
|
|
62
|
+
setValue(item.startField.field, start ? formatDate(start) : null, { shouldDirty: true })
|
|
63
|
+
setValue(item.endField.field, end ? formatDate(end) : null, { shouldDirty: true })
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<FormItem className="text-xs" label={item.label}>
|
|
68
|
+
<DatePickerRange
|
|
69
|
+
size="sm"
|
|
70
|
+
value={rangeValue}
|
|
71
|
+
onChange={handleChange}
|
|
72
|
+
/>
|
|
73
|
+
</FormItem>
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Standalone field: delega para lookup registry ou input genérico
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
interface StandaloneFieldProps {
|
|
82
|
+
item: IFilterStandaloneField
|
|
83
|
+
lookupRegistry?: TLookupComponentRegistry
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const StandaloneField: React.FC<StandaloneFieldProps> = ({ item, lookupRegistry }) => {
|
|
87
|
+
const { descriptor } = item
|
|
88
|
+
const { control } = useFormContext()
|
|
89
|
+
|
|
90
|
+
// Lookup: delega para o componente registrado no microfrontend
|
|
91
|
+
if (descriptor.lookup) {
|
|
92
|
+
const LookupComponent = lookupRegistry?.[descriptor.lookup.resource]
|
|
93
|
+
if (LookupComponent) {
|
|
94
|
+
return (
|
|
95
|
+
<LookupComponent
|
|
96
|
+
name={descriptor.field}
|
|
97
|
+
label={descriptor.label}
|
|
98
|
+
/>
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
// Fallback: lookup não registrado no registry → input de texto simples
|
|
102
|
+
console.warn(
|
|
103
|
+
`[DynamicFilterField] lookup resource "${descriptor.lookup.resource}" não encontrado no registry. ` +
|
|
104
|
+
`Renderizando como input de texto para o campo "${descriptor.field}".`
|
|
105
|
+
)
|
|
106
|
+
// Continua para renderizar o input de texto (fallback seguro)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ENUM: select com opções fixas vindas dos metadados
|
|
110
|
+
if (descriptor.allowedValues && descriptor.allowedValues.length > 0) {
|
|
111
|
+
const options = descriptor.allowedValues.map((opt) => ({
|
|
112
|
+
value: opt.value,
|
|
113
|
+
label: opt.label,
|
|
114
|
+
}))
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<Controller
|
|
118
|
+
name={descriptor.field}
|
|
119
|
+
control={control}
|
|
120
|
+
render={({ field, fieldState: { error } }) => (
|
|
121
|
+
<FormItem
|
|
122
|
+
className="text-xs"
|
|
123
|
+
label={descriptor.label}
|
|
124
|
+
invalid={!!error}
|
|
125
|
+
errorMessage={error?.message}
|
|
126
|
+
>
|
|
127
|
+
<Select
|
|
128
|
+
isClearable
|
|
129
|
+
size="sm"
|
|
130
|
+
placeholder="Selecione uma opção"
|
|
131
|
+
options={options}
|
|
132
|
+
value={options.find((o) => o.value === field.value) ?? null}
|
|
133
|
+
onChange={(opt: { value: string; label: string } | null) =>
|
|
134
|
+
field.onChange(opt?.value ?? null)
|
|
135
|
+
}
|
|
136
|
+
onBlur={field.onBlur}
|
|
137
|
+
/>
|
|
138
|
+
</FormItem>
|
|
139
|
+
)}
|
|
140
|
+
/>
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// DATE com operator EQUALS: DatePicker simples
|
|
145
|
+
if (descriptor.dataType === 'DATE') {
|
|
146
|
+
return (
|
|
147
|
+
<Controller
|
|
148
|
+
name={descriptor.field}
|
|
149
|
+
control={control}
|
|
150
|
+
render={({ field, fieldState: { error } }) => (
|
|
151
|
+
<FormItem
|
|
152
|
+
className="text-xs"
|
|
153
|
+
label={descriptor.label}
|
|
154
|
+
invalid={!!error}
|
|
155
|
+
errorMessage={error?.message}
|
|
156
|
+
>
|
|
157
|
+
<DatePicker
|
|
158
|
+
size="sm"
|
|
159
|
+
className="text-xs"
|
|
160
|
+
placeholder="Selecione uma data"
|
|
161
|
+
value={field.value ? new Date(`${field.value}T00:00:00`) : null}
|
|
162
|
+
onChange={(date: Date | null) =>
|
|
163
|
+
field.onChange(date ? formatDate(date) : null)
|
|
164
|
+
}
|
|
165
|
+
onBlur={field.onBlur}
|
|
166
|
+
/>
|
|
167
|
+
</FormItem>
|
|
168
|
+
)}
|
|
169
|
+
/>
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// NUMBER ou STRING (inclui fallback de lookup não registrado)
|
|
174
|
+
const inputType = descriptor.dataType === 'NUMBER' ? 'number' : 'text'
|
|
175
|
+
|
|
176
|
+
return (
|
|
177
|
+
<Controller
|
|
178
|
+
name={descriptor.field}
|
|
179
|
+
control={control}
|
|
180
|
+
render={({ field, fieldState: { error } }) => (
|
|
181
|
+
<FormItem
|
|
182
|
+
className="text-xs"
|
|
183
|
+
label={descriptor.label}
|
|
184
|
+
invalid={!!error}
|
|
185
|
+
errorMessage={error?.message}
|
|
186
|
+
>
|
|
187
|
+
<Input
|
|
188
|
+
{...field}
|
|
189
|
+
size="sm"
|
|
190
|
+
type={inputType}
|
|
191
|
+
placeholder={`${descriptor.label}`}
|
|
192
|
+
value={field.value ?? ''}
|
|
193
|
+
onChange={(e) => field.onChange(e.target.value || null)}
|
|
194
|
+
/>
|
|
195
|
+
</FormItem>
|
|
196
|
+
)}
|
|
197
|
+
/>
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// Utilitário
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
|
|
205
|
+
/** Formata uma Date para 'YYYY-MM-DD' sem dependências externas */
|
|
206
|
+
function formatDate(date: Date): string {
|
|
207
|
+
const y = date.getFullYear()
|
|
208
|
+
const m = String(date.getMonth() + 1).padStart(2, '0')
|
|
209
|
+
const d = String(date.getDate()).padStart(2, '0')
|
|
210
|
+
return `${y}-${m}-${d}`
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export default DynamicFilterField
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React, { useMemo } from 'react'
|
|
2
|
+
import type { IFilterFieldDescriptor, TLookupComponentRegistry } from '@base/@types/filters'
|
|
3
|
+
import { groupFilterFields } from '@base/utils/filters/groupFilterFields'
|
|
4
|
+
import DynamicFilterField from './DynamicFilterField'
|
|
5
|
+
|
|
6
|
+
interface DynamicFilterPanelProps {
|
|
7
|
+
/** Metadados de filtros vindos do endpoint /filter-metadata */
|
|
8
|
+
fields: IFilterFieldDescriptor[]
|
|
9
|
+
/**
|
|
10
|
+
* Mapa de resource → componente de lookup.
|
|
11
|
+
* Definido pelo microfrontend consumidor — permite que cada app
|
|
12
|
+
* registre os seus próprios componentes de async select.
|
|
13
|
+
*/
|
|
14
|
+
lookupRegistry?: TLookupComponentRegistry
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Renderiza todos os campos de filtro dinamicamente a partir dos metadados do backend.
|
|
19
|
+
*
|
|
20
|
+
* - Agrupa automaticamente campos de range (mesmo rangeGroup + BETWEEN) em um DatePickerRange.
|
|
21
|
+
* - Delega a renderização individual para DynamicFilterField.
|
|
22
|
+
* - Deve ser usado DENTRO de um FormProvider.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* <FormProvider {...methods}>
|
|
26
|
+
* <DynamicFilterPanel
|
|
27
|
+
* fields={metadataFields}
|
|
28
|
+
* lookupRegistry={saldoTicketLookupRegistry}
|
|
29
|
+
* />
|
|
30
|
+
* </FormProvider>
|
|
31
|
+
*/
|
|
32
|
+
const DynamicFilterPanel: React.FC<DynamicFilterPanelProps> = ({ fields, lookupRegistry }) => {
|
|
33
|
+
// groupFilterFields é uma função pura — o useMemo garante que o agrupamento
|
|
34
|
+
// só recalcula quando `fields` muda (na prática, apenas uma vez por sessão)
|
|
35
|
+
const renderItems = useMemo(() => groupFilterFields(fields), [fields])
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<>
|
|
39
|
+
{renderItems.map((item) => (
|
|
40
|
+
<DynamicFilterField
|
|
41
|
+
key={item.kind === 'range' ? `range__${item.rangeGroup}` : item.descriptor.field}
|
|
42
|
+
item={item}
|
|
43
|
+
lookupRegistry={lookupRegistry}
|
|
44
|
+
/>
|
|
45
|
+
))}
|
|
46
|
+
</>
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export default DynamicFilterPanel
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Route components
|
|
3
3
|
export * from './routes';
|
|
4
4
|
|
|
5
|
-
// Table components
|
|
5
|
+
// Table components
|
|
6
6
|
export * from './table';
|
|
7
7
|
|
|
8
8
|
// Tool components
|
|
@@ -10,3 +10,6 @@ export * from './tools';
|
|
|
10
10
|
|
|
11
11
|
// View components
|
|
12
12
|
export * from './views';
|
|
13
|
+
|
|
14
|
+
// Filter components (dynamic metadata-driven filters)
|
|
15
|
+
export * from './filters';
|
|
@@ -11,6 +11,7 @@ const nfe = {
|
|
|
11
11
|
desvincularOrdemCompra: { endpoint: `${NFE_BASE_URL}/desvincular-ordem-compra`, httpMethod: 'post' },
|
|
12
12
|
estornarPedidoCompra: { endpoint: `${NFE_BASE_URL}/estornar-pedido-compra/{numeroPedido}`, httpMethod: 'post' },
|
|
13
13
|
estornarOperacao: { endpoint: `${NFE_BASE_URL}/estornar-operacao?id={id}`, httpMethod: 'post' },
|
|
14
|
+
finalizarPedido: { endpoint: `${NFE_BASE_URL}/finalizar-pedido/{numeroPedido}`, httpMethod: 'post' },
|
|
14
15
|
lock: { endpoint: `${NFE_BASE_URL}/lock`, httpMethod: 'post' },
|
|
15
16
|
}
|
|
16
17
|
|
|
@@ -4,7 +4,8 @@ const saldoTicket = {
|
|
|
4
4
|
historicoById: (id: string, params?: string) => `/originacao/api/saldo-ticket/${id}/historicos?${params ?? ""}`,
|
|
5
5
|
buscarSaldoDisponivel: '/originacao/api/saldo-ticket/saldo-disponivel',
|
|
6
6
|
findAllMetrics: (params?: string) => `/originacao/api/saldo-ticket/metrics?${params ?? ""}`,
|
|
7
|
-
updateStatus: (id: string) => `/originacao/api/saldo-ticket/${id}/forcar-status-saldo
|
|
7
|
+
updateStatus: (id: string) => `/originacao/api/saldo-ticket/${id}/forcar-status-saldo`,
|
|
8
|
+
filterMetadata: '/originacao/api/saldo-ticket/filter-metadata',
|
|
8
9
|
};
|
|
9
10
|
|
|
10
11
|
export default saldoTicket;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import useSWR from 'swr'
|
|
2
|
+
import type { IFilterFieldDescriptor } from '@base/@types/filters'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Busca e faz cache dos metadados de filtros de um endpoint específico.
|
|
6
|
+
*
|
|
7
|
+
* Usa configurações imutáveis de SWR: os dados são buscados uma única vez
|
|
8
|
+
* por sessão e nunca revalidados automaticamente, pois metadados de filtro são
|
|
9
|
+
* estruturais e não mudam durante o uso da aplicação.
|
|
10
|
+
*
|
|
11
|
+
* O `fetcher` deve ser a função de serviço correspondente ao endpoint,
|
|
12
|
+
* garantindo que a chamada passe pelo ApiService (Axios + token de autenticação).
|
|
13
|
+
*
|
|
14
|
+
* @param swrKey - Chave única de cache SWR (ex: '/originacao/api/saldo-ticket/filter-metadata')
|
|
15
|
+
* @param fetcher - Função que realiza a chamada à API e retorna IFilterFieldDescriptor[]
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const { fields, isLoading, error } = useFilterMetadata(
|
|
19
|
+
* '/originacao/api/saldo-ticket/filter-metadata',
|
|
20
|
+
* apiFindSaldoFilterMetadata,
|
|
21
|
+
* )
|
|
22
|
+
*/
|
|
23
|
+
export default function useFilterMetadata(
|
|
24
|
+
swrKey: string,
|
|
25
|
+
fetcher: () => Promise<IFilterFieldDescriptor[]>,
|
|
26
|
+
) {
|
|
27
|
+
const { data, error, isLoading } = useSWR<IFilterFieldDescriptor[]>(
|
|
28
|
+
swrKey || null,
|
|
29
|
+
fetcher,
|
|
30
|
+
{
|
|
31
|
+
revalidateOnFocus: false,
|
|
32
|
+
revalidateOnReconnect: false,
|
|
33
|
+
revalidateIfStale: false,
|
|
34
|
+
dedupingInterval: 600_000, // 10 minutos — metadados são imutáveis por sessão
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
fields: data ?? [],
|
|
40
|
+
isLoading,
|
|
41
|
+
error,
|
|
42
|
+
}
|
|
43
|
+
}
|
package/lib/base/hooks/index.ts
CHANGED
|
@@ -77,4 +77,5 @@ export { default as useIdleTimeout } from './useIdleTimeout';
|
|
|
77
77
|
export { default as useFindProdutosByDepositoList } from './dm/produto/useFindProdutosByDepositoList';
|
|
78
78
|
export { default as useBusinessPartnerFindMonitorTransportadoraList } from './dm/businessPartner/useBusinessPartnerFindMonitorTransportadoraList';
|
|
79
79
|
export { default as useSapFindUniaoUtilizacaoLimiteCreditoByBusinessPartner } from './sap/uniaoUtilizacaoLimiteCredito/useSapFindUniaoUtilizacaoLimiteCreditoByCliente';
|
|
80
|
-
export { default as useDadosUnificadosList } from './crm/dadosUnificados/useDadosUnificadosList';
|
|
80
|
+
export { default as useDadosUnificadosList } from './crm/dadosUnificados/useDadosUnificadosList';
|
|
81
|
+
export { default as useFilterMetadata } from './filters/useFilterMetadata';
|
|
@@ -82,6 +82,14 @@ export async function apiEstornarOperacao(id: number) {
|
|
|
82
82
|
})
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
export async function apiFinalizarPedido(numeroPedido: string) {
|
|
86
|
+
return ApiService.fetchDataWithAxios<any>({
|
|
87
|
+
url: NFE_ENDPOINT.finalizarPedido.endpoint
|
|
88
|
+
.replace('{numeroPedido}', numeroPedido),
|
|
89
|
+
method: NFE_ENDPOINT.finalizarPedido.httpMethod
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
|
|
85
93
|
export async function apiSetNfeLock(idNfe: number, lock: boolean) {
|
|
86
94
|
return ApiService.fetchDataWithAxios<any>({
|
|
87
95
|
url: NFE_ENDPOINT.lock.endpoint,
|
|
@@ -7,6 +7,7 @@ import { TFindAllMetricsSaldoResponse } from "@base/@types/api/response/originac
|
|
|
7
7
|
import { TEntityHistoricoResponse } from "@base/@types/api/response/originacao/TEntityHistoricoResponse";
|
|
8
8
|
import { StatusSaldoTicket } from "@base/@types/enums/originacao/StatusSaldoTicket";
|
|
9
9
|
import { TipoSaldo } from "@base/@types/enums/originacao/TipoSaldo";
|
|
10
|
+
import { IFilterFieldDescriptor } from "@base/@types/filters";
|
|
10
11
|
|
|
11
12
|
const SALDO_TICKET_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.saldoTicket;
|
|
12
13
|
|
|
@@ -62,4 +63,11 @@ export async function apiUpdateStatusSaldoTicket(
|
|
|
62
63
|
justificativa
|
|
63
64
|
}
|
|
64
65
|
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function apiFindSaldoFilterMetadata() {
|
|
69
|
+
return ApiService.fetchDataWithAxios<IFilterFieldDescriptor[]>({
|
|
70
|
+
url: SALDO_TICKET_ORIGINACAO_ENDPOINT.filterMetadata,
|
|
71
|
+
method: "get",
|
|
72
|
+
});
|
|
65
73
|
}
|