{
+
+ public ApiScheduleWrapper(final AppSchedule schedule) {
+ super(schedule);
+ }
+
+ public final String getName() {
+ return getOriginalObject().getName();
+ }
+}
diff --git a/src/main/java/io/linuxserver/fleet/v2/web/WebRouteController.java b/src/main/java/io/linuxserver/fleet/v2/web/WebRouteController.java
index 7b88522..ceafd20 100644
--- a/src/main/java/io/linuxserver/fleet/v2/web/WebRouteController.java
+++ b/src/main/java/io/linuxserver/fleet/v2/web/WebRouteController.java
@@ -68,6 +68,10 @@ public class WebRouteController {
put(apiController::updateRepository, roles(FleetRole.AdminOnly));
post(apiController::addNewRepository, roles(FleetRole.Anyone));
});
+
+ path(Locations.Internal.Schedule, () -> {
+ put(apiController::runSchedule, roles(FleetRole.Anyone));
+ });
});
});
}
diff --git a/src/main/java/io/linuxserver/fleet/v2/web/routes/InternalApiController.java b/src/main/java/io/linuxserver/fleet/v2/web/routes/InternalApiController.java
index c3d8d8c..ba7a9fb 100644
--- a/src/main/java/io/linuxserver/fleet/v2/web/routes/InternalApiController.java
+++ b/src/main/java/io/linuxserver/fleet/v2/web/routes/InternalApiController.java
@@ -19,9 +19,12 @@ package io.linuxserver.fleet.v2.web.routes;
import io.javalin.http.Context;
import io.linuxserver.fleet.core.FleetAppController;
+import io.linuxserver.fleet.v2.key.ScheduleKey;
import io.linuxserver.fleet.v2.service.AbstractAppService;
+import io.linuxserver.fleet.v2.thread.schedule.AppSchedule;
import io.linuxserver.fleet.v2.types.Repository;
import io.linuxserver.fleet.v2.types.api.ApiRepositoryWrapper;
+import io.linuxserver.fleet.v2.types.api.ApiScheduleWrapper;
import io.linuxserver.fleet.v2.types.internal.RepositoryOutlineRequest;
import io.linuxserver.fleet.v2.web.ApiException;
import io.linuxserver.fleet.v2.web.request.NewRepositoryRequest;
@@ -52,4 +55,18 @@ public class InternalApiController extends AbstractAppService {
throw new ApiException(e.getMessage(), e);
}
}
+
+ public void runSchedule(final Context ctx) {
+
+ try {
+
+ final Integer scheduleKey = ctx.formParam("scheduleKey", Integer.class).get();
+ final AppSchedule schedule = getController().getScheduleService().forceRun(new ScheduleKey(scheduleKey));
+
+ ctx.json(new ApiScheduleWrapper(schedule));
+
+ } catch (IllegalArgumentException e) {
+ throw new ApiException(e.getMessage(), e);
+ }
+ }
}
diff --git a/src/main/resources/static/assets/js/admin.js b/src/main/resources/static/assets/js/admin.js
index f8ad098..57e19cc 100644
--- a/src/main/resources/static/assets/js/admin.js
+++ b/src/main/resources/static/assets/js/admin.js
@@ -17,6 +17,34 @@
var adminManager = (function($) {
+ var toggleButtonLoadingState = function(button) {
+ button.prop('disabled', !button.prop('disabled')).toggleClass('is-loading');
+ };
+
+ var runSchedule = function(trigger) {
+
+ var scheduleKey = trigger.data('schedule-key');
+
+ var request = {
+
+ url: '/internalApi/schedule',
+ method: 'put',
+ data: {
+ 'scheduleKey': scheduleKey
+ }
+ };
+
+ toggleButtonLoadingState(trigger);
+ ajaxManager.call(request, function() {
+
+ notificationManager.makeNotification('Schedule run submitted successfully. The "Last Run" value will be updated once the task has completed.', 'success');
+ toggleButtonLoadingState(trigger);
+
+ }, function() {
+ toggleButtonLoadingState(trigger);
+ });
+ };
+
var addRepository = function(repositoryName) {
var trimmedName = $.trim(repositoryName);
@@ -37,7 +65,7 @@ var adminManager = (function($) {
ajaxManager.call(request, function() { window.location.reload(); }, function() {
- $('#SubmitNewRepository').prop('disabled', false).removeClass('is-loading');
+ toggleButtonLoadingState($('#SubmitNewRepository'));
$('#NewRepositoryName').val('');
});
}
@@ -50,9 +78,13 @@ var adminManager = (function($) {
var $button = $(this);
var repositoryName = $('#NewRepositoryName').val();
- $button.prop('disabled', true).addClass('is-loading');
+ toggleButtonLoadingState($button);
addRepository(repositoryName);
- })
+ });
+
+ $('.force-schedule-run').on('click', function() {
+ runSchedule($(this));
+ });
};
return {
diff --git a/src/main/resources/views/pages/admin/schedules.ftl b/src/main/resources/views/pages/admin/schedules.ftl
index cbdfc2c..fae5fd1 100644
--- a/src/main/resources/views/pages/admin/schedules.ftl
+++ b/src/main/resources/views/pages/admin/schedules.ftl
@@ -39,7 +39,7 @@
| Name |
Last Run |
- Next Run |
+ Next Run (Est.) |
Interval |
|
@@ -53,7 +53,7 @@
${schedule.interval.timeDuration} ${schedule.interval.timeUnitAsTimeUnit?lower_case} |
<@button.buttons isGrouped=true isRightAligned=true>
- <@button.button extraClasses="force-schedule-run" colour="normal-colour" size="small" title="Run this schedule now">
+ <@button.button extraClasses="force-schedule-run" colour="normal-colour" size="small" title="Run this schedule now" extraAttributes='data-schedule-key="${schedule.key}"'>
@button.button>
@button.buttons>
|