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')
| + | {{ trans('form.titles.title') }} | +{{ trans('form.titles.author') }} | +{{ trans('form.titles.created') }} | +{{ trans('form.titles.updated') }} | +{{ trans('form.titles.operations') }} | +
|---|---|---|---|---|---|
|
+ @if($post->featureImage)
+ |
+ {{ $post->title }} | +{{ $post->author->email }} | +{{ $post->created_at }} | +{{ $post->updated_at }} | ++ + | +