Skip to content
jinyphpPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

JinyPost UX ์ปดํฌ๋„ŒํŠธ ๊ฐ€์ด๋“œ

๊ฐœ์š”

JinyPost ํŒจํ‚ค์ง€๋Š” ๊ด€๋ฆฌ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๊ด€์„ฑ๊ณผ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Blade ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” Claude๋‚˜ ๋‹ค๋ฅธ AI ๋„๊ตฌ๊ฐ€ Blade ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ฆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ

ํ† ๊ธ€ ์Šค์œ„์น˜ ์ปดํฌ๋„ŒํŠธ๋กœ boolean ์„ค์ •๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<x-switch name="enable_feature" :checked="true">
    <strong>๊ธฐ๋Šฅ ํ™œ์„ฑํ™”</strong>
    <div class="text-muted small">์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.</div>
</x-switch>

์ˆซ์ž ์ž…๋ ฅ์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ผ๋ฒจ, ์ž…๋ ฅ ํ•„๋“œ, ์„ค๋ช…์„ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.

<x-input-number name="max_items" :value="10" :min="1" :max="100">
    <strong>์ตœ๋Œ€ ์•„์ดํ…œ ์ˆ˜</strong>
    <div class="text-muted small">์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์•„์ดํ…œ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค.</div>
</x-input-number>

ํผ ์ €์žฅ์„ ์œ„ํ•œ ์ผ๊ด€๋œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

<x-btn-save>์„ค์ • ์ €์žฅ</x-btn-save>

๐ŸŽฏ ์ปดํฌ๋„ŒํŠธ ์„ ํƒ ๊ฐ€์ด๋“œ

์–ธ์ œ x-switch๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”?

โœ… ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ:

  • Boolean ๊ฐ’ (true/false, enabled/disabled) ์„ค์ •
  • ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™” ํ† ๊ธ€
  • ์ •์ฑ… ๋˜๋Š” ๊ถŒํ•œ ์„ค์ •
  • ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ค์ •

โŒ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๋•Œ:

  • ๋‹ค์ค‘ ์„ ํƒ ์˜ต์…˜ (๋ผ๋””์˜ค ๋ฒ„ํŠผ ๋˜๋Š” ์…€๋ ‰ํŠธ ๋ฐ•์Šค ์‚ฌ์šฉ)
  • ์ˆซ์ž๋‚˜ ํ…์ŠคํŠธ ์ž…๋ ฅ (x-input-number ๋˜๋Š” ๊ธฐ๋ณธ input ์‚ฌ์šฉ)
  • ํŒŒ์ผ ์—…๋กœ๋“œ

์–ธ์ œ x-input-number๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”?

โœ… ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ:

  • ์ˆซ์ž ๊ฐ’ ์ž…๋ ฅ (๊ฐœ์ˆ˜, ํฌ๊ธฐ, ๊ธธ์ด ๋“ฑ)
  • ๋ฒ”์œ„๊ฐ€ ์ •ํ•ด์ง„ ์„ค์ •๊ฐ’
  • ์ตœ์†Œ/์ตœ๋Œ€ ์ œํ•œ์ด ์žˆ๋Š” ์ž…๋ ฅ
  • ๋‹จ์œ„๊ฐ€ ์žˆ๋Š” ์ˆซ์ž (MB, ์ดˆ, ๊ฐœ ๋“ฑ)

โŒ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๋•Œ:

  • Boolean ๊ฐ’ (x-switch ์‚ฌ์šฉ)
  • ํ…์ŠคํŠธ ์ž…๋ ฅ (๊ธฐ๋ณธ input ์‚ฌ์šฉ)
  • ๋‚ ์งœ/์‹œ๊ฐ„ ์ž…๋ ฅ (date/time input ์‚ฌ์šฉ)
  • ๋งค์šฐ ํฐ ๋ฒ”์œ„์˜ ์ˆซ์ž (๊ฒ€์ƒ‰, ID ๋“ฑ)

์–ธ์ œ x-btn-save๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”?

โœ… ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ:

  • ํผ ๋ฐ์ดํ„ฐ ์ €์žฅ
  • ์„ค์ • ์ €์žฅ
  • ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ
  • ์ •๋ณด ์ œ์ถœ

โŒ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๋•Œ:

  • ํŽ˜์ด์ง€ ์ด๋™ (๋งํฌ ์‚ฌ์šฉ)
  • ๋ฐ์ดํ„ฐ ์‚ญ์ œ (๋‹ค๋ฅธ ์Šคํƒ€์ผ์˜ ๋ฒ„ํŠผ ์‚ฌ์šฉ)
  • ๋ชจ๋‹ฌ ์—ด๊ธฐ/๋‹ซ๊ธฐ

๐Ÿ—๏ธ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ์œ„์น˜

