siesa-ui-kit 1.0.147 → 1.0.148

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/{BarChart-CvmMmIXu.js → BarChart-C-i5of4Y.js} +5 -5
  2. package/dist/{BarChart-CvmMmIXu.js.map → BarChart-C-i5of4Y.js.map} +1 -1
  3. package/dist/{BarChart--Y6K95vz.cjs → BarChart-Rjocw3H9.cjs} +2 -2
  4. package/dist/{BarChart--Y6K95vz.cjs.map → BarChart-Rjocw3H9.cjs.map} +1 -1
  5. package/dist/{ChartBarHorizontal-Hz6VgTcd.cjs → ChartBarHorizontal-BdWLXuku.cjs} +2 -2
  6. package/dist/{ChartBarHorizontal-Hz6VgTcd.cjs.map → ChartBarHorizontal-BdWLXuku.cjs.map} +1 -1
  7. package/dist/{ChartBarHorizontal-SjgHGKb3.js → ChartBarHorizontal-DL96XTcK.js} +5 -5
  8. package/dist/{ChartBarHorizontal-SjgHGKb3.js.map → ChartBarHorizontal-DL96XTcK.js.map} +1 -1
  9. package/dist/{ChartDonut-lyBGgzMK.js → ChartDonut-BSE8fjqa.js} +5 -5
  10. package/dist/{ChartDonut-lyBGgzMK.js.map → ChartDonut-BSE8fjqa.js.map} +1 -1
  11. package/dist/{ChartDonut-DzVMDmqN.cjs → ChartDonut-DgxhaVoj.cjs} +2 -2
  12. package/dist/{ChartDonut-DzVMDmqN.cjs.map → ChartDonut-DgxhaVoj.cjs.map} +1 -1
  13. package/dist/{ChartLine-BdmX_xGy.cjs → ChartLine-BdUvE4At.cjs} +2 -2
  14. package/dist/{ChartLine-BdmX_xGy.cjs.map → ChartLine-BdUvE4At.cjs.map} +1 -1
  15. package/dist/{ChartLine-DLWVzmS2.js → ChartLine-D-vVWI3t.js} +4 -4
  16. package/dist/{ChartLine-DLWVzmS2.js.map → ChartLine-D-vVWI3t.js.map} +1 -1
  17. package/dist/{ChartVentasMensual-BcX5Qpy1.cjs → ChartVentasMensual-B3eyj9f3.cjs} +2 -2
  18. package/dist/{ChartVentasMensual-BcX5Qpy1.cjs.map → ChartVentasMensual-B3eyj9f3.cjs.map} +1 -1
  19. package/dist/{ChartVentasMensual-4tR8QITV.js → ChartVentasMensual-ClCePaTo.js} +5 -5
  20. package/dist/{ChartVentasMensual-4tR8QITV.js.map → ChartVentasMensual-ClCePaTo.js.map} +1 -1
  21. package/dist/{KpiVentasHoy-DFGjBgPP.js → KpiVentasHoy-BEQ7IUea.js} +2 -2
  22. package/dist/{KpiVentasHoy-DFGjBgPP.js.map → KpiVentasHoy-BEQ7IUea.js.map} +1 -1
  23. package/dist/{KpiVentasHoy-e72249lU.cjs → KpiVentasHoy-BpaAS9KS.cjs} +2 -2
  24. package/dist/{KpiVentasHoy-e72249lU.cjs.map → KpiVentasHoy-BpaAS9KS.cjs.map} +1 -1
  25. package/dist/{StaticImageWidget-DRyIz6pc.js → StaticImageWidget-BJvBq0mX.js} +2 -2
  26. package/dist/{StaticImageWidget-DRyIz6pc.js.map → StaticImageWidget-BJvBq0mX.js.map} +1 -1
  27. package/dist/{StaticImageWidget-DUlJD1I6.cjs → StaticImageWidget-BVD72zyl.cjs} +2 -2
  28. package/dist/{StaticImageWidget-DUlJD1I6.cjs.map → StaticImageWidget-BVD72zyl.cjs.map} +1 -1
  29. package/dist/{TableStockCritico-BUnNpMgt.cjs → TableStockCritico-B01RIs_D.cjs} +2 -2
  30. package/dist/{TableStockCritico-BUnNpMgt.cjs.map → TableStockCritico-B01RIs_D.cjs.map} +1 -1
  31. package/dist/{TableStockCritico-BYdApQed.js → TableStockCritico-CQPn8Pbf.js} +3 -3
  32. package/dist/{TableStockCritico-BYdApQed.js.map → TableStockCritico-CQPn8Pbf.js.map} +1 -1
  33. package/dist/{aggregateChartData-DOX-R8x3.cjs → aggregateChartData-CJTTxh2k.cjs} +2 -2
  34. package/dist/{aggregateChartData-DOX-R8x3.cjs.map → aggregateChartData-CJTTxh2k.cjs.map} +1 -1
  35. package/dist/{aggregateChartData-B2UAW-WP.js → aggregateChartData-DfMWQUiV.js} +2 -2
  36. package/dist/{aggregateChartData-B2UAW-WP.js.map → aggregateChartData-DfMWQUiV.js.map} +1 -1
  37. package/dist/components/MasterDocument/HeaderRenderer.d.ts.map +1 -1
  38. package/dist/components/MasterDocument/MasterDocument.types.d.ts +14 -0
  39. package/dist/components/MasterDocument/MasterDocument.types.d.ts.map +1 -1
  40. package/dist/components/MasterDocument/smart/SmartMasterDocument.d.ts.map +1 -1
  41. package/dist/{index-DieYMRjT.cjs → index-DOwUCRbF.cjs} +3 -3
  42. package/dist/{index-DieYMRjT.cjs.map → index-DOwUCRbF.cjs.map} +1 -1
  43. package/dist/{index-BMDgaTO4.js → index-D_AyI9xa.js} +13 -9
  44. package/dist/{index-BMDgaTO4.js.map → index-D_AyI9xa.js.map} +1 -1
  45. package/dist/siesa-ui-kit.cjs +1 -1
  46. package/dist/siesa-ui-kit.mjs +1 -1
  47. package/dist/{tooltipContext-CH5FhWSK.js → tooltipContext-Bm4TsIIS.js} +2 -2
  48. package/dist/{tooltipContext-CH5FhWSK.js.map → tooltipContext-Bm4TsIIS.js.map} +1 -1
  49. package/dist/{tooltipContext-DMgzQCQh.cjs → tooltipContext-DYc8x5pj.cjs} +2 -2
  50. package/dist/{tooltipContext-DMgzQCQh.cjs.map → tooltipContext-DYc8x5pj.cjs.map} +1 -1
  51. package/dist/{useChartData-0fNBg8Ez.cjs → useChartData-CJq1lJYY.cjs} +2 -2
  52. package/dist/{useChartData-0fNBg8Ez.cjs.map → useChartData-CJq1lJYY.cjs.map} +1 -1
  53. package/dist/{useChartData-CTX9NnMa.js → useChartData-CzMMMf58.js} +4 -4
  54. package/dist/{useChartData-CTX9NnMa.js.map → useChartData-CzMMMf58.js.map} +1 -1
  55. package/dist/{useWidgetFetch-KHtyWHSX.cjs → useWidgetFetch-BkxK2-zy.cjs} +2 -2
  56. package/dist/{useWidgetFetch-KHtyWHSX.cjs.map → useWidgetFetch-BkxK2-zy.cjs.map} +1 -1
  57. package/dist/{useWidgetFetch-C43Q4m8v.js → useWidgetFetch-fkAbLXjl.js} +2 -2
  58. package/dist/{useWidgetFetch-C43Q4m8v.js.map → useWidgetFetch-fkAbLXjl.js.map} +1 -1
  59. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";const p=require("@tanstack/react-query"),f=require("./index-DieYMRjT.cjs"),m=async(t,r)=>{const e=await r("/api/dashboard/proxy/fetch",{method:"POST",body:t});return e==null||typeof e!="object"?(console.error("[KPI Dashboard] Proxy devolvió respuesta inválida:",e),{data:null,schema:null,endpointMeta:null}):(e.data===void 0&&console.warn('[KPI Dashboard] Proxy response sin campo "data". Widget:',t.widgetId),{data:e.data??null,schema:e.schema??null,endpointMeta:e.endpointMeta??null})};function y(t,r){return r.split(".").reduce((e,a)=>e!=null&&typeof e=="object"?e[a]:void 0,t)}function h(t,r){const e=Object.entries(r);if(e.length===0)return t;if(process.env.NODE_ENV==="development"){const n=Array.isArray(t)?t[0]:t;if(n&&typeof n=="object")for(const[,o]of e)o.split(".")[0]in n||console.warn(`[KPI Dashboard] field_mapping.rename: el campo "${o}" no existe en la respuesta del endpoint. Verificar que el nombre coincida exactamente con el campo devuelto por la API.`)}const a=n=>{const o={...n};for(const[i,s]of e){const l=s.includes(".")?y(n,s):n[s];l!==void 0&&(o[i]=l)}return o};return Array.isArray(t)?t.map(n=>typeof n=="object"&&n!==null?a(n):n):typeof t=="object"&&t!==null?a(t):t}function v(t,r,e,a){const{fetcher:n}=f.useDashboardContext(),{data:o,isLoading:i,error:s}=p.useQuery({queryKey:["widget-data",t,r],queryFn:async()=>{const{data:l,schema:u,endpointMeta:d}=await m({widgetId:t,period:r},n);let c=l;return a&&Object.keys(a).length>0&&(c=h(l,a)),{data:c,schema:u,meta:d}},refetchInterval:e&&e>0?Math.max(e,10)*1e3:!1});return{data:o?.data??null,schema:o?.schema??null,meta:o?.meta??null,loading:i,error:s?s.message:null}}exports.useWidgetFetch=v;
