Skip to content

Commit

Permalink
Merge pull request #1448 from moonshine-software/multi-selectors-n-fr…
Browse files Browse the repository at this point in the history
…agments

feat: Multi selectors n fragments
  • Loading branch information
lee-to authored Jan 9, 2025
2 parents d3490a3 + fe5a600 commit c810bad
Show file tree
Hide file tree
Showing 13 changed files with 58 additions and 28 deletions.
6 changes: 3 additions & 3 deletions src/Contracts/src/Core/CrudResourceContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,15 @@ public function delete(mixed $item, ?FieldsContract $fields = null): bool;
public function save(mixed $item, ?FieldsContract $fields = null): mixed;


public function getIndexPageUrl(array $params = [], ?string $fragment = null): string;
public function getIndexPageUrl(array $params = [], null|string|array $fragment = null): string;

/**
* @param DataWrapperContract<TData>|int|string|null $key
*/
public function getFormPageUrl(
DataWrapperContract|int|string|null $key = null,
array $params = [],
?string $fragment = null
null|string|array $fragment = null
): string;

/**
Expand All @@ -137,7 +137,7 @@ public function getFormPageUrl(
public function getDetailPageUrl(
DataWrapperContract|int|string $key,
array $params = [],
?string $fragment = null
null|string|array $fragment = null
): string;

public function setQueryParams(iterable $params): static;
Expand Down
4 changes: 2 additions & 2 deletions src/Contracts/src/UI/ActionButtonContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public function method(
string $method,
array|Closure $params = [],
?string $message = null,
?string $selector = null,
null|string|array $selector = null,
array $events = [],
?AsyncCallback $callback = null,
?PageContract $page = null,
Expand All @@ -83,7 +83,7 @@ public function dispatchEvent(array|string $events): static;

public function async(
HttpMethod $method = HttpMethod::GET,
?string $selector = null,
null|string|array $selector = null,
array $events = [],
?AsyncCallback $callback = null
): static;
Expand Down
4 changes: 2 additions & 2 deletions src/Contracts/src/UI/FieldContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public function onChangeMethod(
string $method,
array|Closure $params = [],
?string $message = null,
?string $selector = null,
null|string|array $selector = null,
array $events = [],
?AsyncCallback $callback = null,
?PageContract $page = null,
Expand All @@ -79,7 +79,7 @@ public function onChangeUrl(
Closure $url,
HttpMethod $method = HttpMethod::GET,
array $events = [],
?string $selector = null,
null|string|array $selector = null,
?AsyncCallback $callback = null,
): static;

Expand Down
2 changes: 1 addition & 1 deletion src/Laravel/src/Http/Responses/MoonShineJsonResponse.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function events(array $events): self
return $this->mergeJsonData(['events' => AlpineJs::prepareEvents($events)]);
}

public function html(string $value): self
public function html(string|array $value): self
{
return $this->mergeJsonData(['html' => $value]);
}
Expand Down
8 changes: 8 additions & 0 deletions src/Laravel/src/MoonShineEndpoints.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,14 @@ public function toPage(
$redirect = $extra['redirect'] ?? false;
$fragment = $extra['fragment'] ?? null;

if (\is_array($fragment)) {
$fragment = implode(',', array_map(
static fn ($key, $value): string => "$key:$value",
array_keys($fragment),
$fragment
));
}

if ($fragment !== null && $fragment !== '') {
$params += ['_fragment-load' => $fragment];
}
Expand Down
24 changes: 21 additions & 3 deletions src/Laravel/src/Pages/Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use MoonShine\Core\Pages\Page as CorePage;
use MoonShine\Laravel\Contracts\WithResponseModifierContract;
use MoonShine\Laravel\DependencyInjection\MoonShine;
use MoonShine\Laravel\Http\Responses\MoonShineJsonResponse;
use Symfony\Component\HttpFoundation\Response;

/**
Expand All @@ -35,9 +36,7 @@ protected function prepareBeforeRender(): void

protected function prepareRender(Renderable|Closure|string $view): Renderable|Closure|string
{
/**
* @var View $view
*/
/** @var View $view */
return $view->fragmentIf(
moonshineRequest()->isFragmentLoad(),
moonshineRequest()->getFragmentLoad(),
Expand All @@ -56,6 +55,25 @@ public function getModifiedResponse(): ?Response

protected function modifyResponse(): ?Response
{
$fragments = moonshineRequest()->getFragmentLoad();

if ($fragments === null) {
return null;
}

if (str_contains($fragments, ',')) {
$fragments = explode(',', $fragments);
$data = [];
foreach ($fragments as $fragment) {
[$selector, $name] = explode(':', $fragment);
/** @var View $view */
$view = $this->renderView();
$data[$selector] = $view->fragment($name);
}

return MoonShineJsonResponse::make()->html($data);
}

return null;
}
}
10 changes: 5 additions & 5 deletions src/Laravel/src/Traits/Resource/ResourceCrudRouter.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,22 @@ public function getRoute(
* @param class-string<PageContract>|PageContract $page
* @param array<string, mixed> $params
*/
public function getPageUrl(string|PageContract $page, array $params = [], ?string $fragment = null): string
public function getPageUrl(string|PageContract $page, array $params = [], null|string|array $fragment = null): string
{
return $this->getRouter()->getEndpoints()->toPage($page, $this, params: $params, extra: [
'fragment' => $fragment,
]);
}

public function getIndexPageUrl(array $params = [], ?string $fragment = null): string
public function getIndexPageUrl(array $params = [], null|string|array $fragment = null): string
{
return $this->getPageUrl($this->getIndexPage(), params: $params, fragment: $fragment);
}

public function getFormPageUrl(
DataWrapperContract|int|string|null $key = null,
array $params = [],
?string $fragment = null
null|string|array $fragment = null
): string {
return $this->getPageUrl(
$this->getFormPage(),
Expand All @@ -67,7 +67,7 @@ public function getFormPageUrl(
public function getDetailPageUrl(
DataWrapperContract|int|string $key,
array $params = [],
?string $fragment = null
null|string|array $fragment = null
): string {
return $this->getPageUrl(
$this->getDetailPage(),
Expand All @@ -83,7 +83,7 @@ public function getDetailPageUrl(
* @param DataWrapperContract<T>|int|string|null $key
*/
public function getFragmentLoadUrl(
string $fragment,
string|array $fragment,
PageContract $page,
DataWrapperContract|int|string|null $key,
array $params = []
Expand Down
2 changes: 1 addition & 1 deletion src/Laravel/src/helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ function toPage(
string|ResourceContract|null $resource = null,
array $params = [],
bool $redirect = false,
?string $fragment = null
null|string|array $fragment = null
): RedirectResponse|string {
return moonshineRouter()->getEndpoints()->toPage(
page: $page,
Expand Down
4 changes: 2 additions & 2 deletions src/Support/src/AlpineJs.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,12 @@ public static function eventBladeWhen(
public static function asyncUrlDataAttributes(
HttpMethod $method = HttpMethod::GET,
string|array $events = [],
?string $selector = null,
null|string|array $selector = null,
?AsyncCallback $callback = null
): array {
return array_filter([
'data-async-events' => self::prepareEvents($events),
'data-async-selector' => $selector,
'data-async-selector' => \is_array($selector) ? implode(',', $selector) : $selector,
'data-async-response-handler' => $callback?->getResponseHandler(),
'data-async-before-request' => $callback?->getBeforeRequest(),
'data-async-method' => $method->value,
Expand Down
2 changes: 1 addition & 1 deletion src/UI/dist/assets/app.js

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions src/UI/resources/js/Request/Core.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,13 @@ export default function request(
}

if (componentRequestData.selector) {
const elements = document.querySelectorAll(componentRequestData.selector)
elements.forEach(element => {
element.innerHTML = data.html ? data.html : data
const selectors = componentRequestData.selector.split(',')

selectors.forEach(function (selector) {
let elements = document.querySelectorAll(selector)
elements.forEach(element => {
element.innerHTML = data.html[selector] ?? (data.html ? data.html : data)
})
})
}

Expand Down
4 changes: 2 additions & 2 deletions src/UI/src/Components/ActionButton.php
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ public function method(
string $method,
array|Closure $params = [],
?string $message = null,
?string $selector = null,
null|string|array $selector = null,
array $events = [],
?AsyncCallback $callback = null,
?PageContract $page = null,
Expand Down Expand Up @@ -253,7 +253,7 @@ public function disableAsync(): static

public function async(
HttpMethod $method = HttpMethod::GET,
?string $selector = null,
null|string|array $selector = null,
array $events = [],
?AsyncCallback $callback = null
): static {
Expand Down
6 changes: 3 additions & 3 deletions src/UI/src/Fields/Field.php
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ public function onChangeMethod(
string $method,
array|Closure $params = [],
?string $message = null,
?string $selector = null,
null|string|array $selector = null,
array $events = [],
?AsyncCallback $callback = null,
?PageContract $page = null,
Expand Down Expand Up @@ -232,7 +232,7 @@ public function onChangeUrl(
Closure $url,
HttpMethod $method = HttpMethod::PUT,
array $events = [],
?string $selector = null,
null|string|array $selector = null,
?AsyncCallback $callback = null,
): static {
$this->onChangeUrl = $url;
Expand All @@ -248,7 +248,7 @@ public function onChangeUrl(
protected function onChangeAttributes(
HttpMethod $method = HttpMethod::GET,
array $events = [],
?string $selector = null,
null|string|array $selector = null,
?AsyncCallback $callback = null
): static {
return $this->customAttributes(
Expand Down

0 comments on commit c810bad

Please sign in to comment.