diff --git a/packages/api-v4/CHANGELOG.md b/packages/api-v4/CHANGELOG.md index 17811bae3c5..259e59b9194 100644 --- a/packages/api-v4/CHANGELOG.md +++ b/packages/api-v4/CHANGELOG.md @@ -1,3 +1,16 @@ +## [2023-07-11] - v0.96.0 + + +### Added: + +- Endpoints for VPC ([#9361](https://github.com/linode/manager/pull/9361)) +- Endpoints for the Akamai Global Load Balancer ([#9363](https://github.com/linode/manager/pull/9363)) + +### Changed: + +- Use 'canceled' instead of 'cancelled' for EntityTransferStatus ([#9335](https://github.com/linode/manager/pull/9335)) + + ## [2023-06-27] - v0.95.1 diff --git a/packages/api-v4/package.json b/packages/api-v4/package.json index 4920f6ba031..050bddfda81 100644 --- a/packages/api-v4/package.json +++ b/packages/api-v4/package.json @@ -1,6 +1,6 @@ { "name": "@linode/api-v4", - "version": "0.95.1", + "version": "0.96.0", "homepage": "https://github.com/linode/manager/tree/develop/packages/api-v4", "bugs": { "url": "https://github.com/linode/manager/issues" diff --git a/packages/manager/CHANGELOG.md b/packages/manager/CHANGELOG.md index ae479346b6f..eb770d074d6 100644 --- a/packages/manager/CHANGELOG.md +++ b/packages/manager/CHANGELOG.md @@ -4,6 +4,64 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [2023-07-11] - v1.97.0 + + +### Added: + +- Light/dark mode keyboard shortcut copy on "My Settings" page ([#9286](https://github.com/linode/manager/pull/9286)) +- Visual outline to some country flags ([#9288](https://github.com/linode/manager/pull/9288)) +- Helper text for the Add SSH Key Drawer form ([#9290](https://github.com/linode/manager/pull/9290)) +- Improved warning and error messaging for failed backup events ([#9364](https://github.com/linode/manager/pull/9364)) + +### Changed: + +- Update Metadata copy ([#9374](https://github.com/linode/manager/pull/9374)) + +### Fixed: + +- Notification menu crashing older Safari versions ([#9360](https://github.com/linode/manager/pull/9360)) +- Confirmation modal overflow on mobile ([#9289](https://github.com/linode/manager/pull/9289)) +- Layout issue with Create Access Key Drawer for Object Storage ([#9296](https://github.com/linode/manager/pull/9296)) +- LinodeSelectV2 label association ([#9298](https://github.com/linode/manager/pull/9298)) +- Missing icons in DBaaS engine selection field ([#9306](https://github.com/linode/manager/pull/9306)) +- Disable delete button for public IP addresses if it's the only IP address ([#9332](https://github.com/linode/manager/pull/9332)) +- Action Menu tooltip icon color deprecation ([#9352](https://github.com/linode/manager/pull/9352)) +- Multiple requests for logo when loading billing invoice PDFs ([#9355](https://github.com/linode/manager/pull/9355)) +- Updated wording from “Linode” to “Cloud Manager” ([#9358](https://github.com/linode/manager/pull/9358)) +- Volume empty state misspelling of NVMe ([#9366](https://github.com/linode/manager/pull/9366)) + +### Tech Stories: + +- React Query methods for VPC ([#9361](https://github.com/linode/manager/pull/9361)) +- Made yarn up:expose actually expose Cloud Manager on all interfaces ([#9297](https://github.com/linode/manager/pull/9297)) +- MUI v5 Migration - `Components > InlineMenuAction` ([#9268](https://github.com/linode/manager/pull/9268)) +- MUI v5 Migration - `Components > LandingLoading` ([#9282](https://github.com/linode/manager/pull/9282)) +- Upgrade LaunchDarkly client library ([#9285](https://github.com/linode/manager/pull/9285)) +- MUI v5 Migration - `Components > LongviewLineGraph` ([#9291](https://github.com/linode/manager/pull/9291)) +- MUI v5 Migration - `Components > SingleTextFieldForm` ([#9292](https://github.com/linode/manager/pull/9292)) +- MUI v5 Migration - `Components > SelectableTableRow` ([#9299](https://github.com/linode/manager/pull/9299)) +- MUI v5 Migration - `Components > Chip` ([#9310](https://github.com/linode/manager/pull/9310)) +- MUI v5 Migration - `Components > Toolbar` ([#9319](https://github.com/linode/manager/pull/9319)) +- MUI v5 Migration - `Components > Accordion` (part 2) ([#9320](https://github.com/linode/manager/pull/9320)) +- MUI v5 Migration - `Components > AppBar` ([#9321](https://github.com/linode/manager/pull/9321)) +- MUI v5 Migration - `Components > Box` ([#9322](https://github.com/linode/manager/pull/9322)) +- MUI v5 Migration - `Components > CopyTooltip` ([#9323](https://github.com/linode/manager/pull/9323)) +- MUI v5 Migration - `Components > Button` ([#9325](https://github.com/linode/manager/pull/9325)) +- MUI v5 Migration - `Components > Hidden` ([#9326](https://github.com/linode/manager/pull/9326)) +- MUI v5 Migration - `Components > SelectionCard` ([#9327](https://github.com/linode/manager/pull/9327)) +- MUI v5 Migration - `Components > Typography` ([#9328](https://github.com/linode/manager/pull/9328)) +- MUI v5 Migration - `Components > Checkbox` (part 2) ([#9338](https://github.com/linode/manager/pull/9338)) +- MUI v5 Migration - `Components > Chip` ([#9339](https://github.com/linode/manager/pull/9339)) +- MUI v5 Migration - `Components > Snackbar` ([#9359](https://github.com/linode/manager/pull/9359)) +- MUI v5 Migration - `Components > Tooltip` ([#9369](https://github.com/linode/manager/pull/9369)) +- MUI v5 Migration - `Components > MenuItem` ([#9295](https://github.com/linode/manager/pull/9295)) +- MUI v5 Migration - `Components > Divider` ([#9353](https://github.com/linode/manager/pull/9353)) +- Remove old changelog scripting ([#9340](https://github.com/linode/manager/pull/9340)) +- Remove `withLoadingAndError` and clean up 2FA components ([#9318](https://github.com/linode/manager/pull/9318)) +- Link component: remove default export and improved Storybook story ([#9313](https://github.com/linode/manager/pull/9313)) +- Refactor components to use TypeToConfirmDialog ([#9175](https://github.com/linode/manager/pull/9175)) + ## [2023-06-29] - v1.96.2 ### Fixed: diff --git a/packages/manager/cypress/e2e/core/account/change-username.spec.ts b/packages/manager/cypress/e2e/core/account/change-username.spec.ts index a5c59f58060..a2323877ade 100644 --- a/packages/manager/cypress/e2e/core/account/change-username.spec.ts +++ b/packages/manager/cypress/e2e/core/account/change-username.spec.ts @@ -34,6 +34,7 @@ describe('username', () => { .type(newUsername); cy.get('[data-qa-textfield-label="Username"]') + .parent() .parent() .parent() .within(() => { diff --git a/packages/manager/cypress/e2e/core/account/security-questions.spec.ts b/packages/manager/cypress/e2e/core/account/security-questions.spec.ts index d0159fe7224..c11b1121398 100644 --- a/packages/manager/cypress/e2e/core/account/security-questions.spec.ts +++ b/packages/manager/cypress/e2e/core/account/security-questions.spec.ts @@ -26,7 +26,7 @@ const getSecurityQuestionsSection = (): Cypress.Chainable => { * @returns Cypress chainable. */ const getSecurityQuestion = (questionNumber: number): Cypress.Chainable => { - return cy.contains('label', `Question ${questionNumber}`).parent(); + return cy.contains('label', `Question ${questionNumber}`).parent().parent(); }; /** @@ -39,7 +39,7 @@ const getSecurityQuestion = (questionNumber: number): Cypress.Chainable => { const getSecurityQuestionAnswer = ( questionNumber: number ): Cypress.Chainable => { - return cy.contains('label', `Answer ${questionNumber}`).parent(); + return cy.contains('label', `Answer ${questionNumber}`).parent().parent(); }; /** diff --git a/packages/manager/cypress/e2e/core/kubernetes/smoke-lke-create.spec.ts b/packages/manager/cypress/e2e/core/kubernetes/smoke-lke-create.spec.ts index 6d19c015e59..f276c371b25 100644 --- a/packages/manager/cypress/e2e/core/kubernetes/smoke-lke-create.spec.ts +++ b/packages/manager/cypress/e2e/core/kubernetes/smoke-lke-create.spec.ts @@ -60,11 +60,7 @@ describe('LKE Create Cluster', () => { mockCreateCluster(mockCluster).as('createCluster'); cy.visitWithLogin('/kubernetes/create'); cy.findByText('Add Node Pools').should('be.visible'); - cy.contains('Cluster Label') - .next() - .children() - .click() - .type(mockCluster.label); + cy.findByLabelText('Cluster Label').click().type(mockCluster.label); cy.findByLabelText('Region') .should('be.visible') .focus() diff --git a/packages/manager/package.json b/packages/manager/package.json index e153ffb220e..e7b91f41d6a 100644 --- a/packages/manager/package.json +++ b/packages/manager/package.json @@ -2,7 +2,7 @@ "name": "linode-manager", "author": "Linode", "description": "The Linode Manager website", - "version": "1.96.2", + "version": "1.97.0", "private": true, "bugs": { "url": "https://github.com/Linode/manager/issues" diff --git a/packages/manager/src/components/EnhancedSelect/Select.tsx b/packages/manager/src/components/EnhancedSelect/Select.tsx index 05fab2e913c..2352ba7890e 100644 --- a/packages/manager/src/components/EnhancedSelect/Select.tsx +++ b/packages/manager/src/components/EnhancedSelect/Select.tsx @@ -216,7 +216,7 @@ const Select = < filterOption={filterOption} isMulti={isMulti} classes={classes} - className={classNames(className, classes.root)} + className={classNames(classes.root, className)} classNamePrefix="react-select" inputId={ inputId diff --git a/packages/manager/src/components/TextField.tsx b/packages/manager/src/components/TextField.tsx index 41823f41c89..ee2ba81c1d2 100644 --- a/packages/manager/src/components/TextField.tsx +++ b/packages/manager/src/components/TextField.tsx @@ -1,19 +1,20 @@ import KeyboardArrowDown from '@mui/icons-material/KeyboardArrowDown'; +import Box from '@mui/material/Box'; +import { Theme } from '@mui/material/styles'; +import { + default as _TextField, + StandardTextFieldProps, +} from '@mui/material/TextField'; import { clamp } from 'ramda'; import * as React from 'react'; import { CircleProgress } from 'src/components/CircleProgress'; import FormHelperText from 'src/components/core/FormHelperText'; import InputAdornment from 'src/components/core/InputAdornment'; import InputLabel from 'src/components/core/InputLabel'; -import { makeStyles } from 'tss-react/mui'; -import { Theme } from '@mui/material/styles'; -import { - default as _TextField, - StandardTextFieldProps, -} from '@mui/material/TextField'; import { TooltipProps as _TooltipProps } from 'src/components/Tooltip'; import { TooltipIcon } from 'src/components/TooltipIcon'; import { convertToKebabCase } from 'src/utilities/convertToKebobCase'; +import { makeStyles } from 'tss-react/mui'; const useStyles = makeStyles()((theme: Theme) => ({ helpWrapper: { @@ -142,7 +143,11 @@ interface BaseProps { type Value = string | number | undefined | null; -interface ToolTipProps { +interface LabelToolTipProps { + labelTooltipText?: string | JSX.Element; +} + +interface InputToolTipProps { tooltipPosition?: _TooltipProps['placement']; tooltipText?: string | JSX.Element; tooltipInteractive?: boolean; @@ -155,7 +160,10 @@ interface TextFieldPropsOverrides extends StandardTextFieldProps { label: string; } -export type TextFieldProps = BaseProps & TextFieldPropsOverrides & ToolTipProps; +export type TextFieldProps = BaseProps & + TextFieldPropsOverrides & + LabelToolTipProps & + InputToolTipProps; export const TextField = (props: TextFieldProps) => { const { classes, cx } = useStyles(); @@ -178,6 +186,7 @@ export const TextField = (props: TextFieldProps) => { inputProps, InputProps, label, + labelTooltipText, loading, max, min, @@ -273,22 +282,33 @@ export const TextField = (props: TextFieldProps) => { [errorScrollClassName]: !!errorText, })} > - - {label} - {required ? ( - (required) - ) : optional ? ( - (optional) - ) : null} - + + + {label} + {required ? ( + (required) + ) : optional ? ( + (optional) + ) : null} + + {labelTooltipText && ( + + )} + {helperText && helperTextPosition === 'top' && ( { ) : null} {generalError && } - {notice && } + {notice && } {['create', 'restore'].includes(mode) && ( { return ( } - style={{ - marginTop: renderNotice && renderCheckbox ? 0 : 24, - }} // for now, these props can be taken as an indicator we're in the Rebuild flow. headingProps={{ variant: 'h2', }} + style={{ + marginTop: renderNotice && renderCheckbox ? 0 : 24, + }} // for now, these props can be taken as an indicator we're in the Rebuild flow. summaryProps={{ sx: { padding: '5px 24px 0px 24px', alignItems: fromBackupOrFromLinode ? 'flex-start' : 'center', }, }} - detailProps={{ sx: sxDetails }} sx={{ '&:before': { display: 'none', }, }} - expandIconClassNames={fromBackupOrFromLinode ? expandIconStyles : ''} > {renderNotice ? ( {renderNotice} ) : null} - - User data is a virtual machine’s cloud-init metadata relating to a - user’s local account, including username and user group(s).
- User data must be added before the Linode provisions.{' '} + + User data is a feature of the Metadata service that enables you to + perform system configuration tasks (such as adding users and installing + software) by providing custom instructions or scripts to cloud-init. Any + user data should be added at this step and cannot be modified after the + the Linode has been created.{' '} Learn more. {' '} @@ -98,19 +100,20 @@ export const UserDataAccordion = (props: Props) => {
) : null} + checkFormat({ userData: e.target.value, hasInputValueChanged: false }) + } onChange={(e) => { checkFormat({ userData: e.target.value, hasInputValueChanged: true }); onChange(e.target.value); }} + rows={1} value={userData} - disabled={Boolean(disabled)} - onBlur={(e) => - checkFormat({ userData: e.target.value, hasInputValueChanged: false }) - } data-qa-user-data-input /> {renderCheckbox ?? null} diff --git a/packages/manager/src/features/Linodes/LinodesCreate/UserDataAccordion/UserDataAccordionHeading.tsx b/packages/manager/src/features/Linodes/LinodesCreate/UserDataAccordion/UserDataAccordionHeading.tsx index 4938c9b916a..0dba0daa776 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/UserDataAccordion/UserDataAccordionHeading.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/UserDataAccordion/UserDataAccordionHeading.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { BetaChip } from 'src/components/BetaChip/BetaChip'; +import { Box } from 'src/components/Box'; import { Link } from 'src/components/Link'; import { Notice } from 'src/components/Notice/Notice'; import { TooltipIcon } from 'src/components/TooltipIcon'; -import { Box } from 'src/components/Box'; import { CreateTypes } from 'src/store/linodeCreate/linodeCreate.actions'; interface Props { @@ -31,8 +31,8 @@ export const UserDataAccordionHeading = ({ createType }: Props) => { sxTooltipIcon={{ padding: '0 8px', alignItems: 'baseline' }} text={ <> - User data is a virtual machine’s cloud-init metadata - relating to a user’s local account.{' '} + User data allows you to provide additional custom data to + cloud-init to further configure your system.{' '} Learn more. diff --git a/packages/manager/src/features/Support/SupportTickets/SupportTicketDialog.tsx b/packages/manager/src/features/Support/SupportTickets/SupportTicketDialog.tsx index 7bf06e5abf1..21a4c92e949 100644 --- a/packages/manager/src/features/Support/SupportTickets/SupportTicketDialog.tsx +++ b/packages/manager/src/features/Support/SupportTickets/SupportTicketDialog.tsx @@ -3,14 +3,16 @@ import { uploadAttachment, } from '@linode/api-v4/lib/support'; import { APIError } from '@linode/api-v4/lib/types'; -import { Theme } from '@mui/material/styles'; -import { makeStyles } from '@mui/styles'; import * as Bluebird from 'bluebird'; import { update } from 'ramda'; import * as React from 'react'; import { Accordion } from 'src/components/Accordion'; import { StyledActionPanel } from 'src/components/ActionsPanel/ActionsPanel'; import { Button } from 'src/components/Button/Button'; +import FormHelperText from 'src/components/core/FormHelperText'; +import { makeStyles } from '@mui/styles'; +import { Theme } from '@mui/material/styles'; +import { Typography } from 'src/components/Typography'; import { Dialog } from 'src/components/Dialog/Dialog'; import Select, { Item } from 'src/components/EnhancedSelect/Select'; import { ErrorBoundary } from 'src/components/ErrorBoundary'; @@ -18,8 +20,6 @@ import { ErrorState } from 'src/components/ErrorState/ErrorState'; import { Notice } from 'src/components/Notice/Notice'; import { EntityForTicketDetails } from 'src/components/SupportLink/SupportLink'; import { TextField } from 'src/components/TextField'; -import { Typography } from 'src/components/Typography'; -import FormHelperText from 'src/components/core/FormHelperText'; import { useAccount } from 'src/queries/account'; import { useAllDatabasesQuery } from 'src/queries/databases'; import { useAllDomainsQuery } from 'src/queries/domains'; diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md index ff310bb7f49..1d34577ca94 100644 --- a/packages/validation/CHANGELOG.md +++ b/packages/validation/CHANGELOG.md @@ -1,3 +1,14 @@ +## [2023-07-11] - v0.26.0 + + +### Added: + +- Validation for VPC creation and updates ([#9361](https://github.com/linode/manager/pull/9361)) + +### Fixed: + +- Firewall custom port validation ([#9336](https://github.com/linode/manager/pull/9336)) + ## [2023-06-29] - v0.25.0 ### Fixed: diff --git a/packages/validation/package.json b/packages/validation/package.json index a27b8acb573..c0564b2c054 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "@linode/validation", - "version": "0.25.0", + "version": "0.26.0", "description": "Yup validation schemas for use with the Linode APIv4", "type": "module", "main": "lib/index.cjs",