2
- //# sourceMappingURL=useWidgetFetch-KHtyWHSX.cjs.map
1
+ "use strict";const p=require("@tanstack/react-query"),f=require("./index-DOwUCRbF.cjs"),m=async(t,r)=>{const e=await r("/api/dashboard/proxy/fetch",{method:"POST",body:t});return e==null||typeof e!="object"?(console.error("[KPI Dashboard] Proxy devolvió respuesta inválida:",e),{data:null,schema:null,endpointMeta:null}):(e.data===void 0&&console.warn('[KPI Dashboard] Proxy response sin campo "data". Widget:',t.widgetId),{data:e.data??null,schema:e.schema??null,endpointMeta:e.endpointMeta??null})};function y(t,r){return r.split(".").reduce((e,a)=>e!=null&&typeof e=="object"?e[a]:void 0,t)}function h(t,r){const e=Object.entries(r);if(e.length===0)return t;if(process.env.NODE_ENV==="development"){const n=Array.isArray(t)?t[0]:t;if(n&&typeof n=="object")for(const[,o]of e)o.split(".")[0]in n||console.warn(`[KPI Dashboard] field_mapping.rename: el campo "${o}" no existe en la respuesta del endpoint. Verificar que el nombre coincida exactamente con el campo devuelto por la API.`)}const a=n=>{const o={...n};for(const[i,s]of e){const l=s.includes(".")?y(n,s):n[s];l!==void 0&&(o[i]=l)}return o};return Array.isArray(t)?t.map(n=>typeof n=="object"&&n!==null?a(n):n):typeof t=="object"&&t!==null?a(t):t}function v(t,r,e,a){const{fetcher:n}=f.useDashboardContext(),{data:o,isLoading:i,error:s}=p.useQuery({queryKey:["widget-data",t,r],queryFn:async()=>{const{data:l,schema:u,endpointMeta:d}=await m({widgetId:t,period:r},n);let c=l;return a&&Object.keys(a).length>0&&(c=h(l,a)),{data:c,schema:u,meta:d}},refetchInterval:e&&e>0?Math.max(e,10)*1e3:!1});return{data:o?.data??null,schema:o?.schema??null,meta:o?.meta??null,loading:i,error:s?s.message:null}}exports.useWidgetFetch=v;
2
+ //# sourceMappingURL=useWidgetFetch-BkxK2-zy.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWidgetFetch-KHtyWHSX.cjs","sources":["../src/dashboard/api/dashboardProxy.ts","../src/dashboard/hooks/useWidgetFetch.ts"],"sourcesContent":["import type { FetchProxyPayload, DashboardFetcher, SchemaField } from '../types';\n\nexport interface EndpointMeta {\n generatedAt?: string;\n period?: string;\n rowCount?: number;\n}\n\nexport interface ProxyFetchResult {\n data: unknown;\n schema: { fields: SchemaField[] } | null;\n endpointMeta: EndpointMeta | null;\n}\n\n/**\n * Solicita datos de un widget al Proxy del backend.\n * Retorna data + schema (si el endpoint devolvió envelope estándar).\n */\nexport const fetchWidgetDataProxy = async (\n payload: FetchProxyPayload,\n fetcher: DashboardFetcher\n): Promise<ProxyFetchResult> => {\n const response = await fetcher<{\n source: string;\n timestamp: string;\n data: unknown;\n schema?: { fields: SchemaField[] };\n endpointMeta?: EndpointMeta;\n }>('/api/dashboard/proxy/fetch', {\n method: 'POST',\n body: payload,\n });\n\n // Validación defensiva: el proxy puede devolver estructura inesperada si el backend cambia\n if (response === null || response === undefined || typeof response !== 'object') {\n console.error('[KPI Dashboard] Proxy devolvió respuesta inválida:', response);\n return { data: null, schema: null, endpointMeta: null };\n }\n\n if ((response as Record<string, unknown>).data === undefined) {\n console.warn('[KPI Dashboard] Proxy response sin campo \"data\". Widget:', payload.widgetId);\n }\n\n return {\n data: response.data ?? null,\n schema: response.schema ?? null,\n endpointMeta: response.endpointMeta ?? null,\n };\n};\n\n/**\n * Invalida la caché del proxy para un widget.\n * DELETE /api/dashboard/proxy/cache/:widgetId\n */\nexport const invalidateWidgetCache = async (\n widgetId: string,\n fetcher: DashboardFetcher\n): Promise<void> => {\n await fetcher(`/api/dashboard/proxy/cache/${widgetId}`, { method: 'DELETE' });\n};\n","import { useQuery } from '@tanstack/react-query';\nimport type { DashboardPeriod, SchemaField } from '../types';\nimport type { EndpointMeta } from '../api/dashboardProxy';\nimport { fetchWidgetDataProxy } from '../api/dashboardProxy';\nimport { useDashboardContext } from '../DashboardContext';\n\ninterface UseWidgetFetchResult<T> {\n data: T | null;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n loading: boolean;\n error: string | null;\n}\n\n/** Accede a un valor anidado via dot-notation (ej: \"name.common\" → obj.name.common) */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((acc, key) =>\n acc != null && typeof acc === 'object' ? (acc as Record<string, unknown>)[key] : undefined, obj);\n}\n\nfunction applyFieldMapping(data: unknown, mapping: Record<string, string>): unknown {\n const entries = Object.entries(mapping);\n if (entries.length === 0) return data;\n\n // Advertir en desarrollo si el campo a renombrar no existe en la respuesta\n if (process.env.NODE_ENV === 'development') {\n const sample = Array.isArray(data) ? data[0] : data;\n if (sample && typeof sample === 'object') {\n for (const [, apiField] of entries) {\n const topLevelField = apiField.split('.')[0];\n if (!(topLevelField in (sample as object))) {\n // eslint-disable-next-line no-console\n console.warn(\n `[KPI Dashboard] field_mapping.rename: el campo \"${apiField}\" no existe en la respuesta del endpoint. ` +\n `Verificar que el nombre coincida exactamente con el campo devuelto por la API.`\n );\n }\n }\n }\n }\n\n const mapObject = (obj: Record<string, unknown>): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...obj };\n for (const [widgetField, apiField] of entries) {\n const val = apiField.includes('.') ? getNestedValue(obj, apiField) : obj[apiField];\n if (val !== undefined) {\n result[widgetField] = val;\n }\n }\n return result;\n };\n\n if (Array.isArray(data)) {\n return data.map(item =>\n typeof item === 'object' && item !== null ? mapObject(item as Record<string, unknown>) : item\n );\n }\n\n if (typeof data === 'object' && data !== null) {\n return mapObject(data as Record<string, unknown>);\n }\n\n return data;\n}\n\ninterface CachedQueryData<T> {\n data: T;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n}\n\n/**\n * Hook centralizado para fetching de datos de widgets.\n * Retorna data (post field_mapping) + schema del endpoint (si disponible).\n */\nexport function useWidgetFetch<T>(\n widgetId: string,\n period: DashboardPeriod,\n refreshPolicy?: number,\n fieldMapping?: Record<string, string>\n): UseWidgetFetchResult<T> {\n const { fetcher } = useDashboardContext();\n\n const { data: result, isLoading, error } = useQuery<CachedQueryData<T>>({\n queryKey: ['widget-data', widgetId, period],\n queryFn: async () => {\n const { data: raw, schema, endpointMeta } = await fetchWidgetDataProxy({ widgetId, period }, fetcher);\n let mapped = raw;\n if (fieldMapping && Object.keys(fieldMapping).length > 0) {\n mapped = applyFieldMapping(raw, fieldMapping);\n }\n return { data: mapped as T, schema, meta: endpointMeta };\n },\n // Mínimo 10 segundos para evitar polling agresivo por configuración incorrecta\n refetchInterval: refreshPolicy && refreshPolicy > 0\n ? Math.max(refreshPolicy, 10) * 1000\n : false,\n });\n\n return {\n data: result?.data ?? null,\n schema: result?.schema ?? null,\n meta: result?.meta ?? null,\n loading: isLoading,\n error: error ? (error as Error).message : null,\n };\n}\n"],"names":["fetchWidgetDataProxy","payload","fetcher","response","getNestedValue","obj","path","acc","key","applyFieldMapping","data","mapping","entries","sample","apiField","mapObject","result","widgetField","val","item","useWidgetFetch","widgetId","period","refreshPolicy","fieldMapping","useDashboardContext","isLoading","error","useQuery","raw","schema","endpointMeta","mapped"],"mappings":"wFAkBaA,EAAuB,MAClCC,EACAC,IAC8B,CAC9B,MAAMC,EAAW,MAAMD,EAMpB,6BAA8B,CAC/B,OAAQ,OACR,KAAMD,CAAA,CACP,EAGD,OAAIE,GAAa,MAAkC,OAAOA,GAAa,UACrE,QAAQ,MAAM,qDAAsDA,CAAQ,EACrE,CAAE,KAAM,KAAM,OAAQ,KAAM,aAAc,IAAA,IAG9CA,EAAqC,OAAS,QACjD,QAAQ,KAAK,2DAA4DF,EAAQ,QAAQ,EAGpF,CACL,KAAME,EAAS,MAAQ,KACvB,OAAQA,EAAS,QAAU,KAC3B,aAAcA,EAAS,cAAgB,IAAA,EAE3C,ECjCA,SAASC,EAAeC,EAA8BC,EAAuB,CAC3E,OAAOA,EAAK,MAAM,GAAG,EAAE,OAAgB,CAACC,EAAKC,IAC3CD,GAAO,MAAQ,OAAOA,GAAQ,SAAYA,EAAgCC,CAAG,EAAI,OAAWH,CAAG,CACnG,CAEA,SAASI,EAAkBC,EAAeC,EAA0C,CAClF,MAAMC,EAAU,OAAO,QAAQD,CAAO,EACtC,GAAIC,EAAQ,SAAW,EAAG,OAAOF,EAGjC,GAAI,QAAQ,IAAI,WAAa,cAAe,CAC1C,MAAMG,EAAS,MAAM,QAAQH,CAAI,EAAIA,EAAK,CAAC,EAAIA,EAC/C,GAAIG,GAAU,OAAOA,GAAW,SAC9B,SAAW,CAAA,CAAGC,CAAQ,IAAKF,EACHE,EAAS,MAAM,GAAG,EAAE,CAAC,IACnBD,GAEtB,QAAQ,KACN,mDAAmDC,CAAQ,0HAAA,CAMrE,CAEA,MAAMC,EAAaV,GAA0D,CAC3E,MAAMW,EAAkC,CAAE,GAAGX,CAAA,EAC7C,SAAW,CAACY,EAAaH,CAAQ,IAAKF,EAAS,CAC7C,MAAMM,EAAMJ,EAAS,SAAS,GAAG,EAAIV,EAAeC,EAAKS,CAAQ,EAAIT,EAAIS,CAAQ,EAC7EI,IAAQ,SACVF,EAAOC,CAAW,EAAIC,EAE1B,CACA,OAAOF,CACT,EAEA,OAAI,MAAM,QAAQN,CAAI,EACbA,EAAK,IAAIS,GACd,OAAOA,GAAS,UAAYA,IAAS,KAAOJ,EAAUI,CAA+B,EAAIA,CAAA,EAIzF,OAAOT,GAAS,UAAYA,IAAS,KAChCK,EAAUL,CAA+B,EAG3CA,CACT,CAYO,SAASU,EACdC,EACAC,EACAC,EACAC,EACyB,CACzB,KAAM,CAAE,QAAAtB,CAAA,EAAYuB,sBAAA,EAEd,CAAE,KAAMT,EAAQ,UAAAU,EAAW,MAAAC,CAAA,EAAUC,EAAAA,SAA6B,CACtE,SAAU,CAAC,cAAeP,EAAUC,CAAM,EAC1C,QAAS,SAAY,CACnB,KAAM,CAAE,KAAMO,EAAK,OAAAC,EAAQ,aAAAC,CAAA,EAAiB,MAAM/B,EAAqB,CAAE,SAAAqB,EAAU,OAAAC,CAAA,EAAUpB,CAAO,EACpG,IAAI8B,EAASH,EACb,OAAIL,GAAgB,OAAO,KAAKA,CAAY,EAAE,OAAS,IACrDQ,EAASvB,EAAkBoB,EAAKL,CAAY,GAEvC,CAAE,KAAMQ,EAAa,OAAAF,EAAQ,KAAMC,CAAA,CAC5C,EAEA,gBAAiBR,GAAiBA,EAAgB,EAC9C,KAAK,IAAIA,EAAe,EAAE,EAAI,IAC9B,EAAA,CACL,EAED,MAAO,CACL,KAAMP,GAAQ,MAAQ,KACtB,OAAQA,GAAQ,QAAU,KAC1B,KAAMA,GAAQ,MAAQ,KACtB,QAASU,EACT,MAAOC,EAASA,EAAgB,QAAU,IAAA,CAE9C"}
1
+ {"version":3,"file":"useWidgetFetch-BkxK2-zy.cjs","sources":["../src/dashboard/api/dashboardProxy.ts","../src/dashboard/hooks/useWidgetFetch.ts"],"sourcesContent":["import type { FetchProxyPayload, DashboardFetcher, SchemaField } from '../types';\n\nexport interface EndpointMeta {\n generatedAt?: string;\n period?: string;\n rowCount?: number;\n}\n\nexport interface ProxyFetchResult {\n data: unknown;\n schema: { fields: SchemaField[] } | null;\n endpointMeta: EndpointMeta | null;\n}\n\n/**\n * Solicita datos de un widget al Proxy del backend.\n * Retorna data + schema (si el endpoint devolvió envelope estándar).\n */\nexport const fetchWidgetDataProxy = async (\n payload: FetchProxyPayload,\n fetcher: DashboardFetcher\n): Promise<ProxyFetchResult> => {\n const response = await fetcher<{\n source: string;\n timestamp: string;\n data: unknown;\n schema?: { fields: SchemaField[] };\n endpointMeta?: EndpointMeta;\n }>('/api/dashboard/proxy/fetch', {\n method: 'POST',\n body: payload,\n });\n\n // Validación defensiva: el proxy puede devolver estructura inesperada si el backend cambia\n if (response === null || response === undefined || typeof response !== 'object') {\n console.error('[KPI Dashboard] Proxy devolvió respuesta inválida:', response);\n return { data: null, schema: null, endpointMeta: null };\n }\n\n if ((response as Record<string, unknown>).data === undefined) {\n console.warn('[KPI Dashboard] Proxy response sin campo \"data\". Widget:', payload.widgetId);\n }\n\n return {\n data: response.data ?? null,\n schema: response.schema ?? null,\n endpointMeta: response.endpointMeta ?? null,\n };\n};\n\n/**\n * Invalida la caché del proxy para un widget.\n * DELETE /api/dashboard/proxy/cache/:widgetId\n */\nexport const invalidateWidgetCache = async (\n widgetId: string,\n fetcher: DashboardFetcher\n): Promise<void> => {\n await fetcher(`/api/dashboard/proxy/cache/${widgetId}`, { method: 'DELETE' });\n};\n","import { useQuery } from '@tanstack/react-query';\nimport type { DashboardPeriod, SchemaField } from '../types';\nimport type { EndpointMeta } from '../api/dashboardProxy';\nimport { fetchWidgetDataProxy } from '../api/dashboardProxy';\nimport { useDashboardContext } from '../DashboardContext';\n\ninterface UseWidgetFetchResult<T> {\n data: T | null;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n loading: boolean;\n error: string | null;\n}\n\n/** Accede a un valor anidado via dot-notation (ej: \"name.common\" → obj.name.common) */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((acc, key) =>\n acc != null && typeof acc === 'object' ? (acc as Record<string, unknown>)[key] : undefined, obj);\n}\n\nfunction applyFieldMapping(data: unknown, mapping: Record<string, string>): unknown {\n const entries = Object.entries(mapping);\n if (entries.length === 0) return data;\n\n // Advertir en desarrollo si el campo a renombrar no existe en la respuesta\n if (process.env.NODE_ENV === 'development') {\n const sample = Array.isArray(data) ? data[0] : data;\n if (sample && typeof sample === 'object') {\n for (const [, apiField] of entries) {\n const topLevelField = apiField.split('.')[0];\n if (!(topLevelField in (sample as object))) {\n // eslint-disable-next-line no-console\n console.warn(\n `[KPI Dashboard] field_mapping.rename: el campo \"${apiField}\" no existe en la respuesta del endpoint. ` +\n `Verificar que el nombre coincida exactamente con el campo devuelto por la API.`\n );\n }\n }\n }\n }\n\n const mapObject = (obj: Record<string, unknown>): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...obj };\n for (const [widgetField, apiField] of entries) {\n const val = apiField.includes('.') ? getNestedValue(obj, apiField) : obj[apiField];\n if (val !== undefined) {\n result[widgetField] = val;\n }\n }\n return result;\n };\n\n if (Array.isArray(data)) {\n return data.map(item =>\n typeof item === 'object' && item !== null ? mapObject(item as Record<string, unknown>) : item\n );\n }\n\n if (typeof data === 'object' && data !== null) {\n return mapObject(data as Record<string, unknown>);\n }\n\n return data;\n}\n\ninterface CachedQueryData<T> {\n data: T;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n}\n\n/**\n * Hook centralizado para fetching de datos de widgets.\n * Retorna data (post field_mapping) + schema del endpoint (si disponible).\n */\nexport function useWidgetFetch<T>(\n widgetId: string,\n period: DashboardPeriod,\n refreshPolicy?: number,\n fieldMapping?: Record<string, string>\n): UseWidgetFetchResult<T> {\n const { fetcher } = useDashboardContext();\n\n const { data: result, isLoading, error } = useQuery<CachedQueryData<T>>({\n queryKey: ['widget-data', widgetId, period],\n queryFn: async () => {\n const { data: raw, schema, endpointMeta } = await fetchWidgetDataProxy({ widgetId, period }, fetcher);\n let mapped = raw;\n if (fieldMapping && Object.keys(fieldMapping).length > 0) {\n mapped = applyFieldMapping(raw, fieldMapping);\n }\n return { data: mapped as T, schema, meta: endpointMeta };\n },\n // Mínimo 10 segundos para evitar polling agresivo por configuración incorrecta\n refetchInterval: refreshPolicy && refreshPolicy > 0\n ? Math.max(refreshPolicy, 10) * 1000\n : false,\n });\n\n return {\n data: result?.data ?? null,\n schema: result?.schema ?? null,\n meta: result?.meta ?? null,\n loading: isLoading,\n error: error ? (error as Error).message : null,\n };\n}\n"],"names":["fetchWidgetDataProxy","payload","fetcher","response","getNestedValue","obj","path","acc","key","applyFieldMapping","data","mapping","entries","sample","apiField","mapObject","result","widgetField","val","item","useWidgetFetch","widgetId","period","refreshPolicy","fieldMapping","useDashboardContext","isLoading","error","useQuery","raw","schema","endpointMeta","mapped"],"mappings":"wFAkBaA,EAAuB,MAClCC,EACAC,IAC8B,CAC9B,MAAMC,EAAW,MAAMD,EAMpB,6BAA8B,CAC/B,OAAQ,OACR,KAAMD,CAAA,CACP,EAGD,OAAIE,GAAa,MAAkC,OAAOA,GAAa,UACrE,QAAQ,MAAM,qDAAsDA,CAAQ,EACrE,CAAE,KAAM,KAAM,OAAQ,KAAM,aAAc,IAAA,IAG9CA,EAAqC,OAAS,QACjD,QAAQ,KAAK,2DAA4DF,EAAQ,QAAQ,EAGpF,CACL,KAAME,EAAS,MAAQ,KACvB,OAAQA,EAAS,QAAU,KAC3B,aAAcA,EAAS,cAAgB,IAAA,EAE3C,ECjCA,SAASC,EAAeC,EAA8BC,EAAuB,CAC3E,OAAOA,EAAK,MAAM,GAAG,EAAE,OAAgB,CAACC,EAAKC,IAC3CD,GAAO,MAAQ,OAAOA,GAAQ,SAAYA,EAAgCC,CAAG,EAAI,OAAWH,CAAG,CACnG,CAEA,SAASI,EAAkBC,EAAeC,EAA0C,CAClF,MAAMC,EAAU,OAAO,QAAQD,CAAO,EACtC,GAAIC,EAAQ,SAAW,EAAG,OAAOF,EAGjC,GAAI,QAAQ,IAAI,WAAa,cAAe,CAC1C,MAAMG,EAAS,MAAM,QAAQH,CAAI,EAAIA,EAAK,CAAC,EAAIA,EAC/C,GAAIG,GAAU,OAAOA,GAAW,SAC9B,SAAW,CAAA,CAAGC,CAAQ,IAAKF,EACHE,EAAS,MAAM,GAAG,EAAE,CAAC,IACnBD,GAEtB,QAAQ,KACN,mDAAmDC,CAAQ,0HAAA,CAMrE,CAEA,MAAMC,EAAaV,GAA0D,CAC3E,MAAMW,EAAkC,CAAE,GAAGX,CAAA,EAC7C,SAAW,CAACY,EAAaH,CAAQ,IAAKF,EAAS,CAC7C,MAAMM,EAAMJ,EAAS,SAAS,GAAG,EAAIV,EAAeC,EAAKS,CAAQ,EAAIT,EAAIS,CAAQ,EAC7EI,IAAQ,SACVF,EAAOC,CAAW,EAAIC,EAE1B,CACA,OAAOF,CACT,EAEA,OAAI,MAAM,QAAQN,CAAI,EACbA,EAAK,IAAIS,GACd,OAAOA,GAAS,UAAYA,IAAS,KAAOJ,EAAUI,CAA+B,EAAIA,CAAA,EAIzF,OAAOT,GAAS,UAAYA,IAAS,KAChCK,EAAUL,CAA+B,EAG3CA,CACT,CAYO,SAASU,EACdC,EACAC,EACAC,EACAC,EACyB,CACzB,KAAM,CAAE,QAAAtB,CAAA,EAAYuB,sBAAA,EAEd,CAAE,KAAMT,EAAQ,UAAAU,EAAW,MAAAC,CAAA,EAAUC,EAAAA,SAA6B,CACtE,SAAU,CAAC,cAAeP,EAAUC,CAAM,EAC1C,QAAS,SAAY,CACnB,KAAM,CAAE,KAAMO,EAAK,OAAAC,EAAQ,aAAAC,CAAA,EAAiB,MAAM/B,EAAqB,CAAE,SAAAqB,EAAU,OAAAC,CAAA,EAAUpB,CAAO,EACpG,IAAI8B,EAASH,EACb,OAAIL,GAAgB,OAAO,KAAKA,CAAY,EAAE,OAAS,IACrDQ,EAASvB,EAAkBoB,EAAKL,CAAY,GAEvC,CAAE,KAAMQ,EAAa,OAAAF,EAAQ,KAAMC,CAAA,CAC5C,EAEA,gBAAiBR,GAAiBA,EAAgB,EAC9C,KAAK,IAAIA,EAAe,EAAE,EAAI,IAC9B,EAAA,CACL,EAED,MAAO,CACL,KAAMP,GAAQ,MAAQ,KACtB,OAAQA,GAAQ,QAAU,KAC1B,KAAMA,GAAQ,MAAQ,KACtB,QAASU,EACT,MAAOC,EAASA,EAAgB,QAAU,IAAA,CAE9C"}
@@ -1,5 +1,5 @@
1
1
  import { useQuery as p } from "@tanstack/react-query";
