diff --git a/circle.yml b/circle.yml index b74924e35..ecf14c803 100644 --- a/circle.yml +++ b/circle.yml @@ -19,7 +19,7 @@ compile: deployment: development: - branch: [dev] + branch: [dev, 'feature/performance-testing'] owner: appirio-tech commands: - ./deploy.sh DEV diff --git a/src/config/projectQuestions/computer_vision.v1.0.js b/src/config/projectQuestions/computer_vision.v1.0.js new file mode 100644 index 000000000..c177b74d7 --- /dev/null +++ b/src/config/projectQuestions/computer_vision.v1.0.js @@ -0,0 +1,160 @@ +import _ from 'lodash' +// import NumberText from '../../components/NumberText/NumberText' +import { findProduct } from '../projectWizard' + + +const isFileRequired = (project, subSections) => { + const subSection = _.find(subSections, (s) => s.type === 'questions') + const fields = _.filter(subSection.questions, q => q.type.indexOf('see-attached') > -1) + // iterate over all seeAttached type fields to check + // if any see attached is checked. + return _.some(_.map( + _.map(fields, 'fieldName'), + fn => _.get(project, `${fn}.seeAttached`) + )) +} + +const sections = [ + { + id: 'appDefinition', + title: (project, showProduct) => { + const product = _.get(project, 'details.products[0]') + if (showProduct && product) { + const prd = findProduct(product) + if (prd) return prd.name + } + return 'Definition' + }, + required: true, + description: 'Please answer a few basic questions about your project. You can also provide the needed information in a supporting document--add a link in the notes section or upload it below.', + subSections: [ + { + id: 'projectName', + required: true, + validationError: 'Please provide a name to your project', + fieldName: 'name', + description: '', + title: 'Project Name', + type: 'project-name' + }, + { + id: 'questions', + required: true, + hideTitle: true, + title: 'Questions', + description: '', + type: 'questions', + questions: [ + { + id: 'projectInfo', + fieldName: 'description', + // required is not needed if we specifiy validations + // required: true, + validations: 'isRequired,minLength:160', + validationErrors: { + isRequired: 'Please provide your objectives', + minLength: 'Please enter at least 160 characters' + }, + description: 'Brief Description of your objectives', + title: 'Objectives', + type: 'textbox' + } + + ] + } + + ] + }, + + { + id: 'files', + required: isFileRequired, + title: (project) => `Project Files (${_.get(project, 'attachments', []).length})` || 'Files', + description: '', + type: 'files', + fieldName: 'attachments' + } +] + +export default sections + +export const basicSections = [ + { + id: 'appDefinition', + title: '', + required: true, + description: 'Please answer a few basic questions about your project and, as an option, add links to supporting documents in the “Notes” section. If you have any files to upload, you’ll be able to do so later.', + subSections: [ + { + id: 'projectName', + required: true, + validationError: 'Please provide a name to your project', + fieldName: 'name', + description: '', + title: 'Project Name', + type: 'project-name' + }, + { + id: 'questions', + required: true, + hideTitle: true, + title: 'Questions', + description: '', + type: 'questions', + questions: [ + { + id: 'projectInfo', + fieldName: 'description', + // required is not needed if we specifiy validations + // required: true, + validations: 'isRequired,minLength:160', + validationErrors: { + isRequired: 'Please provide your objectives', + minLength: 'Please enter at least 160 characters' + }, + description: 'Brief Description of your objectives', + title: 'Objectives', + type: 'textbox' + }, + + { + icon: 'question', + title: 'Do you have ground truth defined?', + description: '', + + fieldName: 'details.vision.groundtruth', + type: 'radio-group', + options: [ + {value: 'true', label: 'Yes'}, + {value: 'false', label: 'No'} + ], + required: true, + validationError: 'Please select one' + }, + { + icon: 'question', + title: 'Describe your ground truth?', + description: '(if applicable)', + type: 'textbox', + fieldName: 'details.vision.groundtruthDesc' + }, + { + icon: 'question', + title: 'Describe your data set', + description: '(if applicable)', + type: 'textbox', + fieldName: 'details.vision.dataDesc' + } + + ] + }, + { + id: 'notes', + fieldName: 'details.appDefinition.notes', + title: 'Additional Notes', + description: 'Please detail any other additional information', + type: 'notes' + } + ] + } +] diff --git a/src/config/projectQuestions/performance_testing.v1.0.js b/src/config/projectQuestions/performance_testing.v1.0.js index 398da9a28..10c0045a2 100644 --- a/src/config/projectQuestions/performance_testing.v1.0.js +++ b/src/config/projectQuestions/performance_testing.v1.0.js @@ -1,5 +1,5 @@ import _ from 'lodash' -import NumberText from '../../components/NumberText/NumberText' +// import NumberText from '../../components/NumberText/NumberText' import { findProduct } from '../projectWizard' @@ -45,16 +45,6 @@ const sections = [ description: '', type: 'questions', questions: [ - { - icon: 'question', - id: 'targetApplication.appName', - fieldName: 'details.targetApplication.appName', - title: 'Name of the application we will test', - // description: '', - type: 'textbox', - required: true, - validationError: 'Please provide name of the target application' - }, { id: 'projectInfo', fieldName: 'description', @@ -65,44 +55,75 @@ const sections = [ isRequired: 'Please provide a description', minLength: 'Please enter at least 160 characters' }, - description: 'Brief Description', - title: 'Description', + description: 'In 160 or more characters tell us what is the app, main functions, problem area, etc..', + title: 'Please provide brief description of the system, application to be Performance tested', type: 'textbox' }, { icon: 'question', - title: 'Expected load on the platform exercised during Performance Test? ', - description: '', - fieldName: 'details.testingNeeds.expectedLoad', - type: 'tiled-radio-group', + title: 'What is the load on system in terms concurrent users for Performance Testing?', + description: '(Unit package includes 500 virtual users, additional load would require Top-Ups)', + type: 'slide-radiogroup', options: [ - { value: '60%', title: '% load', icon: NumberText, iconOptions: { number: '60' }, desc: 'endurance testing', price: 7000 }, - { value: '100%', title: '% load', icon: NumberText, iconOptions: { number: '100' }, desc: 'load testing', price: 5000 }, - { value: '120%', title: '% load', icon: NumberText, iconOptions: { number: '120' }, desc: 'stress testing', price: 7000 } + { value: 'upto-500', title: 'Up to 500' }, + { value: 'upto-1000', title: 'Up to 1000' }, + { value: 'upto-5000', title: 'Up to 5000' }, + { value: 'above-5000', title: 'More than 5000' } ], + fieldName: 'details.loadDetails.concurrentUsersCount', required: true, validationError: 'Please provide expected load' }, + { + icon: 'question', + title: 'What is the count of business processes - transactions to be included for Performance Testing?', + description: '(Unit package covers 10 transactions, additional transactions would require Top-Ups)', + fieldName: 'details.loadDetails.businessProcessesCount', + type: 'slide-radiogroup', + options: [ + { value: 'upto-5', title: 'Up to 5'}, + { value: 'upto-10', title: 'Up to 10' }, + { value: 'upto-25', title: 'Up to 25' }, + { value: 'above-25', title: 'More than 25' } + ], + required: true, + validationError: 'Please provide expected number of business processes' + }, + { + icon: 'question', + title: 'What is the expected hours of execution for all different Performance Tests to be conducted?', + description: '(Unit package covers 10 hours of execution, additional execution time would require Top-Ups)', + fieldName: 'details.loadDetails.expectedExecutionHours', + type: 'slide-radiogroup', + options: [ + { value: 'upto-5', title: 'Up to 5'}, + { value: 'upto-10', title: 'Up to 10' }, + { value: 'upto-25', title: 'Up to 25' }, + { value: 'above-25', title: 'More than 25' } + ], + required: true, + validationError: 'Please provide expected hours of execution' + }, { icon: 'question', title: 'Please select any additional add-ons?', - description: 'estimated additional cost in ()', + description: '', type: 'checkbox-group', options: [ - { value: 'scenario', label: 'Scenario Booster add 3 more ($1,000)' }, - { value: '250vusers', label: 'Add 250 vUsers ($1,000)' }, - { value: '2500vusers', label: 'Add 2500 vUsers ($4,000)' }, - { value: 'geo', label: 'Add additional Geography($1,500)' }, - { value: 'poc', label: 'Precurser to purchase - 1 Tool, 2 scripts,1 hour execution ($2,500)' }, - { value: 'strategy', label: 'Utilize consultant to tailor strategy ($3,000)' }, - { value: 'execution', label: 'Execution Booster extra 2 hours ($500)' }, - { value: 'mytool', label: 'Use my own testing tool ($2,500)' }, - { value: 'myscripts', label: 'Modify/Use own scripts ($5,000)' }, - { value: 'late', label: 'Late Entry - 1 week lead time ($2,000)' } + { value: 'scenario', label: 'Scenario Booster add 3 more' }, + { value: '250vusers', label: 'Add 250 vUsers' }, + { value: '2500vusers', label: 'Add 2500 vUsers' }, + { value: 'geo', label: 'Add additional Geography' }, + { value: 'poc', label: 'Precurser to purchase - 1 Tool, 2 scripts,1 hour execution' }, + { value: 'strategy', label: 'Utilize consultant to tailor strategy' }, + { value: 'execution', label: 'Execution Booster extra 2 hours' }, + { value: 'mytool', label: 'Use my own testing tool' }, + { value: 'myscripts', label: 'Modify/Use own scripts' }, + { value: 'late', label: 'Late Entry - 1 week lead time' } ], + required: false, fieldName: 'details.testingNeeds.addons' } - ] }, { @@ -113,6 +134,14 @@ const sections = [ requirements and/or test cases. After creating \ your project you will be able to upload files.', type: 'notes' + }, + { + id: 'files', + required: isFileRequired, + title: (project) => `Project Files (${_.get(project, 'attachments', []).length})` || 'Files', + description: '', + type: 'files', + fieldName: 'attachments' } ] }, @@ -123,9 +152,9 @@ const sections = [ description: 'Please provide information on specific points of contacts.', subSections: [ { - id: 'scope', + id: 'spoc', required: false, - title: 'SPOCs', + title: 'SPOCs (Single Point of Contact)', description: '', type: 'questions', questions: [ @@ -193,15 +222,155 @@ const sections = [ } } ] - }, - + } + ] + }, + { + id: 'systemOverview', + title: 'System Overview', + required: false, + description: 'Please provide the overview of the system to be tested', + subSections: [ { - id: 'files', - required: isFileRequired, - title: (project) => `Project Files (${_.get(project, 'attachments', []).length})` || 'Files', + id: 'questions', + // required: true, + hideTitle: true, + title: 'Questions', description: '', - type: 'files', - fieldName: 'attachments' + type: 'questions', + questions: [ + { + id: 'architecture', + // required: true, + // validationError: 'Please provide architecture details of the applciation', + fieldName: 'details.targetApplication.architecture', + description: '', + title: 'What is the architecture of the System? Please share/embed the Application and Server architecture diagram. Also share Non functional requriements docs and High/Low level design docs if available', + type: 'textbox' + }, + { + id: 'developmentPlatform', + icon: 'question', + title: 'What is the application development platform?', + description: '', + type: 'checkbox-group', + options: [ + { value: 'dotnet', label: '.NET' }, + { value: 'j2ee', label: 'J2EE' }, + { value: 'ria', label: 'Rich Internet Applications' }, + { value: 'oracle', label: 'Oracle Technology' }, + { value: 'sap', label: 'SAP' }, + { value: 'mainframe', label: 'Mainframe' }, + { value: 'adobe-flex', label: 'Adobe Flex' }, + { value: 'others', label: 'Others' } + ], + fieldName: 'details.targetApplication.developmentPlatform' + // required: true, + // validationError: 'Please provide development platform of the application' + }, + { + id: 'frontEnd', + icon: 'question', + title: 'What is the front end of the system?', + description: '', + fieldName: 'details.targetApplication.frontEnd', + type: 'checkbox-group', + options: [ + { value: 'web-browser', label: 'Web Browser - Thin Client'}, + { value: 'desktop-app', label: 'Desktop App (Executable) - Thick Client' }, + { value: 'citrix', label: 'Citrix based Desktop App (Executable)' }, + { value: 'java', label: 'Java based (with Swing/Applets)' }, + { value: 'oracle-forms', label: 'Web based Oracle Forms' }, + { value: 'other', label: 'Any other' } + ] + // required: true, + // validationError: 'Please provide front end used in the application' + }, + { + icon: 'question', + title: 'What are the web servers used?', + description: '(For eg. Webserver can be Apache, IIS etc.)', + fieldName: 'details.targetApplication.webBrowsers', + type: 'textbox' + // required: true, + // validationError: 'Please provide target web browsers' + }, + { + icon: 'question', + title: 'What ae the application servers used?', + description: '(For eg. Application server can be JBoss or Weblogic or Websphere etc.)', + fieldName: 'details.targetApplication.appServers', + type: 'textbox' + // required: true, + // validationError: 'Please provide application servers used' + }, + { + icon: 'question', + title: 'What is the back end of your application?', + description: '(For eg. Back end can be Oracle, MS SQL or Sybase etc)', + fieldName: 'details.targetApplication.backEnd', + type: 'textbox' + // required: true, + // validationError: 'Please provide back end used in the application' + }, + { + icon: 'question', + title: 'If the back end is a legacy system then specify the below', + description: 'Mainframe(S390), AS400, Others', + fieldName: 'details.targetApplication.legacyBackEnd', + type: 'textbox' + }, + { + icon: 'question', + title: 'What is the middleware used?', + description: '(For eg. Middleware can be MQSeries or TIBCO or Webmethod etc)', + fieldName: 'details.targetApplication.middleware', + type: 'textbox' + // required: true, + // validationError: 'Please provide middleware used in the application' + }, + { + icon: 'question', + title: 'Please specify if web services are used and their functions', + description: '(For eg. SOAP/REST Webservices deployed in App server for new customer creation and maintenance)', + fieldName: 'details.targetApplication.webservices', + type: 'textbox' + // required: true, + // validationError: 'Please provide web services used in the application' + }, + { + id: 'targetApplication.authMode', + icon: 'question', + title: 'What is the authentication mode used by the Application?', + description: '', + fieldName: 'details.targetApplication.authMode', + type: 'checkbox-group', + options: [ + { value: 'ntlm', label: 'NTLM'}, + { value: 'sso', label: 'Siteminder/SSO' }, + { value: 'ldap', label: 'LDAP' }, + { value: 'others', label: 'Others' } + ] + // required: true, + // validationError: 'Please provide authentication mode of the application' + }, + { + id: 'targetApplication.interfaces', + icon: 'question', + title: 'What Interfaces does the application has?', + description: '', + fieldName: 'details.targetApplication.interfaces', + type: 'checkbox-group', + options: [ + { value: 'vendor-system', label: 'Vendor System'}, + { value: 'document-mgmt-system', label: 'Document Mgmt System' }, + { value: 'payments', label: 'Payments' }, + { value: 'other', label: 'Others' } + ] + // required: true, + // validationError: 'Please provide interfaces used in the application' + } + ] } ] }, @@ -212,27 +381,28 @@ const sections = [ subSections: [ { id: 'perfTestEnvSec', - title: 'Details', + title: 'Questions', + hideTitle: true, description: '', type: 'questions', questions: [ { icon: 'question', - fieldName: 'details.perfTestEnv.simulators', + fieldName: 'details.perfTestEnv.missingCompSimulators', description: '', title: 'Are the simulators/stubs available in test enviornemnt for the components not avaiable and do they support concurrent request simulation?', type: 'textbox' }, { icon: 'question', - fieldName: 'details.perfTestEnv.vendors', + fieldName: 'details.perfTestEnv.thirdPartyStubs', description: '', title: 'Will online interfaces/stubs for the payment systems, vendor systems etc. be available for performance testing?', type: 'textbox' }, { icon: 'question', - fieldName: 'details.perfTestEnv.vendors', + fieldName: 'details.perfTestEnv.testDataAvailability', description: '', title: 'Please provide details on test data availability? A) Resident or master test data in DB e.g. Customers, products, locations etc. B) User specific data e.g. User Ids, email, credit card, order number etc. Who will support creating/importing/ masking test data', type: 'textbox' @@ -246,10 +416,14 @@ const sections = [ }, { icon: 'question', - fieldName: 'details.perfTestEnv.cloud', - description: '', - title: 'Are the applications hosted on physical servers or virtual/cloud infrastructure?', - type: 'textbox' + fieldName: 'details.perfTestEnv.hostedOn', + description: 'Are the applications hosted on physical servers or virtual/cloud infrastructure', + title: 'Where are applications hosted?', + type: 'radio-group', + options: [ + {value: 'physical-servers', label: 'Physical servers'}, + {value: 'cloud', label: 'Virtual/Cloud infrastructure'} + ] }, { icon: 'question', @@ -280,7 +454,7 @@ in scope?', }, { icon: 'question', - fieldName: 'details.perfTestEnv.saasTools', + fieldName: 'details.perfTestEnv.saasAllowPortsOpening', description: '', title: 'In case of Cloud based or SaaS performance testing tools, will your organisation allow to open necessary ports in firewall to inject load on to application in test environment.', type: 'textbox' @@ -296,7 +470,8 @@ in scope?', subSections: [ { id: 'prevDetails', - title: 'Details', + title: 'Questions', + hideTitle: true, description: '', type: 'questions', questions: [ @@ -323,18 +498,25 @@ in scope?', }, { icon: 'question', - fieldName: 'details.prevDetails.types', + fieldName: 'details.prevDetails.typesOfTests', description: '', title: 'What different types of tests carried out and measurements captured?', type: 'textbox' }, { icon: 'question', - fieldName: 'details.prevDetails.tools', + fieldName: 'details.prevDetails.monitoringTools', description: '', title: 'What were the performance testing and performance monitoring tools used?', type: 'textbox' }, + { + icon: 'question', + fieldName: 'details.prevDetails.testScripts', + description: '', + title: 'Are the performance test scenarios and automated test scripts available at project location?', + type: 'textbox' + }, { icon: 'question', fieldName: 'details.prevDetails.issues', @@ -383,15 +565,6 @@ export const basicSections = [ description: '', type: 'questions', questions: [ - { - icon: 'question', - title: 'Name of the Application to be tested', - description: 'Please enter the name of the application being tested', - type: 'textbox', - fieldName: 'details.targetApplication.appName', - required: true, - validationError: 'Please provide name of the target application' - }, { id: 'projectInfo', fieldName: 'description', @@ -403,56 +576,53 @@ export const basicSections = [ minLength: 'Please enter at least 160 characters' }, description: 'In 160 or more characters tell us what is the app, main functions, problem area, etc..', - title: 'Description of the Application to be tested', + title: 'Please provide brief description of the system, application to be Performance tested', type: 'textbox' }, { icon: 'question', - title: 'What type of tests would you like to be conducted?', - description: 'Please select all that apply', - type: 'checkbox-group', + title: 'What is the load on system in terms concurrent users for Performance Testing?', + description: '(Unit package includes 500 virtual users, additional load would require Top-Ups)', + type: 'slide-radiogroup', options: [ - { value: 'load', label: 'Load' }, - { value: 'stress', label: 'Stress' }, - { value: 'endurance', label: 'Endurance' }, - { value: 'other', label: 'Other' } + { value: 'upto-500', title: 'Up to 500' }, + { value: 'upto-1000', title: 'Up to 1000' }, + { value: 'upto-5000', title: 'Up to 5000' }, + { value: 'above-5000', title: 'More than 5000' } ], - fieldName: 'details.appDefinition.perfTestingTypes', + fieldName: 'details.loadDetails.concurrentUsersCount', required: true, - validationError: 'Please select at least one type of tests' + validationError: 'Please provide expected load' }, { icon: 'question', - title: 'Expected load during Performance Test', - description: 'How much do you want us to load the platform during Performance Test? Higher loads can uncover more problems.', - fieldName: 'details.testingNeeds.expectedLoad', - type: 'tiled-radio-group', + title: 'What is the count of business processes - transactions to be included for Performance Testing?', + description: '(Unit package covers 10 transactions, additional transactions would require Top-Ups)', + fieldName: 'details.loadDetails.businessProcessesCount', + type: 'slide-radiogroup', options: [ - { value: '60%', title: '% load', icon: NumberText, iconOptions: { number: '60' }, desc: 'endurance testing', price: 7000 }, - { value: '100%', title: '% load', icon: NumberText, iconOptions: { number: '100' }, desc: 'load testing', price: 5000 }, - { value: '120%', title: '% load', icon: NumberText, iconOptions: { number: '120' }, desc: 'stress testing', price: 7000 } + { value: 'upto-5', title: 'Up to 5'}, + { value: 'upto-10', title: 'Up to 10' }, + { value: 'upto-25', title: 'Up to 25' }, + { value: 'above-25', title: 'More than 25' } ], required: true, - validationError: 'Please provide expected load' + validationError: 'Please provide expected number of business processes' }, { icon: 'question', - title: 'Testing add-on packs', - description: 'Please select all that apply. These addons provide a way to expand the testing parameters.', - type: 'checkbox-group', + title: 'What is the expected hours of execution for all different Performance Tests to be conducted?', + description: '(Unit package covers 10 hours of execution, additional execution time would require Top-Ups)', + fieldName: 'details.loadDetails.expectedExecutionHours', + type: 'slide-radiogroup', options: [ - { value: 'scenario', label: 'Scenario Booster - 3 additional testing scenarios ($1,000)' }, - { value: '250vusers', label: 'Add 250 vUsers ($1,000)' }, - { value: '2500vusers', label: 'Add 2500 vUsers ($4,000)' }, - { value: 'geo', label: 'Add additional Geography ($1,500)' }, - { value: 'poc', label: 'Precurser to purchase - 1 Tool, 2 scripts,1 hour execution ($2,500)' }, - { value: 'strategy', label: 'Utilize consultant to tailor strategy ($3,000)' }, - { value: 'execution', label: 'Execution Booster extra 2 hours ($500)' }, - { value: 'mytool', label: 'Use my own testing tool ($2,500)' }, - { value: 'myscripts', label: 'Modify/Use own scripts ($5,000)' }, - { value: 'late', label: 'Late Entry - 1 week lead time ($2,000)' } + { value: 'upto-5', title: 'Up to 5'}, + { value: 'upto-10', title: 'Up to 10' }, + { value: 'upto-25', title: 'Up to 25' }, + { value: 'above-25', title: 'More than 25' } ], - fieldName: 'details.testingNeeds.addons' + required: true, + validationError: 'Please provide expected hours of execution' } ] }, @@ -460,9 +630,9 @@ export const basicSections = [ id: 'notes', fieldName: 'details.appDefinition.notes', title: 'Notes', - description: 'Please add details of any critical business processes \ - such as peak hour user load, transaction count in peak hours, \ - SLA (in seconds).', + description: 'Please enter any additional information like requirements,\ + architecture details, tools, performance baseline, etc.\ + After creating your project you will be able to upload files.', type: 'notes' } ] diff --git a/src/config/projectSpecification/typeToSpecification.json b/src/config/projectSpecification/typeToSpecification.json index 48493d39d..42bc2bac1 100644 --- a/src/config/projectSpecification/typeToSpecification.json +++ b/src/config/projectSpecification/typeToSpecification.json @@ -16,6 +16,7 @@ "digital_accessability": "crowd_testing.v1.0", "open_source_automation": "crowd_testing.v1.0", "consulting_adivisory": "crowd_testing.v1.0", + "computer_vision": "computer_vision.v1.0", "api_dev": "app_dev.v1.0", "frontend_dev" : "app_dev.v1.0" } diff --git a/src/config/projectWizard/index.js b/src/config/projectWizard/index.js index f92a1dd81..29c610068 100644 --- a/src/config/projectWizard/index.js +++ b/src/config/projectWizard/index.js @@ -57,6 +57,35 @@ const products = { icon: 'product-chatbot-chatbot', id: 'generic_chatbot', aliases: ['chatbot', 'generic_chatbot'] + }, + 'Computer Vision': { + brief: 'TBD', + details: 'Work with images to recognize patterns, compute correspondences, etc', + icon: 'product-qa-crowd-testing', + id: 'computer_vision', + aliases: ['computer-vision', 'computer_vision'], + hidden : true + }, + 'Algorithm Optimization': { + brief: 'TBD', + details: 'Boost the performance (speed or accuracy) of an existing or new algorithm', + icon: 'product-qa-crowd-testing', + id: 'algorithm_optimization', + aliases: ['algorithm_optimization', 'algorithm-optimization', 'algo_optimization'] + }, + 'Predictive Analytics': { + brief: 'TBD', + details: 'Starting with a set of data and well-defined objectives, model trends and predict outcomes', + icon: 'product-qa-crowd-testing', + id: 'predictive-analytics', + aliases: ['predictive-analytics', 'predictive_analytics'] + }, + 'Data Exploration': { + brief: 'TBD', + details: 'Ask a crowd of experts to look at your data, understand your goals, and suggest solutions', + icon: 'product-qa-crowd-testing', + id: 'data-exploration', + aliases: ['data-exploration', 'data_exploration'] } } }, @@ -170,7 +199,8 @@ const products = { details: 'Webpage rendering effiency, Load, Stress and Endurance Test', icon: 'product-qa-website-performance', id: 'performance_testing', - aliases: ['performance-testing', 'performance_testing'] + aliases: ['performance-testing', 'performance_testing'], + hidden: true }, 'Digital Accessibility': { brief: 'TBD', @@ -197,6 +227,44 @@ const products = { disabled: true } } + }, + Analytics: { + icon: 'product-cat-qa', + info: 'Test and fix bugs in your software', + question: 'What kind of quality assurance (QA) do you need?', + id: 'analytics', + aliases: ['all-analytics'], + hidden: true, + subtypes: { + 'Computer Vision': { + brief: 'TBD', + details: 'Work with images to recognize patterns, compute correspondences, etc', + icon: 'product-qa-crowd-testing', + id: 'computer_vision', + aliases: ['computer-vision', 'computer_vision'] + }, + 'Algorithm Optimization': { + brief: 'TBD', + details: 'Boost the performance (speed or accuracy) of an existing or new algorithm', + icon: 'product-qa-crowd-testing', + id: 'algorithm_optimization', + aliases: ['algorithm_optimization', 'algorithm-optimization', 'algo_optimization'] + }, + 'Predictive Analytics': { + brief: 'TBD', + details: 'Starting with a set of data and well-defined objectives, model trends and predict outcomes', + icon: 'product-qa-crowd-testing', + id: 'predictive-analytics', + aliases: ['predictive-analytics', 'predictive_analytics'] + }, + 'Data Exploration': { + brief: 'TBD', + details: 'Ask a crowd of experts to look at your data, understand your goals, and suggest solutions', + icon: 'product-qa-crowd-testing', + id: 'data-exploration', + aliases: ['data-exploration', 'data_exploration'] + } + } } } diff --git a/src/projects/detail/components/ProjectSpecSidebar.jsx b/src/projects/detail/components/ProjectSpecSidebar.jsx index 82df5ceaa..4affb6865 100644 --- a/src/projects/detail/components/ProjectSpecSidebar.jsx +++ b/src/projects/detail/components/ProjectSpecSidebar.jsx @@ -21,7 +21,11 @@ const calcProgress = (project, subSection) => { }) let count = 0 _.forEach(vals, (v) => {if (v) count++ }) - return [count, subSection.questions.length] + // Github issue#1399, filtered only required questions to set expected length of valid answers + const filterRequiredQuestions = (q) => ( + q.required || (q.validations && q.validations.indexOf('isRequired') !== -1) + ) + return [count, _.filter(subSection.questions, filterRequiredQuestions).length] } else if (subSection.id === 'screens') { const screens = _.get(project, 'details.appScreens.screens', []) const validScreens = screens.filter((s) => { diff --git a/src/projects/detail/components/SidebarNav.jsx b/src/projects/detail/components/SidebarNav.jsx index 3b66ffefe..aeb8e53b6 100644 --- a/src/projects/detail/components/SidebarNav.jsx +++ b/src/projects/detail/components/SidebarNav.jsx @@ -21,7 +21,8 @@ const scrollProps = { */ const renderSubNavItems = (child, idx) => { const { name, progress, link, required } = child - const isComplete = progress.length && progress[0] === progress[1] + // Github issue#1399, changed === to >= to determine if all required fields are completed + const isComplete = progress.length && progress[0] >= progress[1] const showProgress = progress[1] > 0 && name.toLowerCase().indexOf('questions') !== -1 return (