diff --git a/admin/app/com/lucidchart/piezo/admin/controllers/Jobs.scala b/admin/app/com/lucidchart/piezo/admin/controllers/Jobs.scala index 89851956..deb75b31 100644 --- a/admin/app/com/lucidchart/piezo/admin/controllers/Jobs.scala +++ b/admin/app/com/lucidchart/piezo/admin/controllers/Jobs.scala @@ -485,24 +485,14 @@ class Jobs( ) } - def jobGroupTypeAhead(sofar: String): Action[AnyContent] = Action { request => - val groups = scheduler.getJobGroupNames().asScala.toList - - Ok(Json.obj("groups" -> groups.filter { group => - group.toLowerCase.contains(sofar.toLowerCase) - })) - } - - def jobNameTypeAhead(group: String, sofar: String): Action[AnyContent] = + def jobNameTypeAhead(group: String): Action[AnyContent] = Action { request => val jobs = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(group)).asScala.toSet Ok( - Json.obj( - "jobs" -> jobs - .filter(_.getName.toLowerCase.contains(sofar.toLowerCase)) - .map(_.getName), + Json.toJson( + jobs.map(_.getName), ), ) } diff --git a/admin/app/com/lucidchart/piezo/admin/controllers/Triggers.scala b/admin/app/com/lucidchart/piezo/admin/controllers/Triggers.scala index c4adc9b0..a67bec16 100644 --- a/admin/app/com/lucidchart/piezo/admin/controllers/Triggers.scala +++ b/admin/app/com/lucidchart/piezo/admin/controllers/Triggers.scala @@ -181,6 +181,7 @@ class Triggers( Ok( com.lucidchart.piezo.admin.views.html.editTrigger( TriggerHelper.getTriggersByGroup(scheduler), + scheduler.getJobGroupNames().asScala, monitoringTeams.value, newTriggerForm, formNewAction, @@ -225,6 +226,7 @@ class Triggers( Ok( com.lucidchart.piezo.admin.views.html.editTrigger( TriggerHelper.getTriggersByGroup(scheduler), + scheduler.getJobGroupNames().asScala, monitoringTeams.value, editTriggerForm, formNewAction, @@ -236,6 +238,7 @@ class Triggers( Ok( com.lucidchart.piezo.admin.views.html.editTrigger( TriggerHelper.getTriggersByGroup(scheduler), + scheduler.getJobGroupNames().asScala, monitoringTeams.value, editTriggerForm, formEditAction(group, name), @@ -259,6 +262,7 @@ class Triggers( BadRequest( com.lucidchart.piezo.admin.views.html.editTrigger( TriggerHelper.getTriggersByGroup(scheduler), + scheduler.getJobGroupNames().asScala, monitoringTeams.value, formWithErrors, formEditAction(group, name), @@ -289,6 +293,7 @@ class Triggers( BadRequest( com.lucidchart.piezo.admin.views.html.editTrigger( TriggerHelper.getTriggersByGroup(scheduler), + scheduler.getJobGroupNames().asScala, monitoringTeams.value, formWithErrors, formNewAction, @@ -316,6 +321,7 @@ class Triggers( Ok( com.lucidchart.piezo.admin.views.html.editTrigger( TriggerHelper.getTriggersByGroup(scheduler), + scheduler.getJobGroupNames().asScala, monitoringTeams.value, form, formNewAction, @@ -329,14 +335,6 @@ class Triggers( ) } - def triggerGroupTypeAhead(sofar: String): Action[AnyContent] = Action { implicit request => - val groups = scheduler.getTriggerGroupNames().asScala.toList - - Ok(Json.obj("groups" -> groups.filter { group => - group.toLowerCase.contains(sofar.toLowerCase) - })) - } - def triggerJob(group: String, name: String): Action[AnyContent] = Action { request => val jobKey = new JobKey(name, group) diff --git a/admin/app/com/lucidchart/piezo/admin/views/Icon.scala b/admin/app/com/lucidchart/piezo/admin/views/Icon.scala new file mode 100644 index 00000000..eae9c9b2 --- /dev/null +++ b/admin/app/com/lucidchart/piezo/admin/views/Icon.scala @@ -0,0 +1,93 @@ +package com.lucidchart.piezo.admin.views + +import play.twirl.api.Html + +object Icon { + private def icon(name: String, body: String): Html = + Html( + s"""""", + ) + + // The content for these SVGs was taken from https://icons.getbootstrap.com/ + // But only the body of the svg was kept, to factor out the boilerplate + // + // They are licensed under the following terms: + // The MIT License (MIT) + // + // Copyright (c) 2019-2024 The Bootstrap Authors + // + // Permission is hereby granted, free of charge, to any person obtaining a copy + // of this software and associated documentation files (the "Software"), to deal + // in the Software without restriction, including without limitation the rights + // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + // copies of the Software, and to permit persons to whom the Software is + // furnished to do so, subject to the following conditions: + // + // The above copyright notice and this permission notice shall be included in + // all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + // THE SOFTWARE. + + val download: Html = icon( + "download", + """ + + +""", + ) + val duplicate: Html = icon( + "copy", + """ + +""", + ) + val flash: Html = icon( + "lightning-charge-fill", + """ + +""", + ) + val pause: Html = icon( + "pause-fill", + """ + +""", + ) + val pencil: Html = icon( + "pencil-fill", + """ + +""", + ) + val play: Html = icon( + "play-fill", + """ + +""", + ) + val plus: Html = icon( + "plus-circle", + """ + + +""", + ) + val question: Html = icon( + "question-circle-fill", + """ + +""", + ) + val remove: Html = icon( + "x-lg", + """ + +""", + ) +} diff --git a/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html b/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html index ebe7cace..5bfcdb96 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html @@ -5,7 +5,7 @@ formAction: play.api.mvc.Call, existing: Boolean, errorMessage: Option[String] = None, -scripts: List[String] = List[String]("js/jobData.js", "js/typeAhead.js") +scripts: List[String] = List[String]("js/jobData.js") )( implicit request: play.api.mvc.Request[AnyContent], @@ -25,44 +25,29 @@

Edit Job

New Job

} -

@jobForm.errors.filter(_.key == "").map(_.message).mkString(", ")

-
-
- @defining(if(existing) {Symbol("readonly")} else {Symbol("none")}) { newEditOnly => +

@jobForm.errors.filter(_.key == "").map(_.message).mkString(", ")

+ + @defining(if(existing) {Symbol("readonly")} else {Symbol("none")}) { newEditOnly => - @helper.inputText(jobForm("group"), Symbol("_label") -> "Group", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Group", newEditOnly -> None, Symbol("class") -> "job-group-type-ahead form-control form-inline-control") - @helper.inputText(jobForm("name"), Symbol("_label") -> "Name", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Name", newEditOnly -> None, Symbol("class") -> "form-control form-inline-control") - @helper.inputText(jobForm("class"), Symbol("_label") -> "Class", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Name", Symbol("class") -> "form-control form-inline-control") - @helper.inputText(jobForm("description"), Symbol("_label") -> "Description", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Description", Symbol("class") -> "form-control form-inline-control") - @helper.checkbox(jobForm("durable"), Symbol("_label") -> "Durable", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("readonly") -> None, Symbol("class") -> "form-inline-control", Symbol("checked") -> true, Symbol("disabled") -> true, Symbol("id") -> "durable-placeholder") + @if(!existing) { + + @jobsByGroup.map { case (name, _) => + + } + + } - + @helper.inputText(jobForm("group"), Symbol("_label") -> "Group", Symbol("placeholder") -> "Group", newEditOnly -> None, Symbol("class") -> "form-control", Symbol("list") -> "job-groups-list") + @helper.inputText(jobForm("name"), Symbol("_label") -> "Name", Symbol("placeholder") -> "Name", newEditOnly -> None, Symbol("class") -> "form-control") @helper.inputText(jobForm("class"), Symbol("_label") -> "Class", Symbol("placeholder") -> "Name", Symbol("class") -> "form-control") + @helper.inputText(jobForm("description"), Symbol("_label") -> "Description", Symbol("placeholder") -> "Description", Symbol("class") -> "form-control") @helper.checkbox(jobForm("durable"), Symbol("_label") -> "Durable", Symbol("readonly") -> None, Symbol("class") -> "form-check-input my-auto ms-3", Symbol("checked") -> true, Symbol("disabled") -> true, Symbol("id") -> "durable-placeholder") - @helper.checkbox(jobForm("requests-recovery"), Symbol("_label") -> "Requests recovery", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("class") -> "form-inline-control") + -

Job Data Map

+ @helper.checkbox(jobForm("requests-recovery"), Symbol("_label") -> "Requests recovery", Symbol("class") -> "form-check-input my-auto ms-3") } -
- @helper.repeat(jobForm("job-data-map"), min = jobForm("job-data-map").indexes.length + 1) { dataMap => + @com.lucidchart.piezo.admin.views.html.jobDataMap(jobForm("job-data-map")) - @dataMap("key").value.map { _ => - @dataMap("value").value.map { _ => - - } - } - - @helper.inputText(dataMap("key"), Symbol("_label") -> "Key", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Key", Symbol("class") -> "job-data-key form-control form-inline-control") - @helper.inputText(dataMap("value"), Symbol("_label") -> "Value", Symbol("labelClass") -> "col-sm-3 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Value", Symbol("class") -> "job-data-value form-control form-inline-control") - - } - - -
- } - -
- - - -
+ + + } diff --git a/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html b/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html index b057e4a9..54267b0b 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html @@ -1,12 +1,13 @@ @( triggersByGroup: scala.collection.mutable.Buffer[(String, scala.collection.immutable.List[org.quartz.TriggerKey])], +jobGroupNames: Iterable[String], monitoringTeams: Seq[String], triggerForm: Form[com.lucidchart.piezo.admin.controllers.TriggerFormValue], formAction: play.api.mvc.Call, existing: Boolean, isTemplate: Boolean, errorMessage: Option[String] = None, -scripts: List[String] = List[String]("js/jobData.js", "js/typeAhead.js", "js/triggerMonitoring.js") +scripts: List[String] = List[String]("js/jobData.js", "js/triggerMonitoring.js", "js/jobnamecomplete.js") )( implicit request: play.api.mvc.Request[AnyContent], @@ -28,98 +29,92 @@

Edit Trigger

New Trigger

} -
-
-
- -
-
- @if(triggerForm.data.get("triggerType").getOrElse("") == "simple") { - - } else { - - } -
+
+
+ +
+
+ @if(triggerForm.data.get("triggerType").getOrElse("") == "simple") { + @Icon.question + } else { + @Icon.question + }

@triggerForm.errors.filter(_.key == "").map(_.message).mkString(", ")

-
+ + @if(!existing) { + + @triggersByGroup.map { case (name, _) => + + } + + + @jobGroupNames.map { name => + + } + + + @* This will be filled out by javascript lazily *@ + + } + @defining(if(existing) {Symbol("readonly")} else {Symbol("none")}) { newEditOnly => - @helper.input(triggerForm("group"), Symbol("_label") -> "Group", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Group", Symbol("value")-> triggerForm.data.get("group").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => - + @helper.input(triggerForm("group"), Symbol("_label") -> "Group", Symbol("placeholder") -> "Group", Symbol("value")-> triggerForm.data.get("group").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => + } - @helper.input(triggerForm("name"), Symbol("_label") -> "Name", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Name", Symbol("value")-> triggerForm.data.get("name").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => - + @helper.input(triggerForm("name"), Symbol("_label") -> "Name", Symbol("placeholder") -> "Name", Symbol("value")-> triggerForm.data.get("name").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => + } - @helper.input(triggerForm("jobGroup"), Symbol("_label") -> "Job group", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Job group", Symbol("value")-> triggerForm.data.get("jobGroup").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => - + @helper.input(triggerForm("jobGroup"), Symbol("_label") -> "Job group", Symbol("placeholder") -> "Job group", Symbol("value")-> triggerForm.data.get("jobGroup").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => + } - @helper.input(triggerForm("jobName"), Symbol("_label") -> "Job name", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Job name", Symbol("value")-> triggerForm.data.get("jobName").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => - + @helper.input(triggerForm("jobName"), Symbol("_label") -> "Job name", Symbol("placeholder") -> "Job name", Symbol("value")-> triggerForm.data.get("jobName").getOrElse(""), newEditOnly -> None) { (id, name, value, args) => + } } - @helper.select(triggerForm("triggerMonitoringPriority"), TriggerMonitoringPriority.values.map(tp => tp.name -> tp.name), Symbol("_label") -> "Monitoring Priority", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("class") -> "form-control", Symbol("value") -> triggerForm.data.get("triggerMonitoringPriority").getOrElse(TriggerMonitoringPriority.Low), Symbol("placeholder") -> TriggerMonitoringPriority.Low) + @helper.select(triggerForm("triggerMonitoringPriority"), TriggerMonitoringPriority.values.map(tp => tp.name -> tp.name), Symbol("_label") -> "Monitoring Priority", Symbol("class") -> "form-select", Symbol("value") -> triggerForm.data.get("triggerMonitoringPriority").getOrElse(TriggerMonitoringPriority.Low), Symbol("placeholder") -> TriggerMonitoringPriority.Low)
- @helper.input(triggerForm("triggerMaxErrorTime"), Symbol("_label") -> "Monitoring - Max Seconds Between Successes", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "", Symbol("value") -> triggerForm.data.get("triggerMaxErrorTime").getOrElse(300)) { (id, name, value, args) => - + @helper.input(triggerForm("triggerMaxErrorTime"), Symbol("_label") -> "Monitoring - Max Seconds Between Successes", Symbol("placeholder") -> "", Symbol("value") -> triggerForm.data.get("triggerMaxErrorTime").getOrElse(300)) { (id, name, value, args) => + } @if(monitoringTeams.nonEmpty) { - @helper.select(triggerForm("triggerMonitoringTeam"), monitoringTeams.map(mt => mt -> mt), Symbol("_default") -> "Select team", Symbol("_label") -> "Monitoring team", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("class") -> "form-control", Symbol("value") -> triggerForm.data.get("triggerMonitoringTeam").getOrElse("")) + @helper.select(triggerForm("triggerMonitoringTeam"), monitoringTeams.map(mt => mt -> mt), Symbol("_default") -> "Select team", Symbol("_label") -> "Monitoring team", Symbol("class") -> "form-select", Symbol("value") -> triggerForm.data.get("triggerMonitoringTeam").getOrElse("")) } else { - @helper.input(triggerForm("triggerMonitoringTeam"), Symbol("_label") -> "Monitoring team", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "", Symbol("value") -> triggerForm.data.get("triggerMonitoringTeam").getOrElse(None)) { (id, name, value, args) => - + @helper.input(triggerForm("triggerMonitoringTeam"), Symbol("_label") -> "Monitoring team", Symbol("placeholder") -> "", Symbol("value") -> triggerForm.data.get("triggerMonitoringTeam").getOrElse(None)) { (id, name, value, args) => + } }
- @helper.input(triggerForm("description"), Symbol("_label") -> "Description", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-10", Symbol("placeholder") -> "Description", Symbol("value")-> triggerForm.data.get("description").getOrElse("")) { (id, name, value, args) => - + @helper.input(triggerForm("description"), Symbol("_label") -> "Description", Symbol("inputDivClass") -> "col-sm-8", Symbol("placeholder") -> "Description", Symbol("value")-> triggerForm.data.get("description").getOrElse("")) { (id, name, value, args) => + } -
-
@if(triggerForm.data.get("triggerType").getOrElse("") == "simple") { - @helper.input(triggerForm("simple.repeatCount"), Symbol("_label") -> "Repeat count", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("_class") -> "form-horizontal-inline", Symbol("inputDivClass") -> "col-sm-2", Symbol("placeholder") -> "Repeat count", Symbol("value")-> triggerForm.data.get("simple.repeatCount").getOrElse("")) { (id, name, value, args) => - + @helper.input(triggerForm("simple.repeatCount"), Symbol("_label") -> "Repeat count", Symbol("_class") -> "form-horizontal-inline", Symbol("inputDivClass") -> "col-sm-2", Symbol("placeholder") -> "Repeat count", Symbol("value")-> triggerForm.data.get("simple.repeatCount").getOrElse("")) { (id, name, value, args) => + } - @helper.input(triggerForm("simple.repeatInterval"), Symbol("_label") -> "Repeat interval (seconds)", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("_class") -> "form-horizontal-inline", Symbol("inputDivClass") -> "col-sm-2", Symbol("placeholder") -> "Repeat interval (seconds)", Symbol("value")-> triggerForm.data.get("simple.repeatInterval").getOrElse("")) { (id, name, value, args) => - + @helper.input(triggerForm("simple.repeatInterval"), Symbol("_label") -> "Repeat interval (seconds)", Symbol("_class") -> "form-horizontal-inline", Symbol("inputDivClass") -> "col-sm-2", Symbol("placeholder") -> "Repeat interval (seconds)", Symbol("value")-> triggerForm.data.get("simple.repeatInterval").getOrElse("")) { (id, name, value, args) => + } } else { - @helper.input(triggerForm("cron.cronExpression"), Symbol("_label") -> "Cron Expression", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("_class") -> "form-horizontal-inline", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Cron expression", Symbol("value")-> triggerForm.data.get("cron.cronExpression").getOrElse("")) { (id, name, value, args) => - + @helper.input(triggerForm("cron.cronExpression"), Symbol("_label") -> "Cron Expression", Symbol("_class") -> "form-horizontal-inline", Symbol("placeholder") -> "Cron expression", Symbol("value")-> triggerForm.data.get("cron.cronExpression").getOrElse("")) { (id, name, value, args) => + } } -

Job Data Map

- -
- @helper.repeat(triggerForm("job-data-map"), min = triggerForm("job-data-map").indexes.length + 1) { dataMap => + @com.lucidchart.piezo.admin.views.html.jobDataMap(triggerForm("job-data-map")) - @dataMap("key").value.map { _ => - @dataMap("value").value.map { _ => - - } - } - - @helper.inputText(dataMap("key"), Symbol("_label") -> "Key", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Key", Symbol("class") -> "job-data-key form-control form-inline-control") - @helper.inputText(dataMap("value"), Symbol("_label") -> "Value", Symbol("labelClass") -> "col-sm-2 text-right", Symbol("inputDivClass") -> "col-sm-4", Symbol("placeholder") -> "Value", Symbol("class") -> "job-data-value form-control form-inline-control") - - } - - -
- -
- - + +
} diff --git a/admin/app/com/lucidchart/piezo/admin/views/helpers/fieldConstructor.scala.html b/admin/app/com/lucidchart/piezo/admin/views/helpers/fieldConstructor.scala.html index 6285d05c..b586fc9e 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/helpers/fieldConstructor.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/helpers/fieldConstructor.scala.html @@ -1,9 +1,9 @@ @(elements: helper.FieldElements) -
- -
+
+ +
@elements.input - @elements.errors.mkString(", ") +
@elements.errors.mkString(", ")
diff --git a/admin/app/com/lucidchart/piezo/admin/views/index.scala.html b/admin/app/com/lucidchart/piezo/admin/views/index.scala.html index 896ab4ad..33790705 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/index.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/index.scala.html @@ -8,10 +8,10 @@
-
+

Piezo was created by Lucid Software, Inc. to provide management tools for quartz scheduler clusters. -

+

} diff --git a/admin/app/com/lucidchart/piezo/admin/views/job.scala.html b/admin/app/com/lucidchart/piezo/admin/views/job.scala.html index dccced7a..37eecaeb 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/job.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/job.scala.html @@ -22,91 +22,96 @@

@errorMessage.get

} @if(!currentJob.isEmpty) { -

@currentJob.get.getKey.getGroup() » @currentJob.get.getKey.getName()

- - +

@currentJob.get.getKey.getGroup() » @currentJob.get.getKey.getName()

+
+ @Icon.download - - + + @Icon.duplicate - - + + @Icon.pencil - - + + @Icon.remove - - + + @Icon.flash @if(!pausableTriggers.isEmpty) { - - + + @Icon.pause } else { @if(!resumableTriggers.isEmpty) { - - + + @Icon.play } }
-