Update Koperasi

This commit is contained in:
2026-11-06 22:38:45 +07:00
parent 6232b28e11
commit cb36682d9e
79 changed files with 4639 additions and 1378 deletions
@@ -0,0 +1,8 @@
<div class="mt-4 text-end">
<div class="d-inline-flex flex-wrap justify-content-end gap-2">
<a href="{{ route('koperasi.pengurus.index') }}" class="btn btn-secondary wave-effect wave-light">Kembali</a>
<button type="submit" class="btn btn-success data-submit wave-effect wave-light">
<i class="icon-base ti tabler-check me-1_5 icon-sm" aria-hidden="true"></i> Simpan
</button>
</div>
</div>
@@ -0,0 +1,12 @@
@if(session('success'))
<div class="alert alert-success" role="status">{{ session('success') }}</div>
@endif
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@@ -0,0 +1,99 @@
@props(['summary'])
<section class="card koperasi-profile-summary mb-4" id="koperasi-profile-summary" aria-label="Ringkasan profil koperasi">
<div class="card-body p-3 p-lg-4">
<div class="row g-3 align-items-start">
<div class="col-12 col-lg-5">
<div class="d-flex align-items-start gap-3">
<span class="avatar flex-shrink-0" aria-hidden="true">
<span class="avatar-initial rounded bg-label-primary">
<i class="icon-base ti tabler-building-store icon-22px"></i>
</span>
</span>
<div class="koperasi-summary-content">
<h5 class="mb-1 text-break" data-summary-field="judul">{{ $summary['judul'] }}</h5>
<p class="small text-muted mb-1 text-break" data-summary-field="alamat">
<i class="icon-base ti tabler-map-pin icon-16px me-1" aria-hidden="true"></i>{{ $summary['alamat'] }}
</p>
<p class="small mb-2 text-break"><span class="text-muted">Tahun Berdiri:</span> <span data-summary-field="tahun_berdiri">{{ $summary['tahun_berdiri'] }}</span></p>
</div>
</div>
</div>
<div class="col-12 col-lg-7">
<div class="row g-3">
<div class="col-12 col-sm-6">
<p class="koperasi-summary-label mb-1">Jenis Koperasi</p>
<span class="badge bg-label-primary" data-summary-field="jenis">{{ $summary['jenis'] }}</span>
</div>
<div class="col-12 col-sm-6" data-summary-field="layanan">
<p class="koperasi-summary-label mb-1">Layanan Utama</p>
@if(count($summary['layanan']))
<div class="d-flex flex-wrap align-items-start gap-2">
@foreach(array_slice($summary['layanan'], 0, 2) as $item)
<span class="badge bg-label-primary">{{ $item }}</span>
@endforeach
@if(count($summary['layanan']) > 2)
<button class="btn btn-sm btn-text-primary p-0 koperasi-summary-more" type="button" data-bs-toggle="collapse" data-bs-target="#koperasi-summary-extra-layanan" aria-expanded="false" aria-controls="koperasi-summary-extra-layanan">+{{ count($summary['layanan']) - 2 }} lainnya</button>
@endif
</div>
@if(count($summary['layanan']) > 2)
<div class="collapse" id="koperasi-summary-extra-layanan">
<div class="d-flex flex-wrap gap-2 pt-2">
@foreach(array_slice($summary['layanan'], 2) as $item)
<span class="badge bg-label-primary">{{ $item }}</span>
@endforeach
</div>
</div>
@endif
@else
<p class="small mb-0 text-muted">Belum terisi</p>
@endif
</div>
<div class="col-12 col-sm-6">
<p class="koperasi-summary-label mb-1">Total Anggota (2025)</p>
<span class="fw-medium text-break" data-summary-field="anggota">{{ $summary['anggota'] }}</span>
@if($summary['anggota_rincian'])<p class="small text-muted mb-0 text-break">{{ $summary['anggota_rincian'] }}</p>@endif
</div>
<div class="col-12 col-sm-6">
<p class="koperasi-summary-label mb-1">Total Pengurus</p>
<span class="fw-medium text-break" data-summary-field="pengurus">{{ $summary['pengurus'] }}</span>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer border-top p-3 py-lg-2 px-lg-4">
<div class="row gy-3">
@foreach(['responden' => ['Nama Responden', 'user'], 'jabatan' => ['Jabatan Responden', 'briefcase'], 'kontak' => ['Kontak Responden', 'phone']] as $field => [$label, $icon])
<div class="col-sm-6 col-lg-3 d-flex align-items-center">
<span class="avatar avatar-sm me-2 flex-shrink-0" aria-hidden="true">
<span class="avatar-initial rounded-circle bg-label-primary">
<i class="icon-base ti tabler-{{ $icon }} icon-16px"></i>
</span>
</span>
<div class="koperasi-summary-content">
<p class="koperasi-summary-label mb-0">{{ $label }}</p>
<span class="fw-medium small text-break" data-summary-field="{{ $field }}">{{ $summary[$field] }}</span>
</div>
</div>
@endforeach
<div class="col-sm-6 col-lg-3 d-flex align-items-center">
<span class="avatar avatar-sm me-2 flex-shrink-0" aria-hidden="true">
<span class="avatar-initial rounded-circle bg-label-primary">
<i class="icon-base ti tabler-calendar-event icon-16px"></i>
</span>
</span>
<div class="koperasi-summary-content">
<p class="koperasi-summary-label mb-0">Diperbarui</p>
<span class="fw-medium small text-break" data-summary-field="diperbarui">
@if($summary['diperbarui'])
<time datetime="{{ $summary['diperbarui']->toIso8601String() }}">{{ $summary['diperbarui']->locale('id')->translatedFormat('d M Y, H:i') }}</time>
@else
{{ $summary['tersimpan'] ? 'Belum terisi' : 'Belum tersimpan' }}
@endif
</span>
</div>
</div>
</div>
</div>
</section>
@@ -0,0 +1,6 @@
@props(['name', 'value' => null, 'showError' => true])
<input type="text" inputmode="numeric" data-koperasi-rupiah name="{{ $name }}"
value="{{ \App\Services\Koperasi\PengurusKoperasiService::formatRupiah($value) }}"
{{ $attributes->class(['form-control', 'is-invalid' => $errors->has($name)]) }}>
@if($showError)@error($name)<div class="invalid-feedback">{{ $message }}</div>@enderror @endif
@@ -0,0 +1,61 @@
@props([
'model', 'name', 'label', 'options' => [], 'multiple' => false,
'type' => 'text', 'placeholder' => null, 'exclusiveValue' => null, 'help' => null,
'policy' => null, 'min' => 0, 'max' => null, 'unit' => null,
])
@php
$value = old($name, $model->{$name});
$id = 'koperasi-' . str_replace('_', '-', $name);
$policy ??= app(\App\Services\Koperasi\OperasionalKoperasiService::class);
$data = array_replace($model->getAttributes(), session()->getOldInput());
$visible = $policy->active($name, $data, $policy->context($model));
$required = $visible && in_array($name, $policy->requiredFields(), true);
$error = $errors->first($name) ?: $errors->first($name . '.*');
@endphp
<div {{ $attributes->class(['mb-4', 'form-control-validation', 'd-none' => !$visible]) }}
data-koperasi-survey-field="{{ $name }}" data-koperasi-conditions="{{ json_encode($policy->dependencies()[$name] ?? []) }}"
@if($exclusiveValue) data-koperasi-exclusive="{{ $exclusiveValue }}" @endif>
@if($multiple)
<fieldset>
<legend class="form-label mb-3">{{ $label }} <span class="text-danger {{ $required ? '' : 'd-none' }}" data-koperasi-required-indicator>*</span></legend>
<div class="row g-2">
@foreach($options as $option)
<div class="col-md-6">
<div class="form-check">
<input type="checkbox" class="form-check-input {{ $error ? 'is-invalid' : '' }}" id="{{ $id }}-{{ $loop->index }}" name="{{ $name }}[]" value="{{ $option->value }}"
@checked(\App\Services\Koperasi\PengurusKoperasiService::hasSelection($value, $option->value)) @disabled(!$visible)>
<label class="form-check-label" for="{{ $id }}-{{ $loop->index }}">{{ $option->label() }}</label>
@if(method_exists($option, 'description') && $option->description())<div class="form-text mt-0">{{ $option->description() }}</div>@endif
</div>
</div>
@endforeach
</div>
</fieldset>
@else
<label class="form-label" for="{{ $id }}">{{ $label }} <span class="text-danger {{ $required ? '' : 'd-none' }}" data-koperasi-required-indicator>*</span></label>
@if($options)
<select class="form-select {{ $error ? 'is-invalid' : '' }}" id="{{ $id }}" name="{{ $name }}" @disabled(!$visible) @required($required)>
<option value="">Pilih {{ $label }}</option>
@foreach($options as $option)
<option value="{{ $option->value }}" @selected(\App\Services\Koperasi\PengurusKoperasiService::hasSelection($value, $option->value))>{{ $option->label() }}</option>
@endforeach
</select>
@elseif($type === 'textarea')
<textarea class="form-control {{ $error ? 'is-invalid' : '' }}" id="{{ $id }}" name="{{ $name }}" rows="3" placeholder="{{ $placeholder }}" @disabled(!$visible) @required($required)>{{ $value }}</textarea>
@else
@if($unit || $type === 'rupiah')<div class="input-group">@endif
@if($type === 'rupiah')
<span class="input-group-text">Rp</span>
<x-koperasi-rupiah :name="$name" :value="$value" :id="$id" :disabled="!$visible" :required="$required" :show-error="false" placeholder="{{ $placeholder }}" />
@else
<input type="{{ $type }}" class="form-control {{ $error ? 'is-invalid' : '' }}" id="{{ $id }}" name="{{ $name }}" value="{{ $value }}" placeholder="{{ $placeholder }}" @if($type === 'number') min="{{ $min }}" @if($max !== null) max="{{ $max }}" @endif @endif @disabled(!$visible) @required($required)>
@endif
@if($unit)<span class="input-group-text">{{ $unit }}</span>@endif
@if($unit || $type === 'rupiah')</div>@endif
@endif
@endif
@if($help)<div class="form-text">{{ $help }}</div>@endif
@if($error)<div class="invalid-feedback d-block">{{ $error }}</div>@endif
</div>