From 339166a50ab2a7a8684ba054d37305eed9d44977 Mon Sep 17 00:00:00 2001 From: Huong Nguyen Date: Fri, 6 Sep 2024 10:52:43 +0100 Subject: [PATCH 01/35] first skeleton for the feedback component Signed-off-by: Huong Nguyen --- package.json | 3 +- src/components/feedback-form/feedback-form.js | 13 +++++++ src/components/feedback-form/list.js | 34 +++++++++++++++++++ src/components/feedback-form/stars.js | 33 ++++++++++++++++++ src/components/feedback-form/stars.scss | 6 ++++ src/components/flowchart/flowchart.js | 6 ++++ src/components/icons/star.js | 12 +++++++ 7 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 src/components/feedback-form/feedback-form.js create mode 100644 src/components/feedback-form/list.js create mode 100644 src/components/feedback-form/stars.js create mode 100644 src/components/feedback-form/stars.scss create mode 100644 src/components/icons/star.js diff --git a/package.json b/package.json index fcfbf0c864..c086017a5b 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "highlight.js": "^10.7.3", "kiwi.js": "^1.1.3", "lodash": "^4.17.21", + "lodash.range": "^3.2.0", "plotly.js-dist-min": "^2.26.0", "react-content-loader": "^6.2.0", "react-csv": "^2.2.2", @@ -172,4 +173,4 @@ "not op_mini all" ], "snyk": true -} \ No newline at end of file +} diff --git a/src/components/feedback-form/feedback-form.js b/src/components/feedback-form/feedback-form.js new file mode 100644 index 0000000000..6e9e383bf4 --- /dev/null +++ b/src/components/feedback-form/feedback-form.js @@ -0,0 +1,13 @@ +import React from 'react'; +import Modal from '../ui/modal'; +import { Stars } from './stars'; + +export const FeedbackForm = ({ title, onClose }) => { + return ( +
+ + + +
+ ); +}; diff --git a/src/components/feedback-form/list.js b/src/components/feedback-form/list.js new file mode 100644 index 0000000000..89be76e9bf --- /dev/null +++ b/src/components/feedback-form/list.js @@ -0,0 +1,34 @@ +import React, { useCallback } from 'react'; + +export const List = ({ + data = [], + render, + beforeItemsRender, + afterItemsRender, + onItemClick, + ...rest +}) => { + const getItemPropsCallback = useCallback( + (postfix) => ({ + 'data-element-name': `item:${postfix}`, + }), + [] + ); + + return ( + <> + {beforeItemsRender ? beforeItemsRender() : null} + {data?.map((item, index) => + render({ + index, + item, + length: data.length, + getItemProps: getItemPropsCallback, + onItemClick, + ...rest, + }) + )} + {afterItemsRender ? afterItemsRender() : null} + + ); +}; diff --git a/src/components/feedback-form/stars.js b/src/components/feedback-form/stars.js new file mode 100644 index 0000000000..6569eb9b39 --- /dev/null +++ b/src/components/feedback-form/stars.js @@ -0,0 +1,33 @@ +import React, { useEffect, useState } from 'react'; +import range from 'lodash/range'; +import IconButton from '../ui/icon-button'; +import StarIcon from '../icons/star'; +import { List } from './list'; + +import './stars.scss'; + +export const Stars = ({ + onClick, + selectedRating = -1, + name, + className, + size = 24, + isActive = true, + starsCount = 5, +}) => { + return ( + + ); +}; diff --git a/src/components/feedback-form/stars.scss b/src/components/feedback-form/stars.scss new file mode 100644 index 0000000000..29beeee4d3 --- /dev/null +++ b/src/components/feedback-form/stars.scss @@ -0,0 +1,6 @@ +.stars-wrapper { + display: flex; + flex-direction: row; + list-style-type: none; + padding: 0; +} diff --git a/src/components/flowchart/flowchart.js b/src/components/flowchart/flowchart.js index f8abcdf26b..496ad636a8 100644 --- a/src/components/flowchart/flowchart.js +++ b/src/components/flowchart/flowchart.js @@ -46,7 +46,9 @@ import { getDataTestAttribute } from '../../utils/get-data-test-attribute'; import Tooltip from '../ui/tooltip'; import { SlicedPipelineActionBar } from '../sliced-pipeline-action-bar/sliced-pipeline-action-bar'; import { SlicedPipelineNotification } from '../sliced-pipeline-notification/sliced-pipeline-notification'; +import { FeedbackForm } from '../feedback-form/feedback-form'; import './styles/flowchart.scss'; +import { Feed } from '@mui/icons-material'; /** * Display a pipeline flowchart, mostly rendered with D3 @@ -871,6 +873,9 @@ export class FlowChart extends Component { })} ref={this.layerNamesRef} /> + + + {showSlicingNotification && visibleSlicing && ( )} + {numberOfNodesInSlicedPipeline > 0 && runCommand.length > 0 && (
( + + + +); + +export default StarIcon; From 131f1381f5c4820c584fa1e70cd5deeedba28d82 Mon Sep 17 00:00:00 2001 From: Huong Nguyen Date: Fri, 6 Sep 2024 16:11:46 +0100 Subject: [PATCH 02/35] star component Signed-off-by: Huong Nguyen --- src/components/feedback-form/feedback-form.js | 11 ++--- src/components/feedback-form/stars.js | 42 ++++++++----------- src/components/feedback-form/stars.scss | 6 +++ 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/components/feedback-form/feedback-form.js b/src/components/feedback-form/feedback-form.js index 6e9e383bf4..f845470a41 100644 --- a/src/components/feedback-form/feedback-form.js +++ b/src/components/feedback-form/feedback-form.js @@ -3,11 +3,8 @@ import Modal from '../ui/modal'; import { Stars } from './stars'; export const FeedbackForm = ({ title, onClose }) => { - return ( -
- - - -
- ); + }; diff --git a/src/components/feedback-form/stars.js b/src/components/feedback-form/stars.js index 6569eb9b39..4d7a75191e 100644 --- a/src/components/feedback-form/stars.js +++ b/src/components/feedback-form/stars.js @@ -7,27 +7,21 @@ import { List } from './list'; import './stars.scss'; export const Stars = ({ - onClick, - selectedRating = -1, - name, - className, - size = 24, - isActive = true, - starsCount = 5, -}) => { - return ( -
    - ( - isActive && onClick && onClick(item)} - icon={StarIcon} - /> - )} - /> -
- ); -}; + onClick, + selectedRating = -1, + className, + starsCount = 5, + }) => { + return ( +
+ {Array.from({ length: starsCount }, (_, index) => ( + onClick && onClick(index + 1)} + icon={StarIcon} + /> + ))} +
+ ); + }; \ No newline at end of file diff --git a/src/components/feedback-form/stars.scss b/src/components/feedback-form/stars.scss index 29beeee4d3..d6d9424fbe 100644 --- a/src/components/feedback-form/stars.scss +++ b/src/components/feedback-form/stars.scss @@ -4,3 +4,9 @@ list-style-type: none; padding: 0; } + +.active { + path { + fill: yellow; + } +} From d34adc1f25d33cb6c6231f5f98adad41ac557467 Mon Sep 17 00:00:00 2001 From: Huong Nguyen Date: Fri, 6 Sep 2024 17:19:36 +0100 Subject: [PATCH 03/35] include feedback button Signed-off-by: Huong Nguyen --- .../feedback-button/feedback-button.js | 15 ++++ .../feedback-button/feedback-button.scss | 20 ++++++ src/components/feedback-form/feedback-form.js | 72 ++++++++++++++++++- .../feedback-form/feedback-form.scss | 28 ++++++++ src/components/feedback-form/stars.js | 4 +- src/components/flowchart/flowchart.js | 15 ++-- 6 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 src/components/feedback-button/feedback-button.js create mode 100644 src/components/feedback-button/feedback-button.scss create mode 100644 src/components/feedback-form/feedback-form.scss diff --git a/src/components/feedback-button/feedback-button.js b/src/components/feedback-button/feedback-button.js new file mode 100644 index 0000000000..3d2436bbb6 --- /dev/null +++ b/src/components/feedback-button/feedback-button.js @@ -0,0 +1,15 @@ +import React from 'react'; +import classnames from 'classnames'; + +import './feedback-button.scss'; + +export const FeedbackButton = ({ onClick, visible }) => { + return ( + + ) +} \ No newline at end of file diff --git a/src/components/feedback-button/feedback-button.scss b/src/components/feedback-button/feedback-button.scss new file mode 100644 index 0000000000..f88be94dd6 --- /dev/null +++ b/src/components/feedback-button/feedback-button.scss @@ -0,0 +1,20 @@ +.feedback-button { + position: fixed; + right: -2%; + top: 50%; + transform: translateY(-50%) rotate(-90deg); + width: 100px; + height: 40px; + background-color: #007bff; /* Example background color */ + color: white; /* Text color */ + border: none; + cursor: pointer; + text-align: center; + line-height: 40px; /* Aligns text vertically */ + font-size: 16px; /* Example font size */ + opacity: 0; +} + +.feedback-button--visible { + opacity: 1; +} \ No newline at end of file diff --git a/src/components/feedback-form/feedback-form.js b/src/components/feedback-form/feedback-form.js index f845470a41..6f725f2397 100644 --- a/src/components/feedback-form/feedback-form.js +++ b/src/components/feedback-form/feedback-form.js @@ -1,10 +1,80 @@ -import React from 'react'; +import React, { useState } from 'react'; import Modal from '../ui/modal'; +import Button from '../ui/button'; import { Stars } from './stars'; +import { callSlack } from '../../utils'; + +import './feedback-form.scss'; export const FeedbackForm = ({ title, onClose }) => { + const [isSubmitted, setSubmitted] = useState(false); + const [isTextareaActive, setTextareaActivity] = useState(false); + const [starNumber, setStars] = useState(0); + const [feedbackText, setFeedbackText] = useState(''); + + const onSubmit = async (e) => { + e.preventDefault(); + + if (starNumber === 0 || !feedbackText) { + return; + } + + const data = { + text: `Feedback: ${feedbackText}\nRating: ${starNumber} stars` + }; + + try { + const request = await callSlack({ + data + }); + + if (request.ok) { + alert('Feedback submitted successfully'); + setSubmitted(true); + } + } catch (error) { + alert('Feedback submission failed'); + console.error('Error submitting feedback:', error); + } + }; + + + // Function to handle input changes + const handleTextArea = (event) => { + setFeedbackText(event.target.value); + }; + + console.log(starNumber, 'starNumber') + + if (isSubmitted) { + return ( +
+ + Thank you for submitting your feedback! ๐Ÿ™ + +
+ ) + } else { + return ( +
+ + +
+