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",