diff --git a/app/Console/Commands/CreatePostType.php b/app/Console/Commands/CreatePostType.php new file mode 100644 index 0000000..f5e60fc --- /dev/null +++ b/app/Console/Commands/CreatePostType.php @@ -0,0 +1,42 @@ +option('user_id'); + if($user_id) { + $user = User::find($user_id); + if(!$user) { + throw new \Exception("User $user_id doesn't exist"); + } + } else { + $user = User::inRandomOrder()->first(); + if(!$user) { + throw new \Exception("User $user_id doesn't exist"); + } + } + $amount = $this->argument('amount'); + if(!$amount) { + $amount = 1; + } + $postType = $this->argument('postType'); + $postTypes = config('postTypes'); + if(array_key_exists($postType, $postTypes)) { + /** @var Post $model */ + $postRepo = new PostRepository($postTypes[$postType]['model']); + $faker = \Faker\Factory::create(); + for($i = 0; $i < $amount; $i++) { + $post = $postRepo->createModel(); + $post->fill([ + 'title' => $this->randomTextLength($faker, 10, 25), + 'excerpt' => $this->randomTextLength($faker, 10, 30), + 'introduction' => $faker->realText($faker->numberBetween(20, 400)), + 'user_id' => $user->id + ]); + $post->save(); + } + } + } + + private function randomTextLength($faker, $min, $max) + { + return mb_substr($this->rtrim($faker->realText($max)), 0, $faker->numberBetween($min, $max - 1)); + } + + private function rtrim($text) + { + return mb_substr($text, 0, -1); + } +} diff --git a/app/Http/Controllers/Admin/Menu/Articles/ArticlesMenuItemController.php b/app/Http/Controllers/Admin/Menu/Articles/ArticlesMenuItemController.php new file mode 100644 index 0000000..837f142 --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/Articles/ArticlesMenuItemController.php @@ -0,0 +1,24 @@ +name = 'adminMenu.items.articles.articles'; + + $this->slug = 'articles'; + + $this->permissions = ['admin manage post articles']; + + $this->iconClasses = 'nav-icon icon-wrench'; + } + + public function handle(Request $request) + { + } +} diff --git a/app/Http/Controllers/Admin/Menu/Articles/Children/CreateMenuItemController.php b/app/Http/Controllers/Admin/Menu/Articles/Children/CreateMenuItemController.php new file mode 100644 index 0000000..ef01899 --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/Articles/Children/CreateMenuItemController.php @@ -0,0 +1,21 @@ +name = 'adminMenu.items.articles.create'; + + $this->slug = 'create'; + + $this->iconClasses = 'nav-icon icon-wrench'; + + $this->postType = 'article'; + } +} diff --git a/app/Http/Controllers/Admin/Menu/Articles/Children/ListMenuItemController.php b/app/Http/Controllers/Admin/Menu/Articles/Children/ListMenuItemController.php new file mode 100644 index 0000000..e9d33a3 --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/Articles/Children/ListMenuItemController.php @@ -0,0 +1,21 @@ +name = 'adminMenu.items.articles.list'; + + $this->slug = 'list'; + + $this->iconClasses = 'nav-icon icon-wrench'; + + $this->postType = 'article'; + + $this->pageHeader = trans('adminPageHeader.articles.articles'); + } +} diff --git a/app/Http/Controllers/Admin/Menu/Portfolios/Children/CreateMenuItemController.php b/app/Http/Controllers/Admin/Menu/Portfolios/Children/CreateMenuItemController.php new file mode 100644 index 0000000..c3b4996 --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/Portfolios/Children/CreateMenuItemController.php @@ -0,0 +1,19 @@ +name = 'adminMenu.items.portfolios.create'; + + $this->slug = 'create'; + + $this->iconClasses = 'nav-icon icon-wrench'; + + $this->postType = 'portfolio'; + } +} diff --git a/app/Http/Controllers/Admin/Menu/Portfolios/Children/ListMenuItemController.php b/app/Http/Controllers/Admin/Menu/Portfolios/Children/ListMenuItemController.php new file mode 100644 index 0000000..dcd95fc --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/Portfolios/Children/ListMenuItemController.php @@ -0,0 +1,21 @@ +name = 'adminMenu.items.portfolios.list'; + + $this->slug = 'list'; + + $this->iconClasses = 'nav-icon icon-wrench'; + + $this->postType = 'portfolio'; + + $this->pageHeader = trans('adminPageHeader.portfolios.portfolios'); + } +} diff --git a/app/Http/Controllers/Admin/Menu/Portfolios/PortfoliosMenuItemController.php b/app/Http/Controllers/Admin/Menu/Portfolios/PortfoliosMenuItemController.php new file mode 100644 index 0000000..28d38bf --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/Portfolios/PortfoliosMenuItemController.php @@ -0,0 +1,24 @@ +name = 'adminMenu.items.portfolios.portfolios'; + + $this->slug = 'portfolios'; + + $this->permissions = ['admin manage post portfolio']; + + $this->iconClasses = 'nav-icon icon-wrench'; + } + + public function handle(Request $request) + { + } +} diff --git a/app/Http/Controllers/Admin/Menu/PostCreateMenuItemController.php b/app/Http/Controllers/Admin/Menu/PostCreateMenuItemController.php new file mode 100644 index 0000000..c653514 --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/PostCreateMenuItemController.php @@ -0,0 +1,21 @@ +languageTranslations; + return view('admin.menu.posts.edit', [ + 'adminRouteNamePrefix' => config('admin.route_name_prefix'), + 'languages' => $languages, + 'post' => null, + 'resource' => $this->postType + ]); + } +} diff --git a/app/Http/Controllers/Admin/Menu/PostListMenuItemController.php b/app/Http/Controllers/Admin/Menu/PostListMenuItemController.php new file mode 100644 index 0000000..e31a924 --- /dev/null +++ b/app/Http/Controllers/Admin/Menu/PostListMenuItemController.php @@ -0,0 +1,26 @@ +postType); + $postRepo = new PostRepository($postTypes['model']); + $posts = $postRepo->getPostsPager(); + return view('admin.menu.posts.list', [ + 'adminRouteNamePrefix' => config('admin.route_name_prefix'), + 'resource' => $this->postType, + 'pageHeader' => $this->pageHeader, + 'posts' => $posts + ]); + } +} diff --git a/app/Http/Controllers/Admin/PostController.php b/app/Http/Controllers/Admin/PostController.php new file mode 100644 index 0000000..8d3d180 --- /dev/null +++ b/app/Http/Controllers/Admin/PostController.php @@ -0,0 +1,106 @@ +route()->getName()))[0]; + } + + public function index(Request $request) + { + + } + + public function edit(Request $request, $postId) + { + $resource = $this->getResource($request); + $modelClass = $this->getModelClass($resource); + $post = $modelClass::find($postId); + $languages = app('SiteState')->languageTranslations; + return view('admin.menu.posts.edit', [ + 'adminRouteNamePrefix' => config('admin.route_name_prefix'), + 'resource' => $resource, + 'post' => $post, + 'languages' => $languages + ]); + } + + public function create(Request $request) + { + + } + + public function store(Request $request) + { + return $this->update($request, null); + } + + public function update(Request $request, $postId) + { + $defaultLocale = config('app.locale'); + $resource = $this->getResource($request); + $modelClass = $this->getModelClass($resource); + + /** @var \App\Post $post */ + if($postId) { + $post = $modelClass::find($postId); + } else { + $post = app($modelClass); + $translatableAttributes = $post->getTranslatableAttributes(); + $translatableAttributeValues = $request->all($translatableAttributes); + $translatableAttributeValues = collect($translatableAttributeValues)->map(function($translatableAttributeValue) use ($defaultLocale){ + return $translatableAttributeValue[$defaultLocale]; + }); + $post = $modelClass::create(array_merge($translatableAttributeValues->toArray(), [ + 'user_id' => Auth::id() + ])); + } + + // Post的可翻譯屬性 + $translatableAttributes = $post->getTranslatableAttributes(); + // 更新所有可翻譯的屬性 + foreach ($translatableAttributes as $translatableAttribute) { + $translations = $request->get($translatableAttribute); + if($translations) { + $this->updateAttributeTranslations($post, $translatableAttribute, $translations); + } + } + + $post->fill([ + 'feature_image_id' => $request->get('feature_image_id') + ]); + $post->save(); + + return redirect(route(config('admin.route_name_prefix') . $resource . '.edit', [$resource => $post->id])); + } + + public function show(Request $request) + { + + } + + public function destroy(Request $request, $postId) + { + $resource = $this->getResource($request); + $modelClass = $this->getModelClass($resource); + + $post = $modelClass::find($postId); + $post->delete(); + return back(); + } +} diff --git a/app/Post.php b/app/Post.php index a71dea1..176fa37 100644 --- a/app/Post.php +++ b/app/Post.php @@ -9,4 +9,18 @@ abstract class Post extends TranslatableModel protected $fillable = [ 'title', 'content', 'excerpt', 'user_id', 'feature_image_id' ]; + + protected $translatableAttributes = [ + 'title', 'content', 'excerpt' + ]; + + public function author() + { + return $this->belongsTo(User::class, 'user_id'); + } + + public function featureImage() + { + return $this->belongsTo(MediaFile::class, 'feature_image_id'); + } } diff --git a/app/Presenters/Admin/MainMenuItemPresenter.php b/app/Presenters/Admin/MainMenuItemPresenter.php index e84d216..a0c3ac2 100644 --- a/app/Presenters/Admin/MainMenuItemPresenter.php +++ b/app/Presenters/Admin/MainMenuItemPresenter.php @@ -60,7 +60,7 @@ class MainMenuItemPresenter case 'title': $html .= $htmlPresenter->li([ 'class' => 'nav-title', - 'html' => trans('menu.titles.' . $item['name']) + 'html' => trans('adminMenu.titles.' . $item['name']) ]); break; case 'item': diff --git a/app/Presenters/Admin/MediaSelectionFieldPresenter.php b/app/Presenters/Admin/MediaSelectionFieldPresenter.php new file mode 100644 index 0000000..25a270e --- /dev/null +++ b/app/Presenters/Admin/MediaSelectionFieldPresenter.php @@ -0,0 +1,60 @@ +findModel($mediaFileId); + $previewImgHtml = ''; + $mediaFieldContentHtml = ''; + if($mediaFile) { + $previewImgHtml = $presenter->img([ + 'src' => $mediaFile->url + ]); + } + $mediaFieldContentHtml .= $presenter->input(array_merge([ + 'type' => 'hidden', + 'class' => 'input', + 'value' => $mediaFileId + ], $inputHtmlArgs)); + $mediaFieldContentHtml .= $presenter->div([ + 'class' => 'form-group row', + 'html' => $presenter->div([ + 'class' => 'col-6', + 'html' => $presenter->div([ + 'class' => 'preview', + 'html' => $previewImgHtml + ]) + ]) + ]); + $mediaFieldContentHtml .= $presenter->div([ + 'class' => 'form-group row', + 'html' => [ + $presenter->div([ + 'class' => 'col-3', + 'html' => $presenter->button([ + 'class' => ['btn', 'btn-success', 'select-media'], + 'html' => trans('form.buttons.select') + ]) + ]), + $presenter->div([ + 'class' => 'col-3', + 'html' => $presenter->button([ + 'class' => ['btn', 'btn-danger', 'clear-media'], + 'style' => !$mediaFile ? 'display:none;' : '', + 'html' => trans('form.buttons.remove') + ]) + ]) + ] + ]); + return $presenter->div([ + 'class' => array_merge($wrapperClasses, ['media-selection-field']), + 'html' => $mediaFieldContentHtml + ]); + } +} diff --git a/app/Presenters/Admin/OptionFormFieldsPresenter.php b/app/Presenters/Admin/OptionFormFieldsPresenter.php index 240935e..512c9c4 100644 --- a/app/Presenters/Admin/OptionFormFieldsPresenter.php +++ b/app/Presenters/Admin/OptionFormFieldsPresenter.php @@ -12,7 +12,7 @@ class OptionFormFieldsPresenter $options = config('admin.options.' . $page); $presenter = app('Html'); $optionRepo = app('Option'); - $mediaFileRepo = app(MediaFileRepository::class); + $mediaSelectionFieldPresenter = app(MediaSelectionFieldPresenter::class); $html = ''; if(!empty($options['fields'])) { foreach($options['fields'] as $key => $option) { @@ -37,7 +37,7 @@ class OptionFormFieldsPresenter ]), $presenter->div([ 'class' => 'col-12 col-md-6', - 'html' => function() use ($key, $type, $required, $presenter, $optionRepo, $mediaFileRepo) { + 'html' => function() use ($key, $type, $required, $presenter, $optionRepo, $mediaSelectionFieldPresenter) { $html = ''; $bastHtmlArgs = [ @@ -46,54 +46,8 @@ class OptionFormFieldsPresenter ]; 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' => 'form-group row', - 'html' => $presenter->div([ - 'class' => 'col-6', - 'html' => $presenter->div([ - 'class' => 'preview', - 'html' => $previewImgHtml - ]) - ]) - ]); - $mediaFieldContentHtml .= $presenter->div([ - 'class' => 'form-group row', - 'html' => [ - $presenter->div([ - 'class' => 'col-3', - 'html' => $presenter->button([ - 'class' => ['btn', 'btn-success', 'select-media'], - 'html' => trans('form.buttons.select') - ]) - ]), - $presenter->div([ - 'class' => 'col-3', - 'html' => $presenter->button([ - 'class' => ['btn', 'btn-danger', 'clear-media'], - 'style' => !$mediaFile ? 'display:none;' : '', - 'html' => trans('form.buttons.remove') - ]) - ]) - ] - ]); - $html .= $presenter->div([ - 'class' => 'option-media-field', - 'html' => $mediaFieldContentHtml - ]); + $mediaFileId = $optionRepo->$key; + $html .= $mediaSelectionFieldPresenter->render($mediaFileId, $bastHtmlArgs, ['option-media-field']); break; case 'text': case 'password': diff --git a/app/Repositories/PostRepository.php b/app/Repositories/PostRepository.php new file mode 100644 index 0000000..cedf4ec --- /dev/null +++ b/app/Repositories/PostRepository.php @@ -0,0 +1,27 @@ +setModel(app($model)); + } elseif($model instanceof Post) { + $this->setModel($model); + } + } + + /** + * @param int $postsPerPage + * @return LengthAwarePaginator + */ + public function getPostsPager($postsPerPage = 15) + { + return $this->getModelClass()::orderByDesc('created_at')->paginate($postsPerPage); + } +} diff --git a/app/Traits/ModelAttributeTranslationsUpdattable.php b/app/Traits/ModelAttributeTranslationsUpdattable.php new file mode 100644 index 0000000..6792196 --- /dev/null +++ b/app/Traits/ModelAttributeTranslationsUpdattable.php @@ -0,0 +1,26 @@ +setTranslatedModel($model); + $locales = app('SiteState')->languages; + $defaultLocale = config('app.locale'); + + foreach ($translations as $locale => $translation) { + if(in_array($locale, $locales)) { + $transRepo->updateModelTranslation($model->id, $attribute, $locale, $translation); + } + } + if(isset($translations[$defaultLocale])) { + $model->$attribute = $translations[$defaultLocale]; + $model->save(); + } + } +} diff --git a/config/admin.php b/config/admin.php index 841fbf6..6d36567 100644 --- a/config/admin.php +++ b/config/admin.php @@ -8,6 +8,29 @@ return [ 'route_name_prefix' => 'admin.', // 後台選單項目 'menuItems' => [ + [ + 'type' => 'title', + 'name' => 'posts', + ], + [ + 'type' => 'item', + 'controller' => Menu\Articles\ArticlesMenuItemController::class, + 'children' => [ + Menu\Articles\Children\ListMenuItemController::class, + Menu\Articles\Children\CreateMenuItemController::class, + ] + ], + [ + 'type' => 'item', + 'controller' => Menu\Portfolios\PortfoliosMenuItemController::class, + 'children' => [ + Menu\Portfolios\Children\ListMenuItemController::class, + Menu\Portfolios\Children\CreateMenuItemController::class, + ] + ], + [ + 'type' => 'divider' + ], [ 'type' => 'item', 'controller' => Menu\Options\OptionsMenuItemController::class, diff --git a/config/postTypes.php b/config/postTypes.php new file mode 100644 index 0000000..9aef4aa --- /dev/null +++ b/config/postTypes.php @@ -0,0 +1,9 @@ + [ + 'model' => \App\Article::class + ], + 'portfolio' => [ + 'model' => \App\Portfolio::class + ], +]; diff --git a/config/posts.php b/config/posts.php deleted file mode 100644 index 84cc13b..0000000 --- a/config/posts.php +++ /dev/null @@ -1,5 +0,0 @@ - { $('#app-header .medialibrary').on('click', function(){ app.adminMediaLibrary = app.methods.media(false, null, false); }); + + $('.media-selection-field .select-media').on('click', e => { + e.preventDefault() + let $this = $(e.currentTarget), + $wrapper = $this.closest('.media-selection-field'), + $input = $wrapper.find('input'), + $preview = $wrapper.find('.preview'), + $clearButton = $wrapper.find('.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() + }) + }) + + $('.media-selection-field .clear-media').on('click', e => { + e.preventDefault() + let $this = $(e.currentTarget), + $wrapper = $this.closest('.media-selection-field'), + $input = $wrapper.find('input'), + $preview = $wrapper.find('.preview') + + $input.val(null) + $preview.empty() + $this.hide() + }) }) diff --git a/resources/js/admin/page/options.js b/resources/js/admin/page/options.js index 7e627f1..e69de29 100644 --- a/resources/js/admin/page/options.js +++ b/resources/js/admin/page/options.js @@ -1,28 +0,0 @@ -$('.select-media').on('click', e => { - e.preventDefault() - let $this = $(e.currentTarget), - $wrapper = $this.closest('.option-media-field'), - $input = $wrapper.find('input'), - $preview = $wrapper.find('.preview'), - $clearButton = $wrapper.find('.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), - $wrapper = $this.closest('.option-media-field'), - $input = $wrapper.find('input'), - $preview = $wrapper.find('.preview') - - $input.val(null) - $preview.empty() - $this.hide() -}) diff --git a/resources/lang/en/adminMenu.php b/resources/lang/en/adminMenu.php index ceedf30..bb2fabe 100644 --- a/resources/lang/en/adminMenu.php +++ b/resources/lang/en/adminMenu.php @@ -12,6 +12,19 @@ return array( 'routes' => 'Route List', 'system' => 'System', 'gateAbilities' => 'Gate Abilities', + ], + 'articles' => [ + 'articles' => 'Articles', + 'list' => 'List', + 'create' => 'Create', + ], + 'portfolios' => [ + 'portfolios' => 'Portfolios', + 'list' => 'List', + 'create' => 'Create' ] ], + 'titles' => [ + 'posts' => 'Posts' + ] ); diff --git a/resources/lang/en/adminPageHeader.php b/resources/lang/en/adminPageHeader.php index 26b6045..32502e6 100644 --- a/resources/lang/en/adminPageHeader.php +++ b/resources/lang/en/adminPageHeader.php @@ -6,4 +6,10 @@ return [ 'development' => 'Development Settings', 'platform' => 'Platform Settings', ], + 'articles' => [ + 'articles' => 'Articles' + ], + 'portfolios' => [ + 'portfolios' => 'Portfolios' + ] ]; diff --git a/resources/lang/en/form.php b/resources/lang/en/form.php index 4464dd9..7699dfc 100644 --- a/resources/lang/en/form.php +++ b/resources/lang/en/form.php @@ -3,6 +3,19 @@ return [ 'buttons' => [ 'update' => 'Update', 'select' => 'Select', - 'remove' => 'Remove' + 'remove' => 'Remove', + 'create' => 'Create', + 'delete' => 'Delete', + 'logout' => 'Logout', + ], + 'titles' => [ + 'title' => 'Title', + 'author' => 'Author', + 'created' => 'Created', + 'updated' => 'Updated', + 'operations' => 'Operations', + 'excerpt' => 'Excerpt', + 'content' => 'Content', + 'featureImage' => 'Feature Image' ] ]; diff --git a/resources/lang/en/languages.php b/resources/lang/en/languages.php new file mode 100644 index 0000000..4af6f89 --- /dev/null +++ b/resources/lang/en/languages.php @@ -0,0 +1,9 @@ + 'English', + 'zh-tw' => 'Chinese Traditional', + 'zh-cn' => 'Chinese Simplified', + 'ja' => 'Japanese', + 'ko' => 'Korean', +); diff --git a/resources/lang/en/mediaLibrary.php b/resources/lang/en/mediaLibrary.php index 806a92f..27a32fb 100644 --- a/resources/lang/en/mediaLibrary.php +++ b/resources/lang/en/mediaLibrary.php @@ -1,5 +1,6 @@ 'Media Library', 'tabCategory' => 'Category', 'tabUpload' => 'Upload', 'tabBrowse' => 'Browse', diff --git a/resources/lang/zh-tw/adminMenu.php b/resources/lang/zh-tw/adminMenu.php new file mode 100644 index 0000000..a77a51f --- /dev/null +++ b/resources/lang/zh-tw/adminMenu.php @@ -0,0 +1,30 @@ + [ + 'options' => [ + 'options' => '設定', + 'general' => '一般', + 'development' => '開發', + 'platform' => '平台', + ], + 'systemStatus' => [ + 'systemStatus' => '系統狀態', + 'routes' => '路由列表', + 'system' => '系統資訊', + 'gateAbilities' => 'Gate能力列表', + ], + 'articles' => [ + 'articles' => '文章', + 'list' => '列表', + 'create' => '建立', + ], + 'portfolios' => [ + 'portfolios' => '作品集', + 'list' => '列表', + 'create' => '建立' + ] + ], + 'titles' => [ + 'posts' => '文章內容' + ] +); diff --git a/resources/lang/zh-tw/languages.php b/resources/lang/zh-tw/languages.php new file mode 100644 index 0000000..aa10534 --- /dev/null +++ b/resources/lang/zh-tw/languages.php @@ -0,0 +1,9 @@ + '英文', + 'zh-tw' => '繁體中文', + 'zh-cn' => '簡體中文', + 'ja' => '日文', + 'ko' => '韓文', +); diff --git a/resources/lang/zh-tw/mediaLibrary.php b/resources/lang/zh-tw/mediaLibrary.php index 8d0ce7f..b827bfe 100644 --- a/resources/lang/zh-tw/mediaLibrary.php +++ b/resources/lang/zh-tw/mediaLibrary.php @@ -1,5 +1,6 @@ '媒體庫', 'category' => '分類', 'date' => '日期', 'delete' => '刪除', diff --git a/resources/sass/admin/app.scss b/resources/sass/admin/app.scss index 274acef..0d81d04 100644 --- a/resources/sass/admin/app.scss +++ b/resources/sass/admin/app.scss @@ -5,3 +5,21 @@ @import "components/blockui"; @import "../components/media-library"; @import "../app-common"; +//媒體庫圖片預覽 +.media-selection-field { + .preview { + img { + max-width: 100%; + } + } +} +//左側主選單子項目 +.sidebar-nav { + ul.submenu { + li.nav-item { + a.nav-link { + padding: 0.3rem 0.6rem 0.3rem 1.4rem; + } + } + } +} diff --git a/resources/sass/admin/page/post-list.scss b/resources/sass/admin/page/post-list.scss new file mode 100644 index 0000000..5bf5301 --- /dev/null +++ b/resources/sass/admin/page/post-list.scss @@ -0,0 +1,5 @@ +td.feature-image { + img { + max-width: 50px; + } +} diff --git a/resources/views/admin/layouts/app.blade.php b/resources/views/admin/layouts/app.blade.php index 5efe770..26cb130 100644 --- a/resources/views/admin/layouts/app.blade.php +++ b/resources/views/admin/layouts/app.blade.php @@ -34,7 +34,7 @@ @include('components.navBrand')