feat: update system settings to include media items for logo, favicon, and login cover, enhancing data handling in forms and validation

This commit is contained in:
Yoga Pangestu 2026-07-13 13:04:45 +07:00
parent c8344f27cb
commit 26a10071b2
3 changed files with 22 additions and 12 deletions

View File

@ -39,6 +39,9 @@ public function systemData(): array
'logo_url' => $logo['url'] ?? null, 'logo_url' => $logo['url'] ?? null,
'favicon_url' => $favicon['url'] ?? null, 'favicon_url' => $favicon['url'] ?? null,
'login_cover_url' => $loginCover['url'] ?? null, 'login_cover_url' => $loginCover['url'] ?? null,
'logo' => $logo,
'favicon' => $favicon,
'login_cover' => $loginCover,
]; ];
}); });
} }
@ -57,6 +60,10 @@ function () use ($validated): void {
$settings->address = $validated['address'] ?? null; $settings->address = $validated['address'] ?? null;
$settings->save(); $settings->save();
$hasLogoInput = isset($validated['logo']) || isset($validated['logo_s3_key']);
$hasFaviconInput = isset($validated['favicon']) || isset($validated['favicon_s3_key']);
$hasLoginCoverInput = isset($validated['login_cover']) || isset($validated['login_cover_s3_key']);
$this->syncPhotos( $this->syncPhotos(
$configuration, $configuration,
[ [
@ -92,15 +99,15 @@ function () use ($validated): void {
$errors = []; $errors = [];
if (! $configuration->hasMedia('logo')) { if ($hasLogoInput && ! $configuration->hasMedia('logo')) {
$errors['logo'] = 'Logo wajib diisi.'; $errors['logo'] = 'Logo wajib diisi.';
} }
if (! $configuration->hasMedia('favicon')) { if ($hasFaviconInput && ! $configuration->hasMedia('favicon')) {
$errors['favicon'] = 'Favicon wajib diisi.'; $errors['favicon'] = 'Favicon wajib diisi.';
} }
if (! $configuration->hasMedia('login_cover')) { if ($hasLoginCoverInput && ! $configuration->hasMedia('login_cover')) {
$errors['login_cover'] = 'Cover login wajib diisi.'; $errors['login_cover'] = 'Cover login wajib diisi.';
} }

View File

@ -29,9 +29,9 @@ const form = useForm({
address: props.data.address ?? '', address: props.data.address ?? '',
}); });
const logoState = ref<MediaUploadState>(createMediaUploadState()); const logoState = ref<MediaUploadState>(createMediaUploadState(props.data.logo ? [props.data.logo] : []));
const faviconState = ref<MediaUploadState>(createMediaUploadState()); const faviconState = ref<MediaUploadState>(createMediaUploadState(props.data.favicon ? [props.data.favicon] : []));
const loginCoverState = ref<MediaUploadState>(createMediaUploadState()); const loginCoverState = ref<MediaUploadState>(createMediaUploadState(props.data.login_cover ? [props.data.login_cover] : []));
const isUploading = computed(() => const isUploading = computed(() =>
logoState.value.pendingUploads > 0 || logoState.value.pendingUploads > 0 ||

View File

@ -12,6 +12,12 @@ export type MarketplaceFeeRule = {
value: number; value: number;
}; };
export type MediaItem = {
id: number;
url: string;
thumb_url: string;
};
export type SystemSettingsData = { export type SystemSettingsData = {
app_name: string; app_name: string;
about_app: string; about_app: string;
@ -21,6 +27,9 @@ export type SystemSettingsData = {
logo_url: string; logo_url: string;
favicon_url: string | null; favicon_url: string | null;
login_cover_url: string; login_cover_url: string;
logo: MediaItem | null;
favicon: MediaItem | null;
login_cover: MediaItem | null;
}; };
export type SocialMediaSettingsData = { export type SocialMediaSettingsData = {
@ -54,12 +63,6 @@ export type HrSettingsData = {
absent_penalty_amount: number; absent_penalty_amount: number;
}; };
export type MediaItem = {
id: number;
url: string;
thumb_url: string;
};
export type HomepageSettingsData = { export type HomepageSettingsData = {
hero_image_url: string | null; hero_image_url: string | null;
about_image_url: string | null; about_image_url: string | null;