diff --git a/app/Presenters/Admin/OptionFormFieldsPresenter.php b/app/Presenters/Admin/OptionFormFieldsPresenter.php index 8cf6ad0..8f3d4f7 100644 --- a/app/Presenters/Admin/OptionFormFieldsPresenter.php +++ b/app/Presenters/Admin/OptionFormFieldsPresenter.php @@ -2,6 +2,7 @@ namespace App\Presenters\Admin; +use App\Repositories\MediaFileRepository; use Arr; class OptionFormFieldsPresenter @@ -11,6 +12,7 @@ class OptionFormFieldsPresenter $options = config('admin.options.' . $page); $presenter = app('Html'); $optionRepo = app('Option'); + $mediaFileRepo = app(MediaFileRepository::class); $html = ''; if(!empty($options['fields'])) { foreach($options['fields'] as $key => $option) { @@ -35,7 +37,7 @@ class OptionFormFieldsPresenter ]), $presenter->div([ 'class' => 'col-12 col-md-6', - 'html' => function() use ($key, $type, $required, $presenter, $optionRepo) { + 'html' => function() use ($key, $type, $required, $presenter, $optionRepo, $mediaFileRepo) { $html = ''; $bastHtmlArgs = [ @@ -43,6 +45,39 @@ class OptionFormFieldsPresenter 'id' => 'option-' . $key, ]; 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 'password': case 'email': diff --git a/app/Presenters/Html/BaseHtmlPresenter.php b/app/Presenters/Html/BaseHtmlPresenter.php index 3cc1ba8..a7d454a 100644 --- a/app/Presenters/Html/BaseHtmlPresenter.php +++ b/app/Presenters/Html/BaseHtmlPresenter.php @@ -23,23 +23,16 @@ trait BaseHtmlPresenter public function getAttributes($fieldArgs = []) { $attributes = []; - $multiValueAttributes = [ - 'class', - 'style', - ]; + Arr::forget($fieldArgs, 'html'); foreach ($fieldArgs as $name => $value) { - if(in_array($name, $multiValueAttributes)) { - if(is_array($value)) { - $value = array_filter($value); - $values = trim(implode(' ', $value)); - } else { - $values = $value; - } - array_push($attributes, $this->getAttribute($name, $values)); + if(is_array($value)) { + $value = array_filter($value); + $values = trim(implode(' ', $value)); } else { - array_push($attributes, $this->getAttribute($name, $value)); + $values = $value; } + array_push($attributes, $this->getAttribute($name, $values)); } return trim(implode(' ', $attributes)); } diff --git a/app/Presenters/LogoPresenter.php b/app/Presenters/LogoPresenter.php new file mode 100644 index 0000000..001a40b --- /dev/null +++ b/app/Presenters/LogoPresenter.php @@ -0,0 +1,20 @@ +logo; + $mediaFileRepo = app(MediaFileRepository::class); + $logoMedia = $mediaFileRepo->findModel($logoId); + if($logoMedia) { + return $logoMedia->url; + } + return ''; + } +} diff --git a/config/admin.php b/config/admin.php index af3b5bd..841fbf6 100644 --- a/config/admin.php +++ b/config/admin.php @@ -32,6 +32,10 @@ return [ 'general' => [ 'permission' => 'admin manage options general', 'fields' => [ + 'logo' => [ + 'label' => 'logo', + 'type' => 'media' + ], 'site_name' => [ 'label' => 'siteName', 'validator' => 'required', diff --git a/resources/js/admin/page/options.js b/resources/js/admin/page/options.js new file mode 100644 index 0000000..eb484ba --- /dev/null +++ b/resources/js/admin/page/options.js @@ -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( + $('').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() +}) diff --git a/resources/lang/en/adminOptionLabels.php b/resources/lang/en/adminOptionLabels.php index 0c225f9..a38db85 100644 --- a/resources/lang/en/adminOptionLabels.php +++ b/resources/lang/en/adminOptionLabels.php @@ -1,5 +1,6 @@ 'Logo', 'siteName' => 'Site Name', 'siteDescription' => 'Site Description', 'blockSearchEngineIndexing' => 'Block Search Engine Indexing', diff --git a/resources/sass/_app-common.scss b/resources/sass/_app-common.scss new file mode 100644 index 0000000..e52de08 --- /dev/null +++ b/resources/sass/_app-common.scss @@ -0,0 +1,3 @@ +#app-logo { + max-height: 25px; +} diff --git a/resources/sass/admin/app.scss b/resources/sass/admin/app.scss index 0433349..274acef 100644 --- a/resources/sass/admin/app.scss +++ b/resources/sass/admin/app.scss @@ -4,8 +4,4 @@ @import "components/datatables"; @import "components/blockui"; @import "../components/media-library"; - - - - - +@import "../app-common"; diff --git a/resources/sass/admin/page/options.scss b/resources/sass/admin/page/options.scss new file mode 100644 index 0000000..1408e4b --- /dev/null +++ b/resources/sass/admin/page/options.scss @@ -0,0 +1,7 @@ +.option-media-field { + .preview { + img { + max-width: 50%; + } + } +} diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 3193ffa..0db3d2f 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -6,3 +6,5 @@ // Bootstrap @import '~bootstrap/scss/bootstrap'; + +@import "app-common"; diff --git a/resources/views/admin/layouts/app.blade.php b/resources/views/admin/layouts/app.blade.php index 33ec86b..5efe770 100644 --- a/resources/views/admin/layouts/app.blade.php +++ b/resources/views/admin/layouts/app.blade.php @@ -29,10 +29,9 @@ -