From 2018860c23f196d4fb6ad2ba3660e5fde85a10ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Thu, 21 May 2026 20:16:32 +0300 Subject: [PATCH] feat: add quarter field to company history items with localization support, enhancing data organization and user experience --- .../Schemas/CompanyHistoryItemForm.php | 17 ++++++++++ .../Tables/CompanyHistoryItemsTable.php | 8 ++++- app/Models/CompanyHistoryItem.php | 8 ++++- ...quarter_to_company_history_items_table.php | 30 +++++++++++++++++ database/seeders/CompanyHistoryItemSeeder.php | 32 +++++++++++++++++- lang/en/company_history.php | 5 +++ lang/tr/company_history.php | 5 +++ .../company-history/timeline.blade.php | 33 +++++++++++++++++-- 8 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2026_05_21_180000_add_quarter_to_company_history_items_table.php diff --git a/app/Filament/Admin/Resources/CompanyHistoryItems/Schemas/CompanyHistoryItemForm.php b/app/Filament/Admin/Resources/CompanyHistoryItems/Schemas/CompanyHistoryItemForm.php index 8af9770..a95ea65 100644 --- a/app/Filament/Admin/Resources/CompanyHistoryItems/Schemas/CompanyHistoryItemForm.php +++ b/app/Filament/Admin/Resources/CompanyHistoryItems/Schemas/CompanyHistoryItemForm.php @@ -26,6 +26,16 @@ class CompanyHistoryItemForm ]; } + public static function quarterOptions(): array + { + return [ + 'Q1' => __('company_history.quarter_q1'), + 'Q2' => __('company_history.quarter_q2'), + 'Q3' => __('company_history.quarter_q3'), + 'Q4' => __('company_history.quarter_q4'), + ]; + } + public static function colorPresets(): array { return [ @@ -52,6 +62,13 @@ class CompanyHistoryItemForm ->minValue(1900) ->maxValue(2100), + Select::make('quarter') + ->label(__('company_history.quarter_field')) + ->options(self::quarterOptions()) + ->default('Q1') + ->required() + ->native(false), + TextInput::make('title') ->label(__('company_history.title_field')) ->required() diff --git a/app/Filament/Admin/Resources/CompanyHistoryItems/Tables/CompanyHistoryItemsTable.php b/app/Filament/Admin/Resources/CompanyHistoryItems/Tables/CompanyHistoryItemsTable.php index 364c2c1..b1e488d 100644 --- a/app/Filament/Admin/Resources/CompanyHistoryItems/Tables/CompanyHistoryItemsTable.php +++ b/app/Filament/Admin/Resources/CompanyHistoryItems/Tables/CompanyHistoryItemsTable.php @@ -25,6 +25,12 @@ class CompanyHistoryItemsTable ->sortable() ->alignCenter(), + TextColumn::make('quarter') + ->label(__('company_history.quarter_field')) + ->badge() + ->sortable() + ->alignCenter(), + ColorColumn::make('color') ->label(__('company_history.color_field')), @@ -88,7 +94,7 @@ class CompanyHistoryItemsTable ->label(__('company_history.force_delete')), ]), ]) - ->defaultSort('sort_order', 'asc') + ->defaultSort('year', 'asc') ->reorderable('sort_order'); } } diff --git a/app/Models/CompanyHistoryItem.php b/app/Models/CompanyHistoryItem.php index 40e9324..21c5384 100644 --- a/app/Models/CompanyHistoryItem.php +++ b/app/Models/CompanyHistoryItem.php @@ -11,8 +11,11 @@ class CompanyHistoryItem extends Model { use HasFactory, SoftDeletes, HasTranslations; + public const QUARTERS = ['Q1', 'Q2', 'Q3', 'Q4']; + protected $fillable = [ 'year', + 'quarter', 'title', 'content', 'color', @@ -43,7 +46,10 @@ class CompanyHistoryItem extends Model public function scopeOrdered($query) { - return $query->orderBy('sort_order', 'asc')->orderBy('year', 'asc'); + return $query + ->orderBy('year', 'asc') + ->orderByRaw("CASE quarter WHEN 'Q1' THEN 1 WHEN 'Q2' THEN 2 WHEN 'Q3' THEN 3 WHEN 'Q4' THEN 4 ELSE 5 END") + ->orderBy('sort_order', 'asc'); } public function getResolvedPositionAttribute(): string diff --git a/database/migrations/2026_05_21_180000_add_quarter_to_company_history_items_table.php b/database/migrations/2026_05_21_180000_add_quarter_to_company_history_items_table.php new file mode 100644 index 0000000..1d99266 --- /dev/null +++ b/database/migrations/2026_05_21_180000_add_quarter_to_company_history_items_table.php @@ -0,0 +1,30 @@ +string('quarter', 2)->default('Q1')->after('year'); + $table->index(['year', 'quarter']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('company_history_items', function (Blueprint $table) { + $table->dropIndex(['year', 'quarter']); + $table->dropColumn('quarter'); + }); + } +}; diff --git a/database/seeders/CompanyHistoryItemSeeder.php b/database/seeders/CompanyHistoryItemSeeder.php index 0c3a2aa..456cf0d 100644 --- a/database/seeders/CompanyHistoryItemSeeder.php +++ b/database/seeders/CompanyHistoryItemSeeder.php @@ -15,6 +15,7 @@ class CompanyHistoryItemSeeder extends Seeder $items = [ [ 'year' => 2014, + 'quarter' => 'Q1', 'title' => 'Kuruluş', 'content' => 'Trunçgil Teknoloji, 2014 yılında Ümit Tunç tarafından Gaziantep\'te kuruldu.', 'color' => '#17a2b8', @@ -33,6 +34,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2015, + 'quarter' => 'Q1', 'title' => 'Akademik Altyapı', 'content' => 'E-SER Akademik Yayın Evi ile çözüm ortaklığı kurarak indeksli dergiler için akademik yayın altyapısı geliştirdi.', 'color' => '#f5a623', @@ -51,6 +53,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2016, + 'quarter' => 'Q1', 'title' => 'İlk İhracat', 'content' => 'İlk ihracatini gerçekleştirerek e-ticaret alanında Amerika Birleşik Devletleri\'nin New Jersey eyaletinde faaliyet göstermeye başladı.', 'color' => '#e91e63', @@ -69,6 +72,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2017, + 'quarter' => 'Q1', 'title' => 'TRDoktor.com', 'content' => 'TRDoktor.com iş birliğiyle Türkiye genelinde aylık bir milyondan fazla kullanıcıya hizmet veren dijital sağlık altyapısına katkı sağladı.', 'color' => '#2c3e50', @@ -87,6 +91,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2018, + 'quarter' => 'Q1', 'title' => 'Eğitim Teknolojileri', 'content' => 'Amerikan Kültür Koleji\'nin eğitim altyapısında kullanılmak üzere kurumsal eğitim uygulamaları geliştirdi.', 'color' => '#5dade2', @@ -105,6 +110,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2019, + 'quarter' => 'Q1', 'title' => 'Gaziantep Teknopark', 'content' => 'Gaziantep Teknopark bünyesinde Ar-Ge ve yazılım geliştirme faaliyetlerini sürdürecek şekilde şube açtı.', 'color' => '#27ae60', @@ -123,6 +129,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2019, + 'quarter' => 'Q2', 'title' => 'HERE Maps Hackathon', 'content' => 'Almanya menşeli HERE Maps\'in Türkiye genelinde düzenlediği hackathon\'da birincilik ödülünü kazandı; konum teknolojileri alanındaki yetkinliğimizi ulusal düzeyde tescilledik.', 'color' => '#1abc9c', @@ -141,6 +148,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2020, + 'quarter' => 'Q1', 'title' => 'Otto Planner 2020', 'content' => 'Almanya\'nın Bochum kentinde faaliyet gösteren P-D Refractories GmbH için Otto Planner 2020 uygulamasını geliştirdi ve şirketin dijital dönüşüm sürecini başlattı.', 'color' => '#8e44ad', @@ -159,6 +167,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2021, + 'quarter' => 'Q1', 'title' => 'IoT Dashboard', 'content' => 'Olimpiyat Otomasyon iş birliğiyle, endüstriyel PLC ve benzeri cihazların uzaktan yönetimi ve kontrolünü sağlayan; RS232 ve WebSocket standartları üzerinden haberleşen IoT Dashboard uygulaması geliştirildi. Nesnelerin İnterneti (IoT) kapsamındaki bu çözüm, Trunçgil Smart altyapısı üzerinde hazırlanmıştır.', 'color' => '#6c5ce7', @@ -177,6 +186,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2021, + 'quarter' => 'Q2', 'title' => 'PDLC Smart Glass', 'content' => 'Hollanda\'da faaliyet gösteren HaHa Group BV için PDLC Smart Glass ürünlerine yönelik e-ticaret altyapısı ve dijital satış kanalları geliştirildi.', 'color' => '#2980b9', @@ -195,6 +205,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2022, + 'quarter' => 'Q1', 'title' => 'Dijimind Akademi', 'content' => 'Dijimind Akademi ile eğitim teknolojileri alanında dijital öğrenme platformları ve akademik içerik altyapısı çözümleri geliştirdi.', 'color' => '#16a085', @@ -213,6 +224,7 @@ class CompanyHistoryItemSeeder extends Seeder ], [ 'year' => 2023, + 'quarter' => 'Q1', 'title' => 'Stellar Construction', 'content' => 'Rusya\'nın Moskova merkezli, endüstriyel inşaat alanında faaliyet gösteren Ant Yapı ortaklığına sahip Stellar Construction için QA, QC ve QMS (kalite yönetim sistemi) uygulaması geliştirildi. Proje, Rusya\'nın çeşitli şantiye sahalarında başarılı bir şekilde kullanılmaktadır.', 'color' => '#c0392b', @@ -236,7 +248,11 @@ class CompanyHistoryItemSeeder extends Seeder unset($itemData['translations']); $item = CompanyHistoryItem::updateOrCreate( - ['year' => $itemData['year'], 'sort_order' => $itemData['sort_order']], + [ + 'year' => $itemData['year'], + 'quarter' => $itemData['quarter'] ?? 'Q1', + 'sort_order' => $itemData['sort_order'], + ], array_merge($itemData, ['is_active' => true, 'position' => null]) ); @@ -252,5 +268,19 @@ class CompanyHistoryItemSeeder extends Seeder ->where('year', 2019) ->where('title', 'Teknopark ve Hackathon') ->delete(); + + // Sıra numarası değişince kalan eski kayıtları temizle (yinelenen maddeleri önler) + $expectedKeys = collect($items) + ->map(fn (array $item): string => $item['year'] . ':' . ($item['quarter'] ?? 'Q1') . ':' . $item['sort_order']) + ->flip(); + + CompanyHistoryItem::query() + ->get() + ->each(function (CompanyHistoryItem $item) use ($expectedKeys): void { + $key = $item->year . ':' . ($item->quarter ?? 'Q1') . ':' . $item->sort_order; + if (!$expectedKeys->has($key)) { + $item->delete(); + } + }); } } diff --git a/lang/en/company_history.php b/lang/en/company_history.php index 7eae955..186cb92 100644 --- a/lang/en/company_history.php +++ b/lang/en/company_history.php @@ -17,6 +17,11 @@ return [ 'settings_section' => 'Appearance & Settings', 'year_field' => 'Year', + 'quarter_field' => 'Quarter', + 'quarter_q1' => 'Q1 (Jan – Mar)', + 'quarter_q2' => 'Q2 (Apr – Jun)', + 'quarter_q3' => 'Q3 (Jul – Sep)', + 'quarter_q4' => 'Q4 (Oct – Dec)', 'title_field' => 'Title', 'content_field' => 'Description', 'color_field' => 'Color', diff --git a/lang/tr/company_history.php b/lang/tr/company_history.php index da21521..0d2fbc9 100644 --- a/lang/tr/company_history.php +++ b/lang/tr/company_history.php @@ -17,6 +17,11 @@ return [ 'settings_section' => 'Görünüm ve Ayarlar', 'year_field' => 'Yıl', + 'quarter_field' => 'Çeyrek', + 'quarter_q1' => 'Q1 (Ocak – Mart)', + 'quarter_q2' => 'Q2 (Nisan – Haziran)', + 'quarter_q3' => 'Q3 (Temmuz – Eylül)', + 'quarter_q4' => 'Q4 (Ekim – Aralık)', 'title_field' => 'Başlık', 'content_field' => 'Açıklama', 'color_field' => 'Renk', diff --git a/resources/views/components/company-history/timeline.blade.php b/resources/views/components/company-history/timeline.blade.php index 1ea7ffe..d3d9d6c 100644 --- a/resources/views/components/company-history/timeline.blade.php +++ b/resources/views/components/company-history/timeline.blade.php @@ -64,7 +64,12 @@
-
{{ $item->year }}
+
+ {{ $item->year }} + @if($item->quarter) + {{ $item->quarter }} + @endif +
@if($titleUpper)

{{ $titleUpper }}

@endif @@ -212,13 +217,37 @@ .company-history-timeline__year { font-family: var(--ch-font-year); + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.5rem 0.75rem; + margin-bottom: 0.35rem; + } + + .company-history-timeline__year-value { font-size: clamp(2.1rem, 4.2vw, 3rem); font-weight: 800; line-height: 1; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; color: var(--item-color); - margin-bottom: 0.35rem; + } + + .company-history-timeline__quarter { + font-family: var(--ch-font-label); + font-size: 0.95rem; + font-weight: 600; + letter-spacing: 0.08em; + color: var(--item-color); + opacity: 0.85; + padding: 0.15rem 0.55rem; + border: 2px solid var(--item-color); + border-radius: 0.35rem; + line-height: 1.2; + } + + .company-history-timeline__item--left .company-history-timeline__year { + justify-content: flex-end; } .company-history-timeline__title {