Skip to content

Commit

Permalink
Merge pull request #14 from Morning-Train/feature/resource_links
Browse files Browse the repository at this point in the history
Feature/resource links
  • Loading branch information
sunenilausen authored Oct 3, 2021
2 parents ffc9682 + 863ee11 commit cf65635
Show file tree
Hide file tree
Showing 13 changed files with 165 additions and 34 deletions.
7 changes: 7 additions & 0 deletions app/Models/Course/CourseCategory.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

namespace App\Models\Course;

use App\Models\ResourceLink;
use App\Support\Traits\Changeable;
use App\Support\Traits\HasUserGeneratedContent;
use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use MorningTrain\Laravel\Fields\Files\Models\File;

class CourseCategory extends Model
Expand Down Expand Up @@ -51,6 +53,11 @@ public function thumbnail()
return $this->belongsTo(File::class);
}

public function resourceLinks(): HasMany
{
return $this->hasMany(ResourceLink::class)->orderBy('position');
}


//////////////////////////////////
/// Attributes
Expand Down
15 changes: 15 additions & 0 deletions app/Models/ResourceLink.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace App\Models;

use App\Models\Course\CourseCategory;
use Illuminate\Database\Eloquent\Model;
use \Illuminate\Database\Eloquent\Relations\BelongsTo;

class ResourceLink extends Model
{
public function courseCategory(): BelongsTo
{
return $this->belongsTo(CourseCategory::class);
}
}
15 changes: 12 additions & 3 deletions app/Resources/Api/Backend/Courses/Category.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
namespace App\Resources\Api\Backend\Courses;

use App\Models\Course\CourseCategory as Model;
use App\Support\Enums\BasicResourceTypes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Str;
use MorningTrain\Laravel\Fields\Fields\EnumField;
use MorningTrain\Laravel\Fields\Fields\Field;
use MorningTrain\Laravel\Fields\Fields\RelationshipField;
use MorningTrain\Laravel\Fields\Files\FilesField;
use MorningTrain\Laravel\Filters\Filters\Filter;
use MorningTrain\Laravel\Filters\Filters\Order;
Expand All @@ -32,15 +35,21 @@ protected function getFields()

FilesField::create('logo')->validates('file|image'),
FilesField::create('thumbnail')->validates('file|image'),

RelationshipField::create('resource_links', true)->fields([
Field::create('text'),
Field::create('url'),
])->removeMissing()->setOrderTo('position'),
];
}

