Skip to content

Commit

Permalink
Merge pull request #1588 from moonshine-software/remove-class-attr
Browse files Browse the repository at this point in the history
feat: remove class with pattern method
  • Loading branch information
lee-to authored Mar 8, 2025
2 parents 1acbab6 + 8ac7ae4 commit 11e2b17
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 14 deletions.
2 changes: 2 additions & 0 deletions src/Contracts/src/UI/HasComponentAttributesContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public function iterableAttributes(int $level = 0): static;

public function mergeAttribute(string $name, string $value, string $separator = ' '): static;

public function removeClass(string $pattern): static;

public function class(string|array $classes): static;

public function style(string|array $styles): static;
Expand Down
13 changes: 13 additions & 0 deletions src/Support/src/Traits/WithComponentAttributes.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,19 @@ public function mergeAttribute(string $name, string $value, string $separator =
return $this;
}

public function removeClass(string $pattern): static
{
$before = $this->attributes->get('class', '');

$this->getAttributes()->remove('class');

$this->attributes = $this->attributes->class(
trim(preg_replace("/(?<=\s|^)$pattern(?=\s|$)/", '', $before))
);

return $this;
}

public function class(string|array $classes): static
{
$this->attributes = $this->attributes->class($classes);
Expand Down
33 changes: 19 additions & 14 deletions src/UI/src/Components/ActionButton.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class ActionButton extends MoonShineComponent implements
public function __construct(
Closure|string $label,
protected Closure|string $url = '#',
protected ?DataWrapperContract $data = null
protected ?DataWrapperContract $data = null,
) {
parent::__construct();

Expand Down Expand Up @@ -199,7 +199,7 @@ public function dispatchEvent(array|string $events, array $exclude = [], bool $w
`" . AlpineJs::prepareEvents($events) . "`,
`$excludes`
)",
'prevent'
'prevent',
);
}

Expand All @@ -222,7 +222,7 @@ public function method(
array $events = [],
?AsyncCallback $callback = null,
?PageContract $page = null,
?ResourceContract $resource = null
?ResourceContract $resource = null,
): static {
$this->asyncMethod = $method;

Expand All @@ -240,7 +240,7 @@ public function method(
return $this->async(
selector: $selector,
events: $events,
callback: $callback
callback: $callback,
);
}

Expand Down Expand Up @@ -270,7 +270,7 @@ public function async(
HttpMethod $method = HttpMethod::GET,
null|string|array $selector = null,
array $events = [],
?AsyncCallback $callback = null
?AsyncCallback $callback = null,
): static {
$this->isAsync = true;
$this->asyncHttpMethod = $method;
Expand All @@ -295,14 +295,14 @@ public function async(
public function withSelectorsParams(array $selectors): static
{
return $this->customAttributes(
AlpineJs::asyncSelectorsParamsAttributes($selectors)
AlpineJs::asyncSelectorsParamsAttributes($selectors),
);
}

public function withQueryParams(): static
{
return $this->customAttributes(
AlpineJs::asyncWithQueryParamsAttributes()
AlpineJs::asyncWithQueryParamsAttributes(),
);
}

Expand Down Expand Up @@ -369,7 +369,7 @@ public function purgeAsync(): void
array_keys(AlpineJs::asyncUrlDataAttributes(
events: ['events'],
selector: 'selector',
))
)),
);

if ($this->getAttribute('x-on:click.prevent') === 'request') {
Expand All @@ -392,7 +392,7 @@ public function primary(Closure|bool|null $condition = null): static
return $this;
}

return $this->class('btn-primary');
return $this->removeClasses()->class('btn-primary');
}

public function secondary(Closure|bool|null $condition = null): static
Expand All @@ -401,7 +401,7 @@ public function secondary(Closure|bool|null $condition = null): static
return $this;
}

return $this->class('btn-secondary');
return $this->removeClasses()->class('btn-secondary');
}

public function success(Closure|bool|null $condition = null): static
Expand All @@ -410,7 +410,7 @@ public function success(Closure|bool|null $condition = null): static
return $this;
}

return $this->class('btn-success');
return $this->removeClasses()->class('btn-success');
}

public function warning(Closure|bool|null $condition = null): static
Expand All @@ -419,7 +419,7 @@ public function warning(Closure|bool|null $condition = null): static
return $this;
}

return $this->class('btn-warning');
return $this->removeClasses()->class('btn-warning');
}

public function info(Closure|bool|null $condition = null): static
Expand All @@ -428,7 +428,7 @@ public function info(Closure|bool|null $condition = null): static
return $this;
}

return $this->class('btn-info');
return $this->removeClasses()->class('btn-info');
}

public function error(Closure|bool|null $condition = null): static
Expand All @@ -437,7 +437,12 @@ public function error(Closure|bool|null $condition = null): static
return $this;
}

return $this->class('btn-error');
return $this->removeClasses()->class('btn-error');
}

private function removeClasses(): static
{
return $this->removeClass('btn-(primary|secondary|info|success|warning|error)');
}

protected function isSeeParams(): array
Expand Down
44 changes: 44 additions & 0 deletions tests/Unit/Fields/TextFieldTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,47 @@
->toContain('input', 'type="text"')
;
});

it('add/remove classes', function () {
$field = Text::make('Field name');
$field->class('btn-success');

expect($field->getAttributes()->get('class'))
->toContain('btn-success')
;

$field->class('btn-primary');

expect($field->getAttributes()->get('class'))
->toContain('btn-success', 'btn-primary')
;

$field->removeClass('btn-primary');

expect($field->getAttributes()->get('class'))
->toContain('btn-success')
->not->toContain('btn-primary')
;

$field->class('btn-primary');
$field->removeClass('btn-(success|primary)');

expect($field->getAttributes()->get('class'))
->toBe('')
;

$field->class('btn-primary-lg');
$field->removeClass('btn-primary');

expect($field->getAttributes()->get('class'))
->toBe('btn-primary-lg')
;

$field->class(['test', 'form-control', 'btn-primary', 'btn-primaries', 'primary']);
$field->removeClass('primary|test');

expect(str($field->getAttributes()->get('class'))->explode(' '))
->toContainEqual('form-control', 'btn-primary','btn-primaries', 'btn-primary-lg')
->not->toContainEqual('primary')
;
});

0 comments on commit 11e2b17

Please sign in to comment.