Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@
"vite": "^6.0"
},
"dependencies": {
"@statamic/cms": "file:./vendor/statamic/cms/resources/dist-package"
"@statamic/cms": "file:./vendor/statamic/cms/packages/cms"
}
}

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion resources/dist/build/manifest.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"resources/js/addon.js": {
"file": "assets/addon-DMIVz1vC.js",
"file": "assets/addon-Ceb_2eol.js",
"name": "addon",
"src": "resources/js/addon.js",
"isEntry": true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
ref="inputEl"
type="text"
:value="value"
@input="$emit('input', $event.target.value)"
@input="$emit('update:value', $event.target.value)"
class="input-text border border-gray-400 dark:border-gray-700 rounded-sm"
:placeholder="__('Type a field handle...')"
/>
Expand Down Expand Up @@ -49,7 +49,7 @@ const props = defineProps({
meta: { type: Object, default: () => ({}) },
});

const emit = defineEmits(['input']);
const emit = defineEmits(['update:value']);

const inputEl = ref(null);
const loading = ref(false);
Expand All @@ -66,7 +66,7 @@ let pollInterval = null;
const getFieldSettingsValue = inject('getFieldSettingsValue', null);

function selectOption(handle) {
emit('input', handle);
emit('update:value', handle);

// Also force-update the native input element so the user sees the change immediately
if (inputEl.value) {
Expand Down
3 changes: 2 additions & 1 deletion src/Fieldtypes/ReverseRelationship.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Cbox\ReverseRelationship\Fieldtypes;

use Illuminate\Support\Collection;
use Statamic\Contracts\Data\Augmentable;
use Statamic\Contracts\Query\Builder;
use Statamic\Facades\Asset;
use Statamic\Facades\AssetContainer;
Expand Down Expand Up @@ -232,7 +233,7 @@ public function getMatchingIds(string $id): array
->orderBy($sortField)
->get()
->filter(function (mixed $item) use ($fieldHandle, $id, $isSingleValue): bool {
/** @var \Statamic\Contracts\Data\Augmentable $item */
/** @var Augmentable $item */
$value = method_exists($item, 'value')
? $item->value($fieldHandle)
: $item->get($fieldHandle); /** @phpstan-ignore method.notFound */
Expand Down
3 changes: 2 additions & 1 deletion src/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Cbox\ReverseRelationship;

use Statamic\Fields\Fieldtype;
use Statamic\Providers\AddonServiceProvider;

class ServiceProvider extends AddonServiceProvider
Expand All @@ -11,7 +12,7 @@ class ServiceProvider extends AddonServiceProvider
'cp' => __DIR__.'/../routes/cp.php',
];

/** @var list<class-string<\Statamic\Fields\Fieldtype>> */
/** @var list<class-string<Fieldtype>> */
protected $fieldtypes = [
Fieldtypes\ReverseRelationship::class,
Fieldtypes\ReverseRelationshipFieldSelect::class,
Expand Down
5 changes: 3 additions & 2 deletions src/Tags/ReverseRelationship.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Cbox\ReverseRelationship\Tags;

use Cbox\ReverseRelationship\Fieldtypes\ReverseRelationship as ReverseRelationshipFieldtype;
use Statamic\Contracts\Query\Builder;
use Statamic\Facades\Asset;
use Statamic\Facades\Entry;
use Statamic\Facades\Term;
Expand Down Expand Up @@ -143,7 +144,7 @@ protected function buildFieldtype(): ?ReverseRelationshipFieldtype
}

/**
* @return \Statamic\Contracts\Query\Builder|null
* @return Builder|null
*/
protected function getBaseQuery()
{
Expand All @@ -155,7 +156,7 @@ protected function getBaseQuery()
return null;
}

/** @var \Statamic\Contracts\Query\Builder */
/** @var Builder */
return Entry::query()
->where('collection', $collection)
->whereStatus('published');
Expand Down
7 changes: 4 additions & 3 deletions tests/Feature/ReverseRelationshipControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

use Illuminate\Support\Facades\Storage;
use Statamic\Facades\Asset;
use Statamic\Facades\Entry;
use Statamic\Facades\User;

// Clean up any users saved to the fixture store after each test
afterEach(function () {
try {
User::query()->get()->each(fn ($user) => $user->delete());
} catch (\Throwable) {
} catch (Throwable) {
// Ignore cleanup errors — user store may be empty
}
});
Expand Down Expand Up @@ -443,7 +444,7 @@ function cpConfig(array $config): string
expect($response->json('errors'))->toBeEmpty();

// Verify the entry was actually detached
$entry = \Statamic\Facades\Entry::find('referring-multi-id');
$entry = Entry::find('referring-multi-id');
$related = $entry->get('related');
expect($related)->not->toContain('origin-id');
});
Expand All @@ -468,7 +469,7 @@ function cpConfig(array $config): string
expect($response->json('errors'))->toBeEmpty();

// Verify the entry was actually attached
$entry = \Statamic\Facades\Entry::find('referring-multi-id');
$entry = Entry::find('referring-multi-id');
$related = $entry->get('related');
expect($related)->toContain('origin-id');
});
Expand Down
26 changes: 13 additions & 13 deletions tests/Unit/ReverseRelationshipTagTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@