vendor/jiny/post/resources/views/components/
โ”œโ”€โ”€ switch.blade.php
โ”œโ”€โ”€ input-number.blade.php
โ””โ”€โ”€ btn-save.blade.php

๋“ฑ๋ก ์œ„์น˜

์ปดํฌ๋„ŒํŠธ๋Š” JinyPostServiceProvider์—์„œ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค:

// vendor/jiny/post/src/Providers/JinyPostServiceProvider.php
protected function loadBladeComponents(): void
{
    Blade::component('jiny-post::components.switch', 'switch');
    Blade::component('jiny-post::components.input-number', 'input-number');
    Blade::component('jiny-post::components.btn-save', 'btn-save');
}

๐ŸŽจ ๋””์ž์ธ ์‹œ์Šคํ…œ

์ƒ‰์ƒ ์ฒด๊ณ„

  • Primary: Bootstrap์˜ primary ์ƒ‰์ƒ (ํŒŒ๋ž€์ƒ‰)
  • ํ…์ŠคํŠธ: ๊ธฐ๋ณธ ๋‹คํฌ ์ƒ‰์ƒ, ์„ค๋ช…์€ muted ์ƒ‰์ƒ
  • ๋ฐฐ๊ฒฝ: ์ฃผ๋กœ ํฐ์ƒ‰, ์นด๋“œ๋Š” ์—ฐํ•œ ํšŒ์ƒ‰ ํ…Œ๋‘๋ฆฌ

๊ฐ„๊ฒฉ ์ฒด๊ณ„

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„๊ฒฉ: mb-3 (ํ•˜๋‹จ ๋งˆ์ง„)
  • ๋ฒ„ํŠผ ์˜์—ญ: mb-4 (ํ•˜๋‹จ ๋งˆ์ง„)
  • ์•„์ด์ฝ˜ ๊ฐ„๊ฒฉ: me-1 (์šฐ์ธก ๋งˆ์ง„)

ํฐํŠธ ์ฒด๊ณ„

  • ๋ผ๋ฒจ: <strong> ํƒœ๊ทธ๋กœ ๊ตต๊ฒŒ
  • ์„ค๋ช…: text-muted small ํด๋ž˜์Šค

๐Ÿ”ง ์‹ค์ œ ๊ตฌํ˜„ ์˜ˆ์‹œ

์„ค์ • ํŽ˜์ด์ง€ ์ „์ฒด ๊ตฌ์กฐ

@extends($layout ?? 'jiny-site::layouts.admin.sidebar')

@section('title', '์„ค์ • ๊ด€๋ฆฌ')

@section('content')
<div class="container-fluid">
    <!-- ํ—ค๋”ฉ -->
    <div class="d-flex justify-content-between align-items-center my-3">
        <div>
            <h3><i class="bi bi-gear me-2 text-primary"></i>์„ค์ • ๊ด€๋ฆฌ</h3>
            <p class="text-muted mb-0">์‹œ์Šคํ…œ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.</p>
        </div>
    </div>

    <hr>

    <div class="row">
        <div class="col-lg-8">
            <form method="POST" action="{{ route('admin.config.save') }}">
                @csrf

                <!-- ์ •์ฑ… ์„ค์ • -->
                <div class="card border-0 shadow-sm mb-4">
                    <div class="card-header bg-white border-bottom">
                        <h5 class="mb-0">
                            <i class="bi bi-shield-check me-2 text-primary"></i>
                            ์ •์ฑ… ์„ค์ •
                        </h5>
                    </div>
                    <div class="card-body">
                        <div class="row">
                            <div class="col-md-6">
                                <x-switch name="admin_write" :checked="$config['policies']['admin_write']['enabled']">
                                    <strong>๊ด€๋ฆฌ์ž ์ž‘์„ฑ ํ—ˆ์šฉ</strong>
                                    <div class="text-muted small">์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</div>
                                </x-switch>

                                <x-switch name="user_write" :checked="$config['policies']['user_write']['enabled']">
                                    <strong>์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์ž‘์„ฑ ํ—ˆ์šฉ</strong>
                                    <div class="text-muted small">๋กœ๊ทธ์ธํ•œ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</div>
                                </x-switch>
                            </div>

                            <div class="col-md-6">
                                <x-switch name="user_approval" :checked="$config['policies']['user_approval']['enabled']">
                                    <strong>์‚ฌ์šฉ์ž ๊ธ€ ์Šน์ธ ํ•„์š”</strong>
                                    <div class="text-muted small">์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์˜ ๊ธ€์€ ๊ด€๋ฆฌ์ž ์Šน์ธ ํ›„ ๋ฐœํ–‰๋ฉ๋‹ˆ๋‹ค.</div>
                                </x-switch>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- ๊ธฐ๋ณธ ์„ค์ • -->
                <div class="card border-0 shadow-sm mb-4">
                    <div class="card-header bg-white border-bottom">
                        <h5 class="mb-0">
                            <i class="bi bi-gear me-2 text-primary"></i>
                            ๊ธฐ๋ณธ ์„ค์ •
                        </h5>
                    </div>
                    <div class="card-body">
                        <div class="row">
                            <div class="col-md-6">
                                <x-input-number
                                    name="max_images"
                                    :value="$config['settings']['max_images']"
                                    :min="1"
                                    :max="50"
                                >
                                    <strong>์ตœ๋Œ€ ์ด๋ฏธ์ง€ ์ˆ˜</strong>
                                    <div class="text-muted small">๊ธ€๋‹น ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด๋ฏธ์ง€ ์ˆ˜์ž…๋‹ˆ๋‹ค.</div>
                                </x-input-number>
                            </div>

                            <div class="col-md-6">
                                <x-switch name="enable_comments" :checked="$config['settings']['enable_comments']">
                                    <strong>๋Œ“๊ธ€ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”</strong>
                                    <div class="text-muted small">๊ธ€์— ๋Œ“๊ธ€ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.</div>
                                </x-switch>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- ์ €์žฅ ๋ฒ„ํŠผ -->
                <x-btn-save>์„ค์ • ์ €์žฅ</x-btn-save>
            </form>
        </div>

        <!-- ์‚ฌ์ด๋“œ๋ฐ” ์ •๋ณด -->
        <div class="col-lg-4">
            <div class="card border-0 shadow-sm">
                <div class="card-header bg-light border-bottom">
                    <h6 class="mb-0">
                        <i class="bi bi-info-circle me-2 text-info"></i>
                        ์„ค์ • ์ •๋ณด
                    </h6>
                </div>
                <div class="card-body">
                    <div class="mb-3">
                        <small class="text-muted">๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ</small>
                        <div class="fw-medium">{{ $config['updated_at'] ?? 'N/A' }}</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

