From 8d981dcdbab32110c7e67998f06b30ffacc70035 Mon Sep 17 00:00:00 2001 From: Nicholas King Date: Wed, 26 May 2021 16:56:07 -0700 Subject: [PATCH 1/3] edit prototype part 1 --- frontend/MainContainer.tsx | 19 +- frontend/actions.ts | 34 +++ frontend/components/InteractiveText.tsx | 209 ++++++++++++++++++ .../components/PerspectiveScoresBarChart.tsx | 7 +- frontend/components/TextDetailedAnalysis.tsx | 61 +++-- frontend/components/TextGenerationResults.tsx | 12 +- frontend/models/TextRecord.ts | 15 ++ frontend/reducers.ts | 21 +- package-lock.json | 5 + package.json | 3 +- 10 files changed, 350 insertions(+), 36 deletions(-) create mode 100644 frontend/components/InteractiveText.tsx create mode 100644 frontend/models/TextRecord.ts diff --git a/frontend/MainContainer.tsx b/frontend/MainContainer.tsx index cb5ea28..fd38a87 100644 --- a/frontend/MainContainer.tsx +++ b/frontend/MainContainer.tsx @@ -7,15 +7,17 @@ import { generateTextFailed, generateText, selectText, + submitEditText, + deleteEditText, foldForm } from './actions'; import TextGenerationControl from "./components/TextGenerationControl"; import TextGenerationResults from "./components/TextGenerationResults"; import TextDetailedAnalysis from "./components/TextDetailedAnalysis"; -import AnalyzedText from "./models/AnalyzedText"; +import TextRecord from "./models/TextRecord"; type ContainerProps = { - analysisResults: AnalyzedText[], + analysisResults: TextRecord[], error: any, loading: any, isFolded: boolean, @@ -25,7 +27,9 @@ type ContainerProps = { generateTextFailed: any, generateText: any selectText: Function, - foldForm: Function + submitEditText: Function, + deleteEditText: Function, + foldForm: Function, } const Container: React.FunctionComponent = ({ @@ -39,6 +43,8 @@ const Container: React.FunctionComponent = ({ generateTextFailed, generateText, selectText, + submitEditText, + deleteEditText, foldForm }) => { const getDetailedAnalysisComponent = () => { @@ -48,7 +54,10 @@ const Container: React.FunctionComponent = ({ const selectedText = selectedTextIds.map(id => analysisResults.find(item => id == item.id)) return ( + selectedText={selectedText} + submitEditText={submitEditText} + deleteEditText={deleteEditText} + /> ); } } @@ -95,6 +104,8 @@ function mapDispatchToProps (dispatch) { generateTextFailed: generateTextFailed, generateText: generateText, selectText: selectText, + submitEditText: submitEditText, + deleteEditText: deleteEditText, foldForm: foldForm, }, dispatch); } diff --git a/frontend/actions.ts b/frontend/actions.ts index efee7d8..a6351c0 100644 --- a/frontend/actions.ts +++ b/frontend/actions.ts @@ -43,6 +43,38 @@ function selectText(id: number) { } } +function setEditTextResults(id: number, text: string, analysis: any) { + return { + type: "EDIT_TEXT_SUCCEEDED", + id: id, + text: text, + analysis: analysis + } + +} + +function editTextFailed(error) { + return { + type: "EDIT_TEXT_FAILED", + error: error + } +} + +function submitEditText(id: number, text: string) { + return function(dispatch) { + makePostCall("api/v1/analyze_text", {text: text}) + .then(response => dispatch(setEditTextResults(id, text, response.data.text_analysis_result))) + .catch(error => dispatch(editTextFailed(error))); + } +} + +function deleteEditText(id: number) { + return { + type: "DELETE_EDIT_TEXT", + id: id + } +} + export { requestGenerateText, @@ -50,5 +82,7 @@ export { generateTextFailed, generateText, selectText, + submitEditText, + deleteEditText, foldForm, }; diff --git a/frontend/components/InteractiveText.tsx b/frontend/components/InteractiveText.tsx new file mode 100644 index 0000000..4a5ca2b --- /dev/null +++ b/frontend/components/InteractiveText.tsx @@ -0,0 +1,209 @@ +import React from "react"; +import TextRecord from "../models/TextRecord"; +import AnalyzedText from "../models/AnalyzedText"; +import { FiEdit } from "react-icons/fi"; + +type InteractiveTextProps = { + textRecord: TextRecord; + tabColor: string; + editColor: string; + submitEditText: Function, + deleteEditText: Function, +}; + +type InteractiveTextState = { + editMode: boolean; + editText: string; +} + +class InteractiveText extends React.Component { + constructor(props) { + super(props); + + let editText; + if (this.props.textRecord.edited) { + editText = this.props.textRecord.edited.text; + } else { + editText = this.props.textRecord.original.text; + } + + this.state = { + editMode: false, + editText: editText + }; + + this.enableEditMode = this.enableEditMode.bind(this); + this.handleTextSubmit = this.handleTextSubmit.bind(this); + this.handleTextClear = this.handleTextClear.bind(this); + this.handleTextEdit = this.handleTextEdit.bind(this); + } + + enableEditMode() { + this.setState({editMode: true}); + } + + handleTextSubmit() { + this.props.submitEditText(this.props.textRecord.id, this.state.editText); + this.setState({editMode: false}); + } + + handleTextClear() { + this.props.deleteEditText(this.props.textRecord.id); + this.setState({editMode: false}); + } + + handleTextEdit(event) { + this.setState({editText: event.target.value}); + } + + render() { + /* + {this.props.selectedText.map((item, index) => +
+
+ {item.id} +
+
+ {item.text} +
+
+ +
+
+ )} + */ + return ( + <> +
+
+ {this.props.textRecord.id} +
+
+ {this.props.textRecord.original.text} +
+ +
+ { + this.props.textRecord.edited && !this.state.editMode ? +
+
+ {this.props.textRecord.id}* +
+
+ {this.props.textRecord.edited.text} +
+ +
: null + } + { + this.state.editMode ? +
+
+ {this.props.textRecord.id}* +
+