Compare commits
1 Commits
main
...
15c8d3ae7c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
15c8d3ae7c |
@@ -23,7 +23,7 @@ class RateCardProfile extends Model
|
|||||||
public static function getSingleton(): self
|
public static function getSingleton(): self
|
||||||
{
|
{
|
||||||
return static::firstOrCreate([], [
|
return static::firstOrCreate([], [
|
||||||
'owner_name' => config('app.name', 'KOL Manager'),
|
'owner_name' => config('app.name', 'Cathy Page'),
|
||||||
'bg_color' => '#FFF8F0',
|
'bg_color' => '#FFF8F0',
|
||||||
'accent_color' => '#FFB7C5',
|
'accent_color' => '#FFB7C5',
|
||||||
'text_color' => '#374151',
|
'text_color' => '#374151',
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class EmailNotifier
|
|||||||
|
|
||||||
Mail::raw($combined, function ($mail) use ($toEmail, $setting): void {
|
Mail::raw($combined, function ($mail) use ($toEmail, $setting): void {
|
||||||
$mail->to($toEmail)
|
$mail->to($toEmail)
|
||||||
->subject("🐱 KOL Manager — {$setting->name} Notifications");
|
->subject("🐱 Cathy's App — {$setting->name} Notifications");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class WahaNotifier
|
|||||||
{
|
{
|
||||||
$this->send(
|
$this->send(
|
||||||
$setting,
|
$setting,
|
||||||
"🐱 *KOL Manager — Test Notification*\n\nYour WhatsApp channel is configured correctly! 🎉"
|
"🐱 *Cathy's App — Test Notification*\n\nYour WhatsApp channel is configured correctly! 🎉"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
package-lock.json
generated
2
package-lock.json
generated
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "KOL-Manager",
|
"name": "app",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<label class="block text-xs font-semibold text-gray-600 mb-1">Name <span class="text-pink-400">*</span></label>
|
<label class="block text-xs font-semibold text-gray-600 mb-1">Name <span class="text-pink-400">*</span></label>
|
||||||
<input type="text" name="name" required maxlength="100"
|
<input type="text" name="name" required maxlength="100"
|
||||||
placeholder="e.g. Energy Drinks"
|
placeholder="e.g. Susu Formula"
|
||||||
class="input-soft" value="{{ old('name') }}">
|
class="input-soft" value="{{ old('name') }}">
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<label class="block text-xs font-semibold text-gray-600 mb-1">Contract Title <span class="text-pink-400">*</span></label>
|
<label class="block text-xs font-semibold text-gray-600 mb-1">Contract Title <span class="text-pink-400">*</span></label>
|
||||||
<input type="text" name="title" required maxlength="255"
|
<input type="text" name="title" required maxlength="255"
|
||||||
placeholder="e.g. Exclusive – Energy Drinks 2025"
|
placeholder="e.g. Exclusive – Susu Formula 2026"
|
||||||
class="input-soft" value="{{ old('title') }}">
|
class="input-soft" value="{{ old('title') }}">
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="theme-color" content="#FFB7C5">
|
<meta name="theme-color" content="#FFB7C5">
|
||||||
<title>KOL Manager — Login</title>
|
<title>Cathy's App - Login</title>
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
||||||
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
{{-- Logo / header --}}
|
{{-- Logo / header --}}
|
||||||
<div class="text-center mb-8 select-none">
|
<div class="text-center mb-8 select-none">
|
||||||
<div class="text-7xl mb-3 inline-block animate-bounce" style="animation-duration:2s">🐱</div>
|
<div class="text-7xl mb-3 inline-block animate-bounce" style="animation-duration:2s">🐱</div>
|
||||||
<h1 class="text-2xl font-extrabold text-pink-500 leading-tight">KOL Manager</h1>
|
<h1 class="text-2xl font-extrabold text-pink-500 leading-tight">Cathy's App</h1>
|
||||||
<p class="text-sm text-gray-400 mt-1">Your Purr-fect Assistant</p>
|
<p class="text-sm text-gray-400 mt-1">Your Purr-fect Assistant</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
</td>
|
</td>
|
||||||
@endif
|
@endif
|
||||||
<td style="vertical-align:middle;">
|
<td style="vertical-align:middle;">
|
||||||
<div class="logo-name">{{ $invoiceSettings->header_name ?: 'KOL Manager' }}</div>
|
<div class="logo-name">{{ $invoiceSettings->header_name ?: 'Cathy' }}</div>
|
||||||
<div class="logo-sub">{{ $invoiceSettings->header_title ?: 'Personal Talent Assistant' }}</div>
|
<div class="logo-sub">{{ $invoiceSettings->header_title ?: 'Personal Talent Assistant' }}</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="text-xl font-extrabold"
|
<div class="text-xl font-extrabold"
|
||||||
style="color:{{ $invoiceSettings->accent_color ?? '#FFB7C5' }}">
|
style="color:{{ $invoiceSettings->accent_color ?? '#FFB7C5' }}">
|
||||||
{{ $invoiceSettings->header_name ?: '🐱 KOL Manager' }}
|
{{ $invoiceSettings->header_name ?: '🐱 Cathy' }}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm text-gray-400 mt-0.5">
|
<div class="text-sm text-gray-400 mt-0.5">
|
||||||
{{ $invoiceSettings->header_title ?: 'Personal Talent Assistant' }}
|
{{ $invoiceSettings->header_title ?: 'Personal Talent Assistant' }}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
class="flex items-center gap-3 group focus:outline-none">
|
class="flex items-center gap-3 group focus:outline-none">
|
||||||
<span class="text-3xl transition-transform duration-200 group-hover:scale-110 group-active:scale-95 select-none">🐱</span>
|
<span class="text-3xl transition-transform duration-200 group-hover:scale-110 group-active:scale-95 select-none">🐱</span>
|
||||||
<div class="text-left">
|
<div class="text-left">
|
||||||
<div class="text-lg font-extrabold text-pink-500 leading-tight">KOL Manager</div>
|
<div class="text-lg font-extrabold text-pink-500 leading-tight">Cathy's App</div>
|
||||||
<div class="text-xs text-gray-400">Your Purr-fect Assistant</div>
|
<div class="text-xs text-gray-400">Your Purr-fect Assistant</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
{{-- ── Global Search bar ─────────────────────────── --}}
|
{{-- ── Global Search bar ─────────────────────────── --}}
|
||||||
<div class="flex-1 min-w-0" x-show="searchOpen" x-transition style="display:none">
|
<div class="flex-1 min-w-0" x-show="searchOpen" x-transition style="display:none">
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none">🔍</span>
|
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none"></span>
|
||||||
<input
|
<input
|
||||||
id="global-search-input"
|
id="global-search-input"
|
||||||
type="text"
|
type="text"
|
||||||
@@ -235,11 +235,13 @@
|
|||||||
<span x-text="searchOpen ? '✕' : '🔍'" class="text-sm lg:text-base"></span>
|
<span x-text="searchOpen ? '✕' : '🔍'" class="text-sm lg:text-base"></span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
<!--
|
||||||
{{-- Avatar --}}
|
{{-- Avatar --}}
|
||||||
<div class="w-8 h-8 lg:w-9 lg:h-9 rounded-full flex items-center justify-center text-white font-bold text-xs lg:text-sm shadow-sm"
|
<div class="w-8 h-8 lg:w-9 lg:h-9 rounded-full flex items-center justify-center text-white font-bold text-xs lg:text-sm shadow-sm"
|
||||||
style="background: linear-gradient(135deg, #FFB7C5, #E8D5F5);">
|
style="background: linear-gradient(135deg, #FFB7C5, #E8D5F5);">
|
||||||
FUN
|
FUN
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
{{-- Search --}}
|
{{-- Search --}}
|
||||||
<div class="relative flex-1 max-w-xs">
|
<div class="relative flex-1 max-w-xs">
|
||||||
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none">🔍</span>
|
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none"></span>
|
||||||
<input type="text" x-model="searchQuery" placeholder="Search notes…"
|
<input type="text" x-model="searchQuery" placeholder="🔍Search notes…"
|
||||||
class="input-soft pl-9 text-sm py-2 w-full">
|
class="input-soft pl-9 text-sm py-2 w-full">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -52,19 +52,19 @@
|
|||||||
<div>
|
<div>
|
||||||
<label class="block text-xs font-semibold text-gray-600 mb-1">Instagram Handle</label>
|
<label class="block text-xs font-semibold text-gray-600 mb-1">Instagram Handle</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none">@</span>
|
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none"></span>
|
||||||
<input type="text" name="ig_handle"
|
<input type="text" name="ig_handle"
|
||||||
value="{{ old('ig_handle', $profile->ig_handle) }}"
|
value="{{ old('ig_handle', $profile->ig_handle) }}"
|
||||||
class="input-soft pl-7" placeholder="yourhandle">
|
class="input-soft pl-7" placeholder="@yourhandle">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-xs font-semibold text-gray-600 mb-1">TikTok Handle</label>
|
<label class="block text-xs font-semibold text-gray-600 mb-1">TikTok Handle</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none">@</span>
|
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-sm pointer-events-none"></span>
|
||||||
<input type="text" name="tiktok_handle"
|
<input type="text" name="tiktok_handle"
|
||||||
value="{{ old('tiktok_handle', $profile->tiktok_handle) }}"
|
value="{{ old('tiktok_handle', $profile->tiktok_handle) }}"
|
||||||
class="input-soft pl-7" placeholder="yourhandle">
|
class="input-soft pl-7" placeholder="@yourhandle">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sm:col-span-2">
|
<div class="sm:col-span-2">
|
||||||
|
|||||||
@@ -61,10 +61,10 @@
|
|||||||
<a href="{{ $profile->whatsappUrl }}" target="_blank" class="contact-pill">📱 WhatsApp</a>
|
<a href="{{ $profile->whatsappUrl }}" target="_blank" class="contact-pill">📱 WhatsApp</a>
|
||||||
@endif
|
@endif
|
||||||
@if($profile->ig_handle)
|
@if($profile->ig_handle)
|
||||||
<a href="https://instagram.com/{{ ltrim($profile->ig_handle, '@') }}" target="_blank" class="contact-pill">📸 @{{ $profile->ig_handle }}</a>
|
<a href="https://instagram.com/{{ ltrim($profile->ig_handle, '@') }}" target="_blank" class="contact-pill">📸 {{ '@' . ltrim($profile->ig_handle, '@') }}</a>
|
||||||
@endif
|
@endif
|
||||||
@if($profile->tiktok_handle)
|
@if($profile->tiktok_handle)
|
||||||
<a href="https://tiktok.com/@{{ ltrim($profile->tiktok_handle, '@') }}" target="_blank" class="contact-pill">🎵 @{{ $profile->tiktok_handle }}</a>
|
<a href="https://tiktok.com/{{ ltrim($profile->tiktok_handle, '@') }}" target="_blank" class="contact-pill">🎵 {{ '@' . ltrim($profile->tiktok_handle, '@') }}</a>
|
||||||
@endif
|
@endif
|
||||||
@if($profile->youtube_handle)
|
@if($profile->youtube_handle)
|
||||||
<a href="https://youtube.com/{{ $profile->youtube_handle }}" target="_blank" class="contact-pill">▶️ {{ $profile->youtube_handle }}</a>
|
<a href="https://youtube.com/{{ $profile->youtube_handle }}" target="_blank" class="contact-pill">▶️ {{ $profile->youtube_handle }}</a>
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
{{ $profile->custom_footer ?: 'Prices may vary. Contact for custom packages. 🐾' }}
|
{{ $profile->custom_footer ?: 'Prices may vary. Contact for custom packages. 🐾' }}
|
||||||
<br>Generated by KOL Manager · {{ now()->format('Y') }}
|
<br>Generated by Cathy's App · {{ now()->format('Y-M-D') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Artisan::command('notifications:dispatch', function () {
|
|||||||
$dispatcher = app(NotificationDispatcher::class);
|
$dispatcher = app(NotificationDispatcher::class);
|
||||||
$dispatcher->dispatchAll();
|
$dispatcher->dispatchAll();
|
||||||
$this->info('🔔 Notifications dispatched.');
|
$this->info('🔔 Notifications dispatched.');
|
||||||
})->purpose('Send all pending KOL Manager notifications');
|
})->purpose('Send all pending Cathy notifications');
|
||||||
|
|
||||||
// Run every hour automatically
|
// Run every hour automatically
|
||||||
Schedule::command('notifications:dispatch')->hourly();
|
Schedule::command('notifications:dispatch')->hourly();
|
||||||
|
|||||||
Reference in New Issue
Block a user