diff --git a/backend/app/Controllers/ElementController.php b/backend/app/Controllers/ElementController.php index 8665880..0101dea 100644 --- a/backend/app/Controllers/ElementController.php +++ b/backend/app/Controllers/ElementController.php @@ -55,9 +55,6 @@ class ElementController $result->getChildElements(), ), 'element' => $this->buildElementPayload($element), - 'parentElement' => $this->buildElementSummaryPayload( - $element->getParentElement(), - ), 'siblingElements' => $this->buildElementSummaryPayloads( $result->getSiblingElements(), ), @@ -331,35 +328,16 @@ class ElementController { $payloads = []; foreach ($elements as $element) { - $payload = $this->buildElementSummaryPayload($element); - if ($payload !== null) { - $payloads[] = $payload; - } + $payloads[] = [ + 'id' => $element->getId(), + 'title' => $element->getTitle(), + 'description' => $element->getDescription(), + ]; } return $payloads; } - /** - * @return array{ - * id: int, - * title: string, - * description: string, - * }|null - */ - private function buildElementSummaryPayload(?Element $element): ?array - { - if ($element === null) { - return null; - } - - return [ - 'id' => $element->getId(), - 'title' => $element->getTitle(), - 'description' => $element->getDescription(), - ]; - } - private function storageUrl(?string $path, string $folderPrefix): ?string { if ($path === null) { diff --git a/backend/tests/Feature/ElementsEndpointTest.php b/backend/tests/Feature/ElementsEndpointTest.php index 3f21172..329e932 100644 --- a/backend/tests/Feature/ElementsEndpointTest.php +++ b/backend/tests/Feature/ElementsEndpointTest.php @@ -94,7 +94,6 @@ class ElementsEndpointTest extends TestCase 'longPdfPath' => '/assets/pdfs/baderech-long.pdf', 'youtubeUrl' => $sampleYoutubeUrl, ], - 'parentElement' => null, 'siblingElements' => [ [ 'id' => $element->getId(), @@ -152,11 +151,6 @@ class ElementsEndpointTest extends TestCase ); $response->assertOk(); - $response->assertJsonPath('parentElement', [ - 'id' => $parentElement->getId(), - 'title' => 'Baderech HaAvodah', - 'description' => 'A structured path for growth', - ]); $response->assertJsonPath('siblingElements', [ [ 'id' => $firstChildElement->getId(), diff --git a/backend/tests/Unit/Controllers/ElementControllerTest.php b/backend/tests/Unit/Controllers/ElementControllerTest.php index 1ebcb9c..7704306 100644 --- a/backend/tests/Unit/Controllers/ElementControllerTest.php +++ b/backend/tests/Unit/Controllers/ElementControllerTest.php @@ -140,7 +140,6 @@ class ElementControllerTest extends TestCase 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', $body['element']['youtubeUrl'], ); - $this->assertNull($body['parentElement']); $this->assertSame([ [ 'id' => $firstChildElement->getId(), @@ -203,11 +202,6 @@ class ElementControllerTest extends TestCase $this->assertEquals(200, $response->getStatusCode()); $body = json_decode($response->getContent(), true); - $this->assertSame([ - 'id' => $parentElement->getId(), - 'title' => 'Baderech HaAvodah', - 'description' => 'A structured path for growth', - ], $body['parentElement']); $this->assertSame([ [ 'id' => $firstChildElement->getId(), diff --git a/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts index 57a89ca..8c52491 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts @@ -10,63 +10,6 @@ function loginAsAdmin(): void { } describe('element sibling navigation', () => { - it('navigates public parent elements when one exists', () => { - cy.visit('/element/1') - cy.contains('h1', 'Baderech HaAvodah').should('be.visible') - cy.get('[data-cy="element-parent-link"]').should('not.exist') - - cy.visit('/element/2') - cy.contains('h1', '1. Introduction').should('be.visible') - cy.get('[data-cy="element-parent-link"]').as('parentLink') - cy.get('@parentLink') - .should('be.visible') - .and('contain.text', 'Parent: Baderech HaAvodah') - cy.get('@parentLink').should('have.attr', 'href', '/element/1') - cy.get('@parentLink').then((parentLinkElements) => { - cy.get('h1').then((headingElements) => { - expect( - parentLinkElements[0].compareDocumentPosition(headingElements[0]) - & Node.DOCUMENT_POSITION_FOLLOWING, - ).to.not.equal(0) - }) - }) - cy.get('@parentLink').click() - - cy.location('pathname').should('eq', '/element/1') - cy.contains('h1', 'Baderech HaAvodah').should('be.visible') - }) - - it('navigates admin parent elements when one exists', () => { - loginAsAdmin() - - cy.visit('/admin/element/1') - cy.get('[data-cy="admin-element-title"]') - .should('have.value', 'Baderech HaAvodah') - cy.get('[data-cy="admin-parent-link"]').should('not.exist') - - cy.visit('/admin/element/2') - cy.get('[data-cy="admin-element-title"]') - .should('have.value', '1. Introduction') - cy.get('[data-cy="admin-parent-link"]').as('parentLink') - cy.get('@parentLink') - .should('be.visible') - .and('contain.text', 'Parent: Baderech HaAvodah') - cy.get('@parentLink').should('have.attr', 'href', '/admin/element/1') - cy.get('@parentLink').then((parentLinkElements) => { - cy.get('.admin-element-page__heading').then((headingElements) => { - expect( - parentLinkElements[0].compareDocumentPosition(headingElements[0]) - & Node.DOCUMENT_POSITION_FOLLOWING, - ).to.not.equal(0) - }) - }) - cy.get('@parentLink').click() - - cy.location('pathname').should('eq', '/admin/element/1') - cy.get('[data-cy="admin-element-title"]') - .should('have.value', 'Baderech HaAvodah') - }) - it('navigates public same-parent elements with wraparound', () => { cy.visit('/element/1') cy.contains('h1', 'Baderech HaAvodah').should('be.visible') diff --git a/frontend/rabbi_gerzi/src/components/ElementParentLink.vue b/frontend/rabbi_gerzi/src/components/ElementParentLink.vue deleted file mode 100644 index f105b68..0000000 --- a/frontend/rabbi_gerzi/src/components/ElementParentLink.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/frontend/rabbi_gerzi/src/stores/elements.ts b/frontend/rabbi_gerzi/src/stores/elements.ts index 870eb2e..074ba04 100644 --- a/frontend/rabbi_gerzi/src/stores/elements.ts +++ b/frontend/rabbi_gerzi/src/stores/elements.ts @@ -20,7 +20,6 @@ type ElementFileType = 'iconImage' | 'shortPdf' | 'longPdf' interface ElementResponse { element: Element childElements: ChildElement[] - parentElement: ChildElement | null siblingElements: ChildElement[] } @@ -64,7 +63,6 @@ const ELEMENT_UPDATE_URL = `${API_BASE_URL}/api/element/update` export const useElementsStore = defineStore('elements', () => { const element = ref(null) const childElements = ref([]) - const parentElement = ref(null) const siblingElements = ref([]) const isLoading = ref(false) const error = ref(null) @@ -79,7 +77,6 @@ export const useElementsStore = defineStore('elements', () => { async function fetchElement(elementId: string): Promise { element.value = null childElements.value = [] - parentElement.value = null siblingElements.value = [] error.value = null saveError.value = null @@ -104,11 +101,9 @@ export const useElementsStore = defineStore('elements', () => { const data: ElementResponse = await response.json() element.value = data.element childElements.value = data.childElements - parentElement.value = data.parentElement siblingElements.value = data.siblingElements } catch { childElements.value = [] - parentElement.value = null siblingElements.value = [] error.value = 'Network error - could not load element' } finally { @@ -456,7 +451,6 @@ export const useElementsStore = defineStore('elements', () => { return { element, childElements, - parentElement, siblingElements, isLoading, error, diff --git a/frontend/rabbi_gerzi/src/views/AdminElementPage.vue b/frontend/rabbi_gerzi/src/views/AdminElementPage.vue index 3d529ba..2c66cfc 100644 --- a/frontend/rabbi_gerzi/src/views/AdminElementPage.vue +++ b/frontend/rabbi_gerzi/src/views/AdminElementPage.vue @@ -6,7 +6,6 @@ import { ChevronUp as ChevronUpIcon, } from 'lucide-vue-next' import { useRoute, useRouter } from 'vue-router' -import ElementParentLink from '@/components/ElementParentLink.vue' import ElementSiblingNavigation from '@/components/ElementSiblingNavigation.vue' import RichTextEditor from '@/components/RichTextEditor.vue' import SiteHeader from '@/components/SiteHeader.vue' @@ -31,7 +30,6 @@ const elementsStore = useElementsStore() const { element, childElements, - parentElement, siblingElements, isLoading, error, @@ -354,12 +352,6 @@ function resetInput(changeEvent: Event): void {
-

Edit Element

@@ -738,7 +730,7 @@ function resetInput(changeEvent: Event): void { } .admin-element-page__heading { - margin: 0.35rem 0 0; + margin: 0; color: #2c2c2c; font-family: var(--font-serif); font-size: 2rem; diff --git a/frontend/rabbi_gerzi/src/views/ElementPage.vue b/frontend/rabbi_gerzi/src/views/ElementPage.vue index c2ed707..fbf4dee 100644 --- a/frontend/rabbi_gerzi/src/views/ElementPage.vue +++ b/frontend/rabbi_gerzi/src/views/ElementPage.vue @@ -2,7 +2,6 @@ import { storeToRefs } from 'pinia' import { computed, watch } from 'vue' import { useRoute } from 'vue-router' -import ElementParentLink from '@/components/ElementParentLink.vue' import ElementSiblingNavigation from '@/components/ElementSiblingNavigation.vue' import SiteHeader from '@/components/SiteHeader.vue' import { useElementsStore } from '@/stores/elements' @@ -11,14 +10,8 @@ type TimestampPart = string | undefined const route = useRoute() const elementsStore = useElementsStore() -const { - element, - childElements, - parentElement, - siblingElements, - isLoading, - error, -} = storeToRefs(elementsStore) +const { element, childElements, siblingElements, isLoading, error } = + storeToRefs(elementsStore) const youtubeIframeAllow = [ 'accelerometer', @@ -228,17 +221,6 @@ function isShortYoutubeHost(hostname: string): boolean { data-cy="element-icon" /> -
- -
-

{{ element.title }}

@@ -353,12 +335,6 @@ function isShortYoutubeHost(hostname: string): boolean { object-fit: contain; } -.element-page__parent-navigation { - display: flex; - justify-content: center; - margin: 0 0 0.5rem; -} - .element-page__heading { margin: 0; color: #2c2c2c;