apply changes from PR #15
This commit is contained in:
@@ -6,14 +6,6 @@ const constants = require ('../config/constants');
|
||||
|
||||
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 = {
|
||||
|
||||
@@ -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,
|
||||
@@ -116,7 +118,7 @@ module.exports = {
|
||||
break;
|
||||
}
|
||||
|
||||
answer
|
||||
answerPromiseProps
|
||||
.then (answer => {
|
||||
this.response
|
||||
.speak (answer)
|
||||
@@ -230,7 +232,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');
|
||||
};
|
||||
|
||||
|
||||
@@ -253,30 +253,24 @@ 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 selectedIntentQuestionsForSearch = selectedIntent.questions.map(question=>
|
||||
question.toLowerCase().trim());
|
||||
|
||||
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;
|
||||
}
|
||||
let filteredIntents = this.state.allIntents.filter(intent=>{
|
||||
let result = (selectedIntent.intentName.toLowerCase().trim() === intent.intentName.toLowerCase().trim());
|
||||
let filteredQuestions = intent.questions.filter(question=>{
|
||||
return (selectedIntentQuestionsForSearch.indexOf(question.toLowerCase().trim())!==-1);
|
||||
});
|
||||
return (result || filteredQuestions.length > 0);
|
||||
});
|
||||
|
||||
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);
|
||||
|
||||
@@ -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: 'WordPress latest news',
|
||||
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}
|
||||
|
||||
@@ -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_TITLES:
|
||||
case ANSWER_TYPE.EXTERNAL_SOURCE_WP_NEWS:
|
||||
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
|
||||
|
||||
57
web/src/components/helper/AnswerSourceForm.js
Normal file
57
web/src/components/helper/AnswerSourceForm.js
Normal 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;
|
||||
44
web/src/components/helper/AnswerTextBox.js
Normal file
44
web/src/components/helper/AnswerTextBox.js
Normal 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;
|
||||
@@ -27,7 +27,7 @@
|
||||
margin-right: 10%;
|
||||
}
|
||||
|
||||
.QuestionTypeButton{
|
||||
float: left;
|
||||
margin-left: 30px;
|
||||
.AnswerTypeButton{
|
||||
float: right;
|
||||
margin-right: 30px;
|
||||
}
|
||||
Reference in New Issue
Block a user