diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QHelpContent.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QHelpContent.kt index 9a4f39e..f38d6ef 100644 --- a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QHelpContent.kt +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QHelpContent.kt @@ -27,8 +27,9 @@ import kotlinx.serialization.Serializable *******************************************************************************/ @Serializable data class QHelpContent( - val content: String, - val format: String, + val content: String? = null, // QQQ core now sends summary-only help entries + val summary: String? = null, + val format: String? = null, val roles: Set = emptySet(), val contentAsText: String? = null ) { diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QWidgetMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QWidgetMetaData.kt index 1af3d74..e4245c2 100644 --- a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QWidgetMetaData.kt +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QWidgetMetaData.kt @@ -23,6 +23,7 @@ package com.kingsrook.qqq.frontend.android.core.model.metadata import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement /******************************************************************************* *******************************************************************************/ @@ -30,7 +31,7 @@ import kotlinx.serialization.Serializable data class QWidgetMetaData( val name: String, val label: String? = null, - val icon: QIcon? = null, + val icon: JsonElement? = null, // QQQ core serializes a widget icon as a plain string (e.g. "troubleshoot"); tolerate an object too val type: String, ) { } diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/MetadataDecodingTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/MetadataDecodingTest.kt new file mode 100644 index 0000000..814694f --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/MetadataDecodingTest.kt @@ -0,0 +1,88 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** Current QQQ core serializes widget icons as plain strings and sends + ** summary-only help entries; the decoder must accept those shapes and the + ** older object/content shapes. + *******************************************************************************/ +class MetadataDecodingTest { + private val json = Json { ignoreUnknownKeys = true } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun widgetIconAsStringDecodes() { + val widget = json.decodeFromString("""{"name":"w","type":"table","icon":"troubleshoot"}""") + assertEquals(JsonPrimitive("troubleshoot"), widget.icon) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun widgetIconAsObjectStillDecodes() { + val widget = json.decodeFromString("""{"name":"w","type":"table","icon":{"name":"troubleshoot"}}""") + assertTrue(widget.icon is JsonObject) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun widgetWithoutIconDecodes() { + assertNull(json.decodeFromString("""{"name":"w","type":"table"}""").icon) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun summaryOnlyHelpDecodes() { + val help = json.decodeFromString("""{"summary":"short help","roles":["ALL_SCREENS"]}""") + assertEquals("short help", help.summary) + assertNull(help.content) + assertNull(help.format) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun contentHelpStillDecodes() { + val help = json.decodeFromString("""{"content":"body","format":"TEXT"}""") + assertEquals("body", help.content) + assertEquals("TEXT", help.format) + assertNull(help.summary) + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentEditForm.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentEditForm.kt index 0b93739..f013b3b 100644 --- a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentEditForm.kt +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentEditForm.kt @@ -128,7 +128,7 @@ fun ProcessComponentEditForm(processViewModel: ProcessViewModel, component: QFro OutlinedButton(onClick = { processViewModel.loadRemoteOptions(field) }) { Text("Retry choices") } } semanticFieldHint(field)?.let { Text(it) } - field.helpContents.orEmpty().forEach { Text(it.contentAsText ?: plainText(it.content)) } + field.helpContents.orEmpty().forEach { Text(it.contentAsText ?: it.content?.let { c -> plainText(c) } ?: it.summary.orEmpty()) } } } }