2
- import { m as f } from "./index-BMDgaTO4.js";
2
+ import { m as f } from "./index-D_AyI9xa.js";
3
3
  const m = async (t, r) => {
4
4
  const e = await r("/api/dashboard/proxy/fetch", {
5
5
  method: "POST",
@@ -59,4 +59,4 @@ function g(t, r, e, a) {
59
59
  export {
60
60
  g as u
61
61
  };
62
- //# sourceMappingURL=useWidgetFetch-C43Q4m8v.js.map
62
+ //# sourceMappingURL=useWidgetFetch-fkAbLXjl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWidgetFetch-C43Q4m8v.js","sources":["../src/dashboard/api/dashboardProxy.ts","../src/dashboard/hooks/useWidgetFetch.ts"],"sourcesContent":["import type { FetchProxyPayload, DashboardFetcher, SchemaField } from '../types';\n\nexport interface EndpointMeta {\n generatedAt?: string;\n period?: string;\n rowCount?: number;\n}\n\nexport interface ProxyFetchResult {\n data: unknown;\n schema: { fields: SchemaField[] } | null;\n endpointMeta: EndpointMeta | null;\n}\n\n/**\n * Solicita datos de un widget al Proxy del backend.\n * Retorna data + schema (si el endpoint devolvió envelope estándar).\n */\nexport const fetchWidgetDataProxy = async (\n payload: FetchProxyPayload,\n fetcher: DashboardFetcher\n): Promise<ProxyFetchResult> => {\n const response = await fetcher<{\n source: string;\n timestamp: string;\n data: unknown;\n schema?: { fields: SchemaField[] };\n endpointMeta?: EndpointMeta;\n }>('/api/dashboard/proxy/fetch', {\n method: 'POST',\n body: payload,\n });\n\n // Validación defensiva: el proxy puede devolver estructura inesperada si el backend cambia\n if (response === null || response === undefined || typeof response !== 'object') {\n console.error('[KPI Dashboard] Proxy devolvió respuesta inválida:', response);\n return { data: null, schema: null, endpointMeta: null };\n }\n\n if ((response as Record<string, unknown>).data === undefined) {\n console.warn('[KPI Dashboard] Proxy response sin campo \"data\". Widget:', payload.widgetId);\n }\n\n return {\n data: response.data ?? null,\n schema: response.schema ?? null,\n endpointMeta: response.endpointMeta ?? null,\n };\n};\n\n/**\n * Invalida la caché del proxy para un widget.\n * DELETE /api/dashboard/proxy/cache/:widgetId\n */\nexport const invalidateWidgetCache = async (\n widgetId: string,\n fetcher: DashboardFetcher\n): Promise<void> => {\n await fetcher(`/api/dashboard/proxy/cache/${widgetId}`, { method: 'DELETE' });\n};\n","import { useQuery } from '@tanstack/react-query';\nimport type { DashboardPeriod, SchemaField } from '../types';\nimport type { EndpointMeta } from '../api/dashboardProxy';\nimport { fetchWidgetDataProxy } from '../api/dashboardProxy';\nimport { useDashboardContext } from '../DashboardContext';\n\ninterface UseWidgetFetchResult<T> {\n data: T | null;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n loading: boolean;\n error: string | null;\n}\n\n/** Accede a un valor anidado via dot-notation (ej: \"name.common\" → obj.name.common) */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((acc, key) =>\n acc != null && typeof acc === 'object' ? (acc as Record<string, unknown>)[key] : undefined, obj);\n}\n\nfunction applyFieldMapping(data: unknown, mapping: Record<string, string>): unknown {\n const entries = Object.entries(mapping);\n if (entries.length === 0) return data;\n\n // Advertir en desarrollo si el campo a renombrar no existe en la respuesta\n if (process.env.NODE_ENV === 'development') {\n const sample = Array.isArray(data) ? data[0] : data;\n if (sample && typeof sample === 'object') {\n for (const [, apiField] of entries) {\n const topLevelField = apiField.split('.')[0];\n if (!(topLevelField in (sample as object))) {\n // eslint-disable-next-line no-console\n console.warn(\n `[KPI Dashboard] field_mapping.rename: el campo \"${apiField}\" no existe en la respuesta del endpoint. ` +\n `Verificar que el nombre coincida exactamente con el campo devuelto por la API.`\n );\n }\n }\n }\n }\n\n const mapObject = (obj: Record<string, unknown>): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...obj };\n for (const [widgetField, apiField] of entries) {\n const val = apiField.includes('.') ? getNestedValue(obj, apiField) : obj[apiField];\n if (val !== undefined) {\n result[widgetField] = val;\n }\n }\n return result;\n };\n\n if (Array.isArray(data)) {\n return data.map(item =>\n typeof item === 'object' && item !== null ? mapObject(item as Record<string, unknown>) : item\n );\n }\n\n if (typeof data === 'object' && data !== null) {\n return mapObject(data as Record<string, unknown>);\n }\n\n return data;\n}\n\ninterface CachedQueryData<T> {\n data: T;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n}\n\n/**\n * Hook centralizado para fetching de datos de widgets.\n * Retorna data (post field_mapping) + schema del endpoint (si disponible).\n */\nexport function useWidgetFetch<T>(\n widgetId: string,\n period: DashboardPeriod,\n refreshPolicy?: number,\n fieldMapping?: Record<string, string>\n): UseWidgetFetchResult<T> {\n const { fetcher } = useDashboardContext();\n\n const { data: result, isLoading, error } = useQuery<CachedQueryData<T>>({\n queryKey: ['widget-data', widgetId, period],\n queryFn: async () => {\n const { data: raw, schema, endpointMeta } = await fetchWidgetDataProxy({ widgetId, period }, fetcher);\n let mapped = raw;\n if (fieldMapping && Object.keys(fieldMapping).length > 0) {\n mapped = applyFieldMapping(raw, fieldMapping);\n }\n return { data: mapped as T, schema, meta: endpointMeta };\n },\n // Mínimo 10 segundos para evitar polling agresivo por configuración incorrecta\n refetchInterval: refreshPolicy && refreshPolicy > 0\n ? Math.max(refreshPolicy, 10) * 1000\n : false,\n });\n\n return {\n data: result?.data ?? null,\n schema: result?.schema ?? null,\n meta: result?.meta ?? null,\n loading: isLoading,\n error: error ? (error as Error).message : null,\n };\n}\n"],"names":["fetchWidgetDataProxy","payload","fetcher","response","getNestedValue","obj","path","acc","key","applyFieldMapping","data","mapping","entries","sample","apiField","mapObject","result","widgetField","val","item","useWidgetFetch","widgetId","period","refreshPolicy","fieldMapping","useDashboardContext","isLoading","error","useQuery","raw","schema","endpointMeta","mapped"],"mappings":";;AAkBO,MAAMA,IAAuB,OAClCC,GACAC,MAC8B;AAC9B,QAAMC,IAAW,MAAMD,EAMpB,8BAA8B;AAAA,IAC/B,QAAQ;AAAA,IACR,MAAMD;AAAA,EAAA,CACP;AAGD,SAAIE,KAAa,QAAkC,OAAOA,KAAa,YACrE,QAAQ,MAAM,sDAAsDA,CAAQ,GACrE,EAAE,MAAM,MAAM,QAAQ,MAAM,cAAc,KAAA,MAG9CA,EAAqC,SAAS,UACjD,QAAQ,KAAK,4DAA4DF,EAAQ,QAAQ,GAGpF;AAAA,IACL,MAAME,EAAS,QAAQ;AAAA,IACvB,QAAQA,EAAS,UAAU;AAAA,IAC3B,cAAcA,EAAS,gBAAgB;AAAA,EAAA;AAE3C;ACjCA,SAASC,EAAeC,GAA8BC,GAAuB;AAC3E,SAAOA,EAAK,MAAM,GAAG,EAAE,OAAgB,CAACC,GAAKC,MAC3CD,KAAO,QAAQ,OAAOA,KAAQ,WAAYA,EAAgCC,CAAG,IAAI,QAAWH,CAAG;AACnG;AAEA,SAASI,EAAkBC,GAAeC,GAA0C;AAClF,QAAMC,IAAU,OAAO,QAAQD,CAAO;AACtC,MAAIC,EAAQ,WAAW,EAAG,QAAOF;AAGjC,MAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,UAAMG,IAAS,MAAM,QAAQH,CAAI,IAAIA,EAAK,CAAC,IAAIA;AAC/C,QAAIG,KAAU,OAAOA,KAAW;AAC9B,iBAAW,CAAA,EAAGC,CAAQ,KAAKF;AAEzB,QADsBE,EAAS,MAAM,GAAG,EAAE,CAAC,KACnBD,KAEtB,QAAQ;AAAA,UACN,mDAAmDC,CAAQ;AAAA,QAAA;AAAA,EAMrE;AAEA,QAAMC,IAAY,CAACV,MAA0D;AAC3E,UAAMW,IAAkC,EAAE,GAAGX,EAAA;AAC7C,eAAW,CAACY,GAAaH,CAAQ,KAAKF,GAAS;AAC7C,YAAMM,IAAMJ,EAAS,SAAS,GAAG,IAAIV,EAAeC,GAAKS,CAAQ,IAAIT,EAAIS,CAAQ;AACjF,MAAII,MAAQ,WACVF,EAAOC,CAAW,IAAIC;AAAA,IAE1B;AACA,WAAOF;AAAA,EACT;AAEA,SAAI,MAAM,QAAQN,CAAI,IACbA,EAAK;AAAA,IAAI,CAAAS,MACd,OAAOA,KAAS,YAAYA,MAAS,OAAOJ,EAAUI,CAA+B,IAAIA;AAAA,EAAA,IAIzF,OAAOT,KAAS,YAAYA,MAAS,OAChCK,EAAUL,CAA+B,IAG3CA;AACT;AAYO,SAASU,EACdC,GACAC,GACAC,GACAC,GACyB;AACzB,QAAM,EAAE,SAAAtB,EAAA,IAAYuB,EAAA,GAEd,EAAE,MAAMT,GAAQ,WAAAU,GAAW,OAAAC,EAAA,IAAUC,EAA6B;AAAA,IACtE,UAAU,CAAC,eAAeP,GAAUC,CAAM;AAAA,IAC1C,SAAS,YAAY;AACnB,YAAM,EAAE,MAAMO,GAAK,QAAAC,GAAQ,cAAAC,EAAA,IAAiB,MAAM/B,EAAqB,EAAE,UAAAqB,GAAU,QAAAC,EAAA,GAAUpB,CAAO;AACpG,UAAI8B,IAASH;AACb,aAAIL,KAAgB,OAAO,KAAKA,CAAY,EAAE,SAAS,MACrDQ,IAASvB,EAAkBoB,GAAKL,CAAY,IAEvC,EAAE,MAAMQ,GAAa,QAAAF,GAAQ,MAAMC,EAAA;AAAA,IAC5C;AAAA;AAAA,IAEA,iBAAiBR,KAAiBA,IAAgB,IAC9C,KAAK,IAAIA,GAAe,EAAE,IAAI,MAC9B;AAAA,EAAA,CACL;AAED,SAAO;AAAA,IACL,MAAMP,GAAQ,QAAQ;AAAA,IACtB,QAAQA,GAAQ,UAAU;AAAA,IAC1B,MAAMA,GAAQ,QAAQ;AAAA,IACtB,SAASU;AAAA,IACT,OAAOC,IAASA,EAAgB,UAAU;AAAA,EAAA;AAE9C;"}
1
+ {"version":3,"file":"useWidgetFetch-fkAbLXjl.js","sources":["../src/dashboard/api/dashboardProxy.ts","../src/dashboard/hooks/useWidgetFetch.ts"],"sourcesContent":["import type { FetchProxyPayload, DashboardFetcher, SchemaField } from '../types';\n\nexport interface EndpointMeta {\n generatedAt?: string;\n period?: string;\n rowCount?: number;\n}\n\nexport interface ProxyFetchResult {\n data: unknown;\n schema: { fields: SchemaField[] } | null;\n endpointMeta: EndpointMeta | null;\n}\n\n/**\n * Solicita datos de un widget al Proxy del backend.\n * Retorna data + schema (si el endpoint devolvió envelope estándar).\n */\nexport const fetchWidgetDataProxy = async (\n payload: FetchProxyPayload,\n fetcher: DashboardFetcher\n): Promise<ProxyFetchResult> => {\n const response = await fetcher<{\n source: string;\n timestamp: string;\n data: unknown;\n schema?: { fields: SchemaField[] };\n endpointMeta?: EndpointMeta;\n }>('/api/dashboard/proxy/fetch', {\n method: 'POST',\n body: payload,\n });\n\n // Validación defensiva: el proxy puede devolver estructura inesperada si el backend cambia\n if (response === null || response === undefined || typeof response !== 'object') {\n console.error('[KPI Dashboard] Proxy devolvió respuesta inválida:', response);\n return { data: null, schema: null, endpointMeta: null };\n }\n\n if ((response as Record<string, unknown>).data === undefined) {\n console.warn('[KPI Dashboard] Proxy response sin campo \"data\". Widget:', payload.widgetId);\n }\n\n return {\n data: response.data ?? null,\n schema: response.schema ?? null,\n endpointMeta: response.endpointMeta ?? null,\n };\n};\n\n/**\n * Invalida la caché del proxy para un widget.\n * DELETE /api/dashboard/proxy/cache/:widgetId\n */\nexport const invalidateWidgetCache = async (\n widgetId: string,\n fetcher: DashboardFetcher\n): Promise<void> => {\n await fetcher(`/api/dashboard/proxy/cache/${widgetId}`, { method: 'DELETE' });\n};\n","import { useQuery } from '@tanstack/react-query';\nimport type { DashboardPeriod, SchemaField } from '../types';\nimport type { EndpointMeta } from '../api/dashboardProxy';\nimport { fetchWidgetDataProxy } from '../api/dashboardProxy';\nimport { useDashboardContext } from '../DashboardContext';\n\ninterface UseWidgetFetchResult<T> {\n data: T | null;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n loading: boolean;\n error: string | null;\n}\n\n/** Accede a un valor anidado via dot-notation (ej: \"name.common\" → obj.name.common) */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((acc, key) =>\n acc != null && typeof acc === 'object' ? (acc as Record<string, unknown>)[key] : undefined, obj);\n}\n\nfunction applyFieldMapping(data: unknown, mapping: Record<string, string>): unknown {\n const entries = Object.entries(mapping);\n if (entries.length === 0) return data;\n\n // Advertir en desarrollo si el campo a renombrar no existe en la respuesta\n if (process.env.NODE_ENV === 'development') {\n const sample = Array.isArray(data) ? data[0] : data;\n if (sample && typeof sample === 'object') {\n for (const [, apiField] of entries) {\n const topLevelField = apiField.split('.')[0];\n if (!(topLevelField in (sample as object))) {\n // eslint-disable-next-line no-console\n console.warn(\n `[KPI Dashboard] field_mapping.rename: el campo \"${apiField}\" no existe en la respuesta del endpoint. ` +\n `Verificar que el nombre coincida exactamente con el campo devuelto por la API.`\n );\n }\n }\n }\n }\n\n const mapObject = (obj: Record<string, unknown>): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...obj };\n for (const [widgetField, apiField] of entries) {\n const val = apiField.includes('.') ? getNestedValue(obj, apiField) : obj[apiField];\n if (val !== undefined) {\n result[widgetField] = val;\n }\n }\n return result;\n };\n\n if (Array.isArray(data)) {\n return data.map(item =>\n typeof item === 'object' && item !== null ? mapObject(item as Record<string, unknown>) : item\n );\n }\n\n if (typeof data === 'object' && data !== null) {\n return mapObject(data as Record<string, unknown>);\n }\n\n return data;\n}\n\ninterface CachedQueryData<T> {\n data: T;\n schema: { fields: SchemaField[] } | null;\n meta: EndpointMeta | null;\n}\n\n/**\n * Hook centralizado para fetching de datos de widgets.\n * Retorna data (post field_mapping) + schema del endpoint (si disponible).\n */\nexport function useWidgetFetch<T>(\n widgetId: string,\n period: DashboardPeriod,\n refreshPolicy?: number,\n fieldMapping?: Record<string, string>\n): UseWidgetFetchResult<T> {\n const { fetcher } = useDashboardContext();\n\n const { data: result, isLoading, error } = useQuery<CachedQueryData<T>>({\n queryKey: ['widget-data', widgetId, period],\n queryFn: async () => {\n const { data: raw, schema, endpointMeta } = await fetchWidgetDataProxy({ widgetId, period }, fetcher);\n let mapped = raw;\n if (fieldMapping && Object.keys(fieldMapping).length > 0) {\n mapped = applyFieldMapping(raw, fieldMapping);\n }\n return { data: mapped as T, schema, meta: endpointMeta };\n },\n // Mínimo 10 segundos para evitar polling agresivo por configuración incorrecta\n refetchInterval: refreshPolicy && refreshPolicy > 0\n ? Math.max(refreshPolicy, 10) * 1000\n : false,\n });\n\n return {\n data: result?.data ?? null,\n schema: result?.schema ?? null,\n meta: result?.meta ?? null,\n loading: isLoading,\n error: error ? (error as Error).message : null,\n };\n}\n"],"names":["fetchWidgetDataProxy","payload","fetcher","response","getNestedValue","obj","path","acc","key","applyFieldMapping","data","mapping","entries","sample","apiField","mapObject","result","widgetField","val","item","useWidgetFetch","widgetId","period","refreshPolicy","fieldMapping","useDashboardContext","isLoading","error","useQuery","raw","schema","endpointMeta","mapped"],"mappings":";;AAkBO,MAAMA,IAAuB,OAClCC,GACAC,MAC8B;AAC9B,QAAMC,IAAW,MAAMD,EAMpB,8BAA8B;AAAA,IAC/B,QAAQ;AAAA,IACR,MAAMD;AAAA,EAAA,CACP;AAGD,SAAIE,KAAa,QAAkC,OAAOA,KAAa,YACrE,QAAQ,MAAM,sDAAsDA,CAAQ,GACrE,EAAE,MAAM,MAAM,QAAQ,MAAM,cAAc,KAAA,MAG9CA,EAAqC,SAAS,UACjD,QAAQ,KAAK,4DAA4DF,EAAQ,QAAQ,GAGpF;AAAA,IACL,MAAME,EAAS,QAAQ;AAAA,IACvB,QAAQA,EAAS,UAAU;AAAA,IAC3B,cAAcA,EAAS,gBAAgB;AAAA,EAAA;AAE3C;ACjCA,SAASC,EAAeC,GAA8BC,GAAuB;AAC3E,SAAOA,EAAK,MAAM,GAAG,EAAE,OAAgB,CAACC,GAAKC,MAC3CD,KAAO,QAAQ,OAAOA,KAAQ,WAAYA,EAAgCC,CAAG,IAAI,QAAWH,CAAG;AACnG;AAEA,SAASI,EAAkBC,GAAeC,GAA0C;AAClF,QAAMC,IAAU,OAAO,QAAQD,CAAO;AACtC,MAAIC,EAAQ,WAAW,EAAG,QAAOF;AAGjC,MAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,UAAMG,IAAS,MAAM,QAAQH,CAAI,IAAIA,EAAK,CAAC,IAAIA;AAC/C,QAAIG,KAAU,OAAOA,KAAW;AAC9B,iBAAW,CAAA,EAAGC,CAAQ,KAAKF;AAEzB,QADsBE,EAAS,MAAM,GAAG,EAAE,CAAC,KACnBD,KAEtB,QAAQ;AAAA,UACN,mDAAmDC,CAAQ;AAAA,QAAA;AAAA,EAMrE;AAEA,QAAMC,IAAY,CAACV,MAA0D;AAC3E,UAAMW,IAAkC,EAAE,GAAGX,EAAA;AAC7C,eAAW,CAACY,GAAaH,CAAQ,KAAKF,GAAS;AAC7C,YAAMM,IAAMJ,EAAS,SAAS,GAAG,IAAIV,EAAeC,GAAKS,CAAQ,IAAIT,EAAIS,CAAQ;AACjF,MAAII,MAAQ,WACVF,EAAOC,CAAW,IAAIC;AAAA,IAE1B;AACA,WAAOF;AAAA,EACT;AAEA,SAAI,MAAM,QAAQN,CAAI,IACbA,EAAK;AAAA,IAAI,CAAAS,MACd,OAAOA,KAAS,YAAYA,MAAS,OAAOJ,EAAUI,CAA+B,IAAIA;AAAA,EAAA,IAIzF,OAAOT,KAAS,YAAYA,MAAS,OAChCK,EAAUL,CAA+B,IAG3CA;AACT;AAYO,SAASU,EACdC,GACAC,GACAC,GACAC,GACyB;AACzB,QAAM,EAAE,SAAAtB,EAAA,IAAYuB,EAAA,GAEd,EAAE,MAAMT,GAAQ,WAAAU,GAAW,OAAAC,EAAA,IAAUC,EAA6B;AAAA,IACtE,UAAU,CAAC,eAAeP,GAAUC,CAAM;AAAA,IAC1C,SAAS,YAAY;AACnB,YAAM,EAAE,MAAMO,GAAK,QAAAC,GAAQ,cAAAC,EAAA,IAAiB,MAAM/B,EAAqB,EAAE,UAAAqB,GAAU,QAAAC,EAAA,GAAUpB,CAAO;AACpG,UAAI8B,IAASH;AACb,aAAIL,KAAgB,OAAO,KAAKA,CAAY,EAAE,SAAS,MACrDQ,IAASvB,EAAkBoB,GAAKL,CAAY,IAEvC,EAAE,MAAMQ,GAAa,QAAAF,GAAQ,MAAMC,EAAA;AAAA,IAC5C;AAAA;AAAA,IAEA,iBAAiBR,KAAiBA,IAAgB,IAC9C,KAAK,IAAIA,GAAe,EAAE,IAAI,MAC9B;AAAA,EAAA,CACL;AAED,SAAO;AAAA,IACL,MAAMP,GAAQ,QAAQ;AAAA,IACtB,QAAQA,GAAQ,UAAU;AAAA,IAC1B,MAAMA,GAAQ,QAAQ;AAAA,IACtB,SAASU;AAAA,IACT,OAAOC,IAASA,EAAgB,UAAU;AAAA,EAAA;AAE9C;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "siesa-ui-kit",
3
3
  "private": false,
4
- "version": "1.0.147",
4
+ "version": "1.0.148",
5
5
  "description": "SIESA UI Kit - Biblioteca de componentes React con Tailwind CSS, Storybook y agentes Claude AI",
6
6
  "type": "module",
7
7
  "main": "dist/siesa-ui-kit.cjs",