diff --git a/src/main/css/index.css b/src/main/css/index.css index add128c..1be91e3 100644 --- a/src/main/css/index.css +++ b/src/main/css/index.css @@ -24,70 +24,89 @@ .fc-toolbar { background: var(--table-background); - height:2.6em; + height: 2.6em; border-bottom: 1px solid #ddd; - padding:3px; -} - -.fc-center { - line-height:2.2em; + padding: 3px; } .fc-toolbar.fc-header-toolbar { - margin-bottom:0px; + margin-bottom: 0px; } .fc-toolbar .fc-clear { - clear:none; + clear: none; +} + +.fc-center { + line-height: 2.2em; } .fc-view-container { - padding:5px; + padding: 5px; } .fc-event-container a, .fc-event-container a:link, .fc-event-container a:active, .fc-event-container a:visited { - color:black; text-decoration: none; } -.fc-event-container a.event-state-scheduled, -.fc-event-container a.event-state-scheduled:link, -.fc-event-container a.event-state-scheduled:active, -.fc-event-container a.event-state-scheduled:visited { - color: var(--text-color); -} - .fc-event { background-color: #888888; border-color: #888888; } +.fc-event.event-selected { + background:#aaa; +} + .fc-event.event-result-success { background-color: var(--result-success-color); border-color: var(--result-success-color); + color: var(--result-success-text-color); +} + +.fc-event.event-result-success.event-selected { + background: var(--result-success-selected-color); + color: var(--result-success-selected-text-color); } .fc-event.event-result-failure { background-color: var(--result-failure-color); - border-color:var(--result-failure-color); + border-color: var(--result-failure-color); + color: var(--result-failure-text-color); +} + +.fc-event.event-result-failure.event-selected { + background: var(--result-failure-selected-color); + color: var(--result-failure-selected-text-color); } .fc-event.event-result-unstable { - background-color: var(--warning-color); - border-color: var(--warning-color); + background-color: var(--result-unstable-color); + border-color: var(--result-unstable-color); + color: var(--result-unstable-text-color); +} + +.fc-event.event-result-unstable.event-selected { + background: var(--result-unstable-selected-color); + color: var(--result-unstable-selected-text-color); } .fc-event.event-state-scheduled { - background-color: var(--grey); - border-color: var(--grey); + background-color: var(--result-scheduled-color); + border-color: var(--result-scheduled-text-color); border-style: dashed; + color: var(--result-scheduled-text-color); +} + +.fc-event.event-state-scheduled.event-selected { + background: var(--result-scheduled-selected-color); + color: var(--result-scheduled-selected-text-color); } .fc-event.event-state-running { - border-color: white; border-style: dashed; animation: blink-animation 2s both ease-in-out infinite; } @@ -98,42 +117,26 @@ } } -.fc-event.event-selected { - background:#aaa; -} -.fc-event.event-result-success.event-selected { - background:var(--result-success-selected-color); -} -.fc-event.event-result-failure.event-selected { - background:var(--result-failure-selected-color); -} -.fc-event.event-result-unstable.event-selected { - background:var(--light-orange); -} -.fc-event.event-state-scheduled.event-selected { - background:var(--light-grey); -} - .fc-unthemed td.fc-today { - background: var(--text-color-secondary); + background: grey; } .tippy-tooltip.jenkins-theme { - background-color:var(--background); + background-color: var(--background); border: 1px solid var(--card-border-color); color: var(--text-color); - padding:0; - font-size:100%; - text-align:left; + padding: 0; + font-size: 100%; + text-align: left; border-radius: 8px; } .tippy-tooltip.jenkins-theme .parameterBlock { - padding-top:10px; + padding-top: 10px; } .tippy-tooltip.jenkins-theme .parameters { - padding-left:10px; + padding-left: 10px; } .tippy-tooltip.jenkins-theme .tooltip-head { @@ -148,8 +151,8 @@ .tippy-tooltip.jenkins-theme .tooltip-head .tooltip-close { float: right; - margin-right:3px; - margin-left:5px; + margin-right: 3px; + margin-left: 5px; cursor: pointer; } @@ -158,81 +161,77 @@ } .tippy-tooltip.jenkins-theme .tooltip-body { - padding:10px; + padding: 10px; } .tippy-tooltip.jenkins-theme .tooltip-middle { - display:flex; + display: flex; gap: 5px; align-items: top; } - .tippy-tooltip.jenkins-theme .tooltip-left { - padding-right:10px; - min-width:200px; + padding-right: 10px; + min-width: 200px; } .tippy-tooltip.jenkins-theme .tooltip-right { - padding-left:10px; - border-left:1px solid var(--text-color-secondary); - min-width:200px; + padding-left: 10px; + border-left: 1px solid var(--text-color-secondary); + min-width: 200px; } .tippy-tooltip.jenkins-theme .tooltip-right ul a { - display:inline-block; - min-width:3em; + display: inline-block; + min-width: 3em; } .tippy-tooltip.jenkins-theme .tooltip-bottom { - border-top:1px solid var(--text-color-secondary); - margin-top:20px; - padding-top:10px; + border-top: 1px solid var(--text-color-secondary); + margin-top: 20px; + padding-top: 10px; } .tippy-tooltip.jenkins-theme .tooltip-bottom .previous { - float:left; + float: left; } .tippy-tooltip.jenkins-theme .tooltip-bottom .previous i:after { content:"\25C0"; - font-size:80%; - font-style:normal; - margin-right:2px; + font-size: 80%; + font-style: normal; + margin-right: 2px; } .tippy-tooltip.jenkins-theme .tooltip-bottom .next { - float:right; + float: right; } .tippy-tooltip.jenkins-theme .tooltip-bottom .next i:after { content:"\25B6"; - font-size:80%; - font-style:normal; - margin-left:2px; + font-size: 80%; + font-style: normal; + margin-left: 2px; } .tippy-tooltip.jenkins-theme .tooltip-body .time { - color:var(--text-color-secondary); - text-decoration:none; + color: var(--text-color-secondary); + text-decoration: none; } .tippy-tooltip.jenkins-theme .tooltip-body .time:hover { - color:var(--text-color-secondary); - text-decoration:underline; + color: var(--text-color-secondary); + text-decoration: underline; } .tippy-tooltip.jenkins-theme .tooltip-body .nextBuild { - color:var(--text-color-secondary); -} - -.tippy-tooltip.jenkins-theme .tooltip-body ul { - margin:0px; - padding:0px; - list-style-type:none; + color: var(--text-color-secondary); } .tippy-tooltip.jenkins-theme .tooltip-body ul { + margin: 0px; + padding: 0px; + list-style-type: none; } .tippy-popper[x-placement^=top] .tippy-tooltip.jenkins-theme .tippy-arrow { @@ -248,21 +247,21 @@ } .calendar-view-config-default { - font-size:90%; + font-size: 90%; color: var(--text-color-secondary); } .calendar-view-config-label { - vertical-align:middle; - padding:0px 10px 20px 10px; + vertical-align: middle; + padding: 0px 10px 20px 10px; } .calendar-view-config-label.first-label { - padding-left:0px; + padding-left: 0px; } .calendar-view-config-input { - width:30%; + width: 30%; } .calendar-view-config-container { diff --git a/src/main/java/io/jenkins/plugins/view/calendar/CalendarView.java b/src/main/java/io/jenkins/plugins/view/calendar/CalendarView.java index 1c40bc5..9b9c66d 100644 --- a/src/main/java/io/jenkins/plugins/view/calendar/CalendarView.java +++ b/src/main/java/io/jenkins/plugins/view/calendar/CalendarView.java @@ -26,425 +26,512 @@ */ package io.jenkins.plugins.view.calendar; -import hudson.model.*; -import io.jenkins.plugins.view.calendar.event.CalendarEvent; -import io.jenkins.plugins.view.calendar.service.CalendarEventService; -import io.jenkins.plugins.view.calendar.service.CronJobService; -import io.jenkins.plugins.view.calendar.time.Moment; -import io.jenkins.plugins.view.calendar.util.RequestUtil; +import static io.jenkins.plugins.view.calendar.time.MomentRange.range; +import static io.jenkins.plugins.view.calendar.util.FieldUtil.defaultIfNull; +import static io.jenkins.plugins.view.calendar.util.ValidationUtil.validateEnum; +import static io.jenkins.plugins.view.calendar.util.ValidationUtil.validateInList; +import static io.jenkins.plugins.view.calendar.util.ValidationUtil.validatePattern; +import static io.jenkins.plugins.view.calendar.util.ValidationUtil.validateRange; + +import java.io.IOException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; + import org.apache.commons.text.StringEscapeUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; - -import hudson.Extension; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest2; +import hudson.Extension; +import hudson.model.Descriptor; +import hudson.model.Job; +import hudson.model.ListView; +import hudson.model.TopLevelItem; +import io.jenkins.plugins.view.calendar.event.CalendarEvent; +import io.jenkins.plugins.view.calendar.service.CalendarEventService; +import io.jenkins.plugins.view.calendar.service.CronJobService; +import io.jenkins.plugins.view.calendar.time.Moment; +import io.jenkins.plugins.view.calendar.util.RequestUtil; import jakarta.servlet.ServletException; -import java.io.IOException; -import java.text.ParseException; -import java.util.*; -import java.util.regex.Pattern; - -import static io.jenkins.plugins.view.calendar.time.MomentRange.range; -import static io.jenkins.plugins.view.calendar.util.FieldUtil.defaultIfNull; -import static io.jenkins.plugins.view.calendar.util.ValidationUtil.*; -@SuppressWarnings({ - "PMD.GodClass", - "PMD.ExcessivePublicCount", - "PMD.TooManyFields" -}) +@SuppressWarnings({ "PMD.GodClass", "PMD.ExcessivePublicCount", "PMD.TooManyFields" }) @Restricted(NoExternalUse.class) public class CalendarView extends ListView { - public static enum CalendarViewEventsType { - ALL, BUILDS, POLLINGS; - } - - public static enum CalendarViewType { - MONTH, WEEK, DAY; - } - - public static enum ResultsColors { - GREEN_RED, CYAN_RED - } - - private CalendarViewEventsType calendarViewEventsType; - private CalendarViewType calendarViewType; - private ResultsColors resultsColors; - - private Boolean useCustomFormats; - private Boolean useCustomWeekSettings; - private Boolean useCustomSlotSettings; - - private Boolean weekSettingsShowWeekends; - private Boolean weekSettingsShowWeekNumbers; - private Integer weekSettingsFirstDay; - - private String monthTitleFormat; - private String monthColumnHeaderFormat; - private String monthTimeFormat; - private String monthPopupBuildTimeFormat; - - private String weekTitleFormat; - private String weekColumnHeaderFormat; - private String weekTimeFormat; - private String weekSlotTimeFormat; - private String weekPopupBuildTimeFormat; - - private String dayTitleFormat; - private String dayColumnHeaderFormat; - private String dayTimeFormat; - private String daySlotTimeFormat; - private String dayPopupBuildTimeFormat; - - private String weekSlotDuration; - private String weekMinTime; - private String weekMaxTime; - - private String daySlotDuration; - private String dayMinTime; - private String dayMaxTime; - - @DataBoundConstructor - public CalendarView(final String name) { - super(name); - } - - public CalendarViewEventsType getCalendarViewEventsType() { - return defaultIfNull(calendarViewEventsType, CalendarViewEventsType.ALL); - } - - public void setCalendarViewEventsType(final CalendarViewEventsType calendarViewEventsType) { - this.calendarViewEventsType = calendarViewEventsType; - } - - public CalendarViewType getCalendarViewType() { - return defaultIfNull(calendarViewType, CalendarViewType.WEEK); - } - - public void setCalendarViewType(final CalendarViewType calendarViewType) { - this.calendarViewType = calendarViewType; - } - - public ResultsColors getResultsColors() { - return defaultIfNull(resultsColors, ResultsColors.GREEN_RED); - } - - public void setResultsColors(final ResultsColors resultsColors) { - this.resultsColors = resultsColors; - } - - public boolean isUseCustomFormats() { - return defaultIfNull(useCustomFormats, false); - } - - public void setUseCustomFormats(final boolean useCustomFormats) { - this.useCustomFormats = useCustomFormats; - } - - public boolean isUseCustomWeekSettings() { - return defaultIfNull(useCustomWeekSettings, false); - } - - public void setUseCustomWeekSettings(final boolean useCustomWeekSettings) { - this.useCustomWeekSettings = useCustomWeekSettings; - } - - public boolean isUseCustomSlotSettings() { - return defaultIfNull(useCustomSlotSettings, false); - } - - public void setUseCustomSlotSettings(final boolean useCustomSlotSettings) { - this.useCustomSlotSettings = useCustomSlotSettings; - } + public static enum CalendarViewEventsType { + ALL, BUILDS, POLLINGS; + } + + public static enum CalendarViewType { + MONTH, WEEK, DAY; + } + + public static enum ResultsColors { + DEFAULT( // + "--success-color", // success + "--black", // successText + "--light-green", // successSelected + "--black", // successSelectedText + "--warning-color", // unstable + "--black", // unstableText + "--light-orange", // unstableSelected + "--black", // unstableSelectedText + "--error-color", // failure + "--white", // failureText + "--light-red", // failureSelected + "--white", // failureSelectedText + "--background", // scheduled + "--text-color", // scheduledText + "--text-color", // scheduledSelected + "--background" // scheduledSelectedText + ), + LEGACY( // + "--blue", // success + "--white", // successText + "--light-blue", // successSelected + "--white", // successSelectedText + "--warning-color", // unstable + "--black", // unstableText + "--light-orange", // unstableSelected + "--black", // unstableSelectedText + "--error-color", // failure + "--white", // failureText + "--light-red", // failureSelected + "--white", // failureSelectedText + "--background", // scheduled + "--text-color", // scheduledText + "--text-color", // scheduledSelected + "--background" // scheduledSelectedText + ); + + public final String success; + public final String successText; + public final String successSelected; + public final String successSelectedText; + + public final String unstable; + public final String unstableText; + public final String unstableSelected; + public final String unstableSelectedText; + + public final String failure; + public final String failureText; + public final String failureSelected; + public final String failureSelectedText; + + public final String scheduled; + public final String scheduledText; + public final String scheduledSelected; + public final String scheduledSelectedText; + + ResultsColors( // + String success, String successText, String successSelected, String successSelectedText, // + String unstable, String unstableText, String unstableSelected, String unstableSelectedText, // + String failure, String failureText, String failureSelected, String failureSelectedText, // + String scheduled, String scheduledText, String scheduledSelected, String scheduledSelectedText // + ) { + this.success = success; + this.successText = successText; + this.successSelected = successSelected; + this.successSelectedText = successSelectedText; + + this.unstable = unstable; + this.unstableText = unstableText; + this.unstableSelected = unstableSelected; + this.unstableSelectedText = unstableSelectedText; + + this.failure = failure; + this.failureText = failureText; + this.failureSelected = failureSelected; + this.failureSelectedText = failureSelectedText; + + this.scheduled = scheduled; + this.scheduledText = scheduledText; + this.scheduledSelected = scheduledSelected; + this.scheduledSelectedText = scheduledSelectedText; + } + } + + private CalendarViewEventsType calendarViewEventsType; + private CalendarViewType calendarViewType; + private ResultsColors resultsColors; + + private Boolean useCustomFormats; + private Boolean useCustomWeekSettings; + private Boolean useCustomSlotSettings; + + private Boolean weekSettingsShowWeekends; + private Boolean weekSettingsShowWeekNumbers; + private Integer weekSettingsFirstDay; + + private String monthTitleFormat; + private String monthColumnHeaderFormat; + private String monthTimeFormat; + private String monthPopupBuildTimeFormat; + + private String weekTitleFormat; + private String weekColumnHeaderFormat; + private String weekTimeFormat; + private String weekSlotTimeFormat; + private String weekPopupBuildTimeFormat; + + private String dayTitleFormat; + private String dayColumnHeaderFormat; + private String dayTimeFormat; + private String daySlotTimeFormat; + private String dayPopupBuildTimeFormat; + + private String weekSlotDuration; + private String weekMinTime; + private String weekMaxTime; + + private String daySlotDuration; + private String dayMinTime; + private String dayMaxTime; + + @DataBoundConstructor + public CalendarView(final String name) { + super(name); + } + + public CalendarViewEventsType getCalendarViewEventsType() { + return defaultIfNull(calendarViewEventsType, CalendarViewEventsType.ALL); + } + + public void setCalendarViewEventsType(final CalendarViewEventsType calendarViewEventsType) { + this.calendarViewEventsType = calendarViewEventsType; + } + + public CalendarViewType getCalendarViewType() { + return defaultIfNull(calendarViewType, CalendarViewType.WEEK); + } + + public void setCalendarViewType(final CalendarViewType calendarViewType) { + this.calendarViewType = calendarViewType; + } + + public ResultsColors getResultsColors() { + return defaultIfNull(resultsColors, ResultsColors.DEFAULT); + } + + public void setResultsColors(final ResultsColors resultsColors) { + this.resultsColors = resultsColors; + } + + public boolean isUseCustomFormats() { + return defaultIfNull(useCustomFormats, false); + } + + public void setUseCustomFormats(final boolean useCustomFormats) { + this.useCustomFormats = useCustomFormats; + } + + public boolean isUseCustomWeekSettings() { + return defaultIfNull(useCustomWeekSettings, false); + } + + public void setUseCustomWeekSettings(final boolean useCustomWeekSettings) { + this.useCustomWeekSettings = useCustomWeekSettings; + } + + public boolean isUseCustomSlotSettings() { + return defaultIfNull(useCustomSlotSettings, false); + } + + public void setUseCustomSlotSettings(final boolean useCustomSlotSettings) { + this.useCustomSlotSettings = useCustomSlotSettings; + } + + public boolean isWeekSettingsShowWeekends() { + return defaultIfNull(weekSettingsShowWeekends, true); + } + + public void setWeekSettingsShowWeekends(final boolean weekSettingsShowWeekends) { + this.weekSettingsShowWeekends = weekSettingsShowWeekends; + } - public boolean isWeekSettingsShowWeekends() { - return defaultIfNull(weekSettingsShowWeekends, true); - } + public boolean isWeekSettingsShowWeekNumbers() { + return defaultIfNull(weekSettingsShowWeekNumbers, true); + } + + public void setWeekSettingsShowWeekNumbers(final boolean weekSettingsShowWeekNumbers) { + this.weekSettingsShowWeekNumbers = weekSettingsShowWeekNumbers; + } + + public int getWeekSettingsFirstDay() { + return defaultIfNull(weekSettingsFirstDay, 1); + } + + public void setWeekSettingsFirstDay(final int weekSettingsFirstDay) { + this.weekSettingsFirstDay = weekSettingsFirstDay; + } + + public String getMonthTitleFormat() { + return defaultIfNull(monthTitleFormat, ""); + } + + public void setMonthTitleFormat(final String monthTitleFormat) { + this.monthTitleFormat = monthTitleFormat; + } - public void setWeekSettingsShowWeekends(final boolean weekSettingsShowWeekends) { - this.weekSettingsShowWeekends = weekSettingsShowWeekends; - } + public String getMonthColumnHeaderFormat() { + return defaultIfNull(monthColumnHeaderFormat, ""); + } - public boolean isWeekSettingsShowWeekNumbers() { - return defaultIfNull(weekSettingsShowWeekNumbers, true); - } + public void setMonthColumnHeaderFormat(final String monthColumnHeaderFormat) { + this.monthColumnHeaderFormat = monthColumnHeaderFormat; + } - public void setWeekSettingsShowWeekNumbers(final boolean weekSettingsShowWeekNumbers) { - this.weekSettingsShowWeekNumbers = weekSettingsShowWeekNumbers; - } + public String getMonthTimeFormat() { + return defaultIfNull(monthTimeFormat, ""); + } - public int getWeekSettingsFirstDay() { - return defaultIfNull(weekSettingsFirstDay, 1); - } + public void setMonthTimeFormat(final String monthTimeFormat) { + this.monthTimeFormat = monthTimeFormat; + } - public void setWeekSettingsFirstDay(final int weekSettingsFirstDay) { - this.weekSettingsFirstDay = weekSettingsFirstDay; - } + public String getMonthPopupBuildTimeFormat() { + return defaultIfNull(monthPopupBuildTimeFormat, ""); + } - public String getMonthTitleFormat() { - return defaultIfNull(monthTitleFormat, ""); - } + public void setMonthPopupBuildTimeFormat(final String monthPopupBuildTimeFormat) { + this.monthPopupBuildTimeFormat = monthPopupBuildTimeFormat; + } - public void setMonthTitleFormat(final String monthTitleFormat) { - this.monthTitleFormat = monthTitleFormat; - } + public String getWeekTitleFormat() { + return defaultIfNull(weekTitleFormat, ""); + } - public String getMonthColumnHeaderFormat() { - return defaultIfNull(monthColumnHeaderFormat, ""); - } + public void setWeekTitleFormat(final String weekTitleFormat) { + this.weekTitleFormat = weekTitleFormat; + } - public void setMonthColumnHeaderFormat(final String monthColumnHeaderFormat) { - this.monthColumnHeaderFormat = monthColumnHeaderFormat; - } + public String getWeekColumnHeaderFormat() { + return defaultIfNull(weekColumnHeaderFormat, ""); + } - public String getMonthTimeFormat() { - return defaultIfNull(monthTimeFormat, ""); - } + public void setWeekColumnHeaderFormat(final String weekColumnHeaderFormat) { + this.weekColumnHeaderFormat = weekColumnHeaderFormat; + } - public void setMonthTimeFormat(final String monthTimeFormat) { - this.monthTimeFormat = monthTimeFormat; - } + public String getWeekTimeFormat() { + return defaultIfNull(weekTimeFormat, ""); + } - public String getMonthPopupBuildTimeFormat() { - return defaultIfNull(monthPopupBuildTimeFormat, ""); - } + public void setWeekTimeFormat(final String weekTimeFormat) { + this.weekTimeFormat = weekTimeFormat; + } - public void setMonthPopupBuildTimeFormat(final String monthPopupBuildTimeFormat) { - this.monthPopupBuildTimeFormat = monthPopupBuildTimeFormat; - } + public String getWeekSlotTimeFormat() { + return defaultIfNull(weekSlotTimeFormat, ""); + } - public String getWeekTitleFormat() { - return defaultIfNull(weekTitleFormat, ""); - } + public void setWeekSlotTimeFormat(final String weekSlotTimeFormat) { + this.weekSlotTimeFormat = weekSlotTimeFormat; + } - public void setWeekTitleFormat(final String weekTitleFormat) { - this.weekTitleFormat = weekTitleFormat; - } + public String getWeekPopupBuildTimeFormat() { + return defaultIfNull(weekPopupBuildTimeFormat, ""); + } - public String getWeekColumnHeaderFormat() { - return defaultIfNull(weekColumnHeaderFormat, ""); - } + public void setWeekPopupBuildTimeFormat(final String weekPopupBuildTimeFormat) { + this.weekPopupBuildTimeFormat = weekPopupBuildTimeFormat; + } - public void setWeekColumnHeaderFormat(final String weekColumnHeaderFormat) { - this.weekColumnHeaderFormat = weekColumnHeaderFormat; - } - - public String getWeekTimeFormat() { - return defaultIfNull(weekTimeFormat, ""); - } - - public void setWeekTimeFormat(final String weekTimeFormat) { - this.weekTimeFormat = weekTimeFormat; - } - - public String getWeekSlotTimeFormat() { - return defaultIfNull(weekSlotTimeFormat, ""); - } - - public void setWeekSlotTimeFormat(final String weekSlotTimeFormat) { - this.weekSlotTimeFormat = weekSlotTimeFormat; - } - - public String getWeekPopupBuildTimeFormat() { - return defaultIfNull(weekPopupBuildTimeFormat, ""); - } - - public void setWeekPopupBuildTimeFormat(final String weekPopupBuildTimeFormat) { - this.weekPopupBuildTimeFormat = weekPopupBuildTimeFormat; - } - - public String getDayTitleFormat() { - return defaultIfNull(dayTitleFormat, ""); - } - - public void setDayTitleFormat(final String dayTitleFormat) { - this.dayTitleFormat = dayTitleFormat; - } - - public String getDayColumnHeaderFormat() { - return defaultIfNull(dayColumnHeaderFormat, ""); - } - - public void setDayColumnHeaderFormat(final String dayColumnHeaderFormat) { - this.dayColumnHeaderFormat = dayColumnHeaderFormat; - } - - public String getDayTimeFormat() { - return defaultIfNull(dayTimeFormat, ""); - } - - public void setDayTimeFormat(final String dayTimeFormat) { - this.dayTimeFormat = dayTimeFormat; - } - - public String getDaySlotTimeFormat() { - return defaultIfNull(daySlotTimeFormat, ""); - } - - public void setDaySlotTimeFormat(final String daySlotTimeFormat) { - this.daySlotTimeFormat = daySlotTimeFormat; - } - - public String getDayPopupBuildTimeFormat() { - return defaultIfNull(dayPopupBuildTimeFormat, ""); - } - - public void setDayPopupBuildTimeFormat(final String dayPopupBuildTimeFormat) { - this.dayPopupBuildTimeFormat = dayPopupBuildTimeFormat; - } - - public String getWeekSlotDuration() { - return defaultIfNull(weekSlotDuration, "00:30:00"); - } - - public void setWeekSlotDuration(final String weekSlotDuration) { - this.weekSlotDuration = weekSlotDuration; - } - - public String getDaySlotDuration() { - return defaultIfNull(daySlotDuration, "00:30:00"); - } - - public void setDaySlotDuration(final String daySlotDuration) { - this.daySlotDuration = daySlotDuration; - } - - public String getWeekMinTime() { - return defaultIfNull(weekMinTime, "00:00:00"); - } - - public void setWeekMinTime(final String weekMinTime) { - this.weekMinTime = weekMinTime; - } - - public String getWeekMaxTime() { - return defaultIfNull(weekMaxTime, "24:00:00"); - } - - public void setWeekMaxTime(final String weekMaxTime) { - this.weekMaxTime = weekMaxTime; - } - - public String getDayMinTime() { - return defaultIfNull(dayMinTime, "00:00:00"); - } - - public void setDayMinTime(final String dayMinTime) { - this.dayMinTime = dayMinTime; - } - - public String getDayMaxTime() { - return defaultIfNull(dayMaxTime, "24:00:00"); - } - - public void setDayMaxTime(final String dayMaxTime) { - this.dayMaxTime = dayMaxTime; - } + public String getDayTitleFormat() { + return defaultIfNull(dayTitleFormat, ""); + } + public void setDayTitleFormat(final String dayTitleFormat) { + this.dayTitleFormat = dayTitleFormat; + } + + public String getDayColumnHeaderFormat() { + return defaultIfNull(dayColumnHeaderFormat, ""); + } + + public void setDayColumnHeaderFormat(final String dayColumnHeaderFormat) { + this.dayColumnHeaderFormat = dayColumnHeaderFormat; + } + + public String getDayTimeFormat() { + return defaultIfNull(dayTimeFormat, ""); + } + + public void setDayTimeFormat(final String dayTimeFormat) { + this.dayTimeFormat = dayTimeFormat; + } + + public String getDaySlotTimeFormat() { + return defaultIfNull(daySlotTimeFormat, ""); + } + + public void setDaySlotTimeFormat(final String daySlotTimeFormat) { + this.daySlotTimeFormat = daySlotTimeFormat; + } + + public String getDayPopupBuildTimeFormat() { + return defaultIfNull(dayPopupBuildTimeFormat, ""); + } + + public void setDayPopupBuildTimeFormat(final String dayPopupBuildTimeFormat) { + this.dayPopupBuildTimeFormat = dayPopupBuildTimeFormat; + } + + public String getWeekSlotDuration() { + return defaultIfNull(weekSlotDuration, "00:30:00"); + } + + public void setWeekSlotDuration(final String weekSlotDuration) { + this.weekSlotDuration = weekSlotDuration; + } + + public String getDaySlotDuration() { + return defaultIfNull(daySlotDuration, "00:30:00"); + } + + public void setDaySlotDuration(final String daySlotDuration) { + this.daySlotDuration = daySlotDuration; + } + + public String getWeekMinTime() { + return defaultIfNull(weekMinTime, "00:00:00"); + } + + public void setWeekMinTime(final String weekMinTime) { + this.weekMinTime = weekMinTime; + } + + public String getWeekMaxTime() { + return defaultIfNull(weekMaxTime, "24:00:00"); + } + + public void setWeekMaxTime(final String weekMaxTime) { + this.weekMaxTime = weekMaxTime; + } + + public String getDayMinTime() { + return defaultIfNull(dayMinTime, "00:00:00"); + } + + public void setDayMinTime(final String dayMinTime) { + this.dayMinTime = dayMinTime; + } + + public String getDayMaxTime() { + return defaultIfNull(dayMaxTime, "24:00:00"); + } + + public void setDayMaxTime(final String dayMaxTime) { + this.dayMaxTime = dayMaxTime; + } + + @Override + public boolean isAutomaticRefreshEnabled() { + return false; + } + + @Override + protected void submit(final StaplerRequest2 req) throws ServletException, Descriptor.FormException, IOException { + this.validate(req); + super.submit(req); + this.updateFields(req); + } + + private void validate(final StaplerRequest2 req) throws Descriptor.FormException { + final List validSlotDurations = Collections.unmodifiableList(Arrays.asList("00:05:00", "00:10:00", "00:15:00", "00:20:00", "00:30:00", "01:00:00")); + final Pattern validDateTimePattern = Pattern.compile("(0[0-9]|1[0-9]|2[0-4]):00:00"); + + validateEnum(req, "calendarViewEventsType", CalendarViewEventsType.class); + validateEnum(req, "calendarViewType", CalendarViewType.class); + validateEnum(req, "resultsColors", ResultsColors.class); + validateRange(req, "weekSettingsFirstDay", 0, 7); + + validateInList(req, "weekSlotDuration", validSlotDurations); + validatePattern(req, "weekMinTime", validDateTimePattern); + validatePattern(req, "weekMaxTime", validDateTimePattern); + + validateInList(req, "daySlotDuration", validSlotDurations); + validatePattern(req, "dayMinTime", validDateTimePattern); + validatePattern(req, "dayMaxTime", validDateTimePattern); + } + + private void updateFields(final StaplerRequest2 req) { + setCalendarViewEventsType(CalendarViewEventsType.valueOf(req.getParameter("calendarViewEventsType"))); + setCalendarViewType(CalendarViewType.valueOf(req.getParameter("calendarViewType"))); + setResultsColors(ResultsColors.valueOf(req.getParameter("resultsColors"))); + + setUseCustomFormats(req.getParameter("useCustomFormats") != null); + setUseCustomWeekSettings(req.getParameter("useCustomWeekSettings") != null); + setUseCustomSlotSettings(req.getParameter("useCustomSlotSettings") != null); + + setWeekSettingsShowWeekends(req.getParameter("weekSettingsShowWeekends") != null); + setWeekSettingsShowWeekNumbers(req.getParameter("weekSettingsShowWeekNumbers") != null); + setWeekSettingsFirstDay(Integer.parseInt(req.getParameter("weekSettingsFirstDay"))); + + setMonthTitleFormat(req.getParameter("monthTitleFormat")); + setMonthColumnHeaderFormat(req.getParameter("monthColumnHeaderFormat")); + setMonthTimeFormat(req.getParameter("monthTimeFormat")); + setMonthPopupBuildTimeFormat(req.getParameter("monthPopupBuildTimeFormat")); + + setWeekTitleFormat(req.getParameter("weekTitleFormat")); + setWeekColumnHeaderFormat(req.getParameter("weekColumnHeaderFormat")); + setWeekTimeFormat(req.getParameter("weekTimeFormat")); + setWeekSlotTimeFormat(req.getParameter("weekSlotTimeFormat")); + setWeekPopupBuildTimeFormat(req.getParameter("weekPopupBuildTimeFormat")); + + setDayTitleFormat(req.getParameter("dayTitleFormat")); + setDayColumnHeaderFormat(req.getParameter("dayColumnHeaderFormat")); + setDayTimeFormat(req.getParameter("dayTimeFormat")); + setDaySlotTimeFormat(req.getParameter("daySlotTimeFormat")); + setDayPopupBuildTimeFormat(req.getParameter("dayPopupBuildTimeFormat")); + + setWeekSlotDuration(req.getParameter("weekSlotDuration")); + setWeekMinTime(req.getParameter("weekMinTime")); + setWeekMaxTime(req.getParameter("weekMaxTime")); + + setDaySlotDuration(req.getParameter("daySlotDuration")); + setDayMinTime(req.getParameter("dayMinTime")); + setDayMaxTime(req.getParameter("dayMaxTime")); + } + + public List getJobs() { + final List items = getItems(); + final List jobs = new ArrayList<>(items.size()); + for (final TopLevelItem item : items) { + if (item instanceof Job) { + jobs.add((Job) item); + } + } + return jobs; + } + + public List getEvents() throws ParseException { + final StaplerRequest2 req = Stapler.getCurrentRequest2(); + + final Calendar start = RequestUtil.getParamAsCalendar(req, "start"); + final Calendar end = RequestUtil.getParamAsCalendar(req, "end"); + + final Moment now = new Moment(); + return new CalendarEventService(now, new CronJobService(now)).getCalendarEvents(getJobs(), range(start, end), getCalendarViewEventsType()); + } + + public String jsonEscape(final String text) { + return StringEscapeUtils.escapeEcmaScript(text); + } + + @Extension + public static final class DescriptorImpl extends ListView.DescriptorImpl { @Override - public boolean isAutomaticRefreshEnabled() { - return false; - } - - @Override - protected void submit(final StaplerRequest2 req) throws ServletException, Descriptor.FormException, IOException { - this.validate(req); - super.submit(req); - this.updateFields(req); - } - - private void validate(final StaplerRequest2 req) throws Descriptor.FormException { - final List validSlotDurations = Collections.unmodifiableList(Arrays.asList( - "00:05:00", "00:10:00", "00:15:00", "00:20:00", "00:30:00", "01:00:00" - )); - final Pattern validDateTimePattern = Pattern.compile("(0[0-9]|1[0-9]|2[0-4]):00:00"); - - validateEnum(req, "calendarViewEventsType", CalendarViewEventsType.class); - validateEnum(req, "calendarViewType", CalendarViewType.class); - validateRange(req, "weekSettingsFirstDay", 0, 7); - - validateInList(req, "weekSlotDuration", validSlotDurations); - validatePattern(req, "weekMinTime", validDateTimePattern); - validatePattern(req, "weekMaxTime", validDateTimePattern); - - validateInList(req, "daySlotDuration", validSlotDurations); - validatePattern(req, "dayMinTime", validDateTimePattern); - validatePattern(req, "dayMaxTime", validDateTimePattern); - } - - private void updateFields(final StaplerRequest2 req) { - setCalendarViewEventsType(CalendarViewEventsType.valueOf(req.getParameter("calendarViewEventsType"))); - setCalendarViewType(CalendarViewType.valueOf(req.getParameter("calendarViewType"))); - setResultsColors(ResultsColors.valueOf(req.getParameter("resultsColors"))); - - setUseCustomFormats(req.getParameter("useCustomFormats") != null); - setUseCustomWeekSettings(req.getParameter("useCustomWeekSettings") != null); - setUseCustomSlotSettings(req.getParameter("useCustomSlotSettings") != null); - - setWeekSettingsShowWeekends(req.getParameter("weekSettingsShowWeekends") != null); - setWeekSettingsShowWeekNumbers(req.getParameter("weekSettingsShowWeekNumbers") != null); - setWeekSettingsFirstDay(Integer.parseInt(req.getParameter("weekSettingsFirstDay"))); - - setMonthTitleFormat(req.getParameter("monthTitleFormat")); - setMonthColumnHeaderFormat(req.getParameter("monthColumnHeaderFormat")); - setMonthTimeFormat(req.getParameter("monthTimeFormat")); - setMonthPopupBuildTimeFormat(req.getParameter("monthPopupBuildTimeFormat")); - - setWeekTitleFormat(req.getParameter("weekTitleFormat")); - setWeekColumnHeaderFormat(req.getParameter("weekColumnHeaderFormat")); - setWeekTimeFormat(req.getParameter("weekTimeFormat")); - setWeekSlotTimeFormat(req.getParameter("weekSlotTimeFormat")); - setWeekPopupBuildTimeFormat(req.getParameter("weekPopupBuildTimeFormat")); - - setDayTitleFormat(req.getParameter("dayTitleFormat")); - setDayColumnHeaderFormat(req.getParameter("dayColumnHeaderFormat")); - setDayTimeFormat(req.getParameter("dayTimeFormat")); - setDaySlotTimeFormat(req.getParameter("daySlotTimeFormat")); - setDayPopupBuildTimeFormat(req.getParameter("dayPopupBuildTimeFormat")); - - setWeekSlotDuration(req.getParameter("weekSlotDuration")); - setWeekMinTime(req.getParameter("weekMinTime")); - setWeekMaxTime(req.getParameter("weekMaxTime")); - - setDaySlotDuration(req.getParameter("daySlotDuration")); - setDayMinTime(req.getParameter("dayMinTime")); - setDayMaxTime(req.getParameter("dayMaxTime")); - } - - public List getJobs() { - final List items = getItems(); - final List jobs = new ArrayList<>(items.size()); - for (final TopLevelItem item: items) { - if (item instanceof Job) { - jobs.add((Job)item); - } - } - return jobs; - } - - public List getEvents() throws ParseException { - final StaplerRequest2 req = Stapler.getCurrentRequest2(); - - final Calendar start = RequestUtil.getParamAsCalendar(req, "start"); - final Calendar end = RequestUtil.getParamAsCalendar(req, "end"); - - final Moment now = new Moment(); - return new CalendarEventService(now, new CronJobService(now)).getCalendarEvents(getJobs(), range(start, end), getCalendarViewEventsType()); - } - - public String jsonEscape(final String text) { - return StringEscapeUtils.escapeEcmaScript(text); - } - - @Extension - public static final class DescriptorImpl extends ListView.DescriptorImpl { - @Override - public String getDisplayName() { - return Messages.CalendarView_DisplayName(); - } + public String getDisplayName() { + return Messages.CalendarView_DisplayName(); } + } } diff --git a/src/main/js/index.js b/src/main/js/index.js index 6f25c34..ec25a30 100644 --- a/src/main/js/index.js +++ b/src/main/js/index.js @@ -39,18 +39,22 @@ var timeout = null; $(function() { const root = document.documentElement; - if (CalendarViewOptions.resultsColors === 'cyan_red') { - root.style.setProperty('--result-success-color', '#5291CB'); - root.style.setProperty('--result-failure-color', '#CF0000'); - root.style.setProperty('--result-success-selected-color', '#6A9AC7'); - root.style.setProperty('--result-failure-selected-color', '#FF0000'); - } - else{ - root.style.setProperty('--result-success-color', '#00B80E'); - root.style.setProperty('--result-failure-color', '#CF0000'); - root.style.setProperty('--result-success-selected-color', '#00E610'); - root.style.setProperty('--result-failure-selected-color', '#FF0000'); - } + root.style.setProperty('--result-success-color', getColorFor(root, CalendarViewOptions.resultsColors.success)); + root.style.setProperty('--result-success-text-color', getColorFor(root, CalendarViewOptions.resultsColors.successText)); + root.style.setProperty('--result-success-selected-color', getColorFor(root, CalendarViewOptions.resultsColors.successSelected)); + root.style.setProperty('--result-success-selected-text-color', getColorFor(root, CalendarViewOptions.resultsColors.successSelectedText)); + root.style.setProperty('--result-unstable-color', getColorFor(root, CalendarViewOptions.resultsColors.unstable)); + root.style.setProperty('--result-unstable-text-color', getColorFor(root, CalendarViewOptions.resultsColors.unstableText)); + root.style.setProperty('--result-unstable-selected-color', getColorFor(root, CalendarViewOptions.resultsColors.unstableSelected)); + root.style.setProperty('--result-unstable-selected-text-color', getColorFor(root, CalendarViewOptions.resultsColors.unstableSelectedText)); + root.style.setProperty('--result-failure-color', getColorFor(root, CalendarViewOptions.resultsColors.failure)); + root.style.setProperty('--result-failure-text-color', getColorFor(root, CalendarViewOptions.resultsColors.failureText)); + root.style.setProperty('--result-failure-selected-color', getColorFor(root, CalendarViewOptions.resultsColors.failureSelected)); + root.style.setProperty('--result-failure-selected-text-color', getColorFor(root, CalendarViewOptions.resultsColors.failureSelectedText)); + root.style.setProperty('--result-scheduled-color', getColorFor(root, CalendarViewOptions.resultsColors.scheduled)); + root.style.setProperty('--result-scheduled-text-color', getColorFor(root, CalendarViewOptions.resultsColors.scheduledText)); + root.style.setProperty('--result-scheduled-selected-color', getColorFor(root, CalendarViewOptions.resultsColors.scheduledSelected)); + root.style.setProperty('--result-scheduled-selected-text-color', getColorFor(root, CalendarViewOptions.resultsColors.scheduledSelectedText)); $('#calendar-view').fullCalendar({ events: 'events', @@ -126,3 +130,7 @@ $(function() { } }); }); + +function getColorFor(root, value) { + return value.startsWith('--') ? getComputedStyle(root).getPropertyValue(value) : value; +} diff --git a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.jelly b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.jelly index 366d6d0..c6581af 100644 --- a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.jelly +++ b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.jelly @@ -48,10 +48,10 @@ Portions of this code copied from the Jenkins Project. See LICENSE.md for notice - +
- - + +
diff --git a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.properties b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.properties index 6e3aa96..3f3a79c 100644 --- a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.properties +++ b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries.properties @@ -20,6 +20,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +Colors.Default=Default (Red-Orange-Green) +Colors.Legacy=Legacy (Red-Orange-Blue) + Month.TitleFormat=MMMM YYYY Month.ColumnHeaderFormat=ddd Month.TimeFormat=HH:mm diff --git a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries_de.properties b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries_de.properties index 73cd5bf..2bdcbc6 100644 --- a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries_de.properties +++ b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/configure-entries_de.properties @@ -43,6 +43,7 @@ Planned\ polling=Geplante SCM Abfragen Calendar\ Options=Kalenderoptionen Default\ View=Standardansicht +Colors=Farben Month=Monat Week=Woche Day=Tag @@ -80,6 +81,9 @@ Time\ slot\ end=Zeitachsenende Default=Default +Colors.Default=Default (Rot-Orange-Gr�n) +Colors.Legacy=Alt (Rot-Orange-Blau) + Month.TitleFormat=MMMM YYYY Month.ColumnHeaderFormat=ddd Month.TimeFormat=HH:mm diff --git a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/main.jelly b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/main.jelly index aa7dc91..9cde093 100644 --- a/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/main.jelly +++ b/src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/main.jelly @@ -40,7 +40,24 @@ THE SOFTWARE.