diff --git a/database/factories/PageFactory.php b/database/factories/PageFactory.php index 85cbda0..1ccc44b 100644 --- a/database/factories/PageFactory.php +++ b/database/factories/PageFactory.php @@ -7,6 +7,7 @@ use DrewRoberts\Blog\Models\Page; use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Factories\Factory; +use DrewRoberts\Blog\Models\Layout; class PageFactory extends Factory { @@ -14,6 +15,9 @@ class PageFactory extends Factory public function definition() { + $view = $this->faker->numberBetween(0, 1) === 0 ? 'blog::page.base' : 'blog::page.amp'; + $layout = Layout::where('view',$view)->first(); + $word1 = $this->faker->name; $word2 = $this->faker->word; @@ -29,6 +33,7 @@ public function definition() 'author_id' => randomOrCreate(app('user')), 'creator_id' => randomOrCreate(app('user')), 'updater_id' => randomOrCreate(app('user')), + 'layout_id' => $layout->id, 'published_at' => $this->faker->dateTimeBetween($startDate = '-1 years', $endDate = '-1 days', $timezone = null) ]; } diff --git a/database/factories/PostFactory.php b/database/factories/PostFactory.php index 941ce68..c2c9af2 100644 --- a/database/factories/PostFactory.php +++ b/database/factories/PostFactory.php @@ -7,6 +7,7 @@ use DrewRoberts\Blog\Models\Post; use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Factories\Factory; +use DrewRoberts\Blog\Models\Layout; class PostFactory extends Factory { @@ -14,6 +15,9 @@ class PostFactory extends Factory public function definition() { + $view = $this->faker->numberBetween(0, 1) === 0 ? 'blog::post.base' : 'blog::post.amp'; + $layout = Layout::where('view',$view)->first(); + $word1 = $this->faker->name; $word2 = $this->faker->word; @@ -30,6 +34,7 @@ public function definition() 'author_id' => randomOrCreate(app('user')), 'creator_id' => randomOrCreate(app('user')), 'updater_id' => randomOrCreate(app('user')), + 'layout_id' => $layout->id, 'published_at' => $this->faker->dateTimeBetween($startDate = '-1 years', $endDate = '-1 days', $timezone = null) ]; } diff --git a/database/migrations/2017_05_20_130000_create_pages_table.php b/database/migrations/2017_05_20_130000_create_pages_table.php index aeff51e..6056fd2 100644 --- a/database/migrations/2017_05_20_130000_create_pages_table.php +++ b/database/migrations/2017_05_20_130000_create_pages_table.php @@ -13,7 +13,7 @@ public function up() $table->string('slug')->index(); $table->string('title')->unique(); $table->foreignIdFor(app('layout'))->nullable(); // Will remove nullable and default a basic layout for pages. Allows some pages to have different layout (AMP or regular html & other variations) - $table->boolean('location_based')->default('false'); + $table->boolean('location_based')->default(false); $table->foreignIdFor(app('page'), 'parent_id')->nullable(); // Parent Page $table->text('content')->nullable(); // Will be written in Markdown. diff --git a/src/BlogServiceProvider.php b/src/BlogServiceProvider.php index e446c81..1f502ed 100644 --- a/src/BlogServiceProvider.php +++ b/src/BlogServiceProvider.php @@ -36,6 +36,7 @@ public function configureTipoffPackage(TipoffPackage $package): void \DrewRoberts\Blog\Nova\Post::class, \DrewRoberts\Blog\Nova\Series::class, \DrewRoberts\Blog\Nova\Topic::class, + \DrewRoberts\Blog\Nova\Layout::class, ]) ->hasWebRoute('web') ->hasViews() diff --git a/src/Models/Layout.php b/src/Models/Layout.php index 87eb5ed..255089a 100644 --- a/src/Models/Layout.php +++ b/src/Models/Layout.php @@ -14,4 +14,14 @@ class Layout extends BaseModel use HasCreator; use HasPackageFactory; use HasUpdater; + + public function posts() + { + return $this->hasMany(app('post')); + } + + public function pages() + { + return $this->hasMany(app('page')); + } } diff --git a/src/Nova/Layout.php b/src/Nova/Layout.php new file mode 100644 index 0000000..a816bc8 --- /dev/null +++ b/src/Nova/Layout.php @@ -0,0 +1,73 @@ +sortable(), + Text::make('Name')->sortable()->required(), + Text::make('Layout Type')->sortable()->required(), + Text::make('View')->sortable()->required(), + nova('page') ? HasMany::make('Pages') : null, + nova('post') ? HasMany::make('Posts') : null, + nova('user') ? BelongsTo::make('Author', 'author', nova('user'))->sortable() : null, + ]; + } + + public function fields(Request $request) + { + return [ + Text::make('Name')->sortable()->required(), + Text::make('Layout Type')->sortable()->required(), + Text::make('View')->sortable()->required(), + Text::make('Note')->sortable()->nullable(), + + new Panel('Info Fields', $this->infoFields()), + new Panel('Data Fields', $this->dataFields()), + ]; + } + + protected function infoFields() + { + return [ + nova('user') ? BelongsTo::make('Author', 'author', nova('user'))->sortable() : null, + nova('image') ? BelongsTo::make('Image', 'image', nova('image'))->nullable()->showCreateRelationButton() : null, + ]; + } + + protected function dataFields(): array + { + return array_merge( + parent::dataFields(), + $this->creatorDataFields(), + $this->updaterDataFields(), + ); + } +} diff --git a/src/Nova/Page.php b/src/Nova/Page.php index 6dd72cd..f5d1cd0 100644 --- a/src/Nova/Page.php +++ b/src/Nova/Page.php @@ -35,6 +35,7 @@ public function fieldsForIndex(NovaRequest $request) Text::make('Title')->sortable(), nova('page') ? BelongsTo::make('Parent', 'parent', nova('page'))->sortable() : null, nova('user') ? BelongsTo::make('Author', 'author', nova('user'))->sortable() : null, + nova('layout') ? BelongsTo::make('Layout', 'layout', nova('layout'))->nullable() : null, DateTime::make('Published', 'published_at')->format('YYYY-MM-DD')->sortable(), ]; } diff --git a/src/Nova/Post.php b/src/Nova/Post.php index ceb249c..6062c80 100644 --- a/src/Nova/Post.php +++ b/src/Nova/Post.php @@ -35,6 +35,7 @@ public function fieldsForIndex(NovaRequest $request) Text::make('Title')->sortable(), nova('series') ? BelongsTo::make('Series', 'series', nova('series'))->sortable() : null, nova('user') ? BelongsTo::make('Author', 'author', nova('user'))->sortable() : null, + nova('layout') ? BelongsTo::make('Layout', 'layout', nova('layout'))->nullable() : null, DateTime::make('Published', 'published_at')->format('YYYY-MM-DD')->sortable(), ]; } diff --git a/tests/Unit/Models/LayoutTest.php b/tests/Unit/Models/LayoutTest.php new file mode 100644 index 0000000..432dcbc --- /dev/null +++ b/tests/Unit/Models/LayoutTest.php @@ -0,0 +1,25 @@ +faker->name; + $layout = Layout::factory()->create(['name' => $name]); + + $this->assertEquals($name, $layout->name); + } +} \ No newline at end of file