fixed PR #15 comments

This commit is contained in:
GotPPay
2018-04-03 14:19:07 +02:00
parent 284cdcd7ba
commit 4a43dda852
11 changed files with 164 additions and 151 deletions

View File

@@ -65,8 +65,8 @@ constants.stringConstraints = {
constants.answerType = {
PREDEFINED: 0,
EXTERNAL_SOURCE_WP_JSON : 1,
EXTERNAL_SOURCE_RSS : 2
EXTERNAL_SOURCE_WP_TITLES : 1,
EXTERNAL_SOURCE_WP_NEWS : 2
}
module.exports = constants;

View File

@@ -3,14 +3,6 @@ let Parser = require ('rss-parser');
let parser = new Parser ();
getDataFromRSSFeed = function (url) {
//let feed = await parser.parseURL(url);
//console.log(feed.title);
//feed.items.forEach(item => {
// console.log(item.title + ':' + item.link)
//});
}
getDataFromWPJSON = function (sourceUrl, page = 1, maxPosts = 10) {
return new Promise ((resolve, reject) => {
var options = {

View File

@@ -7,6 +7,7 @@ let predefinedSourceHelper = require ('../helpers/externalSource');
var handlers = {};
var destinationEmail;
let skillName;
module.exports = {
run: function (req, res) {
@@ -33,6 +34,7 @@ module.exports = {
.then (activeSkill => {
handlers = {};
destinationEmail = activeSkill.contactEmail;
skillName = activeSkill.invocationName;
let listOfPossibleQuestions = '';
activeSkill.intents.forEach (intent => {
@@ -77,7 +79,7 @@ module.exports = {
reject: null
}
let answer = new Promise((resolve,reject)=>{
let answerPromise = new Promise ((resolve, reject) => {
answerPromiseProps = {
resolve:resolve,
reject:reject
@@ -88,30 +90,32 @@ module.exports = {
case constants.answerType.PREDEFINED:
answerPromiseProps.resolve(intent.answer);
break;
case constants.answerType.EXTERNAL_SOURCE_WP_JSON:
case constants.answerType.EXTERNAL_SOURCE_WP_TITLES:
predefinedSourceHelper.getAnswerFromWP(intent.externalAnswerSource).then(answer=>{
answerPromiseProps.resolve(answer);
}).catch(error=>{
answerPromiseProps.reject(error);
});
break;
case constants.answerType.EXTERNAL_SOURCE_RSS:
case constants.answerType.EXTERNAL_SOURCE_WP_NEWS:
answer = 'Not implemented yet'
answerPromiseProps.resolve(answer);
break;
}
answer.then(answer=>{
this.response
.speak (answer)
.listen (constants.voiceResponseStrings.GENERIC_CONTINUE); //Phrase from listen doesn't work !!!
this.emit (':responseReady');
}).catch(error=>{
this.response
.speak (error)
.listen (constants.voiceResponseStrings.GENERIC_CONTINUE); //Phrase from listen doesn't work !!!
this.emit (':responseReady');
});
answerPromise
.then (answer => {
this.response
.speak (answer)
.listen (constants.voiceResponseStrings.GENERIC_CONTINUE); //Phrase from listen doesn't work !!!
this.emit (':responseReady');
})
.catch (error => {
this.response
.speak (error)
.listen (constants.voiceResponseStrings.GENERIC_CONTINUE); //Phrase from listen doesn't work !!!
this.emit (':responseReady');
});
};
});
@@ -213,7 +217,7 @@ module.exports = {
if (this.attributes['LaunchRequestYesNo']) {
this.attributes['LaunchRequestYesNo'] = false;
}
this.response.speak ('Thank you for using Saburly');
this.response.speak (`Thank you for using ${skillName}`);
this.emit (':responseReady');
};

View File

@@ -253,30 +253,21 @@ class App extends Component {
}
//Check for same question variants and same question name in other intents
//all intents with the same intentName, or some of the questions are the same
//will be kept in filteredIntents. After filterring, there should be only one
//intent left, the selected one
let filteredIntents = this.state.allIntents.filter(intent=>{
let result = (selectedIntent.intentName === intent.intentName);
let filteredQuestions = intent.questions.filter(question=>{
return (selectedIntent.questions.indexOf(question)!==-1);
});
return (result || filteredQuestions.length > 0);
});
for (let i = 0; i < this.state.allIntents.length; i++) {
if (i !== this.state.selectedIndex) {
if (selectedIntent.intentName === this.state.allIntents[i].intentName) {
Popup.alert ('Question name already exists');
return;
}
for (let j = 0; j < selectedIntent.questions.length; j++) {
for (let k = 0; k < this.state.allIntents[i].questions.length; k++) {
if (
selectedIntent.questions[j] ===
this.state.allIntents[i].questions[k]
) {
Popup.alert (
'Question variant already exists (in question :' +
this.state.allIntents[i].intentName +
')'
);
return;
}
}
}
}
if (filteredIntents.length > 1){
Popup.alert('Question name or question variant already exists');
return;
}
let newAllIntentsJSON = JSON.stringify (this.state.allIntents);

View File

@@ -1,9 +1,7 @@
import React, {Component} from 'react';
import {Button, SelectionControlGroup} from 'react-md';
import Modal from './modal/Modal';
import {
ANSWER_TYPE
} from '../config/constants';
import {Button} from 'react-md';
import AnswerSourceForm from './helper/AnswerSourceForm';
import '../css/components/IntentDetails.css';
class AnswerSource extends Component {
constructor (props) {
@@ -30,67 +28,27 @@ class AnswerSource extends Component {
onSave(){
this.onClose();
this.props.onSaveHandle(this.state.answerType);
this.props.onSaveAnswerType(this.state.answerType);
}
onSourceChange(value, event){
this.setState({answerType:parseInt(value)});
this.setState({answerType:parseInt(value,10)});
}
render () {
let modal;
if (this.state.isModalOpen) {
modal = (
<Modal
title="Answer type"
actions={[
<Button
flat
swapTheming
onClick={this.onClose.bind (this)}
key="cancel"
>
Cancel
</Button>,
<Button
flat
primary
swapTheming
key="save"
onClick={this.onSave.bind(this)}
>
Save
</Button>,
]}
>
<SelectionControlGroup
id="answer-source"
name="answer-source"
type="radio"
label="Import answer from:"
onChange={this.onSourceChange.bind(this)}
controls={[
{
label: 'Predefined answer',
value: '0'
},
{
label: 'WordPress titles',
value: '1',
},
{
label: 'RSS feed - latest',
value: '2',
},
]}
defaultValue={String(this.state.answerType)}
/>
</Modal>
);
modal = <AnswerSourceForm
isModalOpen={this.state.isModalOpen}
answerType={this.state.answerType}
onSave={this.onSave.bind(this)}
onClose={this.onClose.bind(this)}
onSourceChange={this.onSourceChange.bind(this)}
/>
}
return (
<div>
<Button flat primary swapTheming onClick={this.onOpen.bind (this)}>
<Button flat primary onClick={this.onOpen.bind (this)}>
Answer type
</Button>
{modal}

View File

@@ -10,6 +10,7 @@ import {
INTENT_EXPLANATION_MAX_LENGTH,
ANSWER_TYPE,
} from '../config/constants';
import AnswerTextBox from './helper/AnswerTextBox.js';
class IntentDetails extends Component {
constructor (props) {
@@ -20,13 +21,10 @@ class IntentDetails extends Component {
this.addQuestion = this.addQuestion.bind (this);
this.deleteQuestion = this.deleteQuestion.bind (this);
this.handleQuestionEdit = this.handleQuestionEdit.bind (this);
this.handleAnswerEdit = this.handleAnswerEdit.bind (this);
this.handleAnswerSourceEdit = this.handleAnswerSourceEdit.bind (this);
this.handleIntentNameEdit = this.handleIntentNameEdit.bind (this);
this.handleIntentExplanationEdit = this.handleIntentExplanationEdit.bind (
this
);
this.handleExternalSourceSave = this.handleExternalSourceSave.bind (this);
}
componentWillReceiveProps (props) {
@@ -34,43 +32,6 @@ class IntentDetails extends Component {
}
render () {
let answerBox;
switch (this.state.intent.answerType) {
case ANSWER_TYPE.PREDEFINED:
answerBox = (
<div className="QuestionBox">
<TextField
id="intent answer"
lineDirection="center"
label="Answer"
placeholder="Answer"
maxLength={ANSWER_MAX_LENGTH}
className="md-cell md-cell--bottom IntentDetailsInputBoxes"
onChange={this.handleAnswerEdit}
value={this.state.intent.answer}
/>
</div>
);
break;
case ANSWER_TYPE.EXTERNAL_SOURCE_WP_JSON:
case ANSWER_TYPE.EXTERNAL_SOURCE_RSS:
answerBox = (
<div className="QuestionBox">
<TextField
id="intent answer"
lineDirection="center"
label="Answer source"
placeholder="Answer source"
maxLength={ANSWER_MAX_LENGTH}
className="md-cell md-cell--bottom IntentDetailsInputBoxes"
onChange={this.handleAnswerSourceEdit}
value={this.state.intent.externalAnswerSource}
/>
</div>
);
break;
}
return (
<div className="RightPanelBox">
<div className="QuestionBox">
@@ -140,11 +101,17 @@ class IntentDetails extends Component {
add
</Button>
<AnswerSource
className="QuestionTypeButton"
onSaveHandle={this.handleExternalSourceSave}
className="AnswerTypeButton"
onSaveAnswerType={this.handleExternalSourceSave.bind(this)}
answerType={this.state.intent.answerType}
/>
{answerBox}
<AnswerTextBox
answerType={this.state.intent.answerType}
externalAnswerSource={this.state.intent.externalAnswerSource}
handleAnswerSourceEdit={this.handleAnswerSourceEdit.bind(this)}
handleAnswerEdit={this.handleAnswerEdit.bind(this)}
answer={this.state.intent.answer}
/>
<Button
className="IntentDetailsButton-firstInRow"
flat

View File

@@ -0,0 +1,57 @@
import React, {Component} from 'react';
import {Button, SelectionControlGroup} from 'react-md';
import Modal from './Modal';
class AnswerSourceForm extends Component{
render(){
return(
<Modal
title="Answer type"
actions={[
<Button
flat
swapTheming
onClick={this.props.onClose.bind (this)}
key="cancel"
>
Cancel
</Button>,
<Button
flat
primary
swapTheming
key="save"
onClick={this.props.onSave.bind(this)}
>
Save
</Button>,
]}
>
<SelectionControlGroup
id="answer-source"
name="answer-source"
type="radio"
label="Import answer from:"
onChange={this.props.onSourceChange.bind(this)}
controls={[
{
label: 'Predefined answer',
value: '0'
},
{
label: 'WordPress titles',
value: '1',
},
{
label: 'WordPress latest news',
value: '2',
},
]}
defaultValue={String(this.props.answerType)}
/>
</Modal>);
}
}
export default AnswerSourceForm;

View File

@@ -0,0 +1,44 @@
import React, {Component} from 'react';
import {TextField} from 'react-md';
import '../../css/components/IntentDetails.css';
import '../../css/Common.css';
import {
ANSWER_MAX_LENGTH,
ANSWER_TYPE,
} from '../../config/constants';
class AnswerTextBox extends Component {
render () {
//theese are defaults for ANSWER_TYPE.PREDEFINED
let labelText="Answer";
let valueText=this.props.answer;
let onChangeValue=this.props.handleAnswerEdit;
switch(this.props.answerType){
case ANSWER_TYPE.EXTERNAL_SOURCE_WP_TITLES:
case ANSWER_TYPE.EXTERNAL_SOURCE_WP_NEWS:
labelText="Answer source";
valueText=this.props.externalAnswerSource;
onChangeValue=this.props.handleAnswerSourceEdit
break;
}
return(
<div className="QuestionBox">
<TextField
id="intent answer"
lineDirection="center"
label={labelText}
placeholder={labelText}
maxLength={ANSWER_MAX_LENGTH}
className="md-cell md-cell--bottom IntentDetailsInputBoxes"
onChange={onChangeValue}
value={valueText}
/>
</div>
);
}
}
export default AnswerTextBox;

View File

@@ -24,8 +24,8 @@ export const CONTACT_SELECTED_INDEX = -3;
export const ANSWER_TYPE = {
PREDEFINED: 0,
EXTERNAL_SOURCE_WP_JSON : 1,
EXTERNAL_SOURCE_RSS : 2
EXTERNAL_SOURCE_WP_TITLES : 1,
EXTERNAL_SOURCE_WP_NEWS : 2
}
export const RESULT_CODES = {

View File

@@ -27,7 +27,7 @@
margin-right: 10%;
}
.QuestionTypeButton{
float: left;
margin-left: 30px;
.AnswerTypeButton{
float: right;
margin-right: 30px;
}