From 23450bb6d050b9b9a515c4ede3a19ba3929e44de Mon Sep 17 00:00:00 2001 From: DH V2 Date: Mon, 14 Sep 2026 19:25:20 -0300 Subject: [PATCH] fix(field): repair installation creation and streamline mobile form --- android-app/app/build.gradle.kts | 4 +-- .../dhinspeccion/ui/ModernVisitRoot.kt | 29 +++++++++++++++--- .../drawable/ic_mendoza_launcher_exact.webp | Bin 6634 -> 8374 bytes .../dhinspeccion/ReleaseMetadataTest.kt | 4 +-- api-v3/src/asset-master/assets.service.ts | 1 + .../dto/create-field-discovery.dto.ts | 4 +++ .../field-inventory.service.ts | 1 + api-v3/test/unit/f5-android-test-cut.test.ts | 19 ++++++++++-- web-v2/index.html | 1 + web-v2/public/favicon.webp | Bin 0 -> 8374 bytes 10 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 web-v2/public/favicon.webp diff --git a/android-app/app/build.gradle.kts b/android-app/app/build.gradle.kts index 93e0d54..f8093e2 100644 --- a/android-app/app/build.gradle.kts +++ b/android-app/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "com.korexlabs.dhinspeccion" minSdk = 26 targetSdk = 36 - versionCode = 33 - versionName = "0.19.5" + versionCode = 34 + versionName = "0.19.6" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/android-app/app/src/main/java/com/korexlabs/dhinspeccion/ui/ModernVisitRoot.kt b/android-app/app/src/main/java/com/korexlabs/dhinspeccion/ui/ModernVisitRoot.kt index d6cf377..e1420d6 100644 --- a/android-app/app/src/main/java/com/korexlabs/dhinspeccion/ui/ModernVisitRoot.kt +++ b/android-app/app/src/main/java/com/korexlabs/dhinspeccion/ui/ModernVisitRoot.kt @@ -63,6 +63,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment +import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager @@ -778,6 +779,11 @@ private fun ModernFieldInventoryScreen(model: MainViewModel, onBack: () -> Unit) enabled = !model.busy, modifier = Modifier.fillMaxWidth().menuAnchor(MenuAnchorType.PrimaryEditable), singleLine = true, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardActions = KeyboardActions(onNext = { + familyExpanded = false + focusManager.moveFocus(FocusDirection.Down) + }), ) ExposedDropdownMenu( expanded = familyExpanded && !model.busy, @@ -818,9 +824,11 @@ private fun ModernFieldInventoryScreen(model: MainViewModel, onBack: () -> Unit) value = name, onValueChange = { name = it }, label = { Text("Nombre técnico *") }, - supportingText = { Text("Usá la denominación técnica del elemento. El código DH se genera automáticamente.") }, + placeholder = { Text("Denominación técnica") }, modifier = Modifier.fillMaxWidth(), singleLine = true, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardActions = KeyboardActions(onNext = { focusManager.moveFocus(FocusDirection.Down) }), ) OutlinedTextField( value = commonName, @@ -828,17 +836,24 @@ private fun ModernFieldInventoryScreen(model: MainViewModel, onBack: () -> Unit) label = { Text("Nombre habitual (opcional)") }, modifier = Modifier.fillMaxWidth(), singleLine = true, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardActions = KeyboardActions(onNext = { focusManager.moveFocus(FocusDirection.Down) }), ) OutlinedTextField( value = description, onValueChange = { description = it }, label = { Text("Descripción (opcional)") }, - supportingText = { Text("Dato equivalente al alta desde el panel web.") }, modifier = Modifier.fillMaxWidth(), - minLines = 2, + singleLine = true, + keyboardOptions = KeyboardOptions(imeAction = if (editableAttributes.isEmpty()) ImeAction.Done else ImeAction.Next), + keyboardActions = KeyboardActions( + onNext = { focusManager.moveFocus(FocusDirection.Down) }, + onDone = { keyboard?.hide(); focusManager.clearFocus() }, + ), ) - editableAttributes.forEach { definition -> + editableAttributes.forEachIndexed { index, definition -> + val isLastAttribute = index == editableAttributes.lastIndex OutlinedTextField( value = attributeValues[definition.code].orEmpty(), onValueChange = { attributeValues[definition.code] = it }, @@ -849,8 +864,14 @@ private fun ModernFieldInventoryScreen(model: MainViewModel, onBack: () -> Unit) }, keyboardOptions = KeyboardOptions( keyboardType = if (definition.dataType.uppercase() in setOf("NUMBER", "DECIMAL", "INTEGER", "FLOAT")) KeyboardType.Decimal else KeyboardType.Text, + imeAction = if (isLastAttribute) ImeAction.Done else ImeAction.Next, + ), + keyboardActions = KeyboardActions( + onNext = { focusManager.moveFocus(FocusDirection.Down) }, + onDone = { keyboard?.hide(); focusManager.clearFocus() }, ), modifier = Modifier.fillMaxWidth(), + singleLine = true, ) } diff --git a/android-app/app/src/main/res/drawable/ic_mendoza_launcher_exact.webp b/android-app/app/src/main/res/drawable/ic_mendoza_launcher_exact.webp index 7dfd9bed2aa47a81ba0311690baad0a5c6b9f9a2..f59e5c397278801fb00f3649d8a89e7d7a68398e 100644 GIT binary patch literal 8374 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 literal 6634 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 diff --git a/android-app/app/src/test/java/com/korexlabs/dhinspeccion/ReleaseMetadataTest.kt b/android-app/app/src/test/java/com/korexlabs/dhinspeccion/ReleaseMetadataTest.kt index 7bc4636..fe1b198 100644 --- a/android-app/app/src/test/java/com/korexlabs/dhinspeccion/ReleaseMetadataTest.kt +++ b/android-app/app/src/test/java/com/korexlabs/dhinspeccion/ReleaseMetadataTest.kt @@ -8,8 +8,8 @@ class ReleaseMetadataTest { @Test fun debugBuildKeepsSeparateApplicationIdentity() { assertEquals("com.korexlabs.dhinspeccion.debug", BuildConfig.APPLICATION_ID) - assertEquals(33, BuildConfig.VERSION_CODE) - assertEquals("0.19.5-debug", BuildConfig.VERSION_NAME) + assertEquals(34, BuildConfig.VERSION_CODE) + assertEquals("0.19.6-debug", BuildConfig.VERSION_NAME) } @Test diff --git a/api-v3/src/asset-master/assets.service.ts b/api-v3/src/asset-master/assets.service.ts index f2fb7a4..35ffb14 100644 --- a/api-v3/src/asset-master/assets.service.ts +++ b/api-v3/src/asset-master/assets.service.ts @@ -760,6 +760,7 @@ export class AssetsService { parentId: dto.parentId, operationalAreaId: dto.operationalAreaId, operatorCompanyId: dto.operatorCompanyId, + inventoryFamilyId: dto.inventoryFamilyId ?? null, code: dto.code, name: dto.name, commonName: dto.commonName ?? null, diff --git a/api-v3/src/asset-master/dto/create-field-discovery.dto.ts b/api-v3/src/asset-master/dto/create-field-discovery.dto.ts index afe76d0..d063afa 100644 --- a/api-v3/src/asset-master/dto/create-field-discovery.dto.ts +++ b/api-v3/src/asset-master/dto/create-field-discovery.dto.ts @@ -36,6 +36,10 @@ export class CreateFieldDiscoveryDto { @IsUUID('4') operatorCompanyId!: string; + @IsOptional() + @IsUUID('4') + inventoryFamilyId?: string | null; + @IsOptional() @Transform(({ value }) => typeof value === 'string' && value.trim() ? value.trim() : null) @IsString() diff --git a/api-v3/src/inspection-visits/field-inventory.service.ts b/api-v3/src/inspection-visits/field-inventory.service.ts index eb60a8b..4e9c8cf 100644 --- a/api-v3/src/inspection-visits/field-inventory.service.ts +++ b/api-v3/src/inspection-visits/field-inventory.service.ts @@ -295,6 +295,7 @@ export class FieldInventoryService { operationalAreaId: context.areaId, // Compatibility-only creation snapshot. Membership never depends on it. operatorCompanyId: context.companyId, + inventoryFamilyId: dto.familyId ?? null, description: dto.description ?? null, discoveryNotes: dto.discoveryNotes ?? null, attributes: dto.attributes, diff --git a/api-v3/test/unit/f5-android-test-cut.test.ts b/api-v3/test/unit/f5-android-test-cut.test.ts index 295b560..65512e7 100644 --- a/api-v3/test/unit/f5-android-test-cut.test.ts +++ b/api-v3/test/unit/f5-android-test-cut.test.ts @@ -10,8 +10,8 @@ function mountedRepoFile(path: string): string { test('F6.3 Android test cut targets production API and has a distinct installable debug version', () => { const gradle = mountedRepoFile('android-app/app/build.gradle.kts'); - assert.match(gradle, /versionCode = 33/); - assert.match(gradle, /versionName = "0\.19\.5"/); + assert.match(gradle, /versionCode = 34/); + assert.match(gradle, /versionName = "0\.19\.6"/); assert.match(gradle, /https:\/\/dhv2\.korexlabs\.com\/api\/v3\//); assert.match(gradle, /applicationIdSuffix = "\.debug"/); }); @@ -26,3 +26,18 @@ test('F5/F6.3 field inventory exposes Other families as reviewable choices to An assert.match(service, /AS "isOther"/); assert.match(service, /isOtherFamily: family\.isOther/); }); + + +test('field inventory persists the validated Tipo de instalación in the initial asset insert', () => { + const fieldService = readFileSync( + resolve(process.cwd(), 'src/inspection-visits/field-inventory.service.ts'), + 'utf8', + ); + const assetsService = readFileSync( + resolve(process.cwd(), 'src/asset-master/assets.service.ts'), + 'utf8', + ); + + assert.match(fieldService, /inventoryFamilyId: dto\.familyId \?\? null/); + assert.match(assetsService, /inventoryFamilyId: dto\.inventoryFamilyId \?\? null/); +}); diff --git a/web-v2/index.html b/web-v2/index.html index 10e2225..80d4c8c 100644 --- a/web-v2/index.html +++ b/web-v2/index.html @@ -4,6 +4,7 @@ + DH Inspección V2 diff --git a/web-v2/public/favicon.webp b/web-v2/public/favicon.webp new file mode 100644 index 0000000000000000000000000000000000000000..f59e5c397278801fb00f3649d8a89e7d7a68398e GIT binary patch literal 8374 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 literal 0 HcmV?d00001