it('renders matching entries in a basic loop', function () {
$template = '{{ reverse_relationship collection="pages" field="related" id="origin-id" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect($result)->toContain('Referring Multi');
});

it('renders matching entries for single-value field', function () {
$template = '{{ reverse_relationship collection="pages" field="related_single" id="origin-id" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect($result)->toContain('Referring Single');
expect($result)->not->toContain('Referring Multi');
});

it('renders empty when no matches found', function () {
$template = '{{ reverse_relationship collection="pages" field="related" id="nonexistent-id" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect(trim($result))->toBe('');
});
Expand All @@ -35,14 +35,14 @@

it('returns count of matching entries', function () {
$template = '{{ reverse_relationship:count collection="pages" field="related" id="origin-id" }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect(trim($result))->toBe('1');
});

it('returns zero count when no matches', function () {
$template = '{{ reverse_relationship:count collection="pages" field="related" id="nonexistent-id" }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect(trim($result))->toBe('0');
});
Expand All @@ -53,7 +53,7 @@

it('falls back to context ID when id param is not provided', function () {
$template = '{{ reverse_relationship collection="pages" field="related" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template, ['id' => 'origin-id']);
$result = (string) Antlers::parse($template, ['id' => 'origin-id'], true);

expect($result)->toContain('Referring Multi');
});
Expand All @@ -64,28 +64,28 @@

it('returns empty when collection param is missing', function () {
$template = '{{ reverse_relationship field="related" id="origin-id" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect(trim($result))->toBe('');
});

it('returns empty when field param is missing', function () {
$template = '{{ reverse_relationship collection="pages" id="origin-id" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect(trim($result))->toBe('');
});

it('returns empty when no ID available', function () {
$template = '{{ reverse_relationship collection="pages" field="related" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect(trim($result))->toBe('');
});

it('count returns zero when collection param is missing', function () {
$template = '{{ reverse_relationship:count field="related" id="origin-id" }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect(trim($result))->toBe('0');
});
Expand All @@ -96,7 +96,7 @@

it('respects limit parameter', function () {
$template = '{{ reverse_relationship collection="pages" field="related" id="origin-id" limit="1" }}{{ title }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

// Only one match exists, but limit should still work without errors
expect($result)->toContain('Referring Multi');
Expand All @@ -108,14 +108,14 @@

it('supports as parameter for named output', function () {
$template = '{{ reverse_relationship collection="pages" field="related" id="origin-id" as="comments" }}{{ comments }}{{ title }}{{ /comments }}{{ if no_results }}none{{ /if }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect($result)->toContain('Referring Multi');
});

it('supports no_results with as parameter when empty', function () {
$template = '{{ reverse_relationship collection="pages" field="related" id="nonexistent-id" as="comments" }}{{ comments }}{{ title }}{{ /comments }}{{ if no_results }}none{{ /if }}{{ /reverse_relationship }}';
$result = (string) Antlers::parse($template);
$result = (string) Antlers::parse($template, [], true);

expect($result)->toContain('none');
});
Expand Down
Loading