{"version":3,"file":"__federation_expose_LabActiveForm.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/screens/LabActiveForm.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/screens/LabActiveFormScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_array_like_to_array.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_array_with_holes.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_interop_require_default.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_iterable_to_array_limit.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_non_iterable_rest.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_sliced_to_array.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_unsupported_iterable_to_array.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/adapter/parseAccessControl.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/components/AccessRestricted.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/components/Can.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/hooks/useCan.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/hooks/useCanResolver.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/resolver/canAccess.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/resolver/resolvePermission.ts"],"sourcesContent":["import React, {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport {\n  View,\n  StyleSheet,\n  ScrollView,\n  Text,\n  TextInput,\n  TouchableOpacity,\n  KeyboardAvoidingView,\n  Platform,\n} from 'react-native';\nimport LinearGradient from 'react-native-linear-gradient';\nimport { useRoute, useNavigation } from '@react-navigation/native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport dayjs from 'dayjs';\nimport { submitReportWithOfflineFallback } from '@data-oil-front/core-reports';\nimport { API_VERBS, TABLE_NAMES } from '@data-oil-front/core-utils';\nimport {\n  DatePicker,\n  TimePicker,\n  NumericField,\n  LoadingSpinner,\n} from '@data-oil-front/ui-mobile';\nimport Toast from 'react-native-toast-message';\nimport { useForm, Controller, useWatch } from 'react-hook-form';\nimport { configService } from '@data-oil-front/core-host';\nimport { useCanResolver } from '@data-oil-front/mfe-permissions';\nimport type { FacilityListItem, LabReport } from '../types/labReports';\nimport {\n  getFacilityName,\n  getInstallationType,\n  getFacilityIdFromActiveReport,\n  resolveFacilityTypeFromTable,\n} from '../utils/labReports.mappers';\nimport {\n  fetchPendingReportById,\n  fetchLabReportById,\n  fetchFacilitiesList,\n  insertLabReportRecord,\n  markReportAsAnalyzed,\n} from '../services/labReports.api';\n\ntype RouteParams = {\n  id?: number | string;\n  table?: string;\n  mode?: 'create' | 'edit';\n  labReportId?: number | string;\n};\n\ninterface LabActiveFormInputs {\n  resultDate: Date | null;\n  resultTime: string;\n  api: string;\n  ays: string;\n  saltAmount: string;\n  comments: string;\n}\n\nconst parseNumberParam = (value: unknown): number | null => {\n  if (value === null || value === undefined) return null;\n  const parsed = Number(value);\n  return Number.isFinite(parsed) ? parsed : null;\n};\n\nexport default function LabActiveForm() {\n  const routeFromHook = useRoute<any>();\n  const navigationFromHook = useNavigation<any>();\n  const params: RouteParams = ((routeFromHook as any)?.params ??\n    (routeFromHook as any)?.route?.params ??\n    {}) as RouteParams;\n  const navigation = navigationFromHook;\n  const can = useCanResolver();\n  const isEditMode = params.mode === 'edit';\n  const reportIdParam = parseNumberParam(params.id);\n  const labReportIdParam = parseNumberParam(params.labReportId);\n  const tableParam = params.table;\n  const [loading, setLoading] = useState(true);\n  const [item, setItem] = useState<LabReport | null>(null);\n  const [facilities, setFacilities] = useState<FacilityListItem[]>([]);\n  const [submitting, setSubmitting] = useState(false);\n  const [permissionDenied, setPermissionDenied] = useState(false);\n  const insets = useSafeAreaInsets();\n  const clientConfig = configService.getCurrentConfig();\n  const accentColor = clientConfig.primaryColor ?? '#2563EB';\n  const initialNowRef = useRef(new Date());\n  const formatTwoDigits = (value: number) => value.toString().padStart(2, '0');\n  const initialTimeRef = useRef(\n    `${formatTwoDigits(initialNowRef.current.getHours())}:${formatTwoDigits(\n      initialNowRef.current.getMinutes(),\n    )}`,\n  );\n\n  const {\n    control,\n    handleSubmit,\n    formState: { isValid },\n    reset,\n  } = useForm<LabActiveFormInputs>({\n    mode: 'onChange',\n    defaultValues: {\n      resultDate: initialNowRef.current,\n      resultTime: initialTimeRef.current,\n      api: '',\n      ays: '',\n      saltAmount: '',\n      comments: '',\n    },\n  });\n  const watchAys = useWatch({ control, name: 'ays' });\n\n  const showToast = useCallback(\n    (\n      message: string,\n      type: 'notification' | 'success' | 'error' = 'notification',\n    ) => {\n      Toast.show({\n        type: type === 'notification' ? 'info' : type,\n        text1: 'Información',\n        text2: message,\n      });\n    },\n    [],\n  );\n\n  const loadData = useCallback(async () => {\n    if (isEditMode && (labReportIdParam === null || labReportIdParam === undefined)) {\n      showToast('Parámetros inválidos para cargar el reporte', 'error');\n      setLoading(false);\n      return;\n    }\n    if (!isEditMode && (reportIdParam === null || reportIdParam === undefined || !tableParam)) {\n      showToast('Parámetros inválidos para cargar el reporte', 'error');\n      setLoading(false);\n      return;\n    }\n    setLoading(true);\n    setPermissionDenied(false);\n    try {\n      const [facilitiesList, report] = await Promise.all([\n        fetchFacilitiesList(),\n        isEditMode\n          ? fetchLabReportById(Number(labReportIdParam))\n          : fetchPendingReportById(tableParam as string, Number(reportIdParam)),\n      ]);\n      setFacilities(facilitiesList);\n      if (!report) {\n        showToast('No se encontró el reporte solicitado.', 'error');\n        setItem(null);\n        return;\n      }\n      // Loading a new analysis is a `create` action (any role with create\n      // access can do it). Editing an existing report is an `edit` action\n      // gated by ownership (owner or admin only).\n      const allowed = isEditMode\n        ? can('labReport', 'edit', { user_id: report.user_id })\n        : can('labReport', 'create');\n      if (!allowed) {\n        setPermissionDenied(true);\n        setItem(null);\n        showToast(\n          isEditMode\n            ? 'No tenés permisos para editar este reporte.'\n            : 'No tenés permisos para cargar el análisis de este reporte.',\n          'error',\n        );\n        return;\n      }\n      setItem(report);\n      const resultDate = report.result_date ? dayjs(report.result_date) : null;\n      const parsedDate = resultDate?.isValid() ? resultDate.toDate() : initialNowRef.current;\n      const parsedTime = resultDate?.isValid()\n        ? `${formatTwoDigits(resultDate.hour())}:${formatTwoDigits(resultDate.minute())}`\n        : initialTimeRef.current;\n      reset({\n        resultDate: parsedDate,\n        resultTime: parsedTime,\n        api: report.api != null ? String(report.api) : '',\n        ays: report.ays != null ? String(report.ays) : '',\n        saltAmount: report.salt_amount != null ? String(report.salt_amount) : '',\n        comments: report.comments ?? '',\n      });\n    } catch (error) {\n      showToast('Error al cargar los datos del reporte.', 'error');\n      setItem(null);\n    } finally {\n      setLoading(false);\n    }\n  }, [isEditMode, labReportIdParam, reportIdParam, reset, showToast, tableParam, can]);\n\n  useEffect(() => {\n    loadData();\n  }, [loadData]);\n\n  const facilityTypeView = useMemo(() => {\n    if (!item) return null;\n    const resolved = getFacilityIdFromActiveReport(item, facilities);\n    if (resolved) return resolved;\n    const fallbackType = resolveFacilityTypeFromTable(tableParam ?? 'facility');\n    return `${fallbackType || 'facility'}_0`;\n  }, [item, facilities, tableParam]);\n\n  const facilityName = useMemo(() => {\n    if (!facilityTypeView) return 'N/A';\n    return getFacilityName(facilityTypeView, facilities);\n  }, [facilityTypeView, facilities]);\n\n  const installationType = useMemo(() => {\n    if (!item) return 'N/A';\n    return getInstallationType(item);\n  }, [item]);\n\n  const handleSave = useCallback(\n    async (values: LabActiveFormInputs) => {\n      if (!item || !tableParam) {\n        if (isEditMode && item) {\n          // Edit mode does not need table from daily report.\n        } else {\n        showToast('No se pudo determinar el reporte a actualizar.', 'error');\n        return;\n        }\n      }\n      const allowed = isEditMode\n        ? can('labReport', 'edit', { user_id: item.user_id })\n        : can('labReport', 'create');\n      if (!allowed) {\n        setPermissionDenied(true);\n        showToast(\n          isEditMode\n            ? 'No tenés permisos para editar este reporte.'\n            : 'No tenés permisos para cargar el análisis de este reporte.',\n          'error',\n        );\n        return;\n      }\n      setSubmitting(true);\n      try {\n        const selectedDate = values.resultDate ?? new Date();\n        const [hours = '00', minutes = '00'] = (values.resultTime || '').split(\n          ':',\n        );\n        const pad = (val: string) =>\n          formatTwoDigits(Math.max(0, Math.min(59, Number(val) || 0)));\n        const hh = pad(hours);\n        const mm = pad(minutes);\n        const resultDateTime = `${selectedDate.getFullYear()}-${formatTwoDigits(\n          selectedDate.getMonth() + 1,\n        )}-${formatTwoDigits(selectedDate.getDate())} ${hh}:${mm}:00`;\n        const now = dayjs().format('YYYY-MM-DD HH:mm:ss');\n\n        if (isEditMode) {\n          const updateLabResponse = await submitReportWithOfflineFallback(\n            TABLE_NAMES.LAB_REPORT,\n            {\n              verb: API_VERBS.UPDATE,\n              table: TABLE_NAMES.LAB_REPORT,\n              fields: [\n                'date_updated',\n                'edition_number',\n                'result_date',\n                'api',\n                'ays',\n                'salt_amount',\n                'comments',\n              ],\n              values: [\n                now,\n                typeof item.edition_number === 'number'\n                  ? item.edition_number + 1\n                  : 1,\n                resultDateTime,\n                values.api ? Number(values.api) : null,\n                values.ays ? Number(values.ays) : null,\n                values.saltAmount ? Number(values.saltAmount) : null,\n                values.comments?.trim() ? values.comments.trim() : null,\n              ],\n              filter: [['id', '=', Number(item.id)]],\n            } as any,\n          );\n          if (!updateLabResponse.success) {\n            throw new Error(\n              updateLabResponse.message || 'Error al actualizar el reporte',\n            );\n          }\n          showToast('Reporte actualizado correctamente.', 'success');\n        } else {\n          const facilityType = resolveFacilityTypeFromTable(tableParam as string);\n          const insertResponse = await insertLabReportRecord({\n            date_created: now,\n            date_updated: now,\n            edition_number: 1,\n            activity_id: item.activity_id,\n            user_id: item.user_id,\n            facility_id: 0,\n            facility_type: facilityType,\n            facility_type_view: facilityTypeView ?? `${facilityType}_0`,\n            daily_report_id: item.id,\n            result_date: resultDateTime,\n            api: values.api ? Number(values.api) : null,\n            ays: values.ays ? Number(values.ays) : null,\n            salt_amount: values.saltAmount ? Number(values.saltAmount) : null,\n            comments: values.comments?.trim() ? values.comments.trim() : null,\n          });\n          if (!insertResponse.success) {\n            throw new Error(\n              insertResponse.message || 'Error al guardar el resultado',\n            );\n          }\n          const updateResponse = await markReportAsAnalyzed(tableParam as string, item.id);\n          if (!updateResponse.success) {\n            throw new Error(\n              updateResponse.message || 'Error al actualizar el estado',\n            );\n          }\n          showToast('Resultado guardado correctamente.', 'success');\n        }\n        setTimeout(() => {\n          navigation.navigate?.('LabReportsHome');\n        }, 1500);\n      } catch (error) {\n        console.error('Error al guardar el resultado:', error);\n        showToast('Ocurrió un error al guardar el resultado.', 'error');\n      } finally {\n        setSubmitting(false);\n      }\n    },\n    [facilityTypeView, isEditMode, item, navigation, showToast, tableParam, can],\n  );\n\n  if (loading) {\n    return (\n      <View style={styles.center}>\n        <LoadingSpinner size=\"large\" color={accentColor} />\n        <Text style={styles.loadingText}>Cargando reporte...</Text>\n      </View>\n    );\n  }\n\n  if (permissionDenied) {\n    return (\n      <View style={styles.center}>\n        <Text style={styles.emptyIcon}>🔒</Text>\n        <Text style={styles.emptyTitle}>Acceso restringido</Text>\n        <Text style={styles.emptyText}>\n          {isEditMode\n            ? 'Solo el dueño del reporte o un administrador puede editarlo.'\n            : 'No tenés permisos para cargar el análisis de este reporte.'}\n        </Text>\n        <TouchableOpacity\n          style={[styles.backButtonBase, styles.secondaryButton, styles.backButton]}\n          onPress={() => navigation.goBack?.()}\n        >\n          <Text style={styles.secondaryButtonText}>Volver</Text>\n        </TouchableOpacity>\n      </View>\n    );\n  }\n\n  if (!item) {\n    return (\n      <View style={styles.center}>\n        <Text style={styles.emptyIcon}>🧪</Text>\n        <Text style={styles.emptyTitle}>No se encontró el reporte</Text>\n        <Text style={styles.emptyText}>Intenta nuevamente desde la lista.</Text>\n      </View>\n    );\n  }\n\n  return (\n    <KeyboardAvoidingView\n      style={styles.screen}\n      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n      keyboardVerticalOffset={70}\n    >\n      <ScrollView\n        style={styles.container}\n        contentContainerStyle={{ paddingBottom: insets.bottom }}\n      >\n        <LinearGradient\n          colors={['#2563EB', '#9333EA']}\n          start={{ x: 0, y: 0 }}\n          end={{ x: 1, y: 1 }}\n          style={styles.hero}\n        >\n          <Text style={styles.heroTitle}>\n            {isEditMode ? 'Editar resultados' : 'Cargar resultados'}\n          </Text>\n          <Text style={styles.heroSubtitle}>\n            Reporte #{item.id} • {installationType}\n          </Text>\n          <Text style={styles.heroLine}>{facilityName}</Text>\n          <Text style={styles.heroLine}>\n            Reporte generado el:{' '}\n            {item?.date_created\n              ? dayjs(item.date_created).format('DD/MM/YYYY HH:mm')\n              : 'N/A'}\n          </Text>\n        </LinearGradient>\n\n        <View style={styles.block}>\n          <Text style={styles.blockTitle}>Fecha y hora del resultado</Text>\n          <View style={styles.row}>\n            <View style={styles.flex1}>\n              <Controller\n                control={control}\n                name=\"resultDate\"\n                rules={{ required: true }}\n                render={({ field: { value, onChange } }) => (\n                  <DatePicker\n                    label=\"Fecha\"\n                    value={value}\n                    onChange={onChange}\n                    required\n                  />\n                )}\n              />\n            </View>\n            <View style={styles.spacer} />\n            <View style={styles.flex1}>\n              <Controller\n                control={control}\n                name=\"resultTime\"\n                render={({ field: { value, onChange } }) => (\n                  <TimePicker\n                    label=\"Hora\"\n                    value={value}\n                    onChange={onChange}\n                    required\n                  />\n                )}\n              />\n            </View>\n          </View>\n        </View>\n\n        <View style={styles.block}>\n          <Text style={styles.blockTitle}>Resultados</Text>\n          <Controller\n            control={control}\n            name=\"api\"\n            render={({ field: { value, onChange } }) => (\n              <NumericField label=\"°API\" value={value} onChange={onChange} />\n            )}\n          />\n          <View style={styles.fieldSpacer} />\n          <Controller\n            control={control}\n            name=\"ays\"\n            rules={{ required: true }}\n            render={({ field: { value, onChange } }) => (\n              <NumericField\n                label=\"% AyS\"\n                value={value}\n                onChange={onChange}\n                required\n              />\n            )}\n          />\n          {!watchAys ? (\n            <Text style={styles.errorText}>Este campo es obligatorio</Text>\n          ) : null}\n          <View style={styles.fieldSpacer} />\n          <Controller\n            control={control}\n            name=\"saltAmount\"\n            render={({ field: { value, onChange } }) => (\n              <NumericField\n                label=\"Cantidad de Sal (PTB)\"\n                value={value}\n                onChange={onChange}\n              />\n            )}\n          />\n          <View style={styles.fieldSpacer} />\n          <Controller\n            control={control}\n            name=\"comments\"\n            render={({ field: { value, onChange } }) => (\n              <View>\n                <Text style={styles.label}>Comentarios</Text>\n                <TextInput\n                  style={styles.textArea}\n                  value={value}\n                  onChangeText={onChange}\n                  placeholder=\"Escribe comentarios adicionales\"\n                  multiline\n                  numberOfLines={4}\n                />\n              </View>\n            )}\n          />\n        </View>\n      </ScrollView>\n\n      <View style={[styles.footer]}>\n        <TouchableOpacity\n          style={[styles.button, styles.secondaryButton]}\n          onPress={() => navigation.goBack?.()}\n          disabled={submitting}\n        >\n          <Text style={styles.secondaryButtonText}>Cancelar</Text>\n        </TouchableOpacity>\n        <TouchableOpacity\n          style={[\n            styles.button,\n            styles.primaryButton,\n            {\n              backgroundColor: accentColor,\n              opacity: submitting || !isValid ? 0.7 : 1,\n            },\n          ]}\n          onPress={handleSubmit(handleSave)}\n          disabled={submitting || !isValid}\n        >\n          <Text style={styles.primaryButtonText}>\n            {submitting ? 'Guardando...' : 'Guardar'}\n          </Text>\n        </TouchableOpacity>\n      </View>\n    </KeyboardAvoidingView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  screen: { flex: 1, backgroundColor: '#F3F4F6' },\n  container: { flex: 1, padding: 16, paddingBottom: 0 },\n  center: {\n    flex: 1,\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: '#FFFFFF',\n    gap: 12,\n  },\n  loadingText: { color: '#6B7280' },\n  emptyIcon: { fontSize: 48 },\n  emptyTitle: { fontSize: 16, color: '#374151', fontWeight: '600' },\n  emptyText: {\n    fontSize: 14,\n    color: '#6B7280',\n    textAlign: 'center',\n    paddingHorizontal: 24,\n  },\n  hero: {\n    borderRadius: 20,\n    padding: 20,\n    marginBottom: 16,\n  },\n  heroTitle: { color: '#fff', fontSize: 24, fontWeight: '800' },\n  heroSubtitle: { color: '#DBEAFE', fontSize: 16, marginTop: 6 },\n  heroLine: { color: '#BFDBFE', fontSize: 14, marginTop: 4 },\n  block: {\n    backgroundColor: '#fff',\n    borderRadius: 14,\n    padding: 16,\n    marginBottom: 16,\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n  },\n  blockTitle: {\n    fontSize: 14,\n    fontWeight: '700',\n    color: '#111827',\n    marginBottom: 12,\n  },\n  row: { flexDirection: 'row', alignItems: 'center' },\n  flex1: { flex: 1 },\n  spacer: { width: 12 },\n  fieldSpacer: { height: 16 },\n  errorText: { color: '#DC2626', fontSize: 12, marginTop: 4 },\n  label: { fontSize: 14, color: '#6B7280', marginBottom: 6 },\n  textArea: {\n    borderWidth: 1,\n    borderColor: '#D1D5DB',\n    borderRadius: 10,\n    minHeight: 96,\n    padding: 12,\n    backgroundColor: '#FFFFFF',\n    textAlignVertical: 'top',\n  },\n  footer: {\n    flexDirection: 'row',\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    gap: 12,\n    backgroundColor: '#FFFFFF',\n    borderTopWidth: 1,\n    borderTopColor: '#E5E7EB',\n  },\n  button: {\n    flex: 1,\n    borderRadius: 12,\n    paddingVertical: 14,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  backButtonBase: {\n    borderRadius: 12,\n    paddingVertical: 14,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  primaryButton: {\n    shadowColor: '#0F172A',\n    shadowOpacity: 0.15,\n    shadowRadius: 6,\n    shadowOffset: { width: 0, height: 3 },\n  },\n  primaryButtonText: { color: '#FFFFFF', fontSize: 16, fontWeight: '700' },\n  secondaryButton: {\n    borderWidth: 1,\n    borderColor: '#9CA3AF',\n    backgroundColor: '#FFFFFF',\n  },\n  secondaryButtonText: {\n    color: '#111827',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n  backButton: {\n    marginTop: 12,\n    minWidth: 140,\n    paddingHorizontal: 24,\n    alignSelf: 'center',\n    flexGrow: 0,\n    flexShrink: 1,\n  },\n});\n","import LabActiveFormComponent from './LabActiveForm';\n\nexport default function LabActiveFormScreen(props: any) {\n  return <LabActiveFormComponent {...props} />;\n}\n","\"use strict\";\nfunction _array_like_to_array(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nexports._ = _array_like_to_array;\n","\"use strict\";\nfunction _array_with_holes(arr) {\n    if (Array.isArray(arr)) return arr;\n}\nexports._ = _array_with_holes;\n","\"use strict\";\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nexports._ = _interop_require_default;\n","\"use strict\";\nfunction _iterable_to_array_limit(arr, i) {\n    var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n    if (_i == null) return;\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _s, _e;\n    try {\n        for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n            _arr.push(_s.value);\n            if (i && _arr.length === i) break;\n        }\n    } catch (err) {\n        _d = true;\n        _e = err;\n    } finally{\n        try {\n            if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n        } finally{\n            if (_d) throw _e;\n        }\n    }\n    return _arr;\n}\nexports._ = _iterable_to_array_limit;\n","\"use strict\";\nfunction _non_iterable_rest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexports._ = _non_iterable_rest;\n","\"use strict\";\nvar _array_with_holes = require(\"./_array_with_holes.cjs\");\nvar _iterable_to_array_limit = require(\"./_iterable_to_array_limit.cjs\");\nvar _non_iterable_rest = require(\"./_non_iterable_rest.cjs\");\nvar _unsupported_iterable_to_array = require(\"./_unsupported_iterable_to_array.cjs\");\nfunction _sliced_to_array(arr, i) {\n    return _array_with_holes._(arr) || _iterable_to_array_limit._(arr, i) || _unsupported_iterable_to_array._(arr, i) || _non_iterable_rest._();\n}\nexports._ = _sliced_to_array;\n","\"use strict\";\nvar _array_like_to_array = require(\"./_array_like_to_array.cjs\");\nfunction _unsupported_iterable_to_array(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _array_like_to_array._(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(n);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array._(o, minLen);\n}\nexports._ = _unsupported_iterable_to_array;\n","import type { Action, Scope } from \"../types/raw\";\nimport type {\n  InternalAccessControl,\n  NormalizedRole,\n  NormalizedResource,\n} from \"../types/internal\";\n\nconst ACTIONS: readonly Action[] = [\"view\", \"create\", \"edit\", \"delete\"];\n\nconst denyAll = (): NormalizedResource => ({\n  view: \"none\",\n  create: \"none\",\n  edit: \"none\",\n  delete: \"none\",\n});\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n  typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isScope = (value: unknown): value is Scope =>\n  value === \"all\" || value === \"own\" || value === \"none\";\n\nconst parseResource = (raw: unknown): NormalizedResource => {\n  const result = denyAll();\n  if (!isPlainObject(raw)) return result;\n  for (const action of ACTIONS) {\n    const candidate = raw[action];\n    if (isScope(candidate)) {\n      result[action] = candidate;\n    }\n  }\n  return result;\n};\n\nconst parseRole = (rawRole: Record<string, unknown>): NormalizedRole => {\n  const resources = new Map<string, NormalizedResource>();\n  let wildcard: NormalizedResource | null = null;\n  let isAdmin = false;\n\n  for (const [key, value] of Object.entries(rawRole)) {\n    if (key === \"*\") {\n      if (value === \"all\") {\n        isAdmin = true;\n        continue;\n      }\n      wildcard = parseResource(value);\n      continue;\n    }\n    resources.set(key, parseResource(value));\n  }\n\n  return {\n    isAdmin,\n    resources,\n    wildcard: wildcard ?? denyAll(),\n  };\n};\n\n/**\n * Normalizes raw `CORE_CONFIG.accessControl` JSON into a typed internal model.\n *\n * Returns `null` if the basic shape is invalid (`ownerField` missing or not a string,\n * `roles` missing or not an object). The resolver treats `null` as deny-all (fail-closed).\n *\n * Individual roles with invalid shape are silently discarded (skipping one does not\n * compromise the others). Resources with missing actions are filled with `\"none\"`.\n *\n * The only package entry point aware of the external JSON shape. If a second shape\n * appears in the future for another flavor, this is the only file that changes.\n *\n * @param raw The raw JSON to normalize, typically `CORE_CONFIG.accessControl`.\n * @returns The normalized internal model, or `null` if the basic shape is invalid.\n */\nexport const parseAccessControl = (\n  raw: unknown,\n): InternalAccessControl | null => {\n  if (!isPlainObject(raw)) return null;\n\n  const { ownerField, roles } = raw;\n  if (typeof ownerField !== \"string\" || ownerField.length === 0) return null;\n  if (!isPlainObject(roles)) return null;\n\n  const normalizedRoles = new Map<string, NormalizedRole>();\n  for (const [roleName, rawRole] of Object.entries(roles)) {\n    if (!isPlainObject(rawRole)) continue;\n    normalizedRoles.set(roleName, parseRole(rawRole));\n  }\n\n  return {\n    ownerField,\n    roles: normalizedRoles,\n  };\n};\n","import React from \"react\";\nimport { StyleSheet, Text, View } from \"react-native\";\n\nexport interface AccessRestrictedProps {\n  /** Mensaje custom; si se omite, se muestra uno genérico. */\n  message?: string;\n  /** Título principal; default: \"Acceso restringido\". */\n  title?: string;\n}\n\n/**\n * Pantalla genérica para deep links a MFEs sin permiso.\n *\n * Pensada para usarse como fallback de `<Can>` o como early return de un navigator\n * cuando un `useCan` o `useCanResolver` devuelve `false` a nivel screen.\n */\nexport function AccessRestricted({\n  title = \"Acceso restringido\",\n  message = \"No tenés permisos para acceder a esta sección.\",\n}: AccessRestrictedProps): React.ReactElement {\n  return (\n    <View style={styles.container}>\n      <Text style={styles.icon}>🔒</Text>\n      <Text style={styles.title}>{title}</Text>\n      <Text style={styles.message}>{message}</Text>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    padding: 24,\n    backgroundColor: \"#f9fafb\",\n  },\n  icon: { fontSize: 56, marginBottom: 16 },\n  title: { fontSize: 20, fontWeight: \"700\", color: \"#111827\", marginBottom: 8 },\n  message: { fontSize: 15, color: \"#6B7280\", textAlign: \"center\" },\n});\n","import React from \"react\";\nimport { useCan } from \"../hooks/useCan\";\nimport type { Action } from \"../types/raw\";\n\nexport interface CanProps {\n  resource: string;\n  action: Action;\n  record?: Record<string, unknown>;\n  /** Contenido a renderizar si el usuario PUEDE realizar la acción. */\n  children: React.ReactNode;\n  /** Opcional. Contenido a renderizar si el usuario NO puede. Por defecto, no se renderiza nada. */\n  fallback?: React.ReactNode;\n}\n\n/**\n * Wrapper declarativo de `useCan`. Renderiza `children` solo si el usuario puede\n * realizar la acción; sino, renderiza `fallback` (o nada).\n *\n * Útil para visibilidad condicional de botones, secciones y rutas:\n *\n * ```tsx\n * <Can resource=\"report\" action=\"delete\" record={report}>\n *   <DeleteButton onPress={...} />\n * </Can>\n * ```\n */\nexport function Can({\n  resource,\n  action,\n  record,\n  children,\n  fallback = null,\n}: CanProps): React.ReactElement | null {\n  const allowed = useCan(resource, action, record);\n  return <>{allowed ? children : fallback}</>;\n}\n","import { useAuth, useConfig } from \"@data-oil-front/core-host\";\nimport { resolvePermission } from \"../resolver/resolvePermission\";\nimport type { Action } from \"../types/raw\";\n\n/**\n * Hook React para chequear si el usuario actual puede realizar `action` sobre `resource`.\n *\n * Re-evalúa automáticamente cuando cambia el config (vía `useSyncExternalStore`\n * dentro de `useConfig`) o el usuario (vía `AuthContext`). Cero infraestructura\n * adicional necesaria — solo importarlo desde un MFE.\n *\n * @param resource Nombre del recurso tal como aparece en `accessControl.roles[role][resource]`.\n * @param action  `\"view\" | \"create\" | \"edit\" | \"delete\"`.\n * @param record  Opcional. Objeto que contiene el campo de ownership configurado\n *                en `accessControl.ownerField`. Necesario solo cuando el scope es `\"own\"`.\n * @returns `true` si el usuario puede; `false` si no, o si todavía estamos hidratando.\n */\nexport function useCan(\n  resource: string,\n  action: Action,\n  record?: Record<string, unknown>,\n): boolean {\n  const { config, hydrated, status } = useConfig();\n  const { user } = useAuth();\n\n  const rawAccessControl = (\n    config as { CORE_CONFIG?: { accessControl?: unknown } }\n  ).CORE_CONFIG?.accessControl;\n\n  return resolvePermission({\n    rawAccessControl,\n    user,\n    hydrated,\n    status,\n    resource,\n    action,\n    record,\n  });\n}\n","import { useAuth, useConfig } from \"@data-oil-front/core-host\";\nimport { useCallback, useMemo } from \"react\";\nimport { parseAccessControl } from \"../adapter/parseAccessControl\";\nimport { canAccess } from \"../resolver/canAccess\";\nimport type { Action } from \"../types/raw\";\n\nexport type CanCheck = (\n  resource: string,\n  action: Action,\n  record?: Record<string, unknown>,\n) => boolean;\n\n/**\n * Variante de `useCan` que devuelve una función reutilizable.\n *\n * Útil cuando hay que chequear permisos sobre múltiples records en iteración\n * (por ejemplo, dentro de un `.map()` o un helper que arma acciones por fila).\n * Las reglas de hooks de React prohíben llamar a `useCan` adentro de un loop —\n * en esos casos, llamá a `useCanResolver` UNA vez a top-level y reusá la función\n * devuelta por cada item.\n *\n * El parseo del `accessControl` se memoiza por referencia del config, así que\n * iterar sobre cientos de records solo paga el cost del lookup en los Maps internos.\n *\n * Fail-closed bajo los mismos guards que `useCan` (config no hidratado, status no\n * success, usuario null, o accessControl no parseable).\n */\nexport function useCanResolver(): CanCheck {\n  const { config, hydrated, status } = useConfig();\n  const { user } = useAuth();\n\n  const accessControl = useMemo(() => {\n    const raw = (config as { CORE_CONFIG?: { accessControl?: unknown } })\n      .CORE_CONFIG?.accessControl;\n    return parseAccessControl(raw);\n  }, [config]);\n\n  return useCallback(\n    (resource, action, record) => {\n      if (!hydrated || status !== \"success\" || !user || !accessControl) {\n        return false;\n      }\n      return canAccess({\n        accessControl,\n        userRoles: user.roles.flatMap((r) => r.tags.map((t) => t.tag_name)),\n        userId: user.id,\n        resource,\n        action,\n        record,\n      });\n    },\n    [accessControl, hydrated, status, user],\n  );\n}\n","// @data-oil-front/mfe-permissions — public barrel.\n// IMPORTANTE: este paquete NO se importa desde el host ni desde core-host.\n// Ver README.md para el detalle de la regla y los guardrails.\n\nexport type {\n  Action,\n  Scope,\n  RawAccessControl,\n  RawRole,\n  RawResource,\n  RawRoleValue,\n} from \"./types/raw\";\n\nexport { useCan } from \"./hooks/useCan\";\nexport { useCanResolver, type CanCheck } from \"./hooks/useCanResolver\";\nexport { Can, type CanProps } from \"./components/Can\";\nexport {\n  AccessRestricted,\n  type AccessRestrictedProps,\n} from \"./components/AccessRestricted\";\n","import type { Action } from \"../types/raw\";\nimport type { InternalAccessControl } from \"../types/internal\";\n\nexport interface CanAccessArgs {\n  accessControl: InternalAccessControl;\n  userRoles: string[];\n  userId: string;\n  resource: string;\n  action: Action;\n  record?: Record<string, unknown>;\n}\n\n/**\n * Resolver puro de permisos. Determina si un usuario con uno o más roles puede\n * realizar `action` sobre `resource`, opcionalmente teniendo en cuenta la ownership\n * de un `record`.\n *\n * Reglas:\n * - Multi-rol: el resolver itera todos los roles del usuario. Si cualquiera habilita\n *   la acción, devuelve `true` (más permisivo gana). El orden no importa.\n * - Rol con `isAdmin: true` (atajo `\"*\": \"all\"`) → fast-path: retorna `true` inmediatamente.\n * - Resource no listado en el rol → cae al `wildcard` del rol.\n * - Scope `\"all\"` → permite.\n * - Scope `\"own\"` → permite solo si `record[ownerField] === userId`. Sin `record`, deniega\n *   (no se puede determinar ownership).\n * - Scope `\"none\"` → deniega para ese rol, pero otro rol del usuario podría habilitar.\n * - Rol no listado en `accessControl.roles` → se ignora (no contribuye al OR).\n *\n * Función pura, sin efectos. No depende de React ni del runtime — testeable en aislamiento.\n */\nexport const canAccess = ({\n  accessControl,\n  userRoles,\n  userId,\n  resource,\n  action,\n  record,\n}: CanAccessArgs): boolean => {\n  for (const roleName of userRoles) {\n    const role = accessControl.roles.get(roleName);\n    if (!role) continue;\n\n    if (role.isAdmin) return true;\n\n    const resourceConfig = role.resources.get(resource) ?? role.wildcard;\n    const scope = resourceConfig[action];\n\n    if (scope === \"all\") return true;\n    if (scope === \"own\") {\n      if (!record) continue;\n      if (record[accessControl.ownerField] === userId) return true;\n    }\n  }\n  return false;\n};\n","import type { useAuth } from \"@data-oil-front/core-host\";\nimport { parseAccessControl } from \"../adapter/parseAccessControl\";\nimport { canAccess } from \"./canAccess\";\nimport type { Action } from \"../types/raw\";\n\nexport type ConfigStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\n// El barrel de `core-host` hoy no re-exporta `User` directamente.\n// Derivamos el tipo via inferencia del retorno público de `useAuth` para no depender\n// de paths internos del package.\nexport type AuthUser = NonNullable<ReturnType<typeof useAuth>[\"user\"]>;\n\nexport interface ResolvePermissionArgs {\n  rawAccessControl: unknown;\n  user: AuthUser | null;\n  hydrated: boolean;\n  status: ConfigStatus;\n  resource: string;\n  action: Action;\n  record?: Record<string, unknown>;\n}\n\n/**\n * Lógica pura del hook `useCan`, extraída para poder testearse sin React.\n *\n * Aplica los siguientes guards en orden, fail-closed:\n * 1. Config no hidratado → false (estamos arrancando, no sabemos qué permisos hay).\n * 2. Config con status distinto a \"success\" → false (fetch fallido o en curso).\n * 3. Usuario null → false (logueado fuera, no hay quién pueda hacer nada).\n * 4. accessControl no parseable → false (JSON inválido del backend).\n *\n * Si todos los guards pasan, delega en `canAccess`.\n */\nexport function resolvePermission({\n  rawAccessControl,\n  user,\n  hydrated,\n  status,\n  resource,\n  action,\n  record,\n}: ResolvePermissionArgs): boolean {\n  if (!hydrated) return false;\n  if (status !== \"success\") return false;\n  if (!user) return false;\n\n  const accessControl = parseAccessControl(rawAccessControl);\n  if (!accessControl) return false;\n\n  return canAccess({\n    accessControl,\n    userRoles: user.roles.flatMap((r) => r.tags.map((t) => t.tag_name)),\n    userId: user.id,\n    resource,\n    action,\n    record,\n  });\n}\n"],"names":["LabActiveForm","parseNumberParam","value","parsed","Number","isFinite","clientConfig","routeFromHook","useRoute","navigationFromHook","useNavigation","params","RouteParams","route","navigation","can","useCanResolver","isEditMode","mode","reportIdParam","id","labReportIdParam","labReportId","tableParam","table","useState","loading","setLoading","setItem","facilities","setFacilities","submitting","setSubmitting","permissionDenied","setPermissionDenied","insets","useSafeAreaInsets","accentColor","configService","getCurrentConfig","primaryColor","initialNowRef","useRef","Date","formatTwoDigits","toString","padStart","initialTimeRef","current","getHours","getMinutes","defaultValues","resultDate","resultTime","api","ays","saltAmount","comments","control","handleSubmit","formState","isValid","useForm","reset","watchAys","useWatch","name","showToast","useCallback","message","type","Toast","show","text1","text2","loadData","Promise","all","fetchFacilitiesList","fetchLabReportById","fetchPendingReportById","facilitiesList","report","user_id","result_date","dayjs","parsedDate","toDate","parsedTime","hour","minute","String","salt_amount","error","useEffect","facilityTypeView","useMemo","item","resolved","getFacilityIdFromActiveReport","resolveFacilityTypeFromTable","facilityName","getFacilityName","installationType","getInstallationType","handleSave","values","selectedDate","split","hours","minutes","pad","val","Math","max","min","hh","mm","resultDateTime","getFullYear","getMonth","getDate","now","format","updateLabResponse","submitReportWithOfflineFallback","TABLE_NAMES","LAB_REPORT","verb","API_VERBS","UPDATE","fields","edition_number","trim","filter","success","Error","facilityType","insertResponse","insertLabReportRecord","date_created","date_updated","activity_id","facility_id","facility_type","facility_type_view","daily_report_id","updateResponse","markReportAsAnalyzed","setTimeout","navigate","console","View","style","styles","center","LoadingSpinner","size","color","Text","loadingText","emptyIcon","emptyTitle","emptyText","TouchableOpacity","backButtonBase","secondaryButton","backButton","onPress","goBack","secondaryButtonText","KeyboardAvoidingView","screen","behavior","Platform","OS","keyboardVerticalOffset","ScrollView","container","contentContainerStyle","paddingBottom","bottom","colors","start","x","y","end","hero","heroTitle","heroSubtitle","heroLine","block","blockTitle","row","flex1","Controller","rules","required","render","field","onChange","DatePicker","label","spacer","TimePicker","NumericField","fieldSpacer","errorText","TextInput","textArea","onChangeText","placeholder","multiline","numberOfLines","footer","button","disabled","primaryButton","backgroundColor","opacity","primaryButtonText","StyleSheet","create","flex","padding","alignItems","justifyContent","gap","fontSize","fontWeight","textAlign","paddingHorizontal","borderRadius","marginBottom","marginTop","borderWidth","borderColor","flexDirection","width","height","minHeight","textAlignVertical","paddingVertical","borderTopWidth","borderTopColor","shadowColor","shadowOpacity","shadowRadius","shadowOffset","minWidth","alignSelf","flexGrow","flexShrink","LabActiveFormScreen","props","exports","_","arr","len","length","i","arr2","Array","isArray","obj","__esModule","default","_i","Symbol","iterator","_s","_e","_arr","_n","_d","call","next","done","push","err","TypeError","_array_with_holes","_iterable_to_array_limit","_non_iterable_rest","_unsupported_iterable_to_array","_array_like_to_array","o","minLen","n","Object","prototype","slice","constructor","from","test","parseAccessControl","ACTIONS","isPlainObject","isScope","parseResource","raw","result","view","edit","delete","action","candidate","parseRole","rawRole","resources","Map","wildcard","isAdmin","entries","key","set","ownerField","roles","normalizedRoles","roleName","AccessRestricted","title","icon","Can","resource","record","children","fallback","allowed","useCan","useConfig","config","hydrated","status","useAuth","user","rawAccessControl","CORE_CONFIG","accessControl","resolvePermission","canAccess","userRoles","flatMap","r","tags","map","t","tag_name","userId","role","get","scope"],"mappings":"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"}