public function configureReadOperation(Read $operation)
{
$operation->filters([
Filter::create()->always(function (Builder $q) {
$q->with('logo');
$q->with('thumbnail');
Filter::create()->always(function (Builder $query) {
$query->with('logo');
$query->with('thumbnail');
$query->with('resourceLinks');
}),
]);
}
Expand Down
5 changes: 3 additions & 2 deletions app/Resources/Api/Courses/Category.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ public function operations()
public function configureNewestOperation(Index $operation)
{
$operation->filters([
Filter::create()->always(function (Builder $q) {
$q->where('active', '=', true);
Filter::create()->always(function (Builder $query) {
$query->where('active', '=', true);
}),

Order::create()
Expand All @@ -51,6 +51,7 @@ protected function getFilters()
Filter::create()->always(function (Builder $q) {
$q->withCount('completedCourses');
$q->withCount('courses');
$q->with('resourceLinks');
return $q->where('active', '=', true);
}),

Expand Down
15 changes: 15 additions & 0 deletions database/factories/ResourceLinkFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Models\ResourceLink;
use Faker\Generator as Faker;
use \App\Models\Course\CourseCategory;

$factory->define(ResourceLink::class, function (Faker $faker) {
return [
'url' => $faker->url,
'text' => $faker->words($faker->numberBetween(1, 3), true),
'course_category_id' => optional(CourseCategory::query()->inRandomOrder()->first('id'))->id,
];
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateResourceLinksTable extends Migration
{
public function up(): void
{
Schema::create('resource_links', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('url');
$table->string('text');
$table->integer('position')->default(0);
$table->unsignedBigInteger('course_category_id');
$table->timestamps();

$table->foreign('course_category_id')
->references('id')->on('course_categories')
->onDelete('cascade');
});
}

public function down(): void
{
Schema::dropIfExists('resource_links');
}
}
18 changes: 15 additions & 3 deletions database/seeds/CourseCategorySeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class CourseCategorySeeder extends Seeder
*/
public function run()
{
factory(\App\Models\Course\CourseCategory::class, 1)->create([
$categoryOne = factory(\App\Models\Course\CourseCategory::class, 1)->create([
'title' => 'Scratch',
'description' => 'Scratch er et gratis værktøj, som du kan bruge til at programmere dine egne interaktive historier, spil og tegnefilm. Hvis du aldrig har prøvet at programmere før, er Scratch et rigtig godt sted at starte, da Scratch er meget begyndervenligt.',
'color' => '#f9d12b',
Expand All @@ -24,7 +24,11 @@ public function run()
},
]);

factory(\App\Models\Course\CourseCategory::class, 1)->create([
$categoryOne->first()->resourceLinks()->createMany(
factory(\App\Models\ResourceLink::class, 3)->make()->toArray()
);

$categoryTwo = factory(\App\Models\Course\CourseCategory::class, 1)->create([
'title' => 'Javascript via p5.js',
'description' => 'p5.js er et JavaScript-bibliotek, der gør kodning let og tilgængelig for børn og unge, der interesserer sig for at kodning inden for design.',
'color' => '#F7DF1E',
Expand All @@ -36,7 +40,11 @@ public function run()
},
]);

factory(\App\Models\Course\CourseCategory::class, 1)->create([
$categoryTwo->first()->resourceLinks()->createMany(
factory(\App\Models\ResourceLink::class, 1)->make()->toArray()
);

$categoryThree = factory(\App\Models\Course\CourseCategory::class, 1)->create([
'title' => 'Processing.py',
'color' => '#006673',
'active' => false,
Expand All @@ -48,6 +56,10 @@ public function run()
},
]);

$categoryThree->first()->resourceLinks()->createMany(
factory(\App\Models\ResourceLink::class, 2)->make()->toArray()
);

factory(\App\Models\Course\CourseCategory::class, 1)->create([
'title' => 'HTML/CSS',
'description' => 'HTML og CSS er de to kode-sprog, som ligger bag enhver moderne hjemmeside. HTML og CSS sørger for, at tekst, billeder, design osv. ser flot ud i internetbrowseren.',
Expand Down
12 changes: 12 additions & 0 deletions resources/js/pages/backend/courses/categories/Edit.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ import EditForm from "@morningtrain/react-crud/layouts/read/EditForm";
import * as Fields from "support/fields";
import Link from "widgets/navigation/Link";
import { Fieldset } from "layouts";
import React from 'react'
import Text from '../course_resources/Text'
import Video from '../course_resources/Video'
import Questionnaire from '../course_resources/Questionnaire'

export default
@inject(['router'])
Expand Down Expand Up @@ -49,6 +53,14 @@ class Edit extends CrudPage {
<Fields.Files name={'thumbnail'} label={'Billede'} maxFiles={1}/>
</Fieldset>

<Fields.Repeater name={'resource_links'}
addLabel={'Tilføj link'}
label={'Resource links'}>
<Fields.Hidden name={'id'}/>
<Fields.Input name={'text'}/>
<Fields.Input name={'url'}/>
</Fields.Repeater>

</React.Fragment>
);

Expand Down
32 changes: 15 additions & 17 deletions resources/js/widgets/animations/worlds/CourseCoverWorld.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
import React from "react";
import Section from "layouts/Section";
import {inject} from "@morningtrain/react-decorators";

import World from "widgets/animations/worlds/World";

import Sky from "widgets/animations/partials/Sky";
import Water from "widgets/animations/partials/Water";
import ScratchIsland from "widgets/animations/islands/ScratchIsland";

import CoverScrollTransform from "helpers/CoverScrollTransform";
import {Heading} from "support/displays";
import WebIsland from "widgets/animations/islands/WebIsland";
import ProcessingIsland from "widgets/animations/islands/ProcessingIsland";
import SonicIsland from "widgets/animations/islands/SonicIsland";
import Breadcrumbs from 'widgets/navigation/Breadcrumbs';
import WhenModel from 'support/conditionals/WhenModel';
import React from 'react'
import Section from 'layouts/Section'
import { inject } from '@morningtrain/react-decorators'

import World from 'widgets/animations/worlds/World'

import Sky from 'widgets/animations/partials/Sky'
import Water from 'widgets/animations/partials/Water'
import ScratchIsland from 'widgets/animations/islands/ScratchIsland'
import { Heading } from 'support/displays'
import WebIsland from 'widgets/animations/islands/WebIsland'
import ProcessingIsland from 'widgets/animations/islands/ProcessingIsland'
import SonicIsland from 'widgets/animations/islands/SonicIsland'
import Breadcrumbs from 'widgets/navigation/Breadcrumbs'
import WhenModel from 'support/conditionals/WhenModel'

@inject(['model'])
export default class CourseCoverWorld extends World {
Expand Down
15 changes: 8 additions & 7 deletions resources/js/widgets/courses/CourseLoop.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import React from 'react'
import Course from 'widgets/courses/Course'
import { router } from '@morningtrain/helpers'
import * as Filters from 'support/filters'
import * as Auth from '@morningtrain/react-auth'
import WaterLine from 'widgets/animations/partials/WaterLine'
import CourseCoverWorld from 'widgets/animations/worlds/CourseCoverWorld'
import SeaFloorWorld from 'widgets/animations/worlds/SeaFloorWorld'
import CourseResources from './CourseResources'

export default class CourseLoop extends Widget {
constructor (props) {
Expand All @@ -22,13 +22,14 @@ export default class CourseLoop extends Widget {
return (
<div className='courses'>

<div className='courses-cover-world-wrap'>
<Model resourceName='courses.category'>
<Filters.Static constraint='slug' value={this.categorySlug} />
<CourseCoverWorld />
<Model resourceName="courses.category">
<div className="courses-cover-world-wrap">
<Filters.Static constraint="slug" value={this.categorySlug}/>
<CourseCoverWorld/>
<WaterLine left="0" bottom="0" zIndex="5"/>
</div>
<CourseResources/>
</Model>
<WaterLine left='0' bottom='0' zIndex='5' />
</div>

<Collection resourceName='courses.courses'>
<Filters.Static constraint='category_slug' value={this.categorySlug} />
Expand Down
23 changes: 23 additions & 0 deletions resources/js/widgets/courses/CourseResources.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Iterator } from '@morningtrain/react-resources'
import React from 'react'
import * as Displays from 'support/displays'
import { inject } from '@morningtrain/react-decorators'

@inject(['model'])
export default class CourseResources extends React.Component {
render () {
return (
<div className={'course-resource-links-wrapper'}>
<div className={'section-wrap'}>
<div className={'buttons-wrap'}>
<Iterator collection={this.props.model.get('resource_links')}>
<Displays.Link name={'url'} className={'button button--pink small'}>
<Displays.Text name={'text'}/>
</Displays.Link>
</Iterator>
</div>
</div>
</div>
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@
}
}

.course-resource-links-wrapper {
padding-top: 40px;
background: $c_water_surface;
}

.course-cover-world {
position: relative;
height: 0;
Expand Down Expand Up @@ -62,4 +67,4 @@
}
}
}
}
}
6 changes: 5 additions & 1 deletion resources/sass/widgets/courses/_course-wrap.scss
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,8 @@
&--active {
z-index: 2;
}
}
}

.course-resource-links-wrapper + .course-wrap {
padding-top: 40px;
}

0 comments on commit cf65635

Please sign in to comment.