diff --git a/projects/blocks-renderer-angular/src/lib/block/block.html b/projects/blocks-renderer-angular/src/lib/block/block.html index 4f44278..ddc14a6 100644 --- a/projects/blocks-renderer-angular/src/lib/block/block.html +++ b/projects/blocks-renderer-angular/src/lib/block/block.html @@ -4,14 +4,16 @@
} @else if (isVoidType) { - @switch (content.type) { + @let c = content(); + @switch (c.type) { @case ('image') { - + } } } @else { - @switch (content.type) { + @let c = content(); + @switch (c.type) { @case ('paragraph') {

@for (childNode of childrenNodes; track $index) { @@ -54,7 +56,7 @@ } @case ('heading') { - @switch (content.level) { + @switch (c.level) { @case (1) {

{{ plainText }}

} @@ -76,15 +78,15 @@
{{ plainText }}
} } @case ('list') { - @if (content.format === 'ordered') { + @if (c.format === 'ordered') {
    - @for (childNode of content.children; track $index) { + @for (childNode of c.children; track $index) { }
} @else { @@ -109,7 +111,7 @@
{{ plainText }}
} @case ('link') { - + @for (childNode of childrenNodes; track $index) { @if (childNode.type === 'text') { { fixture = TestBed.createComponent(Block); component = fixture.componentInstance; - component.content = { + fixture.componentRef.setInput('content', { type: 'paragraph', children: [{ type: 'text', text: 'test' }], - } as ParagraphBlockNode; + } as ParagraphBlockNode); fixture.detectChanges(); await fixture.whenStable(); }); diff --git a/projects/blocks-renderer-angular/src/lib/block/block.ts b/projects/blocks-renderer-angular/src/lib/block/block.ts index 85e7189..40d5ac4 100644 --- a/projects/blocks-renderer-angular/src/lib/block/block.ts +++ b/projects/blocks-renderer-angular/src/lib/block/block.ts @@ -1,9 +1,7 @@ -import { Component, Input, inject, OnInit } from '@angular/core'; +import { Component, input, inject, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import type { Node, DefaultInlineNode } from '../types'; -import { - BlockComponent, ComponentsContextService -} from '../components-context.service'; +import { BlockComponent, ComponentsContextService } from '../components-context.service'; import { Text } from '../text/text'; const VOID_TYPES = ['image']; @@ -26,16 +24,16 @@ const KNOWN_BLOCK_TYPES = [ standalone: true, }) export class Block implements OnInit { - @Input() content!: Node; + content = input.required(); private componentsContext = inject(ComponentsContextService); get blockComponent(): BlockComponent | undefined { - return this.componentsContext.getBlockComponent(this.content.type); + return this.componentsContext.getBlockComponent(this.content().type); } get isKnownType(): boolean { - return (KNOWN_BLOCK_TYPES as readonly string[]).includes(this.content.type); + return (KNOWN_BLOCK_TYPES as readonly string[]).includes(this.content().type); } get shouldRender(): boolean { @@ -43,28 +41,31 @@ export class Block implements OnInit { } get isVoidType(): boolean { - return VOID_TYPES.includes(this.content.type); + return VOID_TYPES.includes(this.content().type); } get isEmptyParagraph(): boolean { + const c = this.content(); return ( - this.content.type === 'paragraph' && - this.content.children.length === 1 && - this.content.children[0].type === 'text' && - this.content.children[0].text === '' + c.type === 'paragraph' && + c.children.length === 1 && + c.children[0].type === 'text' && + c.children[0].text === '' ); } get plainText(): string | undefined { - if (this.content.type === 'code' || this.content.type === 'heading') { - return this.getPlainText(this.content.children); + const c = this.content(); + if (c.type === 'code' || c.type === 'heading') { + return this.getPlainText(c.children); } return undefined; } get blockProps(): any { - const { children, type, ...props } = this.content; - if (this.content.type === 'code' || this.content.type === 'heading') { + const c = this.content(); + const { children, type, ...props } = c; + if (c.type === 'code' || c.type === 'heading') { return { ...props, plainText: this.plainText, @@ -74,7 +75,7 @@ export class Block implements OnInit { } get childrenNodes(): DefaultInlineNode[] { - return this.content.children as DefaultInlineNode[]; + return this.content().children as DefaultInlineNode[]; } private getPlainText(children: DefaultInlineNode[]): string { @@ -91,7 +92,7 @@ export class Block implements OnInit { ngOnInit(): void { if (!this.shouldRender) { - this.componentsContext.addMissingBlockType(this.content.type); + this.componentsContext.addMissingBlockType(this.content().type); } } } diff --git a/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.html b/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.html index 30098b5..f036f5d 100644 --- a/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.html +++ b/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.html @@ -1,3 +1,3 @@ -@for (block of content; track $index) { +@for (block of content(); track $index) { } diff --git a/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.ts b/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.ts index 41d0552..4cf4332 100644 --- a/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.ts +++ b/projects/blocks-renderer-angular/src/lib/blocks-renderer/blocks-renderer.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit, inject } from '@angular/core'; +import { Component, input, OnInit, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import type { BlocksContent } from '../types'; import { @@ -16,19 +16,19 @@ import { Block } from '../block/block'; providers: [ComponentsContextService], }) export class BlocksRenderer implements OnInit { - @Input() content!: BlocksContent; - @Input() blocks?: Partial; - @Input() modifiers?: Partial; + content = input.required(); + blocks = input>(); + modifiers = input>(); private componentsContext = inject(ComponentsContextService); ngOnInit(): void { const blocks: BlocksComponents = { - ...(this.blocks as BlocksComponents), + ...(this.blocks() as BlocksComponents), }; const modifiers: ModifiersComponents = { - ...(this.modifiers as ModifiersComponents), + ...(this.modifiers() as ModifiersComponents), }; this.componentsContext.setContext({ diff --git a/projects/blocks-renderer-angular/src/lib/text/text.spec.ts b/projects/blocks-renderer-angular/src/lib/text/text.spec.ts index bc02746..588ef40 100644 --- a/projects/blocks-renderer-angular/src/lib/text/text.spec.ts +++ b/projects/blocks-renderer-angular/src/lib/text/text.spec.ts @@ -15,7 +15,7 @@ describe('Text', () => { fixture = TestBed.createComponent(Text); component = fixture.componentInstance; - component.text = 'test'; + fixture.componentRef.setInput('text', 'test'); fixture.detectChanges(); await fixture.whenStable(); }); diff --git a/projects/blocks-renderer-angular/src/lib/text/text.ts b/projects/blocks-renderer-angular/src/lib/text/text.ts index c6a415f..335325f 100644 --- a/projects/blocks-renderer-angular/src/lib/text/text.ts +++ b/projects/blocks-renderer-angular/src/lib/text/text.ts @@ -1,4 +1,4 @@ -import { Component, Input, inject } from '@angular/core'; +import { Component, input, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import type { Modifier } from '../types'; @@ -11,28 +11,28 @@ import { ComponentsContextService } from '../components-context.service'; standalone: true, }) export class Text { - @Input() text!: string; - @Input() bold?: boolean; - @Input() italic?: boolean; - @Input() underline?: boolean; - @Input() strikethrough?: boolean; - @Input() code?: boolean; + text = input.required(); + bold = input(); + italic = input(); + underline = input(); + strikethrough = input(); + code = input(); private componentsContext = inject(ComponentsContextService); private sanitizer = inject(DomSanitizer); get modifiers(): Modifier[] { const mods: Modifier[] = []; - if (this.bold) mods.push('bold'); - if (this.italic) mods.push('italic'); - if (this.underline) mods.push('underline'); - if (this.strikethrough) mods.push('strikethrough'); - if (this.code) mods.push('code'); + if (this.bold()) mods.push('bold'); + if (this.italic()) mods.push('italic'); + if (this.underline()) mods.push('underline'); + if (this.strikethrough()) mods.push('strikethrough'); + if (this.code()) mods.push('code'); return mods; } get textParts(): string[] { - return this.text.split(/\r?\n|\r/g); + return this.text().split(/\r?\n|\r/g); } getModifierComponent(modifierName: Modifier): any {