diff --git a/.github/label-commenter-config.yml b/.github/label-commenter-config.yml new file mode 100644 index 00000000..0a97e9b5 --- /dev/null +++ b/.github/label-commenter-config.yml @@ -0,0 +1,55 @@ +comment: + # header: "Please note the following requirement:" + footer: "\ + ---\n\n + >         Be sure to [join the community](https://slack.meshery.io), if you haven't yet and please leave a :star: [star on the project](../stargazers) :smile: + " + +labels: + - name: issue/design required + labeled: + issue: + body: This issue has been labeled with 'design-required'. Note that prior to commencing on implementation, a design specification needs to be created and reviewed for approval. See [Creating a Functional Specification](https://docs.google.com/document/d/1RP3IWLc-MiQS-QYasqCoVuCH7--G87p5ezE5f_nOzB8/edit?usp=sharing) to create a design spec. + action: open + - name: issue/remind + labeled: + issue: + body: Checking in... it has been awhile since we've heard from you on this issue. Are you still working on it? Please let us know and please don't hesitate to contact a [MeshMate](https://layer5.io/community/meshmates/) or any other [community member](https://layer5.io/community/members) for assistance. + action: open + pr: + body: Checking in... it has been awhile since we've heard from you on this issue. Are you still working on it? Please let us know and please don't hesitate to contact a [MeshMate](https://layer5.io/community/meshmates/) or any other [community member](https://layer5.io/community/members) for assistance. + action: open + - name: issue/dco + labeled: + issue: + body: "🚨 Alert! Git Police! We couldn’t help but notice that one or more of your commits is missing a sign-off. _A what?_ A commit sign-off (your email address).\n\n + To amend the commits in this PR with your signoff using the instructions provided in the DCO check. \n\n + To configure your dev environment to automatically signoff on your commits in the future, see [these instructions](https://github.com/meshery/meshery/blob/master/CONTRIBUTING.md#signing-off-on-commits-developer-certificate-of-origin)." + action: open + pr: + body: "🚨 Alert! Git Police! We couldn’t help but notice that one or more of your commits is missing a sign-off. _A what?_ A commit sign-off (your email address).\n\n + To amend the commits in this PR with your signoff using the instructions provided in the DCO check. \n\n + To configure your dev environment to automatically signoff on your commits in the future, see [these instructions](https://github.com/meshery/meshery/blob/master/CONTRIBUTING.md#signing-off-on-commits-developer-certificate-of-origin)." + action: open + - name: component/ui + labeled: + issue: + body: This issue has been labeled with 'component/ui'. 🧰 Here are docs on [Contributing to Meshery UI](https://docs.meshery.io/project/contributing/contributing-ui). 🎨 Here is the [Meshery UI Figma File](https://www.figma.com/file/SMP3zxOjZztdOLtgN4dS2W/Meshery-UI?node-id=4%3A0) File. Lastly, here are docs on [Contributing to Meshery's End-to-End Tests Using Cypress](https://docs.meshery.io/project/contributing/contributing-cypress). + action: open + pr: + body: This PR has been labeled with 'component/ui'. 🧰 Here are docs on [Contributing to Meshery UI](https://docs.meshery.io/project/contributing/contributing-ui). 🎨 Here is the [Meshery UI Figma File](https://www.figma.com/file/SMP3zxOjZztdOLtgN4dS2W/Meshery-UI?node-id=4%3A0) File. Lastly, here are docs on [Contributing to Meshery's End-to-End Tests Using Cypress](https://docs.meshery.io/project/contributing/contributing-cypress) + action: open + - name: component/mesheryctl + labeled: + issue: + body: This issue has been labeled with 'component/mesheryctl'. Note that after making changes you need to update it in the [mesheryctl command tracker](https://docs.google.com/spreadsheets/d/1q63sIGAuCnIeDs8PeM-0BAkNj8BBgPUXhLbe1Y-318o/edit#gid=0) spreadsheet. + action: open + pr: + body: This PR has been labeled with 'component/mesheryctl'. Note that after making changes you need to update it in the [mesheryctl command tracker](https://docs.google.com/spreadsheets/d/1q63sIGAuCnIeDs8PeM-0BAkNj8BBgPUXhLbe1Y-318o/edit#gid=0) spreadsheet. + action: open + # pr: + # body: Hi, please note that this issue will need an approved design specification before implementation proceeds. See [Creating a Functional Specification](https://docs.google.com/document/d/1RP3IWLc-MiQS-QYasqCoVuCH7--G87p5ezE5f_nOzB8/edit?usp=sharing) to create a design spec. + # action: open + + + diff --git a/.github/workflows/label-commenter.yml b/.github/workflows/label-commenter.yml new file mode 100644 index 00000000..2ad4e1cc --- /dev/null +++ b/.github/workflows/label-commenter.yml @@ -0,0 +1,29 @@ +name: Label Commenter + +on: + issues: + types: + - labeled + + pull_request_target: + types: + - labeled + +permissions: + contents: read + issues: write + pull-requests: write + +jobs: + comment: + runs-on: ubuntu-22.04 + steps: + - name: Checkout repo 🛎️ + uses: actions/checkout@master + with: + ref: master # Set your default branch + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Label Commenter + uses: peaceiris/actions-label-commenter@v1.10.0 + diff --git a/README.md b/README.md index c6f5e807..405eacc6 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ attach sistent to your project: ## Join the Layer5 community! -Our projects are community-built and welcome collaboration. 👍 Be sure to see the Layer5 Community Welcome Guide for a tour of resources available to you and jump into our Slack! +Our projects are community-built and welcome collaboration. 👍 Be sure to see the Layer5 Community Welcome Guide for a tour of resources available to you and jump into our Slack!

