Skip to content

Commit

Permalink
Merge change material status
Browse files Browse the repository at this point in the history
Change material status branch
  • Loading branch information
PUMCZACZ authored Jun 11, 2024
2 parents 0d81e5f + 1e4dde4 commit 431d4d2
Show file tree
Hide file tree
Showing 11 changed files with 142 additions and 48 deletions.
17 changes: 12 additions & 5 deletions app/Domains/Admin/Controllers/MaterialsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
use App\Domains\Materials\Models\Enums\PresetEnum;
use App\Domains\Materials\Models\Material;
use App\Domains\Materials\Repositories\MaterialsRepository;
use App\Domains\Materials\States\Archived;
use App\Domains\Materials\States\Draft;
use App\Domains\Materials\States\MaterialState;
use App\Domains\Materials\States\Published;
use App\Domains\Reviews\Models\Review;
use App\Domains\Users\Roles\FrontendPermissionsAccessor;
use App\Helpers\ComponentsHelper;
use App\Http\Controllers\Controller;
Expand Down Expand Up @@ -54,15 +58,18 @@ public function destroy(Material $material)
return back();
}

public function publish(Material $material)
public function changeStatus(Material $material, string $status)
{
if (Auth::user()->cannot('publish', $material)) {
if (Auth::user()->cannot('manage', $material)) {
abort(403);
}

if (!$material->isPublished()) {
$material->state->transitionTo(Published::class);
}
match ($status) {
default => null,
'draft' => $material->isDraft() ? null : $material->state->transitionTo(Draft::class),
'published' => $material->isPublished() ? null : $material->state->transitionTo(Published::class),
'archived' => $material->isArchived() ? null : $material->state->transitionTo(Archived::class),
};

return back();
}
Expand Down
12 changes: 12 additions & 0 deletions app/Domains/Materials/Models/Material.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use App\Domains\Files\Models\Attachment;
use App\Domains\Materials\Factories\MaterialFactory;
use App\Domains\Materials\Models\Scopes\MaterialTypeScope;
use App\Domains\Materials\States\Archived;
use App\Domains\Materials\States\Draft;
use App\Domains\Materials\States\MaterialState;
use App\Domains\Materials\States\Published;
use App\Domains\Migration\Models\Post;
Expand Down Expand Up @@ -284,4 +286,14 @@ public function isPublished(): bool
{
return $this->state->getValue() === Published::class;
}

public function isArchived(): bool
{
return $this->state->getValue() === Archived::class;
}

public function isDraft(): bool
{
return $this->state->getValue() === Draft::class;
}
}
9 changes: 9 additions & 0 deletions app/Domains/Materials/Models/Policies/MaterialPolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,13 @@ public function review(User $user, Material $material): bool

return $user->hasPermissionTo(PermissionsEnum::MATERIAL_REVIEW);
}

