From 181517dc6c276acf4d35b8abf160c5332aba7956 Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Wed, 15 Jul 2026 14:17:21 +0700 Subject: [PATCH 01/10] Remove reference library --- .github/workflows/ci.yml | 23 +- README.md | 6 +- ohs-player-library/build.gradle.kts | 107 ----- .../ohs/player/library/config/ConfigSource.kt | 25 -- .../ohs/player/library/config/ConfigStore.kt | 92 ----- .../library/config/FhirScalarSerializers.kt | 73 ---- .../player/library/config/ViewDefinition.kt | 138 ------- .../ohs/player/library/config/ViewJoinMap.kt | 45 -- .../extractor/FhirPathEngineProvider.kt | 29 -- .../player/library/extractor/FhirPathEval.kt | 140 ------- .../extractor/GenericStateExtractor.kt | 381 ----------------- .../player/library/layout/GridListRenderer.kt | 91 ---- .../library/layout/HorizontalListRenderer.kt | 85 ---- .../library/layout/VerticalListRenderer.kt | 86 ---- .../ohs/player/library/model/SearchResult.kt | 56 --- .../library/registry/LocalViewRegistry.kt | 28 -- .../player/library/registry/ViewRegistry.kt | 221 ---------- .../ohs/player/library/registry/ViewType.kt | 33 -- .../player/library/registry/ViewTypeKey.kt | 34 -- .../library/renderer/ComponentRenderer.kt | 109 ----- .../player/library/renderer/LayoutRenderer.kt | 60 --- .../player/library/scaffold/DetailScaffold.kt | 196 --------- .../player/library/scaffold/ListScaffold.kt | 223 ---------- .../player/library/config/ConfigStoreTest.kt | 94 ----- .../extractor/GenericStateExtractorTest.kt | 391 ------------------ .../library/registry/ViewRegistryTest.kt | 70 ---- .../library/scaffold/DetailScaffoldTest.kt | 90 ---- .../library/scaffold/ListScaffoldTest.kt | 159 ------- settings.gradle.kts | 2 - 29 files changed, 8 insertions(+), 3079 deletions(-) delete mode 100644 ohs-player-library/build.gradle.kts delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigSource.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigStore.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/FhirScalarSerializers.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewDefinition.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewJoinMap.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEngineProvider.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEval.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/GenericStateExtractor.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/GridListRenderer.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/HorizontalListRenderer.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/VerticalListRenderer.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/model/SearchResult.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/LocalViewRegistry.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewRegistry.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewType.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewTypeKey.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/ComponentRenderer.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/LayoutRenderer.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/DetailScaffold.kt delete mode 100644 ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/ListScaffold.kt delete mode 100644 ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/config/ConfigStoreTest.kt delete mode 100644 ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/extractor/GenericStateExtractorTest.kt delete mode 100644 ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/registry/ViewRegistryTest.kt delete mode 100644 ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/DetailScaffoldTest.kt delete mode 100644 ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/ListScaffoldTest.kt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1bed383d..67b8222c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,21 +58,12 @@ jobs: include: - id: jvm label: JVM/Desktop - tasks: >- - :ohs-player-library:jvmTest - :ohs-player-reference-app:jvmTest + tasks: ':ohs-player-reference-app:jvmTest' kotlinDaemonHeap: '-Xmx6g -XX:+UseG1GC' extraArgs: '' - id: android label: Android - # ohs-player-library uses the androidKotlinMultiplatformLibrary - # plugin, which doesn't register `lintDebug` - assembleAndroidMain - # is the closest "compile + verify the Android variant" task it - # exposes. ohs-player-reference-app uses classic androidTarget - # and keeps lintDebug. - tasks: >- - :ohs-player-library:assembleAndroidMain - :ohs-player-reference-app:lintDebug + tasks: ':ohs-player-reference-app:lintDebug' kotlinDaemonHeap: '-Xmx6g -XX:+UseG1GC' extraArgs: '' - id: js @@ -86,14 +77,9 @@ jobs: extraArgs: '' - id: wasm label: Kotlin/Wasm - tasks: >- - :ohs-player-library:wasmJsBrowserTest - :ohs-player-reference-app:wasmJsBrowserTest + tasks: ':ohs-player-reference-app:wasmJsBrowserTest' kotlinDaemonHeap: '-Xmx10g -XX:+UseG1GC' - # Serialize the library + reference-app wasm compiles so they - # don't run concurrently as workers and double the daemon heap - # demand even at 10g. - extraArgs: '--max-workers=1' + extraArgs: '' steps: - uses: actions/checkout@v4 @@ -162,5 +148,4 @@ jobs: - name: Compile + link ${{ matrix.label }} run: | ./gradlew --stacktrace \ - :ohs-player-library:compileKotlin${{ matrix.target }} \ :ohs-player-reference-app:linkDebugFramework${{ matrix.target }} diff --git a/README.md b/README.md index 6464c889..e4a15438 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ cd ohs-player-reference-client-app Code generation is part of compilation. The `ig-codegen` Gradle plugin runs its `generateIgCode` task automatically before Kotlin compilation, so there is no separate generation step. +The OHS Player Reference library lives in its own repository, [`ohs-player-reference-client-library`](https://github.com/ohs-foundation/ohs-player-reference-client-library), and is consumed as the Maven artifact `dev.ohs.player:reference-library:1.0.0-alpha01`. + ### Run | Target | Command | @@ -286,13 +288,13 @@ Adding a field is a configuration change: add a column to the `ViewDefinition`, Run all multiplatform tests: ```shell -./gradlew :ohs-player-library:allTests :ohs-player-reference-app:allTests +./gradlew :ohs-player-reference-app:allTests ``` Run JVM tests only: ```shell -./gradlew :ohs-player-library:jvmTest :ohs-player-reference-app:jvmTest +./gradlew :ohs-player-reference-app:jvmTest ``` ## Deployment diff --git a/ohs-player-library/build.gradle.kts b/ohs-player-library/build.gradle.kts deleted file mode 100644 index 08ec67b9..00000000 --- a/ohs-player-library/build.gradle.kts +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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. - */ -import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl -import org.jetbrains.kotlin.gradle.dsl.JvmTarget - -plugins { - alias(libs.plugins.kotlinMultiplatform) - alias(libs.plugins.androidKotlinMultiplatformLibrary) - alias(libs.plugins.kotlinSerialization) - alias(libs.plugins.composeMultiplatform) - alias(libs.plugins.composeCompiler) - id("spotless-conventions") -} - -kotlin { - // TODO(AGP-9.0): rename `androidLibrary { }` to `android { }` once AGP is upgraded. - androidLibrary { - namespace = "dev.ohs.player.library" - compileSdk = libs.versions.android.compileSdk.get().toInt() - minSdk = libs.versions.android.minSdk.get().toInt() - - compilerOptions { jvmTarget.set(JvmTarget.JVM_11) } - - withHostTest {} - } - - iosArm64() - iosSimulatorArm64() - - jvm() - - js { browser() } - - @OptIn(ExperimentalWasmDsl::class) wasmJs { browser() } - - sourceSets { - commonMain.dependencies { - implementation(libs.kotlinx.serialization.json) - implementation(libs.ohs.fhir.model) - implementation(libs.ohs.fhir.path) - implementation(libs.ionspin.bignum) - implementation(libs.kermit) - implementation(libs.kotlinx.datetime) - implementation(libs.compose.runtime) - implementation(libs.compose.ui) - implementation(libs.compose.foundation) - implementation(libs.compose.material3) - } - commonTest.dependencies { - implementation(libs.kotlin.test) - implementation(libs.compose.uiTest) - implementation(libs.kotlinx.coroutines.test) - } - jvmTest.dependencies { implementation(compose.desktop.currentOs) } - } -} - -// Targets to be skipped on CI until their respective test setups are sorted out. -// Only disabled when CI=true (set by GitHub Actions) so the CI build stays green; -// Local development still runs these so contributors can reproduce and -// fix the underlying failures. -// -// * Kotlin/JS IR backend crashes lowering the generated sealed-interface -// dispatch tables in dev.ohs.fhir:fhir-path (StackOverflow in -// KotlinLikeDumper.visitWhen -> visitElseBranch). Main JS compile is -// fine; only the JS *test* executable lowering trips because the test -// source set actually exercises those types. -// -// * Android host (JVM) tests blow up with NoClassDefFoundError on -// android/app/Activity. -// -// TODO: adopt Compose Multiplatform UI tests (runComposeUiTest) for -// commonTest so these run without a host Android framework. -// -// JVM, iOS, and Wasm tests still run and cover the same logic. -// -// TODO: if a future Kotlin/AGP release renames these tasks, the matching -// predicate silently no-ops and the underlying errors return. -val isCi = providers.environmentVariable("CI").map(String::toBoolean).getOrElse(false) - -if (isCi) { - tasks - .matching { - it.name in - setOf( - "compileTestDevelopmentExecutableKotlinJs", - "compileTestProductionExecutableKotlinJs", - "jsBrowserTest", - "wasmJsBrowserTest", - "testAndroidHostTest", - ) - } - .configureEach { enabled = false } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigSource.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigSource.kt deleted file mode 100644 index 2eecf5ee..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigSource.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.config - -/** - * Supplies the raw config Binary documents the [ConfigStore] indexes. This is the only seam an - * application must implement: in production it fetches from a backend; the reference app reads - * bundled resources. Each returned string is the JSON body of one config Binary. - */ -fun interface ConfigSource { - suspend fun readAll(): List -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigStore.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigStore.kt deleted file mode 100644 index 32e55240..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ConfigStore.kt +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.config - -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import kotlinx.serialization.DeserializationStrategy -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.json.contentOrNull -import kotlinx.serialization.json.jsonObject - -/** - * Plain JSON used to parse authored config resources and decode extracted state rows. FHIR scalar - * types resolve via the `@file:UseSerializers` annotations on the `@Serializable` classes, so no - * contextual `SerializersModule` is needed. `ignoreUnknownKeys` skips the config metadata fields - * (url, title, publisher, …) that the runtime models intentionally omit. - */ -internal val fhirJson: Json = Json { - ignoreUnknownKeys = true - isLenient = true -} - -/** - * A generic store of runtime configuration resources loaded from a [ConfigSource]. - * - * Each resource is any FHIR-style JSON with a `resourceType` — ViewJoinMap, ViewDefinition, or - * anything else an app treats as config (Composition, Questionnaire, …). Resources are indexed by - * `resourceType` + key (the resource's `name`, else `id`, else `url`) and fetched with [get]. The - * store doesn't care where the bytes came from — bundled resources, a server download, etc. — - * that's the [ConfigSource]'s job. Loading is lazy and runs once. - */ -class ConfigStore(private val source: ConfigSource) { - - private val resources = mutableMapOf() - private val decoded = mutableMapOf() - private val mutex = Mutex() - private var loaded = false - - /** - * The resource of [resourceType] identified by [key] (its `name`/`id`/`url`), decoded via - * [deserializer], or `null` if no such resource was provided. Configs are immutable once loaded, - * so decoded results are memoized and reused across calls. - */ - suspend fun get( - resourceType: String, - key: String, - deserializer: DeserializationStrategy, - ): T? = - mutex.withLock { - ensureLoaded() - val resourceKey = indexKey(resourceType, key) - val cacheKey = "$resourceKey|${deserializer.descriptor.serialName}" - if (!decoded.containsKey(cacheKey)) { - decoded[cacheKey] = - resources[resourceKey]?.let { fhirJson.decodeFromJsonElement(deserializer, it) } - } - @Suppress("UNCHECKED_CAST") - decoded[cacheKey] as T? - } - - private suspend fun ensureLoaded() { - if (loaded) return - source.readAll().forEach { index(fhirJson.parseToJsonElement(it).jsonObject) } - loaded = true - } - - private fun index(resource: JsonObject) { - val type = resource.string("resourceType") ?: return - val key = resource.string("name") ?: resource.string("id") ?: resource.string("url") ?: return - resources[indexKey(type, key)] = resource - } - - private fun indexKey(resourceType: String, key: String) = "$resourceType/$key" - - private fun JsonObject.string(field: String): String? = - (this[field] as? JsonPrimitive)?.contentOrNull -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/FhirScalarSerializers.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/FhirScalarSerializers.kt deleted file mode 100644 index 5de8a20c..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/FhirScalarSerializers.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.config - -import com.ionspin.kotlin.bignum.decimal.BigDecimal -import dev.ohs.fhir.model.r4.FhirDate -import dev.ohs.fhir.model.r4.FhirDateTime -import kotlinx.serialization.KSerializer -import kotlinx.serialization.SerializationException -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.json.JsonDecoder -import kotlinx.serialization.json.jsonPrimitive - -/** - * Serializers for the FHIR R4 scalar types that ViewDefinition/ViewConfig values and the generated - * state classes carry. They read each type's canonical representation: a `BigDecimal` from a JSON - * number or string (precision preserved), and `FhirDate`/`FhirDateTime` from their ISO strings. - * - * kotlin-fhir's own model serializers cover these types inside resource models, but they are - * `internal`, so our own `@Serializable` classes still need these. They are attached directly via - * `@file:UseSerializers(...)` on the classes that reference them — no contextual - * `SerializersModule` or specially-configured `Json` is required; a plain `Json` resolves them. - */ -object FhirDecimalSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("decimal", PrimitiveKind.STRING) - - // Read the raw JSON token (number or string) so no precision is lost via Double. - override fun deserialize(decoder: Decoder): BigDecimal = - BigDecimal.parseString((decoder as JsonDecoder).decodeJsonElement().jsonPrimitive.content) - - override fun serialize(encoder: Encoder, value: BigDecimal) = - encoder.encodeString(value.toStringExpanded()) -} - -object FhirDateSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("date", PrimitiveKind.STRING) - - override fun deserialize(decoder: Decoder): FhirDate { - val raw = decoder.decodeString() - return FhirDate.fromString(raw) ?: throw SerializationException("Invalid FhirDate: '$raw'") - } - - override fun serialize(encoder: Encoder, value: FhirDate) = encoder.encodeString(value.toString()) -} - -object FhirDateTimeSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("dateTime", PrimitiveKind.STRING) - - override fun deserialize(decoder: Decoder): FhirDateTime { - val raw = decoder.decodeString() - return FhirDateTime.fromString(raw) - ?: throw SerializationException("Invalid FhirDateTime: '$raw'") - } - - override fun serialize(encoder: Encoder, value: FhirDateTime) = - encoder.encodeString(value.toString()) -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewDefinition.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewDefinition.kt deleted file mode 100644 index 64331103..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewDefinition.kt +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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. - */ -@file:UseSerializers( - FhirDateSerializer::class, - FhirDateTimeSerializer::class, - FhirDecimalSerializer::class, -) - -package dev.ohs.player.library.config - -import com.ionspin.kotlin.bignum.decimal.BigDecimal -import dev.ohs.fhir.model.r4.FhirDate -import dev.ohs.fhir.model.r4.FhirDateTime -import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers - -/** - * Runtime model of a SQL-on-FHIR ViewDefinition — a projection of a FHIR resource into flat rows. - * - * Mirrors the - * [SQL-on-FHIR ViewDefinition](https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition.html): - * `constant`s (FHIRPath variables), `where` filters, and a tree of `select` nodes. Metadata fields - * (url, title, publisher, …) and `column.tag` are not modelled — they don't affect extraction. - */ -@Serializable -data class ViewDefinition( - val resourceType: String = "", - val name: String = "", - val resource: String = "", - val status: String? = null, - val constant: List = emptyList(), - val where: List = emptyList(), - val select: List = emptyList(), -) { - /** - * A named constant usable in FHIRPath expressions via `%name`. Mirrors the full SQL-on-FHIR - * `value[x]` choice; [value] returns whichever variant is set. - */ - @Serializable - data class Constant( - val name: String, - val valueBase64Binary: String? = null, - val valueBoolean: Boolean? = null, - val valueCanonical: String? = null, - val valueCode: String? = null, - val valueDate: FhirDate? = null, - val valueDateTime: FhirDateTime? = null, - val valueDecimal: BigDecimal? = null, - val valueId: String? = null, - val valueInstant: FhirDateTime? = null, - val valueInteger: Int? = null, - val valueInteger64: Long? = null, - val valueOid: String? = null, - val valuePositiveInt: Int? = null, - val valueString: String? = null, - val valueTime: String? = null, - val valueUnsignedInt: Int? = null, - val valueUri: String? = null, - val valueUrl: String? = null, - val valueUuid: String? = null, - ) { - val value: Any? - get() = - valueBoolean - ?: valueInteger - ?: valueInteger64 - ?: valuePositiveInt - ?: valueUnsignedInt - ?: valueDecimal - ?: valueString - ?: valueCode - ?: valueDate - ?: valueDateTime - ?: valueInstant - ?: valueTime - ?: valueUri - ?: valueUrl - ?: valueCanonical - ?: valueId - ?: valueOid - ?: valueUuid - ?: valueBase64Binary - } - - /** A FHIRPath boolean filter on the resource; non-`true` rows are dropped. Clauses are AND-ed. */ - @Serializable data class WhereClause(val path: String) - - /** - * One node of the select tree. Per SQL-on-FHIR, a node may carry [column]s, nested [select] - * nodes, a [forEach]/[forEachOrNull] that re-roots evaluation at each element of a path, and a - * [unionAll] of further select nodes whose rows are concatenated. Columns + nested selects + - * unionAll combine by cross-join. - */ - @Serializable - data class SelectBlock( - val column: List = emptyList(), - val select: List = emptyList(), - val forEach: String? = null, - val forEachOrNull: String? = null, - val unionAll: List = emptyList(), - ) - - /** One output column. [collection] = true yields a `List` field instead of `T?`. */ - @Serializable - data class Column( - val name: String, - val path: String, - val type: String? = null, - val collection: Boolean = false, - val description: String? = null, - ) - - /** - * Every column name the view can produce, walking the whole select tree (for the flat row - * schema). - */ - fun allColumns(): List = select.flatMap { it.collectColumns() } - - private fun SelectBlock.collectColumns(): List = buildList { - addAll(column) - select.forEach { addAll(it.collectColumns()) } - // unionAll branches share one schema, so the first branch defines the columns. - unionAll.firstOrNull()?.let { addAll(it.collectColumns()) } - } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewJoinMap.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewJoinMap.kt deleted file mode 100644 index 764e798c..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/config/ViewJoinMap.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.config - -import kotlinx.serialization.Serializable - -/** - * Runtime model for a ViewJoinMap Binary — stitches one or more [ViewDefinition] projections, each - * sourced from a different scope of a `SearchResult`, into one flat state row per pivot resource. - * - * Downloaded and interpreted at runtime by - * [dev.ohs.player.library.extractor.GenericStateExtractor]. - */ -@Serializable -data class ViewJoinMap( - val resourceType: String = "", - val name: String = "", - val from: String = "", - val resource: String = "", - val view: String = "", - val searchParam: String? = null, - val joins: List = emptyList(), -) { - @Serializable - data class Join( - val view: String, - val from: String, - val resource: String, - val searchParam: String? = null, - val matchKey: String? = null, - ) -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEngineProvider.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEngineProvider.kt deleted file mode 100644 index d23f07b2..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEngineProvider.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.extractor - -import dev.ohs.fhir.fhirpath.FhirPathEngine - -/** - * Shared, lazily-initialized R4 FHIRPath engine. [GenericStateExtractor] uses it by default. - * - * The engine holds mutable evaluation state and is therefore not safe for concurrent evaluation: - * callers sharing this singleton must serialize their use of it (e.g. a single-threaded - * dispatcher). - */ -object FhirPathEngineProvider { - val r4: FhirPathEngine by lazy { FhirPathEngine.forR4() } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEval.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEval.kt deleted file mode 100644 index 53565051..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/FhirPathEval.kt +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.extractor - -import co.touchlab.kermit.Logger -import com.ionspin.kotlin.bignum.decimal.BigDecimal -import dev.ohs.fhir.fhirpath.FhirPathEngine -import dev.ohs.fhir.fhirpath.types.FhirPathDate -import dev.ohs.fhir.fhirpath.types.FhirPathDateTime -import dev.ohs.fhir.fhirpath.types.FhirPathTime -import dev.ohs.fhir.model.r4.FhirDate -import dev.ohs.fhir.model.r4.FhirDateTime - -/** - * Lightweight wrapper around a single FHIRPath evaluation result. - * - * The engine returns scalars as Kotlin types (`Boolean`, `String`, `BigDecimal`, …) and date/time - * values as its own `FhirPathDate`/`FhirPathDateTime`/`FhirPathTime` types. These accessors - * normalise both so callers read a value without casts. - */ -class EvalResult(val raw: Any?) { - val str: String? - get() = - when (raw) { - null -> null - is FhirPathDate -> raw.toFhirString() - is FhirPathDateTime -> raw.toFhirString() - is FhirPathTime -> raw.toFhirString() - else -> raw.toString() - } - - val bool: Boolean? - get() = raw as? Boolean - - val int: Int? - get() = (raw as? Number)?.toInt() - - val long: Long? - get() = (raw as? Number)?.toLong() - - val decimal: BigDecimal? - get() = raw as? BigDecimal - - val date: FhirDate? - get() = - when (raw) { - is FhirDate -> raw - is FhirPathDate -> FhirDate.fromString(raw.toFhirString()) - else -> null - } - - val dateTime: FhirDateTime? - get() = - when (raw) { - is FhirDateTime -> raw - is FhirPathDateTime -> FhirDateTime.fromString(raw.toFhirString()) - else -> null - } -} - -private fun Int.pad2(): String = toString().padStart(2, '0') - -/** Renders a [FhirPathDate] as a FHIR `date` string (`YYYY`, `YYYY-MM`, or `YYYY-MM-DD`). */ -private fun FhirPathDate.toFhirString(): String = buildString { - append(year.toString().padStart(4, '0')) - month?.let { append('-').append(it.pad2()) } - day?.let { append('-').append(it.pad2()) } -} - -/** Renders a [FhirPathTime] as a FHIR `time` string (`HH:MM:SS`). */ -private fun FhirPathTime.toFhirString(): String = buildString { - append(hour.pad2()) - append(':').append((minute ?: 0).pad2()) - append(':').append((second ?: 0.0).toInt().pad2()) -} - -/** Renders a [FhirPathDateTime] as a FHIR `dateTime` string, preserving its precision. */ -private fun FhirPathDateTime.toFhirString(): String = buildString { - append(year.toString().padStart(4, '0')) - month?.let { append('-').append(it.pad2()) } - day?.let { append('-').append(it.pad2()) } - hour?.let { h -> - append('T').append(h.pad2()) - append(':').append((minute ?: 0).pad2()) - second?.let { append(':').append(it.toInt().pad2()) } - utcOffset?.let { append(it.toString()) } - } -} - -/** - * Evaluates [path] against [focus] and returns an [EvalResult] for the first result. - * - * [variables] are accessible in the expression via `%name` syntax (ViewDefinition `constant` - * entries). Swallows evaluation errors — a failed expression returns [EvalResult] wrapping null. - */ -fun FhirPathEngine.eval( - focus: Any?, - path: String, - variables: Map = emptyMap(), -): EvalResult = - EvalResult( - runCatching { - evaluateExpression(expression = path, base = focus, variables = variables).firstOrNull() - } - .onFailure { Logger.e(it) { it.message ?: "Error evaluating expression: $path" } } - .getOrNull() - ) - -/** - * Evaluates [path] against [focus] and returns an [EvalResult] for every element in the result - * collection. Use for columns declared with `collection: true` in a ViewDefinition. - * - * [variables] are accessible in the expression via `%name` syntax. Returns an empty list on - * evaluation error. - */ -fun FhirPathEngine.evalList( - focus: Any?, - path: String, - variables: Map = emptyMap(), -): List = - runCatching { - evaluateExpression(expression = path, base = focus, variables = variables).map { - EvalResult(it) - } - } - .onFailure { Logger.e(it) { it.message ?: "Error evaluating list for the expression: $path" } } - .getOrElse { emptyList() } diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/GenericStateExtractor.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/GenericStateExtractor.kt deleted file mode 100644 index 55e110f5..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/extractor/GenericStateExtractor.kt +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.extractor - -import dev.ohs.fhir.fhirpath.FhirPathEngine -import dev.ohs.fhir.fhirpath.types.FhirPathDate -import dev.ohs.fhir.fhirpath.types.FhirPathDateTime -import dev.ohs.fhir.model.r4.FhirDate -import dev.ohs.fhir.model.r4.FhirDateTime -import dev.ohs.fhir.model.r4.Resource -import dev.ohs.player.library.config.ConfigStore -import dev.ohs.player.library.config.ViewDefinition -import dev.ohs.player.library.config.ViewJoinMap -import dev.ohs.player.library.config.fhirJson -import dev.ohs.player.library.model.SearchResult -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.SerialKind -import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.JsonNull -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.serializer - -/** - * A config-driven extractor used to extract data from FHIR resources to a typed data class. - * - * Given a target state type it derives the config name from that type, resolves the downloaded - * [ViewJoinMap] + its [ViewDefinition]s from the [configStore], interprets them against a - * [SearchResult] — pivots, joins, `where` filters, `forEach`/`forEachOrNull`/`unionAll` expansion - * and constants — into one JSON row per output row, and deserializes each row into the typed state - * using the state's own (compiler-generated) serializer. - * - * Not safe for concurrent use: the underlying [FhirPathEngine] holds mutable evaluation state, so - * callers must serialize calls to [extract] (e.g. confine them to a single-threaded dispatcher). - * [ConfigStore] loading is internally synchronized and may be shared. - */ -class GenericStateExtractor( - private val configStore: ConfigStore, - private val engine: FhirPathEngine = FhirPathEngineProvider.r4, -) { - - /** Extracts every [T] the matching config produces from [result]. */ - suspend inline fun extract(result: SearchResult): List = - extract(result, serializer()) - - @PublishedApi - internal suspend fun extract( - result: SearchResult, - deserializer: KSerializer, - ): List { - // The ViewJoinMap name is the lowercase-first form of the state's simple name minus "State" - // (e.g. PatientAllergyState -> patientAllergy) — the inverse of the codegen naming rule. - val configName = - deserializer.descriptor.serialName - .substringAfterLast('.') - .removeSuffix("State") - .replaceFirstChar { it.lowercase() } - - val joinMap = - configStore.get(VIEW_JOIN_MAP, configName, ViewJoinMap.serializer()) - ?: error("ViewJoinMap '$configName' was not provided to the ConfigStore.") - val pivotView = - configStore.get(VIEW_DEFINITION, joinMap.view, ViewDefinition.serializer()) - ?: error("ViewDefinition '${joinMap.view}' (pivot of '$configName') was not provided.") - val joins = - joinMap.joins.map { join -> - val view = - configStore.get(VIEW_DEFINITION, join.view, ViewDefinition.serializer()) - ?: error("ViewDefinition '${join.view}' (join of '$configName') was not provided.") - join to view - } - - validate(configName, deserializer, pivotView, joinMap, joins.map { it.second }) - - return buildRows(result, pivotView, joinMap, joins).map { - fhirJson.decodeFromJsonElement(deserializer, it) - } - } - - private fun buildRows( - result: SearchResult, - pivotView: ViewDefinition, - joinMap: ViewJoinMap, - joins: List>, - ): List { - val constants = collectConstants(pivotView, joins.map { it.second }) - val pivots = resourcesInScope(joinMap.from, joinMap.resource, joinMap.searchParam, result) - val joinResolvers = - joins.map { (join, view) -> JoinResolver.of(this, result, join, view, constants) } - - return buildList { - for (pivot in pivots) { - if (pivotView.where.any { eval(pivot, it.path, constants).bool != true }) continue - - for (row in viewRows(pivotView.select, pivot, constants)) { - val full = row.toMutableMap() - joinResolvers.forEach { - full.putAll(it.columnsForRow(this@GenericStateExtractor, full, constants)) - } - add(JsonObject(full)) - } - } - } - } - - /** Cross-joins every top-level select node, each evaluated against [focus]. */ - private fun viewRows( - selects: List, - focus: Any?, - constants: Map, - ): List> { - var rows = listOf(emptyMap()) - selects.forEach { node -> rows = crossJoin(rows, selectRows(node, focus, constants)) } - return rows - } - - /** - * Rows produced by one select node, per SQL-on-FHIR: `forEach`/`forEachOrNull` re-root [focus] at - * each element of a path; the node's own columns, its nested selects, and its `unionAll` branches - * combine by cross-join (with `unionAll` branches concatenated first). - */ - private fun selectRows( - node: ViewDefinition.SelectBlock, - focus: Any?, - constants: Map, - ): List> { - val foci: List = - when { - node.forEach != null -> evalList(focus, node.forEach, constants).map { it.raw } - node.forEachOrNull != null -> - evalList(focus, node.forEachOrNull, constants).map { it.raw }.ifEmpty { listOf(null) } - else -> listOf(focus) - } - - return foci.flatMap { element -> - var rows = listOf(columnRow(node.column, element, constants)) - node.select.forEach { child -> rows = crossJoin(rows, selectRows(child, element, constants)) } - if (node.unionAll.isNotEmpty()) { - rows = crossJoin(rows, node.unionAll.flatMap { selectRows(it, element, constants) }) - } - rows - } - } - - /** Evaluates [columns] against [focus] into a single row. */ - private fun columnRow( - columns: List, - focus: Any?, - constants: Map, - ): Map = columns.associate { it.name to columnValue(focus, it, constants) } - - /** - * Resolves the joined resource(s) for one join, computing column values lazily per output row. - */ - private class JoinResolver - private constructor( - private val view: ViewDefinition, - private val matchKey: String?, - private val staticValues: Map, - private val index: Map, - ) { - - fun columnsForRow( - extractor: GenericStateExtractor, - base: Map, - constants: Map, - ): Map { - if (matchKey == null) return staticValues - val joined = (base[matchKey] as? JsonPrimitive)?.asString()?.let { index[it] } - return view.allColumns().associate { col -> - col.name to extractor.columnValue(joined, col, constants) - } - } - - companion object { - fun of( - extractor: GenericStateExtractor, - result: SearchResult, - join: ViewJoinMap.Join, - view: ViewDefinition, - constants: Map, - ): JoinResolver { - val candidates = resourcesInScope(join.from, join.resource, join.searchParam, result) - return if (join.matchKey == null) { - val resource = candidates.firstOrNull() - val values = - view.allColumns().associate { col -> - col.name to extractor.columnValue(resource, col, constants) - } - JoinResolver(view, null, values, emptyMap()) - } else { - val index = buildMap { - candidates.forEach { resource -> - extractor.eval(resource, "id").str?.let { id -> put(id, resource) } - } - } - JoinResolver(view, join.matchKey, emptyMap(), index) - } - } - - private fun JsonPrimitive.asString(): String? = if (this is JsonNull) null else content - } - } - - private fun validate( - configName: String, - deserializer: KSerializer<*>, - pivotView: ViewDefinition, - joinMap: ViewJoinMap, - joinViews: List, - ) { - val descriptor = deserializer.descriptor - val fieldKinds = - (0 until descriptor.elementsCount).associate { - descriptor.getElementName(it) to descriptor.getElementDescriptor(it).kind - } - val producedColumns = pivotView.allColumns() + joinViews.flatMap { it.allColumns() } - - val unexpected = producedColumns.map { it.name }.toSet() - fieldKinds.keys - require(unexpected.isEmpty()) { - "Config '$configName' produces columns $unexpected absent from the generated state ${fieldKinds.keys}. " + - "The provided binaries do not match the generated state." - } - - producedColumns.forEach { col -> - if (col.collection) return@forEach - val required = requiredTypeCategory(fieldKinds[col.name]) ?: return@forEach - require(typeCategory(col.type) == required) { - "Column '${col.name}' in config '$configName' feeds a $required state field but its " + - "ViewDefinition type is '${col.type}'. Declare a matching scalar 'type' so the value is " + - "not decoded as a string." - } - } - - val scalarColumns = producedColumns.filterNot { it.collection }.map { it.name }.toSet() - joinMap.joins.forEach { join -> - val matchKey = join.matchKey ?: return@forEach - require(matchKey in scalarColumns) { - "Join matchKey '$matchKey' in config '$configName' must reference a scalar (non-collection) " + - "column produced by the pivot or an earlier join; produced scalar columns are $scalarColumns." - } - } - } - - /** Evaluates one column against [focus] and returns its JSON cell value (or [JsonNull]). */ - private fun columnValue( - focus: Any?, - col: ViewDefinition.Column, - constants: Map, - ): JsonElement { - if (focus == null) return if (col.collection) JsonArray(emptyList()) else JsonNull - return if (col.collection) { - JsonArray(evalList(focus, col.path, constants).map { scalarValue(it, col.type) }) - } else { - scalarValue(eval(focus, col.path, constants), col.type) - } - } - - /** Maps a single [EvalResult] to a JSON value using the column's FHIR type. */ - private fun scalarValue(result: EvalResult, type: String?): JsonElement = - when (type?.substringAfterLast('/')) { - "boolean" -> JsonPrimitive(result.bool) - "integer", - "positiveInt", - "unsignedInt" -> JsonPrimitive(result.int) - "integer64" -> JsonPrimitive(result.long) - "decimal" -> JsonPrimitive(result.decimal?.toStringExpanded()) - "date" -> JsonPrimitive(result.date?.toString()) - "dateTime", - "instant" -> JsonPrimitive(result.dateTime?.toString()) - else -> JsonPrimitive(result.str) - } - - private fun eval( - focus: Any?, - path: String, - constants: Map = emptyMap(), - ): EvalResult = engine.eval(focus, path, constants) - - private fun evalList( - focus: Any?, - path: String, - constants: Map = emptyMap(), - ): List = engine.evalList(focus, path, constants) - - private companion object { - - const val VIEW_JOIN_MAP = "http://ohs.dev/StructureDefinition/ViewJoinMap" - const val VIEW_DEFINITION = "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition" - - /** - * The scalar category a non-string state field requires, or `null` if a string value is fine. - */ - fun requiredTypeCategory(kind: SerialKind?): String? = - when (kind) { - PrimitiveKind.BOOLEAN -> "boolean" - PrimitiveKind.BYTE, - PrimitiveKind.SHORT, - PrimitiveKind.INT -> "integer" - PrimitiveKind.LONG -> "long" - else -> null - } - - /** The scalar category a ViewDefinition column [type] resolves to, mirroring [scalarValue]. */ - fun typeCategory(type: String?): String? = - when (type?.substringAfterLast('/')) { - "boolean" -> "boolean" - "integer", - "positiveInt", - "unsignedInt" -> "integer" - "integer64" -> "long" - else -> null - } - - /** - * Cartesian product of two row sets (empty if either side is empty — i.e. inner-join - * semantics). - */ - fun crossJoin( - left: List>, - right: List>, - ): List> = left.flatMap { l -> right.map { r -> l + r } } - - fun resourcesInScope( - from: String, - resource: String, - searchParam: String?, - result: SearchResult, - ): List = - when (from) { - "root" -> listOf(result.resource) - "included" -> - if (searchParam != null) result.included?.get(searchParam).orEmpty() - else result.included?.values?.flatten().orEmpty() - "revIncluded" -> - if (searchParam != null) result.revIncluded?.get(resource to searchParam).orEmpty() - else - result.revIncluded - ?.entries - ?.filter { it.key.first == resource } - ?.flatMap { it.value } - .orEmpty() - else -> emptyList() - } - - fun collectConstants( - pivotView: ViewDefinition, - joinViews: List, - ): Map = buildMap { - pivotView.constant.forEach { put(it.name, fhirPathValue(it.value)) } - joinViews.forEach { view -> view.constant.forEach { put(it.name, fhirPathValue(it.value)) } } - } - - /** - * Converts a constant's kotlin-fhir model value to the FHIRPath type the engine expects for a - * `%constant` variable. Date/time models must be the engine's own types to compare against - * extracted fields; numbers, booleans, and strings pass through unchanged. - */ - fun fhirPathValue(value: Any?): Any? = - when (value) { - is FhirDate -> FhirPathDate.fromFhirR4Date(value) - is FhirDateTime -> FhirPathDateTime.fromFhirR4DateTime(value) - else -> value - } - } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/GridListRenderer.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/GridListRenderer.kt deleted file mode 100644 index ff1ed21e..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/GridListRenderer.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.layout - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.grid.items -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import dev.ohs.player.library.registry.ViewType -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.RenderOptions - -/** - * Renders items in a vertically-scrolling `LazyVerticalGrid`. - * - * View-type constants are typically declared once in an `object`; see - * [dev.ohs.player.library.registry.ViewType]. - * - * ``` - * object AppViewTypes { - * val Grid = ViewType("Grid") - * } - * - * registry.registerLayout( - * AppViewTypes.Grid, - * GridListRenderer( - * cells = GridCells.Fixed(2), - * contentPadding = PaddingValues(16.dp), - * itemSpacing = 12.dp, - * ), - * ) - * ``` - * - * @param cells column specification; defaults to two equal columns. - * @param contentPadding padding around the grid content. - * @param itemSpacing gap between items in both axes. - */ -class GridListRenderer( - private val cells: GridCells = GridCells.Fixed(2), - private val contentPadding: PaddingValues = PaddingValues(0.dp), - private val itemSpacing: Dp = 0.dp, -) : LayoutRenderer { - companion object { - /** - * ViewType constant for registering a [GridListRenderer] in the - * [dev.ohs.player.library.registry.ViewRegistry]. - */ - val VIEW_TYPE = ViewType("Grid") - } - - /** Lays out [items] in a `LazyVerticalGrid`, invoking [component] per item with [key]. */ - @Composable - override fun Render( - items: List, - component: ConfiguredRenderer, - key: ((T) -> Any)?, - onItemClick: (T) -> Unit, - modifier: Modifier, - ) { - LazyVerticalGrid( - columns = cells, - modifier = modifier, - contentPadding = contentPadding, - verticalArrangement = Arrangement.spacedBy(itemSpacing), - horizontalArrangement = Arrangement.spacedBy(itemSpacing), - ) { - items(items = items, key = key) { item -> - component.Render(item, RenderOptions(onClick = { onItemClick(item) })) - } - } - } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/HorizontalListRenderer.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/HorizontalListRenderer.kt deleted file mode 100644 index 8c45eba5..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/HorizontalListRenderer.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.layout - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import dev.ohs.player.library.registry.ViewType -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.RenderOptions - -/** - * Renders items horizontally as a `LazyRow`. - * - * View-type constants are typically declared once in an `object`; see - * [dev.ohs.player.library.registry.ViewType]. - * - * ``` - * object AppViewTypes { - * val HorizontalList = ViewType("HorizontalList") - * } - * - * registry.registerLayout( - * AppViewTypes.HorizontalList, - * HorizontalListRenderer( - * contentPadding = PaddingValues(horizontal = 16.dp), - * itemSpacing = 12.dp, - * ), - * ) - * ``` - * - * @param contentPadding padding around the list content. - * @param itemSpacing horizontal gap between items. - */ -class HorizontalListRenderer( - private val contentPadding: PaddingValues = PaddingValues(0.dp), - private val itemSpacing: Dp = 0.dp, -) : LayoutRenderer { - companion object { - /** - * ViewType constant for registering a [HorizontalListRenderer] in the - * [dev.ohs.player.library.registry.ViewRegistry]. - */ - val VIEW_TYPE = ViewType("HorizontalList") - } - - /** Lays out [items] in a `LazyRow`, invoking [component] per item with [key]. */ - @Composable - override fun Render( - items: List, - component: ConfiguredRenderer, - key: ((T) -> Any)?, - onItemClick: (T) -> Unit, - modifier: Modifier, - ) { - LazyRow( - modifier = modifier, - contentPadding = contentPadding, - horizontalArrangement = Arrangement.spacedBy(itemSpacing), - ) { - items(items = items, key = key) { item -> - component.Render(item, RenderOptions(onClick = { onItemClick(item) })) - } - } - } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/VerticalListRenderer.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/VerticalListRenderer.kt deleted file mode 100644 index b9749389..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/layout/VerticalListRenderer.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.layout - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import dev.ohs.player.library.registry.ViewType -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.RenderOptions - -/** - * Renders items vertically as a `LazyColumn`. The default layout for - * [dev.ohs.player.library.scaffold.ListScaffold] when none is specified. - * - * View-type constants are typically declared once in an `object`; see - * [dev.ohs.player.library.registry.ViewType]. - * - * ``` - * object AppViewTypes { - * val VerticalList = ViewType("VerticalList") - * } - * - * registry.registerLayout( - * AppViewTypes.VerticalList, - * VerticalListRenderer( - * contentPadding = PaddingValues(16.dp), - * itemSpacing = 12.dp, - * ), - * ) - * ``` - * - * @param contentPadding padding around the list content (not the items themselves). - * @param itemSpacing vertical gap between items. - */ -class VerticalListRenderer( - private val contentPadding: PaddingValues = PaddingValues(0.dp), - private val itemSpacing: Dp = 0.dp, -) : LayoutRenderer { - companion object { - /** - * ViewType constant for registering a [VerticalListRenderer] in the - * [dev.ohs.player.library.registry.ViewRegistry]. - */ - val VIEW_TYPE = ViewType("VerticalList") - } - - /** Lays out [items] in a `LazyColumn`, invoking [component] per item with [key]. */ - @Composable - override fun Render( - items: List, - component: ConfiguredRenderer, - key: ((T) -> Any)?, - onItemClick: (T) -> Unit, - modifier: Modifier, - ) { - LazyColumn( - modifier = modifier, - contentPadding = contentPadding, - verticalArrangement = Arrangement.spacedBy(itemSpacing), - ) { - items(items = items, key = key) { item -> - component.Render(item, RenderOptions(onClick = { onItemClick(item) })) - } - } - } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/model/SearchResult.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/model/SearchResult.kt deleted file mode 100644 index c2b7925c..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/model/SearchResult.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.model - -import dev.ohs.fhir.model.r4.Resource - -// TODO delete this class as soon as FHIR Engine is integrated -/** - * Stands in for the engine's SearchResult until the KMP migration of kotlin-fhir-engine lands. - * - * Mirrors the engine's search result shape: a primary resource plus side-loaded resources returned - * by forward includes and reverse includes. - * - * Replace [ResourceType] with the engine's actual type and [Resource] with the engine's base - * interface once available. - * - * @param R the FHIR resource type of the primary (pivot) resource. - */ -data class SearchResult( - /** The primary resource returned by the search query. */ - val resource: R, - /** - * Resources returned via forward include (`_include`), keyed by search parameter name. For - * example, `_include=AllergyIntolerance:patient` returns `"patient" → [Patient]`. - */ - val included: Map>? = null, - /** - * Resources returned via reverse include (`_revinclude`), keyed by `Pair(resourceType, - * searchParamName)`. For example, `_revinclude=AllergyIntolerance:patient` with resource type - * `"AllergyIntolerance"` returns `Pair("AllergyIntolerance", "patient") → - * [AllergyIntolerance, ...]`. - */ - val revIncluded: Map, List>? = null, -) - -/** The FHIR resource type name used as a key in [SearchResult.revIncluded]. */ -typealias ResourceType = String - -/** - * The search parameter name used as a key in [SearchResult.included] and - * [SearchResult.revIncluded]. - */ -typealias SearchParamName = String diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/LocalViewRegistry.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/LocalViewRegistry.kt deleted file mode 100644 index b82eff45..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/LocalViewRegistry.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.registry - -import androidx.compose.runtime.staticCompositionLocalOf - -/** - * The active [ViewRegistry] for the composition. Defaults to an empty registry so direct-pass DSL - * paths (e.g. `component(MyRenderer(), MyConfig())`) work without a provider. Provide an app-level - * registry via: - * ``` - * CompositionLocalProvider(LocalViewRegistry provides registry) { ... } - * ``` - */ -val LocalViewRegistry = staticCompositionLocalOf { ViewRegistry() } diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewRegistry.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewRegistry.kt deleted file mode 100644 index d35f1402..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewRegistry.kt +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.registry - -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.withConfig - -/** - * Mutable registry mapping `(ViewType, KClass)` keys to renderers. - * - * Populated at app start (typically inside a `buildAppViewRegistry()` helper) and then installed - * into the composition via [LocalViewRegistry] so scaffolds can resolve renderers by name without - * the screen importing them directly. Lookups throw [NoSuchElementException] on miss with a - * diagnostic message naming the absent key. - * - * View-type constants are typically declared once in an `object`; see [ViewType]. - * - * ``` - * object AppViewTypes { - * val Card = ViewType("Card") - * val VerticalList = ViewType("VerticalList") - * } - * - * val registry = ViewRegistry().apply { - * registerComponent( - * AppViewTypes.Card, PatientCardRenderer(), PatientCardConfig(), - * ) - * registerLayout( - * AppViewTypes.VerticalList, - * VerticalListRenderer(), - * ) - * } - * CompositionLocalProvider(LocalViewRegistry provides registry) { App() } - * ``` - */ -class ViewRegistry { - /** - * Storage entry pairing the original [ComponentRenderer] with its config and the pre-built - * [ConfiguredRenderer] wrapper. [configured] is built once at construction so lookups are O(1) - * and the same wrapper instance is returned on repeated calls. - * - * @param renderer the original renderer, retained for identity / introspection. - * @param config the config baked into [configured]. - */ - @PublishedApi - internal class ComponentEntry( - val renderer: ComponentRenderer, - val config: C, - ) { - /** Bound renderer, ready to invoke without carrying the config type. */ - val configured: ConfiguredRenderer = renderer.withConfig(config) - } - - /** Component entries keyed by [ViewTypeKey]. */ - @PublishedApi internal val components = mutableMapOf, ComponentEntry<*, *>>() - - /** Layout renderers keyed by [ViewTypeKey]. */ - @PublishedApi internal val layouts = mutableMapOf, LayoutRenderer<*>>() - - /** Stores a component entry under [key]. Called by [registerComponent]. */ - @PublishedApi - internal fun putComponent( - key: ViewTypeKey, - renderer: ComponentRenderer, - config: C, - ) { - components[key] = ComponentEntry(renderer, config) - } - - /** Stores a layout renderer under [key]. Called by [registerLayout]. */ - @PublishedApi - internal fun putLayout(key: ViewTypeKey, renderer: LayoutRenderer) { - layouts[key] = renderer - } - - /** - * Returns the cached [ConfiguredRenderer] registered under [key]. - * - * @throws NoSuchElementException if no component is registered for [key]. - */ - @Suppress("UNCHECKED_CAST") - @PublishedApi - internal fun getComponent(key: ViewTypeKey): ConfiguredRenderer = - (components[key] ?: missing("component", key)).configured as ConfiguredRenderer - - /** - * Returns the original [ComponentRenderer] registered under [key], before [withConfig] was - * applied. Intended for identity-based tests and debugging. - * - * @throws NoSuchElementException if no component is registered for [key]. - */ - @Suppress("UNCHECKED_CAST") - @PublishedApi - internal fun getComponentSource(key: ViewTypeKey): ComponentRenderer = - (components[key] ?: missing("component", key)).renderer as ComponentRenderer - - /** - * Returns the [LayoutRenderer] registered under [key]. - * - * @throws NoSuchElementException if no layout is registered for [key]. - */ - @Suppress("UNCHECKED_CAST") - @PublishedApi - internal fun getLayout(key: ViewTypeKey): LayoutRenderer { - val renderer = layouts[key] ?: missing("layout", key) - return renderer as LayoutRenderer - } - - /** Throws a [NoSuchElementException] naming the missing renderer kind and key. */ - private fun missing(kind: String, key: ViewTypeKey<*>): Nothing = - throw NoSuchElementException( - "No $kind renderer registered for " + "(${key.dataType.simpleName}, ${key.viewType.value})." - ) -} - -/** - * Registers [renderer] under [viewType] for data type [T], with [config] baked in. - * - * The same renderer instance can be registered under multiple view-types with different configs to - * vary visual behavior per role. View-type constants are typically declared once in an `object`; - * see [ViewType]. - * - * ``` - * object AppViewTypes { - * val Card = ViewType("Card") - * val PatientHeader = ViewType("PatientHeader") - * } - * - * registry.registerComponent( - * AppViewTypes.Card, PatientCardRenderer(), PatientCardConfig(), - * ) - * registry.registerComponent( - * AppViewTypes.PatientHeader, - * PatientCardRenderer(), - * PatientCardConfig(showLastVisit = false), - * ) - * ``` - */ -inline fun ViewRegistry.registerComponent( - viewType: ViewType, - renderer: ComponentRenderer, - config: C, -) = putComponent(ViewTypeKey(viewType, T::class), renderer, config) - -/** - * Registers [renderer] as the [LayoutRenderer] for [viewType] / data type [T]. - * - * View-type constants are typically declared once in an `object`; see [ViewType]. - * - * ``` - * object AppViewTypes { - * val VerticalList = ViewType("VerticalList") - * } - * - * registry.registerLayout( - * AppViewTypes.VerticalList, - * VerticalListRenderer(contentPadding = PaddingValues(16.dp), itemSpacing = 12.dp), - * ) - * ``` - */ -inline fun ViewRegistry.registerLayout( - viewType: ViewType, - renderer: LayoutRenderer, -) = putLayout(ViewTypeKey(viewType, T::class), renderer) - -/** - * Looks up the bound [ConfiguredRenderer] for [viewType] / data type [T] — the form scaffolds and - * layouts invoke. - * - * ``` - * val renderer = registry.componentRenderer(ViewType("Card")) - * ``` - * - * @throws NoSuchElementException if nothing is registered for the key. - */ -inline fun ViewRegistry.componentRenderer( - viewType: ViewType -): ConfiguredRenderer = getComponent(ViewTypeKey(viewType, T::class)) - -/** - * Looks up the original [ComponentRenderer] (pre-[withConfig]) for [viewType] / data type [T]. - * Useful for identity-based assertions in tests and runtime introspection; not normally needed by - * app code. - * - * ``` - * val original = registry.componentSource(ViewType("Card")) - * assertSame(myRendererInstance, original) - * ``` - * - * @throws NoSuchElementException if nothing is registered for the key. - */ -inline fun ViewRegistry.componentSource( - viewType: ViewType -): ComponentRenderer = getComponentSource(ViewTypeKey(viewType, T::class)) - -/** - * Looks up the [LayoutRenderer] for [viewType] / data type [T]. - * - * ``` - * val layout = registry.layoutRenderer(ViewType("VerticalList")) - * ``` - * - * @throws NoSuchElementException if nothing is registered for the key. - */ -inline fun ViewRegistry.layoutRenderer(viewType: ViewType): LayoutRenderer = - getLayout(ViewTypeKey(viewType, T::class)) diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewType.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewType.kt deleted file mode 100644 index 639802d8..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewType.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.registry - -import kotlin.jvm.JvmInline - -/** - * Opaque string label used to dispatch a renderer for a particular visual role. - * - * Paired with a data-type [kotlin.reflect.KClass] in [ViewTypeKey] to form the registry's lookup - * key. View-types are normally declared once per app as constants. - * - * ``` - * val Card = ViewType("Card") - * val PatientHeader = ViewType("PatientHeader") - * ``` - * - * @param value the underlying identifier; conventionally PascalCase. - */ -@JvmInline value class ViewType(val value: String) diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewTypeKey.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewTypeKey.kt deleted file mode 100644 index 7d4f81c9..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/registry/ViewTypeKey.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.registry - -import kotlin.reflect.KClass - -/** - * Composite lookup key for the [ViewRegistry]: `(view-type × data type)`. - * - * Both dimensions are part of the key so the same [ViewType] name registered for different `T`s - * never collides. Looking up `(Card, PatientView)` and `(Card, MedicationView)` return distinct - * renderers; querying with the wrong `T` throws rather than returning a mismatched renderer. - * - * ``` - * val key = ViewTypeKey(ViewType("Card"), PatientView::class) - * ``` - * - * @param viewType the visual role label. - * @param dataType the Kotlin class of the data model that this renderer handles. - */ -data class ViewTypeKey(val viewType: ViewType, val dataType: KClass) diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/ComponentRenderer.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/ComponentRenderer.kt deleted file mode 100644 index 584f3fa0..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/ComponentRenderer.kt +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.renderer - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -/** - * Groups the presentation-level options passed to every [ComponentRenderer.Render] call. - * - * @param onClick optional tap handler; null means the component is non-interactive. - * @param modifier applied to the root composable of the rendered item. - */ -data class RenderOptions(val modifier: Modifier = Modifier, val onClick: (() -> Unit)? = null) - -/** - * Author-facing renderer for a single item of type [T] using config [C]. - * - * The two type parameters let one renderer class be reused under multiple - * [dev.ohs.player.library.registry.ViewType] registrations with different configs — e.g. a patient - * card rendered both as a list card and as a detail header with `showLastVisit = false`. - * - * ``` - * data class PatientCardConfig(val showLastVisit: Boolean = true) - * - * class PatientCardRenderer : ComponentRenderer { - * @Composable - * override fun Render( - * item: PatientView, - * config: PatientCardConfig, - * options: RenderOptions, - * ) { - * Card(onClick = options.onClick, modifier = options.modifier) { - * Text(item.fullName) - * if (config.showLastVisit) Text(item.lastVisitDate) - * } - * } - * } - * ``` - */ -interface ComponentRenderer { - /** - * Renders [item] with [config] and [options] applied. - * - * @param item the data model instance. - * @param config configuration for this render call. - * @param options presentation options — tap handler and root modifier. - */ - @Composable fun Render(item: T, config: C, options: RenderOptions) -} - -/** - * Renders [item] with [config] and default [RenderOptions] (no click handler, [Modifier]). - * - * Convenience for Kotlin call sites that don't need custom options. - */ -@Composable -fun ComponentRenderer.Render(item: T, config: C) = - Render(item, config, RenderOptions()) - -/** - * A renderer with its config already applied. - * - * Created by [withConfig] when a [ComponentRenderer] is registered with its config, and then - * invoked by scaffolds and layouts during rendering. App code doesn't usually build these by hand — - * author a [ComponentRenderer] instead. - * - * ``` - * // Inside a LayoutRenderer.Render: - * component.Render(item, RenderOptions(onClick = { onItemClick(item) })) - * ``` - */ -fun interface ConfiguredRenderer { - /** - * Renders [item]; the config from registration is already applied. - * - * @param item the data model instance. - * @param options presentation options — tap handler and root modifier. - */ - @Composable fun Render(item: T, options: RenderOptions) -} - -/** - * Captures [boundConfig] in a closure, producing the bound form for registry storage. - * - * Each invocation produces a fresh [ConfiguredRenderer] instance — they are not cached or - * value-equal. Callers needing identity (e.g. for tests) should retrieve the original - * [ComponentRenderer] via [dev.ohs.player.library.registry.componentSource] instead. - */ -@PublishedApi -internal fun ComponentRenderer.withConfig( - boundConfig: C -): ConfiguredRenderer { - val source = this - return ConfiguredRenderer { item, options -> source.Render(item, boundConfig, options) } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/LayoutRenderer.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/LayoutRenderer.kt deleted file mode 100644 index f74d6fd0..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/renderer/LayoutRenderer.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.renderer - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -/** - * Arranges a `List` and delegates per-item rendering to a [ConfiguredRenderer]. - * - * The library ships three implementations — [dev.ohs.player.library.layout.VerticalListRenderer], - * [dev.ohs.player.library.layout.HorizontalListRenderer], and - * [dev.ohs.player.library.layout.GridListRenderer] — but apps can supply their own. - * - * ``` - * class StaggeredRenderer : LayoutRenderer { - * @Composable - * override fun Render(items, component, key, onItemClick, modifier) { - * LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(2), modifier) { - * items(items, key) { item -> - * component.Render(item, { onItemClick(item) }, Modifier) - * } - * } - * } - * } - * ``` - */ -interface LayoutRenderer { - /** - * Lays out [items] using [component] for each entry. - * - * @param items the data to render. - * @param component the bound per-item renderer. - * @param key optional stable key function for the underlying lazy list; non-lazy renderers ignore - * it, and lazy renderers fall back to positional keys when it is `null`. - * @param onItemClick invoked when the user taps an item. - * @param modifier applied to the outer container. - */ - @Composable - fun Render( - items: List, - component: ConfiguredRenderer, - key: ((T) -> Any)? = null, - onItemClick: (T) -> Unit, - modifier: Modifier = Modifier, - ) -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/DetailScaffold.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/DetailScaffold.kt deleted file mode 100644 index 2dc8e7bf..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/DetailScaffold.kt +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.scaffold - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material3.Scaffold -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import dev.ohs.player.library.registry.LocalViewRegistry -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.ViewType -import dev.ohs.player.library.registry.ViewTypeKey -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.RenderOptions -import dev.ohs.player.library.renderer.withConfig -import kotlin.reflect.KClass - -/** - * Builder receiver for [DetailScaffold]. Collects the ordered list of sections plus optional top - * bar and not-found composables. Sections are appended via the `section(...)` overloads and render - * in the order they're declared. - * - * View-type constants are typically declared once in an `object`; see [ViewType]. - * - * ``` - * object AppViewTypes { - * val PersonalSection = ViewType("PersonalSection") - * val MedicalSection = ViewType("MedicalSection") - * } - * - * DetailScaffold(patient) { - * topBar { TopAppBar(title = { Text("Patient") }) } - * notFound { Text("Patient not found") } - * section(AppViewTypes.PersonalSection) - * section(AppViewTypes.MedicalSection) - * } - * ``` - * - * @param registry the registry to resolve view-type-based sections from. - * @param dataType the data class for the detail item, used in registry lookups. - */ -class DetailDslScope -@PublishedApi -internal constructor( - @PublishedApi internal val registry: ViewRegistry, - @PublishedApi internal val dataType: KClass, -) { - /** Sections to render in declared order, each as a bound renderer. */ - @PublishedApi - internal var sections: List> = emptyList() - private set - - /** Optional top bar composable. */ - @PublishedApi internal var topBar: (@Composable () -> Unit)? = null - - /** Composable shown when the detail item is null. */ - @PublishedApi internal var notFound: (@Composable () -> Unit)? = null - - /** - * Appends a pre-built [ComponentRenderer] with its [config] as a section. - * - * ``` - * section(PersonalSectionRenderer(), PersonalSectionConfig) - * ``` - */ - fun section(renderer: ComponentRenderer, config: C) { - sections += renderer.withConfig(config) - } - - /** - * Appends an inline section composable. Use for one-off sections that don't warrant a - * [ComponentRenderer] class. - * - * ``` - * section { patient -> Text("ID: ${patient.id}") } - * ``` - */ - fun section(content: @Composable (T) -> Unit) { - sections += ConfiguredRenderer { item, _ -> content(item) } - } - - /** - * Resolves the section renderer from the registry by [viewType]. - * - * ``` - * section(ViewType("PersonalSection")) - * ``` - */ - fun section(viewType: ViewType) { - sections += registry.getComponent(ViewTypeKey(viewType, dataType)) - } - - /** - * Sets the optional top bar composable. - * - * ``` - * topBar { TopAppBar(title = { Text("Patient") }) } - * ``` - */ - fun topBar(content: @Composable () -> Unit) { - topBar = content - } - - /** - * Sets the composable shown when the detail item is null. - * - * ``` - * notFound { Text("Patient not found") } - * ``` - */ - fun notFound(content: @Composable () -> Unit) { - notFound = content - } -} - -/** - * Scaffold for a single-item detail view of [T]. Null [item] renders the `notFound` composable and - * skips sections; non-null renders sections vertically in declared order inside a `LazyColumn`. - * Sections are read-only — their `onClick` is a no-op. - * - * View-type constants are typically declared once in an `object`; see [ViewType]. - * - * ``` - * object AppViewTypes { - * val PatientHeader = ViewType("PatientHeader") - * val PersonalSection = ViewType("PersonalSection") - * val MedicalSection = ViewType("MedicalSection") - * val ContactSection = ViewType("ContactSection") - * } - * - * val patient by viewModel.patient.collectAsStateWithLifecycle() - * DetailScaffold(item = patient) { - * topBar { TopAppBar(title = { Text(patient?.fullName.orEmpty()) }) } - * notFound { Text("Patient not found") } - * section(AppViewTypes.PatientHeader) - * section(AppViewTypes.PersonalSection) - * section(AppViewTypes.MedicalSection) - * section(AppViewTypes.ContactSection) - * } - * ``` - * - * @param item the detail item; null renders [DetailDslScope.notFound]. - * @param contentPadding padding around the section column. - * @param sectionSpacing vertical gap between sections. - * @param modifier applied to the root scaffold. - * @param builder DSL block configuring sections, top bar, and not-found state. - */ -@Composable -inline fun DetailScaffold( - item: T?, - contentPadding: PaddingValues = PaddingValues(16.dp), - sectionSpacing: Dp = 16.dp, - modifier: Modifier = Modifier, - builder: DetailDslScope.() -> Unit, -) { - val registry = LocalViewRegistry.current - val scope = DetailDslScope(registry, T::class).apply(builder) - Scaffold(modifier = modifier, topBar = scope.topBar ?: {}) { padding -> - if (item == null) { - Box(modifier = Modifier.fillMaxSize().padding(padding), contentAlignment = Alignment.Center) { - scope.notFound?.invoke() - } - } else { - LazyColumn( - modifier = Modifier.fillMaxSize().padding(padding), - contentPadding = contentPadding, - verticalArrangement = Arrangement.spacedBy(sectionSpacing), - ) { - items(scope.sections) { section -> section.Render(item, RenderOptions()) } - } - } - } -} diff --git a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/ListScaffold.kt b/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/ListScaffold.kt deleted file mode 100644 index e4959ac2..00000000 --- a/ohs-player-library/src/commonMain/kotlin/dev/ohs/player/library/scaffold/ListScaffold.kt +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.scaffold - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import dev.ohs.player.library.layout.VerticalListRenderer -import dev.ohs.player.library.registry.LocalViewRegistry -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.ViewType -import dev.ohs.player.library.registry.ViewTypeKey -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.withConfig -import kotlin.reflect.KClass - -/** - * Builder receiver for [ListScaffold]. Holds the chosen component renderer, layout renderer, top - * bar, and empty-state composable. One of the `component(...)` overloads is required; `layout(...)` - * is optional (defaults to [VerticalListRenderer]). - * - * View-type constants are typically declared once in an `object`; see [ViewType]. - * - * ``` - * object AppViewTypes { - * val Card = ViewType("Card") - * val VerticalList = ViewType("VerticalList") - * } - * - * ListScaffold(items = patients, onItemClick = ::onClick, key = { it.id }) { - * component(AppViewTypes.Card) - * layout(AppViewTypes.VerticalList) - * topBar { TopAppBar(title = { Text("Patients") }) } - * emptyState { Text("No patients") } - * } - * ``` - * - * @param registry the registry to resolve view-type-based renderers from. - * @param dataType the data class for the list items, used in registry lookups. - */ -class ListDslScope -@PublishedApi -internal constructor( - @PublishedApi internal val registry: ViewRegistry, - @PublishedApi internal val dataType: KClass, -) { - /** Per-item renderer; must be set via one of the `component(...)` overloads before render. */ - @PublishedApi internal var component: ConfiguredRenderer? = null - - /** Layout renderer; defaults to [VerticalListRenderer] if not set. */ - @PublishedApi internal var layout: LayoutRenderer? = null - - /** Optional top bar composable. */ - @PublishedApi internal var topBar: (@Composable () -> Unit)? = null - - /** Composable shown when the items list is empty. */ - @PublishedApi internal var emptyState: (@Composable () -> Unit)? = null - - /** - * Sets the component renderer from a pre-built [ComponentRenderer] and its [config]. - * - * ``` - * component(PatientCardRenderer(), PatientCardConfig()) - * ``` - */ - fun component(renderer: ComponentRenderer, config: C) { - component = renderer.withConfig(config) - } - - /** - * Sets the component renderer from an inline composable. Use for ad-hoc lists. - * - * ``` - * component { item, onClick -> - * Card(onClick = onClick) { Text(item.fullName) } - * } - * ``` - */ - fun component(content: @Composable (T, onClick: (() -> Unit)?) -> Unit) { - component = ConfiguredRenderer { item, options -> content(item, options.onClick) } - } - - /** - * Resolves the component renderer from the registry by [viewType]. - * - * ``` - * component(ViewType("Card")) - * ``` - */ - fun component(viewType: ViewType) { - component = registry.getComponent(ViewTypeKey(viewType, dataType)) - } - - /** - * Overrides the default vertical layout with [renderer]. - * - * ``` - * layout(GridListRenderer(cells = GridCells.Fixed(2))) - * ``` - */ - fun layout(renderer: LayoutRenderer) { - layout = renderer - } - - /** - * Resolves the layout renderer from the registry by [viewType]. - * - * ``` - * layout(ViewType("HorizontalList")) - * ``` - */ - fun layout(viewType: ViewType) { - layout = registry.getLayout(ViewTypeKey(viewType, dataType)) - } - - /** - * Sets the optional top bar composable. - * - * ``` - * topBar { TopAppBar(title = { Text("Patients") }) } - * ``` - */ - fun topBar(content: @Composable () -> Unit) { - topBar = content - } - - /** - * Sets the composable shown when the items list is empty. - * - * ``` - * emptyState { Text("No patients") } - * ``` - */ - fun emptyState(content: @Composable () -> Unit) { - emptyState = content - } -} - -/** - * Scaffold for a list of [T]. Builds via [ListDslScope]. Empty [items] renders the `emptyState` - * composable and never invokes the layout renderer; non-empty delegates to the chosen - * [LayoutRenderer] (defaults to [VerticalListRenderer]). - * - * View-type constants are typically declared once in an `object`; see [ViewType]. - * - * ``` - * object AppViewTypes { - * val Card = ViewType("Card") - * val VerticalList = ViewType("VerticalList") - * } - * - * val patients by viewModel.patients.collectAsStateWithLifecycle() - * ListScaffold( - * items = patients, - * onItemClick = { onPatientClick(it.id) }, - * key = { it.id }, - * ) { - * component(AppViewTypes.Card) - * layout(AppViewTypes.VerticalList) - * topBar { TopAppBar(title = { Text("Patients") }) } - * emptyState { Text("No patients") } - * } - * ``` - * - * @param items the data list. - * @param onItemClick invoked when the user taps an item. - * @param key stable key function used by the underlying lazy list. - * @param modifier applied to the root scaffold. - * @param builder DSL block configuring component, layout, top bar, and empty state. - */ -@Composable -inline fun ListScaffold( - items: List, - noinline onItemClick: (T) -> Unit, - noinline key: (T) -> Any, - modifier: Modifier = Modifier, - builder: ListDslScope.() -> Unit, -) { - val registry = LocalViewRegistry.current - val scope = ListDslScope(registry, T::class).apply(builder) - val component = - requireNotNull(scope.component) { - "ListScaffold requires component(...) to be called in the builder." - } - val defaultLayout = remember { VerticalListRenderer() } - val layoutRenderer = scope.layout ?: defaultLayout - - Scaffold(modifier = modifier, topBar = scope.topBar ?: {}) { padding -> - if (items.isEmpty()) { - Box(modifier = Modifier.fillMaxSize().padding(padding), contentAlignment = Alignment.Center) { - scope.emptyState?.invoke() - } - } else { - layoutRenderer.Render( - items = items, - component = component, - key = key, - onItemClick = onItemClick, - modifier = Modifier.fillMaxSize().padding(padding), - ) - } - } -} diff --git a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/config/ConfigStoreTest.kt b/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/config/ConfigStoreTest.kt deleted file mode 100644 index 6c80ea5b..00000000 --- a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/config/ConfigStoreTest.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.config - -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNull -import kotlin.test.assertSame -import kotlinx.coroutines.test.runTest -import kotlinx.serialization.Serializable - -class ConfigStoreTest { - - private val viewDefinition = - """ - { "resourceType": "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition", - "name": "PatientSummary", "resource": "Patient", - "select": [{ "column": [{ "name": "patientId", "path": "id" }] }] } - """ - - private val viewJoinMap = - """ - { "resourceType": "http://ohs.dev/StructureDefinition/ViewJoinMap", - "name": "patientSummary", "from": "root", "resource": "Patient", "view": "PatientSummary" } - """ - - // An arbitrary resource the app might also treat as config, keyed by `id`. - private val questionnaire = - """{ "resourceType": "Questionnaire", "id": "intake", "title": "Intake form" }""" - - @Serializable private data class Questionnaire(val id: String, val title: String) - - private fun storeOf(vararg resources: String) = ConfigStore { resources.toList() } - - @Test - fun get_returnsResource_byResourceTypeAndKey() = runTest { - val store = storeOf(viewDefinition, viewJoinMap, questionnaire) - - assertEquals( - "Patient", - store.get(VIEW_DEFINITION, "PatientSummary", ViewDefinition.serializer())?.resource, - ) - assertEquals( - "PatientSummary", - store.get(VIEW_JOIN_MAP, "patientSummary", ViewJoinMap.serializer())?.view, - ) - // The same store serves any resource kind — proving it isn't view-specific. - assertEquals( - "Intake form", - store.get("Questionnaire", "intake", Questionnaire.serializer())?.title, - ) - } - - @Test - fun get_loadsSourceOnce_andMemoizesDecodedResults() = runTest { - var reads = 0 - val store = ConfigStore { - reads++ - listOf(viewDefinition, viewJoinMap) - } - - val first = store.get(VIEW_DEFINITION, "PatientSummary", ViewDefinition.serializer()) - val second = store.get(VIEW_DEFINITION, "PatientSummary", ViewDefinition.serializer()) - store.get(VIEW_JOIN_MAP, "patientSummary", ViewJoinMap.serializer()) - - assertEquals(1, reads) - assertSame(first, second) - } - - @Test - fun get_returnsNull_whenResourceAbsent() = runTest { - val store = storeOf(viewJoinMap) - assertNull(store.get(VIEW_DEFINITION, "PatientSummary", ViewDefinition.serializer())) - assertNull(store.get("Questionnaire", "intake", Questionnaire.serializer())) - } - - private companion object { - const val VIEW_DEFINITION = "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition" - const val VIEW_JOIN_MAP = "http://ohs.dev/StructureDefinition/ViewJoinMap" - } -} diff --git a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/extractor/GenericStateExtractorTest.kt b/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/extractor/GenericStateExtractorTest.kt deleted file mode 100644 index 9e01bbb8..00000000 --- a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/extractor/GenericStateExtractorTest.kt +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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. - */ -@file:UseSerializers( - FhirDateSerializer::class, - FhirDateTimeSerializer::class, - FhirDecimalSerializer::class, -) - -package dev.ohs.player.library.extractor - -import com.ionspin.kotlin.bignum.decimal.BigDecimal -import dev.ohs.fhir.model.r4.FhirDate -import dev.ohs.fhir.model.r4.FhirDateTime -import dev.ohs.fhir.model.r4.Resource -import dev.ohs.player.library.config.ConfigSource -import dev.ohs.player.library.config.ConfigStore -import dev.ohs.player.library.config.FhirDateSerializer -import dev.ohs.player.library.config.FhirDateTimeSerializer -import dev.ohs.player.library.config.FhirDecimalSerializer -import dev.ohs.player.library.model.SearchResult -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFailsWith -import kotlin.test.assertNotNull -import kotlin.test.assertTrue -import kotlinx.coroutines.test.runTest -import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import kotlinx.serialization.json.Json - -@Serializable -private data class PatientAllergyTestState( - val allergyId: String? = null, - val substance: String? = null, - val patientRef: String? = null, - val manifestation: String? = null, - val severity: String? = null, - val patientId: String? = null, - val familyName: String? = null, -) - -@Serializable -private data class PatientTelecomTestState( - val patientId: String? = null, - val telecomSystem: String? = null, - val telecomValue: String? = null, -) - -@Serializable -private data class ScalarTypesTestState( - val active: Boolean? = null, - val birthDate: FhirDate? = null, - val gender: String? = null, -) - -@Serializable private data class DecimalTypesTestState(val longitude: BigDecimal? = null) - -@Serializable private data class DateTimeTypesTestState(val recorded: FhirDateTime? = null) - -@Serializable private data class DecimalConstTestState(val locId: String? = null) - -@Serializable private data class DateConstTestState(val patientId: String? = null) - -class GenericStateExtractorTest { - - private val patient = - """ - { "resourceType": "Patient", "id": "p1", "active": true, "gender": "female", "birthDate": "1990-03-14", - "name": [{ "family": "Diallo", "given": ["Amina"] }], - "telecom": [{ "system": "phone", "value": "555-0100" }, - { "system": "email", "value": "amina@example.org" }] } - """ - - private val activeAllergy = - """ - { "resourceType": "AllergyIntolerance", "id": "ai1", "patient": { "reference": "Patient/p1" }, - "code": { "coding": [{ "display": "Penicillin" }] }, - "clinicalStatus": { "coding": [{ "code": "active" }] }, - "reaction": [{ "manifestation": [{ "coding": [{ "display": "Rash" }] }], "severity": "moderate" }, - { "manifestation": [{ "coding": [{ "display": "Hives" }] }], "severity": "severe" }] } - """ - - private val inactiveAllergy = - """ - { "resourceType": "AllergyIntolerance", "id": "ai2", "patient": { "reference": "Patient/p1" }, - "code": { "coding": [{ "display": "Aspirin" }] }, - "clinicalStatus": { "coding": [{ "code": "inactive" }] }, - "reaction": [{ "manifestation": [{ "coding": [{ "display": "Nausea" }] }], "severity": "mild" }] } - """ - - private val allergyView = - """ - { "resourceType": "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition", - "name": "AllergyView", "resource": "AllergyIntolerance", - "where": [{ "path": "clinicalStatus.coding.where(code = 'active').exists()" }], - "select": [ - { "column": [{ "name": "allergyId", "path": "id" }, - { "name": "substance", "path": "code.coding.display.first()" }, - { "name": "patientRef", "path": "patient.reference.replace('Patient/', '')" }] }, - { "forEach": "reaction", - "column": [{ "name": "manifestation", "path": "manifestation.coding.display.first()" }, - { "name": "severity", "path": "severity" }] } - ] } - """ - - private val patientView = - """ - { "resourceType": "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition", - "name": "PatientView", "resource": "Patient", - "select": [{ "column": [{ "name": "patientId", "path": "id" }, - { "name": "familyName", "path": "name.family.first()" }] }] } - """ - - private val patientAllergyMap = - """ - { "resourceType": "http://ohs.dev/StructureDefinition/ViewJoinMap", - "name": "patientAllergyTest", "from": "revIncluded", "resource": "AllergyIntolerance", "view": "AllergyView", - "joins": [{ "view": "PatientView", "from": "included", "resource": "Patient", - "searchParam": "patient", "matchKey": "patientRef" }] } - """ - - private val telecomView = - """ - { "resourceType": "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition", - "name": "TelecomView", "resource": "Patient", - "select": [ - { "column": [{ "name": "patientId", "path": "id" }] }, - { "unionAll": [ - { "column": [{ "name": "telecomSystem", "path": "telecom.where(system = 'phone').system.first()" }, - { "name": "telecomValue", "path": "telecom.where(system = 'phone').value.first()" }] }, - { "column": [{ "name": "telecomSystem", "path": "telecom.where(system = 'email').system.first()" }, - { "name": "telecomValue", "path": "telecom.where(system = 'email').value.first()" }] } - ] } - ] } - """ - - private val patientTelecomMap = - """ - { "resourceType": "http://ohs.dev/StructureDefinition/ViewJoinMap", - "name": "patientTelecomTest", "from": "root", "resource": "Patient", "view": "TelecomView" } - """ - - private val jsonFormat = Json { ignoreUnknownKeys = true } - - private fun resource(json: String): Resource = - jsonFormat.decodeFromString(Resource.serializer(), json) - - private fun extractorOf(vararg configs: String): GenericStateExtractor = - GenericStateExtractor(ConfigStore(ConfigSource { configs.toList() })) - - @Test - fun extract_appliesWhere_expandsForEach_andDynamicJoins() = runTest { - val p1 = resource(patient) - val result = - SearchResult( - resource = p1, - included = mapOf("patient" to listOf(p1)), - revIncluded = - mapOf( - "AllergyIntolerance" to - "patient" to - listOf(resource(activeAllergy), resource(inactiveAllergy)) - ), - ) - - val states = - extractorOf(allergyView, patientView, patientAllergyMap) - .extract(result) - - // The inactive allergy is dropped by `where`; the active one fans out one row per reaction, - // each carrying the joined patient columns. - assertEquals(2, states.size) - assertEquals(listOf("Rash", "Hives"), states.map { it.manifestation }) - assertEquals(listOf("moderate", "severe"), states.map { it.severity }) - assertEquals(setOf("Penicillin"), states.map { it.substance }.toSet()) - assertEquals(setOf("Diallo"), states.map { it.familyName }.toSet()) - assertEquals(setOf("p1"), states.map { it.patientId }.toSet()) - } - - @Test - fun extract_crossJoinsUnionAll_withAnchorColumns() = runTest { - val p1 = resource(patient) - val result = SearchResult(resource = p1) - - val states = - extractorOf(telecomView, patientTelecomMap).extract(result) - - // unionAll yields one row per telecom system, each cross-joined with the anchor patientId - // column. - assertEquals(2, states.size) - assertEquals(setOf("p1"), states.map { it.patientId }.toSet()) - assertEquals( - setOf("phone" to "555-0100", "email" to "amina@example.org"), - states.map { it.telecomSystem to it.telecomValue }.toSet(), - ) - } - - private val location = - """{ "resourceType": "Location", "id": "loc1", "status": "active", - "position": { "longitude": -122.5, "latitude": 37.7 } }""" - - private val condition = - """{ "resourceType": "Condition", "id": "c1", "subject": { "reference": "Patient/p1" }, - "recordedDate": "2021-06-15T08:30:00Z" }""" - - private fun rootView(name: String, resource: String, vararg columns: String) = - """ - { "resourceType": "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition", - "name": "$name", "resource": "$resource", - "select": [{ "column": [${columns.joinToString(",")}] }] } - """ - - private fun rootMap(name: String, resource: String, view: String) = - """ - { "resourceType": "http://ohs.dev/StructureDefinition/ViewJoinMap", - "name": "$name", "from": "root", "resource": "$resource", "view": "$view" } - """ - - @Test - fun extract_coercesBooleanDateAndStringTypes() = runTest { - val view = - rootView( - "ScalarTypesView", - "Patient", - """{ "name": "active", "path": "active", "type": "boolean" }""", - """{ "name": "birthDate", "path": "birthDate", "type": "date" }""", - """{ "name": "gender", "path": "gender", "type": "code" }""", - ) - val result = SearchResult(resource = resource(patient)) - - val state = - extractorOf(view, rootMap("scalarTypesTest", "Patient", "ScalarTypesView")) - .extract(result) - .single() - - assertEquals(true, state.active) - assertEquals("female", state.gender) - assertNotNull(state.birthDate, "date column must map to a non-null FhirDate") - assertEquals("1990-03-14", state.birthDate.toString()) - } - - @Test - fun extract_coercesDecimalToBigDecimal() = runTest { - val view = - rootView( - "DecimalTypesView", - "Location", - """{ "name": "longitude", "path": "position.longitude", "type": "decimal" }""", - ) - val result = SearchResult(resource = resource(location)) - - val state = - extractorOf(view, rootMap("decimalTypesTest", "Location", "DecimalTypesView")) - .extract(result) - .single() - - assertNotNull(state.longitude, "decimal column must map to a non-null BigDecimal") - assertEquals(BigDecimal.parseString("-122.5"), state.longitude) - } - - @Test - fun extract_coercesDateTimeToFhirDateTime() = runTest { - val view = - rootView( - "DateTimeTypesView", - "Condition", - """{ "name": "recorded", "path": "recordedDate", "type": "dateTime" }""", - ) - val result = SearchResult(resource = resource(condition)) - - val state = - extractorOf(view, rootMap("dateTimeTypesTest", "Condition", "DateTimeTypesView")) - .extract(result) - .single() - - assertNotNull(state.recorded, "dateTime column must map to a non-null FhirDateTime") - assertTrue( - state.recorded.toString().startsWith("2021-06-15"), - "expected recorded to start with 2021-06-15 but was ${state.recorded}", - ) - } - - @Test - fun extract_appliesDecimalConstantInWhere() = runTest { - val view = - """ - { "resourceType": "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition", - "name": "DecimalConstView", "resource": "Location", - "constant": [{ "name": "boundary", "valueDecimal": 0.0 }], - "where": [{ "path": "position.longitude < %boundary" }], - "select": [{ "column": [{ "name": "locId", "path": "id" }] }] } - """ - val map = - """ - { "resourceType": "http://ohs.dev/StructureDefinition/ViewJoinMap", - "name": "decimalConstTest", "from": "root", "resource": "Location", "view": "DecimalConstView" } - """ - val states = - extractorOf(view, map) - .extract(SearchResult(resource = resource(location))) - - // longitude -122.5 < 0.0 the row is kept only if the %boundary decimals compare - assertEquals(listOf("loc1"), states.map { it.locId }) - } - - @Test - fun extract_appliesDateConstantInWhere() = runTest { - val view = - """ - { "resourceType": "https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition", - "name": "DateConstView", "resource": "Patient", - "constant": [{ "name": "cutoff", "valueDate": "2000-01-01" }], - "where": [{ "path": "birthDate < %cutoff" }], - "select": [{ "column": [{ "name": "patientId", "path": "id" }] }] } - """ - val map = - """ - { "resourceType": "http://ohs.dev/StructureDefinition/ViewJoinMap", - "name": "dateConstTest", "from": "root", "resource": "Patient", "view": "DateConstView" } - """ - val states = - extractorOf(view, map).extract(SearchResult(resource = resource(patient))) - - // birthDate 1990-03-14 < 2000-01-01 → kept only if the %cutoff date constant compares - // correctly. - assertEquals(listOf("p1"), states.map { it.patientId }) - } - - @Test - fun extract_fails_whenNonStringColumnHasNoType() = runTest { - val view = - rootView( - "ScalarTypesView", - "Patient", - """{ "name": "active", "path": "active" }""", - """{ "name": "birthDate", "path": "birthDate", "type": "date" }""", - """{ "name": "gender", "path": "gender", "type": "code" }""", - ) - val extractor = extractorOf(view, rootMap("scalarTypesTest", "Patient", "ScalarTypesView")) - - val error = - assertFailsWith { - extractor.extract(SearchResult(resource = resource(patient))) - } - assertTrue( - error.message?.contains("active") == true, - "expected the error to name the untyped boolean column, was: ${error.message}", - ) - } - - @Test - fun extract_fails_whenJoinMatchKeyIsNotAProducedColumn() = runTest { - val badMap = - """ - { "resourceType": "http://ohs.dev/StructureDefinition/ViewJoinMap", - "name": "patientAllergyTest", "from": "revIncluded", "resource": "AllergyIntolerance", "view": "AllergyView", - "joins": [{ "view": "PatientView", "from": "included", "resource": "Patient", - "searchParam": "patient", "matchKey": "noSuchColumn" }] } - """ - val p1 = resource(patient) - val result = - SearchResult( - resource = p1, - included = mapOf("patient" to listOf(p1)), - revIncluded = mapOf("AllergyIntolerance" to "patient" to listOf(resource(activeAllergy))), - ) - val extractor = extractorOf(allergyView, patientView, badMap) - - val error = - assertFailsWith { - extractor.extract(result) - } - assertTrue( - error.message?.contains("noSuchColumn") == true, - "expected the error to name the bad matchKey, was: ${error.message}", - ) - } -} diff --git a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/registry/ViewRegistryTest.kt b/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/registry/ViewRegistryTest.kt deleted file mode 100644 index 98103843..00000000 --- a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/registry/ViewRegistryTest.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.registry - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.RenderOptions -import kotlin.test.Test -import kotlin.test.assertFailsWith -import kotlin.test.assertSame - -private val FooViewType = ViewType("Foo") - -private data object TestConfig - -private class StringRenderer : ComponentRenderer { - @Composable override fun Render(item: String, config: TestConfig, options: RenderOptions) {} -} - -private class StringLayoutRenderer : LayoutRenderer { - @Composable - override fun Render( - items: List, - component: ConfiguredRenderer, - key: ((String) -> Any)?, - onItemClick: (String) -> Unit, - modifier: Modifier, - ) {} -} - -class ViewRegistryTest { - - @Test - fun registerAndLookup_works_forComponentAndLayout() { - val registry = ViewRegistry() - val component = StringRenderer() - val layout = StringLayoutRenderer() - - registry.registerComponent(FooViewType, component, TestConfig) - registry.registerLayout(FooViewType, layout) - - assertSame(component, registry.componentSource(FooViewType)) - assertSame(layout, registry.layoutRenderer(FooViewType)) - } - - @Test - fun differentDataType_throwsOnLookup() { - val registry = ViewRegistry() - registry.registerComponent(FooViewType, StringRenderer(), TestConfig) - - // Same view-type value, different T, must throw to prevent silent fallback. - assertFailsWith { registry.componentRenderer(FooViewType) } - } -} diff --git a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/DetailScaffoldTest.kt b/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/DetailScaffoldTest.kt deleted file mode 100644 index 35659192..00000000 --- a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/DetailScaffoldTest.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.scaffold - -import androidx.compose.foundation.text.BasicText as Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertCountEquals -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.onAllNodesWithText -import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.runComposeUiTest -import dev.ohs.player.library.registry.LocalViewRegistry -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.ViewType -import dev.ohs.player.library.registry.registerComponent -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions -import kotlin.test.Test - -private val SectionA = ViewType("SectionA") -private val SectionB = ViewType("SectionB") -private val SectionC = ViewType("SectionC") - -private data object DetailTestConfig - -private class LabeledRenderer(private val label: String) : - ComponentRenderer { - @Composable - override fun Render(item: String, config: DetailTestConfig, options: RenderOptions) { - Text("[$label] $item") - } -} - -@OptIn(ExperimentalTestApi::class) -class DetailScaffoldTest { - - @Test - fun nullItem_showsNotFound_andSkipsSections() = runComposeUiTest { - val registry = - ViewRegistry().apply { registerComponent(SectionA, LabeledRenderer("A"), DetailTestConfig) } - setContent { - CompositionLocalProvider(LocalViewRegistry provides registry) { - DetailScaffold(item = null) { - section(SectionA) - notFound { Text("missing") } - } - } - } - onNodeWithText("missing").assertIsDisplayed() - // The section renderer would emit "[A] x" if invoked; assert no such node exists. - onAllNodesWithText("[A] x").assertCountEquals(0) - } - - @Test - fun sections_renderInDeclaredOrder() = runComposeUiTest { - val registry = - ViewRegistry().apply { - registerComponent(SectionA, LabeledRenderer("A"), DetailTestConfig) - registerComponent(SectionB, LabeledRenderer("B"), DetailTestConfig) - registerComponent(SectionC, LabeledRenderer("C"), DetailTestConfig) - } - setContent { - CompositionLocalProvider(LocalViewRegistry provides registry) { - DetailScaffold(item = "x") { - section(SectionA) - section(SectionB) - section(SectionC) - } - } - } - onNodeWithText("[A] x").assertIsDisplayed() - onNodeWithText("[B] x").assertIsDisplayed() - onNodeWithText("[C] x").assertIsDisplayed() - } -} diff --git a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/ListScaffoldTest.kt b/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/ListScaffoldTest.kt deleted file mode 100644 index dd5a467c..00000000 --- a/ohs-player-library/src/commonTest/kotlin/dev/ohs/player/library/scaffold/ListScaffoldTest.kt +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2026 Open Health Stack Foundation - * - * 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 - * - * http://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 dev.ohs.player.library.scaffold - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.text.BasicText as Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.ui.Modifier -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.runComposeUiTest -import dev.ohs.player.library.registry.LocalViewRegistry -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.ViewType -import dev.ohs.player.library.registry.registerComponent -import dev.ohs.player.library.registry.registerLayout -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.RenderOptions -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFails -import kotlin.test.assertTrue - -private val TextItemViewType = ViewType("TextItem") -private val PlainListViewType = ViewType("PlainList") - -private data object ListTestConfig - -private class TextRenderer : ComponentRenderer { - @Composable - override fun Render(item: String, config: ListTestConfig, options: RenderOptions) { - Text(text = item, modifier = options.modifier.clickable { options.onClick?.invoke() }) - } -} - -private class RecordingLayout : LayoutRenderer { - var renderInvocations = 0 - private set - - @Composable - override fun Render( - items: List, - component: ConfiguredRenderer, - key: ((String) -> Any)?, - onItemClick: (String) -> Unit, - modifier: Modifier, - ) { - renderInvocations++ - Column { - items.forEach { item -> - component.Render(item, RenderOptions(onClick = { onItemClick(item) })) - } - } - } -} - -@OptIn(ExperimentalTestApi::class) -class ListScaffoldTest { - - @Test - fun emptyList_showsEmptyState_andDoesNotInvokeLayout() = runComposeUiTest { - val registry = - ViewRegistry().apply { registerComponent(TextItemViewType, TextRenderer(), ListTestConfig) } - val layout = RecordingLayout() - - setContent { - CompositionLocalProvider(LocalViewRegistry provides registry) { - ListScaffold(items = emptyList(), onItemClick = {}, key = { it }) { - component(TextItemViewType) - layout(layout) - emptyState { Text("nothing here") } - } - } - } - - onNodeWithText("nothing here").assertIsDisplayed() - assertEquals(0, layout.renderInvocations) - } - - @Test - fun rendersItems_andForwardsClicksFromRegistry() = runComposeUiTest { - var clicked: String? = null - val registry = - ViewRegistry().apply { - registerComponent(TextItemViewType, TextRenderer(), ListTestConfig) - registerLayout(PlainListViewType, RecordingLayout()) - } - - setContent { - CompositionLocalProvider(LocalViewRegistry provides registry) { - ListScaffold( - items = listOf("alpha", "beta", "gamma"), - onItemClick = { clicked = it }, - key = { it }, - ) { - component(TextItemViewType) - layout(PlainListViewType) - } - } - } - - onNodeWithText("alpha").assertIsDisplayed() - onNodeWithText("beta").assertIsDisplayed() - onNodeWithText("gamma").assertIsDisplayed() - - onNodeWithText("beta").performClick() - assertEquals("beta", clicked) - } - - @Test - fun omittingLayout_fallsBackToVerticalListRenderer() = runComposeUiTest { - val registry = - ViewRegistry().apply { registerComponent(TextItemViewType, TextRenderer(), ListTestConfig) } - - setContent { - CompositionLocalProvider(LocalViewRegistry provides registry) { - ListScaffold(items = listOf("one", "two"), onItemClick = {}, key = { it }) { - component(TextItemViewType) - } - } - } - - onNodeWithText("one").assertIsDisplayed() - onNodeWithText("two").assertIsDisplayed() - } - - @Test - fun unregisteredViewType_throwsWithDescriptiveMessage() = runComposeUiTest { - val thrown = assertFails { - setContent { - ListScaffold(items = listOf("x"), onItemClick = {}, key = { it }) { - component(TextItemViewType) - } - } - } - val msg = thrown.message.orEmpty() - assertTrue(msg.contains("String"), "Message should mention data type: $msg") - assertTrue(msg.contains(TextItemViewType.value), "Message should mention view type value: $msg") - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index ca1e0db2..1c2bbe77 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -53,5 +53,3 @@ dependencyResolutionManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } include(":ohs-player-reference-app") - -include(":ohs-player-library") From cd6324d4ab5b02a778a2a23c546192239618718a Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Wed, 15 Jul 2026 14:18:44 +0700 Subject: [PATCH 02/10] Use remote dependency --- gradle/libs.versions.toml | 2 ++ ohs-player-reference-app/build.gradle.kts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9be9eb55..abc5e251 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,6 +25,7 @@ navigation-compose = "2.9.2" material3 = "1.10.0-alpha05" kotlinxSerializationJson = "1.11.0" spotless = "8.6.0" +ohsPlayerReferenceLibrary = "1.0.0-alpha01" ohsFhirModel = "1.0.0-beta05" ohsFhirPath = "1.0.0-beta03" kotlinxDatetime = "0.8.0" @@ -59,6 +60,7 @@ kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version kotlinpoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinpoet" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation-compose" } +ohs-player-reference-library = { module = "dev.ohs.player:reference-library", version.ref = "ohsPlayerReferenceLibrary" } ohs-fhir-model = { module = "dev.ohs.fhir:fhir-model", version.ref = "ohsFhirModel" } ohs-fhir-path = { module = "dev.ohs.fhir:fhir-path", version.ref = "ohsFhirPath" } ionspin-bignum = { module = "com.ionspin.kotlin:bignum", version.ref = "ionspin-bignum" } diff --git a/ohs-player-reference-app/build.gradle.kts b/ohs-player-reference-app/build.gradle.kts index 0f1f6903..c14a96cb 100644 --- a/ohs-player-reference-app/build.gradle.kts +++ b/ohs-player-reference-app/build.gradle.kts @@ -58,7 +58,7 @@ kotlin { implementation(libs.androidx.activity.compose) } commonMain.dependencies { - implementation(project(":ohs-player-library")) + implementation(libs.ohs.player.reference.library) implementation(libs.compose.runtime) implementation(libs.compose.foundation) implementation(libs.compose.material) @@ -216,7 +216,7 @@ val composePackageVersion: String = // * Kotlin/JS IR backend crashes lowering the generated sealed-interface dispatch tables in // dev.ohs.fhir:fhir-path (StackOverflow in KotlinLikeDumper). The main JS compile is fine; only // the JS *test* executable lowering trips because the test source set exercises those types. -// Mirrors the same skip in :ohs-player-library. +// Mirrors the same skip in the ohs-player-reference-client-library repo. // // * Android/JVM host unit tests need a host Android framework (NoClassDefFoundError). // From d3bcbb349509ce5c26a473048859eb0ca4e505d5 Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Wed, 15 Jul 2026 14:19:18 +0700 Subject: [PATCH 03/10] Update reference library package --- .../player/codegen/generator/ViewTypeGenerator.kt | 2 +- .../dev/ohs/player/codegen/model/ViewDefinition.kt | 2 +- .../dev/ohs/player/codegen/util/GeneratorUtil.kt | 2 +- .../kotlin/dev/ohs/player/reference/app/App.kt | 2 +- .../dev/ohs/player/reference/app/AppViewRegistry.kt | 2 +- .../dev/ohs/player/reference/app/data/Extraction.kt | 4 ++-- .../app/data/datasource/LocalConfigSource.kt | 2 +- .../reference/app/data/datasource/SampleDataStore.kt | 2 +- .../component/common/SectionCardLayoutRenderer.kt | 6 +++--- .../app/feature/group/list/GroupCardRenderer.kt | 4 ++-- .../app/feature/group/list/GroupListRegistrations.kt | 8 ++++---- .../app/feature/group/list/GroupListScreen.kt | 4 ++-- .../app/feature/group/profile/GroupHeaderRenderer.kt | 4 ++-- .../group/profile/GroupProfileRegistrations.kt | 6 +++--- .../app/feature/group/profile/GroupProfileScreen.kt | 8 ++++---- .../app/feature/group/profile/MemberItemRenderer.kt | 4 ++-- .../app/feature/patient/list/PatientCardRenderer.kt | 4 ++-- .../feature/patient/list/PatientListRegistrations.kt | 12 ++++++------ .../app/feature/patient/list/PatientListScreen.kt | 4 ++-- .../feature/patient/profile/AllergyItemRenderer.kt | 4 ++-- .../patient/profile/AllergyReactionItemRenderer.kt | 4 ++-- .../feature/patient/profile/ConditionItemRenderer.kt | 4 ++-- .../feature/patient/profile/ContactItemRenderer.kt | 4 ++-- .../patient/profile/ImmunizationItemRenderer.kt | 4 ++-- .../patient/profile/MedicationItemRenderer.kt | 4 ++-- .../feature/patient/profile/PatientHeaderRenderer.kt | 4 ++-- .../patient/profile/PatientProfileRegistrations.kt | 6 +++--- .../feature/patient/profile/PatientProfileScreen.kt | 8 ++++---- .../feature/patient/profile/TelecomItemRenderer.kt | 4 ++-- .../ohs/player/reference/app/AppViewRegistryTest.kt | 10 +++++----- .../feature/patient/list/PatientListScreenTest.kt | 2 +- .../patient/profile/PatientProfileScreenTest.kt | 2 +- 32 files changed, 71 insertions(+), 71 deletions(-) diff --git a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt index 2559a663..5f59508f 100644 --- a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt +++ b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt @@ -34,7 +34,7 @@ class ViewTypeGenerator( private val outputDir: File, ) { - private val viewTypeClass = ClassName("dev.ohs.player.library.registry", "ViewType") + private val viewTypeClass = ClassName("dev.ohs.player.reference.library.registry", "ViewType") fun generate(codeSystem: CodeSystem) { FileSpec.builder("$basePackage.$subPackage", codeSystem.name) diff --git a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt index c0db897a..ecc58647 100644 --- a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt +++ b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt @@ -21,7 +21,7 @@ import kotlinx.serialization.Serializable * Codegen view of a ViewDefinition — only the fields code generation needs to derive the typed * state class: the resource and its column tree. Runtime concerns the generator never reads * (`constant`, `where`, `status`, …) are intentionally omitted; the full SQL-on-FHIR model lives in - * the library (`dev.ohs.player.library.config.ViewDefinition`), where extraction uses them. Unknown + * the library (`dev.ohs.player.reference.library.config.ViewDefinition`), where extraction uses them. Unknown * JSON keys are ignored on decode. */ @Serializable diff --git a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt index 71166d18..d5b7755f 100644 --- a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt +++ b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt @@ -29,7 +29,7 @@ private val fhirDateClass = ClassName("dev.ohs.fhir.model.r4", "FhirDate") private val fhirDateTimeClass = ClassName("dev.ohs.fhir.model.r4", "FhirDateTime") private val bigDecimalClass = ClassName("com.ionspin.kotlin.bignum.decimal", "BigDecimal") -private const val SERIALIZER_PKG = "dev.ohs.player.library.config" +private const val SERIALIZER_PKG = "dev.ohs.player.reference.library.config" private val fhirDateSerializer = ClassName(SERIALIZER_PKG, "FhirDateSerializer") private val fhirDateTimeSerializer = ClassName(SERIALIZER_PKG, "FhirDateTimeSerializer") private val fhirDecimalSerializer = ClassName(SERIALIZER_PKG, "FhirDecimalSerializer") diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt index cd57fc18..8fc2e864 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt @@ -24,12 +24,12 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import androidx.savedstate.read -import dev.ohs.player.library.registry.LocalViewRegistry import dev.ohs.player.reference.app.feature.group.list.GroupListScreen import dev.ohs.player.reference.app.feature.group.profile.GroupProfileScreen import dev.ohs.player.reference.app.feature.patient.profile.PatientProfileScreen import dev.ohs.player.reference.app.feature.questionnaire.QuestionnaireHostScreen import dev.ohs.player.reference.app.feature.questionnaire.QuestionnaireIds +import dev.ohs.player.reference.library.registry.LocalViewRegistry import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt index 5751143b..cebae40d 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt @@ -15,11 +15,11 @@ */ package dev.ohs.player.reference.app -import dev.ohs.player.library.registry.ViewRegistry import dev.ohs.player.reference.app.feature.group.list.registerGroupList import dev.ohs.player.reference.app.feature.group.profile.registerGroupProfile import dev.ohs.player.reference.app.feature.patient.list.registerPatientList import dev.ohs.player.reference.app.feature.patient.profile.registerPatientProfile +import dev.ohs.player.reference.library.registry.ViewRegistry fun buildAppViewRegistry(): ViewRegistry = ViewRegistry().apply { diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt index 2ffb2deb..b5168a66 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt @@ -15,9 +15,9 @@ */ package dev.ohs.player.reference.app.data -import dev.ohs.player.library.config.ConfigStore -import dev.ohs.player.library.extractor.GenericStateExtractor import dev.ohs.player.reference.app.data.datasource.LocalConfigSource +import dev.ohs.player.reference.library.config.ConfigStore +import dev.ohs.player.reference.library.extractor.GenericStateExtractor /** * App-wide extraction wiring: the runtime [ConfigStore] (fed by bundled config Binaries) and the diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt index de922a06..f31a0c48 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt @@ -16,7 +16,7 @@ package dev.ohs.player.reference.app.data.datasource import dev.ohs.player.generated.GeneratedConfigManifest -import dev.ohs.player.library.config.ConfigSource +import dev.ohs.player.reference.library.config.ConfigSource import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.Res /** diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt index 607a95aa..b6a15a86 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt @@ -22,10 +22,10 @@ import dev.ohs.fhir.model.r4.Immunization import dev.ohs.fhir.model.r4.MedicationRequest import dev.ohs.fhir.model.r4.Patient import dev.ohs.fhir.model.r4.Resource -import dev.ohs.player.library.model.SearchResult import dev.ohs.player.reference.app.data.AppDependencies import dev.ohs.player.reference.app.data.patientIdFromReference import dev.ohs.player.reference.app.data.repository.FhirRepository +import dev.ohs.player.reference.library.model.SearchResult /** Returns all patient IDs — used by the patient list screen. */ suspend fun allPatientIds( diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt index c1567c98..7b9ddee5 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt @@ -53,9 +53,9 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.SectionCardConfig -import dev.ohs.player.library.renderer.ConfiguredRenderer -import dev.ohs.player.library.renderer.LayoutRenderer -import dev.ohs.player.library.renderer.RenderOptions +import dev.ohs.player.reference.library.renderer.ConfiguredRenderer +import dev.ohs.player.reference.library.renderer.LayoutRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions /** * Layout renderer that wraps a list of items inside a titled section card. Registered under diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt index b705809f..b7b233a3 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt @@ -18,8 +18,8 @@ package dev.ohs.player.reference.app.feature.group.list import androidx.compose.runtime.Composable import dev.ohs.player.generated.config.GroupCardConfig import dev.ohs.player.generated.state.GroupListState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class GroupCardRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt index 3e8e8a4d..2923029d 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt @@ -20,10 +20,10 @@ import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.GroupCardConfig import dev.ohs.player.generated.state.GroupListState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.layout.VerticalListRenderer -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.registerComponent -import dev.ohs.player.library.registry.registerLayout +import dev.ohs.player.reference.library.layout.VerticalListRenderer +import dev.ohs.player.reference.library.registry.ViewRegistry +import dev.ohs.player.reference.library.registry.registerComponent +import dev.ohs.player.reference.library.registry.registerLayout fun ViewRegistry.registerGroupList() { registerComponent( diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt index b2451b4a..76b5544f 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt @@ -37,8 +37,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import dev.ohs.player.generated.state.GroupListState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.layout.VerticalListRenderer -import dev.ohs.player.library.scaffold.ListScaffold +import dev.ohs.player.reference.library.layout.VerticalListRenderer +import dev.ohs.player.reference.library.scaffold.ListScaffold @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt index 1ad51dde..b0de758b 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt @@ -40,9 +40,9 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.GroupHeaderConfig import dev.ohs.player.generated.state.GroupHeaderState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.Chip +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class GroupHeaderRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt index d41c11ec..96fc3c04 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt @@ -23,10 +23,10 @@ import dev.ohs.player.generated.config.SectionCardConfig import dev.ohs.player.generated.state.GroupHeaderState import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.registerComponent -import dev.ohs.player.library.registry.registerLayout import dev.ohs.player.reference.app.feature.component.common.SectionCardLayoutRenderer +import dev.ohs.player.reference.library.registry.ViewRegistry +import dev.ohs.player.reference.library.registry.registerComponent +import dev.ohs.player.reference.library.registry.registerLayout fun ViewRegistry.registerGroupProfile() { registerComponent( diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt index ab432c71..91d63afa 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt @@ -45,10 +45,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel import dev.ohs.player.generated.state.GroupHeaderState import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.registry.LocalViewRegistry -import dev.ohs.player.library.registry.componentRenderer -import dev.ohs.player.library.registry.layoutRenderer -import dev.ohs.player.library.renderer.RenderOptions +import dev.ohs.player.reference.library.registry.LocalViewRegistry +import dev.ohs.player.reference.library.registry.componentRenderer +import dev.ohs.player.reference.library.registry.layoutRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt index 3b992f5b..688d997a 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt @@ -38,10 +38,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.MemberItemConfig import dev.ohs.player.generated.state.GroupMemberState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.Chip import dev.ohs.player.reference.app.feature.patient.list.calculateAge +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.Res import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_child import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_guardian diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt index 856940e7..b94dd55e 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt @@ -18,8 +18,8 @@ package dev.ohs.player.reference.app.feature.patient.list import androidx.compose.runtime.Composable import dev.ohs.player.generated.config.PatientCardConfig import dev.ohs.player.generated.state.PatientSummaryState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class PatientCardRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt index 74e6fc0d..170d1dc0 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt @@ -20,12 +20,12 @@ import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.PatientCardConfig import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.layout.GridListRenderer -import dev.ohs.player.library.layout.HorizontalListRenderer -import dev.ohs.player.library.layout.VerticalListRenderer -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.registerComponent -import dev.ohs.player.library.registry.registerLayout +import dev.ohs.player.reference.library.layout.GridListRenderer +import dev.ohs.player.reference.library.layout.HorizontalListRenderer +import dev.ohs.player.reference.library.layout.VerticalListRenderer +import dev.ohs.player.reference.library.registry.ViewRegistry +import dev.ohs.player.reference.library.registry.registerComponent +import dev.ohs.player.reference.library.registry.registerLayout fun ViewRegistry.registerPatientList() { registerComponent( diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt index af0e696e..14e3e1a5 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt @@ -31,8 +31,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.layout.VerticalListRenderer -import dev.ohs.player.library.scaffold.ListScaffold +import dev.ohs.player.reference.library.layout.VerticalListRenderer +import dev.ohs.player.reference.library.scaffold.ListScaffold @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt index 9650dfe8..31e3bfee 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt @@ -20,10 +20,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import dev.ohs.player.generated.config.AllergyItemConfig import dev.ohs.player.generated.state.PatientAllergyState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class AllergyItemRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt index 4a106c29..fc84540c 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt @@ -27,9 +27,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.AllergyReactionItemConfig import dev.ohs.player.generated.state.AllergyReactionState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.Chip +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class AllergyReactionItemRenderer : ComponentRenderer { diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt index 54196158..49d09bb2 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt @@ -20,10 +20,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import dev.ohs.player.generated.config.ConditionItemConfig import dev.ohs.player.generated.state.PatientConditionState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions private val AmberAccent = Color(0xFFE37400) diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt index 14209486..b4d36a2e 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt @@ -33,9 +33,9 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.ContactItemConfig import dev.ohs.player.generated.state.PatientContactState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.Chip +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class ContactItemRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt index 3e1af976..5f5c27c2 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt @@ -20,10 +20,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import dev.ohs.player.generated.config.ImmunizationItemConfig import dev.ohs.player.generated.state.PatientImmunizationState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class ImmunizationItemRenderer : ComponentRenderer { diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt index 9a557fb1..9d0e0664 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt @@ -20,10 +20,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import dev.ohs.player.generated.config.MedicationItemConfig import dev.ohs.player.generated.state.PatientMedicationState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class MedicationItemRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt index ee136588..40da9608 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt @@ -38,10 +38,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.PatientHeaderConfig import dev.ohs.player.generated.state.PatientSummaryState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions import dev.ohs.player.reference.app.feature.component.common.StatusChip import dev.ohs.player.reference.app.feature.patient.list.calculateAge +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class PatientHeaderRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt index 4a406d7f..7a2e0342 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt @@ -40,10 +40,10 @@ import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.state.PatientTelecomState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.registry.ViewRegistry -import dev.ohs.player.library.registry.registerComponent -import dev.ohs.player.library.registry.registerLayout import dev.ohs.player.reference.app.feature.component.common.SectionCardLayoutRenderer +import dev.ohs.player.reference.library.registry.ViewRegistry +import dev.ohs.player.reference.library.registry.registerComponent +import dev.ohs.player.reference.library.registry.registerLayout fun ViewRegistry.registerPatientProfile() { registerComponent( diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt index 8f9d5115..59b4def2 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt @@ -54,10 +54,10 @@ import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.state.PatientTelecomState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.registry.LocalViewRegistry -import dev.ohs.player.library.registry.componentRenderer -import dev.ohs.player.library.registry.layoutRenderer -import dev.ohs.player.library.renderer.RenderOptions +import dev.ohs.player.reference.library.registry.LocalViewRegistry +import dev.ohs.player.reference.library.registry.componentRenderer +import dev.ohs.player.reference.library.registry.layoutRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt index 80e24bd8..8f8ee02e 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt +++ b/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt @@ -31,8 +31,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.TelecomItemConfig import dev.ohs.player.generated.state.PatientTelecomState -import dev.ohs.player.library.renderer.ComponentRenderer -import dev.ohs.player.library.renderer.RenderOptions +import dev.ohs.player.reference.library.renderer.ComponentRenderer +import dev.ohs.player.reference.library.renderer.RenderOptions class TelecomItemRenderer : ComponentRenderer { @Composable diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt b/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt index 641896a2..07436a85 100644 --- a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt +++ b/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt @@ -23,11 +23,11 @@ import dev.ohs.player.generated.state.PatientImmunizationState import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.library.layout.GridListRenderer -import dev.ohs.player.library.layout.HorizontalListRenderer -import dev.ohs.player.library.layout.VerticalListRenderer -import dev.ohs.player.library.registry.componentRenderer -import dev.ohs.player.library.registry.layoutRenderer +import dev.ohs.player.reference.library.layout.GridListRenderer +import dev.ohs.player.reference.library.layout.HorizontalListRenderer +import dev.ohs.player.reference.library.layout.VerticalListRenderer +import dev.ohs.player.reference.library.registry.componentRenderer +import dev.ohs.player.reference.library.registry.layoutRenderer import kotlin.test.Test class AppViewRegistryTest { diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt b/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt index f1c14211..be01f985 100644 --- a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt +++ b/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt @@ -22,8 +22,8 @@ import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.runComposeUiTest -import dev.ohs.player.library.registry.LocalViewRegistry import dev.ohs.player.reference.app.buildAppViewRegistry +import dev.ohs.player.reference.library.registry.LocalViewRegistry import kotlin.test.Test import kotlin.test.assertEquals diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt b/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt index 27b76225..59b44343 100644 --- a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt +++ b/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt @@ -23,8 +23,8 @@ import androidx.compose.ui.test.hasText import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.runComposeUiTest -import dev.ohs.player.library.registry.LocalViewRegistry import dev.ohs.player.reference.app.buildAppViewRegistry +import dev.ohs.player.reference.library.registry.LocalViewRegistry import kotlin.test.Test import kotlin.test.assertTrue From 26811c255b17c8402b084c465fa37b90726ef4e0 Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Wed, 15 Jul 2026 14:25:08 +0700 Subject: [PATCH 04/10] Update root project naming convention --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 1c2bbe77..7779cb79 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -rootProject.name = "OhsPlayerReferenceClientApp" +rootProject.name = "ohs-player-reference-client-app" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") From d2a31451f32a18c6554f9548fa1dd8f885586190 Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Fri, 17 Jul 2026 09:26:50 +0700 Subject: [PATCH 05/10] Remove redundant comment --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index e4a15438..e1d893eb 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,6 @@ cd ohs-player-reference-client-app Code generation is part of compilation. The `ig-codegen` Gradle plugin runs its `generateIgCode` task automatically before Kotlin compilation, so there is no separate generation step. -The OHS Player Reference library lives in its own repository, [`ohs-player-reference-client-library`](https://github.com/ohs-foundation/ohs-player-reference-client-library), and is consumed as the Maven artifact `dev.ohs.player:reference-library:1.0.0-alpha01`. - ### Run | Target | Command | From 1c89d469808dd6f1aa0b48e8ac8b4f0c88421c65 Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Fri, 17 Jul 2026 09:31:57 +0700 Subject: [PATCH 06/10] Rename ohs-player-reference-app to reference-app --- .github/workflows/ci.yml | 10 ++-- .github/workflows/release.yml | 30 +++++------ README.md | 48 +++++++++--------- iosApp/iosApp.xcodeproj/project.pbxproj | 2 +- .../build.gradle.kts | 0 .../src/androidMain/AndroidManifest.xml | 0 .../ohs/player/reference/app/MainActivity.kt | 0 ...PlatformRepositorySnapshotStore.android.kt | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/androidMain/res/values/strings.xml | 0 .../drawable/compose-multiplatform.xml | 0 .../files/SampleResourcesBundle.json | 0 .../configs/Binary-AllergyItemConfig.json | 0 .../Binary-AllergyReactionItemConfig.json | 0 .../configs/Binary-ConditionItemConfig.json | 0 .../configs/Binary-ContactItemConfig.json | 0 .../files/configs/Binary-GroupCardConfig.json | 0 .../configs/Binary-GroupHeaderConfig.json | 0 .../Binary-ImmunizationItemConfig.json | 0 .../configs/Binary-MedicationItemConfig.json | 0 .../configs/Binary-MemberItemConfig.json | 0 .../configs/Binary-PatientCardConfig.json | 0 .../configs/Binary-PatientHeaderConfig.json | 0 .../configs/Binary-SectionCardConfig.json | 0 .../configs/Binary-TelecomItemConfig.json | 0 .../Questionnaire-HouseholdMembers.json | 0 .../Questionnaire-HouseholdRegistration.json | 0 .../Questionnaire-PatientClinicalData.json | 0 .../files/states/Binary-Allergy.json | 0 .../files/states/Binary-AllergyReaction.json | 0 .../states/Binary-AllergyReactionState.json | 0 .../files/states/Binary-Condition.json | 0 .../files/states/Binary-Group.json | 0 .../files/states/Binary-GroupHeaderState.json | 0 .../files/states/Binary-GroupListState.json | 0 .../files/states/Binary-GroupMemberState.json | 0 .../files/states/Binary-Immunization.json | 0 .../files/states/Binary-Medication.json | 0 .../files/states/Binary-Member.json | 0 .../states/Binary-PatientAllergyState.json | 0 .../states/Binary-PatientConditionState.json | 0 .../files/states/Binary-PatientContact.json | 0 .../states/Binary-PatientContactState.json | 0 .../Binary-PatientImmunizationState.json | 0 .../states/Binary-PatientMedicationState.json | 0 .../files/states/Binary-PatientSummary.json | 0 .../states/Binary-PatientSummaryState.json | 0 .../files/states/Binary-PatientTelecom.json | 0 .../states/Binary-PatientTelecomState.json | 0 .../files/viewtypes/CodeSystem-ViewTypes.json | 0 .../composeResources/values/strings.xml | 0 .../dev/ohs/player/reference/app/App.kt | 0 .../player/reference/app/AppViewRegistry.kt | 0 .../player/reference/app/OhsPlayerTheme.kt | 0 .../reference/app/data/AppDependencies.kt | 0 .../player/reference/app/data/Extraction.kt | 0 .../reference/app/data/FhirReferences.kt | 0 .../app/data/datasource/LocalConfigSource.kt | 2 +- .../app/data/datasource/SampleDataStore.kt | 0 .../app/data/repository/FhirRepository.kt | 0 .../app/data/repository/GroupRepository.kt | 0 .../data/repository/InMemoryFhirRepository.kt | 2 +- .../app/data/repository/PatientRepository.kt | 0 .../repository/RepositorySnapshotStore.kt | 0 .../app/feature/component/common/CardView.kt | 0 .../app/feature/component/common/Chip.kt | 0 .../common/SectionCardLayoutRenderer.kt | 0 .../feature/component/common/StatusChip.kt | 0 .../app/feature/component/common/StatusRow.kt | 0 .../app/feature/group/list/GroupCard.kt | 0 .../feature/group/list/GroupCardRenderer.kt | 0 .../group/list/GroupListRegistrations.kt | 0 .../app/feature/group/list/GroupListScreen.kt | 0 .../feature/group/list/GroupListViewModel.kt | 0 .../group/profile/GroupHeaderRenderer.kt | 0 .../profile/GroupProfileRegistrations.kt | 0 .../group/profile/GroupProfileScreen.kt | 0 .../group/profile/GroupProfileViewModel.kt | 0 .../group/profile/MemberItemRenderer.kt | 14 ++--- .../app/feature/patient/list/PatientCard.kt | 0 .../patient/list/PatientCardRenderer.kt | 0 .../patient/list/PatientListRegistrations.kt | 0 .../feature/patient/list/PatientListScreen.kt | 0 .../patient/list/PatientListViewModel.kt | 0 .../patient/profile/AllergyItemRenderer.kt | 0 .../profile/AllergyReactionItemRenderer.kt | 0 .../patient/profile/ConditionItemRenderer.kt | 0 .../patient/profile/ContactItemRenderer.kt | 0 .../profile/ImmunizationItemRenderer.kt | 0 .../patient/profile/MedicationItemRenderer.kt | 0 .../patient/profile/PatientHeaderRenderer.kt | 0 .../profile/PatientProfileRegistrations.kt | 0 .../patient/profile/PatientProfileScreen.kt | 0 .../profile/PatientProfileViewModel.kt | 0 .../feature/patient/profile/ProfileUiState.kt | 0 .../patient/profile/TelecomItemRenderer.kt | 0 .../questionnaire/QuestionnaireHostScreen.kt | 0 .../QuestionnaireHostViewModel.kt | 0 .../questionnaire/QuestionnaireService.kt | 2 +- .../reference/app/AppViewRegistryTest.kt | 0 .../data/repository/GroupRepositoryTest.kt | 0 .../repository/InMemoryFhirRepositoryTest.kt | 0 .../feature/patient/list/PatientCardTest.kt | 0 .../patient/list/PatientListScreenTest.kt | 0 .../profile/PatientProfileScreenTest.kt | 0 .../reference/app/MainViewController.kt | 0 .../PlatformRepositorySnapshotStore.ios.kt | 0 .../PlatformRepositorySnapshotStore.jvm.kt | 0 .../dev/ohs/player/reference/app/main.kt | 0 .../PlatformRepositorySnapshotStore.web.kt | 0 .../dev/ohs/player/reference/app/main.kt | 0 .../src/webMain/resources/index.html | 2 +- .../src/webMain/resources/styles.css | 0 settings.gradle.kts | 2 +- 127 files changed, 57 insertions(+), 57 deletions(-) rename {ohs-player-reference-app => reference-app}/build.gradle.kts (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/AndroidManifest.xml (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/kotlin/dev/ohs/player/reference/app/MainActivity.kt (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.android.kt (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/drawable/ic_launcher_background.xml (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-hdpi/ic_launcher.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-mdpi/ic_launcher.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-xhdpi/ic_launcher.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename {ohs-player-reference-app => reference-app}/src/androidMain/res/values/strings.xml (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/drawable/compose-multiplatform.xml (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/SampleResourcesBundle.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-AllergyItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-AllergyReactionItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-ConditionItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-ContactItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-GroupCardConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-GroupHeaderConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-ImmunizationItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-MedicationItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-MemberItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-PatientCardConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-PatientHeaderConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-SectionCardConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Binary-TelecomItemConfig.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdMembers.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdRegistration.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/configs/Questionnaire-PatientClinicalData.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-Allergy.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-AllergyReaction.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-AllergyReactionState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-Condition.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-Group.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-GroupHeaderState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-GroupListState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-GroupMemberState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-Immunization.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-Medication.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-Member.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientAllergyState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientConditionState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientContact.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientContactState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientImmunizationState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientMedicationState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientSummary.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientSummaryState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientTelecom.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/states/Binary-PatientTelecomState.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/files/viewtypes/CodeSystem-ViewTypes.json (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/composeResources/values/strings.xml (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/OhsPlayerTheme.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/AppDependencies.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/FhirReferences.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt (94%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/FhirRepository.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepository.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt (99%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/RepositorySnapshotStore.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/CardView.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/Chip.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusChip.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusRow.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCard.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListViewModel.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileViewModel.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt (89%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCard.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListViewModel.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileViewModel.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ProfileUiState.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostScreen.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostViewModel.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt (99%) rename {ohs-player-reference-app => reference-app}/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepositoryTest.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepositoryTest.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardTest.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt (100%) rename {ohs-player-reference-app => reference-app}/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt (100%) rename {ohs-player-reference-app => reference-app}/src/iosMain/kotlin/dev/ohs/player/reference/app/MainViewController.kt (100%) rename {ohs-player-reference-app => reference-app}/src/iosMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.ios.kt (100%) rename {ohs-player-reference-app => reference-app}/src/jvmMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.jvm.kt (100%) rename {ohs-player-reference-app => reference-app}/src/jvmMain/kotlin/dev/ohs/player/reference/app/main.kt (100%) rename {ohs-player-reference-app => reference-app}/src/webMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.web.kt (100%) rename {ohs-player-reference-app => reference-app}/src/webMain/kotlin/dev/ohs/player/reference/app/main.kt (100%) rename {ohs-player-reference-app => reference-app}/src/webMain/resources/index.html (91%) rename {ohs-player-reference-app => reference-app}/src/webMain/resources/styles.css (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67b8222c..b0ec9364 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,12 +58,12 @@ jobs: include: - id: jvm label: JVM/Desktop - tasks: ':ohs-player-reference-app:jvmTest' + tasks: ':reference-app:jvmTest' kotlinDaemonHeap: '-Xmx6g -XX:+UseG1GC' extraArgs: '' - id: android label: Android - tasks: ':ohs-player-reference-app:lintDebug' + tasks: ':reference-app:lintDebug' kotlinDaemonHeap: '-Xmx6g -XX:+UseG1GC' extraArgs: '' - id: js @@ -72,12 +72,12 @@ jobs: # it still runs the compile prerequisites (compileKotlinJs + # compileTestDevelopmentExecutableKotlinJs) — which is the work # we want covered. - tasks: ':ohs-player-reference-app:jsBrowserTest' + tasks: ':reference-app:jsBrowserTest' kotlinDaemonHeap: '-Xmx10g -XX:+UseG1GC' extraArgs: '' - id: wasm label: Kotlin/Wasm - tasks: ':ohs-player-reference-app:wasmJsBrowserTest' + tasks: ':reference-app:wasmJsBrowserTest' kotlinDaemonHeap: '-Xmx10g -XX:+UseG1GC' extraArgs: '' steps: @@ -148,4 +148,4 @@ jobs: - name: Compile + link ${{ matrix.label }} run: | ./gradlew --stacktrace \ - :ohs-player-reference-app:linkDebugFramework${{ matrix.target }} + :reference-app:linkDebugFramework${{ matrix.target }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 928428e9..9ef344c5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -138,7 +138,7 @@ jobs: ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }} - run: ./gradlew :ohs-player-reference-app:assembleRelease + run: ./gradlew :reference-app:assembleRelease - name: Stage outputs shell: bash @@ -154,7 +154,7 @@ jobs: # Fail loud if AGP ever produces 0 or >1 outputs (e.g. someone enables # ABI/density splits) — the single-name cp below would silently corrupt. - apks=(ohs-player-reference-app/build/outputs/apk/release/*.apk) + apks=(reference-app/build/outputs/apk/release/*.apk) if [ ${#apks[@]} -ne 1 ]; then echo "::error::Expected exactly one APK, got ${#apks[@]}: ${apks[*]}" echo "::error::If splits/flavors were enabled, update this step to rename each variant." @@ -180,25 +180,25 @@ jobs: include: - os: ubuntu-latest label: Linux deb - task: ':ohs-player-reference-app:packageDeb' - glob: 'ohs-player-reference-app/build/compose/binaries/main/deb/*.deb' + task: ':reference-app:packageDeb' + glob: 'reference-app/build/compose/binaries/main/deb/*.deb' artifact: linux-deb - os: ubuntu-latest label: Linux rpm - task: ':ohs-player-reference-app:packageRpm' - glob: 'ohs-player-reference-app/build/compose/binaries/main/rpm/*.rpm' + task: ':reference-app:packageRpm' + glob: 'reference-app/build/compose/binaries/main/rpm/*.rpm' artifact: linux-rpm - os: windows-latest label: Windows msi - task: ':ohs-player-reference-app:packageMsi' - glob: 'ohs-player-reference-app/build/compose/binaries/main/msi/*.msi' + task: ':reference-app:packageMsi' + glob: 'reference-app/build/compose/binaries/main/msi/*.msi' artifact: windows-msi # macos-latest is Apple Silicon — the .dmg is arm64-only. Intel Macs # need the portable Linux tarball or a future universal build. - os: macos-latest label: macOS dmg - task: ':ohs-player-reference-app:packageDmg' - glob: 'ohs-player-reference-app/build/compose/binaries/main/dmg/*.dmg' + task: ':reference-app:packageDmg' + glob: 'reference-app/build/compose/binaries/main/dmg/*.dmg' artifact: macos-dmg runs-on: ${{ matrix.os }} permissions: @@ -270,13 +270,13 @@ jobs: - name: Create distributable app image env: VERSION_NAME: ${{ needs.preflight.outputs.version_name }} - run: ./gradlew :ohs-player-reference-app:createDistributable + run: ./gradlew :reference-app:createDistributable - name: Tar up the distributable shell: bash run: | shopt -s nullglob - APP_BASE=ohs-player-reference-app/build/compose/binaries/main/app + APP_BASE=reference-app/build/compose/binaries/main/app app_dirs=("$APP_BASE"/*) if [ ${#app_dirs[@]} -ne 1 ]; then echo "::error::Expected exactly one app directory in $APP_BASE, got ${#app_dirs[@]}: ${app_dirs[*]}" @@ -322,12 +322,12 @@ jobs: - name: Build web distribution env: VERSION_NAME: ${{ needs.preflight.outputs.version_name }} - run: ./gradlew :ohs-player-reference-app:wasmJsBrowserDistribution + run: ./gradlew :reference-app:wasmJsBrowserDistribution - name: Zip distribution for the GitHub Release run: | mkdir -p out - DIST=ohs-player-reference-app/build/dist/wasmJs/productionExecutable + DIST=reference-app/build/dist/wasmJs/productionExecutable test -d "$DIST" || { echo "::error::Web dist directory missing: $DIST"; exit 1; } (cd "$DIST" && zip -r "$GITHUB_WORKSPACE/out/ohs-player-web-${{ needs.preflight.outputs.version_name }}.zip" .) @@ -342,7 +342,7 @@ jobs: if: needs.preflight.outputs.is_dry_run == 'false' && needs.preflight.outputs.is_prerelease == 'false' uses: actions/upload-pages-artifact@v3 with: - path: ohs-player-reference-app/build/dist/wasmJs/productionExecutable + path: reference-app/build/dist/wasmJs/productionExecutable # Disabled alongside build-web. See the comment above build-web for the # rationale and the steps to re-enable. diff --git a/README.md b/README.md index e1d893eb..e489816e 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,10 @@ Code generation is part of compilation. The `ig-codegen` Gradle plugin runs its | Target | Command | | --- | --- | -| Android | `./gradlew :ohs-player-reference-app:assembleDebug` | -| Desktop (JVM) | `./gradlew :ohs-player-reference-app:run` | -| Web (Wasm) | `./gradlew :ohs-player-reference-app:wasmJsBrowserDevelopmentRun` | -| Web (JS) | `./gradlew :ohs-player-reference-app:jsBrowserDevelopmentRun` | +| Android | `./gradlew :reference-app:assembleDebug` | +| Desktop (JVM) | `./gradlew :reference-app:run` | +| Web (Wasm) | `./gradlew :reference-app:wasmJsBrowserDevelopmentRun` | +| Web (JS) | `./gradlew :reference-app:jsBrowserDevelopmentRun` | For iOS, open [`iosApp/`](./iosApp) in Xcode and run, or use the run-configuration widget in a Kotlin Multiplatform IDE. @@ -46,7 +46,7 @@ A screen never consumes a raw FHIR resource. It consumes a typed *view-state* ### 1. Author configuration -A `ViewDefinition` declares the columns of a view as FHIRPath expressions over a FHIR resource. Each column carries a name, a path, and a FHIR type. Excerpt from [`Binary-PatientSummary.json`](./ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummary.json): +A `ViewDefinition` declares the columns of a view as FHIRPath expressions over a FHIR resource. Each column carries a name, a path, and a FHIR type. Excerpt from [`Binary-PatientSummary.json`](./reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummary.json): ```json { @@ -67,7 +67,7 @@ A `ViewDefinition` declares the columns of a view as FHIRPath expressions over a } ``` -A `ViewJoinMap` names the view-state and binds it to a pivot `ViewDefinition` (and, where needed, joined views). [`Binary-PatientSummaryState.json`](./ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummaryState.json): +A `ViewJoinMap` names the view-state and binds it to a pivot `ViewDefinition` (and, where needed, joined views). [`Binary-PatientSummaryState.json`](./reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummaryState.json): ```json { @@ -79,7 +79,7 @@ A `ViewJoinMap` names the view-state and binds it to a pivot `ViewDefinition` (a } ``` -A `ViewConfig` declares the configuration a renderer accepts, with defaults. [`Binary-PatientCardConfig.json`](./ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-PatientCardConfig.json): +A `ViewConfig` declares the configuration a renderer accepts, with defaults. [`Binary-PatientCardConfig.json`](./reference-app/src/commonMain/composeResources/files/configs/Binary-PatientCardConfig.json): ```json { @@ -93,11 +93,11 @@ A `ViewConfig` declares the configuration a renderer accepts, with defaults. [`B } ``` -A single `CodeSystem` Binary enumerates the view-types the app renders; see [`CodeSystem-ViewTypes.json`](./ohs-player-reference-app/src/commonMain/composeResources/files/viewtypes/CodeSystem-ViewTypes.json). +A single `CodeSystem` Binary enumerates the view-types the app renders; see [`CodeSystem-ViewTypes.json`](./reference-app/src/commonMain/composeResources/files/viewtypes/CodeSystem-ViewTypes.json). ### 2. Generate typed Kotlin -The `ig-codegen` plugin reads these Binaries and emits typed sources. It is applied and configured in [`ohs-player-reference-app/build.gradle.kts`](./ohs-player-reference-app/build.gradle.kts): +The `ig-codegen` plugin reads these Binaries and emits typed sources. It is applied and configured in [`reference-app/build.gradle.kts`](./reference-app/build.gradle.kts): ```kotlin plugins { @@ -137,7 +137,7 @@ data class PatientSummaryState( ### 3. Load configuration at runtime -A `ConfigStore` holds the parsed configuration, fed by a `ConfigSource`. The reference app reads the bundled Binaries; replacing this with a network fetch is the only change required to load configuration from a backend. See [`LocalConfigSource.kt`](./ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt): +A `ConfigStore` holds the parsed configuration, fed by a `ConfigSource`. The reference app reads the bundled Binaries; replacing this with a network fetch is the only change required to load configuration from a backend. See [`LocalConfigSource.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt): ```kotlin object LocalConfigSource : ConfigSource { @@ -150,7 +150,7 @@ object LocalConfigSource : ConfigSource { } ``` -The store and a single extractor are wired once in [`Extraction.kt`](./ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt): +The store and a single extractor are wired once in [`Extraction.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt): ```kotlin object Extraction { @@ -163,7 +163,7 @@ object Extraction { `GenericStateExtractor.extract()` selects the configuration for `T` by name, evaluates its FHIRPath columns against a `SearchResult`, and returns a list of typed `T`. A `SearchResult` carries the pivot resource plus any forward-included and reverse-included resources, mirroring a FHIR search response. -From [`PatientRepository.kt`](./ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt): +From [`PatientRepository.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt): ```kotlin suspend fun getPatients(): List = @@ -208,7 +208,7 @@ class PatientCardRenderer : ComponentRenderer( @@ -286,13 +286,13 @@ Adding a field is a configuration change: add a column to the `ViewDefinition`, Run all multiplatform tests: ```shell -./gradlew :ohs-player-reference-app:allTests +./gradlew :reference-app:allTests ``` Run JVM tests only: ```shell -./gradlew :ohs-player-reference-app:jvmTest +./gradlew :reference-app:jvmTest ``` ## Deployment @@ -312,11 +312,11 @@ A `workflow_dispatch` run performs a dry run: it builds, signs, and uploads arti Build a native installer or distributable locally: ```shell -./gradlew :ohs-player-reference-app:packageDmg # macOS .dmg -./gradlew :ohs-player-reference-app:packageMsi # Windows .msi -./gradlew :ohs-player-reference-app:packageDeb # Linux .deb -./gradlew :ohs-player-reference-app:createDistributable # portable app image -./gradlew :ohs-player-reference-app:wasmJsBrowserDistribution # web bundle +./gradlew :reference-app:packageDmg # macOS .dmg +./gradlew :reference-app:packageMsi # Windows .msi +./gradlew :reference-app:packageDeb # Linux .deb +./gradlew :reference-app:createDistributable # portable app image +./gradlew :reference-app:wasmJsBrowserDistribution # web bundle ``` ### Android release signing @@ -326,7 +326,7 @@ Release builds read signing inputs from environment variables first, then from a ```shell cp keystore.properties.template keystore.properties # Edit keystore.properties with your keystore path, alias, and passwords, then: -./gradlew :ohs-player-reference-app:bundleRelease +./gradlew :reference-app:bundleRelease ``` `keystore.properties` is gitignored and must never be committed. The environment variables `ANDROID_KEYSTORE_PATH`, `ANDROID_KEY_ALIAS`, `ANDROID_KEY_PASSWORD`, and `ANDROID_STORE_PASSWORD` take precedence over the file when both are set. If neither is configured, release builds are emitted unsigned. diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj index 1548ecd8..e444fe22 100644 --- a/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/iosApp/iosApp.xcodeproj/project.pbxproj @@ -152,7 +152,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\ncd \"$SRCROOT/..\"\n./gradlew :ohs-player-reference-app:embedAndSignAppleFrameworkForXcode\n"; + shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\ncd \"$SRCROOT/..\"\n./gradlew :reference-app:embedAndSignAppleFrameworkForXcode\n"; }; /* End PBXShellScriptBuildPhase section */ diff --git a/ohs-player-reference-app/build.gradle.kts b/reference-app/build.gradle.kts similarity index 100% rename from ohs-player-reference-app/build.gradle.kts rename to reference-app/build.gradle.kts diff --git a/ohs-player-reference-app/src/androidMain/AndroidManifest.xml b/reference-app/src/androidMain/AndroidManifest.xml similarity index 100% rename from ohs-player-reference-app/src/androidMain/AndroidManifest.xml rename to reference-app/src/androidMain/AndroidManifest.xml diff --git a/ohs-player-reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/MainActivity.kt b/reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/MainActivity.kt similarity index 100% rename from ohs-player-reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/MainActivity.kt rename to reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/MainActivity.kt diff --git a/ohs-player-reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.android.kt b/reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.android.kt similarity index 100% rename from ohs-player-reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.android.kt rename to reference-app/src/androidMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.android.kt diff --git a/ohs-player-reference-app/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml b/reference-app/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml rename to reference-app/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml diff --git a/ohs-player-reference-app/src/androidMain/res/drawable/ic_launcher_background.xml b/reference-app/src/androidMain/res/drawable/ic_launcher_background.xml similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/drawable/ic_launcher_background.xml rename to reference-app/src/androidMain/res/drawable/ic_launcher_background.xml diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml b/reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml rename to reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml b/reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to reference-app/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher.png b/reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher.png rename to reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png b/reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png rename to reference-app/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher.png b/reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher.png rename to reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png b/reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png rename to reference-app/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher.png b/reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher.png rename to reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png b/reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png rename to reference-app/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png b/reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png rename to reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png b/reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png rename to reference-app/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png b/reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png rename to reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/ohs-player-reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png b/reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png rename to reference-app/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/ohs-player-reference-app/src/androidMain/res/values/strings.xml b/reference-app/src/androidMain/res/values/strings.xml similarity index 100% rename from ohs-player-reference-app/src/androidMain/res/values/strings.xml rename to reference-app/src/androidMain/res/values/strings.xml diff --git a/ohs-player-reference-app/src/commonMain/composeResources/drawable/compose-multiplatform.xml b/reference-app/src/commonMain/composeResources/drawable/compose-multiplatform.xml similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/drawable/compose-multiplatform.xml rename to reference-app/src/commonMain/composeResources/drawable/compose-multiplatform.xml diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/SampleResourcesBundle.json b/reference-app/src/commonMain/composeResources/files/SampleResourcesBundle.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/SampleResourcesBundle.json rename to reference-app/src/commonMain/composeResources/files/SampleResourcesBundle.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyReactionItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyReactionItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyReactionItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-AllergyReactionItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-ConditionItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-ConditionItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-ConditionItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-ConditionItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-ContactItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-ContactItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-ContactItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-ContactItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-GroupCardConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-GroupCardConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-GroupCardConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-GroupCardConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-GroupHeaderConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-GroupHeaderConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-GroupHeaderConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-GroupHeaderConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-ImmunizationItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-ImmunizationItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-ImmunizationItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-ImmunizationItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-MedicationItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-MedicationItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-MedicationItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-MedicationItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-MemberItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-MemberItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-MemberItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-MemberItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-PatientCardConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-PatientCardConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-PatientCardConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-PatientCardConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-PatientHeaderConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-PatientHeaderConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-PatientHeaderConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-PatientHeaderConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-SectionCardConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-SectionCardConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-SectionCardConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-SectionCardConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-TelecomItemConfig.json b/reference-app/src/commonMain/composeResources/files/configs/Binary-TelecomItemConfig.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Binary-TelecomItemConfig.json rename to reference-app/src/commonMain/composeResources/files/configs/Binary-TelecomItemConfig.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdMembers.json b/reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdMembers.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdMembers.json rename to reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdMembers.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdRegistration.json b/reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdRegistration.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdRegistration.json rename to reference-app/src/commonMain/composeResources/files/configs/Questionnaire-HouseholdRegistration.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/configs/Questionnaire-PatientClinicalData.json b/reference-app/src/commonMain/composeResources/files/configs/Questionnaire-PatientClinicalData.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/configs/Questionnaire-PatientClinicalData.json rename to reference-app/src/commonMain/composeResources/files/configs/Questionnaire-PatientClinicalData.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Allergy.json b/reference-app/src/commonMain/composeResources/files/states/Binary-Allergy.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Allergy.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-Allergy.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReaction.json b/reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReaction.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReaction.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReaction.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReactionState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReactionState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReactionState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-AllergyReactionState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Condition.json b/reference-app/src/commonMain/composeResources/files/states/Binary-Condition.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Condition.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-Condition.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Group.json b/reference-app/src/commonMain/composeResources/files/states/Binary-Group.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Group.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-Group.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-GroupHeaderState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-GroupHeaderState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-GroupHeaderState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-GroupHeaderState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-GroupListState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-GroupListState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-GroupListState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-GroupListState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-GroupMemberState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-GroupMemberState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-GroupMemberState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-GroupMemberState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Immunization.json b/reference-app/src/commonMain/composeResources/files/states/Binary-Immunization.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Immunization.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-Immunization.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Medication.json b/reference-app/src/commonMain/composeResources/files/states/Binary-Medication.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Medication.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-Medication.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Member.json b/reference-app/src/commonMain/composeResources/files/states/Binary-Member.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-Member.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-Member.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientAllergyState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientAllergyState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientAllergyState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientAllergyState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientConditionState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientConditionState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientConditionState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientConditionState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientContact.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientContact.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientContact.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientContact.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientContactState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientContactState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientContactState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientContactState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientImmunizationState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientImmunizationState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientImmunizationState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientImmunizationState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientMedicationState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientMedicationState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientMedicationState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientMedicationState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummary.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummary.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummary.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummary.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummaryState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummaryState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummaryState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientSummaryState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecom.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecom.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecom.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecom.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecomState.json b/reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecomState.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecomState.json rename to reference-app/src/commonMain/composeResources/files/states/Binary-PatientTelecomState.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/files/viewtypes/CodeSystem-ViewTypes.json b/reference-app/src/commonMain/composeResources/files/viewtypes/CodeSystem-ViewTypes.json similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/files/viewtypes/CodeSystem-ViewTypes.json rename to reference-app/src/commonMain/composeResources/files/viewtypes/CodeSystem-ViewTypes.json diff --git a/ohs-player-reference-app/src/commonMain/composeResources/values/strings.xml b/reference-app/src/commonMain/composeResources/values/strings.xml similarity index 100% rename from ohs-player-reference-app/src/commonMain/composeResources/values/strings.xml rename to reference-app/src/commonMain/composeResources/values/strings.xml diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/OhsPlayerTheme.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/OhsPlayerTheme.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/OhsPlayerTheme.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/OhsPlayerTheme.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/AppDependencies.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/AppDependencies.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/AppDependencies.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/AppDependencies.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/FhirReferences.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/FhirReferences.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/FhirReferences.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/FhirReferences.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt similarity index 94% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt index f31a0c48..58aed965 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt @@ -17,7 +17,7 @@ package dev.ohs.player.reference.app.data.datasource import dev.ohs.player.generated.GeneratedConfigManifest import dev.ohs.player.reference.library.config.ConfigSource -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.Res +import ohs_player_reference_client_app.reference_app.generated.resources.Res /** * Loads the runtime config Binaries the extractor needs (ViewJoinMap + ViewDefinition) from diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/FhirRepository.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/FhirRepository.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/FhirRepository.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/FhirRepository.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepository.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepository.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepository.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepository.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt similarity index 99% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt index 21af5620..59971864 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt @@ -33,7 +33,7 @@ import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.Res +import ohs_player_reference_client_app.reference_app.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi /** diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/RepositorySnapshotStore.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/RepositorySnapshotStore.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/RepositorySnapshotStore.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/RepositorySnapshotStore.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/CardView.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/CardView.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/CardView.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/CardView.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/Chip.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/Chip.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/Chip.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/Chip.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusChip.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusChip.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusChip.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusChip.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusRow.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusRow.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusRow.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/StatusRow.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCard.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCard.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCard.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCard.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListViewModel.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListViewModel.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListViewModel.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListViewModel.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileViewModel.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileViewModel.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileViewModel.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileViewModel.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt similarity index 89% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt index 688d997a..a4d9e63a 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt @@ -42,13 +42,13 @@ import dev.ohs.player.reference.app.feature.component.common.Chip import dev.ohs.player.reference.app.feature.patient.list.calculateAge import dev.ohs.player.reference.library.renderer.ComponentRenderer import dev.ohs.player.reference.library.renderer.RenderOptions -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.Res -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_child -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_guardian -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_non_relative -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_other_relative -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_parent -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.relationship_spouse +import ohs_player_reference_client_app.reference_app.generated.resources.Res +import ohs_player_reference_client_app.reference_app.generated.resources.relationship_child +import ohs_player_reference_client_app.reference_app.generated.resources.relationship_guardian +import ohs_player_reference_client_app.reference_app.generated.resources.relationship_non_relative +import ohs_player_reference_client_app.reference_app.generated.resources.relationship_other_relative +import ohs_player_reference_client_app.reference_app.generated.resources.relationship_parent +import ohs_player_reference_client_app.reference_app.generated.resources.relationship_spouse import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.stringResource diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCard.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCard.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCard.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCard.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListViewModel.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListViewModel.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListViewModel.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListViewModel.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileViewModel.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileViewModel.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileViewModel.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileViewModel.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ProfileUiState.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ProfileUiState.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ProfileUiState.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ProfileUiState.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostScreen.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostScreen.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostScreen.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostViewModel.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostViewModel.kt similarity index 100% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostViewModel.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireHostViewModel.kt diff --git a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt similarity index 99% rename from ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt rename to reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt index 160f828e..4c5187c3 100644 --- a/ohs-player-reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt @@ -37,7 +37,7 @@ import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -import ohsplayerreferenceclientapp.ohs_player_reference_app.generated.resources.Res +import ohs_player_reference_client_app.reference_app.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi /** Caller-supplied identifiers describing why/for-whom a questionnaire was launched. */ diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt similarity index 100% rename from ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt rename to reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepositoryTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepositoryTest.kt similarity index 100% rename from ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepositoryTest.kt rename to reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/GroupRepositoryTest.kt diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepositoryTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepositoryTest.kt similarity index 100% rename from ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepositoryTest.kt rename to reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepositoryTest.kt diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardTest.kt similarity index 100% rename from ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardTest.kt rename to reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardTest.kt diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt similarity index 100% rename from ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt rename to reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt diff --git a/ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt similarity index 100% rename from ohs-player-reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt rename to reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt diff --git a/ohs-player-reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/MainViewController.kt b/reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/MainViewController.kt similarity index 100% rename from ohs-player-reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/MainViewController.kt rename to reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/MainViewController.kt diff --git a/ohs-player-reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.ios.kt b/reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.ios.kt similarity index 100% rename from ohs-player-reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.ios.kt rename to reference-app/src/iosMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.ios.kt diff --git a/ohs-player-reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.jvm.kt b/reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.jvm.kt similarity index 100% rename from ohs-player-reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.jvm.kt rename to reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.jvm.kt diff --git a/ohs-player-reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/main.kt b/reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/main.kt similarity index 100% rename from ohs-player-reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/main.kt rename to reference-app/src/jvmMain/kotlin/dev/ohs/player/reference/app/main.kt diff --git a/ohs-player-reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.web.kt b/reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.web.kt similarity index 100% rename from ohs-player-reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.web.kt rename to reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/data/repository/PlatformRepositorySnapshotStore.web.kt diff --git a/ohs-player-reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/main.kt b/reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/main.kt similarity index 100% rename from ohs-player-reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/main.kt rename to reference-app/src/webMain/kotlin/dev/ohs/player/reference/app/main.kt diff --git a/ohs-player-reference-app/src/webMain/resources/index.html b/reference-app/src/webMain/resources/index.html similarity index 91% rename from ohs-player-reference-app/src/webMain/resources/index.html rename to reference-app/src/webMain/resources/index.html index 20421019..6d13c8f3 100644 --- a/ohs-player-reference-app/src/webMain/resources/index.html +++ b/reference-app/src/webMain/resources/index.html @@ -15,6 +15,6 @@ repeatCount="indefinite"/> - + \ No newline at end of file diff --git a/ohs-player-reference-app/src/webMain/resources/styles.css b/reference-app/src/webMain/resources/styles.css similarity index 100% rename from ohs-player-reference-app/src/webMain/resources/styles.css rename to reference-app/src/webMain/resources/styles.css diff --git a/settings.gradle.kts b/settings.gradle.kts index 7779cb79..1fc85225 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -52,4 +52,4 @@ dependencyResolutionManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } -include(":ohs-player-reference-app") +include(":reference-app") From 6671b513b1731df67b909ffde656bf81d301cc21 Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Fri, 17 Jul 2026 09:42:44 +0700 Subject: [PATCH 07/10] README.md v1 --- README.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e489816e..0c2466fb 100644 --- a/README.md +++ b/README.md @@ -4,36 +4,90 @@ A Kotlin Multiplatform and Compose Multiplatform reference client for [Open Heal The application renders healthcare UI from configuration rather than hand-written mapping code. FHIR resources are projected into typed view-state by declarative configuration, and that state is rendered by renderers resolved through a registry. The two halves — extraction and rendering — are described below, then joined in a single end-to-end example. +This repository is a GitHub template: use it as the starting point for your own OHS-based app, or just run it to see OHS in action. + +## Supported platforms + +Android, iOS, Desktop (Windows, macOS, Linux), and Web (JS and Wasm) — all from a single Kotlin source tree. Every platform is built, tested, and released by GitHub Actions; see [Deployment](#deployment). + ## Getting started -### Prerequisites +### Just want to see OHS in action? + +The desktop app is the fastest path — it needs only JDK 21, no Android SDK or Xcode: + +```shell +git clone +cd ohs-player-reference-client-app +./gradlew :reference-app:run +``` + +The app ships with bundled sample FHIR data, so it works out of the box. Other platforms: + +| Target | Command | +| --- | --- | +| Android | `./gradlew :reference-app:assembleDebug` | +| Web (Wasm) | `./gradlew :reference-app:wasmJsBrowserDevelopmentRun` | +| Web (JS) | `./gradlew :reference-app:jsBrowserDevelopmentRun` | + +For iOS, open [`iosApp/`](./iosApp) in Xcode and run, or use the run-configuration widget in a Kotlin Multiplatform IDE. + +### Start from this template + +1. Click **Use this template → Create a new repository** on GitHub (or clone and re-init). +2. Follow [Developer setup](#developer-setup-kotlin-multiplatform) below and confirm `./gradlew build` passes. +3. Work through [Customizing the template](#customizing-the-template) to make the app yours. + +### Developer setup (Kotlin Multiplatform) - JDK 21 -- Android SDK (for Android builds) +- [Android Studio](https://developer.android.com/studio) with the Kotlin Multiplatform plugin (Android builds also need the Android SDK) - Xcode (for iOS builds, macOS only) +- Optional: run [`kdoctor`](https://github.com/Kotlin/kdoctor) to verify your multiplatform environment Use `./gradlew` on macOS and Linux, and `gradlew.bat` on Windows. All commands run from the repository root. ### Build ```shell -git clone -cd ohs-player-reference-client-app ./gradlew build ``` Code generation is part of compilation. The `ig-codegen` Gradle plugin runs its `generateIgCode` task automatically before Kotlin compilation, so there is no separate generation step. -### Run +## Customizing the template -| Target | Command | +The starting points, in rough order: + +- **Application id / namespace** — `applicationId` and `namespace` in [`reference-app/build.gradle.kts`](./reference-app/build.gradle.kts), the iOS bundle id in [`iosApp/Configuration/Config.xcconfig`](./iosApp/Configuration/Config.xcconfig), and the Kotlin package `dev.ohs.player.reference.app` under `reference-app/src/*/kotlin/`. +- **Application name** — Android: `app_name` in [`reference-app/src/androidMain/res/values/strings.xml`](./reference-app/src/androidMain/res/values/strings.xml); iOS: `PRODUCT_NAME` in `Config.xcconfig`; Desktop: `packageName` in the `compose.desktop` block of `reference-app/build.gradle.kts`; Web: `` in [`reference-app/src/webMain/resources/index.html`](./reference-app/src/webMain/resources/index.html). +- **Icons** — Android launcher icons in `reference-app/src/androidMain/res/mipmap-*/`; iOS in `iosApp/iosApp/Assets.xcassets`. +- **Generated code package** — `packageName` in the `igCodegen` block of `reference-app/build.gradle.kts` (defaults to `dev.ohs.player.generated`). +- **Project names** — `rootProject.name` and the module name in [`settings.gradle.kts`](./settings.gradle.kts). Note that renaming either changes the package of the generated Compose resources class (`Res`). +- **Screens and configuration** — replace the sample `Binary-*.json` configuration under `reference-app/src/commonMain/composeResources/files/` and the feature renderers under `reference-app/src/commonMain/kotlin/.../feature/`; the rest of this README explains how those two fit together. + +## Bundled OHS libraries + +The app is assembled from the OHS Player library plus the OHS Foundational Libraries; versions are pinned in [`gradle/libs.versions.toml`](./gradle/libs.versions.toml): + +| Library | Purpose | | --- | --- | -| Android | `./gradlew :reference-app:assembleDebug` | -| Desktop (JVM) | `./gradlew :reference-app:run` | -| Web (Wasm) | `./gradlew :reference-app:wasmJsBrowserDevelopmentRun` | -| Web (JS) | `./gradlew :reference-app:jsBrowserDevelopmentRun` | +| [`dev.ohs.player:reference-library`](https://github.com/ohs-foundation/ohs-player-reference-client-library) | Config-driven views using flattened data from FHIR resources (the player) | +| `dev.ohs.fhir:fhir-model` | Typed Kotlin models for FHIR resources | +| `dev.ohs.fhir:fhir-path` | FHIRPath expression evaluation | +| `dev.ohs.fhir:fhir-data-capture` | FHIR Structured Data Capture (questionnaires) | -For iOS, open [`iosApp/`](./iosApp) in Xcode and run, or use the run-configuration widget in a Kotlin Multiplatform IDE. +### Have an existing app? + +If you cannot start from this template, depend on the player library directly — it is a library, not a framework, and can be adopted one screen at a time in any Kotlin Multiplatform or Android project: + +```kotlin +commonMain.dependencies { + implementation("dev.ohs.player:reference-library:1.0.0-alpha01") +} +``` + +The [library README](https://github.com/ohs-foundation/ohs-player-reference-client-library#readme) is a standalone user guide; this repository then serves as the worked example. ## From FHIR data to view state @@ -297,6 +351,10 @@ Run JVM tests only: ## Deployment +### Continuous integration + +Every pull request and push to `main` is validated by the [`ci.yml`](./.github/workflows/ci.yml) workflow: formatting (spotless), JVM tests, Android lint, JS/Wasm compilation, and iOS compile-and-link, each as a separate job. + ### Release pipeline Releases are produced by the [`release.yml`](./.github/workflows/release.yml) GitHub Actions workflow, triggered by a semantic version tag (`vX.Y.Z` or `vX.Y.Z-suffix`). The workflow builds and signs every platform, then publishes a GitHub Release with checksummed artifacts: From fcf35b76066ccb14aa6b778959bb4d05903a1e17 Mon Sep 17 00:00:00 2001 From: fikrimilano <fikrimilano1@gmail.com> Date: Tue, 28 Jul 2026 20:19:56 +0700 Subject: [PATCH 08/10] Update README.md --- README.md | 88 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 0c2466fb..3b596e9f 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,20 @@ # OHS Player Reference Client App -A Kotlin Multiplatform and Compose Multiplatform reference client for [Open Health Stack (OHS)](https://developers.google.com/open-health-stack/overview). A single Kotlin source tree targets Android, iOS, JVM desktop, JS browser, and Wasm browser. +A Kotlin Multiplatform and Compose Multiplatform reference client for [Open Health Stack (OHS)](https://developers.google.com/open-health-stack/overview). -The application renders healthcare UI from configuration rather than hand-written mapping code. FHIR resources are projected into typed view-state by declarative configuration, and that state is rendered by renderers resolved through a registry. The two halves — extraction and rendering — are described below, then joined in a single end-to-end example. +The app renders healthcare UI from configuration rather than hand-written mapping code. Declarative configuration projects FHIR resources into typed view-state, and renderers resolved from a registry then draw that state on screen. This README explains the two halves — extraction and rendering — and then joins them in a single end-to-end example. -This repository is a GitHub template: use it as the starting point for your own OHS-based app, or just run it to see OHS in action. +This repository is a GitHub template: start your own OHS app from it, or just run it to see OHS in action. ## Supported platforms -Android, iOS, Desktop (Windows, macOS, Linux), and Web (JS and Wasm) — all from a single Kotlin source tree. Every platform is built, tested, and released by GitHub Actions; see [Deployment](#deployment). +A single Kotlin source tree targets Android, iOS, Desktop (Windows, macOS, Linux), and Web (JS and Wasm). Every platform is built, tested, and released by GitHub Actions; see [Deployment](#deployment). ## Getting started ### Just want to see OHS in action? -The desktop app is the fastest path — it needs only JDK 21, no Android SDK or Xcode: +The desktop app is the fastest path. It needs only JDK 21 — no Android SDK, no Xcode: ```shell git clone <repository-url> @@ -22,7 +22,9 @@ cd ohs-player-reference-client-app ./gradlew :reference-app:run ``` -The app ships with bundled sample FHIR data, so it works out of the box. Other platforms: +Sample FHIR data is bundled, so the app works out of the box. + +Other platforms: | Target | Command | | --- | --- | @@ -34,18 +36,18 @@ For iOS, open [`iosApp/`](./iosApp) in Xcode and run, or use the run-configurati ### Start from this template -1. Click **Use this template → Create a new repository** on GitHub (or clone and re-init). -2. Follow [Developer setup](#developer-setup-kotlin-multiplatform) below and confirm `./gradlew build` passes. -3. Work through [Customizing the template](#customizing-the-template) to make the app yours. +1. On GitHub, click **Use this template → Create a new repository** (or clone and re-init). +2. Set up your machine ([Developer setup](#developer-setup-kotlin-multiplatform) below) and check that `./gradlew build` passes. +3. Make the app yours ([Customizing the template](#customizing-the-template) below). ### Developer setup (Kotlin Multiplatform) - JDK 21 - [Android Studio](https://developer.android.com/studio) with the Kotlin Multiplatform plugin (Android builds also need the Android SDK) - Xcode (for iOS builds, macOS only) -- Optional: run [`kdoctor`](https://github.com/Kotlin/kdoctor) to verify your multiplatform environment +- Optional: [`kdoctor`](https://github.com/Kotlin/kdoctor) checks your multiplatform environment -Use `./gradlew` on macOS and Linux, and `gradlew.bat` on Windows. All commands run from the repository root. +Use `./gradlew` on macOS and Linux, and `gradlew.bat` on Windows. Run all commands from the repository root. ### Build @@ -53,22 +55,31 @@ Use `./gradlew` on macOS and Linux, and `gradlew.bat` on Windows. All commands r ./gradlew build ``` -Code generation is part of compilation. The `ig-codegen` Gradle plugin runs its `generateIgCode` task automatically before Kotlin compilation, so there is no separate generation step. +Code generation is part of the build: the `ig-codegen` Gradle plugin runs its `generateIgCode` task before Kotlin compilation, so there is no separate generation step. ## Customizing the template -The starting points, in rough order: - -- **Application id / namespace** — `applicationId` and `namespace` in [`reference-app/build.gradle.kts`](./reference-app/build.gradle.kts), the iOS bundle id in [`iosApp/Configuration/Config.xcconfig`](./iosApp/Configuration/Config.xcconfig), and the Kotlin package `dev.ohs.player.reference.app` under `reference-app/src/*/kotlin/`. -- **Application name** — Android: `app_name` in [`reference-app/src/androidMain/res/values/strings.xml`](./reference-app/src/androidMain/res/values/strings.xml); iOS: `PRODUCT_NAME` in `Config.xcconfig`; Desktop: `packageName` in the `compose.desktop` block of `reference-app/build.gradle.kts`; Web: `<title>` in [`reference-app/src/webMain/resources/index.html`](./reference-app/src/webMain/resources/index.html). -- **Icons** — Android launcher icons in `reference-app/src/androidMain/res/mipmap-*/`; iOS in `iosApp/iosApp/Assets.xcassets`. +Work through these in rough order: + +- **Application id / namespace** + - `applicationId` and `namespace` in [`reference-app/build.gradle.kts`](./reference-app/build.gradle.kts) + - iOS bundle id in [`iosApp/Configuration/Config.xcconfig`](./iosApp/Configuration/Config.xcconfig) + - Kotlin package `dev.ohs.player.reference.app` under `reference-app/src/*/kotlin/` +- **Application name** + - Android: `app_name` in [`strings.xml`](./reference-app/src/androidMain/res/values/strings.xml) + - iOS: `PRODUCT_NAME` in `Config.xcconfig` + - Desktop: `packageName` in the `compose.desktop` block of `reference-app/build.gradle.kts` + - Web: `<title>` in [`index.html`](./reference-app/src/webMain/resources/index.html) +- **Icons** + - Android: launcher icons in `reference-app/src/androidMain/res/mipmap-*/` + - iOS: `iosApp/iosApp/Assets.xcassets` - **Generated code package** — `packageName` in the `igCodegen` block of `reference-app/build.gradle.kts` (defaults to `dev.ohs.player.generated`). -- **Project names** — `rootProject.name` and the module name in [`settings.gradle.kts`](./settings.gradle.kts). Note that renaming either changes the package of the generated Compose resources class (`Res`). -- **Screens and configuration** — replace the sample `Binary-*.json` configuration under `reference-app/src/commonMain/composeResources/files/` and the feature renderers under `reference-app/src/commonMain/kotlin/.../feature/`; the rest of this README explains how those two fit together. +- **Project names** — `rootProject.name` and the module name in [`settings.gradle.kts`](./settings.gradle.kts). Renaming either changes the package of the generated Compose resources class (`Res`). +- **Screens and configuration** — the sample `Binary-*.json` files under `reference-app/src/commonMain/composeResources/files/` and the renderers under `reference-app/src/commonMain/kotlin/.../feature/`. The rest of this README explains how the two fit together. ## Bundled OHS libraries -The app is assembled from the OHS Player library plus the OHS Foundational Libraries; versions are pinned in [`gradle/libs.versions.toml`](./gradle/libs.versions.toml): +The app combines the OHS Player library with the OHS Foundational Libraries. Versions are pinned in [`gradle/libs.versions.toml`](./gradle/libs.versions.toml): | Library | Purpose | | --- | --- | @@ -79,7 +90,7 @@ The app is assembled from the OHS Player library plus the OHS Foundational Libra ### Have an existing app? -If you cannot start from this template, depend on the player library directly — it is a library, not a framework, and can be adopted one screen at a time in any Kotlin Multiplatform or Android project: +You do not need this template to use OHS Player. The player is a library, not a framework: add it to any Kotlin Multiplatform or Android project and adopt it one screen at a time. ```kotlin commonMain.dependencies { @@ -87,11 +98,11 @@ commonMain.dependencies { } ``` -The [library README](https://github.com/ohs-foundation/ohs-player-reference-client-library#readme) is a standalone user guide; this repository then serves as the worked example. +The [library README](https://github.com/ohs-foundation/ohs-player-reference-client-library#readme) is a standalone user guide. This repository then serves as the worked example. ## From FHIR data to view state -A screen never consumes a raw FHIR resource. It consumes a typed *view-state* — a flat, serializable data class containing exactly the fields the screen needs. View-state is produced by a configuration-driven pipeline: +A screen never consumes a raw FHIR resource. It consumes a typed *view-state*: a flat, serializable data class with exactly the fields the screen needs. Four steps produce it: 1. **Author** configuration as FHIR `Binary` resources (a `ViewDefinition`, a `ViewJoinMap`, and a `ViewConfig`). 2. **Generate** typed Kotlin from those Binaries at build time via the `ig-codegen` plugin. @@ -191,7 +202,7 @@ data class PatientSummaryState( ### 3. Load configuration at runtime -A `ConfigStore` holds the parsed configuration, fed by a `ConfigSource`. The reference app reads the bundled Binaries; replacing this with a network fetch is the only change required to load configuration from a backend. See [`LocalConfigSource.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt): +A `ConfigStore` holds the parsed configuration and is fed by a `ConfigSource`. The reference app reads the bundled Binaries. To load configuration from a backend instead, the `ConfigSource` is the only thing to replace. See [`LocalConfigSource.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt): ```kotlin object LocalConfigSource : ConfigSource { @@ -215,7 +226,7 @@ object Extraction { ### 4. Extract view-state -`GenericStateExtractor.extract<T>()` selects the configuration for `T` by name, evaluates its FHIRPath columns against a `SearchResult`, and returns a list of typed `T`. A `SearchResult` carries the pivot resource plus any forward-included and reverse-included resources, mirroring a FHIR search response. +`GenericStateExtractor.extract<T>()` selects the configuration for `T` by name, evaluates its FHIRPath columns against a `SearchResult`, and returns a list of typed `T`. A `SearchResult` mirrors a FHIR search response: the pivot resource plus any forward-included and reverse-included resources. From [`PatientRepository.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/PatientRepository.kt): @@ -230,7 +241,7 @@ suspend fun getPatients(): List<PatientSummaryState> = } ``` -The FHIRPath engine holds mutable evaluation state and is not safe for concurrent use. Serialize extraction onto a single thread; the repository does this with `Dispatchers.Default.limitedParallelism(1)`. +The FHIRPath engine holds mutable evaluation state and is not safe for concurrent use, so run all extraction on a single thread. The repository does this with `Dispatchers.Default.limitedParallelism(1)`. ## Rendering view state @@ -287,7 +298,7 @@ fun buildAppViewRegistry(): ViewRegistry = ViewRegistry().apply { } ``` -A registry lookup is keyed by both view-type and state type, and throws `NoSuchElementException` naming the missing key if a renderer was not registered. +A registry lookup is keyed by both view-type and state type. If no renderer was registered for that pair, the lookup throws `NoSuchElementException` naming the missing key. ### 3. Install the registry @@ -307,7 +318,7 @@ fun App() { ### 4. Render -`ListScaffold` renders a list; `component(...)` and `layout(...)` name the view-types to resolve. An empty list short-circuits to `emptyState` without invoking the layout renderer, and omitting `layout(...)` falls back to `VerticalListRenderer`. See [`PatientListScreen.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt): +`ListScaffold` renders a list. In its builder, `component(...)` and `layout(...)` name the view-types to resolve; omitting `layout(...)` falls back to `VerticalListRenderer`, and an empty list renders `emptyState` without invoking the layout renderer. See [`PatientListScreen.kt`](./reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt): ```kotlin ListScaffold<PatientSummaryState>( @@ -337,33 +348,26 @@ Adding a field is a configuration change: add a column to the `ViewDefinition`, ## Testing -Run all multiplatform tests: - -```shell -./gradlew :reference-app:allTests -``` - -Run JVM tests only: - ```shell -./gradlew :reference-app:jvmTest +./gradlew :reference-app:allTests # all platforms +./gradlew :reference-app:jvmTest # JVM only ``` ## Deployment ### Continuous integration -Every pull request and push to `main` is validated by the [`ci.yml`](./.github/workflows/ci.yml) workflow: formatting (spotless), JVM tests, Android lint, JS/Wasm compilation, and iOS compile-and-link, each as a separate job. +The [`ci.yml`](./.github/workflows/ci.yml) workflow validates every pull request and push to `main`. It runs formatting (spotless), JVM tests, Android lint, JS/Wasm compilation, and iOS compile-and-link, each as a separate job. ### Release pipeline -Releases are produced by the [`release.yml`](./.github/workflows/release.yml) GitHub Actions workflow, triggered by a semantic version tag (`vX.Y.Z` or `vX.Y.Z-suffix`). The workflow builds and signs every platform, then publishes a GitHub Release with checksummed artifacts: +Pushing a semantic version tag (`vX.Y.Z` or `vX.Y.Z-suffix`) triggers the [`release.yml`](./.github/workflows/release.yml) workflow. It builds and signs every platform, then publishes a GitHub Release with checksummed artifacts: - Android APK (`assembleRelease`) - Desktop installers: Linux `.deb` and `.rpm`, Windows `.msi`, macOS `.dmg` - A portable Linux tarball (`createDistributable`) -A `workflow_dispatch` run performs a dry run: it builds, signs, and uploads artifacts without publishing a Release. The web (Wasm) and GitHub Pages jobs are currently gated off (`if: false`) pending a larger build runner; the web preview is deployed manually in the interim. +A `workflow_dispatch` run is a dry run: it builds, signs, and uploads artifacts but does not publish a Release. The web (Wasm) and GitHub Pages jobs are currently gated off (`if: false`) pending a larger build runner; the web preview is deployed manually in the interim. ### Local installers @@ -379,7 +383,7 @@ Build a native installer or distributable locally: ### Android release signing -Release builds read signing inputs from environment variables first, then from a `keystore.properties` file as a development fallback. To produce a signed release locally: +Release builds read signing inputs from environment variables first, then fall back to a `keystore.properties` file for development. To sign a release locally: ```shell cp keystore.properties.template keystore.properties @@ -387,7 +391,7 @@ cp keystore.properties.template keystore.properties ./gradlew :reference-app:bundleRelease ``` -`keystore.properties` is gitignored and must never be committed. The environment variables `ANDROID_KEYSTORE_PATH`, `ANDROID_KEY_ALIAS`, `ANDROID_KEY_PASSWORD`, and `ANDROID_STORE_PASSWORD` take precedence over the file when both are set. If neither is configured, release builds are emitted unsigned. +`keystore.properties` is gitignored and must never be committed. When both are set, the environment variables `ANDROID_KEYSTORE_PATH`, `ANDROID_KEY_ALIAS`, `ANDROID_KEY_PASSWORD`, and `ANDROID_STORE_PASSWORD` take precedence over the file. If neither is configured, release builds are emitted unsigned. --- From 1fde57d5f6b101961a5b5eb90d4edab58bfa459a Mon Sep 17 00:00:00 2001 From: fikrimilano <fikrimilano1@gmail.com> Date: Tue, 28 Jul 2026 20:27:37 +0700 Subject: [PATCH 09/10] Update naming to player-reference and player client --- README.md | 8 ++++---- gradle/libs.versions.toml | 4 ++-- .../codegen/generator/ViewTypeGenerator.kt | 2 +- .../ohs/player/codegen/model/ViewDefinition.kt | 2 +- .../ohs/player/codegen/util/GeneratorUtil.kt | 2 +- reference-app/build.gradle.kts | 4 ++-- .../kotlin/dev/ohs/player/reference/app/App.kt | 2 +- .../player/reference/app/AppViewRegistry.kt | 2 +- .../player/reference/app/data/Extraction.kt | 4 ++-- .../app/data/datasource/LocalConfigSource.kt | 4 ++-- .../app/data/datasource/SampleDataStore.kt | 2 +- .../data/repository/InMemoryFhirRepository.kt | 2 +- .../common/SectionCardLayoutRenderer.kt | 6 +++--- .../feature/group/list/GroupCardRenderer.kt | 4 ++-- .../group/list/GroupListRegistrations.kt | 8 ++++---- .../app/feature/group/list/GroupListScreen.kt | 4 ++-- .../group/profile/GroupHeaderRenderer.kt | 4 ++-- .../group/profile/GroupProfileRegistrations.kt | 6 +++--- .../group/profile/GroupProfileScreen.kt | 8 ++++---- .../group/profile/MemberItemRenderer.kt | 18 +++++++++--------- .../patient/list/PatientCardRenderer.kt | 4 ++-- .../patient/list/PatientListRegistrations.kt | 12 ++++++------ .../feature/patient/list/PatientListScreen.kt | 4 ++-- .../patient/profile/AllergyItemRenderer.kt | 4 ++-- .../profile/AllergyReactionItemRenderer.kt | 4 ++-- .../patient/profile/ConditionItemRenderer.kt | 4 ++-- .../patient/profile/ContactItemRenderer.kt | 4 ++-- .../profile/ImmunizationItemRenderer.kt | 4 ++-- .../patient/profile/MedicationItemRenderer.kt | 4 ++-- .../patient/profile/PatientHeaderRenderer.kt | 4 ++-- .../profile/PatientProfileRegistrations.kt | 6 +++--- .../patient/profile/PatientProfileScreen.kt | 8 ++++---- .../patient/profile/TelecomItemRenderer.kt | 4 ++-- .../questionnaire/QuestionnaireService.kt | 2 +- .../reference/app/AppViewRegistryTest.kt | 10 +++++----- .../patient/list/PatientListScreenTest.kt | 2 +- .../profile/PatientProfileScreenTest.kt | 2 +- settings.gradle.kts | 2 +- 38 files changed, 90 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index 3b596e9f..b7705744 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The desktop app is the fastest path. It needs only JDK 21 — no Android SDK, no ```shell git clone <repository-url> -cd ohs-player-reference-client-app +cd player-reference ./gradlew :reference-app:run ``` @@ -83,7 +83,7 @@ The app combines the OHS Player library with the OHS Foundational Libraries. Ver | Library | Purpose | | --- | --- | -| [`dev.ohs.player:reference-library`](https://github.com/ohs-foundation/ohs-player-reference-client-library) | Config-driven views using flattened data from FHIR resources (the player) | +| [`dev.ohs.player:client`](https://github.com/ohs-foundation/player-client) | Config-driven views using flattened data from FHIR resources (the player) | | `dev.ohs.fhir:fhir-model` | Typed Kotlin models for FHIR resources | | `dev.ohs.fhir:fhir-path` | FHIRPath expression evaluation | | `dev.ohs.fhir:fhir-data-capture` | FHIR Structured Data Capture (questionnaires) | @@ -94,11 +94,11 @@ You do not need this template to use OHS Player. The player is a library, not a ```kotlin commonMain.dependencies { - implementation("dev.ohs.player:reference-library:1.0.0-alpha01") + implementation("dev.ohs.player:client:1.0.0-alpha01") } ``` -The [library README](https://github.com/ohs-foundation/ohs-player-reference-client-library#readme) is a standalone user guide. This repository then serves as the worked example. +The [library README](https://github.com/ohs-foundation/player-client#readme) is a standalone user guide. This repository then serves as the worked example. ## From FHIR data to view state diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index abc5e251..34dd6db5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,7 +25,7 @@ navigation-compose = "2.9.2" material3 = "1.10.0-alpha05" kotlinxSerializationJson = "1.11.0" spotless = "8.6.0" -ohsPlayerReferenceLibrary = "1.0.0-alpha01" +ohsPlayerClient = "1.0.0-alpha01" ohsFhirModel = "1.0.0-beta05" ohsFhirPath = "1.0.0-beta03" kotlinxDatetime = "0.8.0" @@ -60,7 +60,7 @@ kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version kotlinpoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinpoet" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation-compose" } -ohs-player-reference-library = { module = "dev.ohs.player:reference-library", version.ref = "ohsPlayerReferenceLibrary" } +ohs-player-client = { module = "dev.ohs.player:client", version.ref = "ohsPlayerClient" } ohs-fhir-model = { module = "dev.ohs.fhir:fhir-model", version.ref = "ohsFhirModel" } ohs-fhir-path = { module = "dev.ohs.fhir:fhir-path", version.ref = "ohsFhirPath" } ionspin-bignum = { module = "com.ionspin.kotlin:bignum", version.ref = "ionspin-bignum" } diff --git a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt index 5f59508f..cc2a3438 100644 --- a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt +++ b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/generator/ViewTypeGenerator.kt @@ -34,7 +34,7 @@ class ViewTypeGenerator( private val outputDir: File, ) { - private val viewTypeClass = ClassName("dev.ohs.player.reference.library.registry", "ViewType") + private val viewTypeClass = ClassName("dev.ohs.player.client.registry", "ViewType") fun generate(codeSystem: CodeSystem) { FileSpec.builder("$basePackage.$subPackage", codeSystem.name) diff --git a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt index ecc58647..07c3e686 100644 --- a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt +++ b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/model/ViewDefinition.kt @@ -21,7 +21,7 @@ import kotlinx.serialization.Serializable * Codegen view of a ViewDefinition — only the fields code generation needs to derive the typed * state class: the resource and its column tree. Runtime concerns the generator never reads * (`constant`, `where`, `status`, …) are intentionally omitted; the full SQL-on-FHIR model lives in - * the library (`dev.ohs.player.reference.library.config.ViewDefinition`), where extraction uses them. Unknown + * the library (`dev.ohs.player.client.config.ViewDefinition`), where extraction uses them. Unknown * JSON keys are ignored on decode. */ @Serializable diff --git a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt index d5b7755f..08305332 100644 --- a/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt +++ b/ig-codegen/src/main/kotlin/dev/ohs/player/codegen/util/GeneratorUtil.kt @@ -29,7 +29,7 @@ private val fhirDateClass = ClassName("dev.ohs.fhir.model.r4", "FhirDate") private val fhirDateTimeClass = ClassName("dev.ohs.fhir.model.r4", "FhirDateTime") private val bigDecimalClass = ClassName("com.ionspin.kotlin.bignum.decimal", "BigDecimal") -private const val SERIALIZER_PKG = "dev.ohs.player.reference.library.config" +private const val SERIALIZER_PKG = "dev.ohs.player.client.config" private val fhirDateSerializer = ClassName(SERIALIZER_PKG, "FhirDateSerializer") private val fhirDateTimeSerializer = ClassName(SERIALIZER_PKG, "FhirDateTimeSerializer") private val fhirDecimalSerializer = ClassName(SERIALIZER_PKG, "FhirDecimalSerializer") diff --git a/reference-app/build.gradle.kts b/reference-app/build.gradle.kts index c14a96cb..28f79a71 100644 --- a/reference-app/build.gradle.kts +++ b/reference-app/build.gradle.kts @@ -58,7 +58,7 @@ kotlin { implementation(libs.androidx.activity.compose) } commonMain.dependencies { - implementation(libs.ohs.player.reference.library) + implementation(libs.ohs.player.client) implementation(libs.compose.runtime) implementation(libs.compose.foundation) implementation(libs.compose.material) @@ -216,7 +216,7 @@ val composePackageVersion: String = // * Kotlin/JS IR backend crashes lowering the generated sealed-interface dispatch tables in // dev.ohs.fhir:fhir-path (StackOverflow in KotlinLikeDumper). The main JS compile is fine; only // the JS *test* executable lowering trips because the test source set exercises those types. -// Mirrors the same skip in the ohs-player-reference-client-library repo. +// Mirrors the same skip in the player-client repo. // // * Android/JVM host unit tests need a host Android framework (NoClassDefFoundError). // diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt index 8fc2e864..4e532d60 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt @@ -29,7 +29,7 @@ import dev.ohs.player.reference.app.feature.group.profile.GroupProfileScreen import dev.ohs.player.reference.app.feature.patient.profile.PatientProfileScreen import dev.ohs.player.reference.app.feature.questionnaire.QuestionnaireHostScreen import dev.ohs.player.reference.app.feature.questionnaire.QuestionnaireIds -import dev.ohs.player.reference.library.registry.LocalViewRegistry +import dev.ohs.player.client.registry.LocalViewRegistry import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt index cebae40d..042dff24 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt @@ -19,7 +19,7 @@ import dev.ohs.player.reference.app.feature.group.list.registerGroupList import dev.ohs.player.reference.app.feature.group.profile.registerGroupProfile import dev.ohs.player.reference.app.feature.patient.list.registerPatientList import dev.ohs.player.reference.app.feature.patient.profile.registerPatientProfile -import dev.ohs.player.reference.library.registry.ViewRegistry +import dev.ohs.player.client.registry.ViewRegistry fun buildAppViewRegistry(): ViewRegistry = ViewRegistry().apply { diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt index b5168a66..ac8cc03c 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt @@ -16,8 +16,8 @@ package dev.ohs.player.reference.app.data import dev.ohs.player.reference.app.data.datasource.LocalConfigSource -import dev.ohs.player.reference.library.config.ConfigStore -import dev.ohs.player.reference.library.extractor.GenericStateExtractor +import dev.ohs.player.client.config.ConfigStore +import dev.ohs.player.client.extractor.GenericStateExtractor /** * App-wide extraction wiring: the runtime [ConfigStore] (fed by bundled config Binaries) and the diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt index 58aed965..3fd1e125 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt @@ -16,8 +16,8 @@ package dev.ohs.player.reference.app.data.datasource import dev.ohs.player.generated.GeneratedConfigManifest -import dev.ohs.player.reference.library.config.ConfigSource -import ohs_player_reference_client_app.reference_app.generated.resources.Res +import dev.ohs.player.client.config.ConfigSource +import player_reference.reference_app.generated.resources.Res /** * Loads the runtime config Binaries the extractor needs (ViewJoinMap + ViewDefinition) from diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt index b6a15a86..d3e2fdf3 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt @@ -25,7 +25,7 @@ import dev.ohs.fhir.model.r4.Resource import dev.ohs.player.reference.app.data.AppDependencies import dev.ohs.player.reference.app.data.patientIdFromReference import dev.ohs.player.reference.app.data.repository.FhirRepository -import dev.ohs.player.reference.library.model.SearchResult +import dev.ohs.player.client.model.SearchResult /** Returns all patient IDs — used by the patient list screen. */ suspend fun allPatientIds( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt index 59971864..fa79406b 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt @@ -33,7 +33,7 @@ import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -import ohs_player_reference_client_app.reference_app.generated.resources.Res +import player_reference.reference_app.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi /** diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt index 7b9ddee5..59c54489 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt @@ -53,9 +53,9 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.SectionCardConfig -import dev.ohs.player.reference.library.renderer.ConfiguredRenderer -import dev.ohs.player.reference.library.renderer.LayoutRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ConfiguredRenderer +import dev.ohs.player.client.renderer.LayoutRenderer +import dev.ohs.player.client.renderer.RenderOptions /** * Layout renderer that wraps a list of items inside a titled section card. Registered under diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt index b7b233a3..b19c0666 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt @@ -18,8 +18,8 @@ package dev.ohs.player.reference.app.feature.group.list import androidx.compose.runtime.Composable import dev.ohs.player.generated.config.GroupCardConfig import dev.ohs.player.generated.state.GroupListState -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class GroupCardRenderer : ComponentRenderer<GroupListState, GroupCardConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt index 2923029d..cc045b04 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt @@ -20,10 +20,10 @@ import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.GroupCardConfig import dev.ohs.player.generated.state.GroupListState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.reference.library.layout.VerticalListRenderer -import dev.ohs.player.reference.library.registry.ViewRegistry -import dev.ohs.player.reference.library.registry.registerComponent -import dev.ohs.player.reference.library.registry.registerLayout +import dev.ohs.player.client.layout.VerticalListRenderer +import dev.ohs.player.client.registry.ViewRegistry +import dev.ohs.player.client.registry.registerComponent +import dev.ohs.player.client.registry.registerLayout fun ViewRegistry.registerGroupList() { registerComponent<GroupListState, GroupCardConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt index 76b5544f..d6f6255c 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt @@ -37,8 +37,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import dev.ohs.player.generated.state.GroupListState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.reference.library.layout.VerticalListRenderer -import dev.ohs.player.reference.library.scaffold.ListScaffold +import dev.ohs.player.client.layout.VerticalListRenderer +import dev.ohs.player.client.scaffold.ListScaffold @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt index b0de758b..8f8f238f 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt @@ -41,8 +41,8 @@ import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.GroupHeaderConfig import dev.ohs.player.generated.state.GroupHeaderState import dev.ohs.player.reference.app.feature.component.common.Chip -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class GroupHeaderRenderer : ComponentRenderer<GroupHeaderState, GroupHeaderConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt index 96fc3c04..abe03927 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt @@ -24,9 +24,9 @@ import dev.ohs.player.generated.state.GroupHeaderState import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.reference.app.feature.component.common.SectionCardLayoutRenderer -import dev.ohs.player.reference.library.registry.ViewRegistry -import dev.ohs.player.reference.library.registry.registerComponent -import dev.ohs.player.reference.library.registry.registerLayout +import dev.ohs.player.client.registry.ViewRegistry +import dev.ohs.player.client.registry.registerComponent +import dev.ohs.player.client.registry.registerLayout fun ViewRegistry.registerGroupProfile() { registerComponent<GroupHeaderState, GroupHeaderConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt index 91d63afa..fac7be0f 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt @@ -45,10 +45,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel import dev.ohs.player.generated.state.GroupHeaderState import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.reference.library.registry.LocalViewRegistry -import dev.ohs.player.reference.library.registry.componentRenderer -import dev.ohs.player.reference.library.registry.layoutRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.registry.LocalViewRegistry +import dev.ohs.player.client.registry.componentRenderer +import dev.ohs.player.client.registry.layoutRenderer +import dev.ohs.player.client.renderer.RenderOptions @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt index a4d9e63a..4b8e94a0 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt @@ -40,15 +40,15 @@ import dev.ohs.player.generated.config.MemberItemConfig import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.reference.app.feature.component.common.Chip import dev.ohs.player.reference.app.feature.patient.list.calculateAge -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions -import ohs_player_reference_client_app.reference_app.generated.resources.Res -import ohs_player_reference_client_app.reference_app.generated.resources.relationship_child -import ohs_player_reference_client_app.reference_app.generated.resources.relationship_guardian -import ohs_player_reference_client_app.reference_app.generated.resources.relationship_non_relative -import ohs_player_reference_client_app.reference_app.generated.resources.relationship_other_relative -import ohs_player_reference_client_app.reference_app.generated.resources.relationship_parent -import ohs_player_reference_client_app.reference_app.generated.resources.relationship_spouse +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions +import player_reference.reference_app.generated.resources.Res +import player_reference.reference_app.generated.resources.relationship_child +import player_reference.reference_app.generated.resources.relationship_guardian +import player_reference.reference_app.generated.resources.relationship_non_relative +import player_reference.reference_app.generated.resources.relationship_other_relative +import player_reference.reference_app.generated.resources.relationship_parent +import player_reference.reference_app.generated.resources.relationship_spouse import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.stringResource diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt index b94dd55e..53ce7a1d 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt @@ -18,8 +18,8 @@ package dev.ohs.player.reference.app.feature.patient.list import androidx.compose.runtime.Composable import dev.ohs.player.generated.config.PatientCardConfig import dev.ohs.player.generated.state.PatientSummaryState -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class PatientCardRenderer : ComponentRenderer<PatientSummaryState, PatientCardConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt index 170d1dc0..2e018b15 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt @@ -20,12 +20,12 @@ import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.PatientCardConfig import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.reference.library.layout.GridListRenderer -import dev.ohs.player.reference.library.layout.HorizontalListRenderer -import dev.ohs.player.reference.library.layout.VerticalListRenderer -import dev.ohs.player.reference.library.registry.ViewRegistry -import dev.ohs.player.reference.library.registry.registerComponent -import dev.ohs.player.reference.library.registry.registerLayout +import dev.ohs.player.client.layout.GridListRenderer +import dev.ohs.player.client.layout.HorizontalListRenderer +import dev.ohs.player.client.layout.VerticalListRenderer +import dev.ohs.player.client.registry.ViewRegistry +import dev.ohs.player.client.registry.registerComponent +import dev.ohs.player.client.registry.registerLayout fun ViewRegistry.registerPatientList() { registerComponent<PatientSummaryState, PatientCardConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt index 14e3e1a5..88963751 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt @@ -31,8 +31,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.reference.library.layout.VerticalListRenderer -import dev.ohs.player.reference.library.scaffold.ListScaffold +import dev.ohs.player.client.layout.VerticalListRenderer +import dev.ohs.player.client.scaffold.ListScaffold @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt index 31e3bfee..42b0ac0f 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt @@ -22,8 +22,8 @@ import dev.ohs.player.generated.config.AllergyItemConfig import dev.ohs.player.generated.state.PatientAllergyState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class AllergyItemRenderer : ComponentRenderer<PatientAllergyState, AllergyItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt index fc84540c..a5447858 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt @@ -28,8 +28,8 @@ import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.AllergyReactionItemConfig import dev.ohs.player.generated.state.AllergyReactionState import dev.ohs.player.reference.app.feature.component.common.Chip -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class AllergyReactionItemRenderer : ComponentRenderer<AllergyReactionState, AllergyReactionItemConfig> { diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt index 49d09bb2..a7a9f37d 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt @@ -22,8 +22,8 @@ import dev.ohs.player.generated.config.ConditionItemConfig import dev.ohs.player.generated.state.PatientConditionState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions private val AmberAccent = Color(0xFFE37400) diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt index b4d36a2e..aeefbdee 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt @@ -34,8 +34,8 @@ import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.ContactItemConfig import dev.ohs.player.generated.state.PatientContactState import dev.ohs.player.reference.app.feature.component.common.Chip -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class ContactItemRenderer : ComponentRenderer<PatientContactState, ContactItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt index 5f5c27c2..9682c94a 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt @@ -22,8 +22,8 @@ import dev.ohs.player.generated.config.ImmunizationItemConfig import dev.ohs.player.generated.state.PatientImmunizationState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class ImmunizationItemRenderer : ComponentRenderer<PatientImmunizationState, ImmunizationItemConfig> { diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt index 9d0e0664..626c3cc3 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt @@ -22,8 +22,8 @@ import dev.ohs.player.generated.config.MedicationItemConfig import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class MedicationItemRenderer : ComponentRenderer<PatientMedicationState, MedicationItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt index 40da9608..42d87e44 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt @@ -40,8 +40,8 @@ import dev.ohs.player.generated.config.PatientHeaderConfig import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.reference.app.feature.component.common.StatusChip import dev.ohs.player.reference.app.feature.patient.list.calculateAge -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class PatientHeaderRenderer : ComponentRenderer<PatientSummaryState, PatientHeaderConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt index 7a2e0342..a03a2d00 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt @@ -41,9 +41,9 @@ import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.state.PatientTelecomState import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.reference.app.feature.component.common.SectionCardLayoutRenderer -import dev.ohs.player.reference.library.registry.ViewRegistry -import dev.ohs.player.reference.library.registry.registerComponent -import dev.ohs.player.reference.library.registry.registerLayout +import dev.ohs.player.client.registry.ViewRegistry +import dev.ohs.player.client.registry.registerComponent +import dev.ohs.player.client.registry.registerLayout fun ViewRegistry.registerPatientProfile() { registerComponent<PatientSummaryState, PatientHeaderConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt index 59b4def2..fb700dd8 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt @@ -54,10 +54,10 @@ import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.state.PatientTelecomState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.reference.library.registry.LocalViewRegistry -import dev.ohs.player.reference.library.registry.componentRenderer -import dev.ohs.player.reference.library.registry.layoutRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.registry.LocalViewRegistry +import dev.ohs.player.client.registry.componentRenderer +import dev.ohs.player.client.registry.layoutRenderer +import dev.ohs.player.client.renderer.RenderOptions @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt index 8f8ee02e..8e6b9e22 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt @@ -31,8 +31,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import dev.ohs.player.generated.config.TelecomItemConfig import dev.ohs.player.generated.state.PatientTelecomState -import dev.ohs.player.reference.library.renderer.ComponentRenderer -import dev.ohs.player.reference.library.renderer.RenderOptions +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions class TelecomItemRenderer : ComponentRenderer<PatientTelecomState, TelecomItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt index 4c5187c3..17f69ef9 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt @@ -37,7 +37,7 @@ import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -import ohs_player_reference_client_app.reference_app.generated.resources.Res +import player_reference.reference_app.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi /** Caller-supplied identifiers describing why/for-whom a questionnaire was launched. */ diff --git a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt index 07436a85..fc5760d5 100644 --- a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt +++ b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt @@ -23,11 +23,11 @@ import dev.ohs.player.generated.state.PatientImmunizationState import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.reference.library.layout.GridListRenderer -import dev.ohs.player.reference.library.layout.HorizontalListRenderer -import dev.ohs.player.reference.library.layout.VerticalListRenderer -import dev.ohs.player.reference.library.registry.componentRenderer -import dev.ohs.player.reference.library.registry.layoutRenderer +import dev.ohs.player.client.layout.GridListRenderer +import dev.ohs.player.client.layout.HorizontalListRenderer +import dev.ohs.player.client.layout.VerticalListRenderer +import dev.ohs.player.client.registry.componentRenderer +import dev.ohs.player.client.registry.layoutRenderer import kotlin.test.Test class AppViewRegistryTest { diff --git a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt index be01f985..662001f6 100644 --- a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt +++ b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.runComposeUiTest import dev.ohs.player.reference.app.buildAppViewRegistry -import dev.ohs.player.reference.library.registry.LocalViewRegistry +import dev.ohs.player.client.registry.LocalViewRegistry import kotlin.test.Test import kotlin.test.assertEquals diff --git a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt index 59b44343..cd8de8c2 100644 --- a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt +++ b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.runComposeUiTest import dev.ohs.player.reference.app.buildAppViewRegistry -import dev.ohs.player.reference.library.registry.LocalViewRegistry +import dev.ohs.player.client.registry.LocalViewRegistry import kotlin.test.Test import kotlin.test.assertTrue diff --git a/settings.gradle.kts b/settings.gradle.kts index 1fc85225..ae97d93f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -rootProject.name = "ohs-player-reference-client-app" +rootProject.name = "player-reference" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") From a8878a55e3edd78f044d228eb8e039117f8894f1 Mon Sep 17 00:00:00 2001 From: fikrimilano <fikrimilano1@gmail.com> Date: Tue, 28 Jul 2026 20:31:25 +0700 Subject: [PATCH 10/10] Spotless --- .../kotlin/dev/ohs/player/reference/app/App.kt | 2 +- .../dev/ohs/player/reference/app/AppViewRegistry.kt | 2 +- .../dev/ohs/player/reference/app/data/Extraction.kt | 2 +- .../reference/app/data/datasource/LocalConfigSource.kt | 2 +- .../reference/app/data/datasource/SampleDataStore.kt | 2 +- .../app/data/repository/InMemoryFhirRepository.kt | 2 +- .../component/common/SectionCardLayoutRenderer.kt | 2 +- .../app/feature/group/list/GroupCardRenderer.kt | 4 ++-- .../app/feature/group/list/GroupListRegistrations.kt | 6 +++--- .../app/feature/group/list/GroupListScreen.kt | 4 ++-- .../app/feature/group/profile/GroupHeaderRenderer.kt | 4 ++-- .../feature/group/profile/GroupProfileRegistrations.kt | 6 +++--- .../app/feature/group/profile/GroupProfileScreen.kt | 6 +++--- .../app/feature/group/profile/MemberItemRenderer.kt | 8 ++++---- .../app/feature/patient/list/PatientCardRenderer.kt | 4 ++-- .../feature/patient/list/PatientListRegistrations.kt | 6 +++--- .../app/feature/patient/list/PatientListScreen.kt | 4 ++-- .../app/feature/patient/profile/AllergyItemRenderer.kt | 4 ++-- .../patient/profile/AllergyReactionItemRenderer.kt | 4 ++-- .../feature/patient/profile/ConditionItemRenderer.kt | 4 ++-- .../app/feature/patient/profile/ContactItemRenderer.kt | 4 ++-- .../patient/profile/ImmunizationItemRenderer.kt | 4 ++-- .../feature/patient/profile/MedicationItemRenderer.kt | 4 ++-- .../feature/patient/profile/PatientHeaderRenderer.kt | 4 ++-- .../patient/profile/PatientProfileRegistrations.kt | 6 +++--- .../feature/patient/profile/PatientProfileScreen.kt | 8 ++++---- .../app/feature/patient/profile/TelecomItemRenderer.kt | 4 ++-- .../app/feature/questionnaire/QuestionnaireService.kt | 2 +- .../ohs/player/reference/app/AppViewRegistryTest.kt | 10 +++++----- .../app/feature/patient/list/PatientListScreenTest.kt | 2 +- .../patient/profile/PatientProfileScreenTest.kt | 2 +- 31 files changed, 64 insertions(+), 64 deletions(-) diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt index 4e532d60..e2805925 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/App.kt @@ -24,12 +24,12 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import androidx.savedstate.read +import dev.ohs.player.client.registry.LocalViewRegistry import dev.ohs.player.reference.app.feature.group.list.GroupListScreen import dev.ohs.player.reference.app.feature.group.profile.GroupProfileScreen import dev.ohs.player.reference.app.feature.patient.profile.PatientProfileScreen import dev.ohs.player.reference.app.feature.questionnaire.QuestionnaireHostScreen import dev.ohs.player.reference.app.feature.questionnaire.QuestionnaireIds -import dev.ohs.player.client.registry.LocalViewRegistry import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt index 042dff24..5ba12039 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/AppViewRegistry.kt @@ -15,11 +15,11 @@ */ package dev.ohs.player.reference.app +import dev.ohs.player.client.registry.ViewRegistry import dev.ohs.player.reference.app.feature.group.list.registerGroupList import dev.ohs.player.reference.app.feature.group.profile.registerGroupProfile import dev.ohs.player.reference.app.feature.patient.list.registerPatientList import dev.ohs.player.reference.app.feature.patient.profile.registerPatientProfile -import dev.ohs.player.client.registry.ViewRegistry fun buildAppViewRegistry(): ViewRegistry = ViewRegistry().apply { diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt index ac8cc03c..a66259f4 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/Extraction.kt @@ -15,9 +15,9 @@ */ package dev.ohs.player.reference.app.data -import dev.ohs.player.reference.app.data.datasource.LocalConfigSource import dev.ohs.player.client.config.ConfigStore import dev.ohs.player.client.extractor.GenericStateExtractor +import dev.ohs.player.reference.app.data.datasource.LocalConfigSource /** * App-wide extraction wiring: the runtime [ConfigStore] (fed by bundled config Binaries) and the diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt index 3fd1e125..713a105e 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/LocalConfigSource.kt @@ -15,8 +15,8 @@ */ package dev.ohs.player.reference.app.data.datasource -import dev.ohs.player.generated.GeneratedConfigManifest import dev.ohs.player.client.config.ConfigSource +import dev.ohs.player.generated.GeneratedConfigManifest import player_reference.reference_app.generated.resources.Res /** diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt index d3e2fdf3..a0f87a6a 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/datasource/SampleDataStore.kt @@ -22,10 +22,10 @@ import dev.ohs.fhir.model.r4.Immunization import dev.ohs.fhir.model.r4.MedicationRequest import dev.ohs.fhir.model.r4.Patient import dev.ohs.fhir.model.r4.Resource +import dev.ohs.player.client.model.SearchResult import dev.ohs.player.reference.app.data.AppDependencies import dev.ohs.player.reference.app.data.patientIdFromReference import dev.ohs.player.reference.app.data.repository.FhirRepository -import dev.ohs.player.client.model.SearchResult /** Returns all patient IDs — used by the patient list screen. */ suspend fun allPatientIds( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt index fa79406b..f56c2596 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/data/repository/InMemoryFhirRepository.kt @@ -33,8 +33,8 @@ import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -import player_reference.reference_app.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi +import player_reference.reference_app.generated.resources.Res /** * TODO(#58): Temporary workaround until FHIREngine integration is available. Remove this once diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt index 59c54489..8b319ddc 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/component/common/SectionCardLayoutRenderer.kt @@ -52,10 +52,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import dev.ohs.player.generated.config.SectionCardConfig import dev.ohs.player.client.renderer.ConfiguredRenderer import dev.ohs.player.client.renderer.LayoutRenderer import dev.ohs.player.client.renderer.RenderOptions +import dev.ohs.player.generated.config.SectionCardConfig /** * Layout renderer that wraps a list of items inside a titled section card. Registered under diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt index b19c0666..6c718cf5 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupCardRenderer.kt @@ -16,10 +16,10 @@ package dev.ohs.player.reference.app.feature.group.list import androidx.compose.runtime.Composable -import dev.ohs.player.generated.config.GroupCardConfig -import dev.ohs.player.generated.state.GroupListState import dev.ohs.player.client.renderer.ComponentRenderer import dev.ohs.player.client.renderer.RenderOptions +import dev.ohs.player.generated.config.GroupCardConfig +import dev.ohs.player.generated.state.GroupListState class GroupCardRenderer : ComponentRenderer<GroupListState, GroupCardConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt index cc045b04..bf2f869c 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListRegistrations.kt @@ -17,13 +17,13 @@ package dev.ohs.player.reference.app.feature.group.list import androidx.compose.foundation.layout.PaddingValues import androidx.compose.ui.unit.dp -import dev.ohs.player.generated.config.GroupCardConfig -import dev.ohs.player.generated.state.GroupListState -import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.client.layout.VerticalListRenderer import dev.ohs.player.client.registry.ViewRegistry import dev.ohs.player.client.registry.registerComponent import dev.ohs.player.client.registry.registerLayout +import dev.ohs.player.generated.config.GroupCardConfig +import dev.ohs.player.generated.state.GroupListState +import dev.ohs.player.generated.viewtype.ViewTypeCS fun ViewRegistry.registerGroupList() { registerComponent<GroupListState, GroupCardConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt index d6f6255c..3f145a76 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/list/GroupListScreen.kt @@ -35,10 +35,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel -import dev.ohs.player.generated.state.GroupListState -import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.client.layout.VerticalListRenderer import dev.ohs.player.client.scaffold.ListScaffold +import dev.ohs.player.generated.state.GroupListState +import dev.ohs.player.generated.viewtype.ViewTypeCS @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt index 8f8f238f..7191b1cc 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupHeaderRenderer.kt @@ -38,11 +38,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.GroupHeaderConfig import dev.ohs.player.generated.state.GroupHeaderState import dev.ohs.player.reference.app.feature.component.common.Chip -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions class GroupHeaderRenderer : ComponentRenderer<GroupHeaderState, GroupHeaderConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt index abe03927..0d24ae62 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileRegistrations.kt @@ -17,6 +17,9 @@ package dev.ohs.player.reference.app.feature.group.profile import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Person +import dev.ohs.player.client.registry.ViewRegistry +import dev.ohs.player.client.registry.registerComponent +import dev.ohs.player.client.registry.registerLayout import dev.ohs.player.generated.config.GroupHeaderConfig import dev.ohs.player.generated.config.MemberItemConfig import dev.ohs.player.generated.config.SectionCardConfig @@ -24,9 +27,6 @@ import dev.ohs.player.generated.state.GroupHeaderState import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.reference.app.feature.component.common.SectionCardLayoutRenderer -import dev.ohs.player.client.registry.ViewRegistry -import dev.ohs.player.client.registry.registerComponent -import dev.ohs.player.client.registry.registerLayout fun ViewRegistry.registerGroupProfile() { registerComponent<GroupHeaderState, GroupHeaderConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt index fac7be0f..2fb94272 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/GroupProfileScreen.kt @@ -42,13 +42,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel -import dev.ohs.player.generated.state.GroupHeaderState -import dev.ohs.player.generated.state.GroupMemberState -import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.client.registry.LocalViewRegistry import dev.ohs.player.client.registry.componentRenderer import dev.ohs.player.client.registry.layoutRenderer import dev.ohs.player.client.renderer.RenderOptions +import dev.ohs.player.generated.state.GroupHeaderState +import dev.ohs.player.generated.state.GroupMemberState +import dev.ohs.player.generated.viewtype.ViewTypeCS @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt index 4b8e94a0..51635b73 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/group/profile/MemberItemRenderer.kt @@ -36,12 +36,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.MemberItemConfig import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.reference.app.feature.component.common.Chip import dev.ohs.player.reference.app.feature.patient.list.calculateAge -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import player_reference.reference_app.generated.resources.Res import player_reference.reference_app.generated.resources.relationship_child import player_reference.reference_app.generated.resources.relationship_guardian @@ -49,8 +51,6 @@ import player_reference.reference_app.generated.resources.relationship_non_relat import player_reference.reference_app.generated.resources.relationship_other_relative import player_reference.reference_app.generated.resources.relationship_parent import player_reference.reference_app.generated.resources.relationship_spouse -import org.jetbrains.compose.resources.StringResource -import org.jetbrains.compose.resources.stringResource class MemberItemRenderer : ComponentRenderer<GroupMemberState, MemberItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt index 53ce7a1d..ecb28dd2 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientCardRenderer.kt @@ -16,10 +16,10 @@ package dev.ohs.player.reference.app.feature.patient.list import androidx.compose.runtime.Composable -import dev.ohs.player.generated.config.PatientCardConfig -import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.client.renderer.ComponentRenderer import dev.ohs.player.client.renderer.RenderOptions +import dev.ohs.player.generated.config.PatientCardConfig +import dev.ohs.player.generated.state.PatientSummaryState class PatientCardRenderer : ComponentRenderer<PatientSummaryState, PatientCardConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt index 2e018b15..5a4aacaf 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListRegistrations.kt @@ -17,15 +17,15 @@ package dev.ohs.player.reference.app.feature.patient.list import androidx.compose.foundation.layout.PaddingValues import androidx.compose.ui.unit.dp -import dev.ohs.player.generated.config.PatientCardConfig -import dev.ohs.player.generated.state.PatientSummaryState -import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.client.layout.GridListRenderer import dev.ohs.player.client.layout.HorizontalListRenderer import dev.ohs.player.client.layout.VerticalListRenderer import dev.ohs.player.client.registry.ViewRegistry import dev.ohs.player.client.registry.registerComponent import dev.ohs.player.client.registry.registerLayout +import dev.ohs.player.generated.config.PatientCardConfig +import dev.ohs.player.generated.state.PatientSummaryState +import dev.ohs.player.generated.viewtype.ViewTypeCS fun ViewRegistry.registerPatientList() { registerComponent<PatientSummaryState, PatientCardConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt index 88963751..81419f27 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreen.kt @@ -29,10 +29,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel -import dev.ohs.player.generated.state.PatientSummaryState -import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.client.layout.VerticalListRenderer import dev.ohs.player.client.scaffold.ListScaffold +import dev.ohs.player.generated.state.PatientSummaryState +import dev.ohs.player.generated.viewtype.ViewTypeCS @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt index 42b0ac0f..9008e004 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyItemRenderer.kt @@ -18,12 +18,12 @@ package dev.ohs.player.reference.app.feature.patient.profile import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.AllergyItemConfig import dev.ohs.player.generated.state.PatientAllergyState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions class AllergyItemRenderer : ComponentRenderer<PatientAllergyState, AllergyItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt index a5447858..c08cf83f 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/AllergyReactionItemRenderer.kt @@ -25,11 +25,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.AllergyReactionItemConfig import dev.ohs.player.generated.state.AllergyReactionState import dev.ohs.player.reference.app.feature.component.common.Chip -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions class AllergyReactionItemRenderer : ComponentRenderer<AllergyReactionState, AllergyReactionItemConfig> { diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt index a7a9f37d..0289eee8 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ConditionItemRenderer.kt @@ -18,12 +18,12 @@ package dev.ohs.player.reference.app.feature.patient.profile import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.ConditionItemConfig import dev.ohs.player.generated.state.PatientConditionState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions private val AmberAccent = Color(0xFFE37400) diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt index aeefbdee..8fb5799e 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ContactItemRenderer.kt @@ -31,11 +31,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.ContactItemConfig import dev.ohs.player.generated.state.PatientContactState import dev.ohs.player.reference.app.feature.component.common.Chip -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions class ContactItemRenderer : ComponentRenderer<PatientContactState, ContactItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt index 9682c94a..08b06a15 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/ImmunizationItemRenderer.kt @@ -18,12 +18,12 @@ package dev.ohs.player.reference.app.feature.patient.profile import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.ImmunizationItemConfig import dev.ohs.player.generated.state.PatientImmunizationState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions class ImmunizationItemRenderer : ComponentRenderer<PatientImmunizationState, ImmunizationItemConfig> { diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt index 626c3cc3..a17d504a 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/MedicationItemRenderer.kt @@ -18,12 +18,12 @@ package dev.ohs.player.reference.app.feature.patient.profile import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.MedicationItemConfig import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.reference.app.feature.component.common.StatusChipData import dev.ohs.player.reference.app.feature.component.common.StatusRow -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions class MedicationItemRenderer : ComponentRenderer<PatientMedicationState, MedicationItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt index 42d87e44..135961c0 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientHeaderRenderer.kt @@ -36,12 +36,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import dev.ohs.player.client.renderer.ComponentRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.config.PatientHeaderConfig import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.reference.app.feature.component.common.StatusChip import dev.ohs.player.reference.app.feature.patient.list.calculateAge -import dev.ohs.player.client.renderer.ComponentRenderer -import dev.ohs.player.client.renderer.RenderOptions class PatientHeaderRenderer : ComponentRenderer<PatientSummaryState, PatientHeaderConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt index a03a2d00..801a0c0c 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileRegistrations.kt @@ -22,6 +22,9 @@ import androidx.compose.material.icons.filled.Info import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.Phone import androidx.compose.material.icons.filled.Warning +import dev.ohs.player.client.registry.ViewRegistry +import dev.ohs.player.client.registry.registerComponent +import dev.ohs.player.client.registry.registerLayout import dev.ohs.player.generated.config.AllergyItemConfig import dev.ohs.player.generated.config.AllergyReactionItemConfig import dev.ohs.player.generated.config.ConditionItemConfig @@ -41,9 +44,6 @@ import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.state.PatientTelecomState import dev.ohs.player.generated.viewtype.ViewTypeCS import dev.ohs.player.reference.app.feature.component.common.SectionCardLayoutRenderer -import dev.ohs.player.client.registry.ViewRegistry -import dev.ohs.player.client.registry.registerComponent -import dev.ohs.player.client.registry.registerLayout fun ViewRegistry.registerPatientProfile() { registerComponent<PatientSummaryState, PatientHeaderConfig>( diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt index fb700dd8..0e49f4d7 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreen.kt @@ -45,6 +45,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import dev.ohs.player.client.registry.LocalViewRegistry +import dev.ohs.player.client.registry.componentRenderer +import dev.ohs.player.client.registry.layoutRenderer +import dev.ohs.player.client.renderer.RenderOptions import dev.ohs.player.generated.state.AllergyReactionState import dev.ohs.player.generated.state.PatientAllergyState import dev.ohs.player.generated.state.PatientConditionState @@ -54,10 +58,6 @@ import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.state.PatientTelecomState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.client.registry.LocalViewRegistry -import dev.ohs.player.client.registry.componentRenderer -import dev.ohs.player.client.registry.layoutRenderer -import dev.ohs.player.client.renderer.RenderOptions @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt index 8e6b9e22..1370f04d 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/patient/profile/TelecomItemRenderer.kt @@ -29,10 +29,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import dev.ohs.player.generated.config.TelecomItemConfig -import dev.ohs.player.generated.state.PatientTelecomState import dev.ohs.player.client.renderer.ComponentRenderer import dev.ohs.player.client.renderer.RenderOptions +import dev.ohs.player.generated.config.TelecomItemConfig +import dev.ohs.player.generated.state.PatientTelecomState class TelecomItemRenderer : ComponentRenderer<PatientTelecomState, TelecomItemConfig> { @Composable diff --git a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt index 17f69ef9..4abaf4bf 100644 --- a/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt +++ b/reference-app/src/commonMain/kotlin/dev/ohs/player/reference/app/feature/questionnaire/QuestionnaireService.kt @@ -37,8 +37,8 @@ import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -import player_reference.reference_app.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi +import player_reference.reference_app.generated.resources.Res /** Caller-supplied identifiers describing why/for-whom a questionnaire was launched. */ data class QuestionnaireLaunchContext(val patientId: String? = null, val groupId: String? = null) diff --git a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt index fc5760d5..e70b6094 100644 --- a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt +++ b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/AppViewRegistryTest.kt @@ -15,6 +15,11 @@ */ package dev.ohs.player.reference.app +import dev.ohs.player.client.layout.GridListRenderer +import dev.ohs.player.client.layout.HorizontalListRenderer +import dev.ohs.player.client.layout.VerticalListRenderer +import dev.ohs.player.client.registry.componentRenderer +import dev.ohs.player.client.registry.layoutRenderer import dev.ohs.player.generated.state.GroupListState import dev.ohs.player.generated.state.GroupMemberState import dev.ohs.player.generated.state.PatientAllergyState @@ -23,11 +28,6 @@ import dev.ohs.player.generated.state.PatientImmunizationState import dev.ohs.player.generated.state.PatientMedicationState import dev.ohs.player.generated.state.PatientSummaryState import dev.ohs.player.generated.viewtype.ViewTypeCS -import dev.ohs.player.client.layout.GridListRenderer -import dev.ohs.player.client.layout.HorizontalListRenderer -import dev.ohs.player.client.layout.VerticalListRenderer -import dev.ohs.player.client.registry.componentRenderer -import dev.ohs.player.client.registry.layoutRenderer import kotlin.test.Test class AppViewRegistryTest { diff --git a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt index 662001f6..449961fb 100644 --- a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt +++ b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/list/PatientListScreenTest.kt @@ -22,8 +22,8 @@ import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.runComposeUiTest -import dev.ohs.player.reference.app.buildAppViewRegistry import dev.ohs.player.client.registry.LocalViewRegistry +import dev.ohs.player.reference.app.buildAppViewRegistry import kotlin.test.Test import kotlin.test.assertEquals diff --git a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt index cd8de8c2..3b0a1d3e 100644 --- a/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt +++ b/reference-app/src/commonTest/kotlin/dev/ohs/player/reference/app/feature/patient/profile/PatientProfileScreenTest.kt @@ -23,8 +23,8 @@ import androidx.compose.ui.test.hasText import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.runComposeUiTest -import dev.ohs.player.reference.app.buildAppViewRegistry import dev.ohs.player.client.registry.LocalViewRegistry +import dev.ohs.player.reference.app.buildAppViewRegistry import kotlin.test.Test import kotlin.test.assertTrue