refactor(frontend): complete PrimeVue Timeline and Button adapter wrappers for AuditTimeline and AddressEditor
Validators (Pushes and Pull Requests) / UI & Storage Validation (push) Failing after 10s
Validators (Pushes and Pull Requests) / Database & Schema Validation (push) Successful in 10s
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (push) Failing after 19s
Validators (Pushes and Pull Requests) / Security & Secrets (push) Successful in 9s
Validators (Pushes and Pull Requests) / WBS & Audit Validations (push) Has been skipped
Validators (Pushes and Pull Requests) / .NET Contracts (push) Has been skipped
Validators (Pushes and Pull Requests) / CI Workflow Lint (push) Failing after 10s
Validators (Pushes and Pull Requests) / Calibration & Performance (push) Has been skipped
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (push) Has been skipped
Validators (Pushes and Pull Requests) / Notify PR Results (push) Has been skipped

This commit is contained in:
2026-07-26 02:49:36 +09:00
parent af3b1c72aa
commit 3df5f7b95f
2 changed files with 34 additions and 50 deletions
@@ -1,17 +1,22 @@
<!-- Business Composite Component Layer --> <!-- PrimeVue Adapter Wrapper: AddressEditor -->
<template> <template>
<div class="business-address-editor border rounded p-4 bg-slate-50"> <div class="business-address-editor border rounded p-4 bg-slate-50 flex flex-col gap-2">
<h4 class="font-bold text-sm text-slate-800 mb-2">주소 편집기 (AddressEditor)</h4> <h4 class="font-bold text-xs text-slate-800 flex items-center gap-1">
<div class="flex gap-2 mb-2"> <span>📍</span> 주소 편집기 (AddressEditor)
<input type="text" :value="postalCode" placeholder="우편번호" readonly class="w-32 border px-2 py-1 bg-white text-xs" /> </h4>
<button type="button" class="bg-blue-600 text-white text-xs px-3 py-1 rounded" @click="$emit('search-postal')">우편번호 검색</button> <div class="flex gap-2">
<InputText :modelValue="postalCode" placeholder="우편번호" readonly class="w-32 h-8 text-xs font-mono bg-white border-slate-300" />
<Button label="우편번호 검색" icon="pi pi-search" class="p-button-sm p-button-primary text-xs h-8 px-3" @click="$emit('search-postal')" />
</div> </div>
<input type="text" :value="address1" placeholder="기본주소" readonly class="w-full border px-2 py-1 bg-white text-xs mb-2" /> <InputText :modelValue="address1" placeholder="기본주소" readonly class="w-full h-8 text-xs bg-white border-slate-300" />
<input type="text" :value="address2" placeholder="상세주소 입력" class="w-full border px-2 py-1 bg-white text-xs" @input="$emit('update:address2', ($event.target as HTMLInputElement).value)" /> <InputText :modelValue="address2" placeholder="상세주소 입력" class="w-full h-8 text-xs bg-white border-slate-300" @update:modelValue="$emit('update:address2', $event || '')" />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import InputText from 'primevue/inputtext';
import Button from 'primevue/button';
defineProps<{ defineProps<{
postalCode?: string; postalCode?: string;
address1?: string; address1?: string;
@@ -1,6 +1,25 @@
<!-- AuditTimeline.vue --> <!-- PrimeVue Timeline Adapter Wrapper: AuditTimeline -->
<template>
<div class="audit-timeline-section p-3 border-t border-slate-200 mt-2 bg-slate-50 rounded" v-if="auditHistory && auditHistory.length > 0">
<h5 class="text-xs font-bold text-slate-700 mb-2 flex items-center gap-1">
<span>🕒</span> 변경 감사 이력 타임라인 (Audit Trail)
</h5>
<Timeline :value="auditHistory" class="customized-timeline text-xs">
<template #content="slotProps">
<div class="flex items-center gap-2 text-xs py-0.5">
<span class="font-mono font-bold text-blue-600 text-[11px]">{{ slotProps.item.timestamp }}</span>
<span class="font-bold text-slate-800 text-[11px]">[{{ slotProps.item.user }}]</span>
<span class="text-slate-600 text-[11px]">{{ slotProps.item.change }}</span>
</div>
</template>
</Timeline>
</div>
</template>
<script setup lang="ts"> <script setup lang="ts">
interface AuditLog { import Timeline from 'primevue/timeline';
export interface AuditLog {
timestamp: string; timestamp: string;
user: string; user: string;
change: string; change: string;
@@ -10,43 +29,3 @@ defineProps<{
auditHistory?: AuditLog[]; auditHistory?: AuditLog[];
}>(); }>();
</script> </script>
<template>
<div class="audit-timeline-section" v-if="auditHistory && auditHistory.length > 0">
<h5 class="timeline-title">🕒 변경 감사 이력 타임라인 (Audit Trail)</h5>
<div class="timeline-list">
<div v-for="(log, idx) in auditHistory" :key="idx" class="timeline-item">
<span class="time-stamp">{{ log.timestamp }}</span>
<span class="user-id">[{{ log.user }}]</span>
<span class="change-desc">{{ log.change }}</span>
</div>
</div>
</div>
</template>
<style scoped>
.audit-timeline-section {
border-top: 1px solid #E2E8F0;
padding-top: 8px;
margin-top: 4px;
}
.timeline-title {
font-size: 0.75rem;
font-weight: 700;
color: #475569;
margin: 0 0 4px 0;
}
.timeline-list { display: flex; flex-direction: column; gap: 2px; }
.timeline-item {
font-size: 0.7rem;
color: #64748B;
display: flex;
gap: 6px;
}
.time-stamp { font-family: monospace; font-weight: 700; color: #2563EB; }
.user-id { font-weight: 700; color: #334155; }
.change-desc { color: #475569; }
</style>