public function manage(User $user, Material $material): bool
{
if (!$material->hasEditableState()) {
return false;
}

return $user->hasPermissionTo(PermissionsEnum::MATERIAL_MANAGE);
}
}
3 changes: 3 additions & 0 deletions app/Domains/Materials/States/MaterialState.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ public static function config(): StateConfig
InReview::class,
], Published::class, AnyToPublishedTransition::class)
->allowTransition(InReview::class, ChangesRequested::class)
->allowTransition(Published::class, Draft::class)
->allowTransition(Published::class, Archived::class)
->allowTransition(Archived::class, Draft::class)
->allowTransition([
InReview::class,
Draft::class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public function create(): Response
public function store(LocalLoginRequest $request): RedirectResponse
{
Auth::login(User::find($request->input('userid')));

$request->session()->regenerate();

return redirect()->intended(RouteServiceProvider::HOME);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<script setup>
import {permissions} from '@/Components/Admin/permissions';
import ContentAccess from '@/Components/Admin/ContentAccess.vue';
import {Link} from '@inertiajs/vue3';
const props = defineProps({
material: Object,
status: { type: String, required: true },
label: { type: String, required: true },
title: { type: String, required: false },
icon: { type: Array, required: false },
});
</script>

<template>
<ContentAccess :permissions="[permissions.MANAGE_MATERIALS]">
<div
class="w-full p-4 bg-white border border-gray-200 rounded-lg shadow sm:p-6"
>
<h5 class="mb-5 text-base font-semibold text-gray-900 md:text-xl">
{{ props.label }}
</h5>
<Link
:href="route('admin.materials.change-status', [props.material.id, props.status])"
class=" font-medium text-white bg-blue-500 p-3 rounded hover:bg-blue-700 text-sm mt-2"
:title="props.title"
>
<font-awesome-icon :icon="props.icon" /> {{ props.title }}
</Link>
</div>
</ContentAccess>
</template>

<style scoped>
</style>
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ const props = usePage().props.material;
<template>
<ContentAccess :permissions="[permissions.MANAGE_MATERIALS]">
<div
class="w-full mt-4 sm:mt-0 max-w-sm p-4 bg-white border border-gray-200 rounded-lg shadow sm:p-6"
class="w-full mt-4 xl:mt-0 max-w-sm p-4 bg-white border border-gray-200 rounded-lg shadow sm:p-6"
>
<h5 class="mb-3 text-base font-semibold text-gray-900 md:text-xl">
<h5 class="mb-3 lg:text-base font-semibold text-gray-900 md:text-xl">
Opublikuj materiał
</h5>
<Link
:href="route('admin.materials.publish', props.id)"
class="font-medium text-white bg-blue-500 p-3 rounded hover:bg-blue-700 text-sm ml-3"
:href="route('admin.materials.change-status', [props.id, 'published'])"
class=" font-medium text-white bg-blue-500 p-3 rounded hover:bg-blue-700 text-sm ml-3"
title="Opublikuj teraz"
>
<font-awesome-icon icon="fa-solid fa-upload" /> Opublikuj teraz
Expand Down
43 changes: 12 additions & 31 deletions resources/js/Components/Materials/Authors.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<script setup>
import { computed } from 'vue';
import Avatar from '@/Components/Avatar.vue';
const props = defineProps({
fields: {
Expand Down Expand Up @@ -32,12 +31,9 @@ const translators = computed(() => findFields('translator'));
<div
v-for="(author, key) in authors"
:key="key"
class="grid grid-cols-4 gap-1 place-items-center mt-5 mb-5"
class="gap-1 mt-5 mb-5"
>
<div class="col-span-1">
<Avatar />
</div>
<div class="col-span-3 w-full">
<div class="w-full">
<h3 class="text-md leading-4">
{{ author.value }}
</h3>
Expand All @@ -51,12 +47,9 @@ const translators = computed(() => findFields('translator'));
<div
v-for="(redactor, key) in redactors"
:key="key"
class="grid grid-cols-4 gap-1 place-items-center mt-5 mb-5"
class="gap-1 mt-5 mb-5"
>
<div class="col-span-1">
<Avatar />
</div>
<div class="col-span-3 w-full">
<div class="w-full">
<h3 class="text-md leading-4">
{{ redactor.value }}
</h3>
Expand All @@ -70,12 +63,9 @@ const translators = computed(() => findFields('translator'));
<div
v-for="(reviewer, key) in reviewers"
:key="key"
class="grid grid-cols-4 gap-1 place-items-center mt-5 mb-5"
class="gap-1 mt-5 mb-5"
>
<div class="col-span-1">
<Avatar />
</div>
<div class="col-span-3 w-full">
<div class="w-full">
<h3 class="text-md leading-4">
{{ reviewer.value }}
</h3>
Expand All @@ -89,12 +79,9 @@ const translators = computed(() => findFields('translator'));
<div
v-for="(proofreader, key) in proofreaders"
:key="key"
class="grid grid-cols-4 gap-1 place-items-center mt-5 mb-5"
class="gap-1 mt-5 mb-5"
>
<div class="col-span-1">
<Avatar />
</div>
<div class="col-span-3 w-full">
<div class="w-full">
<h3 class="text-md leading-4">
{{ proofreader.value }}
</h3>
Expand All @@ -108,12 +95,9 @@ const translators = computed(() => findFields('translator'));
<div
v-for="(typesetter, key) in typesetters"
:key="key"
class="grid grid-cols-4 gap-1 place-items-center mt-5 mb-5"
class="gap-1 mt-5 mb-5"
>
<div class="col-span-1">
<Avatar />
</div>
<div class="col-span-3 w-full">
<div class="w-full">
<h3 class="text-md leading-4">
{{ typesetter.value }}
</h3>
Expand All @@ -127,12 +111,9 @@ const translators = computed(() => findFields('translator'));
<div
v-for="(translator, key) in translators"
:key="key"
class="grid grid-cols-4 gap-1 place-items-center mt-5 mb-5"
class="gap-1 mt-5 mb-5"
>
<div class="col-span-1">
<Avatar />
</div>
<div class="col-span-3 w-full">
<div class="w-full">
<h3 class="text-md leading-4">
{{ translator.value }}
</h3>
Expand Down
3 changes: 2 additions & 1 deletion resources/js/Layouts/AuthenticatedLayout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,8 @@ const clearTaxonomies = () => {
</ResponsiveNavLink>
<ResponsiveNavLink
:href="route('materials.tags', 'oboz')"
:active="route().current('materials.tags', {tags: 'oboz'})" >
:active="route().current('materials.tags', {tags: 'oboz'})"
>
Obóz
</ResponsiveNavLink>
<ResponsiveNavLink
Expand Down
56 changes: 50 additions & 6 deletions resources/js/Pages/Admin/MaterialsEdit.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,27 @@
import {usePage, Link, Head} from '@inertiajs/vue3';
import AdminLayout from '@/Layouts/AdminLayout.vue';
import MaterialTextInput from '@/Components/Admin/MaterialEdit/MaterialTextInput.vue';
import MaterialSections from '@/Components/Admin/MaterialEdit/MaterialSections.vue';
import MaterialFields from '@/Components/Admin/MaterialEdit/MaterialFields.vue';
import MaterialTags from '@/Components/Admin/MaterialEdit/MaterialTags.vue';
import MaterialLicence from '@/Components/Admin/MaterialEdit/MaterialLicence.vue';
import MaterialAttachments from '@/Components/Admin/MaterialEdit/MaterialAttachments.vue';
import MaterialSetups from '@/Components/Admin/MaterialEdit/MaterialSetups.vue';
import MaterialScenarios from '@/Components/Admin/MaterialEdit/MaterialScenarios.vue';
import MaterialPublish from '@/Components/Admin/MaterialEdit/MaterialPublish.vue';
import MaterialChangeStatus from '@/Components/Admin/MaterialEdit/MaterialChangeStatus.vue';
const props = usePage().props.material;
const states = {
draft: 'App\\Domains\\Materials\\States\\Draft',
published: 'App\\Domains\\Materials\\States\\Published',
archived: 'App\\Domains\\Materials\\States\\Archived',
};
const statuses = {
published: 'published',
draft: 'draft',
archived: 'archived',
};
</script>

<template>
Expand All @@ -26,7 +37,7 @@ const props = usePage().props.material;
<i class="fa fa-chevron-left" /> powrót
</Link>
</button>
<div class="block md:flex md:flex-row">
<div class="block xl:flex">
<div class="basis-3/4">
<div class="w-full p-4 bg-white border border-gray-200 rounded-lg shadow sm:p-6">
<div class="mb-3">
Expand Down Expand Up @@ -85,9 +96,42 @@ const props = usePage().props.material;
</div>
</div>
</div>
<div class="basis-1/4 md:px-4">
<MaterialSections />
<MaterialPublish />
<div class="w-full basis-1/4 xl:px-4 flex flex-row xl:flex-col gap-4 mt-4 xl:mt-0">
<MaterialChangeStatus
v-if="props.state === states.draft"
:material="usePage().props.material"
:status="statuses.published"
label="Opublikuj materiał"
title="Opublikuj teraz"
:icon="['fa-solid', 'fa-upload']"
/>

<MaterialChangeStatus
v-if="props.state === states.published"
:material="usePage().props.material"
:status="statuses.draft"
label="Zmień na szkic"
title="Zmień na szkic"
:icon="['fas', 'pen-ruler']"
/>

<MaterialChangeStatus
v-if="props.state === states.published"
:material="usePage().props.material"
:status="statuses.archived"
label="Zarchiwizuj materiał"
title="Archiwizuj teraz"
:icon="['fas', 'box-archive']"
/>

<MaterialChangeStatus
v-if="props.state === states.archived"
:material="usePage().props.material"
:status="statuses.draft"
label="Zmień na szkic"
title="Zmień na szkic"
:icon="['fas', 'pen-ruler']"
/>
</div>
</div>
</AdminLayout>
Expand Down
2 changes: 1 addition & 1 deletion routes/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
Route::get('/create', [MaterialsController::class, 'create'])->name('create');
Route::get('/create/{preset}', [MaterialsController::class, 'new'])->name('new');
Route::get('/{material}', [MaterialsController::class, 'edit'])->name('edit');
Route::get('/{material}/publish', [MaterialsController::class, 'publish'])->name('publish');
Route::get('/{material}/{status}', [MaterialsController::class, 'changeStatus'])->name('change-status');
Route::delete('/{material}', [MaterialsController::class, 'destroy'])->name('destroy');
});

Expand Down

0 comments on commit 431d4d2

Please sign in to comment.