diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/AuthView.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/AuthView.kt index ff80d2b4..34f8d3eb 100644 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/AuthView.kt +++ b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/AuthView.kt @@ -6,7 +6,6 @@ import dev.inmo.jsuikit.elements.* import dev.inmo.jsuikit.modifiers.UIKitButton import dev.inmo.jsuikit.modifiers.UIKitMargin import dev.inmo.postssystem.client.ui.fsm.* -import dev.inmo.postssystem.client.utils.HTMLViewContainer import dev.inmo.postssystem.features.auth.client.ui.* import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions @@ -26,7 +25,6 @@ class AuthView( override suspend fun StatesMachine.safeHandleState( htmlElement: HTMLElement, - container: HTMLViewContainer, state: AuthUIFSMState ): UIFSMState? { val completion = CompletableDeferred() @@ -36,12 +34,12 @@ class AuthView( val passwordState = mutableStateOf("") val usernameDisabled = mutableStateOf(true) val passwordDisabled = mutableStateOf(true) - val authBtnDisabled = remember { - usernameState.value.isNotBlank() && passwordState.value.isNotBlank() - } val errorText = mutableStateOf(null) val composition = renderComposableAndLinkToContext(htmlElement) { + val authBtnDisabled = remember { + usernameState.value.isNotBlank() && passwordState.value.isNotBlank() + } Form { TextField( InputType.Text, diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/JSView.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/JSView.kt index 390e9ef3..925563d0 100644 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/JSView.kt +++ b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/JSView.kt @@ -2,20 +2,17 @@ package dev.inmo.postssystem.client.fsm.ui import dev.inmo.postssystem.client.ui.fsm.UIFSMHandler import dev.inmo.postssystem.client.ui.fsm.UIFSMState -import dev.inmo.postssystem.client.utils.HTMLViewContainer import dev.inmo.micro_utils.fsm.common.StatesMachine +import kotlinx.browser.document import org.w3c.dom.HTMLElement abstract class JSView : UIFSMHandler { open suspend fun StatesMachine.safeHandleState( htmlElement: HTMLElement, - container: HTMLViewContainer, state: T ): UIFSMState? = null override suspend fun StatesMachine.safeHandleState(state: T): UIFSMState? { - return HTMLViewContainer.from(state.context) ?.let { - safeHandleState(it.htmlElement ?: return null, it, state) - } + return safeHandleState(document.getElementById(state.context) as? HTMLElement ?: return null, state) } } diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/defaults/BackButton.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/defaults/BackButton.kt deleted file mode 100644 index 0d32700d..00000000 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/defaults/BackButton.kt +++ /dev/null @@ -1,20 +0,0 @@ -package dev.inmo.postssystem.client.fsm.ui.defaults - -import dev.inmo.postssystem.client.ui.fsm.UIFSMState -import kotlinx.coroutines.CompletableDeferred -import kotlinx.html.TagConsumer -import kotlinx.html.js.button -import kotlinx.html.js.onClickFunction -import org.w3c.dom.HTMLElement - -fun TagConsumer.addBackButton( - completableDeferred: CompletableDeferred, - stateToBack: UIFSMState -) { - button { - +"Назад" - onClickFunction = { - completableDeferred.complete(stateToBack) - } - } -} diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/DialogHelper.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/DialogHelper.kt deleted file mode 100644 index 0395129e..00000000 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/DialogHelper.kt +++ /dev/null @@ -1,64 +0,0 @@ -package dev.inmo.postssystem.client.utils - -import com.benasher44.uuid.uuid4 -import kotlinx.browser.document -import kotlinx.html.* -import kotlinx.html.dom.append -import kotlinx.html.js.* -import org.w3c.dom.* - -object DialogHelper { - fun createOneFieldDialog( - title: String, - hint: String, - doneButtonText: String, - closeButtonText: String, - onClose: () -> Unit, - onSubmit: (String) -> Unit - ): HTMLDialogElement { - lateinit var dialogElement: HTMLDialogElement - (document.getElementsByTagName("body").item(0) as? HTMLBodyElement) ?.append { - dialogElement = dialog("mdl-dialog") { - h4("mdl-dialog__title") { - +title - } - val id = "form_${uuid4()}_text" - div(classes = "mdl-dialog__content") { - form("#") { - div("mdl-textfield mdl-js-textfield mdl-textfield--floating-label") { - input(InputType.text, classes = "mdl-textfield__input") { - this.id = id - } - label(classes = "mdl-textfield__label") { - +hint - attributes["for"] = id - } - } - } - } - div(classes = "mdl-dialog__actions mdl-dialog__actions--full-width") { - button(classes = "mdl-button", type = ButtonType.button) { - +doneButtonText - onClickFunction = { - it.preventDefault() - - val input = document.getElementById(id) as? HTMLInputElement - input ?.value ?.let { - onSubmit(it) - } - } - } - button(classes = "mdl-button", type = ButtonType.button) { - +closeButtonText - onClickFunction = { - it.preventDefault() - - onClose() - } - } - } - } - } - return dialogElement - } -} diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/DownloadFile.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/DownloadFile.kt index 43dfbb1c..b8cc2f68 100644 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/DownloadFile.kt +++ b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/DownloadFile.kt @@ -2,6 +2,7 @@ package dev.inmo.postssystem.client.utils import dev.inmo.postssystem.features.files.common.FullFileInfo import dev.inmo.micro_utils.common.toArrayBuffer +import io.ktor.utils.io.core.readBytes import kotlinx.browser.document import org.w3c.dom.HTMLAnchorElement import org.w3c.dom.url.URL @@ -10,7 +11,7 @@ import org.w3c.files.Blob fun triggerDownloadFile(fullFileInfo: FullFileInfo) { val hiddenElement = document.createElement("a") as HTMLAnchorElement - val url = URL.createObjectURL(Blob(arrayOf(fullFileInfo.inputProvider().toArrayBuffer()))) + val url = URL.createObjectURL(Blob(arrayOf(fullFileInfo.inputProvider().readBytes().toArrayBuffer()))) hiddenElement.href = url hiddenElement.target = "_blank" hiddenElement.download = fullFileInfo.name.name diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/HTMLViewContainer.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/HTMLViewContainer.kt deleted file mode 100644 index 60ca486b..00000000 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/HTMLViewContainer.kt +++ /dev/null @@ -1,134 +0,0 @@ -package dev.inmo.postssystem.client.utils - -import kotlinx.browser.document -import kotlinx.dom.clear -import kotlinx.html.dom.append -import kotlinx.html.id -import kotlinx.html.js.* -import org.w3c.dom.HTMLElement -import org.w3c.dom.events.Event - -object HTMLViewsConstants { - val mainContainer: MainHTMLViewContainer = MainHTMLViewContainer - val processesContainer: DrawerHTMLViewContainer = DrawerHTMLViewContainer - val toolsContainerId: ToolsHTMLViewContainer = ToolsHTMLViewContainer -} - -sealed interface HTMLViewContainer { - val htmlElement: HTMLElement? - get() = document.getElementById(id) as? HTMLElement - val id: String - - fun setIsLoading() { - htmlElement ?.apply { - clear() - append { - div("mdl-spinner mdl-js-spinner is-active") - } - } - } - - companion object { - fun from(elementId: String) = when (elementId) { - MainHTMLViewContainer.id -> MainHTMLViewContainer - DrawerHTMLViewContainer.id -> DrawerHTMLViewContainer - ToolsHTMLViewContainer.id -> ToolsHTMLViewContainer - else -> null - } - } -} - -object MainHTMLViewContainer : HTMLViewContainer { - override val id: String - get() = "main" -} - -object DrawerHTMLViewContainer : HTMLViewContainer { - data class DrawerAddButtonInfo( - val text: String, - val onAddButtonClick: (Event) -> Unit, - ) - - override val id: String - get() = "drawer" - - private val titleElement: HTMLElement? - get() = (document.getElementById("drawerTitle") ?:let { - htmlElement ?.append { - span("mdl-layout-title") { - id = "drawerTitle" - } - } ?.first() - }) as? HTMLElement - var title: String? - get() = titleElement ?.textContent - set(value) { - if (value == null) { - titleElement ?.classList ?.add("gone") - } else { - val element = titleElement ?: return - element.textContent = value - element.classList.remove("gone") - } - } - private val contentElement - get() = (document.getElementById("drawerContent") ?:let { - htmlElement ?.append { - nav("mdl-navigation") { - id = "drawerContent" - } - } ?.first() - }) as? HTMLElement - - fun setListContent( - title: String?, - data: Iterable, - getText: (T) -> String?, - addButtonInfo: DrawerAddButtonInfo? = null, - onClick: (T) -> Unit - ) { - this.title = title - val contentElement = contentElement ?: return - - contentElement.clear() - contentElement.append { - fun hideDrawer() { - // Emulate clicking for hiding of drawer - (document.getElementsByClassName("mdl-layout__obfuscator").item(0) as? HTMLElement) ?.click() - } - data.forEach { - val elementTitle = getText(it) ?: return@forEach - div("mdl-navigation__link") { - +elementTitle - onClickFunction = { _ -> - onClick(it) - hideDrawer() - } - } - } - if (addButtonInfo != null) { - button(classes = "mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent") { - +addButtonInfo.text - onClickFunction = { - addButtonInfo.onAddButtonClick(it) - hideDrawer() - } - } - } - } - } - - override fun setIsLoading() { - contentElement ?.apply { - clear() - append { - div("mdl-spinner mdl-js-spinner is-active") - } - } - } -} - -object ToolsHTMLViewContainer : HTMLViewContainer { - override val id: String - get() = "tools" -} diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/UploadFile.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/UploadFile.kt index a0231c94..a6702ee4 100644 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/UploadFile.kt +++ b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/utils/UploadFile.kt @@ -1,5 +1,6 @@ package dev.inmo.postssystem.client.utils +import androidx.compose.runtime.MutableState import dev.inmo.postssystem.features.files.common.FullFileInfo import dev.inmo.micro_utils.common.* import dev.inmo.micro_utils.mime_types.KnownMimeTypes diff --git a/client/src/jsMain/resources/styles/containers.css b/client/src/jsMain/resources/css/containers.css similarity index 100% rename from client/src/jsMain/resources/styles/containers.css rename to client/src/jsMain/resources/css/containers.css diff --git a/client/src/jsMain/resources/styles/visibility.css b/client/src/jsMain/resources/css/visibility.css similarity index 100% rename from client/src/jsMain/resources/styles/visibility.css rename to client/src/jsMain/resources/css/visibility.css diff --git a/client/src/jsMain/resources/index.html b/client/src/jsMain/resources/index.html index bae6fb10..ebcd20ab 100644 --- a/client/src/jsMain/resources/index.html +++ b/client/src/jsMain/resources/index.html @@ -6,9 +6,8 @@ - - - + + diff --git a/gradle.properties b/gradle.properties index 0f6a79f1..ef3d2544 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,14 +35,14 @@ kotlinx_html_version=0.7.3 android_minSdkVersion=21 android_compileSdkVersion=32 android_buildToolsVersion=32.0.0 -dexcount_version=3.0.0 +dexcount_version=3.0.1 junit_version=4.12 test_ext_junit_version=1.1.2 espresso_core=3.3.0 # Dokka -dokka_version=1.6.0 +dokka_version=1.6.10 # Project data diff --git a/server/Makefile b/server/Makefile index ae84f56b..a830d35e 100644 --- a/server/Makefile +++ b/server/Makefile @@ -18,4 +18,4 @@ startTestPostgres: sudo docker-compose up addTestUserAndAuth: - docker-compose exec test_postgres psql test -U test -c "INSERT INTO Users VALUES (-1, 'test', 'test', 'test');INSERT INTO UsersAuthentications VALUES ('test', -1);" + sudo docker-compose exec test_postgres psql test -U test -c "INSERT INTO Users VALUES (-1, 'test', 'test', 'test');INSERT INTO UsersAuthentications VALUES ('test', -1);"