All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.internal.actions.UpdateDescendantsDisplayingIssuesAction.kt Maven / Gradle / Ivy

There is a newer version: 0.23.0
Show newest version
package io.kform.internal.actions

import io.kform.AbsolutePath
import io.kform.FormManager
import io.kform.StateEvent
import io.kform.ValidationIssueSeverity
import io.kform.internal.*

/**
 * Action that updates the number of descendants displaying issues of each severity at [path], as
 * well as their parents, by [displayingErrors] (which can be either a positive or negative value).
 */
internal class UpdateDescendantsDisplayingIssuesAction(
    formManager: FormManager,
    private val path: AbsolutePath,
    private val displayingErrors: Int = 0,
    private val displayingWarnings: Int = 0,
) : ValueStateAction(formManager) {
    constructor(
        formManager: FormManager,
        path: AbsolutePath,
        issueSeverity: ValidationIssueSeverity,
        amount: Int = 0
    ) : this(
        formManager,
        path,
        if (issueSeverity == ValidationIssueSeverity.Error) amount else 0,
        if (issueSeverity == ValidationIssueSeverity.Warning) amount else 0
    )

    override fun toString() =
        "UpdateDesdendantsDisplayingIssues($path${
            if (displayingErrors != 0) ", displayingErrors=$displayingErrors" else ""}${
            if (displayingWarnings != 0) ", displayingWarnings=$displayingWarnings" else ""})"

    override val accesses =
        listOf(
            AccessValueStateTree(ActionAccessType.Read),
            AccessValidationState(ActionAccessType.Read),
            AccessIsTouched(ActionAccessType.Read),
            AccessDescendantsDisplayingIssues(ActionAccessType.Write)
        )
    override val accessedPaths = parentPaths(path) + path

    override suspend fun run() = updateDescendantsDisplayingIssues(path)

    private tailrec suspend fun updateDescendantsDisplayingIssues(path: AbsolutePath) {
        val info = stateInfo(path).single()
        val state = info.state as ParentStateImpl

        val oldDisplayStatus = state.displayStatus()
        state.descendantsDisplayingErrors += displayingErrors
        state.descendantsDisplayingWarnings += displayingWarnings
        val newDisplayStatus = state.displayStatus()

        if (oldDisplayStatus != newDisplayStatus) {
            formManager.eventsBus.emit(
                StateEvent.DisplayChange(newDisplayStatus, path, info.schema)
            )
        }
        if (path != AbsolutePath.ROOT) {
            updateDescendantsDisplayingIssues(path.parent())
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy