From 7c84171d5b6ffea48ef98962b332fcc4dcfc5120 Mon Sep 17 00:00:00 2001 From: Mojmir Fendek Date: Wed, 26 Aug 2020 11:11:13 +1200 Subject: [PATCH] NEW: Improved task runner UI. (#9540) Co-authored-by: Sacha Judd --- client/styles/task-runner.css | 58 ++++++++++++++ src/Dev/TaskRunner.php | 96 ++++++++++++++++++------ templates/SilverStripe/Dev/TaskRunner.ss | 24 ++++++ 3 files changed, 155 insertions(+), 23 deletions(-) create mode 100644 client/styles/task-runner.css create mode 100644 templates/SilverStripe/Dev/TaskRunner.ss diff --git a/client/styles/task-runner.css b/client/styles/task-runner.css new file mode 100644 index 000000000..33d1e0fa2 --- /dev/null +++ b/client/styles/task-runner.css @@ -0,0 +1,58 @@ +/* This file is manually maintained, it is not generated from SCSS sources */ + +.task { + padding-top: 20px; +} + +.task__panel { + padding: 0 15px 15px 15px; +} + +@media (min-width:992px) { + .task__list { + columns: 2; + column-gap: 100px; + } +} + +.task__item { + padding-bottom: 30px; +} + +@media (min-width:992px) { + .task__item { + display: inline-block; + width: 100%; + } +} + +.task__title { + color: #303b4d; + margin: 0 0 8px; +} + +.task__description { + color: #43536d; + margin-bottom: 12px; +} + +.task__button { + border: 1px solid #ced5e1; + border-radius: 5px; + background-color: #f6f7f8; + color: #43536d; + display: inline-block; + margin-right: 10px; + padding: 6px 10px; + text-decoration: none; + transition: background-color 0.2s; +} + +.task__button:last-child { + margin-right: 0; +} + +.task__button:focus, +.task__button:hover { + background-color: #ced5e1; +} diff --git a/src/Dev/TaskRunner.php b/src/Dev/TaskRunner.php index 094917c2f..bb911d712 100644 --- a/src/Dev/TaskRunner.php +++ b/src/Dev/TaskRunner.php @@ -2,19 +2,26 @@ namespace SilverStripe\Dev; +use ReflectionClass; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\ClassInfo; +use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Convert; use SilverStripe\Core\Injector\Injector; +use SilverStripe\Core\Manifest\ModuleResourceLoader; +use SilverStripe\ORM\ArrayList; use SilverStripe\Security\Permission; use SilverStripe\Security\Security; -use ReflectionClass; +use SilverStripe\View\ArrayData; +use SilverStripe\View\ViewableData; class TaskRunner extends Controller { + use Configurable; + private static $url_handlers = [ '' => 'index', '$TaskName' => 'runTask' @@ -25,6 +32,13 @@ class TaskRunner extends Controller 'runTask', ]; + /** + * @var array + */ + private static $css = [ + 'silverstripe/framework:client/styles/task-runner.css', + ]; + protected function init() { parent::init(); @@ -44,33 +58,42 @@ class TaskRunner extends Controller public function index() { + $baseUrl = Director::absoluteBaseURL(); $tasks = $this->getTasks(); - // Web mode - if (!Director::is_cli()) { - $renderer = new DebugView(); - echo $renderer->renderHeader(); - echo $renderer->renderInfo("SilverStripe Development Tools: Tasks", Director::absoluteBaseURL()); - $base = Director::absoluteBaseURL(); + if (Director::is_cli()) { + // CLI mode + $output = 'SILVERSTRIPE DEVELOPMENT TOOLS: Tasks' . PHP_EOL . '--------------------------' . PHP_EOL . PHP_EOL; - echo "
"; - echo "
    "; foreach ($tasks as $task) { - echo "
  • "; - echo "" . $task['title'] . "
    "; - echo "" . $task['description'] . ""; - echo "

  • \n"; + $output .= sprintf(' * %s: sake dev/tasks/%s%s', $task['title'], $task['segment'], PHP_EOL); } - echo "
"; - echo $renderer->renderFooter(); - // CLI mode - } else { - echo "SILVERSTRIPE DEVELOPMENT TOOLS: Tasks\n--------------------------\n\n"; - foreach ($tasks as $task) { - echo " * $task[title]: sake dev/tasks/" . $task['segment'] . "\n"; - } + return $output; } + + $list = ArrayList::create(); + + foreach ($tasks as $task) { + $list->push(ArrayData::create([ + 'TaskLink' => $baseUrl . 'dev/tasks/' . $task['segment'], + 'Title' => $task['title'], + 'Description' => $task['description'], + ])); + } + + $renderer = DebugView::create(); + $header = $renderer->renderHeader(); + $header = $this->addCssToHeader($header); + + $data = [ + 'Tasks' => $list, + 'Header' => $header, + 'Footer' => $renderer->renderFooter(), + 'Info' => $renderer->renderInfo('SilverStripe Development Tools: Tasks', $baseUrl), + ]; + + return ViewableData::create()->renderWith(static::class, $data); } /** @@ -126,10 +149,12 @@ class TaskRunner extends Controller } $singleton = BuildTask::singleton($class); + $description = $singleton->getDescription(); + $description = trim($description); $desc = (Director::is_cli()) - ? Convert::html2raw($singleton->getDescription()) - : $singleton->getDescription(); + ? Convert::html2raw($description) + : $description; $availableTasks[] = [ 'class' => $class, @@ -157,4 +182,29 @@ class TaskRunner extends Controller return true; } + + /** + * Inject task runner CSS into the heaader + + * @param string $header + * @return string + */ + protected function addCssToHeader($header) + { + $css = (array) $this->config()->get('css'); + + if (!$css) { + return $header; + } + + foreach ($css as $include) { + $path = ModuleResourceLoader::singleton()->resolveURL($include); + + // inject CSS into the heaader + $element = sprintf('', $path); + $header = str_replace('', $element . '', $header); + } + + return $header; + } } diff --git a/templates/SilverStripe/Dev/TaskRunner.ss b/templates/SilverStripe/Dev/TaskRunner.ss new file mode 100644 index 000000000..10020f74d --- /dev/null +++ b/templates/SilverStripe/Dev/TaskRunner.ss @@ -0,0 +1,24 @@ +$Header.RAW +$Info.RAW + +
+
+ <% if $Tasks.Count > 0 %> +
+ <% loop $Tasks %> +
+
+

$Title

+
$Description
+
+
+ Run task +
+
+ <% end_loop %> +
+ <% end_if %> +
+
+ +$Footer.RAW