From 8613f6772a0dbf47533452caf0160b75f7d43dba Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Tue, 26 May 2026 17:22:49 -0600 Subject: [PATCH 1/8] refactor: Stop using jquery Stop using jquery in our own html pages. This uses css animation instead of jquery transitions, and uses vanilla js instead of jquery for finding elements. --- .../piezo/admin/views/main.scala.html | 43 +++++++----------- admin/public/stylesheets/main.css | 44 +++++++++++++++++-- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/admin/app/com/lucidchart/piezo/admin/views/main.scala.html b/admin/app/com/lucidchart/piezo/admin/views/main.scala.html index 36248f57..bcae7ff4 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/main.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/main.scala.html @@ -57,44 +57,31 @@
@if(!request.flash.isEmpty) { + @* See main.css for animation to faid the flash after load *@
@request.flash("message") +
+ }
- - } -
-@content + @content -
- +
+ @for(script <- scripts) { diff --git a/admin/public/stylesheets/main.css b/admin/public/stylesheets/main.css index 7aa2762b..38599533 100644 --- a/admin/public/stylesheets/main.css +++ b/admin/public/stylesheets/main.css @@ -3,13 +3,51 @@ body { padding-top: 60px; /* 40px to make the container go all the way to the bottom of the topbar */ } +:root { + --space: 10px; +} + +/* + * smooth transition for hiding flash message + * + * This waits 3s, then fades the message to 0 opacity over 2s, then + * shrinks the size to 0 so that content below it moves up. + */ +@keyframes flash-dismiss { + 83%, to { + opacity: 0; + } + 83% { + margin-top: var(--space); + padding: var(--space); + height: auto; + } + to { + margin-top: 0; + padding: 0 var(--space); + height: 0; + display: none; + } +} + +#flash-page { + + + /** + * Animation lasts 2.4s after a delay of 3s. + */ + animation: flash-dismiss 2.4s ease 3s forwards; + + overflow: hidden; +} + .flash-container { text-align: center; } .flash-container div { - margin-top: 10px; - padding: 10px; + margin-top: var(--space); + padding: var(--space); } a:link.piezoicon, a:visited.piezoicon { @@ -134,4 +172,4 @@ th, td { .column-time { min-width: 85px; -} \ No newline at end of file +} From cfbc9295b56fe6069b3127bc4b9f6d081e83d24b Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Wed, 27 May 2026 14:50:26 -0600 Subject: [PATCH 2/8] refactor: remove jquery from jobdata.js Use raw js instead. Also refactor the html a little bit to make it easier to manipulate components. --- .../piezo/admin/views/editJob.scala.html | 8 ++- .../piezo/admin/views/editTrigger.scala.html | 8 ++- .../piezo/admin/views/jobsLayout.scala.html | 2 +- .../piezo/admin/views/main.scala.html | 2 + .../admin/views/triggersLayout.scala.html | 2 +- admin/public/js/jobData.js | 59 +++++++++++-------- admin/public/stylesheets/main.css | 3 +- 7 files changed, 49 insertions(+), 35 deletions(-) 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..8c139e91 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html @@ -42,21 +42,23 @@

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

Job Data Map

-
+
@helper.repeat(jobForm("job-data-map"), min = jobForm("job-data-map").indexes.length + 1) { dataMap => +
@dataMap("key").value.map { _ => @dataMap("value").value.map { _ => - + delete } } @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") +
} - + add
} 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..f1137e29 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html @@ -100,21 +100,23 @@

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

Job Data Map

