diff --git a/backend/app/Controllers/ElementController.php b/backend/app/Controllers/ElementController.php index 0e71cea..4942d19 100644 --- a/backend/app/Controllers/ElementController.php +++ b/backend/app/Controllers/ElementController.php @@ -46,6 +46,7 @@ class ElementController 'id' => $element->getId(), 'title' => $element->getTitle(), 'description' => $element->getDescription(), + 'richText' => $element->getRichText(), ], ], 200); } diff --git a/backend/app/Element/CreateElementDto.php b/backend/app/Element/CreateElementDto.php index 3bad829..1e48b41 100644 --- a/backend/app/Element/CreateElementDto.php +++ b/backend/app/Element/CreateElementDto.php @@ -10,6 +10,7 @@ class CreateElementDto public Set $set, public string $title, public string $description, + public string $richText, public ?Element $parentElement, ) { } diff --git a/backend/app/Element/Element.php b/backend/app/Element/Element.php index 7f007ce..2c9395a 100644 --- a/backend/app/Element/Element.php +++ b/backend/app/Element/Element.php @@ -10,6 +10,7 @@ class Element private int $id, private string $title, private string $description, + private string $richText, private Set $set, private ?Element $parentElement, ) { @@ -30,6 +31,11 @@ class Element return $this->description; } + public function getRichText(): string + { + return $this->richText; + } + public function getSet(): Set { return $this->set; diff --git a/backend/app/Element/ElementModel.php b/backend/app/Element/ElementModel.php index 4f79f3b..a1ffa17 100644 --- a/backend/app/Element/ElementModel.php +++ b/backend/app/Element/ElementModel.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Model; * @property int $set_id * @property string $title * @property string $description + * @property string $rich_text * @property int|null $parent_element_id * * @method static Builder|ElementModel newModelQuery() @@ -20,6 +21,7 @@ use Illuminate\Database\Eloquent\Model; * @method static Builder|ElementModel whereSetId($value) * @method static Builder|ElementModel whereTitle($value) * @method static Builder|ElementModel whereDescription($value) + * @method static Builder|ElementModel whereRichText($value) * * @mixin \Eloquent */ @@ -33,6 +35,7 @@ class ElementModel extends Model 'set_id', 'title', 'description', + 'rich_text', 'parent_element_id', ]; diff --git a/backend/app/Element/EloquentElementRepository.php b/backend/app/Element/EloquentElementRepository.php index 7b7065a..455852c 100644 --- a/backend/app/Element/EloquentElementRepository.php +++ b/backend/app/Element/EloquentElementRepository.php @@ -18,6 +18,7 @@ class EloquentElementRepository implements ElementRepository 'set_id' => $dto->set->getId(), 'title' => $dto->title, 'description' => $dto->description, + 'rich_text' => $dto->richText, 'parent_element_id' => $dto->parentElement?->getId(), ]); @@ -25,6 +26,7 @@ class EloquentElementRepository implements ElementRepository id: $model->id, title: $dto->title, description: $dto->description, + richText: $dto->richText, set: $dto->set, parentElement: $dto->parentElement, ); @@ -105,6 +107,7 @@ class EloquentElementRepository implements ElementRepository id: $model->id, title: $model->title, description: $model->description, + richText: $model->rich_text, set: $set, parentElement: $parentElement, ); diff --git a/backend/app/Element/UseCases/CreateElement/CreateElement.php b/backend/app/Element/UseCases/CreateElement/CreateElement.php index 1cb4b37..47d5684 100644 --- a/backend/app/Element/UseCases/CreateElement/CreateElement.php +++ b/backend/app/Element/UseCases/CreateElement/CreateElement.php @@ -31,6 +31,7 @@ class CreateElement throw new BadRequestException('title is required'); } $description = $request->description ?? ''; + $richText = $request->richText ?? ''; $set = $this->setRepo->find($request->setId); if ($set === null) { @@ -46,6 +47,7 @@ class CreateElement set: $set, title: $request->title, description: $description, + richText: $richText, parentElement: null, )); } @@ -68,6 +70,7 @@ class CreateElement set: $set, title: $request->title, description: $description, + richText: $richText, parentElement: $parentElement, )); } diff --git a/backend/app/Element/UseCases/CreateElement/CreateElementRequest.php b/backend/app/Element/UseCases/CreateElement/CreateElementRequest.php index b028326..908a4d6 100644 --- a/backend/app/Element/UseCases/CreateElement/CreateElementRequest.php +++ b/backend/app/Element/UseCases/CreateElement/CreateElementRequest.php @@ -8,6 +8,7 @@ class CreateElementRequest public ?int $setId, public ?string $title, public ?string $description, + public ?string $richText, public ?int $parentElementId, ) { } diff --git a/backend/database/migrations/2026_05_24_000001_elements_table.php b/backend/database/migrations/2026_05_24_000001_elements_table.php index f09b3b0..0f96d3a 100644 --- a/backend/database/migrations/2026_05_24_000001_elements_table.php +++ b/backend/database/migrations/2026_05_24_000001_elements_table.php @@ -13,6 +13,7 @@ return new class extends Migration $table->foreignId('set_id')->constrained('sets'); $table->string('title'); $table->text('description')->default(''); + $table->text('rich_text')->default(''); $table->foreignId('parent_element_id') ->nullable() ->constrained('elements'); diff --git a/backend/database/seeders/ElementSeeder.php b/backend/database/seeders/ElementSeeder.php index b356df9..02d2467 100644 --- a/backend/database/seeders/ElementSeeder.php +++ b/backend/database/seeders/ElementSeeder.php @@ -18,6 +18,9 @@ class ElementSeeder extends Seeder set: $baderechSet, title: $baderechSet->getName(), description: $baderechSet->getDescription(), + richText: '

