From 527c30a6067e9e6ba924e204119b4798bd044357 Mon Sep 17 00:00:00 2001 From: gkakosouris <> Date: Fri, 16 Sep 2022 18:12:57 +0300 Subject: [PATCH 1/2] introduce reorder action --- .../js/controllers/reorder_controller.js | 45 ++++++++++ .../views/actions/reorderHandle.blade.php | 22 +++++ src/Screen/Actions/ReorderHandle.php | 83 +++++++++++++++++++ 3 files changed, 150 insertions(+) create mode 100644 resources/js/controllers/reorder_controller.js create mode 100644 resources/views/actions/reorderHandle.blade.php create mode 100644 src/Screen/Actions/ReorderHandle.php diff --git a/resources/js/controllers/reorder_controller.js b/resources/js/controllers/reorder_controller.js new file mode 100644 index 0000000000..77691b383e --- /dev/null +++ b/resources/js/controllers/reorder_controller.js @@ -0,0 +1,45 @@ +import ApplicationController from "./application_controller" +import Sortable from 'sortablejs'; + +export default class extends ApplicationController { + + static values = { + handleSelector: String, + sortableSelector: String + } + + connect() { + this.initSortable(); + } + + initSortable() { + new Sortable(this.element.closest(this.sortableSelectorValue), { + animation: 150, + handle: this.handleSelectorValue, + dragClass: "reorder-drag", + onEnd: (event) => { + this.reorderElement(event.item, event.newIndex - event.oldIndex); + }, + }); + } + + reorderElement(item, offset) { + const handle = item.querySelector(this.handleSelectorValue); + + if (handle === null) { + return; + } + + axios + .post(handle.dataset.action, { + key: handle.dataset.key, + offset: offset, + }) + .then( + () => this.alert(handle.dataset.successMessage, '', 'success') + ) + .catch( + () => this.alert(handle.dataset.failureMessage, '', 'error') + ); + } +} diff --git a/resources/views/actions/reorderHandle.blade.php b/resources/views/actions/reorderHandle.blade.php new file mode 100644 index 0000000000..ade81066f0 --- /dev/null +++ b/resources/views/actions/reorderHandle.blade.php @@ -0,0 +1,22 @@ + + + + +@pushonce('stylesheets') + +@endpushonce diff --git a/src/Screen/Actions/ReorderHandle.php b/src/Screen/Actions/ReorderHandle.php new file mode 100644 index 0000000000..47e74b238a --- /dev/null +++ b/src/Screen/Actions/ReorderHandle.php @@ -0,0 +1,83 @@ + null, + 'method' => null, + 'icon' => 'menu', + 'container' => 'tbody', + 'successMessage' => null, + 'failureMessage' => null, + 'parameters' => [], + ]; + + /** + * Required Attributes. + * + * @var array + */ + protected $required = [ + 'key', + ]; + + public function __construct() + { + $this->addBeforeRender(function () { + $this->set('action', $this->getAction()); + $this->set('class', $this->getClass()); + }); + } + + public function method(string $name, array $parameters = []): static + { + return $this + ->set('method', $name) + ->set('parameters', $parameters); + } + + protected function getAction() + { + $action = $this->get('action'); + + if ($action === null) { + $url = request()->header('ORCHID-ASYNC-REFERER', url()->current()); + $query = http_build_query($this->get('parameters', [])); + $action = rtrim("{$url}/{$this->get('method')}?{$query}", '/?'); + } + + return $action; + } + + protected function getClass(): string + { + $classes = explode(' ', $this->get('class')); + $classes[] = 'reorder-handle'; + + return implode(' ', array_filter($classes)); + } +} From 443e843a37a4dea2d0af57f62212d024f7ac6f6b Mon Sep 17 00:00:00 2001 From: gkakosouris <> Date: Sat, 24 Sep 2022 11:00:27 +0300 Subject: [PATCH 2/2] convert reorder action to column --- .../views/actions/reorderHandle.blade.php | 22 ----- .../partials/layouts/reorderHandle.blade.php | 27 ++++++ src/Screen/Actions/ReorderHandle.php | 83 ------------------- src/Screen/ReorderHandle.php | 71 ++++++++++++++++ 4 files changed, 98 insertions(+), 105 deletions(-) delete mode 100644 resources/views/actions/reorderHandle.blade.php create mode 100644 resources/views/partials/layouts/reorderHandle.blade.php delete mode 100644 src/Screen/Actions/ReorderHandle.php create mode 100644 src/Screen/ReorderHandle.php diff --git a/resources/views/actions/reorderHandle.blade.php b/resources/views/actions/reorderHandle.blade.php deleted file mode 100644 index ade81066f0..0000000000 --- a/resources/views/actions/reorderHandle.blade.php +++ /dev/null @@ -1,22 +0,0 @@ - - - - -@pushonce('stylesheets') - -@endpushonce diff --git a/resources/views/partials/layouts/reorderHandle.blade.php b/resources/views/partials/layouts/reorderHandle.blade.php new file mode 100644 index 0000000000..9aad5e21f3 --- /dev/null +++ b/resources/views/partials/layouts/reorderHandle.blade.php @@ -0,0 +1,27 @@ + +
+ +
+ + +@pushonce('stylesheets') + +@endpushonce diff --git a/src/Screen/Actions/ReorderHandle.php b/src/Screen/Actions/ReorderHandle.php deleted file mode 100644 index 47e74b238a..0000000000 --- a/src/Screen/Actions/ReorderHandle.php +++ /dev/null @@ -1,83 +0,0 @@ - null, - 'method' => null, - 'icon' => 'menu', - 'container' => 'tbody', - 'successMessage' => null, - 'failureMessage' => null, - 'parameters' => [], - ]; - - /** - * Required Attributes. - * - * @var array - */ - protected $required = [ - 'key', - ]; - - public function __construct() - { - $this->addBeforeRender(function () { - $this->set('action', $this->getAction()); - $this->set('class', $this->getClass()); - }); - } - - public function method(string $name, array $parameters = []): static - { - return $this - ->set('method', $name) - ->set('parameters', $parameters); - } - - protected function getAction() - { - $action = $this->get('action'); - - if ($action === null) { - $url = request()->header('ORCHID-ASYNC-REFERER', url()->current()); - $query = http_build_query($this->get('parameters', [])); - $action = rtrim("{$url}/{$this->get('method')}?{$query}", '/?'); - } - - return $action; - } - - protected function getClass(): string - { - $classes = explode(' ', $this->get('class')); - $classes[] = 'reorder-handle'; - - return implode(' ', array_filter($classes)); - } -} diff --git a/src/Screen/ReorderHandle.php b/src/Screen/ReorderHandle.php new file mode 100644 index 0000000000..4847e3b959 --- /dev/null +++ b/src/Screen/ReorderHandle.php @@ -0,0 +1,71 @@ +render ? $this->handler($repository, $loop) : $repository->getContent($this->name); + + return view('platform::partials.layouts.reorderHandle', [ + 'action' => $this->action, + 'align' => $this->align, + 'colspan' => $this->colspan, + 'failure' => $this->failureMessage ?? __('Item move failed'), + 'icon' => $this->icon, + 'slug' => $this->sluggable(), + 'success' => $this->successMessage ?? __('Item successfully moved'), + 'value' => $value, + 'width' => $this->width, + ]); + } + + public function action(string $url): static + { + if (! filter_var($url, FILTER_VALIDATE_URL)) { + throw new InvalidArgumentException('Argument #1 ($url) must be a URL'); + } + + $this->action = $url; + + return $this; + } + + public function icon(string $name): static + { + $this->icon = $name; + + return $this; + } + + public function messages(string $success, string $failure): static + { + $this->failureMessage = $failure; + $this->successMessage = $success; + + return $this; + } + + public function method(string $name, array $parameters = []): static + { + $url = request()->header('ORCHID-ASYNC-REFERER', url()->current()); + $query = http_build_query($parameters); + + $this->action = rtrim("{$url}/{$name}?{$query}", '/?'); + + return $this; + } +}