feat: add quarter field to company history items with localization support, enhancing data organization and user experience
This commit is contained in:
@@ -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()
|
||||
|
||||
+7
-1
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('company_history_items', function (Blueprint $table) {
|
||||
$table->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');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -64,7 +64,12 @@
|
||||
|
||||
<div class="company-history-timeline__side company-history-timeline__side--inner">
|
||||
<div class="company-history-timeline__content">
|
||||
<div class="company-history-timeline__year">{{ $item->year }}</div>
|
||||
<div class="company-history-timeline__year">
|
||||
<span class="company-history-timeline__year-value">{{ $item->year }}</span>
|
||||
@if($item->quarter)
|
||||
<span class="company-history-timeline__quarter">{{ $item->quarter }}</span>
|
||||
@endif
|
||||
</div>
|
||||
@if($titleUpper)
|
||||
<h3 class="company-history-timeline__title">{{ $titleUpper }}</h3>
|
||||
@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 {
|
||||
|
||||
Reference in New Issue
Block a user