-
+
@helper.repeat(triggerForm("job-data-map"), min = triggerForm("job-data-map").indexes.length + 1) { dataMap => +
@dataMap("key").value.map { _ => @dataMap("value").value.map { _ => - + delete } } @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") +
} - + add
diff --git a/admin/app/com/lucidchart/piezo/admin/views/jobsLayout.scala.html b/admin/app/com/lucidchart/piezo/admin/views/jobsLayout.scala.html index 56a609c2..c103e543 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/jobsLayout.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/jobsLayout.scala.html @@ -41,7 +41,7 @@
} else { class="list-group-item" } - data-toggle="tooltip" data-placement="auto right"title="@jobKey.getName()"> + data-toggle="tooltip" data-placement="auto right" title="@jobKey.getName()"> @jobKey.getName() } diff --git a/admin/app/com/lucidchart/piezo/admin/views/main.scala.html b/admin/app/com/lucidchart/piezo/admin/views/main.scala.html index bcae7ff4..829f7b27 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/main.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/main.scala.html @@ -28,6 +28,8 @@ + @* TODO: remove this at some point, so we don't load all the scritps both before and after the document is parsed + or use defer. *@ @for(script <- scripts) { } diff --git a/admin/app/com/lucidchart/piezo/admin/views/triggersLayout.scala.html b/admin/app/com/lucidchart/piezo/admin/views/triggersLayout.scala.html index a53f6b61..63f0489b 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/triggersLayout.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/triggersLayout.scala.html @@ -40,7 +40,7 @@
} else { class="list-group-item" } - data-toggle="tooltip" data-placement="auto right"title="@triggerKey.getName()"> + data-toggle="tooltip" data-placement="auto right" title="@triggerKey.getName()"> @triggerKey.getName() } diff --git a/admin/public/js/jobData.js b/admin/public/js/jobData.js index ea2e8ee7..f9db27df 100644 --- a/admin/public/js/jobData.js +++ b/admin/public/js/jobData.js @@ -1,44 +1,51 @@ (function () { - var fixDataMapIndexes = function() { - $('[id*=job-data-map]').each(function(i, element){ + function fixDataMapIndexes() { + const inputs = document.querySelectorAll('input[id*=job-data-map_]'); + for (let i = 0; i < inputs.length; i++) { + const element = inputs[i]; if (i % 2 === 0) { - var itemNumber = i / 2; + const itemNumber = i / 2; element.id = 'job-data-map_' + itemNumber + '_key'; element.name = 'job-data-map[' + itemNumber + '].key'; - } - - if (i % 2 !== 0) { - var itemNumber = (i - 1) / 2; + } else { + const itemNumber = (i - 1) / 2; element.id = 'job-data-map_' + itemNumber + '_value'; element.name = 'job-data-map[' + itemNumber + '].value'; } - }) - }; - - $('.job-data-map').on('click', '.job-data-delete a', function () { - $(this).parent().next().next().remove(); - $(this).parent().next().remove(); - $(this).parent().remove(); - - fixDataMapIndexes(); + } + } + + document.getElementById('job-data-map')?.addEventListener('click', function(e) { + // Only act on clicks on the delete link + const anchor = e.target.closest('a.job-data-delete'); + if (anchor) { + e.preventDefault(); + const entry = anchor.closest('.job-data-entry'); + entry?.remove(); + fixDataMapIndexes(); + } }); - $('.job-data-add').click(function () { - var key = $(this).prev().prev().clone(); - var value = $(this).prev().clone(); + document.getElementById('job-data-add')?.addEventListener('click', function() { + const prevEntry = this.previousElementSibling; + + // clone before we add the delete button, or we end up with duplicate delete buttons + const entry = prevEntry.cloneNode(true); - $(this).prev().prev().before($('')); + prevEntry.insertAdjacentHTML('afterbegin', 'delete'); - key.find('input').val(''); - value.find('input').val(''); + // reset inputs + const inputs = entry.getElementsByTagName('input'); + for (const input of inputs) { + input.value = ''; + } - $(this).before(key); - $(this).before(value); + this.before(entry); fixDataMapIndexes(); }); - $('form').submit(function () { + document.querySelector('form')?.addEventListener('submit', function() { fixDataMapIndexes(); }); -})(); \ No newline at end of file +})(); diff --git a/admin/public/stylesheets/main.css b/admin/public/stylesheets/main.css index 38599533..d8365d46 100644 --- a/admin/public/stylesheets/main.css +++ b/admin/public/stylesheets/main.css @@ -96,9 +96,10 @@ h3.job-name { max-width: 585px; } -div.job-data-delete, div.job-data-add { +a.job-data-delete, a.job-data-add { float: right; margin-right: 240px; + display: block; } .table-fixed-first-col { From 1f593591bff0b2439a0cf7b579467d7bff739efa Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Wed, 27 May 2026 17:07:39 -0600 Subject: [PATCH 3/8] fix: Fix autocomplete At some point the autocomplete functionality broke. This restores it. It also removes some more jquery code, and uses the built-in browser completion. --- .../piezo/admin/controllers/Jobs.scala | 16 ++------- .../piezo/admin/controllers/Triggers.scala | 14 ++++---- .../piezo/admin/views/editJob.scala.html | 12 +++++-- .../piezo/admin/views/editTrigger.scala.html | 26 +++++++++++--- .../piezo/admin/views/triggers.scala.html | 2 +- admin/conf/routes | 5 +-- admin/public/js/jobnamecomplete.js | 36 +++++++++++++++++++ admin/public/js/typeAhead.js | 32 ----------------- 8 files changed, 79 insertions(+), 64 deletions(-) create mode 100644 admin/public/js/jobnamecomplete.js delete mode 100644 admin/public/js/typeAhead.js 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/editJob.scala.html b/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html index 8c139e91..e5042bc6 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], @@ -30,7 +30,15 @@

@jobForm.errors.filter(_.key == "").map(_.message).mkStr
@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") + @if(!existing) { + + @jobsByGroup.map { case (name, _) => + + } + + } + + @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") -> "form-control form-inline-control", Symbol("list") -> "job-groups-list") @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") 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 f1137e29..6d7434bf 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], @@ -49,19 +50,36 @@

New Trigger

@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("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("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("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.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) diff --git a/admin/app/com/lucidchart/piezo/admin/views/triggers.scala.html b/admin/app/com/lucidchart/piezo/admin/views/triggers.scala.html index 53b73f9c..eec871de 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/triggers.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/triggers.scala.html @@ -40,7 +40,7 @@

Upcoming Triggers

- *{ quartz still uses java.util.Date }* + @* quartz still uses java.util.Date }*@ @defining(new java.util.Date()) { now => @upcomingTriggers.map { trigger => diff --git a/admin/conf/routes b/admin/conf/routes index 0b27666f..6af7c4b1 100644 --- a/admin/conf/routes +++ b/admin/conf/routes @@ -16,8 +16,7 @@ POST /data/jobs com.lucidchart.piezo.admin.controller GET /data/jobs com.lucidchart.piezo.admin.controllers.Jobs.getJobsDetail GET /data/jobs/:group/:name com.lucidchart.piezo.admin.controllers.Jobs.getJobDetail(group: String, name: String) -GET /typeahead/jobs/:sofar com.lucidchart.piezo.admin.controllers.Jobs.jobGroupTypeAhead(sofar: String) -GET /typeahead/jobs/:group/:sofar com.lucidchart.piezo.admin.controllers.Jobs.jobNameTypeAhead(group: String, sofar: String) +GET /typeahead/jobs/:group com.lucidchart.piezo.admin.controllers.Jobs.jobNameTypeAhead(group: String) GET /triggers com.lucidchart.piezo.admin.controllers.Triggers.getIndex GET /triggers/new/:triggerType com.lucidchart.piezo.admin.controllers.Triggers.getNewTriggerForm(triggerType, jobGroup: String ?= "", jobName: String ?= "", templateGroup: Option[String] ?= None, templateName: Option[String] ?= None) @@ -30,8 +29,6 @@ POST /triggers/:group/:name/onetime/:id com.lucidchart.piezo.admin.controller POST /triggers com.lucidchart.piezo.admin.controllers.Triggers.postTrigger() PATCH /triggers/:group/:name com.lucidchart.piezo.admin.controllers.Triggers.patchTrigger(group: String, name: String) -GET /typeahead/triggers/:sofar com.lucidchart.piezo.admin.controllers.Triggers.triggerGroupTypeAhead(sofar: String) - GET /favicon.ico controllers.Assets.at(path="/public/img", file="favicon.ico") # Worker Health Check diff --git a/admin/public/js/jobnamecomplete.js b/admin/public/js/jobnamecomplete.js new file mode 100644 index 00000000..1f28175d --- /dev/null +++ b/admin/public/js/jobnamecomplete.js @@ -0,0 +1,36 @@ +{ + let currentJobGroup = ''; + + const updateJobNames= async function() { + const jobGroup = this.value; + + const datalist = document.getElementById('job-names-list'); + + if (jobGroup == currentJobGroup) { + return; + } + + // Empty the node + datalist.textContent = ''; + + if (!jobGroup) { + // If we have an empty grop don't bother fetching the names + return; + } + + // TODO: should we cache this? + const resp = await fetch(`/typeahead/jobs/${jobGroup}`); + const results = await resp.json(); + for (const name of results) { + const opt = document.createElement('option'); + opt.value = name; + datalist.appendChild(opt); + } + currentJobGroup = jobGroup; + } + + const jobGroupInput = document.getElementById('jobGroup'); + jobGroupInput?.addEventListener('change', updateJobNames); + // Call in case we already have a value + jobGroupInput && updateJobNames.call(jobGroupInput); +} diff --git a/admin/public/js/typeAhead.js b/admin/public/js/typeAhead.js deleted file mode 100644 index baaa34f6..00000000 --- a/admin/public/js/typeAhead.js +++ /dev/null @@ -1,32 +0,0 @@ -(function () { - var baseUrl = '/typeahead/'; - var jobUrl = baseUrl + 'jobs/'; - var triggerUrl = baseUrl + 'triggers/'; - - function sourceFunc(url, key, groupInput) { - return function(request, response) { - if (groupInput && !groupInput.val()) { - response([]); - } else { - var append = (groupInput && groupInput.val()) ? - groupInput.val() + '/' : ''; - - $.get(url + append + request.term, function(data) { - response(data[key]); - }); - } - }; - } - - $('input.job-group-type-ahead').autocomplete({ - source: sourceFunc(jobUrl, 'groups'), - }); - - $('input.job-name-type-ahead').autocomplete({ - source: sourceFunc(jobUrl, 'jobs', $('#jobGroup')), - }); - - $('input.trigger-group-type-ahead').autocomplete({ - source: sourceFunc(triggerUrl, 'groups'), - }); -})(); \ No newline at end of file From 0c82f415a747d3c53889499f21116bd1a0da217a Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Fri, 29 May 2026 14:14:32 -0600 Subject: [PATCH 4/8] refactor: Get rid of jquery This upgrades bootstrap and removes the rest of the jquery code, and finally removes the vendored jquery dependency itself. This has some minor changes to the appearance of the interface, but the functionality should be the same. --- .../lucidchart/piezo/admin/views/Icon.scala | 69 + .../piezo/admin/views/editJob.scala.html | 63 +- .../piezo/admin/views/editTrigger.scala.html | 100 +- .../views/helpers/fieldConstructor.scala.html | 8 +- .../piezo/admin/views/index.scala.html | 4 +- .../piezo/admin/views/job.scala.html | 146 +- .../piezo/admin/views/jobDataMap.scala.html | 54 + .../piezo/admin/views/jobs.scala.html | 100 +- .../piezo/admin/views/jobsLayout.scala.html | 33 +- .../piezo/admin/views/main.scala.html | 43 +- .../piezo/admin/views/trigger.scala.html | 126 +- .../piezo/admin/views/triggers.scala.html | 8 +- .../admin/views/triggersLayout.scala.html | 65 +- admin/build.sbt | 2 +- .../bootstrap-3.3.6/css/bootstrap-theme.css | 587 -- .../css/bootstrap-theme.css.map | 1 - .../css/bootstrap-theme.min.css | 6 - .../css/bootstrap-theme.min.css.map | 1 - .../public/bootstrap-3.3.6/css/bootstrap.css | 6760 ------------- .../bootstrap-3.3.6/css/bootstrap.css.map | 1 - .../bootstrap-3.3.6/css/bootstrap.min.css | 6 - .../bootstrap-3.3.6/css/bootstrap.min.css.map | 1 - .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes admin/public/bootstrap-3.3.6/js/bootstrap.js | 2363 ----- .../bootstrap-3.3.6/js/bootstrap.min.js | 7 - admin/public/bootstrap-3.3.6/js/npm.js | 13 - .../bootstrap-5.3.8/css/bootstrap.min.css | 6 + .../bootstrap-5.3.8/css/bootstrap.min.css.map | 1 + .../bootstrap-5.3.8/js/bootstrap.min.js | 7 + .../bootstrap-5.3.8/js/bootstrap.min.js.map | 1 + admin/public/js/jobData.js | 9 +- admin/public/js/jquery-2.0.3.js | 8829 ----------------- admin/public/js/jquery-2.0.3.min.js | 6 - admin/public/js/jquery-2.0.3.min.map | 1 - admin/public/js/jquery.tokeninput.js | 873 -- admin/public/stylesheets/main.css | 66 +- 40 files changed, 524 insertions(+), 20130 deletions(-) create mode 100644 admin/app/com/lucidchart/piezo/admin/views/Icon.scala create mode 100644 admin/app/com/lucidchart/piezo/admin/views/jobDataMap.scala.html delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap-theme.css delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap-theme.css.map delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap-theme.min.css delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap-theme.min.css.map delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap.css delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap.css.map delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap.min.css delete mode 100644 admin/public/bootstrap-3.3.6/css/bootstrap.min.css.map delete mode 100644 admin/public/bootstrap-3.3.6/fonts/glyphicons-halflings-regular.eot delete mode 100644 admin/public/bootstrap-3.3.6/fonts/glyphicons-halflings-regular.svg delete mode 100644 admin/public/bootstrap-3.3.6/fonts/glyphicons-halflings-regular.ttf delete mode 100644 admin/public/bootstrap-3.3.6/fonts/glyphicons-halflings-regular.woff delete mode 100644 admin/public/bootstrap-3.3.6/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 admin/public/bootstrap-3.3.6/js/bootstrap.js delete mode 100644 admin/public/bootstrap-3.3.6/js/bootstrap.min.js delete mode 100644 admin/public/bootstrap-3.3.6/js/npm.js create mode 100644 admin/public/bootstrap-5.3.8/css/bootstrap.min.css create mode 100644 admin/public/bootstrap-5.3.8/css/bootstrap.min.css.map create mode 100644 admin/public/bootstrap-5.3.8/js/bootstrap.min.js create mode 100644 admin/public/bootstrap-5.3.8/js/bootstrap.min.js.map delete mode 100644 admin/public/js/jquery-2.0.3.js delete mode 100644 admin/public/js/jquery-2.0.3.min.js delete mode 100644 admin/public/js/jquery-2.0.3.min.map delete mode 100644 admin/public/js/jquery.tokeninput.js 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..708faac4 --- /dev/null +++ b/admin/app/com/lucidchart/piezo/admin/views/Icon.scala @@ -0,0 +1,69 @@ +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 + 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 e5042bc6..5bfcdb96 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/editJob.scala.html @@ -25,54 +25,29 @@

Edit Job

New Job

} -

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

- -
- @defining(if(existing) {Symbol("readonly")} else {Symbol("none")}) { newEditOnly => - - @if(!existing) { - - @jobsByGroup.map { case (name, _) => - - } - +

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

+ + @defining(if(existing) {Symbol("readonly")} else {Symbol("none")}) { newEditOnly => + + @if(!existing) { + + @jobsByGroup.map { case (name, _) => + } + + } - @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") -> "form-control form-inline-control", Symbol("list") -> "job-groups-list") - @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") - - - - @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.repeat(jobForm("job-data-map"), min = jobForm("job-data-map").indexes.length + 1) { dataMap => - -
- @dataMap("key").value.map { _ => - @dataMap("value").value.map { _ => - delete - } - } - - @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") -
+ @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") - } + - add -
- } + @helper.checkbox(jobForm("requests-recovery"), Symbol("_label") -> "Requests recovery", Symbol("class") -> "form-check-input my-auto ms-3") } -
+ @com.lucidchart.piezo.admin.views.html.jobDataMap(jobForm("job-data-map")) - - - + + + } 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 6d7434bf..e9391322 100644 --- a/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html +++ b/admin/app/com/lucidchart/piezo/admin/views/editTrigger.scala.html @@ -29,21 +29,19 @@

Edit Trigger

New Trigger

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

@@ -69,77 +67,55 @@

@triggerForm.errors.filter(_.key == "").map(_.message).m
@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 => - -
- @dataMap("key").value.map { _ => - @dataMap("value").value.map { _ => - delete - } - } - - @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") -
- - } + @com.lucidchart.piezo.admin.views.html.jobDataMap(triggerForm("job-data-map")) - add -
- -
- - + + } 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 } }
-