๐Ÿ“ ์ฝ”๋”ฉ ๊ทœ์น™

1. ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ ์›์น™

  • ์ผ๊ด€์„ฑ: ๊ฐ™์€ ๊ธฐ๋Šฅ์—๋Š” ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
  • ๋‹จ์ˆœ์„ฑ: ๋ณต์žกํ•œ ๋กœ์ง์€ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ
  • ์žฌ์‚ฌ์šฉ์„ฑ: ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„

2. ๋„ค์ด๋ฐ ๊ทœ์น™

  • ์ปดํฌ๋„ŒํŠธ: kebab-case ์‚ฌ์šฉ (x-switch, x-btn-save)
  • ์†์„ฑ: camelCase ์‚ฌ์šฉ (name, checked, hiddenValue)
  • ์Šฌ๋กฏ: ์‹œ๋งจํ‹ฑํ•œ HTML ๊ตฌ์กฐ ์œ ์ง€

3. ์ ‘๊ทผ์„ฑ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋ผ๋ฒจ๊ณผ input ์—ฐ๊ฒฐ
  • ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ง€์›
  • ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ํ˜ธํ™˜์„ฑ

๐Ÿš€ ๊ฐœ๋ฐœ ๋ชจ๋ฒ” ์‚ฌ๋ก€

1. ํผ ๊ตฌ์กฐ

<form method="POST" action="{{ route('admin.save') }}">
    @csrf

    <!-- ์„ค์ • ๊ทธ๋ฃน -->
    <div class="card mb-4">
        <div class="card-header">
            <h5>์„ค์ • ๊ทธ๋ฃน๋ช…</h5>
        </div>
        <div class="card-body">
            <!-- ์ปดํฌ๋„ŒํŠธ๋“ค -->
        </div>
    </div>

    <!-- ์ €์žฅ ๋ฒ„ํŠผ -->
    <x-btn-save>์ €์žฅ</x-btn-save>
</form>

2. ์—๋Ÿฌ ์ฒ˜๋ฆฌ

@if($errors->any())
    <div class="alert alert-danger">
        <!-- ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ -->
    </div>
@endif

@if(session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif

3. ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ

<div class="row">
    <div class="col-lg-8">
        <!-- ๋ฉ”์ธ ํผ -->
    </div>
    <div class="col-lg-4">
        <!-- ์‚ฌ์ด๋“œ๋ฐ” ์ •๋ณด -->
    </div>
</div>

๐Ÿ” ์ฐธ๊ณ  ์ž๋ฃŒ


์ด ๋ฌธ์„œ๋Š” JinyPost ํŒจํ‚ค์ง€์˜ UX ์ปดํฌ๋„ŒํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ด ๋ฌธ์„œ๋„ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages