feat: expand permission management for settings by introducing new permissions for system, social media, marketplace, HR, and homepage updates; refactor related controllers, requests, and services to utilize these permissions; enhance frontend components to support new permission checks and improve user experience

This commit is contained in:
Yoga Pangestu 2026-07-04 13:37:26 +07:00
parent f1c3658166
commit 2b7208a0c4
21 changed files with 296 additions and 194 deletions

View File

@ -135,8 +135,16 @@ enum Permission: string
case PAYROLL_VIEW = 'payroll.view';
case PAYROLL_ADJUST = 'payroll.adjust';
case SETTINGS_VIEW = 'settings.view';
case SETTINGS_UPDATE = 'settings.update';
case SETTINGS_VIEW_SYSTEM = 'settings.view_system';
case SETTINGS_UPDATE_SYSTEM = 'settings.update_system';
case SETTINGS_VIEW_SOCIAL_MEDIA = 'settings.view_social_media';
case SETTINGS_UPDATE_SOCIAL_MEDIA = 'settings.update_social_media';
case SETTINGS_VIEW_MARKETPLACE = 'settings.view_marketplace';
case SETTINGS_UPDATE_MARKETPLACE = 'settings.update_marketplace';
case SETTINGS_VIEW_HR = 'settings.view_hr';
case SETTINGS_UPDATE_HR = 'settings.update_hr';
case SETTINGS_VIEW_HOMEPAGE = 'settings.view_homepage';
case SETTINGS_UPDATE_HOMEPAGE = 'settings.update_homepage';
case ACTIVITY_LOGS_VIEW = 'activity_logs.view';
@ -275,8 +283,16 @@ public function label(): string
self::PAYROLL_VIEW => 'Lihat Gaji',
self::PAYROLL_ADJUST => 'Sesuaikan Gaji',
self::SETTINGS_VIEW => 'Lihat Pengaturan Aplikasi',
self::SETTINGS_UPDATE => 'Ubah Pengaturan Aplikasi',
self::SETTINGS_VIEW_SYSTEM => 'Lihat Pengaturan Sistem',
self::SETTINGS_UPDATE_SYSTEM => 'Ubah Pengaturan Sistem',
self::SETTINGS_VIEW_SOCIAL_MEDIA => 'Lihat Pengaturan Media Sosial',
self::SETTINGS_UPDATE_SOCIAL_MEDIA => 'Ubah Pengaturan Media Sosial',
self::SETTINGS_VIEW_MARKETPLACE => 'Lihat Pengaturan Marketplace',
self::SETTINGS_UPDATE_MARKETPLACE => 'Ubah Pengaturan Marketplace',
self::SETTINGS_VIEW_HR => 'Lihat Pengaturan HR',
self::SETTINGS_UPDATE_HR => 'Ubah Pengaturan HR',
self::SETTINGS_VIEW_HOMEPAGE => 'Lihat Pengaturan Homepage',
self::SETTINGS_UPDATE_HOMEPAGE => 'Ubah Pengaturan Homepage',
self::ACTIVITY_LOGS_VIEW => 'Lihat Log Aktivitas',
@ -335,7 +351,11 @@ public function group(): string
self::EMPLOYEE_ADVANCES_DELETE, self::EMPLOYEE_ADVANCES_VERIFY,
self::EMPLOYEE_ADVANCES_PAY => 'Kasbon',
self::PAYROLL_VIEW, self::PAYROLL_ADJUST => 'Gaji',
self::SETTINGS_VIEW, self::SETTINGS_UPDATE => 'Pengaturan Aplikasi',
self::SETTINGS_VIEW_SYSTEM, self::SETTINGS_UPDATE_SYSTEM,
self::SETTINGS_VIEW_SOCIAL_MEDIA, self::SETTINGS_UPDATE_SOCIAL_MEDIA,
self::SETTINGS_VIEW_MARKETPLACE, self::SETTINGS_UPDATE_MARKETPLACE,
self::SETTINGS_VIEW_HR, self::SETTINGS_UPDATE_HR,
self::SETTINGS_VIEW_HOMEPAGE, self::SETTINGS_UPDATE_HOMEPAGE => 'Pengaturan Aplikasi',
self::ACTIVITY_LOGS_VIEW => 'Log Aktivitas',
self::ROLES_VIEW, self::ROLES_CREATE, self::ROLES_UPDATE,
self::ROLES_DELETE => 'Role & Permission',

View File

