加入media類型設定選項, logo設定

This commit is contained in:
kroutony 2020-02-23 00:33:51 +08:00
parent d896c085a3
commit be87044080
15 changed files with 125 additions and 24 deletions

View File

@ -2,6 +2,7 @@
namespace App\Presenters\Admin; namespace App\Presenters\Admin;
use App\Repositories\MediaFileRepository;
use Arr; use Arr;
class OptionFormFieldsPresenter class OptionFormFieldsPresenter
@ -11,6 +12,7 @@ class OptionFormFieldsPresenter
$options = config('admin.options.' . $page); $options = config('admin.options.' . $page);
$presenter = app('Html'); $presenter = app('Html');
$optionRepo = app('Option'); $optionRepo = app('Option');
$mediaFileRepo = app(MediaFileRepository::class);
$html = ''; $html = '';
if(!empty($options['fields'])) { if(!empty($options['fields'])) {
foreach($options['fields'] as $key => $option) { foreach($options['fields'] as $key => $option) {
@ -35,7 +37,7 @@ class OptionFormFieldsPresenter
]), ]),
$presenter->div([ $presenter->div([
'class' => 'col-12 col-md-6', 'class' => 'col-12 col-md-6',
'html' => function() use ($key, $type, $required, $presenter, $optionRepo) { 'html' => function() use ($key, $type, $required, $presenter, $optionRepo, $mediaFileRepo) {
$html = ''; $html = '';
$bastHtmlArgs = [ $bastHtmlArgs = [
@ -43,6 +45,39 @@ class OptionFormFieldsPresenter
'id' => 'option-' . $key, 'id' => 'option-' . $key,
]; ];
switch ($type) { switch ($type) {
case 'media':
$mediaFiledId = $optionRepo->$key;
$mediaFile = $mediaFileRepo->findModel($mediaFiledId);
$previewImgHtml = '';
$mediaFieldContentHtml = '';
if($mediaFile) {
$previewImgHtml = $presenter->img([
'src' => $mediaFile->url
]);
}
$mediaFieldContentHtml .= $presenter->input(array_merge([
'type' => 'hidden',
'class' => 'input',
'value' => $mediaFiledId
], $bastHtmlArgs));
$mediaFieldContentHtml .= $presenter->div([
'class' => 'preview',
'html' => $previewImgHtml
]);
$mediaFieldContentHtml .= $presenter->button([
'class' => ['btn', 'btn-success', 'select-media'],
'html' => '選擇'
]);
$mediaFieldContentHtml .= $presenter->button([
'class' => ['btn', 'btn-danger', 'clear-media'],
'style' => !$mediaFile ? 'display:none;' : '',
'html' => '清除'
]);
$html .= $presenter->div([
'class' => 'option-media-field',
'html' => $mediaFieldContentHtml
]);
break;
case 'text': case 'text':
case 'password': case 'password':
case 'email': case 'email':

View File

@ -23,23 +23,16 @@ trait BaseHtmlPresenter
public function getAttributes($fieldArgs = []) public function getAttributes($fieldArgs = [])
{ {
$attributes = []; $attributes = [];
$multiValueAttributes = [
'class',
'style',
];
Arr::forget($fieldArgs, 'html'); Arr::forget($fieldArgs, 'html');
foreach ($fieldArgs as $name => $value) { foreach ($fieldArgs as $name => $value) {
if(in_array($name, $multiValueAttributes)) { if(is_array($value)) {
if(is_array($value)) { $value = array_filter($value);
$value = array_filter($value); $values = trim(implode(' ', $value));
$values = trim(implode(' ', $value));
} else {
$values = $value;
}
array_push($attributes, $this->getAttribute($name, $values));
} else { } else {
array_push($attributes, $this->getAttribute($name, $value)); $values = $value;
} }
array_push($attributes, $this->getAttribute($name, $values));
} }
return trim(implode(' ', $attributes)); return trim(implode(' ', $attributes));
} }

View File

@ -0,0 +1,20 @@
<?php
namespace App\Presenters;
use App\MediaFile;
use App\Repositories\MediaFileRepository;
class LogoPresenter
{
public function getUrl()
{
$logoId = app('Option')->logo;
$mediaFileRepo = app(MediaFileRepository::class);
$logoMedia = $mediaFileRepo->findModel($logoId);
if($logoMedia) {
return $logoMedia->url;
}
return '';
}
}

View File

@ -32,6 +32,10 @@ return [
'general' => [ 'general' => [
'permission' => 'admin manage options general', 'permission' => 'admin manage options general',
'fields' => [ 'fields' => [
'logo' => [
'label' => 'logo',
'type' => 'media'
],
'site_name' => [ 'site_name' => [
'label' => 'siteName', 'label' => 'siteName',
'validator' => 'required', 'validator' => 'required',

26
resources/js/admin/page/options.js vendored Normal file
View File

@ -0,0 +1,26 @@
$('.select-media').on('click', e => {
e.preventDefault()
let $this = $(e.currentTarget),
$input = $this.siblings('input'),
$preview = $this.siblings('.preview'),
$clearButton = $this.siblings('.clear-media')
app.methods.media(true, $input.get(0), true, (data) => {
let media = data.medias[0]
$preview.empty().append(
$('<img>').attr('src', media.url)
)
$clearButton.show()
})
})
$('.clear-media').on('click', e => {
e.preventDefault()
let $this = $(e.currentTarget),
$input = $this.siblings('input'),
$preview = $this.siblings('.preview')
$input.val(null)
$preview.empty()
$this.hide()
})

View File

@ -1,5 +1,6 @@
<?php <?php
return [ return [
'logo' => 'Logo',
'siteName' => 'Site Name', 'siteName' => 'Site Name',
'siteDescription' => 'Site Description', 'siteDescription' => 'Site Description',
'blockSearchEngineIndexing' => 'Block Search Engine Indexing', 'blockSearchEngineIndexing' => 'Block Search Engine Indexing',

3
resources/sass/_app-common.scss vendored Normal file
View File

@ -0,0 +1,3 @@
#app-logo {
max-height: 25px;
}

View File

@ -4,8 +4,4 @@
@import "components/datatables"; @import "components/datatables";
@import "components/blockui"; @import "components/blockui";
@import "../components/media-library"; @import "../components/media-library";
@import "../app-common";

View File

@ -0,0 +1,7 @@
.option-media-field {
.preview {
img {
max-width: 50%;
}
}
}

View File

@ -6,3 +6,5 @@
// Bootstrap // Bootstrap
@import '~bootstrap/scss/bootstrap'; @import '~bootstrap/scss/bootstrap';
@import "app-common";

View File

@ -29,10 +29,9 @@
<button class="navbar-toggler sidebar-toggler d-md-down-none" type="button" data-toggle="sidebar-lg-show"> <button class="navbar-toggler sidebar-toggler d-md-down-none" type="button" data-toggle="sidebar-lg-show">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li class="nav-item px-3"> <li class="nav-item px-3">
<a href="{{ route('index') }}" class="nav-link">Front Stage</a> @include('components.navBrand')
</li> </li>
<li class="nav-item px-3"> <li class="nav-item px-3">
<a href="#" class="nav-link medialibrary">Media Library</a> <a href="#" class="nav-link medialibrary">Media Library</a>

View File

@ -1,5 +1,13 @@
@extends('admin.layouts.app') @extends('admin.layouts.app')
@push('admin-app-scripts')
<script src="{{ asset('js/admin/page/options.js') }}"></script>
@endpush
@push('admin-app-styles')
<link rel="stylesheet" href="{{ asset('css/admin/page/options.css') }}">
@endpush
@section('title') @section('title')
@lang('adminPageHeader.options.' . $slug) @lang('adminPageHeader.options.' . $slug)
@endsection @endsection

View File

@ -1,8 +1,6 @@
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm"> <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container"> <div class="container">
<a class="navbar-brand" href="{{ url('/') }}"> @include('components.navBrand')
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>

View File

@ -0,0 +1,7 @@
<a class="navbar-brand" href="{{ url('/') }}">
@inject('logoPresenter', 'App\Presenters\LogoPresenter')
@if(app('Option')->logo)
<img src="{{ $logoPresenter->getUrl() }}" class="d-inline-block align-top" id="app-logo">
@endif
{{ config('app.name', 'Laravel') }}
</a>

2
webpack.mix.js vendored
View File

@ -22,7 +22,9 @@ mix.sass('resources/sass/app.scss', publicCssDir);
mix.js('resources/js/admin/app.js', publicAdminJsDir) mix.js('resources/js/admin/app.js', publicAdminJsDir)
.js('resources/js/admin/page/system-status.js', publicAdminJsDir + '/page') .js('resources/js/admin/page/system-status.js', publicAdminJsDir + '/page')
.js('resources/js/admin/page/options.js', publicAdminJsDir + '/page')
mix.sass('resources/sass/admin/lib.scss', publicAdminCssDir) mix.sass('resources/sass/admin/lib.scss', publicAdminCssDir)
.sass('resources/sass/admin/app.scss', publicAdminCssDir) .sass('resources/sass/admin/app.scss', publicAdminCssDir)
.sass('resources/sass/admin/page/system-status.scss', publicAdminCssDir + '/page') .sass('resources/sass/admin/page/system-status.scss', publicAdminCssDir + '/page')
.sass('resources/sass/admin/page/options.scss', publicAdminCssDir + '/page')