Begin with a clear map for avodah growth.

' + . '

Move steadily from awareness ' + . 'to practice.

', parentElement: null, )); $elementRepository->create(new CreateElementDto( @@ -25,12 +28,16 @@ class ElementSeeder extends Seeder title: 'Avodah Foundations', description: 'Core foundations for building a steady ' . 'avodah practice.', + richText: '

Avodah foundations begin with honest awareness ' + . 'and small repeatable steps.

', parentElement: $rootElement, )); $elementRepository->create(new CreateElementDto( set: $baderechSet, title: 'Daily Practice', description: 'Practical steps for consistent daily growth.', + richText: '

Daily practice turns inspiration into a ' + . 'dependable rhythm.

', parentElement: $rootElement, )); } diff --git a/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts index 3816baf..4dda0e4 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts @@ -50,7 +50,7 @@ describe('media page sets', () => { cy.get('[data-cy="child-element-list"]') .should( 'not.contain.text', - 'Foundations rich text belongs on its own page.', + 'Avodah foundations begin with honest awareness', ) cy.contains('[data-cy="child-element-link"]', 'Avodah Foundations') .as('avodahFoundationsLink') @@ -76,7 +76,7 @@ describe('media page sets', () => { cy.get('[data-cy="element-rich-text"]') .should( 'contain.text', - 'Foundations rich text belongs on its own page.', + 'Avodah foundations begin with honest awareness', ) }) }) diff --git a/frontend/rabbi_gerzi/src/stores/elements.ts b/frontend/rabbi_gerzi/src/stores/elements.ts index b7ae058..6c5f1f4 100644 --- a/frontend/rabbi_gerzi/src/stores/elements.ts +++ b/frontend/rabbi_gerzi/src/stores/elements.ts @@ -1,22 +1,26 @@ import { ref } from 'vue' import { defineStore } from 'pinia' -export interface Element { +export interface ChildElement { id: number title: string description: string } +export interface Element extends ChildElement { + richText: string +} + interface ElementResponse { element: Element - childElements: Element[] + childElements: ChildElement[] } const API_BASE_URL = import.meta.env.VITE_API_BASE_URL as string export const useElementsStore = defineStore('elements', () => { const element = ref(null) - const childElements = ref([]) + const childElements = ref([]) const isLoading = ref(false) const error = ref(null) diff --git a/frontend/rabbi_gerzi/src/views/ElementPage.vue b/frontend/rabbi_gerzi/src/views/ElementPage.vue index fd8a5fa..1956a22 100644 --- a/frontend/rabbi_gerzi/src/views/ElementPage.vue +++ b/frontend/rabbi_gerzi/src/views/ElementPage.vue @@ -49,6 +49,13 @@ watch( {{ element.title }} +
+