frontend-plus-react 0.1.15 → 0.1.16
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/index.cjs +39 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -6
- package/dist/index.d.ts +16 -6
- package/dist/index.js +38 -21
- package/dist/index.js.map +1 -1
- package/package.json +3 -8
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/json4all/json4all.js","../src/components/grid/GenericDataGrid.tsx","../src/hooks/useApiCall.ts","../src/contexts/SnackbarContext.tsx","../src/env.ts","../src/utils/fetchApi.ts","../src/utils/functions.tsx","../src/store/index.ts","../src/store/clientContextSlice.ts","../src/store/routerSlice.ts","../src/store/menuUiSlice.ts","../src/components/ConfirmDialog.tsx","../src/components/grid/DataGridOptionsDialog.tsx","../src/components/grid/renderers/headerCellRenderers.tsx","../src/components/grid/FilterInputRender.tsx","../src/components/grid/renderers/summaryCellRenderers.tsx","../src/components/grid/renderers/cellRenderers.tsx","../src/components/grid/ExampleClientSideComponent.tsx","../src/components/grid/FallbackClientSideRenderer.tsx","../src/components/grid/clientSides.ts","../src/components/grid/InputRenderer.tsx","../src/components/grid/renderers/editCellRenderers.tsx","../src/components/grid/renderers/emptyRowRenderer.tsx","../src/components/grid/menu/options.tsx","../src/App.tsx","../src/components/MainLayout.tsx","../src/contexts/AppContext.tsx","../src/components/SideMenu.tsx","../src/pages/WScreens.tsx","../src/hooks/useLogout.tsx","../src/components/SessionExpiredMessage.tsx","../src/pages/HomePage.tsx","../src/pages/LogoutPage.tsx","../src/pages/LoginPage.tsx","../src/components/ProcedureForm.tsx","../src/pages/procedure-results/SuccessDisplay.tsx","../src/pages/procedure-results/resultsOk.ts","../src/components/PrivateRoute.tsx","../src/components/InitialRedirectHandler.tsx","../src/pages/GenericDataGridPage.tsx","../src/pages/MenuTablePage.tsx"],"sourcesContent":["\"use strict\";\r\n\r\n(function codenautasModuleDefinition(root, name, factory) {\r\n /* global define */\r\n /* istanbul ignore next */\r\n if(typeof root.globalModuleName !== 'string'){\r\n root.globalModuleName = name;\r\n }\r\n /* istanbul ignore next */\r\n if(typeof exports === 'object' && typeof module === 'object'){\r\n module.exports = factory();\r\n }else if(typeof define === 'function' && define.amd){\r\n define(factory);\r\n }else if(typeof exports === 'object'){\r\n exports[root.globalModuleName] = factory();\r\n }else{\r\n root[root.globalModuleName] = factory();\r\n }\r\n root.globalModuleName = null;\r\n})(/*jshint -W040 */this, 'json4all', function() {\r\n/*jshint +W040 */\r\n\r\n/*jshint -W004 */\r\nvar json4all = {};\r\n/*jshint +W004 */\r\n\r\njson4all.PretendedClass = Symbol(\"Pretended Class\");\r\n\r\nfunction functionName(fun) {\r\n /* istanbul ignore next */\r\n if('name' in fun){\r\n return fun.name;\r\n }else{\r\n return fun.toString().replace(/^\\s*function\\s*([^(]*)\\((.|\\s)*$/i,'$1');\r\n }\r\n}\r\n\r\nfunction constructorName(obj) {\r\n return functionName(obj[json4all.PretendedClass] || obj.constructor);\r\n}\r\n\r\nvar root;\r\n\r\n/* istanbul ignore next */\r\nif(typeof window !== 'undefined'){\r\n root = window;\r\n}else{\r\n root = global;\r\n}\r\n\r\nroot.json4allRegisteredTypes = root.json4allRegisteredTypes || {};\r\nvar types = root.json4allRegisteredTypes;\r\n\r\nvar thisPlatformSkipsUndefinedInArrays = true;\r\n\r\nJSON.stringify([undefined],function(key, value){\r\n if(key==='0'||key===0){\r\n thisPlatformSkipsUndefinedInArrays = false;\r\n }\r\n return value;\r\n});\r\n\r\n\r\nvar thisPlatformHasReplacerBug = false;\r\n\r\n/* istanbul ignore next */ // For IE compatibility\r\nJSON.parse('{\"3\":\"33\"}',function(key, value){\r\n if(value===undefined){\r\n thisPlatformHasReplacerBug = true;\r\n }\r\n return value;\r\n});\r\n\r\n/* istanbul ignore next */\r\nfunction InternalValueForUndefined(){ \r\n /* istanbul ignore next */\r\n throw new Error('this is not a function'); \r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction InternalValueForUnset(){ \r\n /* istanbul ignore next */\r\n throw new Error('this is not a function'); \r\n}\r\n\r\njson4all.directTypes={\r\n \"Object\" : true,\r\n \"Array\" : true,\r\n \"anonymous\": true,\r\n \"\" : true\r\n};\r\n\r\njson4all.anonymizate = function(classedObject){\r\n var plainObject={};\r\n for(var attr in classedObject){\r\n plainObject[attr] = classedObject[attr];\r\n }\r\n return plainObject;\r\n};\r\n\r\njson4all.nonymizate = function(plainValue, Constructor){\r\n var typedValue = new Constructor();\r\n for(var attr in plainValue){\r\n typedValue[attr] = plainValue[attr];\r\n }\r\n return typedValue;\r\n};\r\n\r\njson4all.replacer = function replacer(key, value){\r\n var realValue = this[key];\r\n /* istanbul ignore next */ // For IE compatibility\r\n if(realValue===InternalValueForUndefined){\r\n this[key]=undefined;\r\n return {$special: \"undefined\"};\r\n }\r\n if(key!=='' && (!(key in this) || realValue!==null && realValue instanceof Function)){\r\n return {$special: \"unset\"};\r\n }\r\n if(realValue===undefined || typeof realValue === \"undefined\" || realValue!==null && realValue instanceof Function){\r\n return {$special: \"undefined\"};\r\n }\r\n if(realValue===null || typeof realValue!=='object' || key==='$escape'){\r\n return value;\r\n }\r\n if('$special' in realValue || '$escape' in realValue){\r\n return {$escape: realValue};\r\n }\r\n /* istanbul ignore next */ // For IE compatibility\r\n if(thisPlatformSkipsUndefinedInArrays && realValue instanceof Array){\r\n for(var i=0; i<realValue.length; i++){\r\n if(typeof realValue[i] === 'undefined'){\r\n realValue[i] = InternalValueForUndefined;\r\n }\r\n }\r\n return realValue;\r\n }\r\n var typeName = constructorName(realValue);\r\n if(json4all.directTypes[typeName]){\r\n return value;\r\n }else{\r\n var typeDef=types[typeName];\r\n if(typeDef){\r\n var replaced = {$special: typeDef.specialTag(realValue), $value: typeDef.deconstruct(realValue)};\r\n var ref = realValue[RefKey];\r\n if(ref!==undefined){\r\n replaced.$ref = ref;\r\n if(json4all.$RefStoreSpace == null){\r\n delete replaced.$value;\r\n }\r\n }\r\n return replaced;\r\n // return {$special:'specialTag' in typeDef?typeDef.specialTag(realValue):typeName, $value: typeDef.deconstruct(realValue)};\r\n }else{\r\n console.log(\"JSON4all.stringify unregistered object type\", typeName);\r\n throw new Error(\"JSON4all.stringify unregistered object type\");\r\n }\r\n }\r\n};\r\n\r\njson4all.reviver = function reviver(key, plainValue){\r\n var log=false;\r\n var result;\r\n if(key==='$escape'){\r\n return plainValue;\r\n }else if(plainValue!==null && plainValue.$ref && json4all.$RefStoreSpace){\r\n var collection = json4all.$RefStoreSpace[plainValue.$ref[0][0]]\r\n if(!collection){\r\n throw new Error(\"json4all ref collection invalid\");\r\n }\r\n var object = collection[plainValue.$ref[1]];\r\n if(!object){\r\n throw new Error(\"json4all ref key invalid\");\r\n }\r\n return object;\r\n }else if(plainValue!==null && plainValue.$special){\r\n if(plainValue.$special==='undefined'){ \r\n if(key===''){\r\n return undefined;\r\n }\r\n return InternalValueForUndefined;\r\n }else if(plainValue.$special==='unset'){\r\n return undefined;\r\n }else{\r\n var typeDef=types[plainValue.$special];\r\n if(typeDef){\r\n result = new typeDef.construct(plainValue.$value, typeDef.constructor);\r\n }else{\r\n console.log(\"JSON4all.parse invalid $special\", plainValue.$special);\r\n throw new Error(\"JSON4all.parse invalid $special\");\r\n }\r\n }\r\n }else if(plainValue!==null && plainValue.$escape){\r\n return plainValue.$escape;\r\n }else{\r\n result = plainValue;\r\n if(plainValue instanceof Object){\r\n for(var k in plainValue){\r\n if(plainValue[k]===InternalValueForUndefined){\r\n plainValue[k]=undefined;\r\n }\r\n }\r\n }\r\n }\r\n if(plainValue !=null && plainValue.$ref){\r\n result[RefKey] = plainValue.$ref\r\n }\r\n return result;\r\n};\r\n\r\nvar directRegExp = /^((null|true|false)$|[-\\]\\[{}\".0-9])/;\r\nvar directStringRegExp = /^[a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-][0-9a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-]{0,32}$/;\r\nvar AttributeNameRegExp = /^[a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-][0-9a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-]*($|,)/;\r\n\r\njson4all.stringifyAnyPlace = function stringifyAnyPlace(value){\r\n return JSON.stringify(value, json4all.replacer);\r\n};\r\n\r\nvar CHANNEL = {\r\n object:{separator: ',', pairSeparator:':' , empty: function (){ return {}}}, \r\n array :{separator: ';', pairSeparator:null, empty: function (){ return []}},\r\n}\r\n\r\nvar SEPARATOR = {',':'object', ';':'array'}\r\n\r\nfunction maxConsumer(){\r\n var fun = function(node){\r\n for (var channel in CHANNEL) {\r\n if (node[channel] > fun[channel]) fun[channel] = node[channel];\r\n }\r\n return node.value\r\n }\r\n for (var channel in CHANNEL) {\r\n fun[channel] = null;\r\n }\r\n return fun;\r\n}\r\n\r\nfunction simpleValue(value){\r\n return {value: value, object:0, array:0}\r\n}\r\n\r\njson4all.maxConsumer = maxConsumer;\r\n\r\njson4all.mesureString = function mesureString(value){\r\n var currentSeparator = null;\r\n var currentLength = 0;\r\n var result = simpleValue(value);\r\n for (var char of value) {\r\n var channel = SEPARATOR[char];\r\n if (channel) {\r\n if (currentSeparator != char) {\r\n currentLength = 0\r\n currentSeparator = char\r\n }\r\n currentLength++\r\n if (currentLength > result[channel]) result[channel] = currentLength\r\n } else {\r\n currentSeparator = null;\r\n }\r\n }\r\n return result\r\n}\r\n\r\njson4all.quoteString = function quoteString(text, escapeColon){\r\n var value = directStringRegExp.test(text) && !directRegExp.test(text) ? text : JSON.stringify(text);\r\n if (escapeColon) value = value.replace(/:/g,'\\\\u003a');\r\n return json4all.mesureString(value);\r\n}\r\n\r\nvar STAR = '*';\r\nvar BANG = '!';\r\n\r\njson4all.toUrl = function toUrl(value){\r\n return json4all.toUrlConstruct(value).value;\r\n}\r\n\r\njson4all.toUrlLines = function toUrlLines(value, eol){\r\n return json4all.toUrlConstruct(value, eol ? eol : '\\n').value;\r\n}\r\n\r\nvar repeat = (str, count) => Array.prototype.concat(new Array(count +1)).join(str);\r\n\r\njson4all.toUrlConstruct = function toUrlConstruct(value, addEol){\r\n if(value === null) return simpleValue(\"null\");\r\n if(value === undefined) return simpleValue(\"!undefined\");\r\n if(value instanceof Function) return simpleValue(\"!unset\");\r\n var typeName = constructorName(value);\r\n if(typeof value === \"string\"){ \r\n // if(value[0] === STAR){\r\n // return json4all.mesureString(STAR + value);\r\n // }else{\r\n return json4all.quoteString(value);\r\n // }\r\n } else if (value && typeof value === \"object\" && !value[RefKey]) {\r\n if(!json4all.directTypes[typeName]){\r\n var typeDef=types[typeName];\r\n if(typeDef /* && (!onlyValues || typeDef.valueLike)*/){\r\n var serializedValue = typeDef.serialize(value)\r\n if (typeof serializedValue === \"string\") return json4all.mesureString(serializedValue);\r\n // serializedValue.value = BANG + serializedValue.value;\r\n return serializedValue;\r\n }else{\r\n console.log(\"JSON4all.stringify unregistered object type\", typeName);\r\n throw new Error(\"JSON4all.stringify unregistered object type\");\r\n }\r\n } else {\r\n var thisChannel = value instanceof Array ? 'array' : 'object';\r\n var parts = []\r\n var result = simpleValue(null);\r\n var cantSimplify = false;\r\n var max = maxConsumer();\r\n if (thisChannel == 'array') {\r\n for (var i = 0; i < value.length; i++) {\r\n var pair = [max(json4all.toUrlConstruct(value[i]))]\r\n parts.push(pair);\r\n }\r\n } else {\r\n for (var attr in value) {\r\n var pair = [max(json4all.quoteString(attr, true)), max(json4all.toUrlConstruct(value[attr]))]\r\n parts.push(pair);\r\n }\r\n }\r\n for (var channel in CHANNEL) {\r\n result[channel] = (max[channel] || 0) + (channel == thisChannel ? 1 : 0);\r\n }\r\n var PairSep = ':'\r\n var lengthSep = result[thisChannel];\r\n var ListSep = addEol ? addEol : repeat(CHANNEL[thisChannel].separator, lengthSep);\r\n result.value = (addEol ? '!json4all' + CHANNEL[thisChannel].separator : '') + ListSep + parts.map(pair=>pair.join(PairSep)).join(ListSep)\r\n if (!cantSimplify && parts.length){\r\n return result;\r\n }\r\n }\r\n }\r\n return json4all.mesureString(JSON.stringify(value, json4all.replacer));\r\n};\r\n\r\njson4all.stringify = json4all.stringifyAnyPlace;\r\n\r\njson4all.convertPlain2$special = function convertPlain2$special(o, internally){\r\n if(o!=null && o instanceof Object){\r\n for(var key in o){\r\n /* istanbul ignore next */\r\n var realKey = o[key]===undefined && !isNaN(key)?Number(key):key;\r\n json4all.convertPlain2$special(o[key], true);\r\n var newValue = json4all.reviver(key, o[key]); \r\n if(newValue===undefined && !(o instanceof Array)){\r\n delete o[key];\r\n }else{\r\n o[key] = newValue;\r\n }\r\n }\r\n }\r\n if(!internally){\r\n return json4all.reviver('', o);\r\n }\r\n};\r\n\r\njson4all.isTesting = true;\r\n\r\njson4all.getPlainObject = function getPlainObject(payload, separator, initial, PairSep){\r\n var i = 0;\r\n if (separator instanceof RegExp) {\r\n var ListSep = separator;\r\n } else {\r\n var ListSep = '';\r\n while (i < payload.length && payload[i] === separator) { i++; ListSep += separator }\r\n }\r\n var result = initial\r\n var parts = payload.split(ListSep).slice(1);\r\n var index = -1;\r\n for (var part of parts) {\r\n if (PairSep) {\r\n var pos = part.indexOf(PairSep);\r\n if (pos < 0) {\r\n throw new Error('JSON4all.parse error. Lack of colon \"' + PairSep + '\" in object');\r\n }\r\n var value = part.substr(pos + PairSep.length);\r\n var index = json4all.parse(part.substr(0, pos));\r\n } else {\r\n var value = part;\r\n index ++;\r\n }\r\n var value = json4all.parse(value, true);\r\n if (value !== InternalValueForUnset) {\r\n result[index] = value\r\n }\r\n }\r\n return result;\r\n}\r\n\r\njson4all.parse = function parse(text, inner){\r\n var payload = text[0] === STAR ? text.substr(1) : text;\r\n if (payload[0] === BANG) {\r\n payload = payload.substr(1);\r\n if (payload === 'undefined') return undefined;\r\n if (payload === 'unset') {\r\n return inner ? InternalValueForUnset : undefined;\r\n }\r\n if (payload[0] == '@') {\r\n var commaPosition = payload.indexOf(',');\r\n var className = payload.substr(1, commaPosition - 1);\r\n var typeDef = types[className];\r\n if (!typeDef) {\r\n throw new Error('JSON4all.parse unrecognize className ' + className);\r\n }\r\n return typeDef.deserialize(payload).value;\r\n }\r\n if (payload[0] == '/') {\r\n var typeDef = types.RegExp;\r\n return typeDef.deserialize(payload).value;\r\n }\r\n if (payload.substr(0,8) == 'json4all') {\r\n var iSeparator = SEPARATOR[payload[8]];\r\n if (iSeparator) {\r\n var channel = CHANNEL[iSeparator];\r\n if (channel) {\r\n var eol = payload[9] == '\\r' && payload[10] == '\\n' ? '\\r\\n' : payload[9] == '\\n' ? '\\n' : null;\r\n if (eol) {\r\n return json4all.getPlainObject(payload.substr(8 + eol.length), /\\r?\\n/, channel.empty(), channel.pairSeparator);\r\n }\r\n }\r\n }\r\n }\r\n throw new Error('JSON4all.parse unrecognize ! token')\r\n }\r\n if (SEPARATOR[payload[0]]) {\r\n var channel = CHANNEL[SEPARATOR[payload[0]]];\r\n return json4all.getPlainObject(payload, channel.separator, channel.empty(), channel.pairSeparator);\r\n }\r\n for (var typeName in types) {\r\n var typeDef = types[typeName];\r\n var okDetected = null;\r\n /* istanbul ignore next */\r\n if(!typeDef.deserialize){\r\n throw new Error(\"JSON4all.parse type without deserialize: \"+typeName)\r\n }\r\n var valueOk = null;\r\n var {ok, value} = typeDef.deserialize(payload);\r\n if(ok){\r\n valueOk = value;\r\n if(json4all.isTesting){\r\n if (okDetected) {\r\n console.log(\"More than one way\",typeName,okDetected,text,value,valueOk);\r\n throw Error(\"\")\r\n }\r\n okDetected = typeName;\r\n }\r\n break;\r\n }\r\n }\r\n if (okDetected) return valueOk;\r\n if (typeof text === \"string\" && !directRegExp.test(text)) {\r\n return text;\r\n }\r\n /* istanbul ignore next */ // For IE compatibility\r\n if(thisPlatformHasReplacerBug){\r\n var parsed=JSON.parse(text);\r\n return json4all.convertPlain2$special(parsed);\r\n } else {\r\n return JSON.parse(text, json4all.reviver);\r\n }\r\n};\r\n\r\njson4all.addType = function addType(typeConstructor, functions, skipIfExists){\r\n functions = functions || {};\r\n var constructorName = typeof typeConstructor === 'string'? typeConstructor: functionName(typeConstructor);\r\n if(skipIfExists && types[constructorName]){\r\n return;\r\n }\r\n var prefix = '@' + constructorName\r\n types[constructorName] = {\r\n construct: functions.construct || function construct(plainValue, constructor){\r\n return typeConstructor.JSON4reviver(plainValue, constructor);\r\n },\r\n deconstruct: functions.deconstruct || function deconstruct(o){\r\n return o.JSON4replacer();\r\n },\r\n specialTag: functions.specialTag || function specialTag(value){\r\n return constructorName;\r\n },\r\n serialize: functions.serialize || function serialize(o){\r\n var plainObject = 'JSON4replacer' in typeConstructor.prototype ? o.JSON4replacer() : functions.deconstruct(o);\r\n var result = json4all.toUrlConstruct(plainObject)\r\n result.value = BANG + prefix + result.value;\r\n return result;\r\n },\r\n deserialize: functions.deserialize || function deserialize(plainValue){\r\n if (plainValue.startsWith(prefix + ',')) {\r\n var plainObject = json4all.parse(STAR + plainValue.substr(prefix.length),constructor);\r\n return {\r\n ok:true, \r\n value:'JSON4replacer' in typeConstructor.prototype ? typeConstructor.JSON4reviver(plainObject, typeConstructor) : functions.construct(plainObject, typeConstructor)\r\n }\r\n }\r\n return {ok:false}\r\n },\r\n valueLike: functions.valueLike || typeConstructor.JSON4valueLike\r\n };\r\n if(typeof typeConstructor === 'function'){\r\n types[constructorName].constructor = typeConstructor;\r\n }\r\n};\r\n\r\nvar NativeDateRegExp = /^\\d\\d\\d\\d-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(\\.\\d*)?Z$/;\r\n\r\njson4all.DateFunctions = {\r\n construct: function construct(plainValue){ \r\n return new Date(plainValue); \r\n }, \r\n deconstruct: function deconstruct(o){\r\n return o.getTime();\r\n },\r\n serialize: function serialize(o){\r\n return o.toISOString();\r\n },\r\n deserialize: function deserialize(plainValue){\r\n var ok = NativeDateRegExp.test(plainValue);\r\n var value = ok && new Date(plainValue) || null;\r\n return {ok, value};\r\n },\r\n valueLike: true\r\n}\r\n\r\njson4all.addType(Date, json4all.DateFunctions, true);\r\n\r\njson4all.addType(RegExp, {\r\n construct: function construct(plainValue){ \r\n return new RegExp(plainValue.source, plainValue.flags); \r\n }, \r\n deconstruct: function deconstruct(o){\r\n return {source: o.source, flags: o.toString().substr(o.toString().lastIndexOf('/')+1)};\r\n },\r\n serialize: function serialize(o){\r\n return BANG + '/' + o.source + '/' + o.flags;\r\n },\r\n deserialize: function deserialize(plainValue){\r\n var ok = false\r\n var value = null;\r\n plainValue.replace(/^\\/(.+)\\/(\\w*)$/, function(_, pattern, flags){\r\n value = new RegExp(pattern, flags)\r\n ok = true;\r\n });\r\n return {ok, value};\r\n },\r\n valueLike: true\r\n});\r\n\r\njson4all._types = types;\r\n\r\nconst RefKey = Symbol(\"RefKey for RefMap\")\r\n\r\njson4all.RefKey = RefKey;\r\n// export class RefMap<K extends keyof object, V extends any> extends Map<K, V>{\r\n\r\njson4all.RefStoreSpace = (myCollection)=>{\r\n json4all.$RefStoreSpace = myCollection;\r\n}\r\n\r\n\r\n/** \r\n * @type {<K extends string|number|symbol, V extends {}> (path:(string|number|symbol)[]) => Partial<{[key in V]:v}} \r\n * */\r\njson4all.RefStore = (path)=>{\r\n var myCollection = json4all.$RefStoreSpace;\r\n /** @type {Partial<{[key in K]:V}>} */\r\n var o = {}\r\n var p= new Proxy(o, {\r\n /*\r\n get:function(target, prop, _receiver) {\r\n return target[prop];\r\n },\r\n */\r\n /** @param {Partial<{[key in K]:V}>} target */\r\n /** @param {K} prop */\r\n /** @param {V} value */\r\n set:function(target, prop, value){\r\n if(\r\n // @ts-expect-error RefKey no está en el tipo original\r\n value[RefKey] == null \r\n ){\r\n // @ts-expect-error RefKey no está en el tipo original\r\n value[RefKey] = [path, prop];\r\n }else if(\r\n // @ts-expect-error RefKey no está en el tipo original\r\n value[RefKey][1] != prop\r\n ){\r\n console.log(\"This value was stored in another place\", path, prop)\r\n throw new Error(\"This value was stored in another place\")\r\n }\r\n return Reflect.set(target, prop, value);\r\n }\r\n });\r\n myCollection[path[0]] = p;\r\n return p;\r\n}\r\n\r\njson4all.$props2serialize = Symbol(\"props2serialize\")\r\n\r\njson4all.addProperty = function(constructorPosition){\r\n var innerFunction = (classPrototype, prop, index)=>{\r\n if(!(json4all.$props2serialize in classPrototype)){\r\n classPrototype[json4all.$props2serialize] = []\r\n }\r\n var info={name:prop}\r\n if(typeof constructorPosition === \"number\") info.construct = constructorPosition\r\n classPrototype[json4all.$props2serialize].push(info)\r\n }\r\n if(typeof constructorPosition === \"number\"){\r\n return innerFunction\r\n }else{\r\n return innerFunction.apply(null, arguments);\r\n }\r\n}\r\n\r\njson4all.pretendClass = function(object, Constructor){\r\n object[json4all.PretendedClass] = Constructor\r\n // @ts-expect-error\r\n object.JSON4replacer = Constructor.prototype.JSON4replacer;\r\n // @ts-expect-error\r\n // object[JSON4all.$props2serialize] = Constructor.prototype[JSON4all.$props2serialize];\r\n}\r\n\r\njson4all.addClass = (constructor)=>{\r\n if(!(json4all.$props2serialize in constructor.prototype)){\r\n throw new Error(\"must add parameters or properties\")\r\n }\r\n var propList = constructor.prototype[json4all.$props2serialize];\r\n constructor.prototype.JSON4replacer = function(){\r\n var o = {};\r\n for(var prop of propList){\r\n o[prop.name] = this[prop.name]\r\n }\r\n return o;\r\n };\r\n constructor.JSON4reviver = function(value, constructor){\r\n var constructParams = propList.filter(p=>p.construct!=null).map(p=>value[p.name])\r\n var o = new constructor(...constructParams);\r\n for(var p of propList){\r\n if(!p.construct){\r\n o[p.name] = value[p.name]\r\n }\r\n }\r\n return o;\r\n }\r\n json4all.addType(constructor)\r\n}\r\n\r\nreturn json4all;\r\n\r\n});\r\n","// src/components/GenericDataGrid.tsx\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { DataGrid, Column, DataGridHandle, CellMouseArgs, RenderCellProps, RenderHeaderCellProps, RenderSummaryCellProps, ColSpanArgs, CellSelectArgs, CellKeyDownArgs, CellKeyboardEvent, CellMouseEvent } from 'react-data-grid';\nimport 'react-data-grid/lib/styles.css';\n\nimport { useApiCall } from '../../hooks/useApiCall';\nimport { CircularProgress, Typography, Box, Alert, useTheme, Button } from '@mui/material';\nimport { cambiarGuionesBajosPorEspacios } from '../../utils/functions';\n\n\nimport { useSnackbar } from '../../contexts/SnackbarContext';\n\nimport { CellFeedback, FieldDefinition, FixedField, TableDefinition } from '../../types';\n\nimport { ConfirmDialog } from '../ConfirmDialog';\nimport { DataGridOptionsDialog } from './DataGridOptionsDialog';\n\nimport { actionsColumnHeaderCellRenderer, defaultColumnHeaderCellRenderer, detailColumnCellHeaderRenderer } from './renderers/headerCellRenderers';\nimport { actionsColumnSummaryCellRenderer, defaultColumnSummaryCellRenderer, detailColumnCellSummaryRenderer } from './renderers/summaryCellRenderers';\nimport { allColumnsCellRenderer } from './renderers/cellRenderers';\nimport { allColumnsEditCellRenderer } from './renderers/editCellRenderers';\nimport { DetailTable } from 'backend-plus';\nimport { EmptyRowsRenderer } from './renderers/emptyRowRenderer';\nimport { useIsDrawerOpen } from '../../store';\nimport { buildMenuOptions } from './menu/options';\n\ninterface GenericDataGridProps{\n tableName: string;\n fixedFields?: FixedField[];\n gridStyles?: React.CSSProperties\n}\n\nexport const NEW_ROW_INDICATOR = '$new';\nexport const DETAIL_ROW_INDICATOR = '$detail';\n\n// --- Funciones de Utilidad ---\n\nexport const getPrimaryKeyValues = (row: Record<string, any>, primaryKey: string[]): string => {\n let keys = [...primaryKey];\n if(row[DETAIL_ROW_INDICATOR]){\n keys = keys.concat(DETAIL_ROW_INDICATOR);\n }\n return keys.map(key => {\n return row[key] !== undefined && row[key] !== null\n ? String(row[key])\n : 'NULL_OR_UNDEFINED';\n }).join('|');\n};\n\n/**\n * Obtiene la clave única para una celda.\n * @param row La fila actual.\n * @param columnKey La clave de la columna.\n * @param primaryKey La clave primaria de la tabla.\n * @returns Clave única de la celda (ej: \"pkValue1|pkValue2|columnKey\").\n */\nexport const getCellKey = (row: Record<string, any>, columnKey: string, primaryKey: string[]): string => {\n return `${getPrimaryKeyValues(row, primaryKey)}|${columnKey}`;\n};\n\n// --- Tipos de Columna ---\n\ninterface BaseCustomColumn<TRow, TSummaryRow = unknown> extends Column<TRow, TSummaryRow> {\n customType: 'default' | 'detail' | 'action',\n tableDefinition: TableDefinition,\n}\n\nexport interface DefaultColumn<TRow, TSummaryRow = unknown> extends BaseCustomColumn<TRow, TSummaryRow> {\n customType: 'default';\n fieldDef: FieldDefinition;\n // 💥 MULTI-CELL FEEDBACK: Se cambia a un mapa\n cellFeedbackMap: Map<string, CellFeedback>, \n setCellFeedbackMap: React.Dispatch<React.SetStateAction<Map<string, CellFeedback>>>,\n setTableData: React.Dispatch<React.SetStateAction<any[]>>,\n primaryKey: string[],\n fixedFields: FixedField[] | undefined,\n localCellChanges: Map<string, Set<string>>,\n setLocalCellChanges: React.Dispatch<React.SetStateAction<Map<string, Set<string>>>>,\n handleKeyPressInEditor: (rowIndex: number, columnKey: string, event:React.KeyboardEvent, currentColumns: Column<any>[], handleCommit:(currentValue: any, closeEditor: boolean, focusNextCell: boolean) => Promise<void>) => void\n}\n\nexport interface DetailColumn<TRow, TSummaryRow = unknown> extends BaseCustomColumn<TRow, TSummaryRow> {\n customType: 'detail';\n detailTable: DetailTable,\n primaryKey: string[],\n tableData: any[],\n setTableData: React.Dispatch<React.SetStateAction<any[]>>,\n detailKey: string\n}\n\nexport interface ActionColumn<TRow, TSummaryRow = unknown> extends BaseCustomColumn<TRow, TSummaryRow> {\n customType: 'action';\n handleDeleteRow: (row: any) => void;\n handleAddRow: () => void\n}\n\nexport type CustomColumn<TRow, TSummaryRow = unknown> =\n | DefaultColumn<TRow, TSummaryRow>\n | DetailColumn<TRow, TSummaryRow>\n | ActionColumn<TRow, TSummaryRow>;\n\nconst GenericDataGrid: React.FC<GenericDataGridProps> = ({\n tableName,\n fixedFields,\n gridStyles,\n}) => {\n const isOpenMenu = useIsDrawerOpen()\n const [tableDefinition, setTableDefinition] = useState<TableDefinition | null>(null);\n const [tableData, setTableData] = useState<any[]>([]);\n const [isFilterRowVisible, setIsFilterRowVisible] = useState<boolean>(false);\n const [filters, setFilters] = useState<Record<string, string>>({});\n const [selectedRows, setSelectedRows] = useState((): ReadonlySet<string> => new Set());\n const [selectedCell, setSelectedCell] = useState<CellSelectArgs<any, NoInfer<{id: string}>> | undefined>(undefined);\n\n // 💥 MULTI-CELL FEEDBACK: Estado principal para manejar múltiples mensajes de feedback\n const [cellFeedbackMap, setCellFeedbackMap] = useState<Map<string, CellFeedback>>(new Map());\n \n // 🗑️ OLD: [cellFeedback, setCellFeedback] = useState<CellFeedback | null>(null);\n\n const [localCellChanges, setLocalCellChanges] = useState<Map<string, Set<string>>>(new Map());\n const theme = useTheme();\n\n const [openConfirmDialog, setOpenConfirmDialog] = useState(false);\n const [openDataGridOptions, setOpenDataGridOptions] = useState(false);\n const [dataGridOptionsAnchorEl, setDataGridOptionsAnchorEl] = useState<HTMLElement | null>(null);\n const [rowToDelete, setRowToDelete] = useState<any | null>(null);\n const [exitingRowIds, setExitingRowIds] = useState<Set<string>>(new Set());\n\n const { showSuccess, showError, showWarning, showInfo } = useSnackbar(); const feedbackTimerRef = useRef<NodeJS.Timeout | null>(null);\n const dataGridRef = useRef<DataGridHandle>(null);\n const { callApi, loading, error } = useApiCall();\n\n const getRowCount = () => tableData.filter((row)=> !row[DETAIL_ROW_INDICATOR]).length\n const getFilteredRowCount = () => filteredRows.filter((row)=> !row[DETAIL_ROW_INDICATOR]).length\n \n // 💥 MULTI-CELL: Limpieza de estado al cambiar de tabla\n useEffect(() => {\n setFilters({});\n setIsFilterRowVisible(false);\n setSelectedRows(new Set());\n setTableDefinition(null);\n setTableData([]);\n setCellFeedbackMap(new Map()); // 💥 MULTI-CELL: Limpiar el mapa\n setLocalCellChanges(new Map());\n setOpenConfirmDialog(false);\n setRowToDelete(null);\n setExitingRowIds(new Set());\n if (feedbackTimerRef.current) {\n clearTimeout(feedbackTimerRef.current);\n }\n }, [tableName]);\n\n useEffect(() => {\n const fetchDataAndDefinition = async () => {\n try {\n const definition: TableDefinition = await callApi('table_structure', { table: tableName });\n setTableDefinition(definition);\n const data = await callApi('table_data', {\n table: tableName,\n fixedFields: fixedFields\n });\n setTableData(data);\n } catch (err: any) {\n setTableDefinition(null);\n setTableData([]);\n showError(`Error al cargar datos para la tabla '${tableName}': ${err.message || 'Error desconocido'}`);\n } finally { }\n };\n fetchDataAndDefinition();\n }, [tableName, fixedFields, showError]);\n\n // 💥 MULTI-CELL: Lógica del temporizador actualizada para el mapa\n useEffect(() => {\n if (cellFeedbackMap.size > 0) {\n if (feedbackTimerRef.current) {\n clearTimeout(feedbackTimerRef.current);\n }\n const timerDuration = 3000;\n feedbackTimerRef.current = setTimeout(() => {\n setCellFeedbackMap(prevMap => {\n const newMap = new Map(prevMap);\n let mapChanged = false;\n \n // Solo eliminamos el feedback de tipo 'success' automáticamente\n for (const [cellId, feedback] of prevMap.entries()) {\n if (feedback.type === 'success') {\n newMap.delete(cellId);\n mapChanged = true;\n }\n }\n \n // Retorna el nuevo mapa solo si hubo cambios\n return mapChanged ? newMap : prevMap;\n });\n feedbackTimerRef.current = null;\n }, timerDuration);\n }\n return () => {\n if (feedbackTimerRef.current) {\n clearTimeout(feedbackTimerRef.current);\n }\n };\n }, [cellFeedbackMap]);\n\n\n const primaryKey = useMemo(() => {\n if (!tableDefinition) return ['id'];\n return tableDefinition.primaryKey && tableDefinition.primaryKey.length > 0 ? tableDefinition.primaryKey : ['id'];\n }, [tableDefinition]);\n\n const toggleFilterVisibility = useCallback(() => {\n setIsFilterRowVisible(prev => {\n if (prev) {\n setFilters({});\n }\n return !prev;\n });\n }, []);\n\n const handleAddRow = useCallback(() => {\n if (!tableDefinition) {\n showWarning('No se puede agregar una fila sin la definición de la tabla.');\n return;\n }\n const newRow: Record<string, any> = {};\n tableDefinition.fields.forEach(field => {\n newRow[field.name] = null;\n });\n newRow[NEW_ROW_INDICATOR] = true;\n\n if (fixedFields) {\n fixedFields.forEach(fixedField => {\n newRow[fixedField.fieldName] = fixedField.value;\n });\n }\n\n setTableData(prevData => [newRow, ...prevData]);\n setSelectedRows(new Set());\n\n const tempRowId = getPrimaryKeyValues(newRow, primaryKey);\n setLocalCellChanges(prev => {\n const newMap = new Map(prev);\n const mandatoryEditableColumns = new Set<string>();\n\n tableDefinition.fields.forEach(field => {\n const isMandatory = (field.nullable === false || field.isPk);\n const isEditable = field.editable !== false;\n\n if (isMandatory && isEditable) {\n mandatoryEditableColumns.add(field.name);\n }\n });\n newMap.set(tempRowId, mandatoryEditableColumns);\n return newMap;\n });\n\n }, [tableDefinition, showWarning, primaryKey, fixedFields]);\n\n const handleDeleteRow = useCallback(async (row: any) => {\n setRowToDelete(row);\n setOpenConfirmDialog(true);\n }, []);\n\n const handleConfirmDelete = useCallback(async (confirm: boolean) => {\n setOpenConfirmDialog(false);\n if (!confirm || !rowToDelete) {\n showWarning('Eliminación cancelada por el usuario.');\n setRowToDelete(null);\n return;\n }\n\n if (!tableDefinition || !tableName) {\n showError('No se puede eliminar la fila sin la definición de la tabla o el nombre de la tabla.');\n setRowToDelete(null);\n return;\n }\n\n const rowId = getPrimaryKeyValues(rowToDelete, primaryKey);\n\n setExitingRowIds(prev => new Set(prev).add(rowId));\n\n setTimeout(async () => {\n if (rowToDelete[NEW_ROW_INDICATOR]) {\n setTimeout(() => {\n setTableData(prevData => prevData.filter(row => getPrimaryKeyValues(row, primaryKey) !== rowId));\n setLocalCellChanges(prev => {\n const newMap = new Map(prev);\n newMap.delete(rowId);\n return newMap;\n });\n setSelectedRows(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n setExitingRowIds(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n showInfo(`Fila no guardada '${rowId}' eliminada localmente.`);\n setRowToDelete(null);\n }, 500);\n return;\n }\n\n try {\n const primaryKeyValues = tableDefinition.primaryKey.map((key) => rowToDelete[key]);\n await callApi('table_record_delete', {\n table: tableName,\n primaryKeyValues: primaryKeyValues\n });\n\n console.log(`Fila con ID ${rowId} eliminada exitosamente del backend.`);\n setTimeout(() => {\n setTableData(prevData => prevData.filter(row => getPrimaryKeyValues(row, primaryKey) !== rowId));\n setLocalCellChanges(prev => {\n const newMap = new Map(prev);\n newMap.delete(rowId);\n return newMap;\n });\n setSelectedRows(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n setExitingRowIds(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n showSuccess(`Fila '${rowId}' eliminada exitosamente.`);\n setRowToDelete(null);\n }, 500);\n\n } catch (err: any) {\n console.error(`Error al eliminar la fila '${rowId}':`, err);\n showError(`Error al eliminar la fila '${rowId}': ${err.message || 'Error desconocido'}`);\n setExitingRowIds(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n setRowToDelete(null);\n }\n }, 10);\n }, [rowToDelete, tableDefinition, tableName, primaryKey, showInfo, showSuccess, showError, showWarning, setTableData, setLocalCellChanges, setSelectedRows]);\n\n const filteredRows = useMemo(() => {\n let rows = tableData;\n if (isFilterRowVisible) {\n Object.keys(filters).forEach(key => {\n const filterValue = filters[key].toLowerCase();\n if (filterValue) {\n rows = rows.filter(row => {\n const cellValue = String(row[key] || '').toLowerCase();\n return cellValue.includes(filterValue);\n });\n }\n });\n }\n return rows;\n }, [tableData, filters, isFilterRowVisible]);\n\n const handleKeyPressInEditor = useCallback((rowIndex: number, columnKey: string, event: React.KeyboardEvent, currentColumns: Column<any>[], handleCommit:(currentValue: any, closeEditor: boolean, focusNextCell: boolean) => Promise<void>) => {\n if (dataGridRef.current && tableDefinition) {\n const currentColumnIndex = currentColumns.findIndex((col: Column<any>) => col.key === columnKey);\n const editableColumns = currentColumns.filter(col => {\n const fieldDefinition = tableDefinition.fields.find(f => f.name === col.key);\n return col.key !== 'actionsColumn' && (col as DetailColumn<any, unknown>).customType != 'detail' && (fieldDefinition?.editable !== false && !fieldDefinition?.clientSide);\n });\n const {key, target} = event;\n const input = target as HTMLInputElement;\n if (currentColumnIndex !== -1 && editableColumns.length > 0) {\n const editableColumnKeys = editableColumns.map(col => col.key);\n let currentEditableColumnIndex = editableColumnKeys.indexOf(columnKey);\n \n const hacerFoco = ({rowIdx, idx}:{rowIdx:number, idx: number}) => \n setTimeout(()=>dataGridRef.current?.selectCell({ rowIdx, idx }, { enableEditor: true, shouldFocusCell: true }),10);\n const calcularColumnaSiguiente = ()=>{\n let nextEditableColumnIndex = currentEditableColumnIndex + 1;\n let nextRowIndex = rowIndex;\n if (nextEditableColumnIndex >= editableColumns.length) {\n nextEditableColumnIndex = 0;\n nextRowIndex++;\n while(filteredRows[nextRowIndex] && filteredRows[nextRowIndex][DETAIL_ROW_INDICATOR]){\n nextRowIndex++;\n }\n if (nextRowIndex >= filteredRows.length) {\n nextRowIndex = 0;\n }\n }\n const nextColumnKey = editableColumnKeys[nextEditableColumnIndex];\n const nextColumnIndex = currentColumns.findIndex(col => col.key === nextColumnKey);\n return {rowIdx: nextRowIndex, idx:nextColumnIndex}\n }\n const calcularColumnaAnterior = ()=>{\n let nextEditableColumnIndex = currentEditableColumnIndex - 1;\n let nextRowIndex = rowIndex;\n if (nextEditableColumnIndex <= 0) {\n nextEditableColumnIndex = 0;\n }\n const nextColumnKey = editableColumnKeys[nextEditableColumnIndex];\n const nextColumnIndex = currentColumns.findIndex(col => col.key === nextColumnKey);\n return {rowIdx: nextRowIndex, idx:nextColumnIndex}\n }\n const calcularFilaSiguiente = ()=>{\n let nextRowIndex = rowIndex; \n nextRowIndex++;\n while(filteredRows[nextRowIndex] && filteredRows[nextRowIndex][DETAIL_ROW_INDICATOR]){\n nextRowIndex++;\n } \n if (nextRowIndex >= filteredRows.length) {\n return {rowIdx: rowIndex, idx:currentColumnIndex}\n }\n return {rowIdx: nextRowIndex, idx:currentColumnIndex}\n }\n\n const calcularFilaAnterior = ()=>{\n let nextRowIndex = rowIndex;\n nextRowIndex--;\n while(filteredRows[nextRowIndex] && filteredRows[nextRowIndex][DETAIL_ROW_INDICATOR]){\n nextRowIndex--;\n } \n if (nextRowIndex < 0) {\n return {rowIdx: rowIndex, idx:currentColumnIndex}\n }\n return {rowIdx: nextRowIndex, idx:currentColumnIndex}\n }\n \n if (currentEditableColumnIndex !== -1) {\n switch(true){\n case ['Enter','Tab'].includes(key): {\n hacerFoco(calcularColumnaSiguiente());\n break;\n }\n case (key == 'ArrowRight'): {\n const cursorPosition = input.selectionStart;\n const inputValueLength = input.value.length;\n if(cursorPosition === inputValueLength){\n hacerFoco(calcularColumnaSiguiente());\n }\n break;\n }\n case (key == 'ArrowLeft'): {\n const cursorPosition = input.selectionStart;\n if(cursorPosition === 0){\n hacerFoco(calcularColumnaAnterior());\n }\n break;\n }\n case (key == 'ArrowUp'): {\n hacerFoco(calcularFilaAnterior());\n break;\n }\n case (key == 'ArrowDown'): {\n hacerFoco(calcularFilaSiguiente());\n break;\n }\n case (key == 'F4'): {\n const {rowIdx, idx} = calcularFilaSiguiente();\n const previousRow = tableData[rowIndex-1]\n if(previousRow && !previousRow[DETAIL_ROW_INDICATOR]){\n handleCommit(previousRow[columnKey], true, true).then(()=>hacerFoco({rowIdx ,idx}))\n }\n break;\n }\n default: break;\n }\n } \n } \n }\n }, [filteredRows, tableDefinition, tableData]);\n \n const handleSelectedCellChange = useCallback((args: CellSelectArgs<any, NoInfer<{id: string}>>|undefined) => {\n setSelectedCell(args);\n }, []);\n \n \n const menuOptions = useMemo(() => buildMenuOptions({\n tableDefinition,\n tableName,\n fixedFields,\n setTableData,\n callApi,\n showSuccess,\n showError,\n showWarning\n }), [tableDefinition, tableName, fixedFields, setTableData, callApi, showSuccess, showError, showWarning]);\n const columns: CustomColumn<any>[] = useMemo(() => {\n if (!tableDefinition) return [];\n const fieldsToShow = tableDefinition.fields.filter((field: FieldDefinition) => {\n const fixedFieldEntry = fixedFields?.find(f => f.fieldName === field.name);\n return !(fixedFieldEntry && fixedFieldEntry.until === undefined);\n });\n const defaultColumns: CustomColumn<any>[] = fieldsToShow.map((fieldDef: FieldDefinition) => {\n const isFixedField = fixedFields?.some(f => f.fieldName === fieldDef.name);\n const isFieldEditable = fieldDef.editable !== false && !isFixedField;\n\n return {\n key: fieldDef.name,\n customType: 'default',\n tableDefinition,\n fieldDef,\n // 💥 MULTI-CELL: Se inyecta el mapa y su setter\n cellFeedbackMap,\n setCellFeedbackMap,\n primaryKey,\n fixedFields,\n localCellChanges,\n setLocalCellChanges,\n setTableData,\n name: fieldDef.label || cambiarGuionesBajosPorEspacios(fieldDef.name),\n resizable: true,\n sortable: true,\n editable: isFieldEditable,\n handleKeyPressInEditor,\n flexGrow: 1,\n minWidth: 60, \n renderHeaderCell: (props: RenderHeaderCellProps<any, unknown>) => defaultColumnHeaderCellRenderer(props, fieldDef),\n renderSummaryCell: (props: RenderSummaryCellProps<any, unknown>) => defaultColumnSummaryCellRenderer(props, fixedFields, isFilterRowVisible, filters, setFilters),\n };\n });\n\n // Calcular ancho dinámico basado en botones disponibles\n const availableActions = [\n tableDefinition.allow?.insert,\n tableDefinition.allow?.delete,\n tableDefinition.allow?.['vertical-edit']\n ].filter(Boolean).length;\n \n const actionColumnWidth = availableActions === 0 ? 30 : 12 + (availableActions * 25);\n\n const actionsColumn: CustomColumn<any> = {\n key: 'actionsColumn',\n customType: 'action',\n tableDefinition,\n handleDeleteRow,\n handleAddRow,\n name: 'filterCol',\n width: actionColumnWidth,\n editable: false,\n resizable: false,\n sortable: false, \n renderHeaderCell: (props: RenderHeaderCellProps<any, unknown>) => actionsColumnHeaderCellRenderer(props, isFilterRowVisible, toggleFilterVisibility, (e: React.MouseEvent<HTMLElement>) => { \n setDataGridOptionsAnchorEl(e.currentTarget); \n setOpenDataGridOptions(true); \n }),\n renderSummaryCell: (props: RenderSummaryCellProps<any, unknown>) => actionsColumnSummaryCellRenderer(props),\n }; const detailColumns: CustomColumn<any>[] = [];\n if (tableDefinition.detailTables && tableDefinition.detailTables.length > 0) {\n tableDefinition.detailTables.forEach(detailTable => {\n const detailKey = `detail_${detailTable.abr}`;\n detailColumns.push({\n key: detailKey,\n customType: 'detail',\n tableDefinition,\n detailTable,\n primaryKey,\n tableData,\n setTableData,\n detailKey,\n name: detailTable.label || `Detalle ${detailTable.abr}`,\n resizable: false,\n sortable: false,\n editable: false,\n width:30,\n minWidth: 30, \n renderHeaderCell: (props: RenderHeaderCellProps<any, unknown>) => detailColumnCellHeaderRenderer(props, detailTable),\n renderSummaryCell: (props: RenderSummaryCellProps<any, unknown>) => detailColumnCellSummaryRenderer(props),\n });\n });\n }\n \n const allColumns = [\n actionsColumn,\n ...detailColumns,\n ...defaultColumns,\n ];\n\n return allColumns.map(col => ({\n ...col,\n colSpan: (args: ColSpanArgs<any, unknown>) => {\n if (args.type === 'ROW'){\n const detailTableAbr = args.row[DETAIL_ROW_INDICATOR];\n if(col.key === `detail_${detailTableAbr}`) {\n return allColumns.length;\n }\n }\n return undefined;\n },\n editorOptions:{closeOnExternalRowChange:false}, //con esto no se pierde el foco\n renderEditCell: (props) => allColumnsEditCellRenderer(props, allColumns),\n renderCell: (props: RenderCellProps<any, unknown>) => allColumnsCellRenderer(props),\n }));\n }, [\n tableDefinition, isFilterRowVisible, filters, toggleFilterVisibility,\n // 💥 MULTI-CELL: Se usa el mapa en lugar de la variable simple\n cellFeedbackMap, \n primaryKey, theme.palette.success.light, theme.palette.error.light,\n theme.palette.info.light, theme.palette.action.selected,\n handleKeyPressInEditor, setTableData,\n localCellChanges, handleDeleteRow, handleAddRow, fixedFields, tableData\n ]);\n\n const handleRowsChange = useCallback((updatedRows: any[]) => {\n setTableData(updatedRows);\n }, []);\n\n //TODO: mejorar esto, por ahora no encontré una forma programática\n const deselectAllOtherGrids = (currentGridElement: HTMLDivElement|undefined|null) => {\n const allSelectedCells = document.querySelectorAll(\"div[aria-selected='true']\");\n allSelectedCells.forEach(cell => {\n const parentGrid = cell.closest('.rdg'); \n if (parentGrid && parentGrid !== currentGridElement) {\n cell.setAttribute(\"aria-selected\", \"false\");\n }\n });\n };\n\n const handleCellKeyDown = (args: CellKeyDownArgs<any, { id: string }>, event: CellKeyboardEvent) => {\n if (['Enter', 'Tab', 'ArrowDown', 'ArrowUp','ArrowRight', 'ArrowLeft'].includes(event.key)) {\n event.preventGridDefault();\n }\n }\n const handleCellMouseDown = useCallback((_args: CellMouseArgs<any, { id: string }>, event: CellMouseEvent) => {\n event.preventGridDefault(); \n },[]);\n\n const handlCellDoubleClick = useCallback((_args: CellMouseArgs<any, { id: string }>, event: CellMouseEvent) => {\n event.preventGridDefault(); \n },[]);\n\n const handleCellClick = useCallback((args: CellMouseArgs<any, { id: string }>, _event: CellMouseEvent) => {\n const fieldDefinition = tableDefinition?.fields.find(f => f.name === args.column.key);\n const isFixedField = fixedFields?.some(f => f.fieldName === args.column.key);\n const isEditable = fieldDefinition?.editable !== false && !isFixedField;\n if(isEditable){\n deselectAllOtherGrids(dataGridRef.current?.element);\n args.selectCell(true);\n }\n console.log(\"Clicked column index:\", args.column.idx);\n console.log(\"Clicked row index:\", args.rowIdx);\n console.log(\"Is editable:\", isEditable);\n }, [tableDefinition, fixedFields]);\n\n \n if (loading) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\n <CircularProgress />\n <Typography variant=\"h6\" sx={{ ml: 2 }}>Cargando tabla...</Typography>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\n <Alert severity=\"error\">{error.message}</Alert>\n </Box>\n );\n }\n\n if (!tableDefinition) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\n <Alert severity=\"warning\">No se pudo cargar la definición de la tabla.</Alert>\n </Box>\n );\n }\n\n return (\n <Box sx={{ pt: 2, display: 'flex', flexDirection: 'column', height: '100%', boxSizing: 'border-box' }}>\n <Box\n sx={{\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n padding: theme.spacing(1),\n textAlign: 'left',\n fontWeight: 'bold',\n borderBottom: `1px solid ${theme.palette.divider}`,\n borderTopLeftRadius: theme.shape.borderRadius,\n borderTopRightRadius: theme.shape.borderRadius,\n ml: 2,\n mr: 2\n }}\n >\n <Typography variant=\"subtitle2\" component=\"div\">\n {cambiarGuionesBajosPorEspacios(tableDefinition.title || tableDefinition.name)} - {getFilteredRowCount() === getRowCount() ? `${getRowCount()} registros`\n : `${getFilteredRowCount()} (F)`\n }\n </Typography>\n </Box>\n <Box\n sx={{\n flexGrow: 1,\n boxSizing: 'border-box',\n position: 'relative',\n overflowX: 'auto',\n overflowY: 'auto',\n px: 2,\n pb: 2,\n }}\n >\n <DataGrid\n className='rdg-light'\n ref={dataGridRef}\n //@ts-ignore TODO: arreglar este tipo\n columns={columns}\n rows={filteredRows.map(row => ({\n ...row,\n style: exitingRowIds.has(getPrimaryKeyValues(row, primaryKey))\n ? { maxHeight: 0, opacity: 0, overflow: 'hidden' }\n : { maxHeight: '35px', opacity: 1 }\n }))}\n enableVirtualization={true}\n rowKeyGetter={(row: any) => getPrimaryKeyValues(row, primaryKey)}\n onSelectedRowsChange={setSelectedRows}\n onSelectedCellChange={handleSelectedCellChange}\n onRowsChange={handleRowsChange}\n selectedRows={selectedRows}\n // TODO: Arreglar tamaño fijo pasarlo a dinamico\n rowHeight={(row) => row[DETAIL_ROW_INDICATOR] ? 400 : 30}\n style={{...{ height: '100%', width: '100%', boxSizing: 'border-box' },...gridStyles}}\n headerRowHeight={30}\n topSummaryRows={isFilterRowVisible ? [{ id: 'filterRow' }] : undefined}\n summaryRowHeight={isFilterRowVisible ? 30 : 0}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n onCellMouseDown={handleCellMouseDown}\n onCellDoubleClick={handlCellDoubleClick}\n onCellClick={handleCellClick}\n onCellKeyDown={handleCellKeyDown}\n />\n </Box>\n <ConfirmDialog\n open={openConfirmDialog}\n onClose={handleConfirmDelete}\n title=\"Confirmar Eliminación\"\n message={rowToDelete && rowToDelete[NEW_ROW_INDICATOR]\n ? `¿Estás seguro de que quieres eliminar esta nueva fila (ID: ${getPrimaryKeyValues(rowToDelete, primaryKey)}) localmente?`\n : rowToDelete\n ? `¿Estás seguro de que quieres eliminar la fila con ID: ${getPrimaryKeyValues(rowToDelete, primaryKey)} de la base de datos? Esta acción es irreversible.`\n : '¿Estás seguro de que quieres eliminar este registro? Esta acción es irreversible.'\n }\n />\n <DataGridOptionsDialog\n open={openDataGridOptions}\n onClose={() => setOpenDataGridOptions(false)}\n options={menuOptions}\n anchorEl={dataGridOptionsAnchorEl}\n />\n </Box>\n );\n};\nexport default GenericDataGrid;\n","import { useState, useCallback } from 'react';\r\nimport { useSnackbar } from '../contexts/SnackbarContext';\r\nimport { executeBackendProcedure as baseExecuteBackendProcedure } from '../utils/fetchApi';\r\nimport { UseApiCallResult } from '../types';\r\n\r\nexport const useApiCall = <T = any>(): UseApiCallResult<T> => {\r\n const { showSnackbar } = useSnackbar();\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const callApi = useCallback(async (\r\n procedureName: string,\r\n params: Record<string, any>,\r\n opts?:{\r\n reportOnSnackbar:boolean\r\n }\r\n ): Promise<T | undefined> => {\r\n setLoading(true);\r\n setError(null);\r\n const defaultOpts = {...{\r\n reportOnSnackbar: true\r\n }, ...opts}\r\n try {\r\n const result = await baseExecuteBackendProcedure<T>(procedureName, params);\r\n return result === null ? undefined : result;\r\n } catch (err: any) {\r\n setError(err);\r\n let snackbarMessage = `Error inesperado al ejecutar '${procedureName}'.`;\r\n if (err instanceof TypeError) {\r\n snackbarMessage = `Problema de conexión: ${err.message}. Por favor, revisa tu internet o intenta de nuevo.`;\r\n } else if (err instanceof Error) {\r\n snackbarMessage = err.message;\r\n }\r\n if(defaultOpts.reportOnSnackbar){\r\n showSnackbar(snackbarMessage, 'error');\r\n }\r\n throw err\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [showSnackbar]);\r\n\r\n return { callApi, loading, error };\r\n};","// src/contexts/SnackbarContext.tsx\r\nimport React, { createContext, useContext, useState, useCallback, ReactNode } from 'react';\r\nimport MuiAlert, { AlertProps } from '@mui/material/Alert';\r\nimport Snackbar from '@mui/material/Snackbar';\r\nimport { SnackbarContextType, SnackbarProviderProps, SnackbarState } from '../types';\r\n\r\n// Definir el tipo de las props para el Alert en el Snackbar\r\nconst SnackbarAlert = React.forwardRef<HTMLDivElement, AlertProps>(function SnackbarAlert(props, ref) {\r\n return <MuiAlert elevation={6} ref={ref} variant=\"filled\" {...props} />;\r\n});\r\n\r\n// Crear el contexto\r\nconst SnackbarContext = createContext<SnackbarContextType | undefined>(undefined);\r\n\r\n// Valores por defecto para la duración (en milisegundos)\r\nconst DEFAULT_SUCCESS_DURATION = 3000; \r\nconst DEFAULT_ERROR_DURATION = 10000; \r\n\r\nexport const SnackbarProvider: React.FC<SnackbarProviderProps> = ({ children }) => {\r\n const [snackbar, setSnackbar] = useState<SnackbarState>({\r\n open: false,\r\n message: '',\r\n severity: 'info',\r\n duration: DEFAULT_SUCCESS_DURATION, // Valor inicial\r\n });\r\n\r\n const showSnackbar = useCallback((message: string, severity: 'success' | 'error' | 'info' | 'warning', duration?: number | null) => {\r\n // Determina la duración final\r\n const finalDuration = duration !== undefined && duration !== null\r\n ? duration\r\n : (severity === 'error' ? DEFAULT_ERROR_DURATION : DEFAULT_SUCCESS_DURATION);\r\n\r\n setSnackbar({\r\n open: true,\r\n message,\r\n severity,\r\n duration: finalDuration,\r\n });\r\n }, []);\r\n\r\n // Adapta los métodos de conveniencia para aceptar la duración opcional\r\n const showSuccess = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'success', duration), [showSnackbar]);\r\n const showError = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'error', duration), [showSnackbar]);\r\n const showWarning = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'warning', duration), [showSnackbar]);\r\n const showInfo = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'info', duration), [showSnackbar]);\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent | Event, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setSnackbar(prev => ({ ...prev, open: false }));\r\n };\r\n\r\n return (\r\n <SnackbarContext.Provider value={{ showSnackbar, showSuccess, showError, showWarning, showInfo }}>\r\n {children}\r\n <Snackbar\r\n open={snackbar.open}\r\n autoHideDuration={snackbar.duration} // Usa la duración del estado\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'top', horizontal: 'center' }}\r\n >\r\n <SnackbarAlert onClose={handleCloseSnackbar} severity={snackbar.severity}>\r\n {snackbar.message}\r\n </SnackbarAlert>\r\n </Snackbar>\r\n </SnackbarContext.Provider>\r\n );\r\n};\r\n\r\n// Hook personalizado para consumir el contexto\r\nexport const useSnackbar = () => {\r\n const context = useContext(SnackbarContext);\r\n if (context === undefined) {\r\n throw new Error('useSnackbar must be used within a SnackbarProvider');\r\n }\r\n return context;\r\n};","// frontend-plus-react/src/config/env.ts\r\n\r\ninterface EnvVariables {\r\n backendUrl: string;\r\n // Agrega aquí cualquier otra variable de entorno que tu librería necesite\r\n}\r\n\r\n// Función auxiliar para obtener la variable de entorno de forma agnóstica al bundler\r\nconst getEnvVar = (key: string): string => {\r\n // Intenta leer de import.meta.env (Vite)\r\n if (typeof import.meta !== 'undefined' && import.meta.env) {\r\n const viteKey = `VITE_${key}`;\r\n // Usamos 'as any' para evitar problemas de tipado con las propiedades dinámicas de import.meta.env\r\n if ((import.meta.env as any)[viteKey]) {\r\n return (import.meta.env as any)[viteKey];\r\n }\r\n }\r\n\r\n // Intenta leer de process.env (CRA, Node.js)\r\n if (typeof process !== 'undefined' && process.env) {\r\n const craKey = `REACT_APP_${key}`;\r\n if (process.env[craKey]) {\r\n return process.env[craKey]!; // '!' para asegurar que no es undefined después de la verificación\r\n }\r\n // También intenta sin prefijo para otros entornos Node.js (menos común para frontends)\r\n if (process.env[key]) {\r\n return process.env[key]!;\r\n }\r\n }\r\n\r\n // Si no se encuentra, puedes lanzar un error o devolver un valor por defecto\r\n console.warn(`Variable de entorno \"${key}\" no encontrada. Asegúrate de definirla con el prefijo correcto (VITE_ o REACT_APP_).`);\r\n return ''; // O lanza un error: throw new Error(`Variable de entorno ${key} no definida.`);\r\n};\r\n\r\n// Exporta un objeto con todas las variables de entorno que tu librería necesita\r\nexport const envConfig: EnvVariables = {\r\n backendUrl: getEnvVar('BACKEND_URL'),\r\n // Agrega aquí las demás variables siguiendo el mismo patrón\r\n};","import { FetchApiOptions } from \"../types\";\r\nimport { envConfig } from '../env'; // Ajusta la ruta según donde lo hayas guardado\r\n\r\n/**\r\n * Función genérica para realizar peticiones a la API.\r\n * Configurada para enviar cookies por defecto.\r\n *\r\n * @param endPoint La URL a la que se realizará la petición.\r\n * @param options Opciones de la petición fetch (método, headers, body, etc.).\r\n * @returns La respuesta de la petición.\r\n * @throws Error si la petición no es exitosa (response.ok es false).\r\n */\r\nexport async function fetchApi(endPoint: string, options: FetchApiOptions): Promise<Response> {\r\nconst BACKEND_URL = envConfig.backendUrl;\r\n const defaultHeaders = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n };\r\n const config: RequestInit = {\r\n ...options,\r\n headers: {\r\n ...defaultHeaders,\r\n ...options?.headers,\r\n },\r\n credentials: 'include',\r\n };\r\n if (config.method === 'GET' || config.method === 'HEAD') {\r\n delete config.body;\r\n }\r\n return await fetch(BACKEND_URL+endPoint, config);\r\n}\r\nexport const executeBackendProcedure = async<T=any>(procedureName:string, params:Record<string, any>):Promise<T | null> => {\r\n function stringifyObjectsAndArraysInParams(params: Record<string, any>): Record<string, any> {\r\n const newParams: Record<string, any> = {};\r\n \r\n for (const key in params) {\r\n // Asegúrate de que la propiedad pertenece al objeto y no a su prototipo\r\n if (Object.prototype.hasOwnProperty.call(params, key)) {\r\n const value = params[key];\r\n \r\n // Condición: Si el valor es un objeto Y NO es null\r\n // Tanto los objetos planos como los arrays pasarán esta condición.\r\n if (typeof value === 'object' && value !== null) {\r\n try {\r\n newParams[key] = JSON.stringify(value);\r\n } catch (e) {\r\n // Manejo de errores si el objeto/array no es serializable (ej. referencias circulares)\r\n console.warn(`Warning: Could not stringify value for key '${key}'. Keeping original value. Error:`, e);\r\n newParams[key] = value; // Mantén el valor original si no se puede stringificar\r\n }\r\n } else {\r\n // Para todos los demás tipos (primitivos, null, undefined), mantenemos el valor original\r\n newParams[key] = value;\r\n }\r\n }\r\n }\r\n return newParams;\r\n }\r\n\r\n const body = new URLSearchParams(stringifyObjectsAndArraysInParams(params));\r\n const response = await fetchApi(`/${procedureName}`, {body, method:'POST'})\r\n if (response.ok) {\r\n const rawResponseTextDefinition = await response.text();\r\n const result = JSON.parse(rawResponseTextDefinition.replace(/^--\\n/, ''));\r\n if(result.error){\r\n throw new Error(result.error.message)\r\n }else{\r\n return result;\r\n }\r\n } else {\r\n const errorTextDefinition = await response.text();\r\n throw new Error(`Error al ejecutar procedure '${procedureName}': ${response.status} - ${errorTextDefinition}`);\r\n } \r\n}\r\n","import * as JSON4all from \"json4all\";\r\nimport { store } from '../store';\r\nimport { TableDefinition } from \"backend-plus\";\r\nimport { FixedField } from \"../types\";\r\n\r\nexport const cambiarGuionesBajosPorEspacios = (texto:string)=>texto.replace(/_/g,' ');\r\nexport const quitarGuionesBajos = (texto:string)=>texto.replace(/_/g,'');\r\n\r\nconst getAppPrefix = () => {\r\n const state = store.getState();\r\n const { config } = state.clientContext;\r\n return /*config.appName+*/'prefijo_'+ config.version+'_';\r\n}\r\n\r\nconst getRawLocalVar = (varName: string) =>localStorage.getItem(getAppPrefix()+varName);\r\n\r\nconst getLocalVar = (varName: string) =>{\r\n let rawData = getRawLocalVar(varName);\r\n if(rawData){\r\n return JSON4all.parse(rawData);\r\n }else{\r\n return null\r\n }\r\n}\r\n\r\nconst setLocalVar = (varName: string, value:any) => localStorage.setItem(getAppPrefix()+varName, JSON4all.stringify(value))\r\n\r\n\r\nconst existsLocalVar = (varName: string) => !!getRawLocalVar(varName);\r\n\r\n\r\nconst removeLocalVar = (varName: string) => localStorage.removeItem(getAppPrefix()+varName);\r\n\r\nconst getSessionVar = (varName: string) =>{\r\n if(existsSessionVar(varName)){\r\n return JSON4all.parse(sessionStorage.getItem(getAppPrefix()+varName)!);\r\n }else{\r\n return null\r\n }\r\n}\r\n\r\nconst setSessionVar = (varName: string, value:any) => sessionStorage.setItem(getAppPrefix()+varName, JSON4all.stringify(value))\r\n\r\n\r\nconst existsSessionVar = (varName: string) => !!(sessionStorage.getItem(getAppPrefix()+varName))?true:false\r\n\r\n\r\nconst removeSessionVar = (varName: string) => sessionStorage.removeItem(getAppPrefix()+varName);\r\n\r\nexport const getDetailTableAndFixedFieldsForDetailTableAbr = (tableDefinition:TableDefinition, detailTableAbr:string, row:any) => {\r\n const detailTable = tableDefinition.detailTables!.find((dt) => dt.abr === detailTableAbr)!; \r\n let fixedFields: FixedField[] = [];\r\n detailTable.fields.forEach((field: any) => {\r\n if (typeof field === \"string\") {\r\n fixedFields.push({ fieldName: field, value: row[field] });\r\n } else {\r\n fixedFields.push({ fieldName: field.target, value: row[field.source] });\r\n }\r\n });\r\n return {detailTable, fixedFields}\r\n}\r\n","// src/store/index.ts\r\n// ... tus imports existentes (incluyendo routerReducer) ...\r\nimport { configureStore, combineReducers } from '@reduxjs/toolkit';\r\nimport {\r\n persistStore,\r\n persistReducer,\r\n FLUSH,\r\n REHYDRATE,\r\n PAUSE,\r\n PERSIST,\r\n PURGE,\r\n REGISTER,\r\n} from 'redux-persist';\r\nimport storage from 'redux-persist/lib/storage';\r\n\r\nimport clientContextReducer from './clientContextSlice';\r\nimport routerReducer from './routerSlice';\r\nimport menuUiReducer from './menuUiSlice';\r\n\r\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\r\nimport { ClientContextState, MenuUiState } from '../types';\r\n\r\nconst rootReducer = combineReducers({\r\n clientContext: clientContextReducer,\r\n router: routerReducer,\r\n menuUi: menuUiReducer,\r\n // ...otros slices\r\n});\r\n\r\nconst persistConfig = {\r\n key: 'root',\r\n storage,\r\n whitelist: ['clientContext', 'router', 'menuUi'],\r\n};\r\n\r\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\r\n\r\nexport const store = configureStore({\r\n reducer: persistedReducer,\r\n middleware: (getDefaultMiddleware) =>\r\n getDefaultMiddleware({\r\n serializableCheck: {\r\n ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],\r\n },\r\n }),\r\n});\r\n\r\nexport const persistor = persistStore(store);\r\n\r\nexport type RootState = ReturnType<typeof store.getState>;\r\nexport type AppDispatch = typeof store.dispatch;\r\n\r\nexport const useAppDispatch: () => AppDispatch = useDispatch;\r\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\r\n\r\n// Hooks selectores personalizados existentes\r\nexport const useClientContext = (): ClientContextState => {\r\n return useAppSelector(state => state.clientContext);\r\n};\r\n\r\nexport const useClientContextStatus = (): ClientContextState['status'] => {\r\n return useAppSelector(state => state.clientContext.status);\r\n};\r\n\r\nexport const useClientContextError = (): ClientContextState['error'] => {\r\n return useAppSelector(state => state.clientContext.error);\r\n};\r\n\r\nexport const useCurrentPath = (): string => {\r\n return useAppSelector(state => state.router.currentPath);\r\n};\r\n\r\nexport const usePreviousPath = (): string | null => {\r\n return useAppSelector(state => state.router.previousPath);\r\n};\r\n\r\n// Selectores para menuUi\r\nexport const useMenuUi = (): MenuUiState => {\r\n return useAppSelector(state => state.menuUi);\r\n};\r\n\r\nexport const useIsDrawerOpen = (): boolean => {\r\n return useAppSelector(state => state.menuUi.isDrawerOpen);\r\n};\r\n\r\nexport const useSubMenuOpenState = (menuName: string): boolean => {\r\n return useAppSelector(state => state.menuUi.subMenuOpenStates[menuName] || false);\r\n};\r\n\r\nexport const useRedirectPath = (): string | null => {\r\n return useAppSelector(state => state.router.redirectPath);\r\n};","// src/store/clientContextSlice.ts\r\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';\r\nimport { MenuInfoBase, ProcedureDef, AppConfigClientSetup } from \"backend-plus\";\r\nimport { Details } from 'express-useragent'; // Asumiendo que 'Details' viene de aquí\r\nimport { fetchApi } from '../utils/fetchApi'; // Tu utilidad fetchApi\r\nimport { ClientContextState } from '../types';\r\n\r\n// Estado inicial para el slice de clientContext\r\nconst initialState: ClientContextState = {\r\n menu: [],\r\n procedure: {},\r\n procedures: [],\r\n config: {} as AppConfigClientSetup, // Inicializa con un objeto vacío o valores por defecto adecuados\r\n useragent: {} as Details, // Igual aquí\r\n username: '',\r\n status: 'idle', // Por defecto, sin carga\r\n error: null, // Sin error\r\n};\r\n\r\n// **Thunk asíncrono para cargar los datos del clientContext**\r\n// Esto reemplaza tu función 'loadClientContextData'\r\nexport const fetchClientContext = createAsyncThunk(\r\n 'clientContext/fetchClientContext',\r\n async (_, { rejectWithValue }) => {\r\n try {\r\n const setupResponse = await fetchApi('/client-setup', { method: 'GET' });\r\n if (!setupResponse.ok) {\r\n const errorData = await setupResponse.text();\r\n throw new Error(errorData || 'Error al obtener configuración del cliente');\r\n }\r\n const clientSetup = await setupResponse.json();\r\n\r\n // Retorna los datos cargados. El 'status' y 'error' se manejan automáticamente\r\n // en los 'extraReducers'.\r\n return clientSetup as Omit<ClientContextState, 'status' | 'error'>;\r\n } catch (error: any) {\r\n // Usa rejectWithValue para pasar el mensaje de error al estado 'failed'\r\n return rejectWithValue(error.message || 'Error desconocido al cargar el contexto');\r\n }\r\n }\r\n);\r\n\r\n// Creación del slice de Redux para clientContext\r\nconst clientContextSlice = createSlice({\r\n name: 'clientContext',\r\n initialState,\r\n reducers: {\r\n // Un reducer para limpiar el contexto del cliente (ej. al cerrar sesión)\r\n clearClientContext: (state) => {\r\n // Restablece el estado a su valor inicial\r\n Object.assign(state, initialState);\r\n },\r\n // Puedes añadir otros reducers aquí si necesitas modificar partes del clientContext directamente\r\n // pero el thunk es la forma preferida para la carga inicial.\r\n },\r\n // **extraReducers maneja las acciones del thunk asíncrono**\r\n extraReducers: (builder) => {\r\n builder\r\n // Cuando la petición está pendiente (cargando)\r\n .addCase(fetchClientContext.pending, (state) => {\r\n state.status = 'loading';\r\n state.error = null;\r\n })\r\n // Cuando la petición se completa con éxito\r\n .addCase(fetchClientContext.fulfilled, (state, action: PayloadAction<Omit<ClientContextState, 'status' | 'error'>>) => {\r\n state.status = 'succeeded';\r\n // Asigna los datos recibidos al estado\r\n state.menu = action.payload.menu;\r\n state.procedure = action.payload.procedure;\r\n state.procedures = action.payload.procedures;\r\n state.config = action.payload.config;\r\n state.useragent = action.payload.useragent;\r\n state.username = action.payload.username;\r\n state.error = null;\r\n })\r\n // Cuando la petición falla\r\n .addCase(fetchClientContext.rejected, (state, action) => {\r\n state.status = 'failed';\r\n state.error = action.payload as string || 'Fallo al cargar el contexto del cliente';\r\n // Puedes optar por limpiar el resto del estado o mantener el último valor si el error no es crítico\r\n // Object.assign(state, initialState); // Si quieres limpiar todo en caso de error\r\n });\r\n },\r\n});\r\n\r\nexport const { clearClientContext } = clientContextSlice.actions; // Exporta la acción generada\r\nexport default clientContextSlice.reducer; // Exporta el reducer","// src/store/routerSlice.ts\r\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { RouterState } from '../types';\r\n\r\nconst initialState: RouterState = {\r\n currentPath: '/',\r\n previousPath: null,\r\n redirectPath: null, // <--- Inicializamos en null\r\n};\r\n\r\nconst routerSlice = createSlice({\r\n name: 'router',\r\n initialState,\r\n reducers: {\r\n setCurrentPath: (state, action: PayloadAction<string>) => {\r\n state.previousPath = state.currentPath;\r\n state.currentPath = action.payload;\r\n },\r\n setRedirectPath: (state, action: PayloadAction<string | null>) => { // <--- Nuevo reducer\r\n state.redirectPath = action.payload;\r\n },\r\n resetRouterState: (state) => {\r\n state.currentPath = '/';\r\n state.previousPath = null;\r\n state.redirectPath = null; // <--- Asegúrate de resetearlo también\r\n },\r\n },\r\n});\r\n\r\nexport const { setCurrentPath, setRedirectPath, resetRouterState } = routerSlice.actions; // <--- Exporta el nuevo action\r\nexport default routerSlice.reducer;","// src/store/menuUiSlice.ts\r\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { MenuUiState } from '../types';\r\n\r\nconst initialState: MenuUiState = {\r\n isDrawerOpen: false,\r\n subMenuOpenStates: {},\r\n};\r\n\r\nconst menuUiSlice = createSlice({\r\n name: 'menuUi',\r\n initialState,\r\n reducers: {\r\n setDrawerOpen: (state, action: PayloadAction<boolean>) => {\r\n state.isDrawerOpen = action.payload;\r\n },\r\n toggleDrawer: (state) => {\r\n state.isDrawerOpen = !state.isDrawerOpen;\r\n },\r\n setSubMenuOpen: (state, action: PayloadAction<{ menuName: string; isOpen: boolean }>) => {\r\n state.subMenuOpenStates[action.payload.menuName] = action.payload.isOpen;\r\n },\r\n toggleSubMenu: (state, action: PayloadAction<string>) => {\r\n state.subMenuOpenStates[action.payload] = !state.subMenuOpenStates[action.payload];\r\n },\r\n // --- NUEVO REDUCER: Establecer el estado de todos los submenús ---\r\n setAllSubMenusOpen: (state, action: PayloadAction<boolean>) => {\r\n // Itera sobre todas las claves existentes y las establece al valor dado\r\n for (const menuName in state.subMenuOpenStates) {\r\n if (Object.prototype.hasOwnProperty.call(state.subMenuOpenStates, menuName)) {\r\n state.subMenuOpenStates[menuName] = action.payload;\r\n }\r\n }\r\n // Importante: Si hay nuevos submenús que no están en subMenuOpenStates,\r\n // no se verán afectados por este bucle.\r\n // Una estrategia más robusta para casos donde el menú puede cambiar dinámicamente\r\n // sería obtener todos los nombres de menú recursivamente desde clientContext.menu\r\n // y actualizar sus estados. Por ahora, asumimos que los que ya están en el estado\r\n // son los que queremos controlar.\r\n },\r\n resetMenuUiState: (state) => {\r\n Object.assign(state, initialState);\r\n },\r\n },\r\n});\r\n\r\nexport const {\r\n setDrawerOpen,\r\n toggleDrawer,\r\n setSubMenuOpen,\r\n toggleSubMenu,\r\n setAllSubMenusOpen, // ¡Exportamos la nueva acción!\r\n resetMenuUiState,\r\n} = menuUiSlice.actions;\r\n\r\nexport default menuUiSlice.reducer;","import Dialog from \"@mui/material/Dialog\";\nimport { ConfirmDialogProps } from \"../types\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogContentText from \"@mui/material/DialogContentText\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport Button from \"@mui/material/Button\";\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({ open, onClose, title, message }) => {\n return (\n <Dialog\n open={open}\n onClose={() => onClose(false)}\n aria-labelledby=\"confirm-dialog-title\"\n aria-describedby=\"confirm-dialog-description\"\n >\n <DialogTitle id=\"confirm-dialog-title\">{title}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"confirm-dialog-description\">\n {message}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => onClose(false)} color=\"primary\">\n Cancelar\n </Button>\n <Button onClick={() => onClose(true)} color=\"error\" autoFocus>\n Confirmar\n </Button>\n </DialogActions>\n </Dialog>\n );\n};","import {\n Popover,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Paper,\n CircularProgress,\n Box\n} from '@mui/material';\nimport { useState } from 'react';\nimport { DataGridOption } from '../../types';\n\ninterface DataGridOptionsDialogProps {\n open: boolean;\n onClose: () => void;\n options: DataGridOption[];\n anchorEl: HTMLElement | null;\n}\n\nexport const DataGridOptionsDialog: React.FC<DataGridOptionsDialogProps> = ({ \n open, \n onClose, \n options,\n anchorEl\n}) => {\n const [isExecuting, setIsExecuting] = useState(false);\n\n const handleOptionClick = async (handler: () => Promise<void>) => {\n try {\n setIsExecuting(true);\n await handler();\n } catch (error) {\n console.error('Error ejecutando handler:', error);\n } finally {\n setIsExecuting(false);\n onClose();\n }\n };\n\n return (\n <>\n {open && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\n zIndex: 1200,\n pointerEvents: 'none'\n }}\n />\n )}\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={onClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n sx: {\n zIndex: 1300,\n }\n }\n }}\n >\n <Paper sx={{ minWidth: 150, maxWidth: 350 }}>\n {isExecuting && (\n <Box \n sx={{ \n display: 'flex', \n justifyContent: 'center', \n alignItems: 'center',\n p: 5\n }}\n >\n <CircularProgress size={40} />\n </Box>\n )}\n {!isExecuting && (\n <List sx={{ \n py: 0,\n '& .MuiListItemButton-root': { \n py: 0.5, \n px: 1.5,\n minHeight: 36\n },\n '& .MuiListItemIcon-root': { \n minWidth: 32 \n },\n '& .MuiListItemText-primary': { \n fontSize: '0.85rem' \n },\n '& .MuiSvgIcon-root': {\n fontSize: 18\n }\n }}>\n {options\n .filter(option => option.visible !== false)\n .map((option) => (\n <ListItemButton \n key={option.id}\n onClick={() => handleOptionClick(option.handler)}\n >\n <ListItemIcon>\n {option.icon}\n </ListItemIcon>\n <ListItemText primary={option.label} />\n </ListItemButton>\n ))\n }\n </List>\n )}\n </Paper>\n </Popover>\n </>\n );\n};","import {Box, IconButton, Tooltip, Typography} from \"@mui/material\";\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport SearchOffIcon from '@mui/icons-material/SearchOff';\r\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\r\nimport { RenderHeaderCellProps } from \"react-data-grid\";\r\nimport { DetailTable } from \"backend-plus\";\r\nimport { FieldDefinition } from \"../../../types\";\r\n\r\nexport const defaultColumnHeaderCellRenderer = (props: RenderHeaderCellProps<any, unknown>, fieldDef:FieldDefinition) => {\r\n const { column } = props;\r\n const isPrimaryKey = fieldDef.isPk;\r\n return (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'flex-start',\r\n padding: '4px',\r\n boxSizing: 'border-box',\r\n height: '100%',\r\n }}\r\n >\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n fontWeight: 'bold',\r\n textDecoration: isPrimaryKey ? 'underline' : 'none',\r\n fontSize: 'o.930rem', // Puedes ajustar el tamaño si es necesario\r\n }}\r\n >\r\n {column.name}\r\n </Typography>\r\n </Box>\r\n );\r\n}\r\n\r\nexport const actionsColumnHeaderCellRenderer = (\r\n props: RenderHeaderCellProps<any, unknown>, \r\n isFilterRowVisible:boolean, \r\n toggleFilterVisibility: () => void, \r\n handleDataGridOptions: (event: React.MouseEvent<HTMLElement>) => void\r\n) => {\r\n return (\r\n <Box sx={{ display: 'flex', flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 0.2}}> \r\n <IconButton\r\n color=\"inherit\"\r\n onClick={toggleFilterVisibility}\r\n size=\"small\"\r\n title={isFilterRowVisible ? 'Ocultar filtros' : 'Mostrar filtros'}\r\n sx={{ p: 0.25 }}\r\n >\r\n {isFilterRowVisible ? <SearchOffIcon sx={{ fontSize: 18 }} /> : <SearchIcon sx={{ fontSize: 18 }} />}\r\n </IconButton>\r\n <IconButton\r\n onClick={(event) => handleDataGridOptions(event)}\r\n size =\"small\"\r\n title = \"Opciones de esta tabla\"\r\n sx={{ p: 0.25 }}\r\n >\r\n <MoreVertIcon sx={{ fontSize: 20, variant: \"filled\", size: \"small\" }} />\r\n </IconButton>\r\n </Box>\r\n );\r\n};\r\n\r\nexport const detailColumnCellHeaderRenderer = (props: RenderHeaderCellProps<any, unknown>, detailTable:DetailTable) => \r\n <Tooltip title={detailTable.label}>\r\n <Typography variant=\"caption\" sx={{ fontSize: '0.75rem', fontWeight: 'bold' }}>\r\n {detailTable.abr.toUpperCase()}\r\n </Typography>\r\n </Tooltip>","import { InputBase } from \"@mui/material\";\r\nimport { FilterRendererProps } from \"../../types\";\r\n\r\nfunction FilterInputRenderer<R extends Record<string, any>, S>({\r\n column,\r\n filters,\r\n setFilters\r\n}: FilterRendererProps<R, S>) {\r\n return (\r\n <InputBase\r\n value={filters[column.key] || ''}\r\n onChange={(e) =>\r\n setFilters({\r\n ...filters,\r\n [column.key]: e.target.value\r\n })\r\n }\r\n sx={{\r\n width: '100%',\r\n height: 25,\r\n margin: '0',\r\n border: '1px solid #ccc',\r\n borderRadius: '4px',\r\n padding: '2px 4px',\r\n fontSize: '0.8rem',\r\n boxSizing: 'border-box',\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n );\r\n}\r\n\r\nexport default FilterInputRenderer;","import { RenderSummaryCellProps } from \"react-data-grid\";\r\nimport { FixedField } from \"../../../types\";\r\nimport FilterInputRenderer from \"../FilterInputRender\";\r\nimport { Box } from \"@mui/material\";\r\n\r\nexport const defaultColumnSummaryCellRenderer = (props: RenderSummaryCellProps<any, any>, fixedFields:FixedField[]|undefined, isFilterRowVisible:boolean, filters: Record<string, string>, setFilters: React.Dispatch<React.SetStateAction<Record<string, string>>>) => {\r\n const { column } = props\r\n // Si el campo es fijo, no debe aparecer en los filtros\r\n const fixedFieldEntry = fixedFields?.find(f => f.fieldName === column.key);\r\n // El filtro solo se muestra si NO es un campo fijo O si es un campo fijo que sí tiene 'until' o bien si el filtro está deshabilitado\r\n if (fixedFieldEntry && fixedFieldEntry.until === undefined || !isFilterRowVisible) return null; \r\n return <Box><FilterInputRenderer\r\n column={column}\r\n filters={filters}\r\n setFilters={setFilters}\r\n /></Box>\r\n}\r\n\r\nexport const actionsColumnSummaryCellRenderer = (props: RenderSummaryCellProps<any, unknown>) => null\r\n\r\nexport const detailColumnCellSummaryRenderer = (props: RenderSummaryCellProps<any, unknown>) => null","import { RenderCellProps } from 'react-data-grid';\r\nimport { Box, Button, IconButton, Tooltip, Typography, useTheme } from '@mui/material';\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\r\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\r\nimport ViewHeadlineIcon from '@mui/icons-material/ViewHeadline';\r\nimport DeleteIcon from '@mui/icons-material/Delete';\r\nimport AddIcon from '@mui/icons-material/Add';\r\nimport GenericDataGrid, { getPrimaryKeyValues, NEW_ROW_INDICATOR, DETAIL_ROW_INDICATOR } from '../GenericDataGrid';\r\nimport { CustomColumn, DefaultColumn, DetailColumn, ActionColumn } from '../GenericDataGrid';\r\nimport { FixedField } from '../../../types';\r\nimport { clientSides } from '../clientSides';\r\nimport FallbackClientSideRenderer from '../FallbackClientSideRenderer';\r\nimport { OverridableComponent } from '@mui/material/OverridableComponent';\r\nimport { SvgIconTypeMap } from '@mui/material/SvgIcon';\r\n\r\ntype ActionButtonDefinition = {\r\n action: 'insert' | 'delete' | 'vertical-edit'\r\n handler: (row?: any) => void\r\n title: string\r\n icon: OverridableComponent<SvgIconTypeMap<{}, \"svg\">> & { muiName: string }\r\n color: 'success' | 'error' | 'primary'\r\n}\r\nimport { getDetailTableAndFixedFieldsForDetailTableAbr } from '../../../utils/functions';\r\n\r\nexport const allColumnsCellRenderer = (props: RenderCellProps<any, unknown>) => {\r\n const theme = useTheme();\r\n const column = props.column as unknown as CustomColumn<any, unknown>;\r\n const { row, rowIdx } = props;\r\n\r\n // Lógica para la fila de detalle\r\n if (row[DETAIL_ROW_INDICATOR]) {\r\n const detailTableAbr = row[DETAIL_ROW_INDICATOR];\r\n const detailColumn = column as DetailColumn<any, unknown>;\r\n \r\n // Verifica que la columna actual sea la de detalle para esa fila\r\n if (column.customType === 'detail' && detailColumn.detailTable.abr === detailTableAbr) {\r\n const { detailTable, fixedFields } = getDetailTableAndFixedFieldsForDetailTableAbr(detailColumn.tableDefinition, detailTableAbr, row)\r\n return (\r\n <Box sx={{\r\n // Se eliminó el padding para que la sub-grilla se extienda por completo\r\n minHeight: '200px',\r\n width: '100%',\r\n height: '100%',\r\n //display: 'flex',\r\n //flexDirection: 'column',\r\n boxSizing: 'border-box'\r\n }}\r\n onMouseDown={(e) => e.stopPropagation()} \r\n onClick={(e) => e.stopPropagation()} \r\n onKeyDown={(e) => e.stopPropagation()}\r\n onDoubleClick={(e) => e.stopPropagation()}\r\n >\r\n <GenericDataGrid tableName={detailTable.table!} fixedFields={fixedFields} gridStyles={{height:322}}/>\r\n </Box>\r\n \r\n );\r\n }\r\n \r\n // Si la fila es de detalle, pero no es la columna correcta, devuelve null\r\n return undefined;\r\n }\r\n\r\n // Lógica para renderizar una celda normal\r\n switch (column.customType) {\r\n case 'default': {\r\n const defaultColumn = column as DefaultColumn<any, unknown>;\r\n // --- CAMBIO: Cambiamos cellFeedback a cellFeedbackMap ---\r\n const { fieldDef, tableDefinition, primaryKey, cellFeedbackMap, fixedFields, localCellChanges } = defaultColumn;\r\n // ---------------------------------------------------------\r\n const rowId = getPrimaryKeyValues(row, primaryKey);\r\n const cellKey = `${rowId}-${props.column.key}`; // Clave única para el mapa\r\n\r\n // Obtener el feedback específico para esta celda\r\n const currentCellFeedback = cellFeedbackMap.get ? cellFeedbackMap.get(cellKey) : cellFeedbackMap[cellKey];\r\n\r\n if (fieldDef?.clientSide) {\r\n const ClientSideComponent = clientSides[fieldDef.clientSide];\r\n if (ClientSideComponent) {\r\n return <ClientSideComponent {...props} fieldDefinition={fieldDef} tableDefinition={tableDefinition} primaryKey={primaryKey} />;\r\n }\r\n return <FallbackClientSideRenderer {...props} fieldDefinition={fieldDef} tableDefinition={tableDefinition} primaryKey={primaryKey} />;\r\n }\r\n\r\n let cellBackgroundColor = 'transparent';\r\n \r\n // --- LÓGICA DE COLOR DE FEEDBACK ADAPTADA ---\r\n if (currentCellFeedback) {\r\n cellBackgroundColor = currentCellFeedback.type === 'error' ? theme.palette.error.light : theme.palette.success.light;\r\n } else {\r\n // ------------------------------------------\r\n const isNewRowLocalCheck = row[NEW_ROW_INDICATOR];\r\n const isMandatory = tableDefinition.primaryKey.includes(props.column.key) || (tableDefinition.fields.find(f => f.name === props.column.key)?.nullable === false);\r\n const hasValue = row[props.column.key] !== null && row[props.column.key] !== undefined && String(row[props.column.key]).trim() !== '';\r\n const isFixedFieldCurrent = fixedFields?.some(f => f.fieldName === props.column.key);\r\n\r\n if (isFixedFieldCurrent) {\r\n cellBackgroundColor = theme.palette.action.selected;\r\n } else if ((isNewRowLocalCheck && isMandatory && !hasValue) || (localCellChanges.has(rowId) && localCellChanges.get(rowId)?.has(props.column.key))) {\r\n cellBackgroundColor = theme.palette.info.light;\r\n }\r\n }\r\n \r\n // TODO: Capturar valor fecha\r\n const value = row[props.column.key];\r\n return (\r\n <Tooltip title={currentCellFeedback?.message || ''}>\r\n <Box sx={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: cellBackgroundColor, transition: 'background-color 0.3s ease-in-out', display: 'flex', alignItems: 'center', paddingLeft: '8px', boxSizing: 'border-box' }}>\r\n <Typography variant=\"body2\" sx={{ fontSize: '0.875rem', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', width: '100%' }}>\r\n {value === null || value === undefined ? '' : String(value)}\r\n </Typography>\r\n </Box>\r\n </Tooltip>\r\n );\r\n }\r\n \r\n case 'detail': {\r\n const detailColumn = column as DetailColumn<any, unknown>;\r\n const { detailTable, primaryKey, tableData, setTableData, detailKey } = detailColumn;\r\n \r\n const isExpanded = tableData.some(r => \r\n r[DETAIL_ROW_INDICATOR] === detailTable.abr && \r\n getPrimaryKeyValues(r, primaryKey) === getPrimaryKeyValues({...row,[DETAIL_ROW_INDICATOR]: detailTable.abr}, primaryKey)\r\n );\r\n\r\n return (\r\n <Tooltip title={detailTable.label}>\r\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%' }}>\r\n <IconButton\r\n onClick={(event) => {\r\n let rows = [...tableData];\r\n const rowId = getPrimaryKeyValues({...row,[DETAIL_ROW_INDICATOR]: detailTable.abr}, primaryKey);\r\n \r\n if (isExpanded) {\r\n setTableData(rows.filter((r) => \r\n !(r[DETAIL_ROW_INDICATOR] === detailTable.abr && \r\n getPrimaryKeyValues(r, primaryKey) === rowId)\r\n ));\r\n } else {\r\n const parentRowIndex = rowIdx;\r\n rows.splice(parentRowIndex + 1, 0, {\r\n ...row,\r\n [DETAIL_ROW_INDICATOR]: detailTable.abr,\r\n });\r\n setTableData(rows);\r\n }\r\n event.stopPropagation();\r\n }}\r\n \r\n >\r\n {isExpanded ? <KeyboardArrowUpIcon sx={{ fontSize: 20 }} /> : <KeyboardArrowDownIcon sx={{ fontSize: 20 }} />}\r\n </IconButton>\r\n </Box>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n case 'action': {\r\n const actionColumn = column as ActionColumn<any, unknown>;\r\n const { tableDefinition, handleDeleteRow, handleAddRow } = actionColumn;\r\n \r\n const gridActionButtons: ActionButtonDefinition[] = [\r\n {\r\n action: 'insert',\r\n handler: handleAddRow,\r\n icon: AddIcon,\r\n title: 'Agregar registro',\r\n color: 'success',\r\n },\r\n {\r\n action: 'delete',\r\n handler: handleDeleteRow,\r\n icon: DeleteIcon,\r\n title: 'Eliminar registro',\r\n color: 'error',\r\n },\r\n {\r\n action: 'vertical-edit',\r\n handler: () => {}, // implementar funcion\r\n icon: ViewHeadlineIcon,\r\n title: 'Editar registro en forma de ficha',\r\n color: 'primary',\r\n }\r\n ];\r\n\r\n return (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%', gap: 0.5 }}>\r\n {gridActionButtons.map(actionDef => (\r\n tableDefinition.allow![actionDef.action] ? <Button \r\n key={actionDef.action}\r\n variant=\"outlined\" \r\n color={actionDef.color} \r\n size=\"small\" \r\n onClick={() => actionDef.handler(row)} \r\n title={actionDef.title} \r\n sx={{ width:22, minWidth: 22, height: 22, '& .MuiButton-startIcon': { m: 0 } }}\r\n >\r\n <actionDef.icon sx={{ fontSize: 18 }} />\r\n </Button> : null\r\n ))}\r\n </Box>\r\n );\r\n }\r\n\r\n default:\r\n return undefined;\r\n }\r\n};","import React from 'react';\r\nimport { Box, Typography } from '@mui/material';\r\nimport { ClientSideProps } from './clientSides';\r\n\r\nconst ExampleClientSideComponent: React.FC<ClientSideProps> = ({ row, column, fieldDefinition }) => {\r\n // Accede al valor de la celda:\r\n const value = row[column.key];\r\n\r\n // Accede a la definición del campo si necesitas propiedades específicas\r\n // const customProperty = fieldDefinition?.customProp;\r\n\r\n return (\r\n <Box sx={{\r\n padding: 0.5,\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: value === 'Special' ? 'lightblue' : 'transparent'\r\n }}>\r\n <Typography variant=\"body2\" sx={{ fontWeight: 'bold' }}>\r\n {value ? `CS: ${value}` : 'N/A'}\r\n </Typography>\r\n {/* Puedes añadir lógica o UI más compleja aquí */}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ExampleClientSideComponent;","import React from 'react';\r\nimport { Box, Typography, Tooltip } from '@mui/material';\r\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber';\r\nimport { ClientSideProps } from './clientSides'; // Asegúrate de importar la interfaz\r\n\r\nconst FallbackClientSideRenderer: React.FC<ClientSideProps> = ({ column, row, fieldDefinition }) => {\r\n const clientSideName = fieldDefinition?.clientSide || 'Desconocido';\r\n\r\n return (\r\n <Tooltip title={`Componente clientSide '${clientSideName}' no implementado. Mostrando valor por defecto.`}>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between', // Para espaciar el valor y el icono\r\n gap: 1, // Espacio entre elementos\r\n width: '100%',\r\n height: '100%',\r\n paddingLeft: '8px',\r\n backgroundColor: 'rgba(255, 193, 7, 0.1)', // Amarillo claro para advertencia\r\n border: '1px dashed rgba(255, 193, 7, 0.5)',\r\n boxSizing: 'border-box',\r\n overflow: 'hidden', // Evita que el contenido se desborde\r\n }}\r\n >\r\n <Typography variant=\"body2\" noWrap sx={{ flexGrow: 1 }}>\r\n {clientSideName + ' not found'}\r\n </Typography>\r\n <WarningAmberIcon\r\n sx={{\r\n fontSize: 18,\r\n color: 'warning.main',\r\n marginRight: '4px' // Pequeño margen a la derecha del icono\r\n }}\r\n />\r\n </Box>\r\n </Tooltip>\r\n );\r\n};\r\n\r\nexport default FallbackClientSideRenderer;","import React from 'react';\nimport { RenderCellProps } from 'react-data-grid';\nimport { FieldDefinition, TableDefinition } from '../../types';\n\nimport ExampleClientSideComponent from './ExampleClientSideComponent';\nimport FallbackClientSideRenderer from './FallbackClientSideRenderer';\n\nexport interface ClientSideProps extends RenderCellProps<any, any> {\n fieldDefinition: FieldDefinition;\n tableDefinition: TableDefinition;\n primaryKey: string[];\n}\n\nexport let clientSides: Record<string, React.FC<ClientSideProps>> = {\n 'ExampleClientSideComponent': ExampleClientSideComponent as React.FC<ClientSideProps>, // Aseguramos el tipo aquí también\n 'FallbackClientSideRenderer': FallbackClientSideRenderer as React.FC<ClientSideProps>, // Y aquí\n};\n\nexport const extendClientSides = (newRenderers: Record<string, React.FC<ClientSideProps>>) => {\n clientSides = { ...clientSides, ...newRenderers };\n console.log('clientSides extendidos:', clientSides);\n};","import { useCallback, useMemo, useState } from \"react\";\r\nimport { Column } from \"react-data-grid\";\r\nimport { useSnackbar } from \"../../contexts/SnackbarContext\";\r\nimport { useApiCall } from \"../../hooks/useApiCall\";\r\nimport InputBase from \"@mui/material/InputBase\";\r\n// Importamos CellFeedbackMap junto con InputRendererProps\r\nimport { InputRendererProps, CellFeedback, CellFeedbackMap } from \"../../types\"; \r\n// getCellKey y getPrimaryKeyValues deben provenir de tu archivo GenericDataGrid\r\nimport { getCellKey, getPrimaryKeyValues, NEW_ROW_INDICATOR } from \"./GenericDataGrid\"; \r\nimport { useTheme } from \"@mui/material\";\r\n\r\nfunction findChangedValues(oldRowData:any, newRowData:any, isNewRow: boolean) {\r\n let changes: string[] = [];\r\n for (const key in newRowData) {\r\n // Si la propiedad existe en ambos Y el valor es diferente, O es una nueva fila\r\n if (Object.prototype.hasOwnProperty.call(oldRowData, key) && oldRowData[key] !== newRowData[key] || isNewRow ) {\r\n changes.push(key);\r\n }\r\n }\r\n return changes;\r\n}\r\n\r\nfunction InputRenderer<R extends Record<string, any>, S>({\r\n column,\r\n row,\r\n rowIdx,\r\n tableDefinition,\r\n onRowChange,\r\n onClose,\r\n cellFeedbackMap, // Tipo: CellFeedbackMap\r\n setCellFeedbackMap, // Tipo: Dispatch<SetStateAction<CellFeedbackMap>>\r\n onKeyPress,\r\n setTableData,\r\n setLocalCellChanges,\r\n localCellChanges,\r\n primaryKey\r\n}: InputRendererProps<R, S>) {\r\n const tableName = tableDefinition.tableName!;\r\n const [editingValue, setEditingValue] = useState(row[column.key]);\r\n const theme = useTheme();\r\n const { showSuccess, showError } = useSnackbar();\r\n \r\n // Generamos la clave única usando la función importada\r\n const cellKey = getCellKey(row, column.key, primaryKey);\r\n \r\n // --- LÍNEA CORREGIDA ---\r\n // Asumimos que cellFeedbackMap es un Map<string, CellFeedback>\r\n const currentCellFeedback = cellFeedbackMap.get(cellKey);\r\n // ------------------------\r\n \r\n let cellBackgroundColor;\r\n if (currentCellFeedback) {\r\n cellBackgroundColor = currentCellFeedback.type === 'error' ? theme.palette.error.light : theme.palette.success.light;\r\n }\r\n \r\n const initialRowId = useMemo(() => getPrimaryKeyValues(row, primaryKey), [row, primaryKey]);\r\n const { callApi } = useApiCall();\r\n\r\n const handleCommit = useCallback(async (currentValue: any, closeEditor: boolean, focusNextCell: boolean) => {\r\n const processedNewValue = typeof currentValue === 'string'\r\n ? (currentValue.trim() === '' ? null : currentValue.trim())\r\n : currentValue;\r\n\r\n const potentialUpdatedRow = { ...row, [column.key]: processedNewValue } as R;\r\n\r\n const arePKValuesFilled = tableDefinition.primaryKey.every(key =>\r\n potentialUpdatedRow[key] !== undefined && potentialUpdatedRow[key] !== null && String(potentialUpdatedRow[key]).trim() !== ''\r\n );\r\n const isNewRow = !arePKValuesFilled || potentialUpdatedRow[NEW_ROW_INDICATOR];\r\n\r\n const isMandatoryField = tableDefinition.primaryKey.includes(column.key) || (tableDefinition.fields.find(f => f.name === column.key)?.nullable === false);\r\n const isMandatoryFieldEmpty = isNewRow && isMandatoryField && (processedNewValue === null || processedNewValue === undefined || String(processedNewValue).trim() === '');\r\n\r\n if (processedNewValue === row[column.key] && !isNewRow && !isMandatoryFieldEmpty) {\r\n console.log(\"No se guardó: el valor no cambió (y no es una nueva fila o campo obligatorio vacío que se está iniciando).\");\r\n return;\r\n }\r\n\r\n const oldRowData = { ...row };\r\n const primaryKeyValuesForBackend = tableDefinition.primaryKey.map(key => potentialUpdatedRow[key]);\r\n const currentRowIdBeforeUpdate = getPrimaryKeyValues(oldRowData, tableDefinition.primaryKey); \r\n\r\n onRowChange({ ...row, [column.key]: processedNewValue } as R, true);\r\n \r\n if (isNewRow) {\r\n const areAllMandatoryFieldsFilled = tableDefinition.fields.every(fieldDef => {\r\n const isMandatory = (fieldDef.nullable === false || fieldDef.isPk);\r\n const fieldValue = potentialUpdatedRow[fieldDef.name];\r\n return !isMandatory || (fieldValue !== null && fieldValue !== undefined && String(fieldValue).trim() !== '');\r\n });\r\n\r\n if (!areAllMandatoryFieldsFilled) {\r\n console.log(\"Nueva fila: Faltan campos obligatorios. No se guarda en el backend todavía.\");\r\n setLocalCellChanges(prev => {\r\n const newMap = new Map(prev);\r\n const currentColumnsInRow = newMap.get(initialRowId) || new Set();\r\n\r\n tableDefinition.fields.forEach(fieldDef => {\r\n const isMandatory = (fieldDef.nullable === false || fieldDef.isPk);\r\n const isEditable = fieldDef.editable !== false;\r\n const fieldValue = potentialUpdatedRow[fieldDef.name];\r\n if (isMandatory && isEditable && (fieldValue === null || fieldValue === undefined || String(fieldValue).trim() === '')) {\r\n currentColumnsInRow.add(fieldDef.name);\r\n } else {\r\n currentColumnsInRow.delete(fieldDef.name);\r\n }\r\n });\r\n newMap.set(initialRowId, currentColumnsInRow);\r\n return newMap;\r\n });\r\n return;\r\n } else {\r\n console.log(\"Nueva fila: Todos los campos obligatorios están llenos. Procediendo a guardar.\");\r\n setLocalCellChanges(prev => {\r\n const newMap = new Map(prev);\r\n newMap.delete(initialRowId);\r\n return newMap;\r\n });\r\n }\r\n }\r\n \r\n const status = isNewRow ? 'new' : 'update';\r\n let rowToSend: Record<string, any> = {};\r\n if (isNewRow) {\r\n tableDefinition.fields.forEach(fieldDef => {\r\n const fieldValue = potentialUpdatedRow[fieldDef.name];\r\n if (fieldValue !== undefined && fieldValue !== null && String(fieldValue).trim() !== '') {\r\n rowToSend[fieldDef.name] = fieldValue;\r\n } else if (tableDefinition.primaryKey.includes(fieldDef.name) && (fieldValue === null || fieldValue === undefined || String(fieldValue).trim() === '')) {\r\n rowToSend[fieldDef.name] = fieldValue;\r\n }\r\n });\r\n if (localCellChanges.has(initialRowId)) {\r\n localCellChanges.get(initialRowId)?.forEach((colKey: string) => {\r\n if (!rowToSend.hasOwnProperty(colKey)) {\r\n rowToSend[colKey] = potentialUpdatedRow[colKey];\r\n }\r\n });\r\n }\r\n delete rowToSend[NEW_ROW_INDICATOR];\r\n } else {\r\n rowToSend[column.key] = processedNewValue;\r\n tableDefinition.primaryKey.forEach(pkField => {\r\n rowToSend[pkField] = potentialUpdatedRow[pkField];\r\n });\r\n }\r\n \r\n try {\r\n const response = await callApi('table_record_save',{\r\n table:tableName,\r\n primaryKeyValues: primaryKeyValuesForBackend,\r\n newRow: rowToSend,\r\n oldRow: oldRowData,\r\n status\r\n });\r\n\r\n let finalRowIdForFeedback: string;\r\n let persistedRowData: R;\r\n\r\n if (response.row && isNewRow) {\r\n persistedRowData = { ...response.row };\r\n setTableData(prevData => {\r\n const newData = [...prevData];\r\n const originalRowId = getPrimaryKeyValues(oldRowData, tableDefinition.primaryKey);\r\n const rowIndex = newData.findIndex(r => getPrimaryKeyValues(r, tableDefinition.primaryKey) === originalRowId);\r\n if (rowIndex !== -1) {\r\n newData[rowIndex] = persistedRowData;\r\n } else {\r\n const newPrimaryKeyId = getPrimaryKeyValues(persistedRowData, tableDefinition.primaryKey);\r\n const newRowIndex = newData.findIndex(r => getPrimaryKeyValues(r, tableDefinition.primaryKey) === newPrimaryKeyId);\r\n if (newRowIndex !== -1) {\r\n newData[newRowIndex] = persistedRowData;\r\n }\r\n }\r\n return newData;\r\n });\r\n finalRowIdForFeedback = getPrimaryKeyValues(persistedRowData, tableDefinition.primaryKey);\r\n } else {\r\n persistedRowData = response.row;\r\n const isPrimaryKeyColumn = tableDefinition.primaryKey.includes(column.key);\r\n finalRowIdForFeedback = isPrimaryKeyColumn\r\n ? getPrimaryKeyValues(potentialUpdatedRow, tableDefinition.primaryKey)\r\n : currentRowIdBeforeUpdate;\r\n onRowChange({ ...response.row } as R, true);\r\n }\r\n\r\n // --- MULTI-FEEDBACK DE ÉXITO ---\r\n const changes = findChangedValues(oldRowData, response.row, isNewRow);\r\n setCellFeedbackMap(prevFeedback => {\r\n // Siempre usamos new Map(prevFeedback) para garantizar inmutabilidad\r\n const newFeedback = new Map(prevFeedback);\r\n \r\n changes.forEach((key) => {\r\n // Creamos la clave única de forma más robusta (idealmente usando getCellKey)\r\n const keyForMap = `${finalRowIdForFeedback}-${key}`; \r\n newFeedback.set(keyForMap, { rowId: finalRowIdForFeedback, columnKey: key, type: 'success' } as CellFeedback);\r\n });\r\n\r\n return newFeedback;\r\n });\r\n // -------------------------------\r\n\r\n } catch (err: any) {\r\n console.error('Error al guardar el registro:', err);\r\n \r\n // --- MULTI-FEEDBACK DE ERROR ---\r\n const keyForMap = `${currentRowIdBeforeUpdate}-${column.key}`;\r\n setCellFeedbackMap(prevFeedback => {\r\n // Siempre usamos new Map(prevFeedback) para garantizar inmutabilidad\r\n const newFeedback = new Map(prevFeedback); \r\n newFeedback.set(keyForMap, { \r\n rowId: currentRowIdBeforeUpdate, \r\n columnKey: column.key, \r\n type: 'error', \r\n message: err.message \r\n } as CellFeedback);\r\n return newFeedback;\r\n });\r\n // -------------------------------\r\n }\r\n }, [\r\n column, row, onRowChange, tableName, tableDefinition.primaryKey,\r\n tableDefinition.fields, showSuccess, showError, setCellFeedbackMap, onClose, \r\n setTableData, setLocalCellChanges, localCellChanges, initialRowId\r\n ]);\r\n\r\n const handleKeyDown = useCallback(async(event: React.KeyboardEvent) => {\r\n if (['Enter', 'Tab', 'ArrowDown', 'ArrowUp','ArrowRight', 'ArrowLeft', 'F4'].includes(event.key)) {\r\n await handleCommit(editingValue, true, true);\r\n if (onKeyPress) {\r\n onKeyPress(rowIdx, column.key, event, handleCommit);\r\n }\r\n }\r\n }, [handleCommit, editingValue, column.key, rowIdx, onKeyPress]);\r\n\r\n const handleBlur = useCallback(() => {\r\n handleCommit(editingValue, true, false);\r\n }, [handleCommit, editingValue]);\r\n\r\n const fieldDefinition = tableDefinition.fields.find(f => f.name === column.key);\r\n const isFieldEditable = fieldDefinition?.editable !== false;\r\n\r\n return (\r\n <InputBase\r\n value={editingValue === null ? '' : editingValue}\r\n onChange={(e) => setEditingValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n onBlur={handleBlur}\r\n placeholder={''}\r\n sx={{\r\n width: '100%',\r\n margin: '0',\r\n border: '1px solid #ccc',\r\n borderRadius: '4px',\r\n padding: '2px 4px',\r\n fontSize: '0.8rem',\r\n boxSizing: 'border-box',\r\n backgroundColor: cellBackgroundColor,\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n autoFocus\r\n disabled={!isFieldEditable}\r\n />\r\n );\r\n}\r\n\r\nexport default InputRenderer;","import { Column, RenderEditCellProps } from \"react-data-grid\";\r\nimport { CellFeedback, FieldDefinition, FixedField, TableDefinition } from \"../../../types\";\r\nimport InputRenderer from \"../InputRenderer\";\r\nimport { CustomColumn, DefaultColumn, getPrimaryKeyValues } from \"../GenericDataGrid\";\r\nimport { Box, Tooltip } from \"@mui/material\";\r\n\r\nexport const allColumnsEditCellRenderer = (\r\n props: RenderEditCellProps<any, any>, \r\n allColumns:Column<any>[]\r\n) => {\r\n const column = props.column as unknown as CustomColumn<any, unknown>;\r\n switch (column.customType) {\r\n case 'default': {\r\n const defaultColumn = column as DefaultColumn<any, unknown>;\r\n const {\r\n tableDefinition, \r\n fixedFields, \r\n primaryKey, \r\n setTableData, \r\n cellFeedbackMap, // <--- CAMBIADO\r\n setCellFeedbackMap, // <--- CAMBIADO\r\n handleKeyPressInEditor,\r\n localCellChanges,\r\n setLocalCellChanges\r\n } = defaultColumn\r\n \r\n if (column.editable) { \r\n const fieldDefinition = tableDefinition.fields.find(f => f.name === column.key);\r\n \r\n // Busca si el campo es fijo en el array fixedFields\r\n const isFixedField = fixedFields?.some(f => f.fieldName === column.key);\r\n const isFieldEditableByUI = fieldDefinition?.editable !== false && !isFixedField; // No editable si es fijo\r\n \r\n if (!isFieldEditableByUI) {\r\n // Si el campo no es editable por UI (ej. por ser fijo), no renderizamos el editor\r\n return undefined\r\n }\r\n \r\n const rowId = getPrimaryKeyValues(props.row, primaryKey);\r\n const cellKey = `${rowId}-${props.column.key}`; // Clave única\r\n \r\n // Obtener el feedback específico para esta celda\r\n const currentCellFeedback = cellFeedbackMap.get ? cellFeedbackMap.get(cellKey) : cellFeedbackMap[cellKey];\r\n\r\n return (\r\n // --- TOOLTIP ADAPTADO: Lee el mensaje de error desde el Mapa ---\r\n <Tooltip title={currentCellFeedback?.message || ''}>\r\n <Box>\r\n <InputRenderer\r\n {...props}\r\n tableDefinition={tableDefinition}\r\n setCellFeedbackMap={setCellFeedbackMap} // <--- PASAMOS setCellFeedbackMap como setCellFeedback a InputRenderer\r\n cellFeedbackMap={cellFeedbackMap} // <--- PASAMOS cellFeedbackMap\r\n onKeyPress={(rowIndex, columnKey, event, handleCommit) => handleKeyPressInEditor(rowIndex, columnKey, event, allColumns, handleCommit)}\r\n setTableData={setTableData}\r\n setLocalCellChanges={setLocalCellChanges}\r\n localCellChanges={localCellChanges}\r\n primaryKey={primaryKey}\r\n />\r\n </Box>\r\n </Tooltip> \r\n )\r\n }\r\n return undefined\r\n }\r\n case 'detail': {\r\n return undefined\r\n }\r\n case 'action': {\r\n return undefined\r\n }\r\n default:\r\n return undefined;\r\n }\r\n\r\n}","export function EmptyRowsRenderer() {\r\n return (\r\n <div style={{\r\n // Posicionamiento absoluto respecto a la pantalla\r\n position: 'fixed',\r\n top: '50%', // Centrado verticalmente\r\n left: '50%', // Centrado horizontalmente\r\n transform: 'translate(-50%, -50%)', // Ajuste para el 50% del tamaño del div\r\n \r\n // Estilos de visualización\r\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\r\n border: '1px solid #ccc',\r\n borderRadius: '4px',\r\n padding: '16px 24px',\r\n \r\n boxShadow: '0 2px 10px rgba(0,0,0,0.1)'\r\n }}>\r\n <div style={{ textAlign: 'center' }}>\r\n No hay filas para mostrar\r\n </div>\r\n </div>\r\n );\r\n}","// src/components/grid/menu/options.tsx\nimport React from 'react';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport ViewColumnIcon from '@mui/icons-material/ViewColumn';\nimport VisibilityOffIcon from '@mui/icons-material/VisibilityOff';\nimport FileDownloadIcon from '@mui/icons-material/FileDownload';\nimport FileUploadIcon from '@mui/icons-material/FileUpload';\nimport DeleteSweepIcon from '@mui/icons-material/DeleteSweep';\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\nimport { DataGridOption, TableDefinition, FixedField } from '../../../types';\n\n/**\n * Parámetros para construir las opciones del menú\n */\nexport interface BuildMenuOptionsParams {\n tableDefinition: TableDefinition | null;\n tableName: string;\n fixedFields?: FixedField[];\n setTableData: React.Dispatch<React.SetStateAction<any[]>>;\n callApi: (service: string, params: any) => Promise<any>;\n showSuccess: (message: string) => void;\n showError: (message: string) => void;\n showWarning: (message: string) => void;\n}\n\n/**\n * Construye el array de opciones del menú de la grilla\n * Las opciones se muestran condicionalmente según los permisos de la tabla\n */\nexport const buildMenuOptions = (params: BuildMenuOptionsParams): DataGridOption[] => {\n const { \n tableDefinition, \n tableName, \n fixedFields, \n setTableData, \n callApi, \n showSuccess, \n showError,\n showWarning\n } = params;\n\n if (!tableDefinition) return [];\n\n const options: DataGridOption[] = [];\n\n // Opción: Refrescar (siempre visible)\n options.push({\n id: 'refresh',\n label: 'refrescar la grilla desde la base de datos',\n icon: <RefreshIcon />,\n handler: async () => {\n try {\n const data = await callApi('table_data', {\n table: tableName,\n fixedFields: fixedFields\n });\n setTableData(data);\n showSuccess('Grilla refrescada correctamente');\n } catch (err: any) {\n showError(`Error al refrescar: ${err.message || 'Error desconocido'}`);\n }\n },\n visible: true\n });\n\n // Opción: Mostrar columnas relacionadas (siempre visible)\n options.push({\n id: 'showColumns',\n label: 'mostrar las columnas relacionadas',\n icon: <ViewColumnIcon />,\n handler: async () => {\n console.log('Mostrar columnas relacionadas');\n // TODO: Implementar lógica\n },\n visible: true\n });\n\n // Opción: Ocultar/mostrar columnas (siempre visible)\n options.push({\n id: 'hideColumns',\n label: 'ocultar o mostrar columnas',\n icon: <VisibilityOffIcon />,\n handler: async () => {\n console.log('Ocultar/mostrar columnas');\n // TODO: Implementar lógica\n },\n visible: true\n });\n\n // Opción: Exportar (solo si está permitido)\n if (tableDefinition.allow?.export) {\n options.push({\n id: 'export',\n label: 'exportar',\n icon: <FileDownloadIcon />,\n handler: async () => {\n console.log('Exportar datos');\n // TODO: Implementar lógica de exportación\n },\n visible: true\n });\n }\n\n // Opción: Importar (solo si está permitido)\n if (tableDefinition.allow?.import) {\n options.push({\n id: 'import',\n label: 'importar',\n icon: <FileUploadIcon />,\n handler: async () => {\n console.log('Importar datos');\n // TODO: Implementar lógica de importación\n },\n visible: true\n });\n }\n\n // Opción: Borrar todos los registros (solo si está permitido delete)\n if (tableDefinition.allow?.delete) {\n options.push({\n id: 'deleteAll',\n label: 'borrar todos los registros',\n icon: <DeleteSweepIcon />,\n handler: async () => {\n showWarning('Esta operación eliminará TODOS los registros de la tabla');\n // TODO: Implementar confirmación y lógica\n },\n visible: true\n });\n }\n\n // Opción: Tabla completa y filtrada\n options.push({\n id: 'completeTable',\n label: 'tabla completa y filtrada',\n icon: <FilterAltIcon />,\n handler: async () => {\n console.log('Toggle tabla completa/filtrada');\n // TODO: Implementar lógica\n },\n visible: true\n });\n\n return options;\n};\n","// frontend-plus-react/src/App.tsx (modificado en tu librería)\n\nimport React, { useEffect } from 'react';\nimport './App.css';\nimport { BrowserRouter, Routes, Route, useLocation, Navigate } from 'react-router-dom';\nimport MainLayout from './components/MainLayout';\nimport SessionExpiredMessage from './components/SessionExpiredMessage';\nimport { AppProvider } from './contexts/AppContext';\nimport HomePage from './pages/HomePage';\nimport LogoutPage from './pages/LogoutPage';\nimport LoginPage from './pages/LoginPage';\nimport ProcedureForm from './components/ProcedureForm';\n\nimport { Provider } from 'react-redux';\nimport { PersistGate } from 'redux-persist/integration/react';\nimport { store, persistor } from './store';\n\nimport PrivateRoute from './components/PrivateRoute';\nimport InitialRedirectHandler from './components/InitialRedirectHandler';\nimport { useAppDispatch } from './store';\nimport { setCurrentPath } from './store/routerSlice';\n\nimport { SnackbarProvider } from './contexts/SnackbarContext';\nimport GenericDataGridPage from './pages/GenericDataGridPage';\nimport MenuTablePage from './pages/MenuTablePage';\n\nimport { WScreenProps, wScreens, FallbackWScreen, extendWScreens} from './pages/WScreens';\n\n\nimport { extendClientSides, ClientSideProps} from './components/grid/clientSides'; \nimport { extendResultsOk, ResultOkProps} from './pages/procedure-results/resultsOk'; // Ajusta la ruta\nimport { Box } from '@mui/material';\n\nconst LocationTracker: React.FC = () => {\n const location = useLocation();\n const dispatch = useAppDispatch();\n useEffect(() => {\n dispatch(setCurrentPath(location.pathname + location.search));\n }, [location, dispatch]);\n return null;\n};\n\ninterface FrontendPlusReactRoutesProps {\n myRoutes?: React.ReactNode;\n}\n\nexport function FrontendPlusReactRoutes({ myRoutes }: FrontendPlusReactRoutesProps) { // <--- CAMBIO AQUÍ\n return (\n <Routes>\n <Route path=\"/login\" element={<LoginPage />} />\n <Route path=\"/logout\" element={<LogoutPage />} />\n\n <Route element={\n <PrivateRoute>\n <InitialRedirectHandler />\n <MainLayout/>\n </PrivateRoute>\n }>\n <Route path=\"/\" element={<HomePage />} />\n <Route path=\"/home\" element={<HomePage />} />\n <Route path=\"/table/:tableName\" element={<GenericDataGridPage />} />\n <Route path=\"/menu/:menuName\" element={<MenuTablePage />} />\n <Route path=\"/procedures/:procedureName\" element={<ProcedureForm />} />\n {Object.keys(wScreens).map((screenName) => (\n <Route\n key={screenName}\n path={`/wScreens/${screenName}`}\n element={React.createElement(\n Box,\n { \n sx: { pt: 3, pl: 4 },\n },\n React.createElement(wScreens[screenName], { screenName } as WScreenProps)\n )}\n />\n ))}\n <Route\n path=\"/wScreens-fallback/:screenName\"\n element={<Box sx={{ p: 3 }}><FallbackWScreen screenName=\":screenName\" /></Box>}\n />\n <Route path=\"*\" element={<div style={{ marginTop: '20px', marginLeft: \"10px\" }}>404 - Recurso No Encontrado</div>} />\n </Route>\n {myRoutes}\n\n \n <Route path=\"*\" element={<Navigate to=\"/\" replace />} />\n </Routes>\n );\n}\n\nexport interface AppProps {\n myRoutes?: React.ReactNode;\n myWScreens?: Record<string, React.FC<WScreenProps>>;\n myClientSides?: Record<string, React.FC<ClientSideProps>>;\n myResultsOk?: Record<string, React.FC<ResultOkProps>>;\n}\n\nconst App = ({\n myRoutes,\n myWScreens,\n myClientSides,\n myResultsOk\n}: AppProps) => {\n useEffect(() => {\n if (myClientSides) {\n extendClientSides(myClientSides);\n }\n if (myResultsOk) {\n extendResultsOk(myResultsOk);\n }\n if (myWScreens) {\n extendWScreens(myWScreens);\n }\n }, [myClientSides, myResultsOk, myWScreens]);\n return (\n <Provider store={store}>\n <PersistGate loading={null} persistor={persistor}>\n <BrowserRouter>\n <LocationTracker />\n <AppProvider>\n <SnackbarProvider>\n <FrontendPlusReactRoutes\n myRoutes={myRoutes}\n />\n <SessionExpiredMessage />\n </SnackbarProvider>\n </AppProvider>\n </BrowserRouter>\n </PersistGate>\n </Provider>\n );\n}\n\nexport default App;","// src/components/MainLayout.tsx\r\nimport React, { useEffect } from 'react';\r\nimport { Outlet } from 'react-router-dom'; // ¡IMPORTA Outlet AQUÍ!\r\nimport {\r\n Box, AppBar, Toolbar, Typography, Button, Drawer, CssBaseline,\r\n IconButton, useTheme, useMediaQuery\r\n} from '@mui/material';\r\nimport { useApp } from '../contexts/AppContext';\r\nimport { useNavigate } from 'react-router-dom'; // No estoy seguro si 'useNavigate' es necesario aquí si solo se usa en SideMenu o para Logout\r\nimport LogoutIcon from '@mui/icons-material/Logout';\r\nimport MenuIcon from '@mui/icons-material/Menu';\r\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\r\nimport SideMenu from './SideMenu';\r\nimport useLogout from '../hooks/useLogout';\r\n\r\n// Importamos los hooks de Redux y las acciones del nuevo slice\r\nimport { useAppDispatch, useIsDrawerOpen } from '../store';\r\nimport { setDrawerOpen, toggleDrawer } from '../store/menuUiSlice';\r\n\r\n\r\nconst drawerWidth = 240;\r\n\r\n// const MainLayout: React.FC<MainLayoutProps> = ({ children }) => { // Quitamos { children }\r\nconst MainLayout: React.FC = () => { // MainLayout ya no recibe 'children' como prop\r\n const { clientContext } = useApp();\r\n const logout = useLogout();\r\n\r\n const isDrawerOpen = useIsDrawerOpen();\r\n const dispatch = useAppDispatch();\r\n\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n useEffect(() => {\r\n if (isMobile && isDrawerOpen) {\r\n dispatch(setDrawerOpen(false));\r\n }\r\n }, [isMobile, isDrawerOpen, dispatch]);\r\n\r\n const handleToggleDrawer = () => {\r\n dispatch(toggleDrawer());\r\n };\r\n\r\n const handleDrawerCloseMobile = () => {\r\n if (isMobile && isDrawerOpen) {\r\n dispatch(setDrawerOpen(false));\r\n }\r\n };\r\n\r\n // Si clientContext no existe (por ejemplo, al cargar o si la sesión falla),\r\n // muestra un mensaje de carga.\r\n // Esto es importante para evitar errores si los datos no están disponibles.\r\n if (!clientContext) {\r\n return (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100vh' }}>\r\n <Typography>Cargando diseño de la aplicación...</Typography>\r\n </Box>\r\n );\r\n }\r\n\r\n const appBarOffset = theme.mixins.toolbar;\r\n\r\n return (\r\n <Box sx={{ display: 'flex', height: '100vh' }}>\r\n <CssBaseline />\r\n <AppBar\r\n position=\"fixed\"\r\n sx={{\r\n zIndex: (theme) => theme.zIndex.drawer + 1,\r\n transition: (theme) => theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n ...(isDrawerOpen && {\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n marginLeft: `${drawerWidth}px`,\r\n transition: (theme) => theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n }),\r\n }}\r\n >\r\n <Toolbar>\r\n <IconButton\r\n color=\"inherit\"\r\n aria-label=\"open drawer\"\r\n onClick={handleToggleDrawer}\r\n edge=\"start\"\r\n sx={{\r\n marginRight: 2.2,\r\n }}\r\n >\r\n {isDrawerOpen ? <ChevronLeftIcon /> : <MenuIcon />}\r\n </IconButton>\r\n <Typography variant=\"h6\" noWrap component=\"div\" sx={{ flexGrow: 1 }}>\r\n {isDrawerOpen ? '' : clientContext.config.title}\r\n </Typography>\r\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ mr: 2 }}>\r\n {clientContext.username}\r\n </Typography>\r\n <Button\r\n color=\"inherit\"\r\n onClick={logout}\r\n startIcon={<LogoutIcon />}\r\n >\r\n Salir\r\n </Button>\r\n </Toolbar>\r\n </AppBar>\r\n <Drawer\r\n variant=\"persistent\"\r\n anchor=\"left\"\r\n open={isDrawerOpen}\r\n sx={{\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n '& .MuiDrawer-paper': {\r\n width: drawerWidth,\r\n boxSizing: 'border-box',\r\n overflowX: 'hidden',\r\n overflowY: 'auto',\r\n },\r\n }}\r\n >\r\n <Toolbar\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n px: 1,\r\n fontSize: '1.3rem',\r\n minHeight: theme.mixins.toolbar.minHeight,\r\n }}\r\n >\r\n {isDrawerOpen ? clientContext.config.title : ''}\r\n </Toolbar>\r\n {/* Pasamos la función para cerrar el drawer al SideMenu */}\r\n <SideMenu onMenuItemClick={handleDrawerCloseMobile} />\r\n </Drawer>\r\n <Box\r\n component=\"main\"\r\n sx={{\r\n flexGrow: 1,\r\n transition: (theme) => theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n marginLeft: `-${drawerWidth}px`,\r\n ...(isDrawerOpen && {\r\n transition: (theme) => theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n marginLeft: 0,\r\n }),\r\n minWidth: 0,\r\n flexShrink: 0,\r\n // Asegúrate de que el paddingTop sea suficiente para la AppBar\r\n paddingTop: `${appBarOffset.minHeight}px`,\r\n height: '100%',\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: isDrawerOpen ? `calc(100% - ${drawerWidth}px)` : '100%',\r\n }}\r\n >\r\n {/* ¡AQUÍ ES DONDE DEBE IR EL CONTENIDO DE LA RUTA ANIDADA! */}\r\n {/* Elimina {children} y reemplázalo por <Outlet /> */}\r\n <Outlet />\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default MainLayout;","// src/contexts/AppContext.tsx\r\nimport React, { createContext, useContext, useState, useEffect, ReactNode, useCallback, useMemo } from 'react';\r\nimport { fetchApi } from '../utils/fetchApi';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// Importa los hooks de Redux y las acciones de tu slice\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { RootState, AppDispatch } from '../store'; // Asegúrate de que la ruta sea correcta\r\nimport { fetchClientContext, clearClientContext } from '../store/clientContextSlice'; // Importa el thunk y la acción\r\nimport { AppContextType, AppProviderProps } from '../types';\r\n\r\n// Crea el contexto con un valor por defecto que se sobrescribirá\r\nconst AuthContext = createContext<AppContextType | undefined>(undefined);\r\n\r\n// Hook personalizado para usar el contexto de autenticación\r\nexport const useApp = () => {\r\n const context = useContext(AuthContext);\r\n if (!context) {\r\n throw new Error('useApp must be used within an AppProvider');\r\n }\r\n // Si quieres que 'useApp' siga devolviendo 'clientContext', lo obtendrías aquí de Redux:\r\n const clientContext = useSelector((state: RootState) => state.clientContext);\r\n return { ...context, clientContext };\r\n};\r\n\r\nexport const AppProvider: React.FC<AppProviderProps> = ({ children }) => {\r\n console.log(\"AppProvider rendered/re-rendered\");\r\n\r\n const [isLoggedIn, setIsLoggedIn] = useState(false);\r\n const [showSessionExpiredMessage, setShowSessionExpiredMessage] = useState(false);\r\n\r\n // Obtener 'dispatch' para despachar acciones de Redux\r\n const dispatch = useDispatch<AppDispatch>();\r\n // Obtener 'clientContext' del store de Redux\r\n const clientContext = useSelector((state: RootState) => state.clientContext);\r\n\r\n const navigate = useNavigate();\r\n\r\n // Memoizamos checkSession. Ahora despachará acciones de Redux.\r\n const checkSession = useCallback(async () => {\r\n try {\r\n const response = await fetchApi('/keep-alive.json', { method: 'GET' });\r\n if (response.ok) {\r\n setIsLoggedIn(true);\r\n setShowSessionExpiredMessage(false);\r\n\r\n // Si clientContext no está cargado o si hubo un error previo,\r\n // despachamos el thunk para cargarlo.\r\n // Con redux-persist, si ya estaba en localStorage, 'clientContext.status' será 'succeeded'.\r\n if (clientContext.status === 'idle' || clientContext.status === 'failed') {\r\n console.log(\"Client context needs loading/reloading, dispatching fetchClientContext thunk...\");\r\n try {\r\n // .unwrap() para que el 'catch' capture los errores del thunk\r\n await dispatch(fetchClientContext()).unwrap();\r\n console.log(\"Client context data loaded successfully by Redux.\");\r\n } catch (loadError: any) {\r\n console.error(\"Error loading client context data during session check:\", loadError);\r\n // No es necesario lanzar el error, el estado de Redux ya lo manejará\r\n }\r\n }\r\n } else {\r\n // Si la sesión no es válida, limpiamos el estado de autenticación y el clientContext en Redux\r\n setIsLoggedIn(false);\r\n dispatch(clearClientContext()); // Disparar la acción para limpiar el clientContext en Redux\r\n\r\n if (!showSessionExpiredMessage && window.location.pathname !== '/login') {\r\n setShowSessionExpiredMessage(true);\r\n }\r\n }\r\n } catch (error: any) {\r\n console.error(\"Error checking session:\", error);\r\n setIsLoggedIn(false);\r\n dispatch(clearClientContext()); // Limpiar clientContext en Redux\r\n if (!showSessionExpiredMessage && window.location.pathname !== '/login') {\r\n setShowSessionExpiredMessage(true);\r\n }\r\n }\r\n }, [dispatch, clientContext.status, showSessionExpiredMessage]); // Dependencias: dispatch (estable), y el estado de carga del clientContext\r\n\r\n useEffect(() => {\r\n checkSession();\r\n\r\n const intervalId = setInterval(checkSession, 15 * 1000);\r\n\r\n return () => {\r\n clearInterval(intervalId);\r\n };\r\n }, [checkSession]); // Se ejecuta una vez al montar, y se re-ejecuta si checkSession cambia (no debería si useCallback está bien)\r\n\r\n // ¡La CLAVE! Memoizamos el objeto de contexto.\r\n // clientContext y setClientContext ya NO van aquí, se acceden directamente vía Redux.\r\n const authContextValue = useMemo(() => ({\r\n isLoggedIn,\r\n setIsLoggedIn,\r\n checkSession,\r\n showSessionExpiredMessage,\r\n setShowSessionExpiredMessage,\r\n }), [\r\n isLoggedIn,\r\n setIsLoggedIn,\r\n checkSession,\r\n showSessionExpiredMessage,\r\n setShowSessionExpiredMessage,\r\n ]);\r\n\r\n return (\r\n <AuthContext.Provider value={authContextValue}>\r\n {children}\r\n </AuthContext.Provider>\r\n );\r\n};","import React from 'react';\r\nimport { List, ListItem, ListItemButton, ListItemIcon, ListItemText, Divider, Box, Typography, Collapse } from '@mui/material';\r\nimport ExpandLess from '@mui/icons-material/ExpandLess';\r\nimport ExpandMore from '@mui/icons-material/ExpandMore';\r\nimport TableChartIcon from '@mui/icons-material/TableChart';\r\nimport FolderIcon from '@mui/icons-material/Folder';\r\nimport DnsIcon from '@mui/icons-material/Dns';\r\nimport HomeIcon from '@mui/icons-material/Home';\r\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber';\r\nimport DesktopWindowsIcon from '@mui/icons-material/DesktopWindows';\r\nimport UnfoldMoreIcon from '@mui/icons-material/UnfoldMore';\r\nimport UnfoldLessIcon from '@mui/icons-material/UnfoldLess';\r\n\r\nimport { useNavigate, useLocation } from 'react-router-dom';\r\nimport { useApp } from '../contexts/AppContext';\r\nimport { MenuInfoBase, MenuInfoTable, MenuInfoProc, MenuInfoMenu } from \"backend-plus\";\r\nimport { blue, orange, teal, red, grey } from '@mui/material/colors';\r\n\r\nimport { useSubMenuOpenState, useAppDispatch, useAppSelector } from '../store';\r\nimport { toggleSubMenu, setAllSubMenusOpen } from '../store/menuUiSlice';\r\nimport { MenuListItemProps, SideMenuProps } from '../types';\r\n\r\nimport { wScreens } from '../pages/WScreens';\r\n\r\nconst MenuListItem: React.FC<MenuListItemProps> = ({ item, level, onMenuItemClick}) => {\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const open = useSubMenuOpenState(item.name);\r\n const dispatch = useAppDispatch();\r\n\r\n const handleClick = () => {\r\n if (item.menuType === \"menu\") {\r\n dispatch(toggleSubMenu(item.name));\r\n } else {\r\n let path = '';\r\n const queryParams = new URLSearchParams();\r\n\r\n if (item.menuType === \"table\") {\r\n // Todas las tablas del menú navegan a esta ruta uniforme\r\n path = `/menu/${item.name}`; \r\n \r\n // Los parámetros td y fc siguen siendo query params\r\n if (item.td) queryParams.append('td', JSON.stringify((item.td)));\r\n if (item.fc) queryParams.append('fc', JSON.stringify((item.fc)));\r\n\r\n // NOTA: Los `fixedFields` (item.ff) NO se pasan en los queryParams aquí.\r\n // Se espera que GenericDataGridPage los obtenga directamente desde clientContext.menu\r\n // usando el `item.name` que está en la URL (`:menuName`).\r\n\r\n if (queryParams.toString()) {\r\n path = `${path}?${queryParams.toString()}`;\r\n }\r\n } else if (item.menuType === \"proc\") {\r\n path = `/procedures/${item.name}`;\r\n } else {\r\n const WScreenComponent = wScreens[item.menuType];\r\n if (WScreenComponent !== undefined) {\r\n path = `/wScreens/${item.menuType}`;\r\n } else {\r\n path = `/wScreens-fallback/${item.menuType}`;\r\n console.warn(`Menu type '${item.menuType}' no reconocido o WScreen no mapeada.`);\r\n }\r\n }\r\n \r\n if (path) {\r\n navigate(path);\r\n }\r\n if (onMenuItemClick) {\r\n onMenuItemClick();\r\n }\r\n }\r\n };\r\n\r\n const getIcon = (item: MenuInfoBase) => {\r\n switch (item.menuType) {\r\n case \"table\":\r\n return <TableChartIcon sx={{ color: blue[700] }} />;\r\n case \"proc\":\r\n return <DnsIcon sx={{ color: teal[700] }} />;\r\n case \"menu\":\r\n return <FolderIcon sx={{ color: orange[800] }} />;\r\n default:\r\n const WScreenComponent = wScreens[item.menuType];\r\n if (WScreenComponent !== undefined) {\r\n return <DesktopWindowsIcon sx={{ color: grey[700] }} />;\r\n }\r\n return <WarningAmberIcon sx={{ color: red[500] }} />;\r\n }\r\n };\r\n\r\n const currentPath = location.pathname;\r\n let isSelected = false;\r\n\r\n if (item.menuType === \"table\") {\r\n // La selección ahora siempre se basa en la ruta /menu/table/:name para los ítems de tabla\r\n isSelected = currentPath === `/menu/table/${item.name}`;\r\n } else if (item.menuType === \"proc\") {\r\n isSelected = currentPath === `/procedures/${item.name}`;\r\n } else {\r\n isSelected = currentPath.startsWith(`/wScreens/${item.menuType}`) || currentPath.startsWith(`/wScreens-fallback/${item.menuType}`);\r\n }\r\n\r\n return (\r\n <>\r\n <ListItemButton\r\n onClick={handleClick}\r\n sx={{ pl: level * 2 }}\r\n selected={isSelected}\r\n >\r\n <ListItemIcon sx={{ minWidth: '38px' }}>\r\n {getIcon(item)}\r\n </ListItemIcon>\r\n <ListItemText primary={item.label || item.name} />\r\n {item.menuType === \"menu\" ? (open ? <ExpandLess /> : <ExpandMore />) : null}\r\n </ListItemButton>\r\n {item.menuType === \"menu\" && (\r\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\r\n <List component=\"div\" disablePadding>\r\n {(item as MenuInfoMenu).menuContent.map((subItem) => (\r\n <MenuListItem\r\n key={subItem.name}\r\n item={subItem}\r\n level={level + 1}\r\n onMenuItemClick={onMenuItemClick}\r\n />\r\n ))}\r\n </List>\r\n </Collapse>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\n\r\nconst SideMenu: React.FC<SideMenuProps> = ({ onMenuItemClick }) => {\r\n\r\n const { clientContext } = useApp();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const dispatch = useAppDispatch();\r\n\r\n const subMenuOpenStates = useAppSelector(state => state.menuUi.subMenuOpenStates);\r\n\r\n const allSubMenusKeys = Object.keys(subMenuOpenStates);\r\n const openSubMenusCount = allSubMenusKeys.filter(key => subMenuOpenStates[key]).length;\r\n const isMostlyOpen = allSubMenusKeys.length > 0 && openSubMenusCount / allSubMenusKeys.length > 0.5;\r\n\r\n const handleHomeClick = () => {\r\n navigate('/home');\r\n if (onMenuItemClick) {\r\n onMenuItemClick();\r\n }\r\n };\r\n\r\n const handleToggleAllSubMenus = () => {\r\n dispatch(setAllSubMenusOpen(!isMostlyOpen));\r\n };\r\n\r\n if (!clientContext || !clientContext.menu) {\r\n return (\r\n <Box sx={{ p: 2, textAlign: 'center' }}>\r\n <Typography variant=\"body2\" color=\"text.secondary\">Cargando menú...</Typography>\r\n </Box>\r\n );\r\n }\r\n\r\n const isHomeSelected = location.pathname === '/home';\r\n\r\n return (\r\n <Box sx={{ width: '100%', flexShrink: 0 }}>\r\n {clientContext.menu.some(item => item.menuType === \"menu\") && (\r\n <ListItem disablePadding>\r\n <ListItemButton onClick={handleToggleAllSubMenus}>\r\n <ListItemIcon sx={{ minWidth: '38px' }}>\r\n {isMostlyOpen ? <UnfoldLessIcon /> : <UnfoldMoreIcon />}\r\n </ListItemIcon>\r\n <ListItemText primary={isMostlyOpen ? \"colapsar \" : \"expandir\"} />\r\n </ListItemButton>\r\n </ListItem>\r\n )}\r\n <Divider />\r\n <List>\r\n <ListItem disablePadding>\r\n <ListItemButton onClick={handleHomeClick} selected={isHomeSelected}>\r\n <ListItemIcon sx={{ minWidth: '38px' }}>\r\n <HomeIcon />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Inicio\" />\r\n </ListItemButton>\r\n </ListItem>\r\n <Divider />\r\n {clientContext.menu.map((menuItem: MenuInfoBase) => (\r\n <MenuListItem\r\n key={menuItem.name}\r\n item={menuItem}\r\n level={1}\r\n onMenuItemClick={onMenuItemClick}\r\n />\r\n ))}\r\n </List>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SideMenu;","import React from 'react';\r\nimport { Box, Typography, Paper } from '@mui/material';\r\nimport ConstructionIcon from '@mui/icons-material/Construction';\r\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber'; // Asegúrate de importar el icono de advertencia\r\n\r\nexport interface WScreenProps {\r\n screenName: string; // Renombramos de pageName a screenName\r\n}\r\n\r\n// Ejemplo de un componente de wScreen personalizado\r\nconst MyCustomDashboard: React.FC<WScreenProps> = ({ screenName }) => {\r\n return (\r\n <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%' }}>\r\n <Paper elevation={3} sx={{ p: 4, textAlign: 'center', maxWidth: 600 }}>\r\n <Typography variant=\"h5\" component=\"h1\" gutterBottom>\r\n ¡Bienvenido a tu WScreen: {screenName}!\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"text.secondary\">\r\n Esta es una pantalla de interfaz de usuario personalizada.\r\n </Typography>\r\n <Box sx={{ mt: 3 }}>\r\n <ConstructionIcon sx={{ fontSize: 80, color: 'primary.main' }} />\r\n </Box>\r\n </Paper>\r\n </Box>\r\n );\r\n};\r\n\r\nexport const FallbackWScreen: React.FC<WScreenProps> = ({ screenName }) => {\r\n return (\r\n <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%' }}>\r\n <Paper elevation={3} sx={{ p: 4, textAlign: 'center', maxWidth: 600, backgroundColor: 'warning.light', border: '1px solid orange' }}>\r\n <Typography variant=\"h5\" component=\"h1\" gutterBottom color=\"warning.dark\">\r\n WScreen No Implementada\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"warning.dark\">\r\n No se encontró un componente implementado para la **WScreen**: **`\"${screenName}\"`**.\r\n Por favor, verifica el `menuType` en la definición del menú o asegúrate de que el componente esté correctamente importado y mapeado en el frontend.\r\n </Typography>\r\n <Box sx={{ mt: 3 }}>\r\n <WarningAmberIcon sx={{ fontSize: 80, color: 'warning.dark' }} />\r\n </Box>\r\n </Paper>\r\n </Box>\r\n );\r\n};\r\n\r\n// Mapeo de nombres de wScreens a sus componentes\r\nexport let wScreens: Record<string, React.FC<WScreenProps>> = {\r\n 'MyCustomDashboard': MyCustomDashboard,\r\n // Agrega más componentes de wScreen aquí:\r\n // 'AnotherWScreen': AnotherWScreenComponent,\r\n};\r\n\r\nexport const extendWScreens = (newWScreens: Record<string, React.FC<WScreenProps>>) => {\r\n wScreens = { ...wScreens, ...newWScreens };\r\n console.log('wScreens extendidos:', wScreens);\r\n};","// src/hooks/useLogout.ts\r\nimport { useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// Importa los hooks de Redux y la acción clearClientContext\r\nimport { useDispatch } from 'react-redux';\r\nimport { AppDispatch } from '../store'; // Asegúrate de que la ruta sea correcta\r\nimport { clearClientContext } from '../store/clientContextSlice'; // Importa la acción para limpiar el contexto\r\n\r\nimport { useApp } from '../contexts/AppContext'; // Para acceder a setIsLoggedIn\r\nimport { fetchApi } from '../utils/fetchApi'; // Para la llamada a la API\r\n\r\n/**\r\n * Hook personalizado para manejar la lógica de cierre de sesión.\r\n * Limpia el estado del frontend y realiza la petición al backend.\r\n * @returns Una función 'logout' que, al ser llamada, cierra la sesión.\r\n */\r\nconst useLogout = () => {\r\n // Obtenemos las funciones del contexto de la aplicación\r\n const { setIsLoggedIn } = useApp(); // setClientContext ya no viene de useApp()\r\n\r\n // Obtenemos el dispatch de Redux\r\n const dispatch = useDispatch<AppDispatch>();\r\n\r\n // Obtenemos la función de navegación de React Router\r\n const navigate = useNavigate();\r\n\r\n // Utilizamos useCallback para memoizar la función 'logout'\r\n const logout = useCallback(async () => {\r\n try {\r\n const response = await fetchApi('/logout', { method: 'GET' }); // Asumiendo que tienes un endpoint /logout\r\n \r\n // Puedes ajustar esta lógica de verificación de respuesta\r\n // Si el backend siempre devuelve 401 para un logout exitoso (lo cual es inusual,\r\n // normalmente es un 200 OK y luego el backend invalida la sesión),\r\n // entonces tu lógica actual es válida.\r\n if (response.status === 401 || response.ok) { // Considera response.ok también si el backend da 200\r\n console.log('Sesión cerrada correctamente o ya deslogueado');\r\n } else {\r\n console.error('Error al cerrar sesión:', await response.text());\r\n // Si el logout falla en el backend, podrías decidir no limpiar el estado local\r\n // o mostrar un error al usuario. Por ahora, lo limpiamos igual.\r\n }\r\n } catch (error) {\r\n console.error('Error de red al intentar cerrar sesión:', error);\r\n } finally {\r\n // Siempre limpiamos el estado de login en el frontend,\r\n // independientemente del éxito o fracaso de la petición al backend.\r\n setIsLoggedIn(false); // Actualiza el estado de login en el contexto\r\n \r\n // --- ¡CAMBIO CLAVE AQUÍ! ---\r\n // Despacha la acción de Redux para limpiar el clientContext\r\n dispatch(clearClientContext()); \r\n\r\n navigate('/login', { replace: true }); // Redirige a /login\r\n }\r\n }, [setIsLoggedIn, dispatch, navigate]); // Dependencias: setIsLoggedIn, dispatch (estable), navigate (estable)\r\n\r\n return logout; // Devolvemos la función 'logout'\r\n};\r\n\r\nexport default useLogout;","import React from 'react';\r\nimport { Box, Typography, Button, Modal } from '@mui/material';\r\nimport { useApp } from '../contexts/AppContext'; // Importa useApp para el control del modal\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst style = {\r\n position: 'absolute' as 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 400,\r\n bgcolor: 'background.paper',\r\n border: '2px solid #000',\r\n boxShadow: 24,\r\n p: 4,\r\n textAlign: 'center',\r\n borderRadius: 2,\r\n};\r\n\r\nconst SessionExpiredMessage: React.FC = () => {\r\n const { showSessionExpiredMessage, setShowSessionExpiredMessage, setIsLoggedIn } = useApp();\r\n const navigate = useNavigate();\r\n\r\n const handleClose = () => {\r\n setShowSessionExpiredMessage(false);\r\n setIsLoggedIn(false);\r\n navigate('/login', { replace: true });\r\n };\r\n\r\n return (\r\n <Modal\r\n open={showSessionExpiredMessage}\r\n // Proporciona una función vacía para onClose. Esto satisface el tipo de prop\r\n // y evita que el modal se cierre por defecto al hacer clic en el backdrop.\r\n onClose={() => {}} \r\n aria-labelledby=\"session-expired-modal-title\"\r\n aria-describedby=\"session-expired-modal-description\"\r\n disableEscapeKeyDown={true} // Impide cerrar con la tecla Escape\r\n slotProps={{\r\n backdrop: {\r\n // Esto es crucial en MUI v5: detiene la propagación del evento de clic en el backdrop,\r\n // impidiendo que el modal se cierre al hacer clic fuera.\r\n onClick: (event) => event.stopPropagation(),\r\n sx: {\r\n backgroundColor: 'rgba(100, 100, 100, 0.95)', // Ajusta el color y la opacidad para un fondo más oscuro\r\n },\r\n },\r\n }}\r\n >\r\n <Box sx={style}>\r\n <Typography id=\"session-expired-modal-title\" variant=\"h6\" component=\"h2\" gutterBottom>\r\n ¡Sesión Expirada!\r\n </Typography>\r\n <Typography id=\"session-expired-modal-description\" sx={{ mt: 2, mb: 3 }}>\r\n Tu sesión ha expirado por inactividad o por seguridad. Por favor, inicia sesión de nuevo.\r\n </Typography>\r\n <Button variant=\"contained\" color=\"primary\" onClick={handleClose}>\r\n Ir al Login\r\n </Button>\r\n </Box>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default SessionExpiredMessage;\r\n","// src/pages/HomePage.tsx\r\nimport React from 'react';\r\nimport { Box, Typography } from '@mui/material';\r\nimport { useApp } from '../contexts/AppContext'; // Asegúrate de la ruta correcta\r\n\r\nconst HomePage: React.FC = () => {\r\n const { clientContext } = useApp();\r\n\r\n return (\r\n <Box sx={{ p: 3 }}>\r\n <Typography variant=\"h4\" component=\"h1\" gutterBottom>\r\n {`Bienvenido/a ${clientContext?.username}`}\r\n </Typography>\r\n <Typography variant=\"body1\">\r\n Usa el menú lateral para navegar por las diferentes secciones.\r\n </Typography>\r\n {/* Puedes añadir más contenido aquí, como un dashboard simple o enlaces rápidos */}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default HomePage;","// src/pages/LogoutPage.tsx\r\nimport React, { useEffect } from 'react';\r\nimport { Box, Typography, CircularProgress } from '@mui/material';\r\nimport useLogout from '../hooks/useLogout';\r\n\r\nconst LogoutPage: React.FC = () => {\r\n const logout = useLogout(); \r\n\r\n useEffect(() => {\r\n // Llama a la función de logout del hook cuando el componente se monta\r\n logout();\r\n }, [logout]); // Dependencia: la función 'logout' en sí misma\r\n\r\n return (\r\n <Box sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '100vh',\r\n textAlign: 'center'\r\n }}>\r\n <CircularProgress size={60} />\r\n <Typography variant=\"h6\" sx={{ mt: 2 }}>Cerrando sesión...</Typography>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default LogoutPage;","import React, { useState } from 'react';\r\nimport { Button, TextField, Typography, Alert, AlertTitle, Box, CircularProgress } from '@mui/material'; // Importaciones de MUI\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport * as z from 'zod';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// --- ¡NUEVAS IMPORTACIONES DE REDUX! ---\r\nimport { useDispatch } from 'react-redux';\r\nimport { AppDispatch } from '../store'; // Asegúrate de que la ruta sea correcta\r\nimport { fetchClientContext } from '../store/clientContextSlice'; // Importa el thunk para cargar el contexto\r\n\r\nimport { useApp } from '../contexts/AppContext'; // Sigue importando useApp para setIsLoggedIn y checkSession\r\nimport { fetchApi } from '../utils/fetchApi'; // Tu utilidad fetchApi\r\n\r\n// Define el esquema de validación con Zod\r\nconst loginSchema = z.object({\r\n username: z.string().min(1, \"El usuario es requerido\"), // Añadir validación básica\r\n password: z.string().min(1, \"La contraseña es requerida\"), // Añadir validación básica\r\n});\r\n\r\n// Define el tipo para los datos del formulario\r\ntype LoginFormValues = z.infer<typeof loginSchema>;\r\n\r\nconst LoginPage = () => {\r\n const navigate = useNavigate();\r\n const [loginError, setLoginError] = useState<string | null>(null);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n\r\n // Obtiene setIsLoggedIn y checkSession del contexto de la aplicación\r\n const { setIsLoggedIn, checkSession } = useApp(); \r\n\r\n // Obtiene el dispatch de Redux\r\n const dispatch = useDispatch<AppDispatch>();\r\n\r\n const {\r\n control,\r\n handleSubmit,\r\n formState: { errors },\r\n reset\r\n } = useForm<LoginFormValues>({\r\n resolver: zodResolver(loginSchema),\r\n defaultValues: {\r\n username: '',\r\n password: '',\r\n },\r\n });\r\n\r\n const onSubmit = async (data: LoginFormValues) => {\r\n setIsSubmitting(true);\r\n setLoginError(null); // Limpia cualquier error anterior\r\n\r\n try {\r\n const body = new URLSearchParams({\r\n username: data.username,\r\n password: data.password\r\n });\r\n\r\n const loginResponse = await fetchApi('/login', {\r\n method: 'POST',\r\n body, // URLSearchParams se envía directamente como body para form-urlencoded\r\n // Asegúrate de que el Content-Type en el backend maneje 'application/x-www-form-urlencoded'\r\n });\r\n\r\n // Si el backend redirige a /menu, significa que el login fue exitoso.\r\n // Si la respuesta no es OK, o si la URL no termina en /menu, asumimos un fallo.\r\n if (!loginResponse.ok || !loginResponse.url.endsWith('/menu')) {\r\n //const errorText = await loginResponse.text();\r\n const errorText = 'Credenciales incorrectas o error al iniciar sesión';\r\n throw new Error(errorText);\r\n }\r\n\r\n // Si el login fue exitoso, actualiza el estado de la sesión y carga el contexto del cliente\r\n setIsLoggedIn(true);\r\n\r\n // --- ¡CAMBIO CLAVE AQUÍ! ---\r\n // Despacha el thunk de Redux para cargar el clientContext.\r\n // El .unwrap() es importante para poder capturar errores directamente con try/catch.\r\n await dispatch(fetchClientContext()).unwrap(); \r\n\r\n console.log(\"Login exitoso y clientContext cargado.\");\r\n navigate('/home'); // Redirige al home o dashboard\r\n reset(); // Limpia el formulario\r\n } catch (error: any) {\r\n console.error(\"Error al iniciar sesión:\", error);\r\n setIsLoggedIn(false); // Marca como no logueado en caso de error\r\n // setClientContext(null); // No necesitas llamar a setClientContext aquí, Redux lo maneja\r\n setLoginError(error.message || 'Ocurrió un error al iniciar sesión. Inténtalo de nuevo.');\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <Box\r\n display=\"flex\"\r\n alignItems=\"center\"\r\n justifyContent=\"center\"\r\n minHeight=\"100vh\"\r\n bgcolor=\"#f5f5f5\"\r\n >\r\n <Box\r\n width=\"100%\"\r\n maxWidth=\"400px\"\r\n padding={4}\r\n bgcolor=\"white\"\r\n borderRadius={8}\r\n boxShadow={3}\r\n >\r\n <Typography variant=\"h5\" align=\"center\" gutterBottom>\r\n Iniciar Sesión\r\n </Typography>\r\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"username\">\r\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ fontWeight: 'medium' }}>\r\n Usuario\r\n </Typography>\r\n </label>\r\n <Controller\r\n name=\"username\"\r\n control={control}\r\n render={({ field }) => (\r\n <TextField\r\n {...field}\r\n type=\"text\" // Cambiado de \"username\" a \"text\" que es más estándar para input type\r\n placeholder=\"Ingresa tu usuario\"\r\n fullWidth\r\n margin=\"normal\"\r\n error={!!errors.username}\r\n helperText={errors.username?.message}\r\n disabled={isSubmitting}\r\n />\r\n )}\r\n />\r\n </div>\r\n <div>\r\n <label htmlFor=\"password\">\r\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ fontWeight: 'medium' }}>\r\n Contraseña\r\n </Typography>\r\n </label>\r\n <Controller\r\n name=\"password\"\r\n control={control}\r\n render={({ field }) => (\r\n <TextField\r\n {...field}\r\n type=\"password\"\r\n placeholder=\"Ingresa tu contraseña\"\r\n fullWidth\r\n margin=\"normal\"\r\n error={!!errors.password}\r\n helperText={errors.password?.message}\r\n disabled={isSubmitting}\r\n />\r\n )}\r\n />\r\n </div>\r\n <Button type=\"submit\" fullWidth variant=\"contained\" color=\"primary\" disabled={isSubmitting} sx={{ mt: 2 }}>\r\n {isSubmitting ? (\r\n <>\r\n <CircularProgress size={20} sx={{ mr: 1 }} />\r\n Iniciando sesión...\r\n </>\r\n ) : (\r\n 'Iniciar Sesión'\r\n )}\r\n </Button>\r\n </form>\r\n {loginError && (\r\n <Alert severity=\"error\" sx={{ mt: 2, maxHeight:'200px'}}> {/* Ya no necesitas alertProps */}\r\n <AlertTitle>Error</AlertTitle>\r\n {loginError}\r\n </Alert>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default LoginPage;","import React, { useState, FormEvent, ChangeEvent, useCallback, useMemo } from 'react';\r\nimport { ProcedureDef, ProcedureParameter } from \"backend-plus\";\r\nimport { useParams } from 'react-router-dom';\r\nimport { useApp } from '../contexts/AppContext';\r\n\r\nimport { useApiCall } from '../hooks/useApiCall';\r\n\r\nimport {\r\n TextField,\r\n Button,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n Checkbox,\r\n FormControlLabel,\r\n FormHelperText,\r\n Typography,\r\n Box,\r\n CircularProgress,\r\n Alert,\r\n Divider,\r\n Paper\r\n} from '@mui/material';\r\nimport { SelectChangeEvent } from '@mui/material/Select';\r\nimport { cambiarGuionesBajosPorEspacios } from '../utils/functions';\r\n\r\n// Importamos el mapa de componentes de resultado\r\nimport { resultsOk } from '../pages/procedure-results/resultsOk';\r\n\r\nconst ProcedureForm: React.FC = () => {\r\n const { procedureName } = useParams<{ procedureName: string }>();\r\n const { clientContext } = useApp();\r\n\r\n const { callApi, loading: apiLoading, error: apiError } = useApiCall<any>();\r\n\r\n const [validationErrors, setValidationErrors] = useState<Record<string, string | null>>({});\r\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\r\n const [executionLog, setExecutionLog] = useState<string[]>([]);\r\n const [procedureResultData, setProcedureResultData] = useState<any>(null);\r\n\r\n const procedure: ProcedureDef | undefined = useMemo(() => {\r\n if (procedureName && clientContext?.procedure) {\r\n return clientContext.procedure[procedureName];\r\n }\r\n return undefined;\r\n }, [procedureName, clientContext]);\r\n\r\n const [formValues, setFormValues] = useState<Record<string, any>>(() => {\r\n if (!procedure) return {};\r\n const initialValues: Record<string, any> = {};\r\n procedure.parameters.forEach(param => {\r\n if (param.defaultValue !== undefined) {\r\n initialValues[param.name] = param.defaultValue;\r\n } else if (param.specialDefaultValue) {\r\n switch (param.specialDefaultValue) {\r\n case 'current_date':\r\n initialValues[param.name] = new Date().toISOString().split('T')[0];\r\n break;\r\n case 'current_datetime':\r\n const now = new Date();\r\n initialValues[param.name] = now.toISOString().substring(0, 16);\r\n break;\r\n default:\r\n initialValues[param.name] = param.specialDefaultValue;\r\n break;\r\n }\r\n } else {\r\n initialValues[param.name] = '';\r\n }\r\n });\r\n return initialValues;\r\n });\r\n\r\n React.useEffect(() => {\r\n if (procedure) {\r\n setValidationErrors({});\r\n setSuccessMessage(null);\r\n setProcedureResultData(null);\r\n const newInitialValues: Record<string, any> = {};\r\n procedure.parameters.forEach(param => {\r\n if (param.defaultValue !== undefined) {\r\n newInitialValues[param.name] = param.defaultValue;\r\n } else if (param.specialDefaultValue) {\r\n switch (param.specialDefaultValue) {\r\n case 'current_date':\r\n newInitialValues[param.name] = new Date().toISOString().split('T')[0];\r\n break;\r\n case 'current_datetime':\r\n const now = new Date();\r\n newInitialValues[param.name] = now.toISOString().substring(0, 16);\r\n break;\r\n default:\r\n newInitialValues[param.name] = param.specialDefaultValue;\r\n break;\r\n }\r\n } else {\r\n newInitialValues[param.name] = '';\r\n }\r\n });\r\n setFormValues(newInitialValues);\r\n setExecutionLog([]);\r\n }\r\n }, [procedure]);\r\n\r\n const addLogMessage = useCallback((message: string, isError: boolean = false) => {\r\n const timestamp = new Date().toLocaleTimeString('es-AR');\r\n setExecutionLog(prev => [...prev, `[${timestamp}] ${isError ? 'ERROR: ' : ''}${message}`]);\r\n }, []);\r\n\r\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | SelectChangeEvent<any>, child?: React.ReactNode) => {\r\n const { name, value } = e.target;\r\n let newValue: any = value;\r\n\r\n if ((e.target as HTMLInputElement).type === 'checkbox') {\r\n newValue = (e.target as HTMLInputElement).checked;\r\n }\r\n\r\n setFormValues(prevValues => ({\r\n ...prevValues,\r\n [name]: newValue,\r\n }));\r\n setValidationErrors(prev => ({ ...prev, [name]: null }));\r\n setSuccessMessage(null);\r\n setProcedureResultData(null);\r\n }, []);\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault();\r\n setValidationErrors({});\r\n setSuccessMessage(null);\r\n setExecutionLog([]);\r\n setProcedureResultData(null);\r\n\r\n if (!procedure) {\r\n addLogMessage('Error: La definición del procedimiento no está disponible.', true);\r\n return;\r\n }\r\n\r\n addLogMessage(`Iniciando ejecución del procedimiento: ${procedure.action}...`);\r\n\r\n const paramsToSend: Record<string, any> = {};\r\n let currentValidationErrors: Record<string, string | null> = {};\r\n let hasOverallError = false;\r\n\r\n for (const param of procedure.parameters) {\r\n let value = formValues[param.name];\r\n let processedValue: any = value;\r\n let paramError: string | null = null;\r\n\r\n switch (param.typeName) {\r\n case 'decimal':\r\n case 'double':\r\n if (value === '' || value === null) {\r\n processedValue = null;\r\n } else {\r\n processedValue = parseFloat(value);\r\n if (isNaN(processedValue)) {\r\n paramError = `El valor para \"${param.label || param.name}\" no es un número válido.`;\r\n }\r\n }\r\n break;\r\n case 'integer':\r\n case 'bigint':\r\n if (value === '' || value === null) {\r\n processedValue = null;\r\n } else {\r\n processedValue = parseInt(value, 10);\r\n if (isNaN(processedValue)) {\r\n paramError = `El valor para \"${param.label || param.name}\" no es un entero válido.`;\r\n }\r\n }\r\n break;\r\n case 'boolean':\r\n processedValue = !!value;\r\n break;\r\n case 'jsonb':\r\n case 'jsona':\r\n if (value === '' || value === null) {\r\n processedValue = null;\r\n } else {\r\n try {\r\n processedValue = JSON.parse(value);\r\n } catch (jsonError: any) {\r\n paramError = `Error en el formato JSON para \"${param.label || param.name}\": ${jsonError.message}`;\r\n }\r\n }\r\n break;\r\n case 'bytea':\r\n processedValue = value instanceof File ? value : (value === '' ? null : value);\r\n break;\r\n case 'text':\r\n case 'date':\r\n case 'timestamp':\r\n case 'time':\r\n case 'interval':\r\n case 'tsrange':\r\n case 'time_range':\r\n case 'daterange':\r\n default:\r\n processedValue = value === '' ? null : value;\r\n break;\r\n }\r\n\r\n const hasDefaultValue = param.defaultValue !== undefined || param.specialDefaultValue !== undefined;\r\n const isEmpty = processedValue === null || processedValue === undefined || (typeof processedValue === 'string' && processedValue.trim() === '');\r\n \r\n if (!hasDefaultValue && isEmpty) {\r\n paramError = `El campo \"${param.label || param.name}\" es obligatorio y no puede estar vacío.`;\r\n }\r\n\r\n if (paramError) {\r\n currentValidationErrors[param.name] = paramError;\r\n hasOverallError = true;\r\n addLogMessage(`Error de validación para \"${param.label || param.name}\": ${paramError}`, true);\r\n }\r\n\r\n paramsToSend[param.name] = processedValue;\r\n }\r\n\r\n if (hasOverallError) {\r\n setValidationErrors(currentValidationErrors);\r\n addLogMessage('No se puede ejecutar el procedimiento debido a errores de validación en el formulario.', true);\r\n return;\r\n }\r\n\r\n addLogMessage(`Parámetros a enviar: ${JSON.stringify(paramsToSend, null, 2)}`);\r\n\r\n try {\r\n addLogMessage('Invocando procedimiento a través de useApiCall...');\r\n const result = await callApi(procedure.action, paramsToSend);\r\n \r\n if (result !== undefined) {\r\n setSuccessMessage(procedure.resultOk || 'Procedimiento ejecutado con éxito.');\r\n addLogMessage('Procedimiento ejecutado con éxito.');\r\n addLogMessage(`Resultado: ${JSON.stringify(result, null, 2)}`);\r\n setProcedureResultData(result);\r\n console.log('Resultado del procedimiento:', result);\r\n } else {\r\n addLogMessage('Procedimiento finalizado con errores.', true);\r\n }\r\n } catch (err: any) {\r\n console.error('Error al ejecutar el procedimiento (capturado en ProcedureForm):', err);\r\n addLogMessage(`Error en la ejecución: ${err.message || 'Error desconocido.'}`, true);\r\n } finally {\r\n addLogMessage('Ejecución finalizada.');\r\n }\r\n };\r\n\r\n const renderInputField = useCallback((param: ProcedureParameter) => {\r\n const hasError = !!validationErrors[param.name];\r\n const errorMessage = validationErrors[param.name];\r\n\r\n const commonProps: any = {\r\n id: param.name,\r\n name: param.name,\r\n label: param.label || param.name,\r\n variant: \"outlined\" as \"outlined\",\r\n fullWidth: true,\r\n margin: \"dense\" as \"dense\",\r\n required: !(param.defaultValue !== undefined || param.specialDefaultValue !== undefined),\r\n size: \"small\" as \"small\",\r\n helperText: errorMessage || param.description,\r\n error: hasError,\r\n disabled: apiLoading,\r\n onChange: handleChange,\r\n sx: { fontSize: '0.8rem' }\r\n };\r\n\r\n if (param.options && param.options.length > 0) {\r\n return (\r\n <FormControl fullWidth margin=\"dense\" size=\"small\" error={hasError} required={commonProps.required}>\r\n <InputLabel id={`${param.name}-label`} sx={{ fontSize: '0.8rem' }}>{param.label || param.name}</InputLabel>\r\n <Select\r\n labelId={`${param.name}-label`}\r\n value={formValues[param.name] === undefined ? '' : formValues[param.name]}\r\n onChange={handleChange}\r\n name={param.name}\r\n id={param.name}\r\n label={param.label || param.name}\r\n disabled={apiLoading}\r\n sx={{ fontSize: '0.8rem' }}\r\n renderValue={(selected) => (\r\n <Typography sx={{ fontSize: '0.8rem' }}>{selected as string}</Typography>\r\n )}\r\n >\r\n {(!commonProps.required || formValues[param.name] === '') && <MenuItem value=\"\" sx={{ fontSize: '0.8rem' }}><em>Seleccione...</em></MenuItem>}\r\n {param.options.map(option => (\r\n <MenuItem key={option} value={option} sx={{ fontSize: '0.8rem' }}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n {(param.description || errorMessage) && <FormHelperText sx={{ fontSize: '0.7rem' }}>{errorMessage || param.description}</FormHelperText>}\r\n </FormControl>\r\n );\r\n }\r\n\r\n switch (param.typeName) {\r\n case 'text':\r\n case 'interval':\r\n case 'tsrange':\r\n case 'time_range':\r\n case 'daterange':\r\n return <TextField type=\"text\" value={formValues[param.name] || ''} {...commonProps} />;\r\n case 'decimal':\r\n case 'double':\r\n return <TextField type=\"number\" inputProps={{ step: \"any\", style: { fontSize: '0.8rem' } }} value={formValues[param.name] || ''} {...commonProps} />;\r\n case 'integer':\r\n case 'bigint':\r\n return <TextField type=\"number\" inputProps={{ step: \"1\", style: { fontSize: '0.8rem' } }} value={formValues[param.name] || ''} {...commonProps} />;\r\n case 'boolean':\r\n return (\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={!!formValues[param.name]}\r\n onChange={handleChange}\r\n name={param.name}\r\n id={param.name}\r\n disabled={apiLoading}\r\n size=\"small\"\r\n />\r\n }\r\n label={<Typography sx={{ fontSize: '0.8rem', color: hasError ? 'error.main' : 'inherit' }}>{param.label || param.name}</Typography>}\r\n sx={{ mt: 1, mb: 0 }}\r\n />\r\n );\r\n case 'date':\r\n case 'timestamp':\r\n case 'time':\r\n return <TextField type={param.typeName === 'date' ? 'date' : param.typeName === 'timestamp' ? 'datetime-local' : 'time'} value={formValues[param.name] || ''} {...commonProps} InputLabelProps={{ shrink: true, sx: { fontSize: '0.8rem' } }} />;\r\n case 'jsonb':\r\n case 'jsona':\r\n return <TextField multiline rows={5} value={formValues[param.name] || ''} {...commonProps} InputProps={{ sx: { fontSize: '0.8rem' } }} />;\r\n case 'bytea':\r\n return (\r\n <FormControl fullWidth margin=\"dense\" error={hasError} required={commonProps.required}>\r\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"label\" htmlFor={param.name} sx={{ fontSize: '0.8rem', color: hasError ? 'error.main' : 'text.secondary' }}>\r\n {param.label || param.name}\r\n </Typography>\r\n <input\r\n type=\"file\"\r\n id={param.name}\r\n name={param.name}\r\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n setFormValues(prev => ({ ...prev, [param.name]: files && files.length > 0 ? files[0] : undefined }));\r\n }}\r\n disabled={apiLoading}\r\n style={{ padding: '6px 0', fontSize: '0.8rem' }}\r\n />\r\n {(param.description || errorMessage) && <FormHelperText sx={{ fontSize: '0.7rem' }}>{errorMessage || param.description}</FormHelperText>}\r\n </FormControl>\r\n );\r\n default:\r\n return <TextField type=\"text\" value={formValues[param.name] || ''} {...commonProps} />;\r\n }\r\n }, [formValues, handleChange, apiLoading, validationErrors]);\r\n\r\n // Contenido a renderizar dentro de la sección de resultado\r\n const ResultDisplayContent = useMemo(() => {\r\n if (!procedureResultData || !procedure?.resultOk) return null;\r\n\r\n const ComponentToRender = resultsOk[procedure.resultOk];\r\n\r\n if (ComponentToRender) {\r\n return <ComponentToRender data={procedureResultData} />;\r\n } else {\r\n return (\r\n <Paper elevation={2} sx={{ p: 2, mt: 0, bgcolor: 'warning.light' }}>\r\n <Typography variant=\"h6\" sx={{ fontSize: '1rem', mb: 1 }}>\r\n el componente para resolver el resultOk: '{procedure.resultOk}' definido en el procedure no existe o no está mapeado.\r\n </Typography>\r\n <Box sx={{ \r\n bgcolor: 'warning.dark', \r\n p: 1, \r\n borderRadius: 1, \r\n }}>\r\n <pre style={{ margin: 0, fontSize: '0.75rem', color: 'white' }}>\r\n {JSON.stringify(procedureResultData, null, 2)}\r\n </pre>\r\n </Box>\r\n </Paper>\r\n );\r\n }\r\n }, [procedureResultData, procedure]);\r\n\r\n\r\n if (!procedure) {\r\n return (\r\n <Box sx={{\r\n p: 2,\r\n width: '100%',\r\n boxSizing: 'border-box',\r\n mt: 0,\r\n bgcolor: 'background.paper',\r\n borderRadius: 2,\r\n boxShadow: 3,\r\n textAlign: 'center'\r\n }}>\r\n <CircularProgress sx={{ mb: 2 }} />\r\n <Typography variant=\"h6\" color=\"text.secondary\">\r\n Cargando procedimiento o no encontrado...\r\n </Typography>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n // Esta es la Box más externa que ahora controlará el scroll\r\n <Box sx={{\r\n p: 2,\r\n ml: 1,\r\n mt: 2,\r\n mr: 1,\r\n boxSizing: 'border-box',\r\n bgcolor: 'background.paper',\r\n borderRadius: 2,\r\n boxShadow: 3,\r\n fontSize: '0.8rem',\r\n maxHeight: 'calc(100vh - 100px)', // Ajusta esta altura máxima según el espacio disponible en tu layout\r\n overflowY: 'auto', // Habilita el scroll vertical para todo el contenido de esta Box\r\n overflowX: 'hidden' // Oculta el scroll horizontal si no es necesario para el contenedor principal\r\n }}>\r\n <Typography variant=\"h5\" component=\"h2\" gutterBottom align=\"left\">\r\n {cambiarGuionesBajosPorEspacios(procedure.proceedLabel || procedure.action)}\r\n </Typography>\r\n\r\n {Object.values(validationErrors).some(err => err !== null) && (\r\n <Alert severity=\"error\" sx={{ mb: 2, fontSize: '0.8rem' }}>\r\n Por favor, corrige los errores en el formulario antes de enviar.\r\n <ul>\r\n {Object.values(validationErrors).map((err, idx) => err && <li key={idx}>{err}</li>)}\r\n </ul>\r\n </Alert>\r\n )}\r\n {!Object.values(validationErrors).some(err => err !== null) && apiError && <Alert severity=\"error\" sx={{ mb: 2, fontSize: '0.8rem' }}>{apiError.message}</Alert>}\r\n {!Object.values(validationErrors).some(err => err !== null) && !apiError && successMessage && <Alert severity=\"success\" sx={{ mb: 2, fontSize: '0.8rem' }}>{successMessage}</Alert>}\r\n\r\n <form onSubmit={handleSubmit}>\r\n {procedure.parameters.map(param => (\r\n <div key={param.name}>\r\n {renderInputField(param)}\r\n </div>\r\n ))}\r\n\r\n <Button\r\n type=\"submit\"\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={apiLoading || Object.values(validationErrors).some(err => err !== null)}\r\n sx={{ mt: 2 }}\r\n size=\"medium\"\r\n startIcon={apiLoading ? <CircularProgress size={20} color=\"inherit\" /> : null}\r\n >\r\n {apiLoading ? 'Ejecutando...' : (procedure.proceedLabel || 'Ejecutar')}\r\n </Button>\r\n </form>\r\n\r\n {/* Renderizamos el contenido del resultado, sin scroll propio aquí */}\r\n {ResultDisplayContent && (\r\n <Box sx={{ mt: 2 }}> {/* Margen superior para separar del botón */}\r\n {ResultDisplayContent}\r\n </Box>\r\n )}\r\n \r\n {/* Área para el registro de ejecución del procedimiento */}\r\n {executionLog.length > 0 && (\r\n <Box sx={{ mt: 3 }}>\r\n <Divider sx={{ mb: 2 }} />\r\n <Typography variant=\"h6\" gutterBottom sx={{ fontSize: '0.9rem' }}>\r\n Registro de Ejecución\r\n </Typography>\r\n <Box\r\n sx={{\r\n bgcolor: 'grey.100',\r\n p: 2,\r\n borderRadius: 1,\r\n maxHeight: '200px', // Este log puede tener su propio scroll interno si es muy largo\r\n overflowY: 'auto',\r\n fontFamily: 'monospace',\r\n fontSize: '0.75rem',\r\n whiteSpace: 'pre-wrap',\r\n }}\r\n >\r\n {executionLog.map((log, index) => (\r\n <Typography\r\n key={index}\r\n component=\"pre\"\r\n sx={{\r\n margin: 0,\r\n color: log.includes('ERROR:') ? 'error.main' : 'text.primary',\r\n fontSize: 'inherit'\r\n }}\r\n >\r\n {log}\r\n </Typography>\r\n ))}\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ProcedureForm;","import React from 'react';\r\nimport { Box, Typography, Paper } from '@mui/material';\r\nimport { ResultOkProps } from './resultsOk'; \r\n\r\nconst SuccessDisplay: React.FC<ResultOkProps> = ({ data }) => {\r\n return (\r\n <Paper elevation={2} sx={{ p: 2, mt: 2, bgcolor: 'success.light', color: 'success.contrastText' }}>\r\n <Typography variant=\"h6\" sx={{ fontSize: '1rem', mb: 1 }}>\r\n ¡Operación Exitosa!\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ fontSize: '0.85rem' }}>\r\n Detalles del resultado:\r\n </Typography>\r\n <Box sx={{ bgcolor: 'success.dark', p: 1, borderRadius: 1, mt: 1, overflowX: 'auto' }}>\r\n <pre style={{ margin: 0, fontSize: '0.75rem', color: 'white' }}>\r\n {JSON.stringify(data, null, 2)}\r\n </pre>\r\n </Box>\r\n <Typography variant=\"body2\" sx={{ fontSize: '0.8rem', mt: 1 }}>\r\n Puedes revisar los detalles anteriores o cerrar este mensaje.\r\n </Typography>\r\n </Paper>\r\n );\r\n};\r\n\r\nexport default SuccessDisplay;","import React from 'react';\r\n\r\nimport SuccessDisplay from './SuccessDisplay';\r\n\r\nexport interface ResultOkProps { \r\n data: any; }\r\n\r\ntype ResultComponentMap = {\r\n [key: string]: React.FC<ResultOkProps>; \r\n};\r\n\r\nexport let resultsOk: ResultComponentMap = {\r\n 'successful_operation': SuccessDisplay as React.FC<ResultOkProps>,\r\n};\r\n\r\nexport const extendResultsOk = (newComponents: ResultComponentMap) => {\r\n resultsOk = { ...resultsOk, ...newComponents };\r\n};","// src/components/PrivateRoute.tsx\r\nimport React, { useEffect, ReactNode } from 'react';\r\nimport { Navigate, useLocation } from 'react-router-dom';\r\nimport { useAppDispatch, useClientContextStatus } from '../store'; // Importa useDispatch, useClientContextStatus\r\nimport { setRedirectPath } from '../store/routerSlice'; // Importa la acción para guardar la ruta de redirección\r\nimport { PrivateRouteProps } from '../types';\r\n\r\nconst PrivateRoute: React.FC<PrivateRouteProps> = ({ children }) => {\r\n const location = useLocation();\r\n const dispatch = useAppDispatch();\r\n const clientContextStatus = useClientContextStatus(); // Obtiene el estado de Redux\r\n\r\n const isAuthenticated = clientContextStatus === 'succeeded';\r\n const isLoadingAuth = clientContextStatus === 'loading';\r\n\r\n console.log(`[PrivateRoute] Render: Path=${location.pathname}, AuthStatus=${clientContextStatus}, IsAuthenticated=${isAuthenticated}, IsLoadingAuth=${isLoadingAuth}`);\r\n\r\n useEffect(() => {\r\n console.log(`[PrivateRoute] Effect: Path=${location.pathname}, AuthStatus=${clientContextStatus}, IsAuthenticated=${isAuthenticated}, IsLoadingAuth=${isLoadingAuth}`);\r\n // Condición para guardar la URL:\r\n // 1. El usuario NO está autenticado.\r\n // 2. NO estamos en el proceso de carga de autenticación (ya sabemos que no está autenticado).\r\n // 3. NO estamos ya en la página de login (para evitar guardar /login).\r\n if (!isAuthenticated && !isLoadingAuth && location.pathname !== '/login') {\r\n const path = location.pathname + location.search;\r\n console.log(`[PrivateRoute] ACTION: Dispatching setRedirectPath(${path})`);\r\n dispatch(setRedirectPath(path));\r\n } else if (isAuthenticated) {\r\n console.log(`[PrivateRoute] User is authenticated, no redirectPath set.`);\r\n } else if (isLoadingAuth) {\r\n console.log(`[PrivateRoute] Still loading authentication.`);\r\n } else if (location.pathname === '/login') {\r\n console.log(`[PrivateRoute] Currently on /login, not setting redirectPath.`);\r\n }\r\n }, [isAuthenticated, isLoadingAuth, location, dispatch, clientContextStatus]); // Añadir clientContextStatus a las dependencias del efecto\r\n\r\n if (isLoadingAuth) {\r\n console.log(`[PrivateRoute] Returning loading state...`);\r\n return <p>Verificando autenticación...</p>;\r\n }\r\n\r\n if (!isAuthenticated) {\r\n console.log(`[PrivateRoute] User not authenticated, navigating to /login`);\r\n return <Navigate to=\"/login\" replace />;\r\n }\r\n\r\n console.log(`[PrivateRoute] User authenticated, rendering children.`);\r\n return <>{children}</>;\r\n};\r\n\r\nexport default PrivateRoute;","// src/components/InitialRedirectHandler.tsx\r\nimport React, { useEffect } from 'react';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { useAppDispatch, useRedirectPath, useClientContextStatus } from '../store'; // <--- ¡Asegúrate de importar useClientContextStatus de aquí!\r\nimport { setCurrentPath, setRedirectPath } from '../store/routerSlice';\r\n\r\nconst InitialRedirectHandler: React.FC = () => {\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n const dispatch = useAppDispatch();\r\n const redirectPath = useRedirectPath();\r\n const clientContextStatus = useClientContextStatus(); // <--- ¡Ahora lo obtienes de Redux!\r\n\r\n // Efecto para despachar la ruta actual al cambiar\r\n useEffect(() => {\r\n dispatch(setCurrentPath(location.pathname + location.search));\r\n }, [location, dispatch]);\r\n\r\n // Efecto para manejar la redirección inicial (después de login o recarga si ya estaba logueado)\r\n useEffect(() => {\r\n // Asegúrate de que el clientContext esté cargado/autenticado antes de intentar redirigir\r\n if (clientContextStatus === 'succeeded') {\r\n if (redirectPath && redirectPath !== '/login') { // Evita redirigir a /login\r\n console.log('Redirigiendo a la ruta guardada:', redirectPath);\r\n navigate(redirectPath);\r\n dispatch(setRedirectPath(null)); // Limpia la ruta guardada después de usarla\r\n } else if (location.pathname === '/login' || location.pathname === '/') {\r\n // Si el usuario está en /login o / y ya está autenticado y no hay ruta de redirección\r\n // lo mandamos a /home por defecto.\r\n console.log('Usuario autenticado, redirigiendo a /home por defecto.');\r\n navigate('/home');\r\n }\r\n }\r\n }, [clientContextStatus, redirectPath, location.pathname, navigate, dispatch]);\r\n\r\n return null; // No renderiza nada\r\n};\r\n\r\nexport default InitialRedirectHandler;","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Box, Alert, Typography } from '@mui/material'; // Importa Box, Alert, Typography de MUI\r\nimport GenericDataGrid from '../components/grid/GenericDataGrid'; // Ajusta la ruta si es necesario\r\n\r\nconst GenericDataGridPage: React.FC = () => {\r\n // Usa useParams para obtener el tableName de la URL\r\n const { tableName } = useParams<{ tableName?: string }>();\r\n\r\n if (!tableName) {\r\n // Muestra un mensaje de error si tableName no está presente en la URL\r\n return (\r\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\r\n <Alert severity=\"error\">\r\n <Typography variant=\"h6\">Error: Nombre de tabla no especificado en la URL.</Typography>\r\n <Typography variant=\"body1\">Por favor, asegúrate de que la URL contenga el nombre de la tabla (ej. `/data/users`).</Typography>\r\n </Alert>\r\n </Box>\r\n );\r\n }\r\n\r\n // Pasa tableName como prop al GenericDataGrid\r\n return <GenericDataGrid tableName={tableName} fixedFields={[]} />;\r\n};\r\n\r\nexport default GenericDataGridPage;","// src/pages/MenuTablePage.tsx\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Box, Alert, Typography } from '@mui/material';\r\nimport GenericDataGrid from '../components/grid/GenericDataGrid'; // Ajusta la ruta si es necesario\r\nimport { useApp } from '../contexts/AppContext'; // Necesitamos el contexto para acceder al menú\r\nimport { MenuInfoBase, MenuInfoMenu, MenuInfoTable } from 'backend-plus'; // Asegúrate de importar tus tipos de menú\r\n\r\nconst MenuTablePage: React.FC = () => {\r\n // Obtiene el `menuName` de la URL para buscar en clientContext.menu\r\n const { menuName } = useParams<{ menuName?: string }>();\r\n const { clientContext } = useApp();\r\n\r\n // Función auxiliar para encontrar un ítem de menú recursivamente\r\n const findMenuItem = (items: MenuInfoBase[], nameToFind: string): MenuInfoTable | undefined => {\r\n for (const item of items) {\r\n if (item.name === nameToFind && item.menuType === \"table\") {\r\n return item as MenuInfoTable;\r\n }\r\n if (item.menuType === \"menu\" && (item as MenuInfoMenu).menuContent) {\r\n const found = findMenuItem((item as MenuInfoMenu).menuContent, nameToFind);\r\n if (found) return found;\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n // Usa useMemo para determinar el tableName y los fixedFields desde el menú\r\n const { currentTableName, currentFixedFields } = useMemo(() => {\r\n let tableName: string | undefined = undefined;\r\n let fixedFields: any[] = [];\r\n \r\n if (menuName && clientContext && clientContext.menu) {\r\n const menuItem = findMenuItem(clientContext.menu, menuName);\r\n if (menuItem) {\r\n tableName = menuItem.table || menuItem.name;\r\n if(menuItem.ff){\r\n Object.keys(menuItem.ff || []).forEach((fixedFieldKey)=>{\r\n fixedFields.push({\r\n fieldName:fixedFieldKey,\r\n //@ts-ignore\r\n value: menuItem.ff![fixedFieldKey]\r\n })\r\n })\r\n }\r\n } else {\r\n console.warn(`[${menuName}] Ítem de menú '${menuName}' no encontrado o no es de tipo 'table' en clientContext.menu.`);\r\n // Opcional: podrías redirigir o mostrar un error más amigable\r\n }\r\n }\r\n\r\n return {\r\n currentTableName: tableName,\r\n currentFixedFields: fixedFields,\r\n };\r\n }, [menuName, clientContext]);\r\n\r\n if (!currentTableName) {\r\n // Muestra un mensaje de error si el nombre de la tabla no se pudo determinar\r\n return (\r\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\r\n <Alert severity=\"error\">\r\n <Typography variant=\"h6\">Error: No se pudo cargar la información de la tabla.</Typography>\r\n <Typography variant=\"body1\">Verifique la configuración del menú o el nombre de la tabla en la URL.</Typography>\r\n </Alert>\r\n </Box>\r\n );\r\n }\r\n\r\n // Renderiza GenericDataGrid con los datos obtenidos del menú\r\n return (\r\n <GenericDataGrid\r\n tableName={currentTableName}\r\n fixedFields={currentFixedFields}\r\n />\r\n );\r\n};\r\n\r\nexport default MenuTablePage;"],"mappings":"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","names":["object","channel","pair","parse","constructorName","constructor","p","useState","useCallback","useMemo","useState","useCallback","SnackbarAlert","params","useState","useCallback","CircularProgress","Typography","Box","useTheme","createSlice","initialState","createSlice","initialState","jsx","jsxs","useState","jsx","jsxs","Box","jsx","jsxs","jsx","Box","jsx","Box","Button","IconButton","Tooltip","Typography","Box","Typography","jsx","Box","Typography","Tooltip","jsx","jsxs","jsx","Box","Tooltip","Typography","IconButton","Button","useCallback","useState","InputBase","useTheme","jsx","useState","useCallback","InputBase","Box","Tooltip","jsx","jsx","jsx","jsx","jsxs","useState","useTheme","useMemo","useCallback","Box","CircularProgress","Typography","React","useEffect","useLocation","Navigate","useEffect","Box","Typography","Button","IconButton","useTheme","createContext","useContext","useState","useEffect","useCallback","useMemo","useSelector","useDispatch","jsx","createContext","useContext","useSelector","useState","useDispatch","useCallback","useEffect","useMemo","List","ListItemButton","ListItemIcon","ListItemText","Box","Typography","WarningAmberIcon","useNavigate","Box","Typography","Paper","WarningAmberIcon","jsx","jsxs","Fragment","jsx","jsxs","useNavigate","item","WarningAmberIcon","ListItemButton","ListItemIcon","ListItemText","List","Box","Typography","useCallback","useNavigate","useDispatch","useDispatch","useNavigate","useCallback","jsx","jsxs","useTheme","useEffect","Box","Typography","theme","IconButton","Button","Box","Typography","Button","useNavigate","jsx","jsxs","Box","Typography","Button","Box","Typography","jsx","jsxs","Box","Typography","useEffect","Box","Typography","CircularProgress","jsx","jsxs","useEffect","Box","CircularProgress","Typography","useState","Button","Typography","Alert","Box","CircularProgress","useNavigate","useDispatch","Fragment","jsx","jsxs","useNavigate","useState","useDispatch","Box","Typography","Button","CircularProgress","Alert","React","useState","useCallback","useMemo","TextField","Button","Typography","Box","CircularProgress","Alert","Divider","Paper","Box","Typography","Paper","jsx","jsxs","jsx","jsxs","useState","useMemo","React","useCallback","Typography","TextField","Paper","Box","CircularProgress","Alert","Button","Divider","useEffect","useLocation","Fragment","jsx","useLocation","useEffect","useEffect","useLocation","useNavigate","useLocation","useNavigate","useEffect","useParams","Box","Alert","Typography","jsx","jsxs","useParams","Box","Alert","Typography","useMemo","useParams","Box","Alert","Typography","jsx","jsxs","useParams","useMemo","Box","Alert","Typography","Box","jsx","jsxs","useLocation","useEffect","React","Navigate"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/json4all/json4all.js","../src/components/grid/GenericDataGrid.tsx","../src/hooks/useApiCall.ts","../src/contexts/SnackbarContext.tsx","../src/env.ts","../src/utils/fetchApi.ts","../src/utils/functions.tsx","../src/store/index.ts","../src/store/clientContextSlice.ts","../src/store/routerSlice.ts","../src/store/menuUiSlice.ts","../src/components/ConfirmDialog.tsx","../src/components/grid/DataGridOptionsDialog.tsx","../src/components/grid/renderers/headerCellRenderers.tsx","../src/components/grid/FilterInputRender.tsx","../src/components/grid/renderers/summaryCellRenderers.tsx","../src/components/grid/renderers/cellRenderers.tsx","../src/components/grid/ExampleClientSideComponent.tsx","../src/components/grid/FallbackClientSideRenderer.tsx","../src/components/grid/clientSides.ts","../src/components/grid/InputRenderer.tsx","../src/components/grid/renderers/editCellRenderers.tsx","../src/components/grid/renderers/emptyRowRenderer.tsx","../src/components/grid/menu/options.tsx","../src/App.tsx","../src/components/MainLayout.tsx","../src/contexts/AppContext.tsx","../src/components/SideMenu.tsx","../src/pages/WScreens.tsx","../src/hooks/useLogout.tsx","../src/components/SessionExpiredMessage.tsx","../src/pages/HomePage.tsx","../src/pages/LogoutPage.tsx","../src/pages/LoginPage.tsx","../src/components/ProcedureForm.tsx","../src/pages/procedure-results/SuccessDisplay.tsx","../src/pages/procedure-results/resultsOk.ts","../src/components/PrivateRoute.tsx","../src/components/InitialRedirectHandler.tsx","../src/pages/GenericDataGridPage.tsx","../src/pages/MenuTablePage.tsx"],"sourcesContent":["\"use strict\";\r\n\r\n(function codenautasModuleDefinition(root, name, factory) {\r\n /* global define */\r\n /* istanbul ignore next */\r\n if(typeof root.globalModuleName !== 'string'){\r\n root.globalModuleName = name;\r\n }\r\n /* istanbul ignore next */\r\n if(typeof exports === 'object' && typeof module === 'object'){\r\n module.exports = factory();\r\n }else if(typeof define === 'function' && define.amd){\r\n define(factory);\r\n }else if(typeof exports === 'object'){\r\n exports[root.globalModuleName] = factory();\r\n }else{\r\n root[root.globalModuleName] = factory();\r\n }\r\n root.globalModuleName = null;\r\n})(/*jshint -W040 */this, 'json4all', function() {\r\n/*jshint +W040 */\r\n\r\n/*jshint -W004 */\r\nvar json4all = {};\r\n/*jshint +W004 */\r\n\r\njson4all.PretendedClass = Symbol(\"Pretended Class\");\r\n\r\nfunction functionName(fun) {\r\n /* istanbul ignore next */\r\n if('name' in fun){\r\n return fun.name;\r\n }else{\r\n return fun.toString().replace(/^\\s*function\\s*([^(]*)\\((.|\\s)*$/i,'$1');\r\n }\r\n}\r\n\r\nfunction constructorName(obj) {\r\n return functionName(obj[json4all.PretendedClass] || obj.constructor);\r\n}\r\n\r\nvar root;\r\n\r\n/* istanbul ignore next */\r\nif(typeof window !== 'undefined'){\r\n root = window;\r\n}else{\r\n root = global;\r\n}\r\n\r\nroot.json4allRegisteredTypes = root.json4allRegisteredTypes || {};\r\nvar types = root.json4allRegisteredTypes;\r\n\r\nvar thisPlatformSkipsUndefinedInArrays = true;\r\n\r\nJSON.stringify([undefined],function(key, value){\r\n if(key==='0'||key===0){\r\n thisPlatformSkipsUndefinedInArrays = false;\r\n }\r\n return value;\r\n});\r\n\r\n\r\nvar thisPlatformHasReplacerBug = false;\r\n\r\n/* istanbul ignore next */ // For IE compatibility\r\nJSON.parse('{\"3\":\"33\"}',function(key, value){\r\n if(value===undefined){\r\n thisPlatformHasReplacerBug = true;\r\n }\r\n return value;\r\n});\r\n\r\n/* istanbul ignore next */\r\nfunction InternalValueForUndefined(){ \r\n /* istanbul ignore next */\r\n throw new Error('this is not a function'); \r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction InternalValueForUnset(){ \r\n /* istanbul ignore next */\r\n throw new Error('this is not a function'); \r\n}\r\n\r\njson4all.directTypes={\r\n \"Object\" : true,\r\n \"Array\" : true,\r\n \"anonymous\": true,\r\n \"\" : true\r\n};\r\n\r\njson4all.anonymizate = function(classedObject){\r\n var plainObject={};\r\n for(var attr in classedObject){\r\n plainObject[attr] = classedObject[attr];\r\n }\r\n return plainObject;\r\n};\r\n\r\njson4all.nonymizate = function(plainValue, Constructor){\r\n var typedValue = new Constructor();\r\n for(var attr in plainValue){\r\n typedValue[attr] = plainValue[attr];\r\n }\r\n return typedValue;\r\n};\r\n\r\njson4all.replacer = function replacer(key, value){\r\n var realValue = this[key];\r\n /* istanbul ignore next */ // For IE compatibility\r\n if(realValue===InternalValueForUndefined){\r\n this[key]=undefined;\r\n return {$special: \"undefined\"};\r\n }\r\n if(key!=='' && (!(key in this) || realValue!==null && realValue instanceof Function)){\r\n return {$special: \"unset\"};\r\n }\r\n if(realValue===undefined || typeof realValue === \"undefined\" || realValue!==null && realValue instanceof Function){\r\n return {$special: \"undefined\"};\r\n }\r\n if(realValue===null || typeof realValue!=='object' || key==='$escape'){\r\n return value;\r\n }\r\n if('$special' in realValue || '$escape' in realValue){\r\n return {$escape: realValue};\r\n }\r\n /* istanbul ignore next */ // For IE compatibility\r\n if(thisPlatformSkipsUndefinedInArrays && realValue instanceof Array){\r\n for(var i=0; i<realValue.length; i++){\r\n if(typeof realValue[i] === 'undefined'){\r\n realValue[i] = InternalValueForUndefined;\r\n }\r\n }\r\n return realValue;\r\n }\r\n var typeName = constructorName(realValue);\r\n if(json4all.directTypes[typeName]){\r\n return value;\r\n }else{\r\n var typeDef=types[typeName];\r\n if(typeDef){\r\n var replaced = {$special: typeDef.specialTag(realValue), $value: typeDef.deconstruct(realValue)};\r\n var ref = realValue[RefKey];\r\n if(ref!==undefined){\r\n replaced.$ref = ref;\r\n if(json4all.$RefStoreSpace == null){\r\n delete replaced.$value;\r\n }\r\n }\r\n return replaced;\r\n // return {$special:'specialTag' in typeDef?typeDef.specialTag(realValue):typeName, $value: typeDef.deconstruct(realValue)};\r\n }else{\r\n console.log(\"JSON4all.stringify unregistered object type\", typeName);\r\n throw new Error(\"JSON4all.stringify unregistered object type\");\r\n }\r\n }\r\n};\r\n\r\njson4all.reviver = function reviver(key, plainValue){\r\n var log=false;\r\n var result;\r\n if(key==='$escape'){\r\n return plainValue;\r\n }else if(plainValue!==null && plainValue.$ref && json4all.$RefStoreSpace){\r\n var collection = json4all.$RefStoreSpace[plainValue.$ref[0][0]]\r\n if(!collection){\r\n throw new Error(\"json4all ref collection invalid\");\r\n }\r\n var object = collection[plainValue.$ref[1]];\r\n if(!object){\r\n throw new Error(\"json4all ref key invalid\");\r\n }\r\n return object;\r\n }else if(plainValue!==null && plainValue.$special){\r\n if(plainValue.$special==='undefined'){ \r\n if(key===''){\r\n return undefined;\r\n }\r\n return InternalValueForUndefined;\r\n }else if(plainValue.$special==='unset'){\r\n return undefined;\r\n }else{\r\n var typeDef=types[plainValue.$special];\r\n if(typeDef){\r\n result = new typeDef.construct(plainValue.$value, typeDef.constructor);\r\n }else{\r\n console.log(\"JSON4all.parse invalid $special\", plainValue.$special);\r\n throw new Error(\"JSON4all.parse invalid $special\");\r\n }\r\n }\r\n }else if(plainValue!==null && plainValue.$escape){\r\n return plainValue.$escape;\r\n }else{\r\n result = plainValue;\r\n if(plainValue instanceof Object){\r\n for(var k in plainValue){\r\n if(plainValue[k]===InternalValueForUndefined){\r\n plainValue[k]=undefined;\r\n }\r\n }\r\n }\r\n }\r\n if(plainValue !=null && plainValue.$ref){\r\n result[RefKey] = plainValue.$ref\r\n }\r\n return result;\r\n};\r\n\r\nvar directRegExp = /^((null|true|false)$|[-\\]\\[{}\".0-9])/;\r\nvar directStringRegExp = /^[a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-][0-9a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-]{0,32}$/;\r\nvar AttributeNameRegExp = /^[a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-][0-9a-zA-ZÑñáéíóúüÁÉÍÓÚÜ_@-]*($|,)/;\r\n\r\njson4all.stringifyAnyPlace = function stringifyAnyPlace(value){\r\n return JSON.stringify(value, json4all.replacer);\r\n};\r\n\r\nvar CHANNEL = {\r\n object:{separator: ',', pairSeparator:':' , empty: function (){ return {}}}, \r\n array :{separator: ';', pairSeparator:null, empty: function (){ return []}},\r\n}\r\n\r\nvar SEPARATOR = {',':'object', ';':'array'}\r\n\r\nfunction maxConsumer(){\r\n var fun = function(node){\r\n for (var channel in CHANNEL) {\r\n if (node[channel] > fun[channel]) fun[channel] = node[channel];\r\n }\r\n return node.value\r\n }\r\n for (var channel in CHANNEL) {\r\n fun[channel] = null;\r\n }\r\n return fun;\r\n}\r\n\r\nfunction simpleValue(value){\r\n return {value: value, object:0, array:0}\r\n}\r\n\r\njson4all.maxConsumer = maxConsumer;\r\n\r\njson4all.mesureString = function mesureString(value){\r\n var currentSeparator = null;\r\n var currentLength = 0;\r\n var result = simpleValue(value);\r\n for (var char of value) {\r\n var channel = SEPARATOR[char];\r\n if (channel) {\r\n if (currentSeparator != char) {\r\n currentLength = 0\r\n currentSeparator = char\r\n }\r\n currentLength++\r\n if (currentLength > result[channel]) result[channel] = currentLength\r\n } else {\r\n currentSeparator = null;\r\n }\r\n }\r\n return result\r\n}\r\n\r\njson4all.quoteString = function quoteString(text, escapeColon){\r\n var value = directStringRegExp.test(text) && !directRegExp.test(text) ? text : JSON.stringify(text);\r\n if (escapeColon) value = value.replace(/:/g,'\\\\u003a');\r\n return json4all.mesureString(value);\r\n}\r\n\r\nvar STAR = '*';\r\nvar BANG = '!';\r\n\r\njson4all.toUrl = function toUrl(value){\r\n return json4all.toUrlConstruct(value).value;\r\n}\r\n\r\njson4all.toUrlLines = function toUrlLines(value, eol){\r\n return json4all.toUrlConstruct(value, eol ? eol : '\\n').value;\r\n}\r\n\r\nvar repeat = (str, count) => Array.prototype.concat(new Array(count +1)).join(str);\r\n\r\njson4all.toUrlConstruct = function toUrlConstruct(value, addEol){\r\n if(value === null) return simpleValue(\"null\");\r\n if(value === undefined) return simpleValue(\"!undefined\");\r\n if(value instanceof Function) return simpleValue(\"!unset\");\r\n var typeName = constructorName(value);\r\n if(typeof value === \"string\"){ \r\n // if(value[0] === STAR){\r\n // return json4all.mesureString(STAR + value);\r\n // }else{\r\n return json4all.quoteString(value);\r\n // }\r\n } else if (value && typeof value === \"object\" && !value[RefKey]) {\r\n if(!json4all.directTypes[typeName]){\r\n var typeDef=types[typeName];\r\n if(typeDef /* && (!onlyValues || typeDef.valueLike)*/){\r\n var serializedValue = typeDef.serialize(value)\r\n if (typeof serializedValue === \"string\") return json4all.mesureString(serializedValue);\r\n // serializedValue.value = BANG + serializedValue.value;\r\n return serializedValue;\r\n }else{\r\n console.log(\"JSON4all.stringify unregistered object type\", typeName);\r\n throw new Error(\"JSON4all.stringify unregistered object type\");\r\n }\r\n } else {\r\n var thisChannel = value instanceof Array ? 'array' : 'object';\r\n var parts = []\r\n var result = simpleValue(null);\r\n var cantSimplify = false;\r\n var max = maxConsumer();\r\n if (thisChannel == 'array') {\r\n for (var i = 0; i < value.length; i++) {\r\n var pair = [max(json4all.toUrlConstruct(value[i]))]\r\n parts.push(pair);\r\n }\r\n } else {\r\n for (var attr in value) {\r\n var pair = [max(json4all.quoteString(attr, true)), max(json4all.toUrlConstruct(value[attr]))]\r\n parts.push(pair);\r\n }\r\n }\r\n for (var channel in CHANNEL) {\r\n result[channel] = (max[channel] || 0) + (channel == thisChannel ? 1 : 0);\r\n }\r\n var PairSep = ':'\r\n var lengthSep = result[thisChannel];\r\n var ListSep = addEol ? addEol : repeat(CHANNEL[thisChannel].separator, lengthSep);\r\n result.value = (addEol ? '!json4all' + CHANNEL[thisChannel].separator : '') + ListSep + parts.map(pair=>pair.join(PairSep)).join(ListSep)\r\n if (!cantSimplify && parts.length){\r\n return result;\r\n }\r\n }\r\n }\r\n return json4all.mesureString(JSON.stringify(value, json4all.replacer));\r\n};\r\n\r\njson4all.stringify = json4all.stringifyAnyPlace;\r\n\r\njson4all.convertPlain2$special = function convertPlain2$special(o, internally){\r\n if(o!=null && o instanceof Object){\r\n for(var key in o){\r\n /* istanbul ignore next */\r\n var realKey = o[key]===undefined && !isNaN(key)?Number(key):key;\r\n json4all.convertPlain2$special(o[key], true);\r\n var newValue = json4all.reviver(key, o[key]); \r\n if(newValue===undefined && !(o instanceof Array)){\r\n delete o[key];\r\n }else{\r\n o[key] = newValue;\r\n }\r\n }\r\n }\r\n if(!internally){\r\n return json4all.reviver('', o);\r\n }\r\n};\r\n\r\njson4all.isTesting = true;\r\n\r\njson4all.getPlainObject = function getPlainObject(payload, separator, initial, PairSep){\r\n var i = 0;\r\n if (separator instanceof RegExp) {\r\n var ListSep = separator;\r\n } else {\r\n var ListSep = '';\r\n while (i < payload.length && payload[i] === separator) { i++; ListSep += separator }\r\n }\r\n var result = initial\r\n var parts = payload.split(ListSep).slice(1);\r\n var index = -1;\r\n for (var part of parts) {\r\n if (PairSep) {\r\n var pos = part.indexOf(PairSep);\r\n if (pos < 0) {\r\n throw new Error('JSON4all.parse error. Lack of colon \"' + PairSep + '\" in object');\r\n }\r\n var value = part.substr(pos + PairSep.length);\r\n var index = json4all.parse(part.substr(0, pos));\r\n } else {\r\n var value = part;\r\n index ++;\r\n }\r\n var value = json4all.parse(value, true);\r\n if (value !== InternalValueForUnset) {\r\n result[index] = value\r\n }\r\n }\r\n return result;\r\n}\r\n\r\njson4all.parse = function parse(text, inner){\r\n var payload = text[0] === STAR ? text.substr(1) : text;\r\n if (payload[0] === BANG) {\r\n payload = payload.substr(1);\r\n if (payload === 'undefined') return undefined;\r\n if (payload === 'unset') {\r\n return inner ? InternalValueForUnset : undefined;\r\n }\r\n if (payload[0] == '@') {\r\n var commaPosition = payload.indexOf(',');\r\n var className = payload.substr(1, commaPosition - 1);\r\n var typeDef = types[className];\r\n if (!typeDef) {\r\n throw new Error('JSON4all.parse unrecognize className ' + className);\r\n }\r\n return typeDef.deserialize(payload).value;\r\n }\r\n if (payload[0] == '/') {\r\n var typeDef = types.RegExp;\r\n return typeDef.deserialize(payload).value;\r\n }\r\n if (payload.substr(0,8) == 'json4all') {\r\n var iSeparator = SEPARATOR[payload[8]];\r\n if (iSeparator) {\r\n var channel = CHANNEL[iSeparator];\r\n if (channel) {\r\n var eol = payload[9] == '\\r' && payload[10] == '\\n' ? '\\r\\n' : payload[9] == '\\n' ? '\\n' : null;\r\n if (eol) {\r\n return json4all.getPlainObject(payload.substr(8 + eol.length), /\\r?\\n/, channel.empty(), channel.pairSeparator);\r\n }\r\n }\r\n }\r\n }\r\n throw new Error('JSON4all.parse unrecognize ! token')\r\n }\r\n if (SEPARATOR[payload[0]]) {\r\n var channel = CHANNEL[SEPARATOR[payload[0]]];\r\n return json4all.getPlainObject(payload, channel.separator, channel.empty(), channel.pairSeparator);\r\n }\r\n for (var typeName in types) {\r\n var typeDef = types[typeName];\r\n var okDetected = null;\r\n /* istanbul ignore next */\r\n if(!typeDef.deserialize){\r\n throw new Error(\"JSON4all.parse type without deserialize: \"+typeName)\r\n }\r\n var valueOk = null;\r\n var {ok, value} = typeDef.deserialize(payload);\r\n if(ok){\r\n valueOk = value;\r\n if(json4all.isTesting){\r\n if (okDetected) {\r\n console.log(\"More than one way\",typeName,okDetected,text,value,valueOk);\r\n throw Error(\"\")\r\n }\r\n okDetected = typeName;\r\n }\r\n break;\r\n }\r\n }\r\n if (okDetected) return valueOk;\r\n if (typeof text === \"string\" && !directRegExp.test(text)) {\r\n return text;\r\n }\r\n /* istanbul ignore next */ // For IE compatibility\r\n if(thisPlatformHasReplacerBug){\r\n var parsed=JSON.parse(text);\r\n return json4all.convertPlain2$special(parsed);\r\n } else {\r\n return JSON.parse(text, json4all.reviver);\r\n }\r\n};\r\n\r\njson4all.addType = function addType(typeConstructor, functions, skipIfExists){\r\n functions = functions || {};\r\n var constructorName = typeof typeConstructor === 'string'? typeConstructor: functionName(typeConstructor);\r\n if(skipIfExists && types[constructorName]){\r\n return;\r\n }\r\n var prefix = '@' + constructorName\r\n types[constructorName] = {\r\n construct: functions.construct || function construct(plainValue, constructor){\r\n return typeConstructor.JSON4reviver(plainValue, constructor);\r\n },\r\n deconstruct: functions.deconstruct || function deconstruct(o){\r\n return o.JSON4replacer();\r\n },\r\n specialTag: functions.specialTag || function specialTag(value){\r\n return constructorName;\r\n },\r\n serialize: functions.serialize || function serialize(o){\r\n var plainObject = 'JSON4replacer' in typeConstructor.prototype ? o.JSON4replacer() : functions.deconstruct(o);\r\n var result = json4all.toUrlConstruct(plainObject)\r\n result.value = BANG + prefix + result.value;\r\n return result;\r\n },\r\n deserialize: functions.deserialize || function deserialize(plainValue){\r\n if (plainValue.startsWith(prefix + ',')) {\r\n var plainObject = json4all.parse(STAR + plainValue.substr(prefix.length),constructor);\r\n return {\r\n ok:true, \r\n value:'JSON4replacer' in typeConstructor.prototype ? typeConstructor.JSON4reviver(plainObject, typeConstructor) : functions.construct(plainObject, typeConstructor)\r\n }\r\n }\r\n return {ok:false}\r\n },\r\n valueLike: functions.valueLike || typeConstructor.JSON4valueLike\r\n };\r\n if(typeof typeConstructor === 'function'){\r\n types[constructorName].constructor = typeConstructor;\r\n }\r\n};\r\n\r\nvar NativeDateRegExp = /^\\d\\d\\d\\d-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(\\.\\d*)?Z$/;\r\n\r\njson4all.DateFunctions = {\r\n construct: function construct(plainValue){ \r\n return new Date(plainValue); \r\n }, \r\n deconstruct: function deconstruct(o){\r\n return o.getTime();\r\n },\r\n serialize: function serialize(o){\r\n return o.toISOString();\r\n },\r\n deserialize: function deserialize(plainValue){\r\n var ok = NativeDateRegExp.test(plainValue);\r\n var value = ok && new Date(plainValue) || null;\r\n return {ok, value};\r\n },\r\n valueLike: true\r\n}\r\n\r\njson4all.addType(Date, json4all.DateFunctions, true);\r\n\r\njson4all.addType(RegExp, {\r\n construct: function construct(plainValue){ \r\n return new RegExp(plainValue.source, plainValue.flags); \r\n }, \r\n deconstruct: function deconstruct(o){\r\n return {source: o.source, flags: o.toString().substr(o.toString().lastIndexOf('/')+1)};\r\n },\r\n serialize: function serialize(o){\r\n return BANG + '/' + o.source + '/' + o.flags;\r\n },\r\n deserialize: function deserialize(plainValue){\r\n var ok = false\r\n var value = null;\r\n plainValue.replace(/^\\/(.+)\\/(\\w*)$/, function(_, pattern, flags){\r\n value = new RegExp(pattern, flags)\r\n ok = true;\r\n });\r\n return {ok, value};\r\n },\r\n valueLike: true\r\n});\r\n\r\njson4all._types = types;\r\n\r\nconst RefKey = Symbol(\"RefKey for RefMap\")\r\n\r\njson4all.RefKey = RefKey;\r\n// export class RefMap<K extends keyof object, V extends any> extends Map<K, V>{\r\n\r\njson4all.RefStoreSpace = (myCollection)=>{\r\n json4all.$RefStoreSpace = myCollection;\r\n}\r\n\r\n\r\n/** \r\n * @type {<K extends string|number|symbol, V extends {}> (path:(string|number|symbol)[]) => Partial<{[key in V]:v}} \r\n * */\r\njson4all.RefStore = (path)=>{\r\n var myCollection = json4all.$RefStoreSpace;\r\n /** @type {Partial<{[key in K]:V}>} */\r\n var o = {}\r\n var p= new Proxy(o, {\r\n /*\r\n get:function(target, prop, _receiver) {\r\n return target[prop];\r\n },\r\n */\r\n /** @param {Partial<{[key in K]:V}>} target */\r\n /** @param {K} prop */\r\n /** @param {V} value */\r\n set:function(target, prop, value){\r\n if(\r\n // @ts-expect-error RefKey no está en el tipo original\r\n value[RefKey] == null \r\n ){\r\n // @ts-expect-error RefKey no está en el tipo original\r\n value[RefKey] = [path, prop];\r\n }else if(\r\n // @ts-expect-error RefKey no está en el tipo original\r\n value[RefKey][1] != prop\r\n ){\r\n console.log(\"This value was stored in another place\", path, prop)\r\n throw new Error(\"This value was stored in another place\")\r\n }\r\n return Reflect.set(target, prop, value);\r\n }\r\n });\r\n myCollection[path[0]] = p;\r\n return p;\r\n}\r\n\r\njson4all.$props2serialize = Symbol(\"props2serialize\")\r\n\r\njson4all.addProperty = function(constructorPosition){\r\n var innerFunction = (classPrototype, prop, index)=>{\r\n if(!(json4all.$props2serialize in classPrototype)){\r\n classPrototype[json4all.$props2serialize] = []\r\n }\r\n var info={name:prop}\r\n if(typeof constructorPosition === \"number\") info.construct = constructorPosition\r\n classPrototype[json4all.$props2serialize].push(info)\r\n }\r\n if(typeof constructorPosition === \"number\"){\r\n return innerFunction\r\n }else{\r\n return innerFunction.apply(null, arguments);\r\n }\r\n}\r\n\r\njson4all.pretendClass = function(object, Constructor){\r\n object[json4all.PretendedClass] = Constructor\r\n // @ts-expect-error\r\n object.JSON4replacer = Constructor.prototype.JSON4replacer;\r\n // @ts-expect-error\r\n // object[JSON4all.$props2serialize] = Constructor.prototype[JSON4all.$props2serialize];\r\n}\r\n\r\njson4all.addClass = (constructor)=>{\r\n if(!(json4all.$props2serialize in constructor.prototype)){\r\n throw new Error(\"must add parameters or properties\")\r\n }\r\n var propList = constructor.prototype[json4all.$props2serialize];\r\n constructor.prototype.JSON4replacer = function(){\r\n var o = {};\r\n for(var prop of propList){\r\n o[prop.name] = this[prop.name]\r\n }\r\n return o;\r\n };\r\n constructor.JSON4reviver = function(value, constructor){\r\n var constructParams = propList.filter(p=>p.construct!=null).map(p=>value[p.name])\r\n var o = new constructor(...constructParams);\r\n for(var p of propList){\r\n if(!p.construct){\r\n o[p.name] = value[p.name]\r\n }\r\n }\r\n return o;\r\n }\r\n json4all.addType(constructor)\r\n}\r\n\r\nreturn json4all;\r\n\r\n});\r\n","// src/components/GenericDataGrid.tsx\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { DataGrid, Column, DataGridHandle, CellMouseArgs, RenderCellProps, RenderHeaderCellProps, RenderSummaryCellProps, ColSpanArgs, CellSelectArgs, CellKeyDownArgs, CellKeyboardEvent, CellMouseEvent } from 'react-data-grid';\nimport 'react-data-grid/lib/styles.css';\n\nimport { useApiCall } from '../../hooks/useApiCall';\nimport { CircularProgress, Typography, Box, Alert, useTheme, Button } from '@mui/material';\nimport { cambiarGuionesBajosPorEspacios } from '../../utils/functions';\n\n\nimport { useSnackbar } from '../../contexts/SnackbarContext';\n\nimport { CellFeedback, FieldDefinition, FixedField, TableDefinition } from '../../types';\n\nimport { ConfirmDialog } from '../ConfirmDialog';\nimport { DataGridOptionsDialog } from './DataGridOptionsDialog';\n\nimport { actionsColumnHeaderCellRenderer, defaultColumnHeaderCellRenderer, detailColumnCellHeaderRenderer } from './renderers/headerCellRenderers';\nimport { actionsColumnSummaryCellRenderer, defaultColumnSummaryCellRenderer, detailColumnCellSummaryRenderer } from './renderers/summaryCellRenderers';\nimport { allColumnsCellRenderer } from './renderers/cellRenderers';\nimport { allColumnsEditCellRenderer } from './renderers/editCellRenderers';\nimport { DetailTable } from 'backend-plus';\nimport { EmptyRowsRenderer } from './renderers/emptyRowRenderer';\nimport { useIsDrawerOpen } from '../../store';\nimport { buildMenuOptions } from './menu/options';\n\ninterface GenericDataGridProps{\n tableName: string;\n fixedFields?: FixedField[];\n gridStyles?: React.CSSProperties\n}\n\nexport const NEW_ROW_INDICATOR = '$new';\nexport const DETAIL_ROW_INDICATOR = '$detail';\n\n// --- Funciones de Utilidad ---\n\nexport const getPrimaryKeyValues = (row: Record<string, any>, primaryKey: string[]): string => {\n let keys = [...primaryKey];\n if(row[DETAIL_ROW_INDICATOR]){\n keys = keys.concat(DETAIL_ROW_INDICATOR);\n }\n return keys.map(key => {\n return row[key] !== undefined && row[key] !== null\n ? String(row[key])\n : 'NULL_OR_UNDEFINED';\n }).join('|');\n};\n\n/**\n * Obtiene la clave única para una celda.\n * @param row La fila actual.\n * @param columnKey La clave de la columna.\n * @param primaryKey La clave primaria de la tabla.\n * @returns Clave única de la celda (ej: \"pkValue1|pkValue2|columnKey\").\n */\nexport const getCellKey = (row: Record<string, any>, columnKey: string, primaryKey: string[]): string => {\n return `${getPrimaryKeyValues(row, primaryKey)}|${columnKey}`;\n};\n\n// --- Tipos de Columna ---\n\ninterface BaseCustomColumn<TRow, TSummaryRow = unknown> extends Column<TRow, TSummaryRow> {\n customType: 'default' | 'detail' | 'action',\n tableDefinition: TableDefinition,\n}\n\nexport interface DefaultColumn<TRow, TSummaryRow = unknown> extends BaseCustomColumn<TRow, TSummaryRow> {\n customType: 'default';\n fieldDef: FieldDefinition;\n // 💥 MULTI-CELL FEEDBACK: Se cambia a un mapa\n cellFeedbackMap: Map<string, CellFeedback>, \n setCellFeedbackMap: React.Dispatch<React.SetStateAction<Map<string, CellFeedback>>>,\n setTableData: React.Dispatch<React.SetStateAction<any[]>>,\n primaryKey: string[],\n fixedFields: FixedField[] | undefined,\n localCellChanges: Map<string, Set<string>>,\n setLocalCellChanges: React.Dispatch<React.SetStateAction<Map<string, Set<string>>>>,\n handleKeyPressInEditor: (rowIndex: number, columnKey: string, event:React.KeyboardEvent, currentColumns: Column<any>[], handleCommit:(currentValue: any, closeEditor: boolean, focusNextCell: boolean) => Promise<void>) => void\n}\n\nexport interface DetailColumn<TRow, TSummaryRow = unknown> extends BaseCustomColumn<TRow, TSummaryRow> {\n customType: 'detail';\n detailTable: DetailTable,\n primaryKey: string[],\n tableData: any[],\n setTableData: React.Dispatch<React.SetStateAction<any[]>>,\n detailKey: string\n}\n\nexport interface ActionColumn<TRow, TSummaryRow = unknown> extends BaseCustomColumn<TRow, TSummaryRow> {\n customType: 'action';\n handleDeleteRow: (row: any) => void;\n handleAddRow: () => void\n}\n\nexport type CustomColumn<TRow, TSummaryRow = unknown> =\n | DefaultColumn<TRow, TSummaryRow>\n | DetailColumn<TRow, TSummaryRow>\n | ActionColumn<TRow, TSummaryRow>;\n\nconst GenericDataGrid: React.FC<GenericDataGridProps> = ({\n tableName,\n fixedFields,\n gridStyles,\n}) => {\n const isOpenMenu = useIsDrawerOpen()\n const [tableDefinition, setTableDefinition] = useState<TableDefinition | null>(null);\n const [tableData, setTableData] = useState<any[]>([]);\n const [isFilterRowVisible, setIsFilterRowVisible] = useState<boolean>(false);\n const [filters, setFilters] = useState<Record<string, string>>({});\n const [selectedRows, setSelectedRows] = useState((): ReadonlySet<string> => new Set());\n const [selectedCell, setSelectedCell] = useState<CellSelectArgs<any, NoInfer<{id: string}>> | undefined>(undefined);\n\n // 💥 MULTI-CELL FEEDBACK: Estado principal para manejar múltiples mensajes de feedback\n const [cellFeedbackMap, setCellFeedbackMap] = useState<Map<string, CellFeedback>>(new Map());\n \n // 🗑️ OLD: [cellFeedback, setCellFeedback] = useState<CellFeedback | null>(null);\n\n const [localCellChanges, setLocalCellChanges] = useState<Map<string, Set<string>>>(new Map());\n const theme = useTheme();\n\n const [openConfirmDialog, setOpenConfirmDialog] = useState(false);\n const [openDataGridOptions, setOpenDataGridOptions] = useState(false);\n const [dataGridOptionsAnchorEl, setDataGridOptionsAnchorEl] = useState<HTMLElement | null>(null);\n const [rowToDelete, setRowToDelete] = useState<any | null>(null);\n const [exitingRowIds, setExitingRowIds] = useState<Set<string>>(new Set());\n\n const { showSuccess, showError, showWarning, showInfo } = useSnackbar(); const feedbackTimerRef = useRef<NodeJS.Timeout | null>(null);\n const dataGridRef = useRef<DataGridHandle>(null);\n const { callApi, loading, error } = useApiCall();\n\n const getRowCount = () => tableData.filter((row)=> !row[DETAIL_ROW_INDICATOR]).length\n const getFilteredRowCount = () => filteredRows.filter((row)=> !row[DETAIL_ROW_INDICATOR]).length\n \n // 💥 MULTI-CELL: Limpieza de estado al cambiar de tabla\n useEffect(() => {\n setFilters({});\n setIsFilterRowVisible(false);\n setSelectedRows(new Set());\n setTableDefinition(null);\n setTableData([]);\n setCellFeedbackMap(new Map()); // 💥 MULTI-CELL: Limpiar el mapa\n setLocalCellChanges(new Map());\n setOpenConfirmDialog(false);\n setRowToDelete(null);\n setExitingRowIds(new Set());\n if (feedbackTimerRef.current) {\n clearTimeout(feedbackTimerRef.current);\n }\n }, [tableName]);\n\n useEffect(() => {\n const fetchDataAndDefinition = async () => {\n try {\n const definition: TableDefinition = await callApi('table_structure', { table: tableName });\n setTableDefinition(definition);\n const data = await callApi('table_data', {\n table: tableName,\n fixedFields: fixedFields\n });\n setTableData(data);\n } catch (err: any) {\n setTableDefinition(null);\n setTableData([]);\n showError(`Error al cargar datos para la tabla '${tableName}': ${err.message || 'Error desconocido'}`);\n } finally { }\n };\n fetchDataAndDefinition();\n }, [tableName, fixedFields, showError]);\n\n // 💥 MULTI-CELL: Lógica del temporizador actualizada para el mapa\n useEffect(() => {\n if (cellFeedbackMap.size > 0) {\n if (feedbackTimerRef.current) {\n clearTimeout(feedbackTimerRef.current);\n }\n const timerDuration = 3000;\n feedbackTimerRef.current = setTimeout(() => {\n setCellFeedbackMap(prevMap => {\n const newMap = new Map(prevMap);\n let mapChanged = false;\n \n // Solo eliminamos el feedback de tipo 'success' automáticamente\n for (const [cellId, feedback] of prevMap.entries()) {\n if (feedback.type === 'success') {\n newMap.delete(cellId);\n mapChanged = true;\n }\n }\n \n // Retorna el nuevo mapa solo si hubo cambios\n return mapChanged ? newMap : prevMap;\n });\n feedbackTimerRef.current = null;\n }, timerDuration);\n }\n return () => {\n if (feedbackTimerRef.current) {\n clearTimeout(feedbackTimerRef.current);\n }\n };\n }, [cellFeedbackMap]);\n\n\n const primaryKey = useMemo(() => {\n if (!tableDefinition) return ['id'];\n return tableDefinition.primaryKey && tableDefinition.primaryKey.length > 0 ? tableDefinition.primaryKey : ['id'];\n }, [tableDefinition]);\n\n const toggleFilterVisibility = useCallback(() => {\n setIsFilterRowVisible(prev => {\n if (prev) {\n setFilters({});\n }\n return !prev;\n });\n }, []);\n\n const handleAddRow = useCallback(() => {\n if (!tableDefinition) {\n showWarning('No se puede agregar una fila sin la definición de la tabla.');\n return;\n }\n const newRow: Record<string, any> = {};\n tableDefinition.fields.forEach(field => {\n newRow[field.name] = null;\n });\n newRow[NEW_ROW_INDICATOR] = true;\n\n if (fixedFields) {\n fixedFields.forEach(fixedField => {\n newRow[fixedField.fieldName] = fixedField.value;\n });\n }\n\n setTableData(prevData => [newRow, ...prevData]);\n setSelectedRows(new Set());\n\n const tempRowId = getPrimaryKeyValues(newRow, primaryKey);\n setLocalCellChanges(prev => {\n const newMap = new Map(prev);\n const mandatoryEditableColumns = new Set<string>();\n\n tableDefinition.fields.forEach(field => {\n const isMandatory = (field.nullable === false || field.isPk);\n const isEditable = field.editable !== false;\n\n if (isMandatory && isEditable) {\n mandatoryEditableColumns.add(field.name);\n }\n });\n newMap.set(tempRowId, mandatoryEditableColumns);\n return newMap;\n });\n\n }, [tableDefinition, showWarning, primaryKey, fixedFields]);\n\n const handleDeleteRow = useCallback(async (row: any) => {\n setRowToDelete(row);\n setOpenConfirmDialog(true);\n }, []);\n\n const handleConfirmDelete = useCallback(async (confirm: boolean) => {\n setOpenConfirmDialog(false);\n if (!confirm || !rowToDelete) {\n showWarning('Eliminación cancelada por el usuario.');\n setRowToDelete(null);\n return;\n }\n\n if (!tableDefinition || !tableName) {\n showError('No se puede eliminar la fila sin la definición de la tabla o el nombre de la tabla.');\n setRowToDelete(null);\n return;\n }\n\n const rowId = getPrimaryKeyValues(rowToDelete, primaryKey);\n\n setExitingRowIds(prev => new Set(prev).add(rowId));\n\n setTimeout(async () => {\n if (rowToDelete[NEW_ROW_INDICATOR]) {\n setTimeout(() => {\n setTableData(prevData => prevData.filter(row => getPrimaryKeyValues(row, primaryKey) !== rowId));\n setLocalCellChanges(prev => {\n const newMap = new Map(prev);\n newMap.delete(rowId);\n return newMap;\n });\n setSelectedRows(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n setExitingRowIds(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n showInfo(`Fila no guardada '${rowId}' eliminada localmente.`);\n setRowToDelete(null);\n }, 500);\n return;\n }\n\n try {\n const primaryKeyValues = tableDefinition.primaryKey.map((key) => rowToDelete[key]);\n await callApi('table_record_delete', {\n table: tableName,\n primaryKeyValues: primaryKeyValues\n });\n\n console.log(`Fila con ID ${rowId} eliminada exitosamente del backend.`);\n setTimeout(() => {\n setTableData(prevData => prevData.filter(row => getPrimaryKeyValues(row, primaryKey) !== rowId));\n setLocalCellChanges(prev => {\n const newMap = new Map(prev);\n newMap.delete(rowId);\n return newMap;\n });\n setSelectedRows(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n setExitingRowIds(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n showSuccess(`Fila '${rowId}' eliminada exitosamente.`);\n setRowToDelete(null);\n }, 500);\n\n } catch (err: any) {\n console.error(`Error al eliminar la fila '${rowId}':`, err);\n showError(`Error al eliminar la fila '${rowId}': ${err.message || 'Error desconocido'}`);\n setExitingRowIds(prev => {\n const newSet = new Set(prev);\n newSet.delete(rowId);\n return newSet;\n });\n setRowToDelete(null);\n }\n }, 10);\n }, [rowToDelete, tableDefinition, tableName, primaryKey, showInfo, showSuccess, showError, showWarning, setTableData, setLocalCellChanges, setSelectedRows]);\n\n const filteredRows = useMemo(() => {\n let rows = tableData;\n if (isFilterRowVisible) {\n Object.keys(filters).forEach(key => {\n const filterValue = filters[key].toLowerCase();\n if (filterValue) {\n rows = rows.filter(row => {\n const cellValue = String(row[key] || '').toLowerCase();\n return cellValue.includes(filterValue);\n });\n }\n });\n }\n return rows;\n }, [tableData, filters, isFilterRowVisible]);\n\n const handleKeyPressInEditor = useCallback((rowIndex: number, columnKey: string, event: React.KeyboardEvent, currentColumns: Column<any>[], handleCommit:(currentValue: any, closeEditor: boolean, focusNextCell: boolean) => Promise<void>) => {\n if (dataGridRef.current && tableDefinition) {\n const currentColumnIndex = currentColumns.findIndex((col: Column<any>) => col.key === columnKey);\n const editableColumns = currentColumns.filter(col => {\n const fieldDefinition = tableDefinition.fields.find(f => f.name === col.key);\n return col.key !== 'actionsColumn' && (col as DetailColumn<any, unknown>).customType != 'detail' && (fieldDefinition?.editable !== false && !fieldDefinition?.clientSide);\n });\n const {key, target} = event;\n const input = target as HTMLInputElement;\n if (currentColumnIndex !== -1 && editableColumns.length > 0) {\n const editableColumnKeys = editableColumns.map(col => col.key);\n let currentEditableColumnIndex = editableColumnKeys.indexOf(columnKey);\n \n const hacerFoco = ({rowIdx, idx}:{rowIdx:number, idx: number}) => \n setTimeout(()=>dataGridRef.current?.selectCell({ rowIdx, idx }, { enableEditor: true, shouldFocusCell: true }),10);\n const calcularColumnaSiguiente = ()=>{\n let nextEditableColumnIndex = currentEditableColumnIndex + 1;\n let nextRowIndex = rowIndex;\n if (nextEditableColumnIndex >= editableColumns.length) {\n nextEditableColumnIndex = 0;\n nextRowIndex++;\n while(filteredRows[nextRowIndex] && filteredRows[nextRowIndex][DETAIL_ROW_INDICATOR]){\n nextRowIndex++;\n }\n if (nextRowIndex >= filteredRows.length) {\n nextRowIndex = 0;\n }\n }\n const nextColumnKey = editableColumnKeys[nextEditableColumnIndex];\n const nextColumnIndex = currentColumns.findIndex(col => col.key === nextColumnKey);\n return {rowIdx: nextRowIndex, idx:nextColumnIndex}\n }\n const calcularColumnaAnterior = ()=>{\n let nextEditableColumnIndex = currentEditableColumnIndex - 1;\n let nextRowIndex = rowIndex;\n if (nextEditableColumnIndex <= 0) {\n nextEditableColumnIndex = 0;\n }\n const nextColumnKey = editableColumnKeys[nextEditableColumnIndex];\n const nextColumnIndex = currentColumns.findIndex(col => col.key === nextColumnKey);\n return {rowIdx: nextRowIndex, idx:nextColumnIndex}\n }\n const calcularFilaSiguiente = ()=>{\n let nextRowIndex = rowIndex; \n nextRowIndex++;\n while(filteredRows[nextRowIndex] && filteredRows[nextRowIndex][DETAIL_ROW_INDICATOR]){\n nextRowIndex++;\n } \n if (nextRowIndex >= filteredRows.length) {\n return {rowIdx: rowIndex, idx:currentColumnIndex}\n }\n return {rowIdx: nextRowIndex, idx:currentColumnIndex}\n }\n\n const calcularFilaAnterior = ()=>{\n let nextRowIndex = rowIndex;\n nextRowIndex--;\n while(filteredRows[nextRowIndex] && filteredRows[nextRowIndex][DETAIL_ROW_INDICATOR]){\n nextRowIndex--;\n } \n if (nextRowIndex < 0) {\n return {rowIdx: rowIndex, idx:currentColumnIndex}\n }\n return {rowIdx: nextRowIndex, idx:currentColumnIndex}\n }\n \n if (currentEditableColumnIndex !== -1) {\n switch(true){\n case ['Enter','Tab'].includes(key): {\n hacerFoco(calcularColumnaSiguiente());\n break;\n }\n case (key == 'ArrowRight'): {\n const cursorPosition = input.selectionStart;\n const inputValueLength = input.value.length;\n if(cursorPosition === inputValueLength){\n hacerFoco(calcularColumnaSiguiente());\n }\n break;\n }\n case (key == 'ArrowLeft'): {\n const cursorPosition = input.selectionStart;\n if(cursorPosition === 0){\n hacerFoco(calcularColumnaAnterior());\n }\n break;\n }\n case (key == 'ArrowUp'): {\n hacerFoco(calcularFilaAnterior());\n break;\n }\n case (key == 'ArrowDown'): {\n hacerFoco(calcularFilaSiguiente());\n break;\n }\n case (key == 'F4'): {\n const {rowIdx, idx} = calcularFilaSiguiente();\n const previousRow = tableData[rowIndex-1]\n if(previousRow && !previousRow[DETAIL_ROW_INDICATOR]){\n handleCommit(previousRow[columnKey], true, true).then(()=>hacerFoco({rowIdx ,idx}))\n }\n break;\n }\n default: break;\n }\n } \n } \n }\n }, [filteredRows, tableDefinition, tableData]);\n \n const handleSelectedCellChange = useCallback((args: CellSelectArgs<any, NoInfer<{id: string}>>|undefined) => {\n setSelectedCell(args);\n }, []);\n \n \n const menuOptions = useMemo(() => buildMenuOptions({\n tableDefinition,\n tableName,\n fixedFields,\n setTableData,\n callApi,\n showSuccess,\n showError,\n showWarning\n }), [tableDefinition, tableName, fixedFields, setTableData, callApi, showSuccess, showError, showWarning]);\n const columns: CustomColumn<any>[] = useMemo(() => {\n if (!tableDefinition) return [];\n const fieldsToShow = tableDefinition.fields.filter((field: FieldDefinition) => {\n const fixedFieldEntry = fixedFields?.find(f => f.fieldName === field.name);\n return !(fixedFieldEntry && fixedFieldEntry.until === undefined);\n });\n const defaultColumns: CustomColumn<any>[] = fieldsToShow.map((fieldDef: FieldDefinition) => {\n const isFixedField = fixedFields?.some(f => f.fieldName === fieldDef.name);\n const isFieldEditable = fieldDef.editable !== false && !isFixedField;\n\n return {\n key: fieldDef.name,\n customType: 'default',\n tableDefinition,\n fieldDef,\n // 💥 MULTI-CELL: Se inyecta el mapa y su setter\n cellFeedbackMap,\n setCellFeedbackMap,\n primaryKey,\n fixedFields,\n localCellChanges,\n setLocalCellChanges,\n setTableData,\n name: fieldDef.label || cambiarGuionesBajosPorEspacios(fieldDef.name),\n resizable: true,\n sortable: true,\n editable: isFieldEditable,\n handleKeyPressInEditor,\n flexGrow: 1,\n minWidth: 60, \n renderHeaderCell: (props: RenderHeaderCellProps<any, unknown>) => defaultColumnHeaderCellRenderer(props, fieldDef),\n renderSummaryCell: (props: RenderSummaryCellProps<any, unknown>) => defaultColumnSummaryCellRenderer(props, fixedFields, isFilterRowVisible, filters, setFilters),\n };\n });\n\n // Calcular ancho dinámico basado en botones disponibles\n const availableActions = [\n tableDefinition.allow?.insert,\n tableDefinition.allow?.delete,\n tableDefinition.allow?.['vertical-edit']\n ].filter(Boolean).length;\n \n const actionColumnWidth = availableActions === 0 ? 30 : 12 + (availableActions * 25);\n\n const actionsColumn: CustomColumn<any> = {\n key: 'actionsColumn',\n customType: 'action',\n tableDefinition,\n handleDeleteRow,\n handleAddRow,\n name: 'filterCol',\n width: actionColumnWidth,\n editable: false,\n resizable: false,\n sortable: false, \n renderHeaderCell: (props: RenderHeaderCellProps<any, unknown>) => actionsColumnHeaderCellRenderer(props, isFilterRowVisible, toggleFilterVisibility, (e: React.MouseEvent<HTMLElement>) => { \n setDataGridOptionsAnchorEl(e.currentTarget); \n setOpenDataGridOptions(true); \n }),\n renderSummaryCell: (props: RenderSummaryCellProps<any, unknown>) => actionsColumnSummaryCellRenderer(props),\n }; const detailColumns: CustomColumn<any>[] = [];\n if (tableDefinition.detailTables && tableDefinition.detailTables.length > 0) {\n tableDefinition.detailTables.forEach(detailTable => {\n const detailKey = `detail_${detailTable.abr}`;\n detailColumns.push({\n key: detailKey,\n customType: 'detail',\n tableDefinition,\n detailTable,\n primaryKey,\n tableData,\n setTableData,\n detailKey,\n name: detailTable.label || `Detalle ${detailTable.abr}`,\n resizable: false,\n sortable: false,\n editable: false,\n width:30,\n minWidth: 30, \n renderHeaderCell: (props: RenderHeaderCellProps<any, unknown>) => detailColumnCellHeaderRenderer(props, detailTable),\n renderSummaryCell: (props: RenderSummaryCellProps<any, unknown>) => detailColumnCellSummaryRenderer(props),\n });\n });\n }\n \n const allColumns = [\n actionsColumn,\n ...detailColumns,\n ...defaultColumns,\n ];\n\n return allColumns.map(col => ({\n ...col,\n colSpan: (args: ColSpanArgs<any, unknown>) => {\n if (args.type === 'ROW'){\n const detailTableAbr = args.row[DETAIL_ROW_INDICATOR];\n if(col.key === `detail_${detailTableAbr}`) {\n return allColumns.length;\n }\n }\n return undefined;\n },\n editorOptions:{closeOnExternalRowChange:false}, //con esto no se pierde el foco\n renderEditCell: (props) => allColumnsEditCellRenderer(props, allColumns),\n renderCell: (props: RenderCellProps<any, unknown>) => allColumnsCellRenderer(props),\n }));\n }, [\n tableDefinition, isFilterRowVisible, filters, toggleFilterVisibility,\n // 💥 MULTI-CELL: Se usa el mapa en lugar de la variable simple\n cellFeedbackMap, \n primaryKey, theme.palette.success.light, theme.palette.error.light,\n theme.palette.info.light, theme.palette.action.selected,\n handleKeyPressInEditor, setTableData,\n localCellChanges, handleDeleteRow, handleAddRow, fixedFields, tableData\n ]);\n\n const handleRowsChange = useCallback((updatedRows: any[]) => {\n setTableData(updatedRows);\n }, []);\n\n //TODO: mejorar esto, por ahora no encontré una forma programática\n const deselectAllOtherGrids = (currentGridElement: HTMLDivElement|undefined|null) => {\n const allSelectedCells = document.querySelectorAll(\"div[aria-selected='true']\");\n allSelectedCells.forEach(cell => {\n const parentGrid = cell.closest('.rdg'); \n if (parentGrid && parentGrid !== currentGridElement) {\n cell.setAttribute(\"aria-selected\", \"false\");\n }\n });\n };\n\n const handleCellKeyDown = (args: CellKeyDownArgs<any, { id: string }>, event: CellKeyboardEvent) => {\n if (['Enter', 'Tab', 'ArrowDown', 'ArrowUp','ArrowRight', 'ArrowLeft'].includes(event.key)) {\n event.preventGridDefault();\n }\n }\n const handleCellMouseDown = useCallback((_args: CellMouseArgs<any, { id: string }>, event: CellMouseEvent) => {\n event.preventGridDefault(); \n },[]);\n\n const handlCellDoubleClick = useCallback((_args: CellMouseArgs<any, { id: string }>, event: CellMouseEvent) => {\n event.preventGridDefault(); \n },[]);\n\n const handleCellClick = useCallback((args: CellMouseArgs<any, { id: string }>, _event: CellMouseEvent) => {\n const fieldDefinition = tableDefinition?.fields.find(f => f.name === args.column.key);\n const isFixedField = fixedFields?.some(f => f.fieldName === args.column.key);\n const isEditable = fieldDefinition?.editable !== false && !isFixedField;\n if(isEditable){\n deselectAllOtherGrids(dataGridRef.current?.element);\n args.selectCell(true);\n }\n console.log(\"Clicked column index:\", args.column.idx);\n console.log(\"Clicked row index:\", args.rowIdx);\n console.log(\"Is editable:\", isEditable);\n }, [tableDefinition, fixedFields]);\n\n \n if (loading) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\n <CircularProgress />\n <Typography variant=\"h6\" sx={{ ml: 2 }}>Cargando tabla...</Typography>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\n <Alert severity=\"error\">{error.message}</Alert>\n </Box>\n );\n }\n\n if (!tableDefinition) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\n <Alert severity=\"warning\">No se pudo cargar la definición de la tabla.</Alert>\n </Box>\n );\n }\n\n return (\n <Box sx={{ pt: 2, display: 'flex', flexDirection: 'column', height: '100%', boxSizing: 'border-box' }}>\n <Box\n sx={{\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n padding: theme.spacing(1),\n textAlign: 'left',\n fontWeight: 'bold',\n borderBottom: `1px solid ${theme.palette.divider}`,\n borderTopLeftRadius: theme.shape.borderRadius,\n borderTopRightRadius: theme.shape.borderRadius,\n ml: 2,\n mr: 2\n }}\n >\n <Typography variant=\"subtitle2\" component=\"div\">\n {cambiarGuionesBajosPorEspacios(tableDefinition.title || tableDefinition.name)} - {getFilteredRowCount() === getRowCount() ? `${getRowCount()} registros`\n : `${getFilteredRowCount()} (F)`\n }\n </Typography>\n </Box>\n <Box\n sx={{\n flexGrow: 1,\n boxSizing: 'border-box',\n position: 'relative',\n overflowX: 'auto',\n overflowY: 'auto',\n px: 2,\n pb: 2,\n }}\n >\n <DataGrid\n className='rdg-light'\n ref={dataGridRef}\n //@ts-ignore TODO: arreglar este tipo\n columns={columns}\n rows={filteredRows.map(row => ({\n ...row,\n style: exitingRowIds.has(getPrimaryKeyValues(row, primaryKey))\n ? { maxHeight: 0, opacity: 0, overflow: 'hidden' }\n : { maxHeight: '35px', opacity: 1 }\n }))}\n enableVirtualization={true}\n rowKeyGetter={(row: any) => getPrimaryKeyValues(row, primaryKey)}\n onSelectedRowsChange={setSelectedRows}\n onSelectedCellChange={handleSelectedCellChange}\n onRowsChange={handleRowsChange}\n selectedRows={selectedRows}\n // TODO: Arreglar tamaño fijo pasarlo a dinamico\n rowHeight={(row) => row[DETAIL_ROW_INDICATOR] ? 400 : 30}\n style={{...{ height: '100%', width: '100%', boxSizing: 'border-box' },...gridStyles}}\n headerRowHeight={30}\n topSummaryRows={isFilterRowVisible ? [{ id: 'filterRow' }] : undefined}\n summaryRowHeight={isFilterRowVisible ? 30 : 0}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n onCellMouseDown={handleCellMouseDown}\n onCellDoubleClick={handlCellDoubleClick}\n onCellClick={handleCellClick}\n onCellKeyDown={handleCellKeyDown}\n />\n </Box>\n <ConfirmDialog\n open={openConfirmDialog}\n onClose={handleConfirmDelete}\n title=\"Confirmar Eliminación\"\n message={rowToDelete && rowToDelete[NEW_ROW_INDICATOR]\n ? `¿Estás seguro de que quieres eliminar esta nueva fila (ID: ${getPrimaryKeyValues(rowToDelete, primaryKey)}) localmente?`\n : rowToDelete\n ? `¿Estás seguro de que quieres eliminar la fila con ID: ${getPrimaryKeyValues(rowToDelete, primaryKey)} de la base de datos? Esta acción es irreversible.`\n : '¿Estás seguro de que quieres eliminar este registro? Esta acción es irreversible.'\n }\n />\n <DataGridOptionsDialog\n open={openDataGridOptions}\n onClose={() => setOpenDataGridOptions(false)}\n options={menuOptions}\n anchorEl={dataGridOptionsAnchorEl}\n />\n </Box>\n );\n};\nexport default GenericDataGrid;\n","import { useState, useCallback } from 'react';\r\nimport { useSnackbar } from '../contexts/SnackbarContext';\r\nimport { executeBackendProcedure as baseExecuteBackendProcedure } from '../utils/fetchApi';\r\nimport { UseApiCallResult } from '../types';\r\n\r\nexport const useApiCall = <T = any>(): UseApiCallResult<T> => {\r\n const { showSnackbar } = useSnackbar();\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const callApi = useCallback(async (\r\n procedureName: string,\r\n params: Record<string, any>,\r\n ): Promise<T | undefined> => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const result = await baseExecuteBackendProcedure<T>(procedureName, params);\r\n return result === null ? undefined : result;\r\n } catch (err: any) {\r\n setError(err);\r\n let snackbarMessage = `Error inesperado al ejecutar '${procedureName}'.`;\r\n if (err instanceof TypeError) {\r\n snackbarMessage = `Problema de conexión: ${err.message}. Por favor, revisa tu internet o intenta de nuevo.`;\r\n } else if (err instanceof Error) {\r\n snackbarMessage = err.message;\r\n }\r\n showSnackbar(snackbarMessage, 'error');\r\n throw err\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [showSnackbar]);\r\n\r\n return { callApi, loading, error };\r\n};\r\n\r\nexport const useApiCallWithoutSnackbar = <T = any>(): UseApiCallResult<T> => {\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const callApi = useCallback(async (\r\n procedureName: string,\r\n params: Record<string, any>\r\n ): Promise<T | undefined> => {\r\n setLoading(true);\r\n setError(null);\r\n \r\n try {\r\n const result = await baseExecuteBackendProcedure<T>(procedureName, params);\r\n return result === null ? undefined : result;\r\n } catch (err: any) {\r\n // Manejamos el error internamente (opcionalmente logueando) pero NO usamos el Snackbar.\r\n setError(err); \r\n console.error(`Error en la llamada API (WithoutSnackbar) para ${procedureName}:`, err);\r\n throw err;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n return { callApi, loading, error };\r\n};","// src/contexts/SnackbarContext.tsx\r\nimport React, { createContext, useContext, useState, useCallback, ReactNode } from 'react';\r\nimport MuiAlert, { AlertProps } from '@mui/material/Alert';\r\nimport Snackbar from '@mui/material/Snackbar';\r\nimport { SnackbarContextType, SnackbarProviderProps, SnackbarState } from '../types';\r\n\r\n// Definir el tipo de las props para el Alert en el Snackbar\r\nconst SnackbarAlert = React.forwardRef<HTMLDivElement, AlertProps>(function SnackbarAlert(props, ref) {\r\n return <MuiAlert elevation={6} ref={ref} variant=\"filled\" {...props} />;\r\n});\r\n\r\n// Crear el contexto\r\nconst SnackbarContext = createContext<SnackbarContextType | undefined>(undefined);\r\n\r\n// Valores por defecto para la duración (en milisegundos)\r\nconst DEFAULT_SUCCESS_DURATION = 3000; \r\nconst DEFAULT_ERROR_DURATION = 10000; \r\n\r\nexport const SnackbarProvider: React.FC<SnackbarProviderProps> = ({ children }) => {\r\n const [snackbar, setSnackbar] = useState<SnackbarState>({\r\n open: false,\r\n message: '',\r\n severity: 'info',\r\n duration: DEFAULT_SUCCESS_DURATION, // Valor inicial\r\n });\r\n\r\n const showSnackbar = useCallback((message: string, severity: 'success' | 'error' | 'info' | 'warning', duration?: number | null) => {\r\n // Determina la duración final\r\n const finalDuration = duration !== undefined && duration !== null\r\n ? duration\r\n : (severity === 'error' ? DEFAULT_ERROR_DURATION : DEFAULT_SUCCESS_DURATION);\r\n\r\n setSnackbar({\r\n open: true,\r\n message,\r\n severity,\r\n duration: finalDuration,\r\n });\r\n }, []);\r\n\r\n // Adapta los métodos de conveniencia para aceptar la duración opcional\r\n const showSuccess = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'success', duration), [showSnackbar]);\r\n const showError = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'error', duration), [showSnackbar]);\r\n const showWarning = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'warning', duration), [showSnackbar]);\r\n const showInfo = useCallback((message: string, duration?: number | null) => showSnackbar(message, 'info', duration), [showSnackbar]);\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent | Event, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setSnackbar(prev => ({ ...prev, open: false }));\r\n };\r\n\r\n return (\r\n <SnackbarContext.Provider value={{ showSnackbar, showSuccess, showError, showWarning, showInfo }}>\r\n {children}\r\n <Snackbar\r\n open={snackbar.open}\r\n autoHideDuration={snackbar.duration} // Usa la duración del estado\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'top', horizontal: 'center' }}\r\n >\r\n <SnackbarAlert onClose={handleCloseSnackbar} severity={snackbar.severity}>\r\n {snackbar.message}\r\n </SnackbarAlert>\r\n </Snackbar>\r\n </SnackbarContext.Provider>\r\n );\r\n};\r\n\r\n// Hook personalizado para consumir el contexto\r\nexport const useSnackbar = () => {\r\n const context = useContext(SnackbarContext);\r\n if (context === undefined) {\r\n throw new Error('useSnackbar must be used within a SnackbarProvider');\r\n }\r\n return context;\r\n};","// frontend-plus-react/src/config/env.ts\r\n\r\ninterface EnvVariables {\r\n backendUrl: string;\r\n // Agrega aquí cualquier otra variable de entorno que tu librería necesite\r\n}\r\n\r\n// Función auxiliar para obtener la variable de entorno de forma agnóstica al bundler\r\nconst getEnvVar = (key: string): string => {\r\n // Intenta leer de import.meta.env (Vite)\r\n if (typeof import.meta !== 'undefined' && import.meta.env) {\r\n const viteKey = `VITE_${key}`;\r\n // Usamos 'as any' para evitar problemas de tipado con las propiedades dinámicas de import.meta.env\r\n if ((import.meta.env as any)[viteKey]) {\r\n return (import.meta.env as any)[viteKey];\r\n }\r\n }\r\n\r\n // Intenta leer de process.env (CRA, Node.js)\r\n if (typeof process !== 'undefined' && process.env) {\r\n const craKey = `REACT_APP_${key}`;\r\n if (process.env[craKey]) {\r\n return process.env[craKey]!; // '!' para asegurar que no es undefined después de la verificación\r\n }\r\n // También intenta sin prefijo para otros entornos Node.js (menos común para frontends)\r\n if (process.env[key]) {\r\n return process.env[key]!;\r\n }\r\n }\r\n\r\n // Si no se encuentra, puedes lanzar un error o devolver un valor por defecto\r\n console.warn(`Variable de entorno \"${key}\" no encontrada. Asegúrate de definirla con el prefijo correcto (VITE_ o REACT_APP_).`);\r\n return ''; // O lanza un error: throw new Error(`Variable de entorno ${key} no definida.`);\r\n};\r\n\r\n// Exporta un objeto con todas las variables de entorno que tu librería necesita\r\nexport const envConfig: EnvVariables = {\r\n backendUrl: getEnvVar('BACKEND_URL'),\r\n // Agrega aquí las demás variables siguiendo el mismo patrón\r\n};","import { FetchApiOptions } from \"../types\";\r\nimport { envConfig } from '../env'; // Ajusta la ruta según donde lo hayas guardado\r\n\r\n/**\r\n * Función genérica para realizar peticiones a la API.\r\n * Configurada para enviar cookies por defecto.\r\n *\r\n * @param endPoint La URL a la que se realizará la petición.\r\n * @param options Opciones de la petición fetch (método, headers, body, etc.).\r\n * @returns La respuesta de la petición.\r\n * @throws Error si la petición no es exitosa (response.ok es false).\r\n */\r\nexport async function fetchApi(endPoint: string, options: FetchApiOptions): Promise<Response> {\r\nconst BACKEND_URL = envConfig.backendUrl;\r\n const defaultHeaders = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n };\r\n const config: RequestInit = {\r\n ...options,\r\n headers: {\r\n ...defaultHeaders,\r\n ...options?.headers,\r\n },\r\n credentials: 'include',\r\n };\r\n if (config.method === 'GET' || config.method === 'HEAD') {\r\n delete config.body;\r\n }\r\n return await fetch(BACKEND_URL+endPoint, config);\r\n}\r\nexport const executeBackendProcedure = async<T=any>(procedureName:string, params:Record<string, any>):Promise<T | null> => {\r\n function stringifyObjectsAndArraysInParams(params: Record<string, any>): Record<string, any> {\r\n const newParams: Record<string, any> = {};\r\n \r\n for (const key in params) {\r\n // Asegúrate de que la propiedad pertenece al objeto y no a su prototipo\r\n if (Object.prototype.hasOwnProperty.call(params, key)) {\r\n const value = params[key];\r\n \r\n // Condición: Si el valor es un objeto Y NO es null\r\n // Tanto los objetos planos como los arrays pasarán esta condición.\r\n if (typeof value === 'object' && value !== null) {\r\n try {\r\n newParams[key] = JSON.stringify(value);\r\n } catch (e) {\r\n // Manejo de errores si el objeto/array no es serializable (ej. referencias circulares)\r\n console.warn(`Warning: Could not stringify value for key '${key}'. Keeping original value. Error:`, e);\r\n newParams[key] = value; // Mantén el valor original si no se puede stringificar\r\n }\r\n } else {\r\n // Para todos los demás tipos (primitivos, null, undefined), mantenemos el valor original\r\n newParams[key] = value;\r\n }\r\n }\r\n }\r\n return newParams;\r\n }\r\n\r\n const body = new URLSearchParams(stringifyObjectsAndArraysInParams(params));\r\n const response = await fetchApi(`/${procedureName}`, {body, method:'POST'})\r\n if (response.ok) {\r\n const rawResponseTextDefinition = await response.text();\r\n const result = JSON.parse(rawResponseTextDefinition.replace(/^--\\n/, ''));\r\n if(result.error){\r\n throw new Error(result.error.message)\r\n }else{\r\n return result;\r\n }\r\n } else {\r\n const errorTextDefinition = await response.text();\r\n throw new Error(`Error al ejecutar procedure '${procedureName}': ${response.status} - ${errorTextDefinition}`);\r\n } \r\n}\r\n","import * as JSON4all from \"json4all\";\r\nimport { store } from '../store';\r\nimport { TableDefinition } from \"backend-plus\";\r\nimport { FixedField } from \"../types\";\r\n\r\nexport const cambiarGuionesBajosPorEspacios = (texto:string)=>texto.replace(/_/g,' ');\r\nexport const quitarGuionesBajos = (texto:string)=>texto.replace(/_/g,'');\r\n\r\nconst getAppPrefix = () => {\r\n const state = store.getState();\r\n const { config } = state.clientContext;\r\n return /*config.appName+*/'prefijo_'+ config.version+'_';\r\n}\r\n\r\nconst getRawLocalVar = (varName: string) =>localStorage.getItem(getAppPrefix()+varName);\r\n\r\nconst getLocalVar = (varName: string) =>{\r\n let rawData = getRawLocalVar(varName);\r\n if(rawData){\r\n return JSON4all.parse(rawData);\r\n }else{\r\n return null\r\n }\r\n}\r\n\r\nconst setLocalVar = (varName: string, value:any) => localStorage.setItem(getAppPrefix()+varName, JSON4all.stringify(value))\r\n\r\n\r\nconst existsLocalVar = (varName: string) => !!getRawLocalVar(varName);\r\n\r\n\r\nconst removeLocalVar = (varName: string) => localStorage.removeItem(getAppPrefix()+varName);\r\n\r\nconst getSessionVar = (varName: string) =>{\r\n if(existsSessionVar(varName)){\r\n return JSON4all.parse(sessionStorage.getItem(getAppPrefix()+varName)!);\r\n }else{\r\n return null\r\n }\r\n}\r\n\r\nconst setSessionVar = (varName: string, value:any) => sessionStorage.setItem(getAppPrefix()+varName, JSON4all.stringify(value))\r\n\r\n\r\nconst existsSessionVar = (varName: string) => !!(sessionStorage.getItem(getAppPrefix()+varName))?true:false\r\n\r\n\r\nconst removeSessionVar = (varName: string) => sessionStorage.removeItem(getAppPrefix()+varName);\r\n\r\nexport const getDetailTableAndFixedFieldsForDetailTableAbr = (tableDefinition:TableDefinition, detailTableAbr:string, row:any) => {\r\n const detailTable = tableDefinition.detailTables!.find((dt) => dt.abr === detailTableAbr)!; \r\n let fixedFields: FixedField[] = [];\r\n detailTable.fields.forEach((field: any) => {\r\n if (typeof field === \"string\") {\r\n fixedFields.push({ fieldName: field, value: row[field] });\r\n } else {\r\n fixedFields.push({ fieldName: field.target, value: row[field.source] });\r\n }\r\n });\r\n return {detailTable, fixedFields}\r\n}\r\n","// src/store/index.ts\r\n// ... tus imports existentes (incluyendo routerReducer) ...\r\nimport { configureStore, combineReducers } from '@reduxjs/toolkit';\r\nimport {\r\n persistStore,\r\n persistReducer,\r\n FLUSH,\r\n REHYDRATE,\r\n PAUSE,\r\n PERSIST,\r\n PURGE,\r\n REGISTER,\r\n} from 'redux-persist';\r\nimport storage from 'redux-persist/lib/storage';\r\n\r\nimport clientContextReducer from './clientContextSlice';\r\nimport routerReducer from './routerSlice';\r\nimport menuUiReducer from './menuUiSlice';\r\n\r\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\r\nimport { ClientContextState, MenuUiState } from '../types';\r\n\r\nconst rootReducer = combineReducers({\r\n clientContext: clientContextReducer,\r\n router: routerReducer,\r\n menuUi: menuUiReducer,\r\n // ...otros slices\r\n});\r\n\r\nconst persistConfig = {\r\n key: 'root',\r\n storage,\r\n whitelist: ['clientContext', 'router', 'menuUi'],\r\n};\r\n\r\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\r\n\r\nexport const store = configureStore({\r\n reducer: persistedReducer,\r\n middleware: (getDefaultMiddleware) =>\r\n getDefaultMiddleware({\r\n serializableCheck: {\r\n ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],\r\n },\r\n }),\r\n});\r\n\r\nexport const persistor = persistStore(store);\r\n\r\nexport type RootState = ReturnType<typeof store.getState>;\r\nexport type AppDispatch = typeof store.dispatch;\r\n\r\nexport const useAppDispatch: () => AppDispatch = useDispatch;\r\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\r\n\r\n// Hooks selectores personalizados existentes\r\nexport const useClientContext = (): ClientContextState => {\r\n return useAppSelector(state => state.clientContext);\r\n};\r\n\r\nexport const useClientContextStatus = (): ClientContextState['status'] => {\r\n return useAppSelector(state => state.clientContext.status);\r\n};\r\n\r\nexport const useClientContextError = (): ClientContextState['error'] => {\r\n return useAppSelector(state => state.clientContext.error);\r\n};\r\n\r\nexport const useCurrentPath = (): string => {\r\n return useAppSelector(state => state.router.currentPath);\r\n};\r\n\r\nexport const usePreviousPath = (): string | null => {\r\n return useAppSelector(state => state.router.previousPath);\r\n};\r\n\r\n// Selectores para menuUi\r\nexport const useMenuUi = (): MenuUiState => {\r\n return useAppSelector(state => state.menuUi);\r\n};\r\n\r\nexport const useIsDrawerOpen = (): boolean => {\r\n return useAppSelector(state => state.menuUi.isDrawerOpen);\r\n};\r\n\r\nexport const useSubMenuOpenState = (menuName: string): boolean => {\r\n return useAppSelector(state => state.menuUi.subMenuOpenStates[menuName] || false);\r\n};\r\n\r\nexport const useRedirectPath = (): string | null => {\r\n return useAppSelector(state => state.router.redirectPath);\r\n};","// src/store/clientContextSlice.ts\r\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';\r\nimport { MenuInfoBase, ProcedureDef, AppConfigClientSetup } from \"backend-plus\";\r\nimport { Details } from 'express-useragent'; // Asumiendo que 'Details' viene de aquí\r\nimport { fetchApi } from '../utils/fetchApi'; // Tu utilidad fetchApi\r\nimport { ClientContextState } from '../types';\r\n\r\n// Estado inicial para el slice de clientContext\r\nconst initialState: ClientContextState = {\r\n menu: [],\r\n procedure: {},\r\n procedures: [],\r\n config: {} as AppConfigClientSetup, // Inicializa con un objeto vacío o valores por defecto adecuados\r\n useragent: {} as Details, // Igual aquí\r\n username: '',\r\n status: 'idle', // Por defecto, sin carga\r\n error: null, // Sin error\r\n};\r\n\r\n// **Thunk asíncrono para cargar los datos del clientContext**\r\n// Esto reemplaza tu función 'loadClientContextData'\r\nexport const fetchClientContext = createAsyncThunk(\r\n 'clientContext/fetchClientContext',\r\n async (_, { rejectWithValue }) => {\r\n try {\r\n const setupResponse = await fetchApi('/client-setup', { method: 'GET' });\r\n if (!setupResponse.ok) {\r\n const errorData = await setupResponse.text();\r\n throw new Error(errorData || 'Error al obtener configuración del cliente');\r\n }\r\n const clientSetup = await setupResponse.json();\r\n\r\n // Retorna los datos cargados. El 'status' y 'error' se manejan automáticamente\r\n // en los 'extraReducers'.\r\n return clientSetup as Omit<ClientContextState, 'status' | 'error'>;\r\n } catch (error: any) {\r\n // Usa rejectWithValue para pasar el mensaje de error al estado 'failed'\r\n return rejectWithValue(error.message || 'Error desconocido al cargar el contexto');\r\n }\r\n }\r\n);\r\n\r\n// Creación del slice de Redux para clientContext\r\nconst clientContextSlice = createSlice({\r\n name: 'clientContext',\r\n initialState,\r\n reducers: {\r\n // Un reducer para limpiar el contexto del cliente (ej. al cerrar sesión)\r\n clearClientContext: (state) => {\r\n // Restablece el estado a su valor inicial\r\n Object.assign(state, initialState);\r\n },\r\n // Puedes añadir otros reducers aquí si necesitas modificar partes del clientContext directamente\r\n // pero el thunk es la forma preferida para la carga inicial.\r\n },\r\n // **extraReducers maneja las acciones del thunk asíncrono**\r\n extraReducers: (builder) => {\r\n builder\r\n // Cuando la petición está pendiente (cargando)\r\n .addCase(fetchClientContext.pending, (state) => {\r\n state.status = 'loading';\r\n state.error = null;\r\n })\r\n // Cuando la petición se completa con éxito\r\n .addCase(fetchClientContext.fulfilled, (state, action: PayloadAction<Omit<ClientContextState, 'status' | 'error'>>) => {\r\n state.status = 'succeeded';\r\n // Asigna los datos recibidos al estado\r\n state.menu = action.payload.menu;\r\n state.procedure = action.payload.procedure;\r\n state.procedures = action.payload.procedures;\r\n state.config = action.payload.config;\r\n state.useragent = action.payload.useragent;\r\n state.username = action.payload.username;\r\n state.error = null;\r\n })\r\n // Cuando la petición falla\r\n .addCase(fetchClientContext.rejected, (state, action) => {\r\n state.status = 'failed';\r\n state.error = action.payload as string || 'Fallo al cargar el contexto del cliente';\r\n // Puedes optar por limpiar el resto del estado o mantener el último valor si el error no es crítico\r\n // Object.assign(state, initialState); // Si quieres limpiar todo en caso de error\r\n });\r\n },\r\n});\r\n\r\nexport const { clearClientContext } = clientContextSlice.actions; // Exporta la acción generada\r\nexport default clientContextSlice.reducer; // Exporta el reducer","// src/store/routerSlice.ts\r\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { RouterState } from '../types';\r\n\r\nconst initialState: RouterState = {\r\n currentPath: '/',\r\n previousPath: null,\r\n redirectPath: null, // <--- Inicializamos en null\r\n};\r\n\r\nconst routerSlice = createSlice({\r\n name: 'router',\r\n initialState,\r\n reducers: {\r\n setCurrentPath: (state, action: PayloadAction<string>) => {\r\n state.previousPath = state.currentPath;\r\n state.currentPath = action.payload;\r\n },\r\n setRedirectPath: (state, action: PayloadAction<string | null>) => { // <--- Nuevo reducer\r\n state.redirectPath = action.payload;\r\n },\r\n resetRouterState: (state) => {\r\n state.currentPath = '/';\r\n state.previousPath = null;\r\n state.redirectPath = null; // <--- Asegúrate de resetearlo también\r\n },\r\n },\r\n});\r\n\r\nexport const { setCurrentPath, setRedirectPath, resetRouterState } = routerSlice.actions; // <--- Exporta el nuevo action\r\nexport default routerSlice.reducer;","// src/store/menuUiSlice.ts\r\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { MenuUiState } from '../types';\r\n\r\nconst initialState: MenuUiState = {\r\n isDrawerOpen: false,\r\n subMenuOpenStates: {},\r\n};\r\n\r\nconst menuUiSlice = createSlice({\r\n name: 'menuUi',\r\n initialState,\r\n reducers: {\r\n setDrawerOpen: (state, action: PayloadAction<boolean>) => {\r\n state.isDrawerOpen = action.payload;\r\n },\r\n toggleDrawer: (state) => {\r\n state.isDrawerOpen = !state.isDrawerOpen;\r\n },\r\n setSubMenuOpen: (state, action: PayloadAction<{ menuName: string; isOpen: boolean }>) => {\r\n state.subMenuOpenStates[action.payload.menuName] = action.payload.isOpen;\r\n },\r\n toggleSubMenu: (state, action: PayloadAction<string>) => {\r\n state.subMenuOpenStates[action.payload] = !state.subMenuOpenStates[action.payload];\r\n },\r\n // --- NUEVO REDUCER: Establecer el estado de todos los submenús ---\r\n setAllSubMenusOpen: (state, action: PayloadAction<boolean>) => {\r\n // Itera sobre todas las claves existentes y las establece al valor dado\r\n for (const menuName in state.subMenuOpenStates) {\r\n if (Object.prototype.hasOwnProperty.call(state.subMenuOpenStates, menuName)) {\r\n state.subMenuOpenStates[menuName] = action.payload;\r\n }\r\n }\r\n // Importante: Si hay nuevos submenús que no están en subMenuOpenStates,\r\n // no se verán afectados por este bucle.\r\n // Una estrategia más robusta para casos donde el menú puede cambiar dinámicamente\r\n // sería obtener todos los nombres de menú recursivamente desde clientContext.menu\r\n // y actualizar sus estados. Por ahora, asumimos que los que ya están en el estado\r\n // son los que queremos controlar.\r\n },\r\n resetMenuUiState: (state) => {\r\n Object.assign(state, initialState);\r\n },\r\n },\r\n});\r\n\r\nexport const {\r\n setDrawerOpen,\r\n toggleDrawer,\r\n setSubMenuOpen,\r\n toggleSubMenu,\r\n setAllSubMenusOpen, // ¡Exportamos la nueva acción!\r\n resetMenuUiState,\r\n} = menuUiSlice.actions;\r\n\r\nexport default menuUiSlice.reducer;","import Dialog from \"@mui/material/Dialog\";\nimport { ConfirmDialogProps } from \"../types\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogContentText from \"@mui/material/DialogContentText\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport Button from \"@mui/material/Button\";\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({ open, onClose, title, message }) => {\n return (\n <Dialog\n open={open}\n onClose={() => onClose(false)}\n aria-labelledby=\"confirm-dialog-title\"\n aria-describedby=\"confirm-dialog-description\"\n >\n <DialogTitle id=\"confirm-dialog-title\">{title}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"confirm-dialog-description\">\n {message}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => onClose(false)} color=\"primary\">\n Cancelar\n </Button>\n <Button onClick={() => onClose(true)} color=\"error\" autoFocus>\n Confirmar\n </Button>\n </DialogActions>\n </Dialog>\n );\n};","import {\n Popover,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Paper,\n CircularProgress,\n Box\n} from '@mui/material';\nimport { useState } from 'react';\nimport { DataGridOption } from '../../types';\n\ninterface DataGridOptionsDialogProps {\n open: boolean;\n onClose: () => void;\n options: DataGridOption[];\n anchorEl: HTMLElement | null;\n}\n\nexport const DataGridOptionsDialog: React.FC<DataGridOptionsDialogProps> = ({ \n open, \n onClose, \n options,\n anchorEl\n}) => {\n const [isExecuting, setIsExecuting] = useState(false);\n\n const handleOptionClick = async (handler: () => Promise<void>) => {\n try {\n setIsExecuting(true);\n await handler();\n } catch (error) {\n console.error('Error ejecutando handler:', error);\n } finally {\n setIsExecuting(false);\n onClose();\n }\n };\n\n return (\n <>\n {open && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\n zIndex: 1200,\n pointerEvents: 'none'\n }}\n />\n )}\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={onClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n slotProps={{\n paper: {\n sx: {\n zIndex: 1300,\n }\n }\n }}\n >\n <Paper sx={{ minWidth: 150, maxWidth: 350 }}>\n {isExecuting && (\n <Box \n sx={{ \n display: 'flex', \n justifyContent: 'center', \n alignItems: 'center',\n p: 5\n }}\n >\n <CircularProgress size={40} />\n </Box>\n )}\n {!isExecuting && (\n <List sx={{ \n py: 0,\n '& .MuiListItemButton-root': { \n py: 0.5, \n px: 1.5,\n minHeight: 36\n },\n '& .MuiListItemIcon-root': { \n minWidth: 32 \n },\n '& .MuiListItemText-primary': { \n fontSize: '0.85rem' \n },\n '& .MuiSvgIcon-root': {\n fontSize: 18\n }\n }}>\n {options\n .filter(option => option.visible !== false)\n .map((option) => (\n <ListItemButton \n key={option.id}\n onClick={() => handleOptionClick(option.handler)}\n >\n <ListItemIcon>\n {option.icon}\n </ListItemIcon>\n <ListItemText primary={option.label} />\n </ListItemButton>\n ))\n }\n </List>\n )}\n </Paper>\n </Popover>\n </>\n );\n};","import {Box, IconButton, Tooltip, Typography} from \"@mui/material\";\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport SearchOffIcon from '@mui/icons-material/SearchOff';\r\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\r\nimport { RenderHeaderCellProps } from \"react-data-grid\";\r\nimport { DetailTable } from \"backend-plus\";\r\nimport { FieldDefinition } from \"../../../types\";\r\n\r\nexport const defaultColumnHeaderCellRenderer = (props: RenderHeaderCellProps<any, unknown>, fieldDef:FieldDefinition) => {\r\n const { column } = props;\r\n const isPrimaryKey = fieldDef.isPk;\r\n return (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'flex-start',\r\n padding: '4px',\r\n boxSizing: 'border-box',\r\n height: '100%',\r\n }}\r\n >\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n fontWeight: 'bold',\r\n textDecoration: isPrimaryKey ? 'underline' : 'none',\r\n fontSize: 'o.930rem', // Puedes ajustar el tamaño si es necesario\r\n }}\r\n >\r\n {column.name}\r\n </Typography>\r\n </Box>\r\n );\r\n}\r\n\r\nexport const actionsColumnHeaderCellRenderer = (\r\n props: RenderHeaderCellProps<any, unknown>, \r\n isFilterRowVisible:boolean, \r\n toggleFilterVisibility: () => void, \r\n handleDataGridOptions: (event: React.MouseEvent<HTMLElement>) => void\r\n) => {\r\n return (\r\n <Box sx={{ display: 'flex', flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 0.2}}> \r\n <IconButton\r\n color=\"inherit\"\r\n onClick={toggleFilterVisibility}\r\n size=\"small\"\r\n title={isFilterRowVisible ? 'Ocultar filtros' : 'Mostrar filtros'}\r\n sx={{ p: 0.25 }}\r\n >\r\n {isFilterRowVisible ? <SearchOffIcon sx={{ fontSize: 18 }} /> : <SearchIcon sx={{ fontSize: 18 }} />}\r\n </IconButton>\r\n <IconButton\r\n onClick={(event) => handleDataGridOptions(event)}\r\n size =\"small\"\r\n title = \"Opciones de esta tabla\"\r\n sx={{ p: 0.25 }}\r\n >\r\n <MoreVertIcon sx={{ fontSize: 20, variant: \"filled\", size: \"small\" }} />\r\n </IconButton>\r\n </Box>\r\n );\r\n};\r\n\r\nexport const detailColumnCellHeaderRenderer = (props: RenderHeaderCellProps<any, unknown>, detailTable:DetailTable) => \r\n <Tooltip title={detailTable.label}>\r\n <Typography variant=\"caption\" sx={{ fontSize: '0.75rem', fontWeight: 'bold' }}>\r\n {detailTable.abr.toUpperCase()}\r\n </Typography>\r\n </Tooltip>","import { InputBase } from \"@mui/material\";\r\nimport { FilterRendererProps } from \"../../types\";\r\n\r\nfunction FilterInputRenderer<R extends Record<string, any>, S>({\r\n column,\r\n filters,\r\n setFilters\r\n}: FilterRendererProps<R, S>) {\r\n return (\r\n <InputBase\r\n value={filters[column.key] || ''}\r\n onChange={(e) =>\r\n setFilters({\r\n ...filters,\r\n [column.key]: e.target.value\r\n })\r\n }\r\n sx={{\r\n width: '100%',\r\n height: 25,\r\n margin: '0',\r\n border: '1px solid #ccc',\r\n borderRadius: '4px',\r\n padding: '2px 4px',\r\n fontSize: '0.8rem',\r\n boxSizing: 'border-box',\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n );\r\n}\r\n\r\nexport default FilterInputRenderer;","import { RenderSummaryCellProps } from \"react-data-grid\";\r\nimport { FixedField } from \"../../../types\";\r\nimport FilterInputRenderer from \"../FilterInputRender\";\r\nimport { Box } from \"@mui/material\";\r\n\r\nexport const defaultColumnSummaryCellRenderer = (props: RenderSummaryCellProps<any, any>, fixedFields:FixedField[]|undefined, isFilterRowVisible:boolean, filters: Record<string, string>, setFilters: React.Dispatch<React.SetStateAction<Record<string, string>>>) => {\r\n const { column } = props\r\n // Si el campo es fijo, no debe aparecer en los filtros\r\n const fixedFieldEntry = fixedFields?.find(f => f.fieldName === column.key);\r\n // El filtro solo se muestra si NO es un campo fijo O si es un campo fijo que sí tiene 'until' o bien si el filtro está deshabilitado\r\n if (fixedFieldEntry && fixedFieldEntry.until === undefined || !isFilterRowVisible) return null; \r\n return <Box><FilterInputRenderer\r\n column={column}\r\n filters={filters}\r\n setFilters={setFilters}\r\n /></Box>\r\n}\r\n\r\nexport const actionsColumnSummaryCellRenderer = (props: RenderSummaryCellProps<any, unknown>) => null\r\n\r\nexport const detailColumnCellSummaryRenderer = (props: RenderSummaryCellProps<any, unknown>) => null","import { RenderCellProps } from 'react-data-grid';\r\nimport { Box, Button, IconButton, Tooltip, Typography, useTheme } from '@mui/material';\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\r\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\r\nimport ViewHeadlineIcon from '@mui/icons-material/ViewHeadline';\r\nimport DeleteIcon from '@mui/icons-material/Delete';\r\nimport AddIcon from '@mui/icons-material/Add';\r\nimport GenericDataGrid, { getPrimaryKeyValues, NEW_ROW_INDICATOR, DETAIL_ROW_INDICATOR } from '../GenericDataGrid';\r\nimport { CustomColumn, DefaultColumn, DetailColumn, ActionColumn } from '../GenericDataGrid';\r\nimport { FixedField } from '../../../types';\r\nimport { clientSides } from '../clientSides';\r\nimport FallbackClientSideRenderer from '../FallbackClientSideRenderer';\r\nimport { OverridableComponent } from '@mui/material/OverridableComponent';\r\nimport { SvgIconTypeMap } from '@mui/material/SvgIcon';\r\n\r\ntype ActionButtonDefinition = {\r\n action: 'insert' | 'delete' | 'vertical-edit'\r\n handler: (row?: any) => void\r\n title: string\r\n icon: OverridableComponent<SvgIconTypeMap<{}, \"svg\">> & { muiName: string }\r\n color: 'success' | 'error' | 'primary'\r\n}\r\nimport { getDetailTableAndFixedFieldsForDetailTableAbr } from '../../../utils/functions';\r\n\r\nexport const allColumnsCellRenderer = (props: RenderCellProps<any, unknown>) => {\r\n const theme = useTheme();\r\n const column = props.column as unknown as CustomColumn<any, unknown>;\r\n const { row, rowIdx } = props;\r\n\r\n // Lógica para la fila de detalle\r\n if (row[DETAIL_ROW_INDICATOR]) {\r\n const detailTableAbr = row[DETAIL_ROW_INDICATOR];\r\n const detailColumn = column as DetailColumn<any, unknown>;\r\n \r\n // Verifica que la columna actual sea la de detalle para esa fila\r\n if (column.customType === 'detail' && detailColumn.detailTable.abr === detailTableAbr) {\r\n const { detailTable, fixedFields } = getDetailTableAndFixedFieldsForDetailTableAbr(detailColumn.tableDefinition, detailTableAbr, row)\r\n return (\r\n <Box sx={{\r\n // Se eliminó el padding para que la sub-grilla se extienda por completo\r\n minHeight: '200px',\r\n width: '100%',\r\n height: '100%',\r\n //display: 'flex',\r\n //flexDirection: 'column',\r\n boxSizing: 'border-box'\r\n }}\r\n onMouseDown={(e) => e.stopPropagation()} \r\n onClick={(e) => e.stopPropagation()} \r\n onKeyDown={(e) => e.stopPropagation()}\r\n onDoubleClick={(e) => e.stopPropagation()}\r\n >\r\n <GenericDataGrid tableName={detailTable.table!} fixedFields={fixedFields} gridStyles={{height:322}}/>\r\n </Box>\r\n \r\n );\r\n }\r\n \r\n // Si la fila es de detalle, pero no es la columna correcta, devuelve null\r\n return undefined;\r\n }\r\n\r\n // Lógica para renderizar una celda normal\r\n switch (column.customType) {\r\n case 'default': {\r\n const defaultColumn = column as DefaultColumn<any, unknown>;\r\n // --- CAMBIO: Cambiamos cellFeedback a cellFeedbackMap ---\r\n const { fieldDef, tableDefinition, primaryKey, cellFeedbackMap, fixedFields, localCellChanges } = defaultColumn;\r\n // ---------------------------------------------------------\r\n const rowId = getPrimaryKeyValues(row, primaryKey);\r\n const cellKey = `${rowId}-${props.column.key}`; // Clave única para el mapa\r\n\r\n // Obtener el feedback específico para esta celda\r\n const currentCellFeedback = cellFeedbackMap.get ? cellFeedbackMap.get(cellKey) : cellFeedbackMap[cellKey];\r\n\r\n if (fieldDef?.clientSide) {\r\n const ClientSideComponent = clientSides[fieldDef.clientSide];\r\n if (ClientSideComponent) {\r\n return <ClientSideComponent {...props} fieldDefinition={fieldDef} tableDefinition={tableDefinition} primaryKey={primaryKey} />;\r\n }\r\n return <FallbackClientSideRenderer {...props} fieldDefinition={fieldDef} tableDefinition={tableDefinition} primaryKey={primaryKey} />;\r\n }\r\n\r\n let cellBackgroundColor = 'transparent';\r\n \r\n // --- LÓGICA DE COLOR DE FEEDBACK ADAPTADA ---\r\n if (currentCellFeedback) {\r\n cellBackgroundColor = currentCellFeedback.type === 'error' ? theme.palette.error.light : theme.palette.success.light;\r\n } else {\r\n // ------------------------------------------\r\n const isNewRowLocalCheck = row[NEW_ROW_INDICATOR];\r\n const isMandatory = tableDefinition.primaryKey.includes(props.column.key) || (tableDefinition.fields.find(f => f.name === props.column.key)?.nullable === false);\r\n const hasValue = row[props.column.key] !== null && row[props.column.key] !== undefined && String(row[props.column.key]).trim() !== '';\r\n const isFixedFieldCurrent = fixedFields?.some(f => f.fieldName === props.column.key);\r\n\r\n if (isFixedFieldCurrent) {\r\n cellBackgroundColor = theme.palette.action.selected;\r\n } else if ((isNewRowLocalCheck && isMandatory && !hasValue) || (localCellChanges.has(rowId) && localCellChanges.get(rowId)?.has(props.column.key))) {\r\n cellBackgroundColor = theme.palette.info.light;\r\n }\r\n }\r\n \r\n // TODO: Capturar valor fecha\r\n const value = row[props.column.key];\r\n return (\r\n <Tooltip title={currentCellFeedback?.message || ''}>\r\n <Box sx={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: cellBackgroundColor, transition: 'background-color 0.3s ease-in-out', display: 'flex', alignItems: 'center', paddingLeft: '8px', boxSizing: 'border-box' }}>\r\n <Typography variant=\"body2\" sx={{ fontSize: '0.875rem', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', width: '100%' }}>\r\n {value === null || value === undefined ? '' : String(value)}\r\n </Typography>\r\n </Box>\r\n </Tooltip>\r\n );\r\n }\r\n \r\n case 'detail': {\r\n const detailColumn = column as DetailColumn<any, unknown>;\r\n const { detailTable, primaryKey, tableData, setTableData, detailKey } = detailColumn;\r\n \r\n const isExpanded = tableData.some(r => \r\n r[DETAIL_ROW_INDICATOR] === detailTable.abr && \r\n getPrimaryKeyValues(r, primaryKey) === getPrimaryKeyValues({...row,[DETAIL_ROW_INDICATOR]: detailTable.abr}, primaryKey)\r\n );\r\n\r\n return (\r\n <Tooltip title={detailTable.label}>\r\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%' }}>\r\n <IconButton\r\n onClick={(event) => {\r\n let rows = [...tableData];\r\n const rowId = getPrimaryKeyValues({...row,[DETAIL_ROW_INDICATOR]: detailTable.abr}, primaryKey);\r\n \r\n if (isExpanded) {\r\n setTableData(rows.filter((r) => \r\n !(r[DETAIL_ROW_INDICATOR] === detailTable.abr && \r\n getPrimaryKeyValues(r, primaryKey) === rowId)\r\n ));\r\n } else {\r\n const parentRowIndex = rowIdx;\r\n rows.splice(parentRowIndex + 1, 0, {\r\n ...row,\r\n [DETAIL_ROW_INDICATOR]: detailTable.abr,\r\n });\r\n setTableData(rows);\r\n }\r\n event.stopPropagation();\r\n }}\r\n \r\n >\r\n {isExpanded ? <KeyboardArrowUpIcon sx={{ fontSize: 20 }} /> : <KeyboardArrowDownIcon sx={{ fontSize: 20 }} />}\r\n </IconButton>\r\n </Box>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n case 'action': {\r\n const actionColumn = column as ActionColumn<any, unknown>;\r\n const { tableDefinition, handleDeleteRow, handleAddRow } = actionColumn;\r\n \r\n const gridActionButtons: ActionButtonDefinition[] = [\r\n {\r\n action: 'insert',\r\n handler: handleAddRow,\r\n icon: AddIcon,\r\n title: 'Agregar registro',\r\n color: 'success',\r\n },\r\n {\r\n action: 'delete',\r\n handler: handleDeleteRow,\r\n icon: DeleteIcon,\r\n title: 'Eliminar registro',\r\n color: 'error',\r\n },\r\n {\r\n action: 'vertical-edit',\r\n handler: () => {}, // implementar funcion\r\n icon: ViewHeadlineIcon,\r\n title: 'Editar registro en forma de ficha',\r\n color: 'primary',\r\n }\r\n ];\r\n\r\n return (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%', gap: 0.5 }}>\r\n {gridActionButtons.map(actionDef => (\r\n tableDefinition.allow![actionDef.action] ? <Button \r\n key={actionDef.action}\r\n variant=\"outlined\" \r\n color={actionDef.color} \r\n size=\"small\" \r\n onClick={() => actionDef.handler(row)} \r\n title={actionDef.title} \r\n sx={{ width:22, minWidth: 22, height: 22, '& .MuiButton-startIcon': { m: 0 } }}\r\n >\r\n <actionDef.icon sx={{ fontSize: 18 }} />\r\n </Button> : null\r\n ))}\r\n </Box>\r\n );\r\n }\r\n\r\n default:\r\n return undefined;\r\n }\r\n};","import React from 'react';\r\nimport { Box, Typography } from '@mui/material';\r\nimport { ClientSideProps } from './clientSides';\r\n\r\nconst ExampleClientSideComponent: React.FC<ClientSideProps> = ({ row, column, fieldDefinition }) => {\r\n // Accede al valor de la celda:\r\n const value = row[column.key];\r\n\r\n // Accede a la definición del campo si necesitas propiedades específicas\r\n // const customProperty = fieldDefinition?.customProp;\r\n\r\n return (\r\n <Box sx={{\r\n padding: 0.5,\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: value === 'Special' ? 'lightblue' : 'transparent'\r\n }}>\r\n <Typography variant=\"body2\" sx={{ fontWeight: 'bold' }}>\r\n {value ? `CS: ${value}` : 'N/A'}\r\n </Typography>\r\n {/* Puedes añadir lógica o UI más compleja aquí */}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ExampleClientSideComponent;","import React from 'react';\r\nimport { Box, Typography, Tooltip } from '@mui/material';\r\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber';\r\nimport { ClientSideProps } from './clientSides'; // Asegúrate de importar la interfaz\r\n\r\nconst FallbackClientSideRenderer: React.FC<ClientSideProps> = ({ column, row, fieldDefinition }) => {\r\n const clientSideName = fieldDefinition?.clientSide || 'Desconocido';\r\n\r\n return (\r\n <Tooltip title={`Componente clientSide '${clientSideName}' no implementado. Mostrando valor por defecto.`}>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between', // Para espaciar el valor y el icono\r\n gap: 1, // Espacio entre elementos\r\n width: '100%',\r\n height: '100%',\r\n paddingLeft: '8px',\r\n backgroundColor: 'rgba(255, 193, 7, 0.1)', // Amarillo claro para advertencia\r\n border: '1px dashed rgba(255, 193, 7, 0.5)',\r\n boxSizing: 'border-box',\r\n overflow: 'hidden', // Evita que el contenido se desborde\r\n }}\r\n >\r\n <Typography variant=\"body2\" noWrap sx={{ flexGrow: 1 }}>\r\n {clientSideName + ' not found'}\r\n </Typography>\r\n <WarningAmberIcon\r\n sx={{\r\n fontSize: 18,\r\n color: 'warning.main',\r\n marginRight: '4px' // Pequeño margen a la derecha del icono\r\n }}\r\n />\r\n </Box>\r\n </Tooltip>\r\n );\r\n};\r\n\r\nexport default FallbackClientSideRenderer;","import React from 'react';\nimport { RenderCellProps } from 'react-data-grid';\nimport { FieldDefinition, TableDefinition } from '../../types';\n\nimport ExampleClientSideComponent from './ExampleClientSideComponent';\nimport FallbackClientSideRenderer from './FallbackClientSideRenderer';\n\nexport interface ClientSideProps extends RenderCellProps<any, any> {\n fieldDefinition: FieldDefinition;\n tableDefinition: TableDefinition;\n primaryKey: string[];\n}\n\nexport let clientSides: Record<string, React.FC<ClientSideProps>> = {\n 'ExampleClientSideComponent': ExampleClientSideComponent as React.FC<ClientSideProps>, // Aseguramos el tipo aquí también\n 'FallbackClientSideRenderer': FallbackClientSideRenderer as React.FC<ClientSideProps>, // Y aquí\n};\n\nexport const extendClientSides = (newRenderers: Record<string, React.FC<ClientSideProps>>) => {\n clientSides = { ...clientSides, ...newRenderers };\n console.log('clientSides extendidos:', clientSides);\n};","import { useCallback, useMemo, useState } from \"react\";\r\nimport { Column } from \"react-data-grid\";\r\nimport { useSnackbar } from \"../../contexts/SnackbarContext\";\r\nimport { useApiCall } from \"../../hooks/useApiCall\";\r\nimport InputBase from \"@mui/material/InputBase\";\r\n// Importamos CellFeedbackMap junto con InputRendererProps\r\nimport { InputRendererProps, CellFeedback, CellFeedbackMap } from \"../../types\"; \r\n// getCellKey y getPrimaryKeyValues deben provenir de tu archivo GenericDataGrid\r\nimport { getCellKey, getPrimaryKeyValues, NEW_ROW_INDICATOR } from \"./GenericDataGrid\"; \r\nimport { useTheme } from \"@mui/material\";\r\n\r\nfunction findChangedValues(oldRowData:any, newRowData:any, isNewRow: boolean) {\r\n let changes: string[] = [];\r\n for (const key in newRowData) {\r\n // Si la propiedad existe en ambos Y el valor es diferente, O es una nueva fila\r\n if (Object.prototype.hasOwnProperty.call(oldRowData, key) && oldRowData[key] !== newRowData[key] || isNewRow ) {\r\n changes.push(key);\r\n }\r\n }\r\n return changes;\r\n}\r\n\r\nfunction InputRenderer<R extends Record<string, any>, S>({\r\n column,\r\n row,\r\n rowIdx,\r\n tableDefinition,\r\n onRowChange,\r\n onClose,\r\n cellFeedbackMap, // Tipo: CellFeedbackMap\r\n setCellFeedbackMap, // Tipo: Dispatch<SetStateAction<CellFeedbackMap>>\r\n onKeyPress,\r\n setTableData,\r\n setLocalCellChanges,\r\n localCellChanges,\r\n primaryKey\r\n}: InputRendererProps<R, S>) {\r\n const tableName = tableDefinition.tableName!;\r\n const [editingValue, setEditingValue] = useState(row[column.key]);\r\n const theme = useTheme();\r\n const { showSuccess, showError } = useSnackbar();\r\n \r\n // Generamos la clave única usando la función importada\r\n const cellKey = getCellKey(row, column.key, primaryKey);\r\n \r\n // --- LÍNEA CORREGIDA ---\r\n // Asumimos que cellFeedbackMap es un Map<string, CellFeedback>\r\n const currentCellFeedback = cellFeedbackMap.get(cellKey);\r\n // ------------------------\r\n \r\n let cellBackgroundColor;\r\n if (currentCellFeedback) {\r\n cellBackgroundColor = currentCellFeedback.type === 'error' ? theme.palette.error.light : theme.palette.success.light;\r\n }\r\n \r\n const initialRowId = useMemo(() => getPrimaryKeyValues(row, primaryKey), [row, primaryKey]);\r\n const { callApi } = useApiCall();\r\n\r\n const handleCommit = useCallback(async (currentValue: any, closeEditor: boolean, focusNextCell: boolean) => {\r\n const processedNewValue = typeof currentValue === 'string'\r\n ? (currentValue.trim() === '' ? null : currentValue.trim())\r\n : currentValue;\r\n\r\n const potentialUpdatedRow = { ...row, [column.key]: processedNewValue } as R;\r\n\r\n const arePKValuesFilled = tableDefinition.primaryKey.every(key =>\r\n potentialUpdatedRow[key] !== undefined && potentialUpdatedRow[key] !== null && String(potentialUpdatedRow[key]).trim() !== ''\r\n );\r\n const isNewRow = !arePKValuesFilled || potentialUpdatedRow[NEW_ROW_INDICATOR];\r\n\r\n const isMandatoryField = tableDefinition.primaryKey.includes(column.key) || (tableDefinition.fields.find(f => f.name === column.key)?.nullable === false);\r\n const isMandatoryFieldEmpty = isNewRow && isMandatoryField && (processedNewValue === null || processedNewValue === undefined || String(processedNewValue).trim() === '');\r\n\r\n if (processedNewValue === row[column.key] && !isNewRow && !isMandatoryFieldEmpty) {\r\n console.log(\"No se guardó: el valor no cambió (y no es una nueva fila o campo obligatorio vacío que se está iniciando).\");\r\n return;\r\n }\r\n\r\n const oldRowData = { ...row };\r\n const primaryKeyValuesForBackend = tableDefinition.primaryKey.map(key => potentialUpdatedRow[key]);\r\n const currentRowIdBeforeUpdate = getPrimaryKeyValues(oldRowData, tableDefinition.primaryKey); \r\n\r\n onRowChange({ ...row, [column.key]: processedNewValue } as R, true);\r\n \r\n if (isNewRow) {\r\n const areAllMandatoryFieldsFilled = tableDefinition.fields.every(fieldDef => {\r\n const isMandatory = (fieldDef.nullable === false || fieldDef.isPk);\r\n const fieldValue = potentialUpdatedRow[fieldDef.name];\r\n return !isMandatory || (fieldValue !== null && fieldValue !== undefined && String(fieldValue).trim() !== '');\r\n });\r\n\r\n if (!areAllMandatoryFieldsFilled) {\r\n console.log(\"Nueva fila: Faltan campos obligatorios. No se guarda en el backend todavía.\");\r\n setLocalCellChanges(prev => {\r\n const newMap = new Map(prev);\r\n const currentColumnsInRow = newMap.get(initialRowId) || new Set();\r\n\r\n tableDefinition.fields.forEach(fieldDef => {\r\n const isMandatory = (fieldDef.nullable === false || fieldDef.isPk);\r\n const isEditable = fieldDef.editable !== false;\r\n const fieldValue = potentialUpdatedRow[fieldDef.name];\r\n if (isMandatory && isEditable && (fieldValue === null || fieldValue === undefined || String(fieldValue).trim() === '')) {\r\n currentColumnsInRow.add(fieldDef.name);\r\n } else {\r\n currentColumnsInRow.delete(fieldDef.name);\r\n }\r\n });\r\n newMap.set(initialRowId, currentColumnsInRow);\r\n return newMap;\r\n });\r\n return;\r\n } else {\r\n console.log(\"Nueva fila: Todos los campos obligatorios están llenos. Procediendo a guardar.\");\r\n setLocalCellChanges(prev => {\r\n const newMap = new Map(prev);\r\n newMap.delete(initialRowId);\r\n return newMap;\r\n });\r\n }\r\n }\r\n \r\n const status = isNewRow ? 'new' : 'update';\r\n let rowToSend: Record<string, any> = {};\r\n if (isNewRow) {\r\n tableDefinition.fields.forEach(fieldDef => {\r\n const fieldValue = potentialUpdatedRow[fieldDef.name];\r\n if (fieldValue !== undefined && fieldValue !== null && String(fieldValue).trim() !== '') {\r\n rowToSend[fieldDef.name] = fieldValue;\r\n } else if (tableDefinition.primaryKey.includes(fieldDef.name) && (fieldValue === null || fieldValue === undefined || String(fieldValue).trim() === '')) {\r\n rowToSend[fieldDef.name] = fieldValue;\r\n }\r\n });\r\n if (localCellChanges.has(initialRowId)) {\r\n localCellChanges.get(initialRowId)?.forEach((colKey: string) => {\r\n if (!rowToSend.hasOwnProperty(colKey)) {\r\n rowToSend[colKey] = potentialUpdatedRow[colKey];\r\n }\r\n });\r\n }\r\n delete rowToSend[NEW_ROW_INDICATOR];\r\n } else {\r\n rowToSend[column.key] = processedNewValue;\r\n tableDefinition.primaryKey.forEach(pkField => {\r\n rowToSend[pkField] = potentialUpdatedRow[pkField];\r\n });\r\n }\r\n \r\n try {\r\n const response = await callApi('table_record_save',{\r\n table:tableName,\r\n primaryKeyValues: primaryKeyValuesForBackend,\r\n newRow: rowToSend,\r\n oldRow: oldRowData,\r\n status\r\n });\r\n\r\n let finalRowIdForFeedback: string;\r\n let persistedRowData: R;\r\n\r\n if (response.row && isNewRow) {\r\n persistedRowData = { ...response.row };\r\n setTableData(prevData => {\r\n const newData = [...prevData];\r\n const originalRowId = getPrimaryKeyValues(oldRowData, tableDefinition.primaryKey);\r\n const rowIndex = newData.findIndex(r => getPrimaryKeyValues(r, tableDefinition.primaryKey) === originalRowId);\r\n if (rowIndex !== -1) {\r\n newData[rowIndex] = persistedRowData;\r\n } else {\r\n const newPrimaryKeyId = getPrimaryKeyValues(persistedRowData, tableDefinition.primaryKey);\r\n const newRowIndex = newData.findIndex(r => getPrimaryKeyValues(r, tableDefinition.primaryKey) === newPrimaryKeyId);\r\n if (newRowIndex !== -1) {\r\n newData[newRowIndex] = persistedRowData;\r\n }\r\n }\r\n return newData;\r\n });\r\n finalRowIdForFeedback = getPrimaryKeyValues(persistedRowData, tableDefinition.primaryKey);\r\n } else {\r\n persistedRowData = response.row;\r\n const isPrimaryKeyColumn = tableDefinition.primaryKey.includes(column.key);\r\n finalRowIdForFeedback = isPrimaryKeyColumn\r\n ? getPrimaryKeyValues(potentialUpdatedRow, tableDefinition.primaryKey)\r\n : currentRowIdBeforeUpdate;\r\n onRowChange({ ...response.row } as R, true);\r\n }\r\n\r\n // --- MULTI-FEEDBACK DE ÉXITO ---\r\n const changes = findChangedValues(oldRowData, response.row, isNewRow);\r\n setCellFeedbackMap(prevFeedback => {\r\n // Siempre usamos new Map(prevFeedback) para garantizar inmutabilidad\r\n const newFeedback = new Map(prevFeedback);\r\n \r\n changes.forEach((key) => {\r\n // Creamos la clave única de forma más robusta (idealmente usando getCellKey)\r\n const keyForMap = `${finalRowIdForFeedback}-${key}`; \r\n newFeedback.set(keyForMap, { rowId: finalRowIdForFeedback, columnKey: key, type: 'success' } as CellFeedback);\r\n });\r\n\r\n return newFeedback;\r\n });\r\n // -------------------------------\r\n\r\n } catch (err: any) {\r\n console.error('Error al guardar el registro:', err);\r\n \r\n // --- MULTI-FEEDBACK DE ERROR ---\r\n const keyForMap = `${currentRowIdBeforeUpdate}-${column.key}`;\r\n setCellFeedbackMap(prevFeedback => {\r\n // Siempre usamos new Map(prevFeedback) para garantizar inmutabilidad\r\n const newFeedback = new Map(prevFeedback); \r\n newFeedback.set(keyForMap, { \r\n rowId: currentRowIdBeforeUpdate, \r\n columnKey: column.key, \r\n type: 'error', \r\n message: err.message \r\n } as CellFeedback);\r\n return newFeedback;\r\n });\r\n // -------------------------------\r\n }\r\n }, [\r\n column, row, onRowChange, tableName, tableDefinition.primaryKey,\r\n tableDefinition.fields, showSuccess, showError, setCellFeedbackMap, onClose, \r\n setTableData, setLocalCellChanges, localCellChanges, initialRowId\r\n ]);\r\n\r\n const handleKeyDown = useCallback(async(event: React.KeyboardEvent) => {\r\n if (['Enter', 'Tab', 'ArrowDown', 'ArrowUp','ArrowRight', 'ArrowLeft', 'F4'].includes(event.key)) {\r\n await handleCommit(editingValue, true, true);\r\n if (onKeyPress) {\r\n onKeyPress(rowIdx, column.key, event, handleCommit);\r\n }\r\n }\r\n }, [handleCommit, editingValue, column.key, rowIdx, onKeyPress]);\r\n\r\n const handleBlur = useCallback(() => {\r\n handleCommit(editingValue, true, false);\r\n }, [handleCommit, editingValue]);\r\n\r\n const fieldDefinition = tableDefinition.fields.find(f => f.name === column.key);\r\n const isFieldEditable = fieldDefinition?.editable !== false;\r\n\r\n return (\r\n <InputBase\r\n value={editingValue === null ? '' : editingValue}\r\n onChange={(e) => setEditingValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n onBlur={handleBlur}\r\n placeholder={''}\r\n sx={{\r\n width: '100%',\r\n margin: '0',\r\n border: '1px solid #ccc',\r\n borderRadius: '4px',\r\n padding: '2px 4px',\r\n fontSize: '0.8rem',\r\n boxSizing: 'border-box',\r\n backgroundColor: cellBackgroundColor,\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n autoFocus\r\n disabled={!isFieldEditable}\r\n />\r\n );\r\n}\r\n\r\nexport default InputRenderer;","import { Column, RenderEditCellProps } from \"react-data-grid\";\r\nimport { CellFeedback, FieldDefinition, FixedField, TableDefinition } from \"../../../types\";\r\nimport InputRenderer from \"../InputRenderer\";\r\nimport { CustomColumn, DefaultColumn, getPrimaryKeyValues } from \"../GenericDataGrid\";\r\nimport { Box, Tooltip } from \"@mui/material\";\r\n\r\nexport const allColumnsEditCellRenderer = (\r\n props: RenderEditCellProps<any, any>, \r\n allColumns:Column<any>[]\r\n) => {\r\n const column = props.column as unknown as CustomColumn<any, unknown>;\r\n switch (column.customType) {\r\n case 'default': {\r\n const defaultColumn = column as DefaultColumn<any, unknown>;\r\n const {\r\n tableDefinition, \r\n fixedFields, \r\n primaryKey, \r\n setTableData, \r\n cellFeedbackMap, // <--- CAMBIADO\r\n setCellFeedbackMap, // <--- CAMBIADO\r\n handleKeyPressInEditor,\r\n localCellChanges,\r\n setLocalCellChanges\r\n } = defaultColumn\r\n \r\n if (column.editable) { \r\n const fieldDefinition = tableDefinition.fields.find(f => f.name === column.key);\r\n \r\n // Busca si el campo es fijo en el array fixedFields\r\n const isFixedField = fixedFields?.some(f => f.fieldName === column.key);\r\n const isFieldEditableByUI = fieldDefinition?.editable !== false && !isFixedField; // No editable si es fijo\r\n \r\n if (!isFieldEditableByUI) {\r\n // Si el campo no es editable por UI (ej. por ser fijo), no renderizamos el editor\r\n return undefined\r\n }\r\n \r\n const rowId = getPrimaryKeyValues(props.row, primaryKey);\r\n const cellKey = `${rowId}-${props.column.key}`; // Clave única\r\n \r\n // Obtener el feedback específico para esta celda\r\n const currentCellFeedback = cellFeedbackMap.get ? cellFeedbackMap.get(cellKey) : cellFeedbackMap[cellKey];\r\n\r\n return (\r\n // --- TOOLTIP ADAPTADO: Lee el mensaje de error desde el Mapa ---\r\n <Tooltip title={currentCellFeedback?.message || ''}>\r\n <Box>\r\n <InputRenderer\r\n {...props}\r\n tableDefinition={tableDefinition}\r\n setCellFeedbackMap={setCellFeedbackMap} // <--- PASAMOS setCellFeedbackMap como setCellFeedback a InputRenderer\r\n cellFeedbackMap={cellFeedbackMap} // <--- PASAMOS cellFeedbackMap\r\n onKeyPress={(rowIndex, columnKey, event, handleCommit) => handleKeyPressInEditor(rowIndex, columnKey, event, allColumns, handleCommit)}\r\n setTableData={setTableData}\r\n setLocalCellChanges={setLocalCellChanges}\r\n localCellChanges={localCellChanges}\r\n primaryKey={primaryKey}\r\n />\r\n </Box>\r\n </Tooltip> \r\n )\r\n }\r\n return undefined\r\n }\r\n case 'detail': {\r\n return undefined\r\n }\r\n case 'action': {\r\n return undefined\r\n }\r\n default:\r\n return undefined;\r\n }\r\n\r\n}","export function EmptyRowsRenderer() {\r\n return (\r\n <div style={{\r\n // Posicionamiento absoluto respecto a la pantalla\r\n position: 'fixed',\r\n top: '50%', // Centrado verticalmente\r\n left: '50%', // Centrado horizontalmente\r\n transform: 'translate(-50%, -50%)', // Ajuste para el 50% del tamaño del div\r\n \r\n // Estilos de visualización\r\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\r\n border: '1px solid #ccc',\r\n borderRadius: '4px',\r\n padding: '16px 24px',\r\n \r\n boxShadow: '0 2px 10px rgba(0,0,0,0.1)'\r\n }}>\r\n <div style={{ textAlign: 'center' }}>\r\n No hay filas para mostrar\r\n </div>\r\n </div>\r\n );\r\n}","// src/components/grid/menu/options.tsx\nimport React from 'react';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport ViewColumnIcon from '@mui/icons-material/ViewColumn';\nimport VisibilityOffIcon from '@mui/icons-material/VisibilityOff';\nimport FileDownloadIcon from '@mui/icons-material/FileDownload';\nimport FileUploadIcon from '@mui/icons-material/FileUpload';\nimport DeleteSweepIcon from '@mui/icons-material/DeleteSweep';\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\nimport { DataGridOption, TableDefinition, FixedField } from '../../../types';\n\n/**\n * Parámetros para construir las opciones del menú\n */\nexport interface BuildMenuOptionsParams {\n tableDefinition: TableDefinition | null;\n tableName: string;\n fixedFields?: FixedField[];\n setTableData: React.Dispatch<React.SetStateAction<any[]>>;\n callApi: (service: string, params: any) => Promise<any>;\n showSuccess: (message: string) => void;\n showError: (message: string) => void;\n showWarning: (message: string) => void;\n}\n\n/**\n * Construye el array de opciones del menú de la grilla\n * Las opciones se muestran condicionalmente según los permisos de la tabla\n */\nexport const buildMenuOptions = (params: BuildMenuOptionsParams): DataGridOption[] => {\n const { \n tableDefinition, \n tableName, \n fixedFields, \n setTableData, \n callApi, \n showSuccess, \n showError,\n showWarning\n } = params;\n\n if (!tableDefinition) return [];\n\n const options: DataGridOption[] = [];\n\n // Opción: Refrescar (siempre visible)\n options.push({\n id: 'refresh',\n label: 'refrescar la grilla desde la base de datos',\n icon: <RefreshIcon />,\n handler: async () => {\n try {\n const data = await callApi('table_data', {\n table: tableName,\n fixedFields: fixedFields\n });\n setTableData(data);\n showSuccess('Grilla refrescada correctamente');\n } catch (err: any) {\n showError(`Error al refrescar: ${err.message || 'Error desconocido'}`);\n }\n },\n visible: true\n });\n\n // Opción: Mostrar columnas relacionadas (siempre visible)\n options.push({\n id: 'showColumns',\n label: 'mostrar las columnas relacionadas',\n icon: <ViewColumnIcon />,\n handler: async () => {\n console.log('Mostrar columnas relacionadas');\n // TODO: Implementar lógica\n },\n visible: true\n });\n\n // Opción: Ocultar/mostrar columnas (siempre visible)\n options.push({\n id: 'hideColumns',\n label: 'ocultar o mostrar columnas',\n icon: <VisibilityOffIcon />,\n handler: async () => {\n console.log('Ocultar/mostrar columnas');\n // TODO: Implementar lógica\n },\n visible: true\n });\n\n // Opción: Exportar (solo si está permitido)\n if (tableDefinition.allow?.export) {\n options.push({\n id: 'export',\n label: 'exportar',\n icon: <FileDownloadIcon />,\n handler: async () => {\n console.log('Exportar datos');\n // TODO: Implementar lógica de exportación\n },\n visible: true\n });\n }\n\n // Opción: Importar (solo si está permitido)\n if (tableDefinition.allow?.import) {\n options.push({\n id: 'import',\n label: 'importar',\n icon: <FileUploadIcon />,\n handler: async () => {\n console.log('Importar datos');\n // TODO: Implementar lógica de importación\n },\n visible: true\n });\n }\n\n // Opción: Borrar todos los registros (solo si está permitido delete)\n if (tableDefinition.allow?.delete) {\n options.push({\n id: 'deleteAll',\n label: 'borrar todos los registros',\n icon: <DeleteSweepIcon />,\n handler: async () => {\n showWarning('Esta operación eliminará TODOS los registros de la tabla');\n // TODO: Implementar confirmación y lógica\n },\n visible: true\n });\n }\n\n // Opción: Tabla completa y filtrada\n options.push({\n id: 'completeTable',\n label: 'tabla completa y filtrada',\n icon: <FilterAltIcon />,\n handler: async () => {\n console.log('Toggle tabla completa/filtrada');\n // TODO: Implementar lógica\n },\n visible: true\n });\n\n return options;\n};\n","// frontend-plus-react/src/App.tsx (modificado en tu librería)\n\nimport React, { useEffect } from 'react';\nimport './App.css';\nimport { BrowserRouter, Routes, Route, useLocation, Navigate } from 'react-router-dom';\nimport MainLayout from './components/MainLayout';\nimport SessionExpiredMessage from './components/SessionExpiredMessage';\nimport { AppProvider } from './contexts/AppContext';\nimport HomePage from './pages/HomePage';\nimport LogoutPage from './pages/LogoutPage';\nimport LoginPage from './pages/LoginPage';\nimport ProcedureForm from './components/ProcedureForm';\n\nimport { Provider } from 'react-redux';\nimport { PersistGate } from 'redux-persist/integration/react';\nimport { store, persistor } from './store';\n\nimport PrivateRoute from './components/PrivateRoute';\nimport InitialRedirectHandler from './components/InitialRedirectHandler';\nimport { useAppDispatch } from './store';\nimport { setCurrentPath } from './store/routerSlice';\n\nimport { SnackbarProvider } from './contexts/SnackbarContext';\nimport GenericDataGridPage from './pages/GenericDataGridPage';\nimport MenuTablePage from './pages/MenuTablePage';\n\nimport { WScreenProps, wScreens, FallbackWScreen, extendWScreens} from './pages/WScreens';\n\n\nimport { extendClientSides, ClientSideProps} from './components/grid/clientSides'; \nimport { extendResultsOk, ResultOkProps} from './pages/procedure-results/resultsOk'; // Ajusta la ruta\nimport { Box } from '@mui/material';\n\nconst LocationTracker: React.FC = () => {\n const location = useLocation();\n const dispatch = useAppDispatch();\n useEffect(() => {\n dispatch(setCurrentPath(location.pathname + location.search));\n }, [location, dispatch]);\n return null;\n};\n\ninterface RoutesProps {\n myRoutes?: React.ReactNode;\n layout?: React.ComponentType;\n}\n\nexport function FrontendPlusReactRoutes({ myRoutes, layout: Layout = MainLayout }: RoutesProps) {\n return (\n <Routes>\n <Route path=\"/login\" element={<LoginPage />} />\n <Route path=\"/logout\" element={<LogoutPage />} />\n\n <Route element={\n <PrivateRoute>\n <InitialRedirectHandler />\n <Layout/>\n </PrivateRoute>\n }>\n <Route path=\"/\" element={<HomePage />} />\n <Route path=\"/home\" element={<HomePage />} />\n <Route path=\"/table/:tableName\" element={<GenericDataGridPage />} />\n <Route path=\"/menu/:menuName\" element={<MenuTablePage />} />\n <Route path=\"/procedures/:procedureName\" element={<ProcedureForm />} />\n {Object.keys(wScreens).map((screenName) => (\n <Route\n key={screenName}\n path={`/wScreens/${screenName}`}\n element={React.createElement(\n Box,\n { \n sx: { pt: 3, pl: 4 },\n },\n React.createElement(wScreens[screenName], { screenName } as WScreenProps)\n )}\n />\n ))}\n <Route\n path=\"/wScreens-fallback/:screenName\"\n element={<Box sx={{ p: 3 }}><FallbackWScreen screenName=\":screenName\" /></Box>}\n />\n <Route path=\"*\" element={<div style={{ marginTop: '20px', marginLeft: \"10px\" }}>404 - Recurso No Encontrado</div>} />\n </Route>\n {myRoutes}\n\n \n <Route path=\"*\" element={<Navigate to=\"/\" replace />} />\n </Routes>\n );\n}\n\nexport type WScreenMap = Record<string, React.FC<WScreenProps>>;\nexport type ClientSidesMap = Record<string, React.FC<ClientSideProps>>;\nexport type ResultsOksMap = Record<string, React.FC<ResultOkProps>>;\n\nexport interface AppProps {\n myRoutes?: React.ReactNode;\n myWScreens?: WScreenMap;\n myClientSides?: ClientSidesMap;\n myResultsOk?: ResultsOksMap;\n}\n\nexport const FrontendPlusProviders: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return (\n <Provider store={store}>\n <PersistGate loading={null} persistor={persistor}>\n <BrowserRouter>\n <LocationTracker /> {/* El tracker necesita estar dentro del Router */}\n <AppProvider>\n <SnackbarProvider>\n {children}\n <SessionExpiredMessage />\n </SnackbarProvider>\n </AppProvider>\n </BrowserRouter>\n </PersistGate>\n </Provider>\n );\n};\n\nconst App = ({\n myRoutes,\n myWScreens,\n myClientSides,\n myResultsOk\n}: AppProps) => {\n useEffect(() => {\n if (myClientSides) {\n extendClientSides(myClientSides);\n }\n if (myResultsOk) {\n extendResultsOk(myResultsOk);\n }\n if (myWScreens) {\n extendWScreens(myWScreens);\n }\n }, [myClientSides, myResultsOk, myWScreens]);\n return (\n <FrontendPlusProviders>\n <FrontendPlusReactRoutes myRoutes={myRoutes} />\n </FrontendPlusProviders>\n );\n}\n\nexport default App;","// src/components/MainLayout.tsx\r\nimport React, { useEffect } from 'react';\r\nimport { Outlet } from 'react-router-dom'; // ¡IMPORTA Outlet AQUÍ!\r\nimport {\r\n Box, AppBar, Toolbar, Typography, Button, Drawer, CssBaseline,\r\n IconButton, useTheme, useMediaQuery\r\n} from '@mui/material';\r\nimport { useApp } from '../contexts/AppContext';\r\nimport { useNavigate } from 'react-router-dom'; // No estoy seguro si 'useNavigate' es necesario aquí si solo se usa en SideMenu o para Logout\r\nimport LogoutIcon from '@mui/icons-material/Logout';\r\nimport MenuIcon from '@mui/icons-material/Menu';\r\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\r\nimport SideMenu from './SideMenu';\r\nimport useLogout from '../hooks/useLogout';\r\n\r\n// Importamos los hooks de Redux y las acciones del nuevo slice\r\nimport { useAppDispatch, useIsDrawerOpen } from '../store';\r\nimport { setDrawerOpen, toggleDrawer } from '../store/menuUiSlice';\r\n\r\n\r\nconst drawerWidth = 240;\r\n\r\n// const MainLayout: React.FC<MainLayoutProps> = ({ children }) => { // Quitamos { children }\r\nconst MainLayout: React.FC = () => { // MainLayout ya no recibe 'children' como prop\r\n const { clientContext } = useApp();\r\n const logout = useLogout();\r\n\r\n const isDrawerOpen = useIsDrawerOpen();\r\n const dispatch = useAppDispatch();\r\n\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n useEffect(() => {\r\n if (isMobile && isDrawerOpen) {\r\n dispatch(setDrawerOpen(false));\r\n }\r\n }, [isMobile, isDrawerOpen, dispatch]);\r\n\r\n const handleToggleDrawer = () => {\r\n dispatch(toggleDrawer());\r\n };\r\n\r\n const handleDrawerCloseMobile = () => {\r\n if (isMobile && isDrawerOpen) {\r\n dispatch(setDrawerOpen(false));\r\n }\r\n };\r\n\r\n // Si clientContext no existe (por ejemplo, al cargar o si la sesión falla),\r\n // muestra un mensaje de carga.\r\n // Esto es importante para evitar errores si los datos no están disponibles.\r\n if (!clientContext) {\r\n return (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100vh' }}>\r\n <Typography>Cargando diseño de la aplicación...</Typography>\r\n </Box>\r\n );\r\n }\r\n\r\n const appBarOffset = theme.mixins.toolbar;\r\n\r\n return (\r\n <Box sx={{ display: 'flex', height: '100vh' }}>\r\n <CssBaseline />\r\n <AppBar\r\n position=\"fixed\"\r\n sx={{\r\n zIndex: (theme) => theme.zIndex.drawer + 1,\r\n transition: (theme) => theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n ...(isDrawerOpen && {\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n marginLeft: `${drawerWidth}px`,\r\n transition: (theme) => theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n }),\r\n }}\r\n >\r\n <Toolbar>\r\n <IconButton\r\n color=\"inherit\"\r\n aria-label=\"open drawer\"\r\n onClick={handleToggleDrawer}\r\n edge=\"start\"\r\n sx={{\r\n marginRight: 2.2,\r\n }}\r\n >\r\n {isDrawerOpen ? <ChevronLeftIcon /> : <MenuIcon />}\r\n </IconButton>\r\n <Typography variant=\"h6\" noWrap component=\"div\" sx={{ flexGrow: 1 }}>\r\n {isDrawerOpen ? '' : clientContext.config.title}\r\n </Typography>\r\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ mr: 2 }}>\r\n {clientContext.username}\r\n </Typography>\r\n <Button\r\n color=\"inherit\"\r\n onClick={logout}\r\n startIcon={<LogoutIcon />}\r\n >\r\n Salir\r\n </Button>\r\n </Toolbar>\r\n </AppBar>\r\n <Drawer\r\n variant=\"persistent\"\r\n anchor=\"left\"\r\n open={isDrawerOpen}\r\n sx={{\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n '& .MuiDrawer-paper': {\r\n width: drawerWidth,\r\n boxSizing: 'border-box',\r\n overflowX: 'hidden',\r\n overflowY: 'auto',\r\n },\r\n }}\r\n >\r\n <Toolbar\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n px: 1,\r\n fontSize: '1.3rem',\r\n minHeight: theme.mixins.toolbar.minHeight,\r\n }}\r\n >\r\n {isDrawerOpen ? clientContext.config.title : ''}\r\n </Toolbar>\r\n {/* Pasamos la función para cerrar el drawer al SideMenu */}\r\n <SideMenu onMenuItemClick={handleDrawerCloseMobile} />\r\n </Drawer>\r\n <Box\r\n component=\"main\"\r\n sx={{\r\n flexGrow: 1,\r\n transition: (theme) => theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n marginLeft: `-${drawerWidth}px`,\r\n ...(isDrawerOpen && {\r\n transition: (theme) => theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n marginLeft: 0,\r\n }),\r\n minWidth: 0,\r\n flexShrink: 0,\r\n // Asegúrate de que el paddingTop sea suficiente para la AppBar\r\n paddingTop: `${appBarOffset.minHeight}px`,\r\n height: '100%',\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: isDrawerOpen ? `calc(100% - ${drawerWidth}px)` : '100%',\r\n }}\r\n >\r\n {/* ¡AQUÍ ES DONDE DEBE IR EL CONTENIDO DE LA RUTA ANIDADA! */}\r\n {/* Elimina {children} y reemplázalo por <Outlet /> */}\r\n <Outlet />\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default MainLayout;","// src/contexts/AppContext.tsx\r\nimport React, { createContext, useContext, useState, useEffect, ReactNode, useCallback, useMemo } from 'react';\r\nimport { fetchApi } from '../utils/fetchApi';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// Importa los hooks de Redux y las acciones de tu slice\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { RootState, AppDispatch } from '../store'; // Asegúrate de que la ruta sea correcta\r\nimport { fetchClientContext, clearClientContext } from '../store/clientContextSlice'; // Importa el thunk y la acción\r\nimport { AppContextType, AppProviderProps } from '../types';\r\n\r\n// Crea el contexto con un valor por defecto que se sobrescribirá\r\nconst AuthContext = createContext<AppContextType | undefined>(undefined);\r\n\r\n// Hook personalizado para usar el contexto de autenticación\r\nexport const useApp = () => {\r\n const context = useContext(AuthContext);\r\n if (!context) {\r\n throw new Error('useApp must be used within an AppProvider');\r\n }\r\n // Si quieres que 'useApp' siga devolviendo 'clientContext', lo obtendrías aquí de Redux:\r\n const clientContext = useSelector((state: RootState) => state.clientContext);\r\n return { ...context, clientContext };\r\n};\r\n\r\nexport const AppProvider: React.FC<AppProviderProps> = ({ children }) => {\r\n console.log(\"AppProvider rendered/re-rendered\");\r\n\r\n const [isLoggedIn, setIsLoggedIn] = useState(false);\r\n const [showSessionExpiredMessage, setShowSessionExpiredMessage] = useState(false);\r\n\r\n // Obtener 'dispatch' para despachar acciones de Redux\r\n const dispatch = useDispatch<AppDispatch>();\r\n // Obtener 'clientContext' del store de Redux\r\n const clientContext = useSelector((state: RootState) => state.clientContext);\r\n\r\n const navigate = useNavigate();\r\n\r\n // Memoizamos checkSession. Ahora despachará acciones de Redux.\r\n const checkSession = useCallback(async () => {\r\n try {\r\n const response = await fetchApi('/keep-alive.json', { method: 'GET' });\r\n if (response.ok) {\r\n setIsLoggedIn(true);\r\n setShowSessionExpiredMessage(false);\r\n\r\n // Si clientContext no está cargado o si hubo un error previo,\r\n // despachamos el thunk para cargarlo.\r\n // Con redux-persist, si ya estaba en localStorage, 'clientContext.status' será 'succeeded'.\r\n if (clientContext.status === 'idle' || clientContext.status === 'failed') {\r\n console.log(\"Client context needs loading/reloading, dispatching fetchClientContext thunk...\");\r\n try {\r\n // .unwrap() para que el 'catch' capture los errores del thunk\r\n await dispatch(fetchClientContext()).unwrap();\r\n console.log(\"Client context data loaded successfully by Redux.\");\r\n } catch (loadError: any) {\r\n console.error(\"Error loading client context data during session check:\", loadError);\r\n // No es necesario lanzar el error, el estado de Redux ya lo manejará\r\n }\r\n }\r\n } else {\r\n // Si la sesión no es válida, limpiamos el estado de autenticación y el clientContext en Redux\r\n setIsLoggedIn(false);\r\n dispatch(clearClientContext()); // Disparar la acción para limpiar el clientContext en Redux\r\n\r\n if (!showSessionExpiredMessage && window.location.pathname !== '/login') {\r\n setShowSessionExpiredMessage(true);\r\n }\r\n }\r\n } catch (error: any) {\r\n console.error(\"Error checking session:\", error);\r\n setIsLoggedIn(false);\r\n dispatch(clearClientContext()); // Limpiar clientContext en Redux\r\n if (!showSessionExpiredMessage && window.location.pathname !== '/login') {\r\n setShowSessionExpiredMessage(true);\r\n }\r\n }\r\n }, [dispatch, clientContext.status, showSessionExpiredMessage]); // Dependencias: dispatch (estable), y el estado de carga del clientContext\r\n\r\n useEffect(() => {\r\n checkSession();\r\n\r\n const intervalId = setInterval(checkSession, 15 * 1000);\r\n\r\n return () => {\r\n clearInterval(intervalId);\r\n };\r\n }, [checkSession]); // Se ejecuta una vez al montar, y se re-ejecuta si checkSession cambia (no debería si useCallback está bien)\r\n\r\n // ¡La CLAVE! Memoizamos el objeto de contexto.\r\n // clientContext y setClientContext ya NO van aquí, se acceden directamente vía Redux.\r\n const authContextValue = useMemo(() => ({\r\n isLoggedIn,\r\n setIsLoggedIn,\r\n checkSession,\r\n showSessionExpiredMessage,\r\n setShowSessionExpiredMessage,\r\n }), [\r\n isLoggedIn,\r\n setIsLoggedIn,\r\n checkSession,\r\n showSessionExpiredMessage,\r\n setShowSessionExpiredMessage,\r\n ]);\r\n\r\n return (\r\n <AuthContext.Provider value={authContextValue}>\r\n {children}\r\n </AuthContext.Provider>\r\n );\r\n};","import React from 'react';\r\nimport { List, ListItem, ListItemButton, ListItemIcon, ListItemText, Divider, Box, Typography, Collapse } from '@mui/material';\r\nimport ExpandLess from '@mui/icons-material/ExpandLess';\r\nimport ExpandMore from '@mui/icons-material/ExpandMore';\r\nimport TableChartIcon from '@mui/icons-material/TableChart';\r\nimport FolderIcon from '@mui/icons-material/Folder';\r\nimport DnsIcon from '@mui/icons-material/Dns';\r\nimport HomeIcon from '@mui/icons-material/Home';\r\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber';\r\nimport DesktopWindowsIcon from '@mui/icons-material/DesktopWindows';\r\nimport UnfoldMoreIcon from '@mui/icons-material/UnfoldMore';\r\nimport UnfoldLessIcon from '@mui/icons-material/UnfoldLess';\r\n\r\nimport { useNavigate, useLocation } from 'react-router-dom';\r\nimport { useApp } from '../contexts/AppContext';\r\nimport { MenuInfoBase, MenuInfoTable, MenuInfoProc, MenuInfoMenu } from \"backend-plus\";\r\nimport { blue, orange, teal, red, grey } from '@mui/material/colors';\r\n\r\nimport { useSubMenuOpenState, useAppDispatch, useAppSelector } from '../store';\r\nimport { toggleSubMenu, setAllSubMenusOpen } from '../store/menuUiSlice';\r\nimport { MenuListItemProps, SideMenuProps } from '../types';\r\n\r\nimport { wScreens } from '../pages/WScreens';\r\n\r\nconst MenuListItem: React.FC<MenuListItemProps> = ({ item, level, onMenuItemClick}) => {\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const open = useSubMenuOpenState(item.name);\r\n const dispatch = useAppDispatch();\r\n\r\n const handleClick = () => {\r\n if (item.menuType === \"menu\") {\r\n dispatch(toggleSubMenu(item.name));\r\n } else {\r\n let path = '';\r\n const queryParams = new URLSearchParams();\r\n\r\n if (item.menuType === \"table\") {\r\n // Todas las tablas del menú navegan a esta ruta uniforme\r\n path = `/menu/${item.name}`; \r\n \r\n // Los parámetros td y fc siguen siendo query params\r\n if (item.td) queryParams.append('td', JSON.stringify((item.td)));\r\n if (item.fc) queryParams.append('fc', JSON.stringify((item.fc)));\r\n\r\n // NOTA: Los `fixedFields` (item.ff) NO se pasan en los queryParams aquí.\r\n // Se espera que GenericDataGridPage los obtenga directamente desde clientContext.menu\r\n // usando el `item.name` que está en la URL (`:menuName`).\r\n\r\n if (queryParams.toString()) {\r\n path = `${path}?${queryParams.toString()}`;\r\n }\r\n } else if (item.menuType === \"proc\") {\r\n path = `/procedures/${item.name}`;\r\n } else {\r\n const WScreenComponent = wScreens[item.menuType];\r\n if (WScreenComponent !== undefined) {\r\n path = `/wScreens/${item.menuType}`;\r\n } else {\r\n path = `/wScreens-fallback/${item.menuType}`;\r\n console.warn(`Menu type '${item.menuType}' no reconocido o WScreen no mapeada.`);\r\n }\r\n }\r\n \r\n if (path) {\r\n navigate(path);\r\n }\r\n if (onMenuItemClick) {\r\n onMenuItemClick();\r\n }\r\n }\r\n };\r\n\r\n const getIcon = (item: MenuInfoBase) => {\r\n switch (item.menuType) {\r\n case \"table\":\r\n return <TableChartIcon sx={{ color: blue[700] }} />;\r\n case \"proc\":\r\n return <DnsIcon sx={{ color: teal[700] }} />;\r\n case \"menu\":\r\n return <FolderIcon sx={{ color: orange[800] }} />;\r\n default:\r\n const WScreenComponent = wScreens[item.menuType];\r\n if (WScreenComponent !== undefined) {\r\n return <DesktopWindowsIcon sx={{ color: grey[700] }} />;\r\n }\r\n return <WarningAmberIcon sx={{ color: red[500] }} />;\r\n }\r\n };\r\n\r\n const currentPath = location.pathname;\r\n let isSelected = false;\r\n\r\n if (item.menuType === \"table\") {\r\n // La selección ahora siempre se basa en la ruta /menu/table/:name para los ítems de tabla\r\n isSelected = currentPath === `/menu/table/${item.name}`;\r\n } else if (item.menuType === \"proc\") {\r\n isSelected = currentPath === `/procedures/${item.name}`;\r\n } else {\r\n isSelected = currentPath.startsWith(`/wScreens/${item.menuType}`) || currentPath.startsWith(`/wScreens-fallback/${item.menuType}`);\r\n }\r\n\r\n return (\r\n <>\r\n <ListItemButton\r\n onClick={handleClick}\r\n sx={{ pl: level * 2 }}\r\n selected={isSelected}\r\n >\r\n <ListItemIcon sx={{ minWidth: '38px' }}>\r\n {getIcon(item)}\r\n </ListItemIcon>\r\n <ListItemText primary={item.label || item.name} />\r\n {item.menuType === \"menu\" ? (open ? <ExpandLess /> : <ExpandMore />) : null}\r\n </ListItemButton>\r\n {item.menuType === \"menu\" && (\r\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\r\n <List component=\"div\" disablePadding>\r\n {(item as MenuInfoMenu).menuContent.map((subItem) => (\r\n <MenuListItem\r\n key={subItem.name}\r\n item={subItem}\r\n level={level + 1}\r\n onMenuItemClick={onMenuItemClick}\r\n />\r\n ))}\r\n </List>\r\n </Collapse>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\n\r\nconst SideMenu: React.FC<SideMenuProps> = ({ onMenuItemClick }) => {\r\n\r\n const { clientContext } = useApp();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const dispatch = useAppDispatch();\r\n\r\n const subMenuOpenStates = useAppSelector(state => state.menuUi.subMenuOpenStates);\r\n\r\n const allSubMenusKeys = Object.keys(subMenuOpenStates);\r\n const openSubMenusCount = allSubMenusKeys.filter(key => subMenuOpenStates[key]).length;\r\n const isMostlyOpen = allSubMenusKeys.length > 0 && openSubMenusCount / allSubMenusKeys.length > 0.5;\r\n\r\n const handleHomeClick = () => {\r\n navigate('/home');\r\n if (onMenuItemClick) {\r\n onMenuItemClick();\r\n }\r\n };\r\n\r\n const handleToggleAllSubMenus = () => {\r\n dispatch(setAllSubMenusOpen(!isMostlyOpen));\r\n };\r\n\r\n if (!clientContext || !clientContext.menu) {\r\n return (\r\n <Box sx={{ p: 2, textAlign: 'center' }}>\r\n <Typography variant=\"body2\" color=\"text.secondary\">Cargando menú...</Typography>\r\n </Box>\r\n );\r\n }\r\n\r\n const isHomeSelected = location.pathname === '/home';\r\n\r\n return (\r\n <Box sx={{ width: '100%', flexShrink: 0 }}>\r\n {clientContext.menu.some(item => item.menuType === \"menu\") && (\r\n <ListItem disablePadding>\r\n <ListItemButton onClick={handleToggleAllSubMenus}>\r\n <ListItemIcon sx={{ minWidth: '38px' }}>\r\n {isMostlyOpen ? <UnfoldLessIcon /> : <UnfoldMoreIcon />}\r\n </ListItemIcon>\r\n <ListItemText primary={isMostlyOpen ? \"colapsar \" : \"expandir\"} />\r\n </ListItemButton>\r\n </ListItem>\r\n )}\r\n <Divider />\r\n <List>\r\n <ListItem disablePadding>\r\n <ListItemButton onClick={handleHomeClick} selected={isHomeSelected}>\r\n <ListItemIcon sx={{ minWidth: '38px' }}>\r\n <HomeIcon />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Inicio\" />\r\n </ListItemButton>\r\n </ListItem>\r\n <Divider />\r\n {clientContext.menu.map((menuItem: MenuInfoBase) => (\r\n <MenuListItem\r\n key={menuItem.name}\r\n item={menuItem}\r\n level={1}\r\n onMenuItemClick={onMenuItemClick}\r\n />\r\n ))}\r\n </List>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SideMenu;","import React from 'react';\r\nimport { Box, Typography, Paper } from '@mui/material';\r\nimport ConstructionIcon from '@mui/icons-material/Construction';\r\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber'; // Asegúrate de importar el icono de advertencia\r\n\r\nexport interface WScreenProps {\r\n screenName: string; // Renombramos de pageName a screenName\r\n}\r\n\r\n// Ejemplo de un componente de wScreen personalizado\r\nconst MyCustomDashboard: React.FC<WScreenProps> = ({ screenName }) => {\r\n return (\r\n <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%' }}>\r\n <Paper elevation={3} sx={{ p: 4, textAlign: 'center', maxWidth: 600 }}>\r\n <Typography variant=\"h5\" component=\"h1\" gutterBottom>\r\n ¡Bienvenido a tu WScreen: {screenName}!\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"text.secondary\">\r\n Esta es una pantalla de interfaz de usuario personalizada.\r\n </Typography>\r\n <Box sx={{ mt: 3 }}>\r\n <ConstructionIcon sx={{ fontSize: 80, color: 'primary.main' }} />\r\n </Box>\r\n </Paper>\r\n </Box>\r\n );\r\n};\r\n\r\nexport const FallbackWScreen: React.FC<WScreenProps> = ({ screenName }) => {\r\n return (\r\n <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%' }}>\r\n <Paper elevation={3} sx={{ p: 4, textAlign: 'center', maxWidth: 600, backgroundColor: 'warning.light', border: '1px solid orange' }}>\r\n <Typography variant=\"h5\" component=\"h1\" gutterBottom color=\"warning.dark\">\r\n WScreen No Implementada\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"warning.dark\">\r\n No se encontró un componente implementado para la **WScreen**: **`\"${screenName}\"`**.\r\n Por favor, verifica el `menuType` en la definición del menú o asegúrate de que el componente esté correctamente importado y mapeado en el frontend.\r\n </Typography>\r\n <Box sx={{ mt: 3 }}>\r\n <WarningAmberIcon sx={{ fontSize: 80, color: 'warning.dark' }} />\r\n </Box>\r\n </Paper>\r\n </Box>\r\n );\r\n};\r\n\r\n// Mapeo de nombres de wScreens a sus componentes\r\nexport let wScreens: Record<string, React.FC<WScreenProps>> = {\r\n 'MyCustomDashboard': MyCustomDashboard,\r\n // Agrega más componentes de wScreen aquí:\r\n // 'AnotherWScreen': AnotherWScreenComponent,\r\n};\r\n\r\nexport const extendWScreens = (newWScreens: Record<string, React.FC<WScreenProps>>) => {\r\n wScreens = { ...wScreens, ...newWScreens };\r\n console.log('wScreens extendidos:', wScreens);\r\n};","// src/hooks/useLogout.ts\r\nimport { useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// Importa los hooks de Redux y la acción clearClientContext\r\nimport { useDispatch } from 'react-redux';\r\nimport { AppDispatch } from '../store'; // Asegúrate de que la ruta sea correcta\r\nimport { clearClientContext } from '../store/clientContextSlice'; // Importa la acción para limpiar el contexto\r\n\r\nimport { useApp } from '../contexts/AppContext'; // Para acceder a setIsLoggedIn\r\nimport { fetchApi } from '../utils/fetchApi'; // Para la llamada a la API\r\n\r\n/**\r\n * Hook personalizado para manejar la lógica de cierre de sesión.\r\n * Limpia el estado del frontend y realiza la petición al backend.\r\n * @returns Una función 'logout' que, al ser llamada, cierra la sesión.\r\n */\r\nconst useLogout = () => {\r\n // Obtenemos las funciones del contexto de la aplicación\r\n const { setIsLoggedIn } = useApp(); // setClientContext ya no viene de useApp()\r\n\r\n // Obtenemos el dispatch de Redux\r\n const dispatch = useDispatch<AppDispatch>();\r\n\r\n // Obtenemos la función de navegación de React Router\r\n const navigate = useNavigate();\r\n\r\n // Utilizamos useCallback para memoizar la función 'logout'\r\n const logout = useCallback(async () => {\r\n try {\r\n const response = await fetchApi('/logout', { method: 'GET' }); // Asumiendo que tienes un endpoint /logout\r\n \r\n // Puedes ajustar esta lógica de verificación de respuesta\r\n // Si el backend siempre devuelve 401 para un logout exitoso (lo cual es inusual,\r\n // normalmente es un 200 OK y luego el backend invalida la sesión),\r\n // entonces tu lógica actual es válida.\r\n if (response.status === 401 || response.ok) { // Considera response.ok también si el backend da 200\r\n console.log('Sesión cerrada correctamente o ya deslogueado');\r\n } else {\r\n console.error('Error al cerrar sesión:', await response.text());\r\n // Si el logout falla en el backend, podrías decidir no limpiar el estado local\r\n // o mostrar un error al usuario. Por ahora, lo limpiamos igual.\r\n }\r\n } catch (error) {\r\n console.error('Error de red al intentar cerrar sesión:', error);\r\n } finally {\r\n // Siempre limpiamos el estado de login en el frontend,\r\n // independientemente del éxito o fracaso de la petición al backend.\r\n setIsLoggedIn(false); // Actualiza el estado de login en el contexto\r\n \r\n // --- ¡CAMBIO CLAVE AQUÍ! ---\r\n // Despacha la acción de Redux para limpiar el clientContext\r\n dispatch(clearClientContext()); \r\n\r\n navigate('/login', { replace: true }); // Redirige a /login\r\n }\r\n }, [setIsLoggedIn, dispatch, navigate]); // Dependencias: setIsLoggedIn, dispatch (estable), navigate (estable)\r\n\r\n return logout; // Devolvemos la función 'logout'\r\n};\r\n\r\nexport default useLogout;","import React from 'react';\r\nimport { Box, Typography, Button, Modal } from '@mui/material';\r\nimport { useApp } from '../contexts/AppContext'; // Importa useApp para el control del modal\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst style = {\r\n position: 'absolute' as 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 400,\r\n bgcolor: 'background.paper',\r\n border: '2px solid #000',\r\n boxShadow: 24,\r\n p: 4,\r\n textAlign: 'center',\r\n borderRadius: 2,\r\n};\r\n\r\nconst SessionExpiredMessage: React.FC = () => {\r\n const { showSessionExpiredMessage, setShowSessionExpiredMessage, setIsLoggedIn } = useApp();\r\n const navigate = useNavigate();\r\n\r\n const handleClose = () => {\r\n setShowSessionExpiredMessage(false);\r\n setIsLoggedIn(false);\r\n navigate('/login', { replace: true });\r\n };\r\n\r\n return (\r\n <Modal\r\n open={showSessionExpiredMessage}\r\n // Proporciona una función vacía para onClose. Esto satisface el tipo de prop\r\n // y evita que el modal se cierre por defecto al hacer clic en el backdrop.\r\n onClose={() => {}} \r\n aria-labelledby=\"session-expired-modal-title\"\r\n aria-describedby=\"session-expired-modal-description\"\r\n disableEscapeKeyDown={true} // Impide cerrar con la tecla Escape\r\n slotProps={{\r\n backdrop: {\r\n // Esto es crucial en MUI v5: detiene la propagación del evento de clic en el backdrop,\r\n // impidiendo que el modal se cierre al hacer clic fuera.\r\n onClick: (event) => event.stopPropagation(),\r\n sx: {\r\n backgroundColor: 'rgba(100, 100, 100, 0.95)', // Ajusta el color y la opacidad para un fondo más oscuro\r\n },\r\n },\r\n }}\r\n >\r\n <Box sx={style}>\r\n <Typography id=\"session-expired-modal-title\" variant=\"h6\" component=\"h2\" gutterBottom>\r\n ¡Sesión Expirada!\r\n </Typography>\r\n <Typography id=\"session-expired-modal-description\" sx={{ mt: 2, mb: 3 }}>\r\n Tu sesión ha expirado por inactividad o por seguridad. Por favor, inicia sesión de nuevo.\r\n </Typography>\r\n <Button variant=\"contained\" color=\"primary\" onClick={handleClose}>\r\n Ir al Login\r\n </Button>\r\n </Box>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default SessionExpiredMessage;\r\n","// src/pages/HomePage.tsx\r\nimport React from 'react';\r\nimport { Box, Typography } from '@mui/material';\r\nimport { useApp } from '../contexts/AppContext'; // Asegúrate de la ruta correcta\r\n\r\nconst HomePage: React.FC = () => {\r\n const { clientContext } = useApp();\r\n\r\n return (\r\n <Box sx={{ p: 3 }}>\r\n <Typography variant=\"h4\" component=\"h1\" gutterBottom>\r\n {`Bienvenido/a ${clientContext?.username}`}\r\n </Typography>\r\n <Typography variant=\"body1\">\r\n Usa el menú lateral para navegar por las diferentes secciones.\r\n </Typography>\r\n {/* Puedes añadir más contenido aquí, como un dashboard simple o enlaces rápidos */}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default HomePage;","// src/pages/LogoutPage.tsx\r\nimport React, { useEffect } from 'react';\r\nimport { Box, Typography, CircularProgress } from '@mui/material';\r\nimport useLogout from '../hooks/useLogout';\r\n\r\nconst LogoutPage: React.FC = () => {\r\n const logout = useLogout(); \r\n\r\n useEffect(() => {\r\n // Llama a la función de logout del hook cuando el componente se monta\r\n logout();\r\n }, [logout]); // Dependencia: la función 'logout' en sí misma\r\n\r\n return (\r\n <Box sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '100vh',\r\n textAlign: 'center'\r\n }}>\r\n <CircularProgress size={60} />\r\n <Typography variant=\"h6\" sx={{ mt: 2 }}>Cerrando sesión...</Typography>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default LogoutPage;","import React, { useState } from 'react';\r\nimport { Button, TextField, Typography, Alert, AlertTitle, Box, CircularProgress } from '@mui/material'; // Importaciones de MUI\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport * as z from 'zod';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// --- ¡NUEVAS IMPORTACIONES DE REDUX! ---\r\nimport { useDispatch } from 'react-redux';\r\nimport { AppDispatch } from '../store'; // Asegúrate de que la ruta sea correcta\r\nimport { fetchClientContext } from '../store/clientContextSlice'; // Importa el thunk para cargar el contexto\r\n\r\nimport { useApp } from '../contexts/AppContext'; // Sigue importando useApp para setIsLoggedIn y checkSession\r\nimport { fetchApi } from '../utils/fetchApi'; // Tu utilidad fetchApi\r\n\r\n// Define el esquema de validación con Zod\r\nconst loginSchema = z.object({\r\n username: z.string().min(1, \"El usuario es requerido\"), // Añadir validación básica\r\n password: z.string().min(1, \"La contraseña es requerida\"), // Añadir validación básica\r\n});\r\n\r\n// Define el tipo para los datos del formulario\r\ntype LoginFormValues = z.infer<typeof loginSchema>;\r\n\r\nconst LoginPage = () => {\r\n const navigate = useNavigate();\r\n const [loginError, setLoginError] = useState<string | null>(null);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n\r\n // Obtiene setIsLoggedIn y checkSession del contexto de la aplicación\r\n const { setIsLoggedIn, checkSession } = useApp(); \r\n\r\n // Obtiene el dispatch de Redux\r\n const dispatch = useDispatch<AppDispatch>();\r\n\r\n const {\r\n control,\r\n handleSubmit,\r\n formState: { errors },\r\n reset\r\n } = useForm<LoginFormValues>({\r\n resolver: zodResolver(loginSchema),\r\n defaultValues: {\r\n username: '',\r\n password: '',\r\n },\r\n });\r\n\r\n const onSubmit = async (data: LoginFormValues) => {\r\n setIsSubmitting(true);\r\n setLoginError(null); // Limpia cualquier error anterior\r\n\r\n try {\r\n const body = new URLSearchParams({\r\n username: data.username,\r\n password: data.password\r\n });\r\n\r\n const loginResponse = await fetchApi('/login', {\r\n method: 'POST',\r\n body, // URLSearchParams se envía directamente como body para form-urlencoded\r\n // Asegúrate de que el Content-Type en el backend maneje 'application/x-www-form-urlencoded'\r\n });\r\n\r\n // Si el backend redirige a /menu, significa que el login fue exitoso.\r\n // Si la respuesta no es OK, o si la URL no termina en /menu, asumimos un fallo.\r\n if (!loginResponse.ok || !loginResponse.url.endsWith('/menu')) {\r\n //const errorText = await loginResponse.text();\r\n const errorText = 'Credenciales incorrectas o error al iniciar sesión';\r\n throw new Error(errorText);\r\n }\r\n\r\n // Si el login fue exitoso, actualiza el estado de la sesión y carga el contexto del cliente\r\n setIsLoggedIn(true);\r\n\r\n // --- ¡CAMBIO CLAVE AQUÍ! ---\r\n // Despacha el thunk de Redux para cargar el clientContext.\r\n // El .unwrap() es importante para poder capturar errores directamente con try/catch.\r\n await dispatch(fetchClientContext()).unwrap(); \r\n\r\n console.log(\"Login exitoso y clientContext cargado.\");\r\n navigate('/home'); // Redirige al home o dashboard\r\n reset(); // Limpia el formulario\r\n } catch (error: any) {\r\n console.error(\"Error al iniciar sesión:\", error);\r\n setIsLoggedIn(false); // Marca como no logueado en caso de error\r\n // setClientContext(null); // No necesitas llamar a setClientContext aquí, Redux lo maneja\r\n setLoginError(error.message || 'Ocurrió un error al iniciar sesión. Inténtalo de nuevo.');\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <Box\r\n display=\"flex\"\r\n alignItems=\"center\"\r\n justifyContent=\"center\"\r\n minHeight=\"100vh\"\r\n bgcolor=\"#f5f5f5\"\r\n >\r\n <Box\r\n width=\"100%\"\r\n maxWidth=\"400px\"\r\n padding={4}\r\n bgcolor=\"white\"\r\n borderRadius={8}\r\n boxShadow={3}\r\n >\r\n <Typography variant=\"h5\" align=\"center\" gutterBottom>\r\n Iniciar Sesión\r\n </Typography>\r\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"username\">\r\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ fontWeight: 'medium' }}>\r\n Usuario\r\n </Typography>\r\n </label>\r\n <Controller\r\n name=\"username\"\r\n control={control}\r\n render={({ field }) => (\r\n <TextField\r\n {...field}\r\n type=\"text\" // Cambiado de \"username\" a \"text\" que es más estándar para input type\r\n placeholder=\"Ingresa tu usuario\"\r\n fullWidth\r\n margin=\"normal\"\r\n error={!!errors.username}\r\n helperText={errors.username?.message}\r\n disabled={isSubmitting}\r\n />\r\n )}\r\n />\r\n </div>\r\n <div>\r\n <label htmlFor=\"password\">\r\n <Typography variant=\"subtitle1\" component=\"div\" sx={{ fontWeight: 'medium' }}>\r\n Contraseña\r\n </Typography>\r\n </label>\r\n <Controller\r\n name=\"password\"\r\n control={control}\r\n render={({ field }) => (\r\n <TextField\r\n {...field}\r\n type=\"password\"\r\n placeholder=\"Ingresa tu contraseña\"\r\n fullWidth\r\n margin=\"normal\"\r\n error={!!errors.password}\r\n helperText={errors.password?.message}\r\n disabled={isSubmitting}\r\n />\r\n )}\r\n />\r\n </div>\r\n <Button type=\"submit\" fullWidth variant=\"contained\" color=\"primary\" disabled={isSubmitting} sx={{ mt: 2 }}>\r\n {isSubmitting ? (\r\n <>\r\n <CircularProgress size={20} sx={{ mr: 1 }} />\r\n Iniciando sesión...\r\n </>\r\n ) : (\r\n 'Iniciar Sesión'\r\n )}\r\n </Button>\r\n </form>\r\n {loginError && (\r\n <Alert severity=\"error\" sx={{ mt: 2, maxHeight:'200px'}}> {/* Ya no necesitas alertProps */}\r\n <AlertTitle>Error</AlertTitle>\r\n {loginError}\r\n </Alert>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default LoginPage;","import React, { useState, FormEvent, ChangeEvent, useCallback, useMemo } from 'react';\r\nimport { ProcedureDef, ProcedureParameter } from \"backend-plus\";\r\nimport { useParams } from 'react-router-dom';\r\nimport { useApp } from '../contexts/AppContext';\r\n\r\nimport { useApiCall } from '../hooks/useApiCall';\r\n\r\nimport {\r\n TextField,\r\n Button,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n Checkbox,\r\n FormControlLabel,\r\n FormHelperText,\r\n Typography,\r\n Box,\r\n CircularProgress,\r\n Alert,\r\n Divider,\r\n Paper\r\n} from '@mui/material';\r\nimport { SelectChangeEvent } from '@mui/material/Select';\r\nimport { cambiarGuionesBajosPorEspacios } from '../utils/functions';\r\n\r\n// Importamos el mapa de componentes de resultado\r\nimport { resultsOk } from '../pages/procedure-results/resultsOk';\r\n\r\nconst ProcedureForm: React.FC = () => {\r\n const { procedureName } = useParams<{ procedureName: string }>();\r\n const { clientContext } = useApp();\r\n\r\n const { callApi, loading: apiLoading, error: apiError } = useApiCall<any>();\r\n\r\n const [validationErrors, setValidationErrors] = useState<Record<string, string | null>>({});\r\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\r\n const [executionLog, setExecutionLog] = useState<string[]>([]);\r\n const [procedureResultData, setProcedureResultData] = useState<any>(null);\r\n\r\n const procedure: ProcedureDef | undefined = useMemo(() => {\r\n if (procedureName && clientContext?.procedure) {\r\n return clientContext.procedure[procedureName];\r\n }\r\n return undefined;\r\n }, [procedureName, clientContext]);\r\n\r\n const [formValues, setFormValues] = useState<Record<string, any>>(() => {\r\n if (!procedure) return {};\r\n const initialValues: Record<string, any> = {};\r\n procedure.parameters.forEach(param => {\r\n if (param.defaultValue !== undefined) {\r\n initialValues[param.name] = param.defaultValue;\r\n } else if (param.specialDefaultValue) {\r\n switch (param.specialDefaultValue) {\r\n case 'current_date':\r\n initialValues[param.name] = new Date().toISOString().split('T')[0];\r\n break;\r\n case 'current_datetime':\r\n const now = new Date();\r\n initialValues[param.name] = now.toISOString().substring(0, 16);\r\n break;\r\n default:\r\n initialValues[param.name] = param.specialDefaultValue;\r\n break;\r\n }\r\n } else {\r\n initialValues[param.name] = '';\r\n }\r\n });\r\n return initialValues;\r\n });\r\n\r\n React.useEffect(() => {\r\n if (procedure) {\r\n setValidationErrors({});\r\n setSuccessMessage(null);\r\n setProcedureResultData(null);\r\n const newInitialValues: Record<string, any> = {};\r\n procedure.parameters.forEach(param => {\r\n if (param.defaultValue !== undefined) {\r\n newInitialValues[param.name] = param.defaultValue;\r\n } else if (param.specialDefaultValue) {\r\n switch (param.specialDefaultValue) {\r\n case 'current_date':\r\n newInitialValues[param.name] = new Date().toISOString().split('T')[0];\r\n break;\r\n case 'current_datetime':\r\n const now = new Date();\r\n newInitialValues[param.name] = now.toISOString().substring(0, 16);\r\n break;\r\n default:\r\n newInitialValues[param.name] = param.specialDefaultValue;\r\n break;\r\n }\r\n } else {\r\n newInitialValues[param.name] = '';\r\n }\r\n });\r\n setFormValues(newInitialValues);\r\n setExecutionLog([]);\r\n }\r\n }, [procedure]);\r\n\r\n const addLogMessage = useCallback((message: string, isError: boolean = false) => {\r\n const timestamp = new Date().toLocaleTimeString('es-AR');\r\n setExecutionLog(prev => [...prev, `[${timestamp}] ${isError ? 'ERROR: ' : ''}${message}`]);\r\n }, []);\r\n\r\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | SelectChangeEvent<any>, child?: React.ReactNode) => {\r\n const { name, value } = e.target;\r\n let newValue: any = value;\r\n\r\n if ((e.target as HTMLInputElement).type === 'checkbox') {\r\n newValue = (e.target as HTMLInputElement).checked;\r\n }\r\n\r\n setFormValues(prevValues => ({\r\n ...prevValues,\r\n [name]: newValue,\r\n }));\r\n setValidationErrors(prev => ({ ...prev, [name]: null }));\r\n setSuccessMessage(null);\r\n setProcedureResultData(null);\r\n }, []);\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault();\r\n setValidationErrors({});\r\n setSuccessMessage(null);\r\n setExecutionLog([]);\r\n setProcedureResultData(null);\r\n\r\n if (!procedure) {\r\n addLogMessage('Error: La definición del procedimiento no está disponible.', true);\r\n return;\r\n }\r\n\r\n addLogMessage(`Iniciando ejecución del procedimiento: ${procedure.action}...`);\r\n\r\n const paramsToSend: Record<string, any> = {};\r\n let currentValidationErrors: Record<string, string | null> = {};\r\n let hasOverallError = false;\r\n\r\n for (const param of procedure.parameters) {\r\n let value = formValues[param.name];\r\n let processedValue: any = value;\r\n let paramError: string | null = null;\r\n\r\n switch (param.typeName) {\r\n case 'decimal':\r\n case 'double':\r\n if (value === '' || value === null) {\r\n processedValue = null;\r\n } else {\r\n processedValue = parseFloat(value);\r\n if (isNaN(processedValue)) {\r\n paramError = `El valor para \"${param.label || param.name}\" no es un número válido.`;\r\n }\r\n }\r\n break;\r\n case 'integer':\r\n case 'bigint':\r\n if (value === '' || value === null) {\r\n processedValue = null;\r\n } else {\r\n processedValue = parseInt(value, 10);\r\n if (isNaN(processedValue)) {\r\n paramError = `El valor para \"${param.label || param.name}\" no es un entero válido.`;\r\n }\r\n }\r\n break;\r\n case 'boolean':\r\n processedValue = !!value;\r\n break;\r\n case 'jsonb':\r\n case 'jsona':\r\n if (value === '' || value === null) {\r\n processedValue = null;\r\n } else {\r\n try {\r\n processedValue = JSON.parse(value);\r\n } catch (jsonError: any) {\r\n paramError = `Error en el formato JSON para \"${param.label || param.name}\": ${jsonError.message}`;\r\n }\r\n }\r\n break;\r\n case 'bytea':\r\n processedValue = value instanceof File ? value : (value === '' ? null : value);\r\n break;\r\n case 'text':\r\n case 'date':\r\n case 'timestamp':\r\n case 'time':\r\n case 'interval':\r\n case 'tsrange':\r\n case 'time_range':\r\n case 'daterange':\r\n default:\r\n processedValue = value === '' ? null : value;\r\n break;\r\n }\r\n\r\n const hasDefaultValue = param.defaultValue !== undefined || param.specialDefaultValue !== undefined;\r\n const isEmpty = processedValue === null || processedValue === undefined || (typeof processedValue === 'string' && processedValue.trim() === '');\r\n \r\n if (!hasDefaultValue && isEmpty) {\r\n paramError = `El campo \"${param.label || param.name}\" es obligatorio y no puede estar vacío.`;\r\n }\r\n\r\n if (paramError) {\r\n currentValidationErrors[param.name] = paramError;\r\n hasOverallError = true;\r\n addLogMessage(`Error de validación para \"${param.label || param.name}\": ${paramError}`, true);\r\n }\r\n\r\n paramsToSend[param.name] = processedValue;\r\n }\r\n\r\n if (hasOverallError) {\r\n setValidationErrors(currentValidationErrors);\r\n addLogMessage('No se puede ejecutar el procedimiento debido a errores de validación en el formulario.', true);\r\n return;\r\n }\r\n\r\n addLogMessage(`Parámetros a enviar: ${JSON.stringify(paramsToSend, null, 2)}`);\r\n\r\n try {\r\n addLogMessage('Invocando procedimiento a través de useApiCall...');\r\n const result = await callApi(procedure.action, paramsToSend);\r\n \r\n if (result !== undefined) {\r\n setSuccessMessage(procedure.resultOk || 'Procedimiento ejecutado con éxito.');\r\n addLogMessage('Procedimiento ejecutado con éxito.');\r\n addLogMessage(`Resultado: ${JSON.stringify(result, null, 2)}`);\r\n setProcedureResultData(result);\r\n console.log('Resultado del procedimiento:', result);\r\n } else {\r\n addLogMessage('Procedimiento finalizado con errores.', true);\r\n }\r\n } catch (err: any) {\r\n console.error('Error al ejecutar el procedimiento (capturado en ProcedureForm):', err);\r\n addLogMessage(`Error en la ejecución: ${err.message || 'Error desconocido.'}`, true);\r\n } finally {\r\n addLogMessage('Ejecución finalizada.');\r\n }\r\n };\r\n\r\n const renderInputField = useCallback((param: ProcedureParameter) => {\r\n const hasError = !!validationErrors[param.name];\r\n const errorMessage = validationErrors[param.name];\r\n\r\n const commonProps: any = {\r\n id: param.name,\r\n name: param.name,\r\n label: param.label || param.name,\r\n variant: \"outlined\" as \"outlined\",\r\n fullWidth: true,\r\n margin: \"dense\" as \"dense\",\r\n required: !(param.defaultValue !== undefined || param.specialDefaultValue !== undefined),\r\n size: \"small\" as \"small\",\r\n helperText: errorMessage || param.description,\r\n error: hasError,\r\n disabled: apiLoading,\r\n onChange: handleChange,\r\n sx: { fontSize: '0.8rem' }\r\n };\r\n\r\n if (param.options && param.options.length > 0) {\r\n return (\r\n <FormControl fullWidth margin=\"dense\" size=\"small\" error={hasError} required={commonProps.required}>\r\n <InputLabel id={`${param.name}-label`} sx={{ fontSize: '0.8rem' }}>{param.label || param.name}</InputLabel>\r\n <Select\r\n labelId={`${param.name}-label`}\r\n value={formValues[param.name] === undefined ? '' : formValues[param.name]}\r\n onChange={handleChange}\r\n name={param.name}\r\n id={param.name}\r\n label={param.label || param.name}\r\n disabled={apiLoading}\r\n sx={{ fontSize: '0.8rem' }}\r\n renderValue={(selected) => (\r\n <Typography sx={{ fontSize: '0.8rem' }}>{selected as string}</Typography>\r\n )}\r\n >\r\n {(!commonProps.required || formValues[param.name] === '') && <MenuItem value=\"\" sx={{ fontSize: '0.8rem' }}><em>Seleccione...</em></MenuItem>}\r\n {param.options.map(option => (\r\n <MenuItem key={option} value={option} sx={{ fontSize: '0.8rem' }}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n {(param.description || errorMessage) && <FormHelperText sx={{ fontSize: '0.7rem' }}>{errorMessage || param.description}</FormHelperText>}\r\n </FormControl>\r\n );\r\n }\r\n\r\n switch (param.typeName) {\r\n case 'text':\r\n case 'interval':\r\n case 'tsrange':\r\n case 'time_range':\r\n case 'daterange':\r\n return <TextField type=\"text\" value={formValues[param.name] || ''} {...commonProps} />;\r\n case 'decimal':\r\n case 'double':\r\n return <TextField type=\"number\" inputProps={{ step: \"any\", style: { fontSize: '0.8rem' } }} value={formValues[param.name] || ''} {...commonProps} />;\r\n case 'integer':\r\n case 'bigint':\r\n return <TextField type=\"number\" inputProps={{ step: \"1\", style: { fontSize: '0.8rem' } }} value={formValues[param.name] || ''} {...commonProps} />;\r\n case 'boolean':\r\n return (\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={!!formValues[param.name]}\r\n onChange={handleChange}\r\n name={param.name}\r\n id={param.name}\r\n disabled={apiLoading}\r\n size=\"small\"\r\n />\r\n }\r\n label={<Typography sx={{ fontSize: '0.8rem', color: hasError ? 'error.main' : 'inherit' }}>{param.label || param.name}</Typography>}\r\n sx={{ mt: 1, mb: 0 }}\r\n />\r\n );\r\n case 'date':\r\n case 'timestamp':\r\n case 'time':\r\n return <TextField type={param.typeName === 'date' ? 'date' : param.typeName === 'timestamp' ? 'datetime-local' : 'time'} value={formValues[param.name] || ''} {...commonProps} InputLabelProps={{ shrink: true, sx: { fontSize: '0.8rem' } }} />;\r\n case 'jsonb':\r\n case 'jsona':\r\n return <TextField multiline rows={5} value={formValues[param.name] || ''} {...commonProps} InputProps={{ sx: { fontSize: '0.8rem' } }} />;\r\n case 'bytea':\r\n return (\r\n <FormControl fullWidth margin=\"dense\" error={hasError} required={commonProps.required}>\r\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"label\" htmlFor={param.name} sx={{ fontSize: '0.8rem', color: hasError ? 'error.main' : 'text.secondary' }}>\r\n {param.label || param.name}\r\n </Typography>\r\n <input\r\n type=\"file\"\r\n id={param.name}\r\n name={param.name}\r\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n setFormValues(prev => ({ ...prev, [param.name]: files && files.length > 0 ? files[0] : undefined }));\r\n }}\r\n disabled={apiLoading}\r\n style={{ padding: '6px 0', fontSize: '0.8rem' }}\r\n />\r\n {(param.description || errorMessage) && <FormHelperText sx={{ fontSize: '0.7rem' }}>{errorMessage || param.description}</FormHelperText>}\r\n </FormControl>\r\n );\r\n default:\r\n return <TextField type=\"text\" value={formValues[param.name] || ''} {...commonProps} />;\r\n }\r\n }, [formValues, handleChange, apiLoading, validationErrors]);\r\n\r\n // Contenido a renderizar dentro de la sección de resultado\r\n const ResultDisplayContent = useMemo(() => {\r\n if (!procedureResultData || !procedure?.resultOk) return null;\r\n\r\n const ComponentToRender = resultsOk[procedure.resultOk];\r\n\r\n if (ComponentToRender) {\r\n return <ComponentToRender data={procedureResultData} />;\r\n } else {\r\n return (\r\n <Paper elevation={2} sx={{ p: 2, mt: 0, bgcolor: 'warning.light' }}>\r\n <Typography variant=\"h6\" sx={{ fontSize: '1rem', mb: 1 }}>\r\n el componente para resolver el resultOk: '{procedure.resultOk}' definido en el procedure no existe o no está mapeado.\r\n </Typography>\r\n <Box sx={{ \r\n bgcolor: 'warning.dark', \r\n p: 1, \r\n borderRadius: 1, \r\n }}>\r\n <pre style={{ margin: 0, fontSize: '0.75rem', color: 'white' }}>\r\n {JSON.stringify(procedureResultData, null, 2)}\r\n </pre>\r\n </Box>\r\n </Paper>\r\n );\r\n }\r\n }, [procedureResultData, procedure]);\r\n\r\n\r\n if (!procedure) {\r\n return (\r\n <Box sx={{\r\n p: 2,\r\n width: '100%',\r\n boxSizing: 'border-box',\r\n mt: 0,\r\n bgcolor: 'background.paper',\r\n borderRadius: 2,\r\n boxShadow: 3,\r\n textAlign: 'center'\r\n }}>\r\n <CircularProgress sx={{ mb: 2 }} />\r\n <Typography variant=\"h6\" color=\"text.secondary\">\r\n Cargando procedimiento o no encontrado...\r\n </Typography>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n // Esta es la Box más externa que ahora controlará el scroll\r\n <Box sx={{\r\n p: 2,\r\n ml: 1,\r\n mt: 2,\r\n mr: 1,\r\n boxSizing: 'border-box',\r\n bgcolor: 'background.paper',\r\n borderRadius: 2,\r\n boxShadow: 3,\r\n fontSize: '0.8rem',\r\n maxHeight: 'calc(100vh - 100px)', // Ajusta esta altura máxima según el espacio disponible en tu layout\r\n overflowY: 'auto', // Habilita el scroll vertical para todo el contenido de esta Box\r\n overflowX: 'hidden' // Oculta el scroll horizontal si no es necesario para el contenedor principal\r\n }}>\r\n <Typography variant=\"h5\" component=\"h2\" gutterBottom align=\"left\">\r\n {cambiarGuionesBajosPorEspacios(procedure.proceedLabel || procedure.action)}\r\n </Typography>\r\n\r\n {Object.values(validationErrors).some(err => err !== null) && (\r\n <Alert severity=\"error\" sx={{ mb: 2, fontSize: '0.8rem' }}>\r\n Por favor, corrige los errores en el formulario antes de enviar.\r\n <ul>\r\n {Object.values(validationErrors).map((err, idx) => err && <li key={idx}>{err}</li>)}\r\n </ul>\r\n </Alert>\r\n )}\r\n {!Object.values(validationErrors).some(err => err !== null) && apiError && <Alert severity=\"error\" sx={{ mb: 2, fontSize: '0.8rem' }}>{apiError.message}</Alert>}\r\n {!Object.values(validationErrors).some(err => err !== null) && !apiError && successMessage && <Alert severity=\"success\" sx={{ mb: 2, fontSize: '0.8rem' }}>{successMessage}</Alert>}\r\n\r\n <form onSubmit={handleSubmit}>\r\n {procedure.parameters.map(param => (\r\n <div key={param.name}>\r\n {renderInputField(param)}\r\n </div>\r\n ))}\r\n\r\n <Button\r\n type=\"submit\"\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={apiLoading || Object.values(validationErrors).some(err => err !== null)}\r\n sx={{ mt: 2 }}\r\n size=\"medium\"\r\n startIcon={apiLoading ? <CircularProgress size={20} color=\"inherit\" /> : null}\r\n >\r\n {apiLoading ? 'Ejecutando...' : (procedure.proceedLabel || 'Ejecutar')}\r\n </Button>\r\n </form>\r\n\r\n {/* Renderizamos el contenido del resultado, sin scroll propio aquí */}\r\n {ResultDisplayContent && (\r\n <Box sx={{ mt: 2 }}> {/* Margen superior para separar del botón */}\r\n {ResultDisplayContent}\r\n </Box>\r\n )}\r\n \r\n {/* Área para el registro de ejecución del procedimiento */}\r\n {executionLog.length > 0 && (\r\n <Box sx={{ mt: 3 }}>\r\n <Divider sx={{ mb: 2 }} />\r\n <Typography variant=\"h6\" gutterBottom sx={{ fontSize: '0.9rem' }}>\r\n Registro de Ejecución\r\n </Typography>\r\n <Box\r\n sx={{\r\n bgcolor: 'grey.100',\r\n p: 2,\r\n borderRadius: 1,\r\n maxHeight: '200px', // Este log puede tener su propio scroll interno si es muy largo\r\n overflowY: 'auto',\r\n fontFamily: 'monospace',\r\n fontSize: '0.75rem',\r\n whiteSpace: 'pre-wrap',\r\n }}\r\n >\r\n {executionLog.map((log, index) => (\r\n <Typography\r\n key={index}\r\n component=\"pre\"\r\n sx={{\r\n margin: 0,\r\n color: log.includes('ERROR:') ? 'error.main' : 'text.primary',\r\n fontSize: 'inherit'\r\n }}\r\n >\r\n {log}\r\n </Typography>\r\n ))}\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ProcedureForm;","import React from 'react';\r\nimport { Box, Typography, Paper } from '@mui/material';\r\nimport { ResultOkProps } from './resultsOk'; \r\n\r\nconst SuccessDisplay: React.FC<ResultOkProps> = ({ data }) => {\r\n return (\r\n <Paper elevation={2} sx={{ p: 2, mt: 2, bgcolor: 'success.light', color: 'success.contrastText' }}>\r\n <Typography variant=\"h6\" sx={{ fontSize: '1rem', mb: 1 }}>\r\n ¡Operación Exitosa!\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ fontSize: '0.85rem' }}>\r\n Detalles del resultado:\r\n </Typography>\r\n <Box sx={{ bgcolor: 'success.dark', p: 1, borderRadius: 1, mt: 1, overflowX: 'auto' }}>\r\n <pre style={{ margin: 0, fontSize: '0.75rem', color: 'white' }}>\r\n {JSON.stringify(data, null, 2)}\r\n </pre>\r\n </Box>\r\n <Typography variant=\"body2\" sx={{ fontSize: '0.8rem', mt: 1 }}>\r\n Puedes revisar los detalles anteriores o cerrar este mensaje.\r\n </Typography>\r\n </Paper>\r\n );\r\n};\r\n\r\nexport default SuccessDisplay;","import React from 'react';\r\n\r\nimport SuccessDisplay from './SuccessDisplay';\r\n\r\nexport interface ResultOkProps { \r\n data: any; }\r\n\r\ntype ResultComponentMap = {\r\n [key: string]: React.FC<ResultOkProps>; \r\n};\r\n\r\nexport let resultsOk: ResultComponentMap = {\r\n 'successful_operation': SuccessDisplay as React.FC<ResultOkProps>,\r\n};\r\n\r\nexport const extendResultsOk = (newComponents: ResultComponentMap) => {\r\n resultsOk = { ...resultsOk, ...newComponents };\r\n};","// src/components/PrivateRoute.tsx\r\nimport React, { useEffect, ReactNode } from 'react';\r\nimport { Navigate, useLocation } from 'react-router-dom';\r\nimport { useAppDispatch, useClientContextStatus } from '../store'; // Importa useDispatch, useClientContextStatus\r\nimport { setRedirectPath } from '../store/routerSlice'; // Importa la acción para guardar la ruta de redirección\r\nimport { PrivateRouteProps } from '../types';\r\n\r\nconst PrivateRoute: React.FC<PrivateRouteProps> = ({ children }) => {\r\n const location = useLocation();\r\n const dispatch = useAppDispatch();\r\n const clientContextStatus = useClientContextStatus(); // Obtiene el estado de Redux\r\n\r\n const isAuthenticated = clientContextStatus === 'succeeded';\r\n const isLoadingAuth = clientContextStatus === 'loading';\r\n\r\n console.log(`[PrivateRoute] Render: Path=${location.pathname}, AuthStatus=${clientContextStatus}, IsAuthenticated=${isAuthenticated}, IsLoadingAuth=${isLoadingAuth}`);\r\n\r\n useEffect(() => {\r\n console.log(`[PrivateRoute] Effect: Path=${location.pathname}, AuthStatus=${clientContextStatus}, IsAuthenticated=${isAuthenticated}, IsLoadingAuth=${isLoadingAuth}`);\r\n // Condición para guardar la URL:\r\n // 1. El usuario NO está autenticado.\r\n // 2. NO estamos en el proceso de carga de autenticación (ya sabemos que no está autenticado).\r\n // 3. NO estamos ya en la página de login (para evitar guardar /login).\r\n if (!isAuthenticated && !isLoadingAuth && location.pathname !== '/login') {\r\n const path = location.pathname + location.search;\r\n console.log(`[PrivateRoute] ACTION: Dispatching setRedirectPath(${path})`);\r\n dispatch(setRedirectPath(path));\r\n } else if (isAuthenticated) {\r\n console.log(`[PrivateRoute] User is authenticated, no redirectPath set.`);\r\n } else if (isLoadingAuth) {\r\n console.log(`[PrivateRoute] Still loading authentication.`);\r\n } else if (location.pathname === '/login') {\r\n console.log(`[PrivateRoute] Currently on /login, not setting redirectPath.`);\r\n }\r\n }, [isAuthenticated, isLoadingAuth, location, dispatch, clientContextStatus]); // Añadir clientContextStatus a las dependencias del efecto\r\n\r\n if (isLoadingAuth) {\r\n console.log(`[PrivateRoute] Returning loading state...`);\r\n return <p>Verificando autenticación...</p>;\r\n }\r\n\r\n if (!isAuthenticated) {\r\n console.log(`[PrivateRoute] User not authenticated, navigating to /login`);\r\n return <Navigate to=\"/login\" replace />;\r\n }\r\n\r\n console.log(`[PrivateRoute] User authenticated, rendering children.`);\r\n return <>{children}</>;\r\n};\r\n\r\nexport default PrivateRoute;","// src/components/InitialRedirectHandler.tsx\r\nimport React, { useEffect } from 'react';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { useAppDispatch, useRedirectPath, useClientContextStatus } from '../store'; // <--- ¡Asegúrate de importar useClientContextStatus de aquí!\r\nimport { setCurrentPath, setRedirectPath } from '../store/routerSlice';\r\n\r\nconst InitialRedirectHandler: React.FC = () => {\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n const dispatch = useAppDispatch();\r\n const redirectPath = useRedirectPath();\r\n const clientContextStatus = useClientContextStatus(); // <--- ¡Ahora lo obtienes de Redux!\r\n\r\n // Efecto para despachar la ruta actual al cambiar\r\n useEffect(() => {\r\n dispatch(setCurrentPath(location.pathname + location.search));\r\n }, [location, dispatch]);\r\n\r\n // Efecto para manejar la redirección inicial (después de login o recarga si ya estaba logueado)\r\n useEffect(() => {\r\n // Asegúrate de que el clientContext esté cargado/autenticado antes de intentar redirigir\r\n if (clientContextStatus === 'succeeded') {\r\n if (redirectPath && redirectPath !== '/login') { // Evita redirigir a /login\r\n console.log('Redirigiendo a la ruta guardada:', redirectPath);\r\n navigate(redirectPath);\r\n dispatch(setRedirectPath(null)); // Limpia la ruta guardada después de usarla\r\n } else if (location.pathname === '/login' || location.pathname === '/') {\r\n // Si el usuario está en /login o / y ya está autenticado y no hay ruta de redirección\r\n // lo mandamos a /home por defecto.\r\n console.log('Usuario autenticado, redirigiendo a /home por defecto.');\r\n navigate('/home');\r\n }\r\n }\r\n }, [clientContextStatus, redirectPath, location.pathname, navigate, dispatch]);\r\n\r\n return null; // No renderiza nada\r\n};\r\n\r\nexport default InitialRedirectHandler;","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Box, Alert, Typography } from '@mui/material'; // Importa Box, Alert, Typography de MUI\r\nimport GenericDataGrid from '../components/grid/GenericDataGrid'; // Ajusta la ruta si es necesario\r\n\r\nconst GenericDataGridPage: React.FC = () => {\r\n // Usa useParams para obtener el tableName de la URL\r\n const { tableName } = useParams<{ tableName?: string }>();\r\n\r\n if (!tableName) {\r\n // Muestra un mensaje de error si tableName no está presente en la URL\r\n return (\r\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\r\n <Alert severity=\"error\">\r\n <Typography variant=\"h6\">Error: Nombre de tabla no especificado en la URL.</Typography>\r\n <Typography variant=\"body1\">Por favor, asegúrate de que la URL contenga el nombre de la tabla (ej. `/data/users`).</Typography>\r\n </Alert>\r\n </Box>\r\n );\r\n }\r\n\r\n // Pasa tableName como prop al GenericDataGrid\r\n return <GenericDataGrid tableName={tableName} fixedFields={[]} />;\r\n};\r\n\r\nexport default GenericDataGridPage;","// src/pages/MenuTablePage.tsx\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Box, Alert, Typography } from '@mui/material';\r\nimport GenericDataGrid from '../components/grid/GenericDataGrid'; // Ajusta la ruta si es necesario\r\nimport { useApp } from '../contexts/AppContext'; // Necesitamos el contexto para acceder al menú\r\nimport { MenuInfoBase, MenuInfoMenu, MenuInfoTable } from 'backend-plus'; // Asegúrate de importar tus tipos de menú\r\n\r\nconst MenuTablePage: React.FC = () => {\r\n // Obtiene el `menuName` de la URL para buscar en clientContext.menu\r\n const { menuName } = useParams<{ menuName?: string }>();\r\n const { clientContext } = useApp();\r\n\r\n // Función auxiliar para encontrar un ítem de menú recursivamente\r\n const findMenuItem = (items: MenuInfoBase[], nameToFind: string): MenuInfoTable | undefined => {\r\n for (const item of items) {\r\n if (item.name === nameToFind && item.menuType === \"table\") {\r\n return item as MenuInfoTable;\r\n }\r\n if (item.menuType === \"menu\" && (item as MenuInfoMenu).menuContent) {\r\n const found = findMenuItem((item as MenuInfoMenu).menuContent, nameToFind);\r\n if (found) return found;\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n // Usa useMemo para determinar el tableName y los fixedFields desde el menú\r\n const { currentTableName, currentFixedFields } = useMemo(() => {\r\n let tableName: string | undefined = undefined;\r\n let fixedFields: any[] = [];\r\n \r\n if (menuName && clientContext && clientContext.menu) {\r\n const menuItem = findMenuItem(clientContext.menu, menuName);\r\n if (menuItem) {\r\n tableName = menuItem.table || menuItem.name;\r\n if(menuItem.ff){\r\n Object.keys(menuItem.ff || []).forEach((fixedFieldKey)=>{\r\n fixedFields.push({\r\n fieldName:fixedFieldKey,\r\n //@ts-ignore\r\n value: menuItem.ff![fixedFieldKey]\r\n })\r\n })\r\n }\r\n } else {\r\n console.warn(`[${menuName}] Ítem de menú '${menuName}' no encontrado o no es de tipo 'table' en clientContext.menu.`);\r\n // Opcional: podrías redirigir o mostrar un error más amigable\r\n }\r\n }\r\n\r\n return {\r\n currentTableName: tableName,\r\n currentFixedFields: fixedFields,\r\n };\r\n }, [menuName, clientContext]);\r\n\r\n if (!currentTableName) {\r\n // Muestra un mensaje de error si el nombre de la tabla no se pudo determinar\r\n return (\r\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"200px\">\r\n <Alert severity=\"error\">\r\n <Typography variant=\"h6\">Error: No se pudo cargar la información de la tabla.</Typography>\r\n <Typography variant=\"body1\">Verifique la configuración del menú o el nombre de la tabla en la URL.</Typography>\r\n </Alert>\r\n </Box>\r\n );\r\n }\r\n\r\n // Renderiza GenericDataGrid con los datos obtenidos del menú\r\n return (\r\n <GenericDataGrid\r\n tableName={currentTableName}\r\n fixedFields={currentFixedFields}\r\n />\r\n );\r\n};\r\n\r\nexport default MenuTablePage;"],"mappings":"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","names":["object","channel","pair","parse","constructorName","constructor","p","useState","useCallback","useMemo","useState","useCallback","SnackbarAlert","params","useState","useCallback","CircularProgress","Typography","Box","useTheme","createSlice","initialState","createSlice","initialState","jsx","jsxs","useState","jsx","jsxs","Box","jsx","jsxs","jsx","Box","jsx","Box","Button","IconButton","Tooltip","Typography","Box","Typography","jsx","Box","Typography","Tooltip","jsx","jsxs","jsx","Box","Tooltip","Typography","IconButton","Button","useCallback","useState","InputBase","useTheme","jsx","useState","useCallback","InputBase","Box","Tooltip","jsx","jsx","jsx","jsx","jsxs","useState","useTheme","useMemo","useCallback","Box","CircularProgress","Typography","React","useEffect","useLocation","Navigate","useEffect","Box","Typography","Button","IconButton","useTheme","createContext","useContext","useState","useEffect","useCallback","useMemo","useSelector","useDispatch","jsx","createContext","useContext","useSelector","useState","useDispatch","useCallback","useEffect","useMemo","List","ListItemButton","ListItemIcon","ListItemText","Box","Typography","WarningAmberIcon","useNavigate","Box","Typography","Paper","WarningAmberIcon","jsx","jsxs","Fragment","jsx","jsxs","useNavigate","item","WarningAmberIcon","ListItemButton","ListItemIcon","ListItemText","List","Box","Typography","useCallback","useNavigate","useDispatch","useDispatch","useNavigate","useCallback","jsx","jsxs","useTheme","useEffect","Box","Typography","theme","IconButton","Button","Box","Typography","Button","useNavigate","jsx","jsxs","Box","Typography","Button","Box","Typography","jsx","jsxs","Box","Typography","useEffect","Box","Typography","CircularProgress","jsx","jsxs","useEffect","Box","CircularProgress","Typography","useState","Button","Typography","Alert","Box","CircularProgress","useNavigate","useDispatch","Fragment","jsx","jsxs","useNavigate","useState","useDispatch","Box","Typography","Button","CircularProgress","Alert","React","useState","useCallback","useMemo","TextField","Button","Typography","Box","CircularProgress","Alert","Divider","Paper","Box","Typography","Paper","jsx","jsxs","jsx","jsxs","useState","useMemo","React","useCallback","Typography","TextField","Paper","Box","CircularProgress","Alert","Button","Divider","useEffect","useLocation","Fragment","jsx","useLocation","useEffect","useEffect","useLocation","useNavigate","useLocation","useNavigate","useEffect","useParams","Box","Alert","Typography","jsx","jsxs","useParams","Box","Alert","Typography","useMemo","useParams","Box","Alert","Typography","jsx","jsxs","useParams","useMemo","Box","Alert","Typography","Box","jsx","jsxs","useLocation","useEffect","React","Navigate"]}
|