Skip to content

Commit c083eaf

Browse files
committed
feat: ✨ GQL Json RTE
1 parent 1d1bd79 commit c083eaf

File tree

6 files changed

+39
-24
lines changed

6 files changed

+39
-24
lines changed

src/Models/json-rte-model.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { EmbeddedItem } from "./embedded-object";
21
import Document from "../nodes/document";
32
export interface JsonRTE {
43
json: Document| Document[],
@@ -7,6 +6,16 @@ export interface JsonRTE {
76

87
export interface EmbeddedConnection {
98
edges: {
10-
node: EmbeddedItem
9+
node: EntryNode;
1110
}[]
11+
}
12+
13+
export interface EntryNode {
14+
system: SystemField;
15+
[propName: string]: any;
16+
}
17+
export interface SystemField {
18+
uid: string;
19+
content_type_uid?: string;
20+
[propName: string]: any;
1221
}

src/helper/enumerate-entries.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Document from '../nodes/document'
88
import { Next, RenderMark, RenderNode, RenderOption } from "../options";
99
import { defaultNodeOption } from "../options/default-node-options";
1010
import { findRenderString } from "./find-embeded-object";
11+
import { EntryNode } from "../Models/json-rte-model";
1112

1213
export function enumerate(
1314
entries: EntryEmbedable[] | EmbeddedItem[],
@@ -21,7 +22,7 @@ export function enumerate(
2122
export function enumerateContents(
2223
content:Document | Document[],
2324
renderOption?: RenderOption,
24-
renderEmbed?: (metadata: Metadata) => EmbeddedItem
25+
renderEmbed?: (metadata: Metadata) => EmbeddedItem| EntryNode
2526
): string | string[] {
2627
if (!(content instanceof Array) && content.type !== 'doc') {
2728
return content as unknown as string
@@ -67,7 +68,7 @@ export function textNodeToHTML(node: TextNode, renderOption: RenderOption): stri
6768
}
6869
export function referenceToHTML(node: Node,
6970
renderOption: RenderOption,
70-
renderEmbed?: (metadata: Metadata) => EmbeddedItem
71+
renderEmbed?: (metadata: Metadata) => EmbeddedItem | EntryNode
7172
): string {
7273
if (!renderEmbed) {
7374
return ''
@@ -79,15 +80,15 @@ export function referenceToHTML(node: Node,
7980

8081
function nodeChildrenToHTML(nodes: AnyNode[],
8182
renderOption: RenderOption,
82-
renderEmbed?: (metadata: Metadata) => EmbeddedItem,
83+
renderEmbed?: (metadata: Metadata) => EmbeddedItem | EntryNode,
8384
): string {
8485
return nodes.map<string>((node: AnyNode) => nodeToHTML(node, renderOption, renderEmbed)).join('')
8586
}
8687

8788
function nodeToHTML(
8889
node: AnyNode,
8990
renderOption: RenderOption,
90-
renderEmbed?: (metadata: Metadata) => EmbeddedItem,
91+
renderEmbed?: (metadata: Metadata) => EmbeddedItem | EntryNode,
9192
): string {
9293
if (!node.type) {
9394
return textNodeToHTML(node as TextNode, renderOption)

src/helper/find-embeded-object.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
import { EntryEmbedable, EmbeddedItem } from '../Models/embedded-object';
2-
import { RenderOption, RenderNode, RenderContentType, RenderItem } from '../options/index';
2+
import { RenderOption, RenderContentType, RenderItem } from '../options/index';
33
import { EntryAttributes, Metadata } from '../Models/metadata-model';
44
import { defaultOptions } from '../options/default-options';
5+
import { EntryNode } from '../Models/json-rte-model';
56

67
// This function will find Embedded object present in string
78
export function findEmbeddedEntry(
89
uid: string,
910
contentTypeUid: string,
10-
embeddeditems: EmbeddedItem[] = [],
11-
): EmbeddedItem[] {
12-
return embeddeditems.filter((entry) => {
13-
if (entry.uid === uid && entry._content_type_uid === contentTypeUid) {
11+
embeddeditems: (EmbeddedItem| EntryNode)[] = [],
12+
): (EmbeddedItem | EntryNode)[] {
13+
return embeddeditems.filter((entry: any) => {
14+
if ((entry.uid && (entry as EmbeddedItem).uid === uid && (entry as EmbeddedItem)._content_type_uid === contentTypeUid)|| (entry.system && (entry as EntryNode).system.uid === uid && (entry as EntryNode).system.content_type_uid === contentTypeUid)) {
1415
return entry;
1516
}
1617
});
1718
}
1819

19-
export function findEmbeddedAsset(uid: string, embeddedAssets: EmbeddedItem[] = []): EmbeddedItem[] {
20-
return embeddedAssets.filter((asset) => {
21-
if (asset.uid === uid) {
20+
export function findEmbeddedAsset(uid: string, embeddedAssets: (EmbeddedItem| EntryNode)[] = []): (EmbeddedItem| EntryNode)[] {
21+
return embeddedAssets.filter((asset: any) => {
22+
if ((asset.uid && (asset as EmbeddedItem).uid === uid) || asset.system && (asset as EntryNode).system.uid === uid) {
2223
return asset;
2324
}
2425
});
2526
}
2627

27-
export function findGQLEmbeddedItems(metadata: Metadata, items: EmbeddedItem[]): EmbeddedItem[] {
28+
export function findGQLEmbeddedItems(metadata: Metadata, items: (EmbeddedItem| EntryNode)[]): (EmbeddedItem| EntryNode)[] {
2829
if (metadata.itemType === 'entry') {
2930
return findEmbeddedEntry(
3031
metadata.itemUid,
@@ -39,7 +40,7 @@ export function findGQLEmbeddedItems(metadata: Metadata, items: EmbeddedItem[]):
3940
}
4041
}
4142

42-
export function findEmbeddedItems(object: Metadata, entry: EntryEmbedable): (EmbeddedItem)[] {
43+
export function findEmbeddedItems(object: Metadata, entry: EntryEmbedable): (EmbeddedItem| EntryNode)[] {
4344
if (object && object !== undefined && entry && entry !== undefined) {
4445
if (entry._embedded_items !== undefined) {
4546
const entryEmbedable = entry
@@ -51,7 +52,7 @@ export function findEmbeddedItems(object: Metadata, entry: EntryEmbedable): (Emb
5152
}
5253

5354
export function findRenderString(
54-
item: EmbeddedItem,
55+
item: EmbeddedItem | EntryNode,
5556
metadata: Metadata,
5657
renderOptions?: RenderOption,
5758
): string {

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export { EntryEmbedable, EmbeddedItem as EntryModel } from './Models/embedded-ob
33
export { Metadata, Attributes, attributeToString } from './Models/metadata-model';
44
export { default as StyleType } from './embedded-types/style-type';
55
export { render, renderContent } from './render-embedded-objects';
6+
export { EntryNode, JsonRTE } from './Models/json-rte-model';
67

78
export { default as NodeType } from './nodes/node-type'
89
export { default as MarkType } from './nodes/mark-type'

src/options/default-options.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import StyleType from '../embedded-types/style-type';
22
import { RenderOption } from '.';
33
import { Metadata } from '../Models/metadata-model';
44
import { EmbeddedItem } from '../Models/embedded-object';
5+
import { EntryNode } from '../Models/json-rte-model';
56

67
export const defaultOptions: RenderOption = {
7-
[StyleType.BLOCK]: (item: EmbeddedItem) =>
8-
`<div><p>${item.title || item.uid}</p><p>Content type: <span>${item._content_type_uid}</span></p></div>`,
9-
[StyleType.INLINE]: (item: EmbeddedItem) => `<span>${item.title || item.uid}</span>`,
10-
[StyleType.LINK]: (item: EmbeddedItem, metadata: Metadata) => `<a href="${item.url}">${metadata.text || item.title || item.uid}</a>`,
11-
[StyleType.DISPLAY]: (item: EmbeddedItem, metadata: Metadata) => `<img src="${item.url}" alt="${metadata.attributes.alt || item.title || item.filename || item.uid}" />`,
12-
[StyleType.DOWNLOAD]: (item: EmbeddedItem, metadata: Metadata) => `<a href="${item.url}">${metadata.text || item.title || item.uid}</a>`,
8+
[StyleType.BLOCK]: (item: EmbeddedItem | EntryNode) =>
9+
`<div><p>${item.title || item.uid}</p><p>Content type: <span>${item._content_type_uid || (item.system ? item.system.content_type_uid : '')}</span></p></div>`,
10+
[StyleType.INLINE]: (item: EmbeddedItem| EntryNode) => `<span>${item.title || item.uid}</span>`,
11+
[StyleType.LINK]: (item: EmbeddedItem| EntryNode, metadata: Metadata) => `<a href="${item.url}">${metadata.text || item.title || item.uid || (item.system ? item.system.uid : '')}</a>`,
12+
[StyleType.DISPLAY]: (item: EmbeddedItem| EntryNode, metadata: Metadata) => `<img src="${item.url}" alt="${metadata.attributes.alt || item.title || item.filename || item.uid
13+
|| (item.system ? item.system.uid : '')}" />`,
14+
[StyleType.DOWNLOAD]: (item: EmbeddedItem| EntryNode, metadata: Metadata) => `<a href="${item.url}">${metadata.text || item.title || item.uid || (item.system ? item.system.content_type_uid : '')}</a>`,
1315
};

src/options/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { AnyNode } from '../json-to-html';
22
import { EntryEmbedable, EmbeddedItem } from '../Models/embedded-object';
3+
import { EntryNode } from '../Models/json-rte-model';
34
import { Metadata } from '../Models/metadata-model';
45
import Node from '../nodes/node';
56

67
export type Next = (nodes: AnyNode[]) => string
78
export type RenderNode = (node: Node, next: Next) => string;
89
export type RenderMark = (text: string) => string;
9-
export type RenderItem = (item: EmbeddedItem, metadata: Metadata) => string;
10+
export type RenderItem = (item: EmbeddedItem | EntryNode, metadata: Metadata) => string;
1011
export interface RenderOption {
1112
[embedType: string]: RenderNode | RenderMark | RenderItem | RenderContentType;
1213
}

0 commit comments

Comments
 (0)