diff --git a/backend/helpers/externalSource.js b/backend/helpers/externalSource.js index 4713672..8bf0d6c 100644 --- a/backend/helpers/externalSource.js +++ b/backend/helpers/externalSource.js @@ -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 = { diff --git a/backend/models/alexa.js b/backend/models/alexa.js index e7a251d..105160e 100644 --- a/backend/models/alexa.js +++ b/backend/models/alexa.js @@ -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'); }; diff --git a/web/src/App.js b/web/src/App.js index bed0a50..cd6e3eb 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -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); diff --git a/web/src/components/AnswerSource.js b/web/src/components/AnswerSource.js index 6737020..9f6710a 100644 --- a/web/src/components/AnswerSource.js +++ b/web/src/components/AnswerSource.js @@ -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 = ( - - Cancel - , - , - ]} - > - - - ); + modal = } return (
- {modal} diff --git a/web/src/components/IntentDetails.js b/web/src/components/IntentDetails.js index d982625..ff5827f 100644 --- a/web/src/components/IntentDetails.js +++ b/web/src/components/IntentDetails.js @@ -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 = ( -
- -
- ); - break; - case ANSWER_TYPE.EXTERNAL_SOURCE_WP_TITLES: - case ANSWER_TYPE.EXTERNAL_SOURCE_WP_NEWS: - answerBox = ( -
- -
- ); - break; - } - return (
@@ -140,11 +101,17 @@ class IntentDetails extends Component { add - {answerBox} + , + , + ]} + > + + ); + } +} + +export default AnswerSourceForm; \ No newline at end of file diff --git a/web/src/components/helper/AnswerTextBox.js b/web/src/components/helper/AnswerTextBox.js new file mode 100644 index 0000000..0dd630c --- /dev/null +++ b/web/src/components/helper/AnswerTextBox.js @@ -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( +
+ +
+ ); + } +} + +export default AnswerTextBox; diff --git a/web/src/components/modal/Modal.js b/web/src/components/helper/Modal.js similarity index 100% rename from web/src/components/modal/Modal.js rename to web/src/components/helper/Modal.js diff --git a/web/src/css/components/IntentDetails.scss b/web/src/css/components/IntentDetails.scss index a307b93..e33114f 100644 --- a/web/src/css/components/IntentDetails.scss +++ b/web/src/css/components/IntentDetails.scss @@ -27,7 +27,7 @@ margin-right: 10%; } -.QuestionTypeButton{ - float: left; - margin-left: 30px; +.AnswerTypeButton{ + float: right; + margin-right: 30px; } \ No newline at end of file