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,
'favicon_url' => $favicon['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->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(
$configuration,
[
@ -92,15 +99,15 @@ function () use ($validated): void {
$errors = [];
if (! $configuration->hasMedia('logo')) {
if ($hasLogoInput && ! $configuration->hasMedia('logo')) {
$errors['logo'] = 'Logo wajib diisi.';
}
if (! $configuration->hasMedia('favicon')) {
if ($hasFaviconInput && ! $configuration->hasMedia('favicon')) {
$errors['favicon'] = 'Favicon wajib diisi.';
}
if (! $configuration->hasMedia('login_cover')) {
if ($hasLoginCoverInput && ! $configuration->hasMedia('login_cover')) {
$errors['login_cover'] = 'Cover login wajib diisi.';
}

View File

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

View File

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