From 4adfd79f7fa41b49944836b6e373dffba300bd60 Mon Sep 17 00:00:00 2001 From: mikrise2 Date: Fri, 1 Dec 2023 13:43:54 +0100 Subject: [PATCH 1/6] [ML4SE-239] Repeat scenario. --- .../config/scenario/models/Scenario.kt | 33 +++++++++++-------- .../main/panel/panelStates/DefaultStates.kt | 5 +-- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/scenario/models/Scenario.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/scenario/models/Scenario.kt index 1291f520..e0496dce 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/scenario/models/Scenario.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/scenario/models/Scenario.kt @@ -19,6 +19,9 @@ data class Scenario( @Transient private val logger: Logger = Logger.getInstance(javaClass) + @Transient + private var currentSteps = LinkedList(steps) + @Transient private var currentStepIterator: Iterator? = null @@ -26,12 +29,12 @@ data class Scenario( var isValid: Boolean var step: ScenarioStep do { - if (steps.isEmpty()) { + if (currentSteps.isEmpty()) { logger.warn("No steps found!") return null } - step = steps.poll() + step = currentSteps.poll() isValid = step.isValid() if (!isValid) { logger.warn("Found useless step, all configs are null. Skip it") @@ -42,21 +45,23 @@ data class Scenario( @Suppress("ReturnCount") fun getNextUnit(project: Project): ScenarioUnit? { - if (!currentStepIterator.notNullAndHasNext()) { - return null - } - cleanStepSettings() - val currentStep = getNextStep() ?: return null - currentStep.prepareSettings(project) - currentStepIterator = currentStep.getUnits().iterator() - return if (currentStepIterator.notNullAndHasNext()) { - currentStepIterator?.next() - } else { - null + if (currentStepIterator.notNullAndHasNext()) { + cleanStepSettings() + val currentStep = getNextStep() ?: return null + currentStep.prepareSettings(project) + currentStepIterator = currentStep.getUnits().iterator() + if (currentStepIterator.notNullAndHasNext()) { + return null + } } + return currentStepIterator?.next() + } + + fun reset() { + currentSteps = LinkedList(steps) } - private fun Iterator?.notNullAndHasNext() = this?.hasNext() ?: false + private fun Iterator?.notNullAndHasNext() = this?.hasNext() != true private fun cleanStepSettings() = MainPanelStorage.activeIdeHandlers.forEach { diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt index 3ee93412..6703e410 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt @@ -43,7 +43,7 @@ fun Panel.agreementAcceptance() { * Switches the panel to the plugin description window. */ fun Panel.welcomePage() { - loadBasePage(MainPageTemplate.loadCurrentTemplate(), "ui.button.next", true) + loadBasePage(MainPageTemplate.loadCurrentTemplate(), "ui.button.next", false) setNextAction { processScenario() } @@ -122,7 +122,7 @@ fun Panel.serverErrorPage() { } fun Panel.finalPage() { - loadBasePage(FinalPageTemplate.loadCurrentTemplate(), "ui.button.welcome") + loadBasePage(FinalPageTemplate.loadCurrentTemplate(), "ui.button.welcome", false) setNextAction { welcomePage() } @@ -162,6 +162,7 @@ fun Panel.processScenario() { } null -> { + scenario.reset() finalPage() } } From 52b55a290cf9406404420cf0c5201773394c0454 Mon Sep 17 00:00:00 2001 From: mikrise2 Date: Fri, 1 Dec 2023 17:27:54 +0100 Subject: [PATCH 2/6] [ML4SE-239] Fixed survey front. --- .../tasktracker/config/survey/HtmlQuestion.kt | 35 ++++++++---- .../tasktracker/config/survey/Survey.kt | 2 +- .../ui/main/panel/MainPluginPanelFactory.kt | 6 ++- .../main/panel/panelStates/DefaultStates.kt | 2 +- .../tasktracker/config/survey_default.yaml | 1 + .../ui/main/panel/template/css/dark.css | 6 +-- .../ui/main/panel/template/css/light.css | 6 +-- .../ui/main/panel/template/css/survey.css | 17 +++++- .../ui/main/panel/template/survey.html | 53 +++++++++++++++++-- 9 files changed, 101 insertions(+), 27 deletions(-) diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/HtmlQuestion.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/HtmlQuestion.kt index c108efab..b2fcbaaf 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/HtmlQuestion.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/HtmlQuestion.kt @@ -2,6 +2,7 @@ package org.jetbrains.research.tasktracker.config.survey import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient /** * Radio button id and value @@ -23,24 +24,38 @@ sealed class HtmlQuestion { /** * `h` tag size. For example, h1, h2, and so on. */ - private val textSize: Int = defaultTextSize - get() = if (field < minTextSize || field > maxTextSize) defaultTextSize else field + private val textSize: Int = DEFAULT_TEXT_SIZE + get() = if (field < MIN_TEXT_SIZE || field > MAX_TEXT_SIZE) DEFAULT_TEXT_SIZE else field /** * Sets 'required' on the input if this field is mandatory to fill out. */ @SerialName("required") - private val isRequired: Boolean = false - abstract fun toHtml(): String + protected val isRequired: Boolean = false + internal abstract fun toHtml(): String + + val html: String + get() = buildString { + append("
") + append(toHtml()) + append("
") + } + + @Transient + private var alreadyRequired = false protected fun Any?.asParameter(name: String): String = this?.let { "$name=\"$it\"" } ?: "" - protected fun isRequiredString(): String = if (isRequired) "required" else "" - protected fun htmlText() = "$text" + protected open fun isRequiredString(): String = + if (isRequired && !alreadyRequired) "required".also { alreadyRequired = true } else "" + + protected fun htmlText() = "$text" + + private fun isRequiredClass(): String = if (isRequired) "class=\"required\"" else "" companion object { - private const val minTextSize = 1 - private const val maxTextSize = 5 - private const val defaultTextSize = 3 + private const val MIN_TEXT_SIZE = 1 + private const val MAX_TEXT_SIZE = 5 + private const val DEFAULT_TEXT_SIZE = 3 } } @@ -118,6 +133,8 @@ data class TextAreaHtmlQuestion( append("") } + + override fun isRequiredString(): String = if (isRequired) "data-req=\"required\"" else "" } /** diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/Survey.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/Survey.kt index 78c15bb7..f3d17bdb 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/Survey.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/survey/Survey.kt @@ -4,5 +4,5 @@ import kotlinx.serialization.Serializable @Serializable data class Survey(val id: String, val htmlQuestions: List) { - fun toHtml() = htmlQuestions.joinToString(System.lineSeparator()) { it.toHtml() } + fun toHtml() = htmlQuestions.joinToString(System.lineSeparator()) { it.html } } diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt index 4cd29e61..74dce546 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt @@ -185,7 +185,7 @@ class MainPluginPanelFactory : ToolWindowFactory { * * @return **true** if any required field is not filled. **false** otherwise. */ - fun checkInputs(): Promise = + fun checkAgreementInputs(): Promise = mainWindow.executeJavaScriptAsync("checkAllInputs()").then { val agreementChecker = Json.decodeFromString(AgreementChecker.serializer(), it.toString()) if (agreementChecker.allRequiredChecked()) { @@ -195,6 +195,10 @@ class MainPluginPanelFactory : ToolWindowFactory { true } + fun checkSurveyInputs(): Promise = mainWindow.executeJavaScriptAsync("checkAllInputs()").then { + it.toBoolean() + } + fun openExternalUrl(url: String) = mainWindow.openExternalUrl(url) fun setNextAction(listener: ActionListener) = nextButton.setListener(listener) diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt index 6703e410..319e5099 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt @@ -25,7 +25,7 @@ typealias Panel = MainPluginPanelFactory fun Panel.agreementAcceptance() { loadBasePage(AgreementTemplate.loadCurrentTemplate(), "ui.button.next", false) setNextAction { - checkInputs() + checkAgreementInputs() .onSuccess { if (!it) { welcomePage() diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml index 9bfa72ea..1c76321d 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml @@ -11,6 +11,7 @@ surveys: - ! text: 2. On a scale of 1 (very unlikely) to 5 (very likely), how likely are you to continue using the Emotion Tracker in the future? elementId: likely + required: true info: - id: likely1 value: 1 diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/dark.css b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/dark.css index 854f5b46..7a2212cd 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/dark.css +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/dark.css @@ -2,11 +2,7 @@ body { background: black; } -p { - color: #fefefe; -} - -label { +p, label, h1, h2, h3, h4, h5 { color: #fefefe; } diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/light.css b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/light.css index a3f18b2c..937c44fa 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/light.css +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/light.css @@ -2,11 +2,7 @@ body { background: #fefefe; } -p { - color: black; -} - -label { +p, label, h1, h2, h3, h4, h5 { color: black; } diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/survey.css b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/survey.css index c4ff86e8..65773046 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/survey.css +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/css/survey.css @@ -1,3 +1,16 @@ -h1, h2, h3, h4, h5, label { - color: #fefefe; +.form-container{ + align-items: flex-start; + text-align: left; + justify-content: left; +} + +.required:after { + content: " *"; + font-weight: bold; + color: red; +} + +.box{ + padding: 3px; + margin: 6px; } diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/survey.html b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/survey.html index 267a2c47..af10fc1b 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/survey.html +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/ui/main/panel/template/survey.html @@ -1,3 +1,50 @@ -
-%s -
+
+
+ %s +
+
+ \ No newline at end of file From 4bf857c964c1ccc3392aaa7555741d4b7fd26def Mon Sep 17 00:00:00 2001 From: mikrise2 Date: Sat, 2 Dec 2023 08:47:31 +0100 Subject: [PATCH 3/6] [ML4SE-239] Survey is ready. --- .../ui/main/panel/panelStates/DefaultStates.kt | 14 ++++++++++---- .../tasktracker/config/survey_default.yaml | 1 + .../ui/main/panel/template/css/survey.css | 1 + .../tasktracker/ui/main/panel/template/survey.html | 9 ++++----- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt index 211d0ac5..04f3dafd 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt @@ -103,11 +103,17 @@ fun Panel.survey(id: String) { ?: error("Survey with id `$id` hasn't been found.") loadBasePage(SurveyTemplate(survey)) setNextAction { - val surveyParser = SurveyParser(mainWindow, project) - GlobalScope.launch { - surveyParser.parseAndLog(survey) + checkSurveyInputs().runOnSuccess { + if (it) { + val surveyParser = SurveyParser(mainWindow, project) + GlobalScope.launch { + surveyParser.parseAndLog(survey) + } + processScenario() + } else { + notifyError(project, UIBundle.message("ui.please.fill")) + } } - processScenario() } } diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml index 1c76321d..af8106fa 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/survey_default.yaml @@ -205,5 +205,6 @@ surveys: - !