Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[7.x] Add Publish State permission #553

Merged
18 changes: 13 additions & 5 deletions resources/js/components/Publish/PublishForm.vue
edalzell marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@
v-if="revisionsEnabled && !isCreating"
class="rtl:mr-4 ltr:ml-4 btn-primary flex items-center"
:disabled="!canPublish"
@click="confirmingPublish = true">
<span>{{ __('Publish') }}…</span>
</button>
@click="confirmingPublish = true"
v-text="this.publishButtonText"
/>
</div>

<slot name="action-buttons-right" />
Expand Down Expand Up @@ -158,7 +158,7 @@
class="rtl:mr-4 ltr:ml-4 btn-primary flex items-center"
:disabled="!canPublish"
@click="confirmingPublish = true">
<span v-text="__('Publish')" />
<span v-text="this.publishButtonText" />
<svg-icon name="micro/chevron-down-xs" class="rtl:mr-2 ltr:ml-2 w-2" />
</button>
</template>
Expand All @@ -181,7 +181,7 @@
class="rtl:mr-2 ltr:ml-2 btn btn-lg justify-center btn-primary flex items-center w-1/2"
:disabled="!canPublish"
@click="confirmingPublish = true">
<span v-text="__('Publish')" />
<span v-text="this.publishButtonText" />
<svg-icon name="micro/chevron-down-xs" class="rtl:mr-2 ltr:ml-2 w-2" />
</button>
</div>
Expand Down Expand Up @@ -328,6 +328,14 @@ export default {
return this.$dirty.has(this.publishContainer);
},

publishButtonText() {
if (this.canManagePublishState) {
return `${__('Publish')}…`
}

return `${__('Create Revision')}…`
},

saveText() {
switch(true) {
case this.revisionsEnabled:
Expand Down
4 changes: 2 additions & 2 deletions src/Http/Controllers/CP/ResourceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public function create(CreateRequest $request, Resource $resource)
])->all(),
'meta' => $fields->meta(),
'resourceHasRoutes' => $resource->hasRouting(),
'canManagePublishState' => User::current()->can('edit', $resource),
'canManagePublishState' => User::current()->can('publish', $resource),
];

if ($request->wantsJson()) {
Expand Down Expand Up @@ -170,7 +170,7 @@ public function edit(EditRequest $request, Resource $resource, $model)
'title' => $model->{$resource->titleField()},
'edit_url' => $request->url(),
],
'canManagePublishState' => User::current()->can('edit', $resource),
'canManagePublishState' => User::current()->can('publish', $resource),
'itemActions' => Action::for($model, ['resource' => $resource->handle(), 'view' => 'form']),
'revisionsEnabled' => $resource->revisionsEnabled(),
'hasWorkingCopy' => $model->hasWorkingCopy(),
Expand Down
12 changes: 10 additions & 2 deletions src/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Illuminate\Support\Traits\Conditionable;
use Spatie\ErrorSolutions\Contracts\SolutionProviderRepository;
use Statamic\API\Middleware\Cache;
use Statamic\Auth\Permission as AuthPermission;
use Statamic\Facades\Blueprint;
use Statamic\Facades\CP\Nav;
use Statamic\Facades\GraphQL;
Expand Down Expand Up @@ -66,6 +67,7 @@ class ServiceProvider extends AddonServiceProvider
protected $updateScripts = [
UpdateScripts\ChangePermissionNames::class,
UpdateScripts\MigrateBlueprints::class,
UpdateScripts\AddManagePublishStatesPermission::class,
];

protected $vite = [
Expand Down Expand Up @@ -145,13 +147,18 @@ protected function registerPermissions(): self
->children([
Permission::make("edit {$resource->handle()}")
->label($this->permissionLabel('edit', $resource))
->children([
->children(array_filter([
Permission::make("create {$resource->handle()}")
->label($this->permissionLabel('create', $resource)),

$resource->hasPublishStates()
? Permission::make("publish {$resource->handle()}")
->label($this->permissionLabel('publish', $resource))
: null,

Permission::make("delete {$resource->handle()}")
->label($this->permissionLabel('delete', $resource)),
]),
]))
]);
});
}
Expand Down Expand Up @@ -285,6 +292,7 @@ protected function permissionLabel($permission, $resource): string
'view' => "View {$resource->name()}",
'edit' => "Edit {$resource->name()}",
'create' => "Create {$resource->name()}",
'publish' => "Manage {$resource->name()} Publish State",
'delete' => "Delete {$resource->name()}"
};
}
Expand Down
28 changes: 28 additions & 0 deletions src/UpdateScripts/AddManagePublishStatesPermission.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace StatamicRadPack\Runway\UpdateScripts;

use Statamic\Facades\Role;
use Statamic\UpdateScripts\UpdateScript;
use StatamicRadPack\Runway\Resource;
use StatamicRadPack\Runway\Runway;

class AddManagePublishStatesPermission extends UpdateScript
{
public function shouldUpdate($newVersion, $oldVersion)
{
return $this->isUpdatingTo('7.6.0');
}

public function update()
{
Role::all()->each(function ($role) {
Runway::allResources()
->filter->hasPublishStates()
->filter(fn (Resource $resource) => $role->hasPermission("create {$resource->handle()}"))
->each(fn (Resource $resource) => $role->addPermission("publish {$resource->handle()}"));

$role->save();
});
}
}
47 changes: 47 additions & 0 deletions tests/UpdateScripts/AddManagePublishStatesPermissionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace StatamicRadPack\Runway\Tests\UpdateScripts;

use Illuminate\Support\Facades\File;
use PHPUnit\Framework\Attributes\Test;
use Statamic\Facades\Role;
use Statamic\Facades\YAML;
use StatamicRadPack\Runway\Tests\TestCase;
use StatamicRadPack\Runway\UpdateScripts\AddManagePublishStatesPermission;
use StatamicRadPack\Runway\UpdateScripts\ChangePermissionNames;

class AddManagePublishStatesPermissionTest extends TestCase
{
use RunsUpdateScripts;

#[Test]
public function publish_permission_is_added_to_role_with_create_permission()
{
Role::make('test')
->addPermission('view post')
->addPermission('create post')
->save();

$this->runUpdateScript(AddManagePublishStatesPermission::class);

$this->assertEquals([
'view post',
'create post',
'publish post',
], Role::find('test')->permissions()->all());
}

#[Test]
public function publish_permission_is_not_added_to_role_without_create_permission()
{
Role::make('test')
->addPermission('view post')
->save();

$this->runUpdateScript(AddManagePublishStatesPermission::class);

$this->assertEquals([
'view post',
], Role::find('test')->permissions()->all());
}
}
Loading