MeshMates diff --git a/site/package-lock.json b/site/package-lock.json index e39eff1c..0e885a37 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -8101,6 +8101,11 @@ "node": ">=0.10" } }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -8247,6 +8252,9 @@ "version": "4.19.1", "resolved": "https://registry.npmjs.org/express/-/express-4.19.1.tgz", "integrity": "sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", diff --git a/src/base/Grow/Grow.tsx b/src/base/Grow/Grow.tsx new file mode 100644 index 00000000..558f294b --- /dev/null +++ b/src/base/Grow/Grow.tsx @@ -0,0 +1,5 @@ +import { Grow as MuiGrow, GrowProps as MuiGrowProps } from '@mui/material'; + +export function Grow(props: MuiGrowProps): JSX.Element { + return ; +} diff --git a/src/base/Grow/index.tsx b/src/base/Grow/index.tsx new file mode 100644 index 00000000..61429465 --- /dev/null +++ b/src/base/Grow/index.tsx @@ -0,0 +1 @@ +export { Grow } from './Grow'; diff --git a/src/base/index.tsx b/src/base/index.tsx index a210c5a1..327a0440 100644 --- a/src/base/index.tsx +++ b/src/base/index.tsx @@ -31,6 +31,7 @@ export * from './FormControl'; export * from './FormControlLabel'; export * from './FormGroup'; export * from './Grid'; +export * from './Grow'; export * from './IconButton'; export * from './Input'; export * from './InputLabel'; diff --git a/src/custom/ActionButton/ActionButton.tsx b/src/custom/ActionButton/ActionButton.tsx new file mode 100644 index 00000000..86937c6a --- /dev/null +++ b/src/custom/ActionButton/ActionButton.tsx @@ -0,0 +1,89 @@ +import * as React from 'react'; +import { + Button, + ButtonGroup, + ClickAwayListener, + MenuItem, + MenuList, + Paper, + Popper +} from '../../base'; +import { DropDownIcon } from '../../icons'; +interface Option { + icon: React.ReactNode; + label: string; + onClick: (event: React.MouseEvent, index: number) => void; +} + +interface ActionButtonProps { + defaultActionClick: () => void; + options: Option[]; + label: string; +} + +export default function ActionButton({ + defaultActionClick, + options, + label +}: ActionButtonProps): JSX.Element { + const [open, setOpen] = React.useState(false); + const [anchorEl, setAnchorEl] = React.useState(null); + const handleMenuItemClick = () => { + setOpen(false); + }; + + const handleToggle = (event: React.MouseEvent) => { + event.stopPropagation(); + setAnchorEl(event.currentTarget); + setOpen((prevOpen) => !prevOpen); + }; + + const handleClose = () => { + setAnchorEl(null); + setOpen(false); + }; + + return ( + + + + + + + + + + {options.map((option, index) => ( + { + handleMenuItemClick(); + option.onClick(event, index); + }} + > +

{option.icon}
+ {option.label} + + ))} + + + + + + ); +} diff --git a/src/custom/ActionButton/index.tsx b/src/custom/ActionButton/index.tsx new file mode 100644 index 00000000..b06dacf4 --- /dev/null +++ b/src/custom/ActionButton/index.tsx @@ -0,0 +1,3 @@ +import ActionButton from './ActionButton'; + +export { ActionButton }; diff --git a/src/custom/CustomTooltip/customTooltip.tsx b/src/custom/CustomTooltip/customTooltip.tsx index b8cc173a..03ba5d92 100644 --- a/src/custom/CustomTooltip/customTooltip.tsx +++ b/src/custom/CustomTooltip/customTooltip.tsx @@ -6,6 +6,7 @@ type CustomTooltipProps = { title: string | React.ReactNode | JSX.Element; onClick?: (event: React.MouseEvent) => void; children: React.ReactNode; + fontSize?: string; } & Omit; function CustomTooltip({ @@ -13,6 +14,7 @@ function CustomTooltip({ onClick, placement, children, + fontSize = '1rem', ...props }: CustomTooltipProps): JSX.Element { return ( @@ -22,10 +24,9 @@ function CustomTooltip({ sx: { background: CHARCOAL, color: WHITE, - fontSize: '0.75rem', + fontSize: { fontSize }, borderRadius: '0.9375rem', - padding: '0.9rem', - zIndex: '999999' + padding: '0.9rem' } }, popper: { @@ -36,8 +37,8 @@ function CustomTooltip({ }} title={title} placement={placement} - onClick={onClick} arrow + onClick={onClick} {...props} > {children} diff --git a/src/custom/Feedback/FeedbackButton.tsx b/src/custom/Feedback/FeedbackButton.tsx index f8c2b666..fde59a90 100644 --- a/src/custom/Feedback/FeedbackButton.tsx +++ b/src/custom/Feedback/FeedbackButton.tsx @@ -1,5 +1,5 @@ import Typography from '@mui/material/Typography'; -import React, { CSSProperties, useRef, useState } from 'react'; +import React, { CSSProperties, useState } from 'react'; import { CalenderIcon, CloseIcon, @@ -107,21 +107,23 @@ interface FeedbackComponentProps { | 'right-top' | 'right-middle' | 'right-bottom'; + defaultMessage?: string; + defaultOpen?: boolean; } const FeedbackComponent: React.FC = ({ onSubmit, containerStyles, feedbackOptionStyles, - renderPosition + renderPosition, + defaultMessage = undefined, + defaultOpen = false }) => { - const [isOpen, setIsOpen] = useState(false); + const [isOpen, setIsOpen] = useState(defaultOpen); const [submitted, setSubmitted] = useState(false); - const [category, setCategory] = useState(); - const [messageValue, setMessageValue] = useState(); - const feedbackTextRef = useRef(null); - const [isChecked, setIsChecked] = useState(false); - + const [category, setCategory] = useState(feedbackData[0]); + const [messageValue, setMessageValue] = useState(defaultMessage); + const [isChecked, setIsChecked] = useState(!!defaultMessage); const handleCheckboxChange = (event: React.ChangeEvent) => { setIsChecked(event.target.checked); }; @@ -229,7 +231,6 @@ const FeedbackComponent: React.FC = ({ onChange={(e) => { setMessageValue(e.target.value); }} - ref={feedbackTextRef} required placeholder={category.placeholder} rows={5} diff --git a/src/custom/Feedback/style.tsx b/src/custom/Feedback/style.tsx index 5a9e4bfe..36d6484d 100644 --- a/src/custom/Feedback/style.tsx +++ b/src/custom/Feedback/style.tsx @@ -268,10 +268,12 @@ export const FeedbackOptionButton = styled(Button)(({ them ? SNOW_WHITE : SNOW_WHITE, fill: isOpen ? (theme.palette.mode === 'dark' ? CULTURED : DARK_PRIMARY_COLOR) : CULTURED, + stroke: isOpen ? SNOW_WHITE : KEPPEL, '&:hover': { color: theme.palette.mode === 'dark' ? SNOW_WHITE : BLACK, fill: theme.palette.mode === 'dark' ? CULTURED : DARK_PRIMARY_COLOR, - backgroundColor: WHITE + backgroundColor: WHITE, + stroke: SNOW_WHITE } })); diff --git a/src/custom/FlipCard/FlipCard.tsx b/src/custom/FlipCard/FlipCard.tsx index 3d39607a..7ecceaa0 100644 --- a/src/custom/FlipCard/FlipCard.tsx +++ b/src/custom/FlipCard/FlipCard.tsx @@ -1,83 +1,94 @@ +import { styled } from '@mui/material'; import React from 'react'; +import { BUTTON_MODAL_DARK, WHITE } from '../../theme/colors/colors'; -/** - * Wrapper component for flip cards. - * - * @param {Object} props - The component props. - * @param {Object} props.frontComponents - The components of the card front. - * @param {string} props.backComponents - The components of the card back. - * @param {Boolean} props.disableFlip - The card can be flip or not. - * - */ +export type FlipCardProps = { + duration?: number; + onClick?: () => void; + onShow?: () => void; + children: [React.ReactNode, React.ReactNode]; +}; -export interface FlipCardProps { - frontComponents: JSX.Element; - backComponents?: JSX.Element; - disableFlip?: boolean; +function GetChild(children: [React.ReactNode, React.ReactNode], key: number) { + if (!children) throw Error('FlipCard requires exactly two child components'); + if (children.length != 2) throw Error('FlipCard requires exactly two child components'); + + return children[key]; } -function FlipCard({ frontComponents, backComponents, disableFlip }: FlipCardProps): JSX.Element { - const [isFlipped, setIsFlipped] = React.useState(false); +const Card = styled('div')(({ theme }) => ({ + height: '100%', + backgroundColor: 'transparent', + perspective: theme.spacing(125) +})); + +const InnerCard = styled('div')(({ theme }) => ({ + padding: theme.spacing(2), + borderRadius: theme.spacing(1), + transformStyle: 'preserve-3d', + boxShadow: '0 4px 8px 0 rgba(0,0,0,0.2)', + backgroundColor: theme.palette.mode === 'dark' ? BUTTON_MODAL_DARK : WHITE, + cursor: 'pointer', + transformOrigin: '50% 50% 10%' +})); + +const FrontContent = styled('div')({ + backfaceVisibility: 'hidden' +}); + +const BackContent = styled('div')({ + backfaceVisibility: 'hidden', + transform: 'scale(-1, 1)', + wordBreak: 'break-word' +}); + +export function FlipCard({ duration = 500, onClick, onShow, children }: FlipCardProps) { + const [flipped, setFlipped] = React.useState(false); + const [activeBack, setActiveBack] = React.useState(false); - const handleFlip = () => { - if (!disableFlip) { - setIsFlipped(!isFlipped); - } - }; + const timeout = React.useRef(null); + + const Front = GetChild(children, 0); + const Back = GetChild(children, 1); + + React.useEffect(() => { + // This function makes sure that the inner content of the card disappears roughly + // after 30 deg rotation has already occured. It will ensure that the user doesn't gets + // a "blank" card while the card is rotating + // + // This guarantee can be offered because of two main reasons: + // 1. In sufficiently modern browsers JS and CSS are handled in different threads + // hence ones execution doesn't blocks another. + // 2. setTimeout will put its callback at the end of current context's end hence ensuring + // this callback doesn't gets blocked by another JS process. + + if (timeout.current) clearTimeout(timeout.current); + + timeout.current = setTimeout(() => { + setActiveBack(flipped); + }, duration / 6); + }, [flipped, duration]); return ( - <> -
{ + setFlipped((flipped) => !flipped); + onClick && onClick(); + onShow && onShow(); + }} + > + -
-
- {frontComponents} -
-
- {backComponents} -
-
-
- + {!activeBack ? ( + {React.isValidElement(Front) ? Front : null} + ) : ( + {React.isValidElement(Back) ? Back : null} + )} + + ); } - -export default FlipCard; diff --git a/src/custom/FlipCard/index.tsx b/src/custom/FlipCard/index.tsx index 8916a26a..a504789f 100644 --- a/src/custom/FlipCard/index.tsx +++ b/src/custom/FlipCard/index.tsx @@ -1,3 +1,4 @@ -import FlipCard from './FlipCard'; +import { FlipCard, FlipCardProps } from './FlipCard'; export { FlipCard }; +export type { FlipCardProps }; diff --git a/src/custom/index.tsx b/src/custom/index.tsx index 08660155..75e5077d 100644 --- a/src/custom/index.tsx +++ b/src/custom/index.tsx @@ -1,3 +1,5 @@ + +import { ActionButton } from './ActionButton'; import CatalogFilter, { CatalogFilterProps } from './CatalogFilter/CatalogFilter'; import { ConnectionChip } from './ConnectionChip'; import { @@ -21,7 +23,7 @@ import { withSuppressedErrorBoundary } from './ErrorBoundary'; import { FeedbackButton } from './Feedback'; -import { FlipCard } from './FlipCard'; +import { FlipCard, FlipCardProps } from './FlipCard'; import { useWindowDimensions } from './Helpers/Dimension'; import { useNotificationHandler } from './Helpers/Notification'; import { ModalCard } from './ModalCard'; @@ -34,6 +36,7 @@ import UniversalFilter, { UniversalFilterProps } from './UniversalFilter'; export { StyledChartDialog } from './ChartDialog'; export { StyledSearchBar } from './StyledSearchBar'; export { + ActionButton, CatalogFilter, ConnectionChip, CustomColumnVisibilityControl, @@ -63,6 +66,7 @@ export type { CustomColumn, CustomColumnVisibilityControlProps, CustomDialogProps, + FlipCardProps, IPopperListener, ResponsiveDataTableProps, SearchBarProps, diff --git a/src/icons/Calender/CalenderIcon.tsx b/src/icons/Calender/CalenderIcon.tsx index ca0cf326..5b04635c 100644 --- a/src/icons/Calender/CalenderIcon.tsx +++ b/src/icons/Calender/CalenderIcon.tsx @@ -10,6 +10,7 @@ const CalenderIcon: FC = ({ width, height, ...props }) => { version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19 24" + stroke="none" {...props} > diff --git a/src/icons/Done/DoneAllIcon.tsx b/src/icons/Done/DoneAllIcon.tsx new file mode 100644 index 00000000..30768d52 --- /dev/null +++ b/src/icons/Done/DoneAllIcon.tsx @@ -0,0 +1,22 @@ +import { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../../constants/constants'; +import { IconProps } from '../types'; + +export const DoneAllIcon = ({ + width = DEFAULT_WIDTH, + height = DEFAULT_HEIGHT, + ...props +}: IconProps): JSX.Element => { + return ( + + + + ); +}; + +export default DoneAllIcon; diff --git a/src/icons/Done/DoneIcon.tsx b/src/icons/Done/DoneIcon.tsx new file mode 100644 index 00000000..c125dd66 --- /dev/null +++ b/src/icons/Done/DoneIcon.tsx @@ -0,0 +1,22 @@ +import { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../../constants/constants'; +import { IconProps } from '../types'; + +export const DoneIcon = ({ + width = DEFAULT_WIDTH, + height = DEFAULT_HEIGHT, + ...props +}: IconProps): JSX.Element => { + return ( + + + + ); +}; + +export default DoneIcon; diff --git a/src/icons/Done/index.tsx b/src/icons/Done/index.tsx new file mode 100644 index 00000000..a6d037a0 --- /dev/null +++ b/src/icons/Done/index.tsx @@ -0,0 +1,2 @@ +export { default as DoneAllIcon } from './DoneAllIcon'; +export { default as DoneIcon } from './DoneIcon'; diff --git a/src/icons/DropDownIcon/DropDownIcon.tsx b/src/icons/DropDownIcon/DropDownIcon.tsx new file mode 100644 index 00000000..4ed159b9 --- /dev/null +++ b/src/icons/DropDownIcon/DropDownIcon.tsx @@ -0,0 +1,23 @@ +import { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../../constants/constants'; +import { IconProps } from '../types'; + +export const DropDownIcon = ({ + width = DEFAULT_WIDTH, + height = DEFAULT_HEIGHT, + ...props +}: IconProps): JSX.Element => { + return ( + + + + ); +}; + +export default DropDownIcon; diff --git a/src/icons/DropDownIcon/index.ts b/src/icons/DropDownIcon/index.ts new file mode 100644 index 00000000..f05b787d --- /dev/null +++ b/src/icons/DropDownIcon/index.ts @@ -0,0 +1 @@ +export { default as DropDownIcon } from './DropDownIcon'; diff --git a/src/icons/Edit/EditIcon.tsx b/src/icons/Edit/EditIcon.tsx new file mode 100644 index 00000000..d33f1fb8 --- /dev/null +++ b/src/icons/Edit/EditIcon.tsx @@ -0,0 +1,22 @@ +import { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../../constants/constants'; +import { IconProps } from '../types'; + +export const EditIcon = ({ + width = DEFAULT_WIDTH, + height = DEFAULT_HEIGHT, + ...props +}: IconProps): JSX.Element => { + return ( + + + + ); +}; + +export default EditIcon; diff --git a/src/icons/Edit/index.tsx b/src/icons/Edit/index.tsx new file mode 100644 index 00000000..e6465b57 --- /dev/null +++ b/src/icons/Edit/index.tsx @@ -0,0 +1 @@ +export { default as EditIcon } from './EditIcon'; diff --git a/src/icons/Feedback/FeedbackIcon.tsx b/src/icons/Feedback/FeedbackIcon.tsx index f62f91fb..0d17d3ad 100644 --- a/src/icons/Feedback/FeedbackIcon.tsx +++ b/src/icons/Feedback/FeedbackIcon.tsx @@ -38,6 +38,12 @@ const FeedbackIcon: FC = ({ stroke={props.secondaryFill || 'transparent'} stroke-width="2" /> + + + ); }; diff --git a/src/icons/Idea/IdeaIcon.tsx b/src/icons/Idea/IdeaIcon.tsx index e1c92dfc..a736cf1b 100644 --- a/src/icons/Idea/IdeaIcon.tsx +++ b/src/icons/Idea/IdeaIcon.tsx @@ -10,6 +10,7 @@ const IdeaIcon: FC = ({ width = DEFAULT_WIDTH, height = DEFAULT_HEIGH version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 24" + stroke="none" {...props} > diff --git a/src/icons/Publish/PublishIcon.tsx b/src/icons/Publish/PublishIcon.tsx new file mode 100644 index 00000000..f00b9d0f --- /dev/null +++ b/src/icons/Publish/PublishIcon.tsx @@ -0,0 +1,22 @@ +import { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../../constants/constants'; +import { IconProps } from '../types'; + +export const PublishIcon = ({ + width = DEFAULT_WIDTH, + height = DEFAULT_HEIGHT, + ...props +}: IconProps): JSX.Element => { + return ( + + + + ); +}; + +export default PublishIcon; diff --git a/src/icons/Publish/index.tsx b/src/icons/Publish/index.tsx new file mode 100644 index 00000000..fa81689e --- /dev/null +++ b/src/icons/Publish/index.tsx @@ -0,0 +1 @@ +export { default as PublishIcon } from './PublishIcon'; diff --git a/src/icons/index.ts b/src/icons/index.ts index a29e2ba1..f3a56743 100644 --- a/src/icons/index.ts +++ b/src/icons/index.ts @@ -22,6 +22,7 @@ export * from './Delete'; export * from './Deploy'; export * from './Designer'; export * from './Detail'; +export * from './DropDownIcon'; export * from './Error'; export * from './Favorite'; export * from './Filter'; @@ -36,6 +37,8 @@ export * from './Mesh'; // export { default as ModifiedApplicationFileIcon } from "./ModifiedApplicationFileIcon"; // export { default as OriginalApplicationFileIcon } from "./OriginalApplicationFileIcon"; export * from './Calender'; +export * from './Done'; +export * from './Edit'; export * from './Environment'; export * from './ExternalLink'; export * from './Feedback'; @@ -47,6 +50,7 @@ export * from './LeftArrow'; export * from './PanTool'; export * from './Pattern'; export * from './Pod'; +export * from './Publish'; export * from './Question'; export * from './Read'; export * from './Rectangle'; diff --git a/src/schemas/importDesign/schema.tsx b/src/schemas/importDesign/schema.tsx index 98d1b27f..1fd27733 100644 --- a/src/schemas/importDesign/schema.tsx +++ b/src/schemas/importDesign/schema.tsx @@ -15,7 +15,7 @@ const importDesignSchema = { default: 'Meshery Design', 'x-rjsf-grid-area': '6', description: - "Select the type of design you are uploading. The 'Design Type' determines the format, structure, and content of the file you are uploading. Choose the appropriate design type that matches the nature of your file. Checkout https://docs.meshery.io/guides/meshery-design to learn more about designs" + "Select the type of design you are uploading. The 'Design Type' determines the format, structure, and content of the file you are uploading. Choose the appropriate design type that matches the nature of your file. Checkout https://docs.meshery.io/guides/configuration-management/creating-a-meshery-design to learn more about designs" } }, allOf: [