diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index 4f42237..3501227 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -243,6 +243,16 @@
Retirer des Npcs
Créer un personnage
Filtrer par nom :
+ Créer une altération
Supprimer l'altération
+ Ajouter un champ
+ Identifiant de l'altération
+ Nom
+ Description
+ Tags
+ Identifiant du champ
+ Expression
+ Sauvegarder
+ Annuler
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
index f4240a3..349d046 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
@@ -41,7 +41,9 @@ class DataSyncViewModel(
.filter { status -> status == NetworkRepository.Status.CONNECTED }
.onEach {
alterationRepository.updateAlterations()
+ alterationRepository.updateTags()
characterRepository.updateCharacterPreviews()
+ characterRepository.updateTags()
campaignRepository.updateCampaign()
}
.launchIn(this)
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
index 07122be..9d9574f 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
@@ -36,10 +36,13 @@ import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEdi
import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.common.SkillFieldFactory
import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterViewModel
import com.pixelized.desktop.lwa.ui.screen.gamemaster.action.GMActionViewModel
-import com.pixelized.desktop.lwa.ui.screen.gamemaster.alteration.GMAlterationFactory
-import com.pixelized.desktop.lwa.ui.screen.gamemaster.alteration.GMAlterationViewModel
-import com.pixelized.desktop.lwa.ui.screen.gamemaster.character.GMCharacterFactory
-import com.pixelized.desktop.lwa.ui.screen.gamemaster.character.GMCharacterViewModel
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.alteration.edit.GMAlterationEditFactory
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.alteration.list.GMAlterationFactory
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.alteration.list.GMAlterationViewModel
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.alteration.edit.GMAlterationEditViewModel
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.character.list.GMCharacterFactory
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.character.list.GMCharacterViewModel
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagFactory
import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpFactory
import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpViewModel
import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryViewModel
@@ -123,8 +126,10 @@ val factoryDependencies
factoryOf(::CharacterSheetDiminishedDialogFactory)
factoryOf(::TextMessageFactory)
factoryOf(::LevelUpFactory)
+ factoryOf(::GMTagFactory)
factoryOf(::GMCharacterFactory)
factoryOf(::GMAlterationFactory)
+ factoryOf(::GMAlterationEditFactory)
}
val viewModelDependencies
@@ -149,6 +154,7 @@ val viewModelDependencies
viewModelOf(::GameMasterViewModel)
viewModelOf(::GMActionViewModel)
viewModelOf(::GMAlterationViewModel)
+ viewModelOf(::GMAlterationEditViewModel)
}
val useCaseDependencies
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
index af869e5..24e8365 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
@@ -3,6 +3,7 @@ package com.pixelized.desktop.lwa.network
import com.pixelized.shared.lwa.model.alteration.AlterationJson
import com.pixelized.shared.lwa.model.campaign.CampaignJson
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJson
+import com.pixelized.shared.lwa.model.tag.TagJson
import com.pixelized.shared.lwa.protocol.rest.CharacterPreviewJson
interface LwaClient {
@@ -15,6 +16,16 @@ interface LwaClient {
alterationId: String,
): AlterationJson?
+ suspend fun updateAlteration(
+ alterationJson: AlterationJson
+ )
+
+ suspend fun deleteAlteration(
+ alterationId: String,
+ )
+
+ suspend fun alterationTags(): List
+
// Campaign
suspend fun campaign(): CampaignJson
@@ -39,6 +50,8 @@ interface LwaClient {
suspend fun characters(): List
+ suspend fun characterTags(): List
+
suspend fun character(
characterSheetId: String,
): CharacterSheetJson
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
index 082271c..62d2449 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
@@ -4,6 +4,7 @@ import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
import com.pixelized.shared.lwa.model.alteration.AlterationJson
import com.pixelized.shared.lwa.model.campaign.CampaignJson
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJson
+import com.pixelized.shared.lwa.model.tag.TagJson
import com.pixelized.shared.lwa.protocol.rest.CharacterPreviewJson
import io.ktor.client.HttpClient
import io.ktor.client.call.body
@@ -30,6 +31,23 @@ class LwaClientImpl(
.get("$root/alteration/detail?alterationId=$alterationId")
.body()
+ override suspend fun updateAlteration(
+ alterationJson: AlterationJson
+ ) = client
+ .put("$root/alteration/update") {
+ contentType(ContentType.Application.Json)
+ setBody(alterationJson)
+ }
+ .body()
+
+ override suspend fun deleteAlteration(alterationId: String) = client
+ .delete("$root/alteration/delete?alterationId=$alterationId")
+ .body()
+
+ override suspend fun alterationTags(): List = client
+ .get("$root/alteration/tags")
+ .body()
+
override suspend fun campaign(): CampaignJson = client
.get("$root/campaign")
.body()
@@ -62,6 +80,10 @@ class LwaClientImpl(
.get("$root/character/all")
.body()
+ override suspend fun characterTags(): List = client
+ .get("$root/character/tags")
+ .body()
+
override suspend fun character(
characterSheetId: String,
): CharacterSheetJson = client
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt
index 498d74f..7687eaa 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt
@@ -26,6 +26,8 @@ class AlterationRepository(
val alterationFlow get() = alterationStore.alterationsFlow
+ val tagsFlow get() = alterationStore.tagsFlow
+
/**
* This flow transform the campaign instance (player + npc) into a
* Map>.
@@ -67,6 +69,16 @@ class AlterationRepository(
alterationStore.updateAlterations()
}
+ suspend fun updateTags() {
+ alterationStore.updateTags()
+ }
+
+ fun alteration(
+ alterationId: String?,
+ ): Alteration? {
+ return alterationFlow.value[alterationId]
+ }
+
fun fieldAlterations(
characterSheetId: String,
): Map> {
@@ -79,6 +91,18 @@ class AlterationRepository(
return activeAlterationMapFlow.map { it[characterSheetId] ?: emptyMap() }
}
+ suspend fun updateAlteration(
+ alteration: Alteration
+ ) {
+ alterationStore.putAlteration(alteration)
+ }
+
+ suspend fun deleteAlteration(
+ alterationId: String,
+ ) {
+ alterationStore.deleteAlteration(alterationId = alterationId)
+ }
+
private fun transformToAlterationFieldMap(
alterations: Map,
actives: List,
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt
index 863b19f..1924f74 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt
@@ -1,32 +1,92 @@
package com.pixelized.desktop.lwa.repository.alteration
import com.pixelized.desktop.lwa.network.LwaClient
+import com.pixelized.desktop.lwa.repository.network.NetworkRepository
import com.pixelized.shared.lwa.model.alteration.Alteration
import com.pixelized.shared.lwa.model.alteration.AlterationJsonFactory
+import com.pixelized.shared.lwa.model.tag.Tag
+import com.pixelized.shared.lwa.model.tag.TagJsonFactory
+import com.pixelized.shared.lwa.protocol.websocket.ApiSynchronisation
+import com.pixelized.shared.lwa.protocol.websocket.SocketMessage
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class AlterationStore(
+ private val networkRepository: NetworkRepository,
private val alterationFactory: AlterationJsonFactory,
+ private val tagFactory: TagJsonFactory,
private val client: LwaClient,
) {
private val _alterationsFlow = MutableStateFlow