@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
1 lines • 6.11 kB
Source Map (JSON)
{"version":3,"file":"note.cjs","sources":["../../src/notes/note.ts"],"sourcesContent":["import { useContext, useMemo, useEffect, useRef, useState } from \"react\";\nimport h from \"../hyper\";\nimport { useNoteLayout } from \"./layout\";\nimport { NoteEditorContext } from \"./editor\";\nimport type { NoteData } from \"./types\";\nimport {\n NotePositioner,\n NoteConnector,\n NodeConnectorOptions,\n} from \"./connector\";\nimport { useColumn } from \"../context\";\n\ntype NoteListProps = NodeConnectorOptions & {\n onClickNote?: (note: NoteData) => void;\n};\n\nexport function NotesList(props: NoteListProps) {\n let { onClickNote, ...rest } = props;\n\n const {\n notes,\n nodes: nodeIndex,\n updateHeight,\n noteComponent,\n scale,\n } = useNoteLayout();\n\n const { pixelHeight: columnHeight } = useColumn();\n\n const notesInfo = useMemo(() => {\n let notes1 = notes.map((note) => {\n const node = nodeIndex[note.id];\n const pixelHeight = node?.width ?? 10;\n const pixelOffset = node?.currentPos ?? scale(note.top_height);\n return {\n note,\n node,\n pixelOffset,\n pixelHeight,\n spacing: {\n above: pixelOffset - pixelHeight,\n below: columnHeight - pixelOffset,\n },\n };\n });\n\n // Adjust spacing to account for nearby nodes\n for (let i = 0; i < notes1.length; i++) {\n const { spacing, pixelOffset } = notes1[i];\n if (i > 0) {\n const prevNote = notes1[i - 1];\n // Get distance from the previous note's bottom\n // to the current note's top\n spacing.above =\n pixelOffset - prevNote.pixelOffset - prevNote.pixelHeight;\n prevNote.spacing.below = spacing.above;\n }\n }\n\n return notes1;\n }, [notes, nodeIndex, scale]);\n\n return h(\n \"g.notes-list\",\n notesInfo.map(({ note, pixelOffset, pixelHeight, spacing }) => {\n // If the note has a bad pixelOffset, skip it\n\n if (pixelOffset == null || pixelHeight == null) {\n return null;\n }\n\n return h(Note, {\n key: note.id,\n note,\n pixelOffset,\n pixelHeight,\n updateHeight,\n onClick: onClickNote,\n noteBodyComponent: noteComponent,\n spacing,\n ...rest,\n });\n }),\n );\n}\n\ntype NodeSpacing = {\n above: number;\n below: number;\n};\n\ninterface NoteProps {\n note: NoteData;\n style?: object;\n deltaConnectorAttachment?: number;\n pixelOffset?: number;\n pixelHeight?: number;\n updateHeight?: (id: string | number, height: number) => void;\n onClick?: (note: NoteData) => void;\n noteBodyComponent: (props: { note: NoteData; spacing?: NodeSpacing }) => any;\n spacing?: NodeSpacing;\n}\n\nfunction Note(props: NoteProps) {\n const {\n note,\n pixelOffset,\n pixelHeight,\n updateHeight,\n deltaConnectorAttachment,\n noteBodyComponent,\n spacing,\n onClick,\n } = props;\n const ref = useRef<HTMLElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n const newHeight = ref.current.offsetHeight;\n if (newHeight !== pixelHeight) {\n updateHeight(note.id, newHeight);\n }\n }\n }, [note, pixelHeight, updateHeight]);\n\n const offsetY = pixelOffset;\n const noteHeight = pixelHeight;\n\n const { setEditingNote, editingNote } = useContext(NoteEditorContext) as any;\n const onClick_ = onClick ?? setEditingNote;\n const _onClickHandler = useMemo(() => {\n if (!onClick_) return undefined;\n return (evt) => {\n onClick_(note);\n };\n }, [onClick_]);\n\n if (editingNote === note) {\n return null;\n }\n return h(\"g.note\", [\n h(NoteConnector, { note, deltaConnectorAttachment }),\n h(\n NotePositioner,\n {\n offsetY,\n noteHeight,\n ref,\n onClick: _onClickHandler,\n },\n h(noteBodyComponent, { note, spacing }),\n ),\n ]);\n}\n\nexport { NotePositioner, NoteConnector };\n"],"names":["useNoteLayout","useColumn","useMemo","h","useRef","useEffect","useContext","NoteEditorContext","NoteConnector","NotePositioner"],"mappings":";;;;;;;;AAgBO,SAAS,UAAU,OAAsB;AAC9C,MAAI,EAAE,aAAa,GAAG,KAAA,IAAS;AAE/B,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACEA,qBAAA;AAEJ,QAAM,EAAE,aAAa,aAAA,IAAiBC,iBAAA;AAEtC,QAAM,YAAYC,MAAAA,QAAQ,MAAM;AAC9B,QAAI,SAAS,MAAM,IAAI,CAAC,SAAS;AAC/B,YAAM,OAAO,UAAU,KAAK,EAAE;AAC9B,YAAM,cAAc,MAAM,SAAS;AACnC,YAAM,cAAc,MAAM,cAAc,MAAM,KAAK,UAAU;AAC7D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,UACP,OAAO,cAAc;AAAA,UACrB,OAAO,eAAe;AAAA,QAAA;AAAA,MACxB;AAAA,IAEJ,CAAC;AAGD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,EAAE,SAAS,gBAAgB,OAAO,CAAC;AACzC,UAAI,IAAI,GAAG;AACT,cAAM,WAAW,OAAO,IAAI,CAAC;AAG7B,gBAAQ,QACN,cAAc,SAAS,cAAc,SAAS;AAChD,iBAAS,QAAQ,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,WAAW,KAAK,CAAC;AAE5B,SAAOC;AAAAA,IACL;AAAA,IACA,UAAU,IAAI,CAAC,EAAE,MAAM,aAAa,aAAa,cAAc;AAG7D,UAAI,eAAe,QAAQ,eAAe,MAAM;AAC9C,eAAO;AAAA,MACT;AAEA,aAAOA,MAAE,MAAM;AAAA,QACb,KAAK,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB;AAAA,QACA,GAAG;AAAA,MAAA,CACJ;AAAA,IACH,CAAC;AAAA,EAAA;AAEL;AAmBA,SAAS,KAAK,OAAkB;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,MAAMC,MAAAA,OAAoB,IAAI;AAEpCC,QAAAA,UAAU,MAAM;AACd,QAAI,IAAI,SAAS;AACf,YAAM,YAAY,IAAI,QAAQ;AAC9B,UAAI,cAAc,aAAa;AAC7B,qBAAa,KAAK,IAAI,SAAS;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,YAAY,CAAC;AAEpC,QAAM,UAAU;AAChB,QAAM,aAAa;AAEnB,QAAM,EAAE,gBAAgB,gBAAgBC,MAAAA,WAAWC,OAAAA,iBAAiB;AACpE,QAAM,WAAW,WAAW;AAC5B,QAAM,kBAAkBL,MAAAA,QAAQ,MAAM;AACpC,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,CAAC,QAAQ;AACd,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AACA,SAAOC,MAAE,UAAU;AAAA,IACjBA,MAAEK,UAAAA,eAAe,EAAE,MAAM,0BAA0B;AAAA,IACnDL;AAAAA,MACEM,UAAAA;AAAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,MAAA;AAAA,MAEXN,MAAE,mBAAmB,EAAE,MAAM,SAAS;AAAA,IAAA;AAAA,EACxC,CACD;AACH;;;;"}