aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/newlightbox/RecommendationList
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2024-05-19 01:01:02 -0400
committerbobzel <zzzman@gmail.com>2024-05-19 01:01:02 -0400
commit6e72f969029c22fe797397a6437836a0482260b6 (patch)
treee8ccde75702e557b2226c9069263e1bc3bd21a4b /src/client/views/newlightbox/RecommendationList
parent5ff0bef5d3c4825aa7210a26c98aae3b24f4a835 (diff)
parent13dc6de0e0099f699ad0d2bb54401e6a0aa25018 (diff)
Merge branch 'restoringEslint' into alyssa-starter
Diffstat (limited to 'src/client/views/newlightbox/RecommendationList')
-rw-r--r--src/client/views/newlightbox/RecommendationList/RecommendationList.tsx311
-rw-r--r--src/client/views/newlightbox/RecommendationList/index.ts2
-rw-r--r--src/client/views/newlightbox/RecommendationList/utils.ts11
3 files changed, 170 insertions, 154 deletions
diff --git a/src/client/views/newlightbox/RecommendationList/RecommendationList.tsx b/src/client/views/newlightbox/RecommendationList/RecommendationList.tsx
index 9f3c32e4e..dc3339cd3 100644
--- a/src/client/views/newlightbox/RecommendationList/RecommendationList.tsx
+++ b/src/client/views/newlightbox/RecommendationList/RecommendationList.tsx
@@ -1,77 +1,73 @@
-import { GrClose } from 'react-icons/gr';
-import { IRecommendation, Recommendation } from "../components";
-import './RecommendationList.scss';
+/* eslint-disable react/jsx-props-no-spreading */
+/* eslint-disable jsx-a11y/no-static-element-interactions */
+/* eslint-disable jsx-a11y/click-events-have-key-events */
+/* eslint-disable guard-for-in */
+import { IconButton, Size, Type } from 'browndash-components';
import * as React from 'react';
-import { IRecommendationList } from "./utils";
-import { NewLightboxView } from '../NewLightboxView';
-import { DocCast, StrCast } from '../../../../fields/Types';
import { FaCaretDown, FaCaretUp } from 'react-icons/fa';
-import { Doc, DocListCast, StrListCast } from '../../../../fields/Doc';
-import { IDocRequest, fetchKeywords, fetchRecommendations } from '../utils';
-import { IBounds } from '../ExploreView/utils';
+import { GrClose } from 'react-icons/gr';
+import { DocListCast, StrListCast } from '../../../../fields/Doc';
import { List } from '../../../../fields/List';
-import { Id } from '../../../../fields/FieldSymbols';
-import { LightboxView } from '../../LightboxView';
-import { IconButton, Size, Type } from 'browndash-components';
+import { StrCast } from '../../../../fields/Types';
import { Colors } from '../../global/globalEnums';
+import { DocumentView } from '../../nodes/DocumentView';
+import { IBounds } from '../ExploreView/utils';
+import { NewLightboxView } from '../NewLightboxView';
+import { IRecommendation, Recommendation } from '../components';
+import { IDocRequest, fetchKeywords, fetchRecommendations } from '../utils';
+import './RecommendationList.scss';
-export const RecommendationList = (props: IRecommendationList) => {
- const {loading, keywords} = props
- const [loadingKeywords, setLoadingKeywords] = React.useState<boolean>(true)
- const [showMore, setShowMore] = React.useState<boolean>(false)
- const [keywordsLoc, setKeywordsLoc] = React.useState<string[]>([])
- const [update, setUpdate] = React.useState<boolean>(true)
- const initialRecs: IRecommendation[] = [
- {loading: true},
- {loading: true},
- {loading: true},
- {loading: true},
- {loading: true}
- ];
- const [recs, setRecs] = React.useState<IRecommendation[]>(initialRecs)
+export function RecommendationList() {
+ const [loadingKeywords, setLoadingKeywords] = React.useState<boolean>(true);
+ const [showMore, setShowMore] = React.useState<boolean>(false);
+ const [keywordsLoc, setKeywordsLoc] = React.useState<string[]>([]);
+ const [update, setUpdate] = React.useState<boolean>(true);
+ const initialRecs: IRecommendation[] = [{ loading: true }, { loading: true }, { loading: true }, { loading: true }, { loading: true }];
+ const [recs, setRecs] = React.useState<IRecommendation[]>(initialRecs);
React.useEffect(() => {
const getKeywords = async () => {
- let text = StrCast(LightboxView.LightboxDoc?.text)
- console.log('[1] fetching keywords')
- const response = await fetchKeywords(text, 5, true)
- console.log('[2] response:', response)
+ const text = StrCast(DocumentView.LightboxDoc()?.text);
+ console.log('[1] fetching keywords');
+ const response = await fetchKeywords(text, 5, true);
+ console.log('[2] response:', response);
const kw = response.keywords;
console.log(kw);
NewLightboxView.SetKeywords(kw);
- if (LightboxView.LightboxDoc) {
- console.log('setting keywords on doc')
- LightboxView.LightboxDoc.keywords = new List<string>(kw);
+ const lightboxDoc = DocumentView.LightboxDoc();
+ if (lightboxDoc) {
+ console.log('setting keywords on doc');
+ lightboxDoc.keywords = new List<string>(kw);
setKeywordsLoc(NewLightboxView.Keywords);
}
- setLoadingKeywords(false)
- }
- let keywordsList = StrListCast(LightboxView.LightboxDoc!.keywords)
+ setLoadingKeywords(false);
+ };
+ const keywordsList = StrListCast(DocumentView.LightboxDoc()!.keywords);
if (!keywordsList || keywordsList.length < 2) {
- setLoadingKeywords(true)
- getKeywords()
- setUpdate(!update)
+ setLoadingKeywords(true);
+ getKeywords();
+ setUpdate(!update);
} else {
- setKeywordsLoc(keywordsList)
- setLoadingKeywords(false)
- setUpdate(!update)
+ setKeywordsLoc(keywordsList);
+ setLoadingKeywords(false);
+ setUpdate(!update);
}
- }, [NewLightboxView.LightboxDoc])
+ }, [NewLightboxView.LightboxDoc]);
- // terms: vannevar bush, information spaces,
+ // terms: vannevar bush, information spaces,
React.useEffect(() => {
const getRecommendations = async () => {
- console.log('fetching recommendations')
- let query = 'undefined'
- if (keywordsLoc) query = keywordsLoc.join(',')
- let src = StrCast(NewLightboxView.LightboxDoc?.text)
- let dashDocs:IDocRequest[] = [];
+ console.log('fetching recommendations');
+ let query = 'undefined';
+ if (keywordsLoc) query = keywordsLoc.join(',');
+ const src = StrCast(NewLightboxView.LightboxDoc?.text);
+ const dashDocs: IDocRequest[] = [];
// get linked docs
- let linkedDocs = DocListCast(NewLightboxView.LightboxDoc?.links)
- console.log("linked docs", linkedDocs)
+ const linkedDocs = DocListCast(NewLightboxView.LightboxDoc?.links);
+ console.log('linked docs', linkedDocs);
// get context docs (docs that are also in the collection)
- // let contextDocs: Doc[] = DocListCast(DocCast(LightboxView.LightboxDoc?.context).data)
- // let docId = LightboxView.LightboxDoc && LightboxView.LightboxDoc[Id]
+ // let contextDocs: Doc[] = DocListCast(DocCast(DocumentView.LightboxDoc()?.context).data)
+ // let docId = DocumentView.LightboxDoc() && DocumentView.LightboxDoc()[Id]
// console.log("context docs", contextDocs)
// contextDocs.forEach((doc: Doc) => {
// if (docId !== doc[Id]){
@@ -83,114 +79,135 @@ export const RecommendationList = (props: IRecommendationList) => {
// })
// }
// })
- console.log("dash docs", dashDocs)
+ console.log('dash docs', dashDocs);
if (query !== undefined) {
- const response = await fetchRecommendations(src, query, [], true)
- const num_recs = response.num_recommendations
- const recs = response.recommendations
- const keywords = response.keywords
- const response_bounds: IBounds = {
- max_x: response.max_x,
- max_y: response.max_y,
- min_x: response.min_x,
- min_y: response.min_y
- }
+ const response = await fetchRecommendations(src, query, [], true);
+ const theRecs = response.recommendations;
+ const responseBounds: IBounds = {
+ max_x: response.max_x,
+ max_y: response.max_y,
+ min_x: response.min_x,
+ min_y: response.min_y,
+ };
// if (NewLightboxView.NewLightboxDoc) {
// NewLightboxView.NewLightboxDoc.keywords = new List<string>(keywords);
// setKeywordsLoc(NewLightboxView.Keywords);
// }
// console.log(response_bounds)
- NewLightboxView.SetBounds(response_bounds)
+ NewLightboxView.SetBounds(responseBounds);
const recommendations: IRecommendation[] = [];
- for (const key in recs) {
- console.log(key)
- const title = recs[key].title;
- const url = recs[key].url
- const type = recs[key].type
- const text = recs[key].text
- const transcript = recs[key].transcript
- const previewUrl = recs[key].previewUrl
- const embedding = recs[key].embedding
- const distance = recs[key].distance
- const source = recs[key].source
- const related_concepts = recs[key].related_concepts
- const docId = recs[key].doc_id
- related_concepts.length >= 1 && recommendations.push({
- title: title,
- data: url,
- type: type,
- text: text,
- transcript: transcript,
- previewUrl: previewUrl,
- embedding: embedding,
- distance: Math.round(distance * 100) / 100,
- source: source,
- related_concepts: related_concepts,
- docId: docId
- })
+ // eslint-disable-next-line no-restricted-syntax
+ for (const key in theRecs) {
+ console.log(key);
+ const { title } = theRecs[key];
+ const { url } = theRecs[key];
+ const { type } = theRecs[key];
+ const { text } = theRecs[key];
+ const { transcript } = theRecs[key];
+ const { previewUrl } = theRecs[key];
+ const { embedding } = theRecs[key];
+ const { distance } = theRecs[key];
+ const { source } = theRecs[key];
+ const { related_concepts: relatedConcepts } = theRecs[key];
+ const docId = theRecs[key].doc_id;
+ relatedConcepts.length >= 1 &&
+ recommendations.push({
+ title: title,
+ data: url,
+ type: type,
+ text: text,
+ transcript: transcript,
+ previewUrl: previewUrl,
+ embedding: embedding,
+ distance: Math.round(distance * 100) / 100,
+ source: source,
+ related_concepts: relatedConcepts,
+ docId: docId,
+ });
}
recommendations.sort((a, b) => {
if (a.distance && b.distance) {
- return a.distance - b.distance
- } else return 0
- })
- console.log("[rec]: ", recommendations)
- NewLightboxView.SetRecs(recommendations)
- setRecs(recommendations)
+ return a.distance - b.distance;
+ }
+ return 0;
+ });
+ console.log('[rec]: ', recommendations);
+ NewLightboxView.SetRecs(recommendations);
+ setRecs(recommendations);
}
- }
+ };
getRecommendations();
- }, [update])
-
-
+ }, [update]);
- return <div className={`recommendationlist-container`} onPointerDown={(e) => {e.stopPropagation()}}>
- <div className={`header`}>
- <div className={`title`}>
- Recommendations
- </div>
- {NewLightboxView.LightboxDoc && <div style={{fontSize: 10}}>
- The recommendations are produced based on the text in the document <b><u>{StrCast(NewLightboxView.LightboxDoc.title)}</u></b>. The following keywords are used to fetch the recommendations.
- </div>}
- <div className={`lb-label`}>Keywords</div>
- {loadingKeywords ? <div className={`keywords`}>
- <div className={`keyword ${loadingKeywords && 'loading'}`}/>
- <div className={`keyword ${loadingKeywords && 'loading'}`}/>
- <div className={`keyword ${loadingKeywords && 'loading'}`}/>
- <div className={`keyword ${loadingKeywords && 'loading'}`}/>
+ return (
+ <div
+ className="recommendationlist-container"
+ onPointerDown={e => {
+ e.stopPropagation();
+ }}>
+ <div className="header">
+ <div className="title">Recommendations</div>
+ {NewLightboxView.LightboxDoc && (
+ <div style={{ fontSize: 10 }}>
+ The recommendations are produced based on the text in the document{' '}
+ <b>
+ <u>{StrCast(NewLightboxView.LightboxDoc.title)}</u>
+ </b>
+ . The following keywords are used to fetch the recommendations.
</div>
- :
- <div className={`keywords`}>
- {keywordsLoc && keywordsLoc.map((word, ind) => {
- return <div className={`keyword`}>
- {word}
- <IconButton type={Type.PRIM} size={Size.XSMALL} color={Colors.DARK_GRAY} icon={<GrClose/>} onClick={() => {
- let kw = keywordsLoc
- kw.splice(ind)
- NewLightboxView.SetKeywords(kw)
- }}/>
+ )}
+ <div className="lb-label">Keywords</div>
+ {loadingKeywords ? (
+ <div className="keywords">
+ <div className={`keyword ${loadingKeywords && 'loading'}`} />
+ <div className={`keyword ${loadingKeywords && 'loading'}`} />
+ <div className={`keyword ${loadingKeywords && 'loading'}`} />
+ <div className={`keyword ${loadingKeywords && 'loading'}`} />
</div>
- })}
- </div>
- }
- {!showMore ?
- <div className={`lb-caret`} onClick={() => {setShowMore(true)}}>
- More <FaCaretDown/>
- </div>
- :
- <div className={`more`}>
- <div className={`lb-caret`} onClick={() => {setShowMore(false)}}>
- Less <FaCaretUp/>
- </div>
- <div className={`lb-label`}>Type</div>
- <div className={`lb-label`}>Sources</div>
+ ) : (
+ <div className="keywords">
+ {keywordsLoc &&
+ keywordsLoc.map((word, ind) => (
+ <div className="keyword">
+ {word}
+ <IconButton
+ type={Type.PRIM}
+ size={Size.XSMALL}
+ color={Colors.DARK_GRAY}
+ icon={<GrClose />}
+ onClick={() => {
+ const kw = keywordsLoc;
+ kw.splice(ind);
+ NewLightboxView.SetKeywords(kw);
+ }}
+ />
+ </div>
+ ))}
+ </div>
+ )}
+ {!showMore ? (
+ <div
+ className="lb-caret"
+ onClick={() => {
+ setShowMore(true);
+ }}>
+ More <FaCaretDown />
+ </div>
+ ) : (
+ <div className="more">
+ <div
+ className="lb-caret"
+ onClick={() => {
+ setShowMore(false);
+ }}>
+ Less <FaCaretUp />
+ </div>
+ <div className="lb-label">Type</div>
+ <div className="lb-label">Sources</div>
+ </div>
+ )}
</div>
- }
- </div>
- <div className={`recommendations`}>
- {recs && recs.map((rec: IRecommendation) => {
- return <Recommendation {...rec} />
- })}
+ <div className="recommendations">{recs && recs.map((rec: IRecommendation) => <Recommendation {...rec} />)}</div>
</div>
- </div>
-} \ No newline at end of file
+ );
+}
diff --git a/src/client/views/newlightbox/RecommendationList/index.ts b/src/client/views/newlightbox/RecommendationList/index.ts
index f4555c1f2..226eafb7e 100644
--- a/src/client/views/newlightbox/RecommendationList/index.ts
+++ b/src/client/views/newlightbox/RecommendationList/index.ts
@@ -1 +1 @@
-export * from './RecommendationList' \ No newline at end of file
+export * from './RecommendationList';
diff --git a/src/client/views/newlightbox/RecommendationList/utils.ts b/src/client/views/newlightbox/RecommendationList/utils.ts
index cdfff3258..fbf8ac19f 100644
--- a/src/client/views/newlightbox/RecommendationList/utils.ts
+++ b/src/client/views/newlightbox/RecommendationList/utils.ts
@@ -1,9 +1,8 @@
-import { IRecommendation } from "../components";
+import { IRecommendation } from '../components';
export interface IRecommendationList {
- loading?: boolean,
- keywords?: string[],
- recs?: IRecommendation[]
- getRecs?: any
+ loading?: boolean;
+ keywords?: string[];
+ recs?: IRecommendation[];
+ getRecs?: any;
}
-