@ -193,8 +193,16 @@ public function permissions(): array
Permission::PAYROLL_VIEW,
Permission::PAYROLL_ADJUST,
Permission::SETTINGS_VIEW,
Permission::SETTINGS_UPDATE,
Permission::SETTINGS_VIEW_SYSTEM,
Permission::SETTINGS_UPDATE_SYSTEM,
Permission::SETTINGS_VIEW_SOCIAL_MEDIA,
Permission::SETTINGS_UPDATE_SOCIAL_MEDIA,
Permission::SETTINGS_VIEW_MARKETPLACE,
Permission::SETTINGS_UPDATE_MARKETPLACE,
Permission::SETTINGS_VIEW_HR,
Permission::SETTINGS_UPDATE_HR,
Permission::SETTINGS_VIEW_HOMEPAGE,
Permission::SETTINGS_UPDATE_HOMEPAGE,
],
self::CASHIER => [

View File

@ -17,6 +17,7 @@
use App\Services\System\Setting\SocialMediaService;
use App\Services\System\Setting\SystemService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
@ -33,8 +34,10 @@ public function __construct(
private readonly OwnerVerificationService $ownerVerificationService,
) {}
public function index(): Response
public function index(Request $request): Response
{
$user = $request->user();
return Inertia::render('admin/system/setting/Index', [
'system' => $this->systemService->systemData(),
'socialMedia' => $this->socialMediaService->socialMediaData(),
@ -42,15 +45,16 @@ public function index(): Response
'hr' => $this->hrSettingService->hrData(),
'homepage' => $this->homepageSettingService->homepageData(),
'hasPendingMarketplaceVerification' => $this->ownerVerificationService->hasPendingMarketplaceVerification(),
'canUpdateSystem' => $user->can(Permission::SETTINGS_UPDATE_SYSTEM->value),
'canUpdateSocialMedia' => $user->can(Permission::SETTINGS_UPDATE_SOCIAL_MEDIA->value),
'canUpdateMarketplace' => $user->can(Permission::SETTINGS_UPDATE_MARKETPLACE->value),
'canUpdateHr' => $user->can(Permission::SETTINGS_UPDATE_HR->value),
'canUpdateHomepage' => $user->can(Permission::SETTINGS_UPDATE_HOMEPAGE->value),
]);
}
public function updateSystem(SystemRequest $request): RedirectResponse
{
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
abort(403, 'Aksi ini tidak diizinkan.');
}
$this->systemService->updateSystem($request->validated());
$this->flashSuccess('Pengaturan sistem berhasil disimpan.');
@ -60,10 +64,6 @@ public function updateSystem(SystemRequest $request): RedirectResponse
public function updateSocialMedia(SocialMediaRequest $request): RedirectResponse
{
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
abort(403, 'Aksi ini tidak diizinkan.');
}
$this->socialMediaService->updateSocialMedia($request->validated());
$this->flashSuccess('Pengaturan media sosial berhasil disimpan.');
@ -86,10 +86,6 @@ public function updateMarketplace(MarketplaceRequest $request): RedirectResponse
public function updateHr(HrSettingRequest $request): RedirectResponse
{
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
abort(403, 'Aksi ini tidak diizinkan.');
}
$this->hrSettingService->updateHr($request->validated());
$this->flashSuccess('Pengaturan HR berhasil disimpan.');
@ -99,10 +95,6 @@ public function updateHr(HrSettingRequest $request): RedirectResponse
public function updateHomepage(HomepageSettingRequest $request): RedirectResponse
{
if (! $request->user()->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
abort(403, 'Aksi ini tidak diizinkan.');
}
$this->homepageSettingService->updateHomepage($request->validated());
$this->flashSuccess('Pengaturan homepage berhasil disimpan.');

View File

@ -9,7 +9,7 @@ class HomepageSettingRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
return $this->user()?->can(Permission::SETTINGS_UPDATE_HOMEPAGE->value) ?? false;
}
/**
@ -24,6 +24,8 @@ public function rules(): array
'about_image_s3_key' => ['nullable', 'string'],
'gallery_s3_keys' => ['nullable', 'array', 'max:10'],
'gallery_s3_keys.*' => ['required', 'string'],
'gallery_images' => ['nullable', 'array', 'max:10'],
'gallery_images.*' => ['required', 'image', 'max:5120'],
'gallery_images_remove' => ['nullable', 'array'],
'gallery_images_remove.*' => ['integer'],
];

View File

@ -9,7 +9,7 @@ class HrSettingRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
return $this->user()?->can(Permission::SETTINGS_UPDATE_HR->value) ?? false;
}
/**

View File

@ -13,7 +13,7 @@ class MarketplaceRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
return $this->user()?->can(Permission::SETTINGS_UPDATE_MARKETPLACE->value) ?? false;
}
/**

View File

@ -9,7 +9,7 @@ class SocialMediaRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
return $this->user()?->can(Permission::SETTINGS_UPDATE_SOCIAL_MEDIA->value) ?? false;
}
/**

View File

@ -10,7 +10,7 @@ class SystemRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()?->can(Permission::SETTINGS_UPDATE->value) ?? false;
return $this->user()?->can(Permission::SETTINGS_UPDATE_SYSTEM->value) ?? false;
}
/**

View File

@ -3,12 +3,16 @@
namespace App\Services\System\Setting;
use App\Models\HomepageConfiguration;
use App\Services\Concerns\RunsInTransaction;
use App\Services\Concerns\SyncsPhotos;
use App\Services\Media\MediaService;
use App\Support\Media\MediaPresenter;
use Illuminate\Http\UploadedFile;
class HomepageSettingService
{
use RunsInTransaction, SyncsPhotos;
public function __construct(
private readonly MediaService $mediaService,
) {}
@ -31,30 +35,45 @@ public function homepageData(): array
public function updateHomepage(array $validated): void
{
$configuration = HomepageConfiguration::instance();
$this->runInTransaction(
function () use ($validated): void {
$configuration = HomepageConfiguration::instance();
if (isset($validated['hero_image_s3_key'])) {
$this->mediaService->replaceSingleS3Key($configuration, $validated['hero_image_s3_key'], 'hero_image', 'hero-image');
} elseif (isset($validated['hero_image']) && $validated['hero_image'] instanceof UploadedFile) {
$this->mediaService->replaceSingleFile($configuration, $validated['hero_image'], 'hero_image', 'hero-image');
}
$this->syncPhotos(
$configuration,
[
'photos' => isset($validated['hero_image']) ? [$validated['hero_image']] : null,
's3_keys' => isset($validated['hero_image_s3_key']) ? [$validated['hero_image_s3_key']] : null,
],
maxPhotos: 1,
required: false,
collection: 'hero_image',
);
if (isset($validated['about_image_s3_key'])) {
$this->mediaService->replaceSingleS3Key($configuration, $validated['about_image_s3_key'], 'about_image', 'about-image');
} elseif (isset($validated['about_image']) && $validated['about_image'] instanceof UploadedFile) {
$this->mediaService->replaceSingleFile($configuration, $validated['about_image'], 'about_image', 'about-image');
}
$this->syncPhotos(
$configuration,
[
'photos' => isset($validated['about_image']) ? [$validated['about_image']] : null,
's3_keys' => isset($validated['about_image_s3_key']) ? [$validated['about_image_s3_key']] : null,
],
maxPhotos: 1,
required: false,
collection: 'about_image',
);
if (isset($validated['gallery_s3_keys']) || isset($validated['gallery_images_remove'])) {
$this->mediaService->syncCollection(
$configuration,
'gallery',
null,
$validated['gallery_images_remove'] ?? null,
10,
'gallery',
s3Keys: $validated['gallery_s3_keys'] ?? null,
);
}
$this->syncPhotos(
$configuration,
[
'photos' => $validated['gallery_images'] ?? null,
'remove_media_ids' => $validated['gallery_images_remove'] ?? null,
's3_keys' => $validated['gallery_s3_keys'] ?? null,
],
maxPhotos: 10,
required: false,
collection: 'gallery',
);
},
'Gagal memperbarui pengaturan homepage',
);
}
}

View File

@ -8,6 +8,7 @@
use App\Enums\Permission;
use App\Models\OwnerVerificationRequest;
use App\Models\User;
use App\Services\Concerns\RunsInTransaction;
use App\Services\System\PushNotificationService;
use App\Settings\MarketplaceSettings;
use App\Support\Marketplace\MarketplaceFeeCalculator;
@ -16,6 +17,8 @@
class MarketplaceService
{
use RunsInTransaction;
public function __construct(
private readonly PushNotificationService $pushNotificationService,
) {}
@ -72,61 +75,66 @@ public function marketplaceData(): array
public function updateMarketplace(array $validated, User $user): void
{
if ($user->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
$this->saveSettings($validated);
$this->runInTransaction(
function () use ($validated, $user): void {
if ($user->can(Permission::OWNER_VERIFICATIONS_VERIFY->value)) {
$this->saveSettings($validated);
return;
}
return;
}
$hasPending = OwnerVerificationRequest::query()
->where('subject_type', MarketplaceSettings::class)
->pending()
->exists();
$hasPending = OwnerVerificationRequest::query()
->where('subject_type', MarketplaceSettings::class)
->pending()
->exists();
if ($hasPending) {
throw ValidationException::withMessages([
'system' => 'Perubahan pengaturan marketplace sedang menunggu verifikasi owner.',
]);
}
if ($hasPending) {
throw ValidationException::withMessages([
'system' => 'Perubahan pengaturan marketplace sedang menunggu verifikasi owner.',
]);
}
$settings = app(MarketplaceSettings::class);
$oldPayload = [];
$newPayload = [];
$settings = app(MarketplaceSettings::class);
$oldPayload = [];
$newPayload = [];
foreach ($this->tiktokFeeKeys() as $key) {
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
}
foreach ($this->tiktokFeeKeys() as $key) {
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
}
foreach ($this->shopeeFeeKeys() as $key) {
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
}
foreach ($this->shopeeFeeKeys() as $key) {
$oldPayload[$key] = $this->presentFeeRule($settings->{$key});
$newPayload[$key] = $this->normalizeFeeRule($validated[$key]);
}
OwnerVerificationRequest::create([
'action' => OwnerVerificationAction::UPDATE,
'status' => OwnerVerificationStatus::PENDING,
'subject_type' => MarketplaceSettings::class,
'subject_id' => null,
'submitted_by_id' => $user->id,
'payload' => [
'old' => $oldPayload,
'new' => $newPayload,
],
]);
OwnerVerificationRequest::create([
'action' => OwnerVerificationAction::UPDATE,
'status' => OwnerVerificationStatus::PENDING,
'subject_type' => MarketplaceSettings::class,
'subject_id' => null,
'submitted_by_id' => $user->id,
'payload' => [
'old' => $oldPayload,
'new' => $newPayload,
],
]);
$this->pushNotificationService->sendToRoles(
'⚙️ Pengaturan Marketplace Menunggu Persetujuan Owner',
"Pengajuan ubah pengaturan marketplace oleh '{$user->username}' menunggu verifikasi owner.",
['owner', 'developer', 'direktur'],
route('admin.system.settings.index'),
);
$this->pushNotificationService->sendToRoles(
'⚙️ Pengaturan Marketplace Menunggu Persetujuan Owner',
"Pengajuan ubah pengaturan marketplace oleh '{$user->username}' menunggu verifikasi owner.",
['owner', 'developer', 'direktur'],
route('admin.system.settings.index'),
);
$this->pushNotificationService->sendToUser(
'📤 Pengajuan Terkirim',
'Pengajuan ubah pengaturan marketplace menunggu verifikasi owner.',
$user->id,
route('admin.system.settings.index'),
$this->pushNotificationService->sendToUser(
'📤 Pengajuan Terkirim',
'Pengajuan ubah pengaturan marketplace menunggu verifikasi owner.',
$user->id,
route('admin.system.settings.index'),
);
},
'Gagal memperbarui pengaturan marketplace',
);
}
@ -147,8 +155,13 @@ public function saveSettings(array $validated): void
public function applyVerificationRequest(OwnerVerificationRequest $request): void
{
$newPayload = $request->payload['new'] ?? [];
$this->saveSettings($newPayload);
$this->runInTransaction(
function () use ($request): void {
$newPayload = $request->payload['new'] ?? [];
$this->saveSettings($newPayload);
},
'Gagal menerapkan pengajuan verifikasi owner',
);
}
public function buildOrderSnapshot(OrderChannel $channel, int $totalAmount, array $lineItems, bool $isAffiliate = false): ?array

View File

@ -3,6 +3,8 @@
namespace App\Services\System\Setting;
use App\Models\SystemConfiguration;
use App\Services\Concerns\RunsInTransaction;
use App\Services\Concerns\SyncsPhotos;
use App\Services\Media\MediaService;
use App\Settings\SystemSettings;
use App\Support\Media\MediaPresenter;
@ -11,6 +13,8 @@
class SystemService
{
use RunsInTransaction, SyncsPhotos;
public function __construct(
private readonly MediaService $mediaService,
) {}
@ -39,50 +43,70 @@ public function systemData(): array
public function updateSystem(array $validated): void
{
$settings = app(SystemSettings::class);
$configuration = SystemConfiguration::instance();
$this->runInTransaction(
function () use ($validated): void {
$settings = app(SystemSettings::class);
$configuration = SystemConfiguration::instance();
$settings->app_name = $validated['app_name'];
$settings->about_app = $validated['about_app'] ?? null;
$settings->email = $validated['email'] ?? null;
$settings->phone = $validated['phone'] ?? null;
$settings->address = $validated['address'] ?? null;
$settings->save();
$settings->app_name = $validated['app_name'];
$settings->about_app = $validated['about_app'] ?? null;
$settings->email = $validated['email'] ?? null;
$settings->phone = $validated['phone'] ?? null;
$settings->address = $validated['address'] ?? null;
$settings->save();
if (isset($validated['logo_s3_key'])) {
$this->mediaService->replaceSingleS3Key($configuration, $validated['logo_s3_key'], 'logo', 'logo');
} elseif (isset($validated['logo']) && $validated['logo'] instanceof UploadedFile) {
$this->mediaService->replaceSingleFile($configuration, $validated['logo'], 'logo', 'logo');
}
$this->syncPhotos(
$configuration,
[
'photos' => isset($validated['logo']) ? [$validated['logo']] : null,
's3_keys' => isset($validated['logo_s3_key']) ? [$validated['logo_s3_key']] : null,
],
maxPhotos: 1,
required: false,
collection: 'logo',
);
if (isset($validated['favicon_s3_key'])) {
$this->mediaService->replaceSingleS3Key($configuration, $validated['favicon_s3_key'], 'favicon', 'favicon');
} elseif (isset($validated['favicon']) && $validated['favicon'] instanceof UploadedFile) {
$this->mediaService->replaceSingleFile($configuration, $validated['favicon'], 'favicon', 'favicon');
}
$this->syncPhotos(
$configuration,
[
'photos' => isset($validated['favicon']) ? [$validated['favicon']] : null,
's3_keys' => isset($validated['favicon_s3_key']) ? [$validated['favicon_s3_key']] : null,
],
maxPhotos: 1,
required: false,
collection: 'favicon',
);
if (isset($validated['login_cover_s3_key'])) {
$this->mediaService->replaceSingleS3Key($configuration, $validated['login_cover_s3_key'], 'login_cover', 'login-cover');
} elseif (isset($validated['login_cover']) && $validated['login_cover'] instanceof UploadedFile) {
$this->mediaService->replaceSingleFile($configuration, $validated['login_cover'], 'login_cover', 'login-cover');
}
$this->syncPhotos(
$configuration,
[
'photos' => isset($validated['login_cover']) ? [$validated['login_cover']] : null,
's3_keys' => isset($validated['login_cover_s3_key']) ? [$validated['login_cover_s3_key']] : null,
],
maxPhotos: 1,
required: false,
collection: 'login_cover',
);
$errors = [];
$errors = [];
if (! $configuration->hasMedia('logo')) {
$errors['logo'] = 'Logo wajib diisi.';
}
if (! $configuration->hasMedia('logo')) {
$errors['logo'] = 'Logo wajib diisi.';
}
if (! $configuration->hasMedia('favicon')) {
$errors['favicon'] = 'Favicon wajib diisi.';
}
if (! $configuration->hasMedia('favicon')) {
$errors['favicon'] = 'Favicon wajib diisi.';
}
if (! $configuration->hasMedia('login_cover')) {
$errors['login_cover'] = 'Cover login wajib diisi.';
}
if (! $configuration->hasMedia('login_cover')) {
$errors['login_cover'] = 'Cover login wajib diisi.';
}
if ($errors !== []) {
throw ValidationException::withMessages($errors);
}
if ($errors !== []) {
throw ValidationException::withMessages($errors);
}
},
'Gagal memperbarui pengaturan sistem',
);
}
}

View File

@ -24,7 +24,7 @@ interface MenuItem {
title: string;
href: string;
icon: any;
permission?: string;
permission?: string | string[];
badgeKey?: 'pendingLeaveRequests' | 'pendingEmployeeAdvances' | 'pendingCuttings';
}
@ -82,7 +82,18 @@ const menuGroups: MenuGroup[] = [
label: 'Sistem',
items: [
{ title: 'Role & Permission', href: admin.system.roles.index.url(), icon: Shield, permission: 'roles.view' },
{ title: 'Pengaturan', href: admin.system.settings.index.url(), icon: Settings2, permission: 'settings.view' },
{
title: 'Pengaturan',
href: admin.system.settings.index.url(),
icon: Settings2,
permission: [
'settings.view_system',
'settings.view_social_media',
'settings.view_marketplace',
'settings.view_hr',
'settings.view_homepage',
],
},
{ title: 'Log Aktivitas', href: admin.system.activity_logs.index.url(), icon: History, permission: 'activity_logs.view' },
],
},

View File

@ -7,7 +7,10 @@ export function useCan() {
const permissions = computed(() => page.props.auth.user?.permissions ?? []);
const roles = computed(() => page.props.auth.user?.roles ?? []);
function can(permission: string): boolean {
function can(permission: string | string[]): boolean {
if (Array.isArray(permission)) {
return permission.some((p) => permissions.value.includes(p));
}
return permissions.value.includes(permission);
}

View File

@ -25,6 +25,11 @@ defineProps<{
hr: HrSettingsData;
homepage: HomepageSettingsData;
hasPendingMarketplaceVerification: boolean;
canUpdateSystem: boolean;
canUpdateSocialMedia: boolean;
canUpdateMarketplace: boolean;
canUpdateHr: boolean;
canUpdateHomepage: boolean;
}>();
const { hasRole } = useCan();
@ -39,10 +44,10 @@ const activeSection = ref<SettingSection>(
<Head title="Pengaturan" />
<SettingLayout v-model:section="activeSection">
<SystemSection v-if="activeSection === SettingSectionConst.SYSTEM" :data="system" />
<HomepageSection v-else-if="activeSection === SettingSectionConst.HOMEPAGE" :data="homepage" />
<SocialMediaSection v-else-if="activeSection === SettingSectionConst.SOCIAL" :data="socialMedia" />
<MarketplaceSection v-else-if="activeSection === SettingSectionConst.MARKETPLACE" :data="marketplace" :has-pending-verification="hasPendingMarketplaceVerification" />
<HrSection v-else-if="activeSection === SettingSectionConst.HR" :data="hr" />
<SystemSection v-if="activeSection === SettingSectionConst.SYSTEM" :data="system" :can-update="canUpdateSystem" />
<HomepageSection v-else-if="activeSection === SettingSectionConst.HOMEPAGE" :data="homepage" :can-update="canUpdateHomepage" />
<SocialMediaSection v-else-if="activeSection === SettingSectionConst.SOCIAL" :data="socialMedia" :can-update="canUpdateSocialMedia" />
<MarketplaceSection v-else-if="activeSection === SettingSectionConst.MARKETPLACE" :data="marketplace" :has-pending-verification="hasPendingMarketplaceVerification" :can-update="canUpdateMarketplace" />
<HrSection v-else-if="activeSection === SettingSectionConst.HR" :data="hr" :can-update="canUpdateHr" />
</SettingLayout>
</template>

View File

@ -13,6 +13,7 @@ import type { HomepageSettingsData } from '@/types/setting';
const props = defineProps<{
data: HomepageSettingsData;
canUpdate: boolean;
}>();
const heroImage = ref<MediaUploadState>(
@ -107,7 +108,7 @@ function submit() {
</CardContent>
</Card>
<div class="flex justify-end">
<div v-if="canUpdate" class="flex justify-end">
<Button type="submit" :disabled="isSubmitting || isUploading">
<Save class="size-4" />
{{ isUploading ? 'Mengunggah...' : isSubmitting ? 'Menyimpan...' : 'Simpan' }}

View File

@ -13,6 +13,7 @@ import type { HrSettingsData } from '@/types/setting';
const props = defineProps<{
data: HrSettingsData;
canUpdate: boolean;
}>();
const form = useForm({
@ -82,7 +83,7 @@ function submit() {
</CardContent>
</Card>
<div class="mt-6 flex justify-end">
<div v-if="canUpdate" class="mt-6 flex justify-end">
<Button type="submit" :disabled="form.processing">
<Save class="size-4" />
{{ form.processing ? 'Menyimpan...' : 'Simpan' }}

View File

@ -25,6 +25,7 @@ import MarketplaceFeeField from './MarketplaceFeeField.vue';
const props = defineProps<{
data: MarketplaceSettingsData;
hasPendingVerification: boolean;
canUpdate: boolean;
}>();
const activePlatform = ref<MarketplacePlatform>(MarketplacePlatformConst.TIKTOK_SHOP);
@ -188,7 +189,7 @@ function submit() {
</CardContent>
</Card>
<div class="flex justify-end">
<div v-if="canUpdate" class="flex justify-end">
<Button type="submit" :disabled="form.processing || props.hasPendingVerification">
<Save class="size-4" />
{{ form.processing ? 'Menyimpan...' : 'Simpan' }}

View File

@ -12,6 +12,7 @@ import type { SocialMediaSettingsData } from '@/types/setting';
const props = defineProps<{
data: SocialMediaSettingsData;
canUpdate: boolean;
}>();
const form = useForm({
@ -69,7 +70,7 @@ function submit() {
</CardContent>
</Card>
<div class="mt-6 flex justify-end">
<div v-if="canUpdate" class="mt-6 flex justify-end">
<Button type="submit" :disabled="form.processing">
<Save class="size-4" />
{{ form.processing ? 'Menyimpan...' : 'Simpan' }}

View File

@ -18,6 +18,7 @@ import type { SystemSettingsData } from '@/types/setting';
const props = defineProps<{
data: SystemSettingsData;
canUpdate: boolean;
}>();
const form = useForm({
@ -143,7 +144,7 @@ function submit() {
</CardContent>
</Card>
<div class="flex justify-end">
<div v-if="canUpdate" class="flex justify-end">
<Button type="submit" :disabled="form.processing || isUploading">
<Save class="size-4" />
{{ isUploading ? 'Mengunggah...' : form.processing ? 'Menyimpan...' : 'Simpan' }}

View File

@ -477,28 +477,28 @@
});
Route::prefix('settings')->name('settings.')
->middleware('permission:'.Permission::SETTINGS_VIEW->value)
->middleware('permission:'.Permission::SETTINGS_VIEW_SYSTEM->value.'|'.Permission::SETTINGS_VIEW_SOCIAL_MEDIA->value.'|'.Permission::SETTINGS_VIEW_MARKETPLACE->value.'|'.Permission::SETTINGS_VIEW_HR->value.'|'.Permission::SETTINGS_VIEW_HOMEPAGE->value)
->group(function () {
Route::get('/', [SettingController::class, 'index'])->name('index');
Route::put('system', [SettingController::class, 'updateSystem'])
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
->middleware('permission:'.Permission::SETTINGS_UPDATE_SYSTEM->value)
->name('system.update');
Route::put('social-media', [SettingController::class, 'updateSocialMedia'])
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
->middleware('permission:'.Permission::SETTINGS_UPDATE_SOCIAL_MEDIA->value)
->name('social_media.update');
Route::put('marketplace', [SettingController::class, 'updateMarketplace'])
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
->middleware('permission:'.Permission::SETTINGS_UPDATE_MARKETPLACE->value)
->name('marketplace.update');
Route::put('hr', [SettingController::class, 'updateHr'])
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
->middleware('permission:'.Permission::SETTINGS_UPDATE_HR->value)
->name('hr.update');
Route::put('homepage', [SettingController::class, 'updateHomepage'])
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
->middleware('permission:'.Permission::SETTINGS_UPDATE_HOMEPAGE->value)
->name('homepage.update');
});
});

View File

@ -79,7 +79,7 @@ function allMarketplaceFeeFields(): array
describe('Setting Index', function () {
test('authenticated user with permission can view settings page', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM);
$this->actingAs($user)
->get(route('admin.system.settings.index'))
@ -104,7 +104,7 @@ function allMarketplaceFeeFields(): array
describe('Setting Update System', function () {
test('authenticated user with permission can update system settings', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['logo'] = UploadedFile::fake()->image('logo.jpg', 100, 100);
@ -127,7 +127,7 @@ function allMarketplaceFeeFields(): array
});
test('user without update permission is forbidden', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM);
$this->actingAs($user)
->put(route('admin.system.settings.system.update'), validSystemPayload())
@ -135,7 +135,7 @@ function allMarketplaceFeeFields(): array
});
test('app_name is required', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['app_name'] = '';
@ -146,7 +146,7 @@ function allMarketplaceFeeFields(): array
});
test('app_name must not exceed 100 characters', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['app_name'] = str_repeat('a', 101);
@ -157,7 +157,7 @@ function allMarketplaceFeeFields(): array
});
test('email must be valid', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['email'] = 'not-an-email';
@ -168,7 +168,7 @@ function allMarketplaceFeeFields(): array
});
test('email is required', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['email'] = '';
@ -179,7 +179,7 @@ function allMarketplaceFeeFields(): array
});
test('phone must be valid phone number', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['phone'] = '123invalid';
@ -190,7 +190,7 @@ function allMarketplaceFeeFields(): array
});
test('phone is required', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['phone'] = '';
@ -201,7 +201,7 @@ function allMarketplaceFeeFields(): array
});
test('about_app is required', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['about_app'] = '';
@ -212,7 +212,7 @@ function allMarketplaceFeeFields(): array
});
test('address is required', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['address'] = '';
@ -223,7 +223,7 @@ function allMarketplaceFeeFields(): array
});
test('logo must be an image when provided', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['logo'] = UploadedFile::fake()->create('document.pdf', 100);
@ -234,7 +234,7 @@ function allMarketplaceFeeFields(): array
});
test('favicon must be an image when provided', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SYSTEM, PermissionEnum::SETTINGS_UPDATE_SYSTEM);
$payload = validSystemPayload();
$payload['favicon'] = UploadedFile::fake()->create('document.pdf', 100);
@ -249,7 +249,7 @@ function allMarketplaceFeeFields(): array
describe('Setting Update Social Media', function () {
test('authenticated user can update social media settings', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
$this->actingAs($user)
->put(route('admin.system.settings.social_media.update'), [
@ -272,7 +272,7 @@ function allMarketplaceFeeFields(): array
});
test('user without update permission is forbidden', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA);
$this->actingAs($user)
->put(route('admin.system.settings.social_media.update'), [
@ -282,7 +282,7 @@ function allMarketplaceFeeFields(): array
});
test('social media urls can be null', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
$this->actingAs($user)
->put(route('admin.system.settings.social_media.update'), [
@ -299,7 +299,7 @@ function allMarketplaceFeeFields(): array
});
test('instagram_url must be a valid url', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
$this->actingAs($user)
->put(route('admin.system.settings.social_media.update'), [
@ -309,7 +309,7 @@ function allMarketplaceFeeFields(): array
});
test('facebook_url must be a valid url', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
$this->actingAs($user)
->put(route('admin.system.settings.social_media.update'), [
@ -319,7 +319,7 @@ function allMarketplaceFeeFields(): array
});
test('tiktok_url must be a valid url', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_SOCIAL_MEDIA, PermissionEnum::SETTINGS_UPDATE_SOCIAL_MEDIA);
$this->actingAs($user)
->put(route('admin.system.settings.social_media.update'), [
@ -333,7 +333,7 @@ function allMarketplaceFeeFields(): array
describe('Setting Update Marketplace', function () {
test('authenticated user can update marketplace settings', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
$payload = allMarketplaceFeeFields();
@ -353,7 +353,7 @@ function allMarketplaceFeeFields(): array
});
test('user without update permission is forbidden', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE);
$this->actingAs($user)
->put(route('admin.system.settings.marketplace.update'), allMarketplaceFeeFields())
@ -361,7 +361,7 @@ function allMarketplaceFeeFields(): array
});
test('marketplace fee scope must be valid enum', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
$payload = allMarketplaceFeeFields();
$payload['tiktok_shop_platform_commission']['scope'] = 'invalid';
@ -372,7 +372,7 @@ function allMarketplaceFeeFields(): array
});
test('marketplace fee value_type must be valid enum', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
$payload = allMarketplaceFeeFields();
$payload['tiktok_shop_platform_commission']['value_type'] = 'invalid';
@ -383,7 +383,7 @@ function allMarketplaceFeeFields(): array
});
test('marketplace fee value must be numeric', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
$payload = allMarketplaceFeeFields();
$payload['tiktok_shop_platform_commission']['value'] = 'not-a-number';
@ -394,7 +394,7 @@ function allMarketplaceFeeFields(): array
});
test('marketplace fee percent value must not exceed 100', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
$payload = allMarketplaceFeeFields();
$payload['tiktok_shop_platform_commission']['value_type'] = 'percent';
@ -406,7 +406,7 @@ function allMarketplaceFeeFields(): array
});
test('marketplace flat fee must not have decimals', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_MARKETPLACE, PermissionEnum::SETTINGS_UPDATE_MARKETPLACE);
$payload = allMarketplaceFeeFields();
$payload['shopee_admin_fee']['value_type'] = 'flat';
@ -422,7 +422,7 @@ function allMarketplaceFeeFields(): array
describe('Setting Update HR', function () {
test('authenticated user can update HR settings', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -454,7 +454,7 @@ function allMarketplaceFeeFields(): array
});
test('user without update permission is forbidden', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -467,7 +467,7 @@ function allMarketplaceFeeFields(): array
});
test('scheduled_check_in_time is required', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -480,7 +480,7 @@ function allMarketplaceFeeFields(): array
});
test('scheduled_check_in_time must match HH:MM format', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -493,7 +493,7 @@ function allMarketplaceFeeFields(): array
});
test('scheduled_check_out_time is required', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -506,7 +506,7 @@ function allMarketplaceFeeFields(): array
});
test('late_penalty_amount must be integer', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -519,7 +519,7 @@ function allMarketplaceFeeFields(): array
});
test('late_penalty_amount must not be negative', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -532,7 +532,7 @@ function allMarketplaceFeeFields(): array
});
test('absent_penalty_amount must be integer', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HR, PermissionEnum::SETTINGS_UPDATE_HR);
$this->actingAs($user)
->put(route('admin.system.settings.hr.update'), [
@ -549,7 +549,7 @@ function allMarketplaceFeeFields(): array
describe('Setting Update Homepage', function () {
test('authenticated user can update homepage settings', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
$this->actingAs($user)
->put(route('admin.system.settings.homepage.update'), [])
@ -562,7 +562,7 @@ function allMarketplaceFeeFields(): array
});
test('user without update permission is forbidden', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE);
$this->actingAs($user)
->put(route('admin.system.settings.homepage.update'), [])
@ -570,7 +570,7 @@ function allMarketplaceFeeFields(): array
});
test('hero_image must be an image when provided', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
$this->actingAs($user)
->put(route('admin.system.settings.homepage.update'), [
@ -580,7 +580,7 @@ function allMarketplaceFeeFields(): array
});
test('about_image must be an image when provided', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
$this->actingAs($user)
->put(route('admin.system.settings.homepage.update'), [
@ -590,7 +590,7 @@ function allMarketplaceFeeFields(): array
});
test('gallery_images must be an array of images', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
$this->actingAs($user)
->put(route('admin.system.settings.homepage.update'), [
@ -600,7 +600,7 @@ function allMarketplaceFeeFields(): array
});
test('gallery_images must not exceed 10 items', function () {
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW, PermissionEnum::SETTINGS_UPDATE);
$user = createSettingUserWithPermission(PermissionEnum::SETTINGS_VIEW_HOMEPAGE, PermissionEnum::SETTINGS_UPDATE_HOMEPAGE);
$images = [];
for ($i = 0; $i < 11; $i++) {