Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/develop' into edit-images-tags
Browse files Browse the repository at this point in the history
  • Loading branch information
hkhalil-akamai committed May 23, 2024
2 parents 8f587e8 + f99456f commit d232fa3
Show file tree
Hide file tree
Showing 219 changed files with 6,815 additions and 1,586 deletions.
98 changes: 98 additions & 0 deletions docs/development-guide/05-fetching-data.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,104 @@ console.log(errorMap);
}
```

#### Scrolling to errors

For deep forms, we provide a utility that will scroll to the first error encountered within a defined container. We do this to improve error visibility, because the user can be unaware of an error that isn't in the viewport.
An error can be a notice (API error) or a Formik field error. In order to implement this often needed functionality, we must declare a form or form container via ref, then pass it to the `scrollErrorIntoViewV2` util (works both for class & functional components).

Note: the legacy `scrollErrorIntoView` is deprecated in favor of `scrollErrorIntoViewV2`.

Since Cloud Manager uses different ways of handling forms and validation, the `scrollErrorIntoViewV2` util should be implemented using the following patterns to ensure consistency.

##### Formik
```Typescript
import * as React from 'react';

import { scrollErrorIntoViewV2 } from 'src/utilities/scrollErrorIntoViewV2';

export const MyComponent = () => {
const formContainerRef = React.useRef<HTMLFormElement>(null);

const {
values,
// other handlers
} = useFormik({
initialValues: {},
onSubmit: mySubmitFormHandler,
validate: () => {
scrollErrorIntoViewV2(formRef);
},
validationSchema: myValidationSchema,
});

return (
<form onSubmit={handleSubmit} ref={formContainerRef}>
<Error />
{/* form fields */}
<button type="submit">Submit</button>
</form>
);
};
```

##### React Hook Forms
```Typescript
import * as React from 'react';

import { scrollErrorIntoViewV2 } from 'src/utilities/scrollErrorIntoViewV2';

export const MyComponent = () => {
const formContainerRef = React.useRef<HTMLFormElement>(null);

const methods = useForm<LinodeCreateFormValues>({
defaultValues,
mode: 'onBlur',
resolver: myResolvers,
// other methods
});

return (
<FormProvider {...methods}>
<form
onSubmit={methods.handleSubmit(onSubmit, () => scrollErrorIntoViewV2(formRef))}
ref={formContainerRef}
>
<Error />
{/* form fields */}
<button type="submit">Submit</button>
</form>
</>
);
};
```

##### Uncontrolled forms
```Typescript
import * as React from 'react';

import { scrollErrorIntoViewV2 } from 'src/utilities/scrollErrorIntoViewV2';

export const MyComponent = () => {
const formContainerRef = React.useRef<HTMLFormElement>(null);

const handleSubmit = () => {
try {
// form submission logic
} catch {
scrollErrorIntoViewV2(formContainerRef);
}
};

return (
<form onSubmit={handleSubmit} ref={formContainerRef}>
<Error />
{/* form fields */}
<button type="submit">Submit</button>
</form>
);
};
```

### Toast / Event Message Punctuation
**Best practice:**
- If a message is a sentence or a sentence fragment with a subject and a verb, add punctuation. Otherwise, leave punctuation off.
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"coverage": "yarn workspace linode-manager coverage",
"coverage:summary": "yarn workspace linode-manager coverage:summary",
"junit:summary": "ts-node scripts/junit-summary/index.ts",
"generate-tod": "ts-node scripts/tod-payload/index.ts",
"docs": "bunx [email protected] dev docs"
},
"resolutions": {
Expand Down
5 changes: 5 additions & 0 deletions packages/api-v4/.changeset/pr-10462-changed-1715896838291.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/api-v4": Changed
---

Add Disk Encryption to AccountCapability type and region Capabilities type ([#10462](https://github.com/linode/manager/pull/10462))
5 changes: 5 additions & 0 deletions packages/api-v4/.changeset/pr-10468-added-1716219170108.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/api-v4": Added
---

New endpoint for `object-storage/types` ([#10468](https://github.com/linode/manager/pull/10468))
1 change: 1 addition & 0 deletions packages/api-v4/src/account/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export type AccountCapability =
| 'Akamai Cloud Load Balancer'
| 'Block Storage'
| 'Cloud Firewall'
| 'Disk Encryption'
| 'Kubernetes'
| 'Linodes'
| 'LKE HA Control Planes'
Expand Down
4 changes: 2 additions & 2 deletions packages/api-v4/src/images/images.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import Request, {
setURL,
setXFilter,
} from '../request';
import { Filter, Params, ResourcePage as Page } from '../types';
import {
import type { Filter, Params, ResourcePage as Page } from '../types';
import type {
CreateImagePayload,
Image,
ImageUploadPayload,
Expand Down
2 changes: 1 addition & 1 deletion packages/api-v4/src/kubernetes/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { EncryptionStatus } from 'src/linodes';
import type { EncryptionStatus } from '../linodes';

export interface KubernetesCluster {
created: string;
Expand Down
2 changes: 2 additions & 0 deletions packages/api-v4/src/object-storage/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ export * from './objects';
export * from './objectStorageKeys';

export * from './types';

export * from './prices';
16 changes: 16 additions & 0 deletions packages/api-v4/src/object-storage/prices.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Params, PriceType, ResourcePage } from 'src/types';
import { API_ROOT } from '../constants';
import Request, { setMethod, setParams, setURL } from '../request';

/**
* getObjectStorageTypes
*
* Return a paginated list of available Object Storage types; used for pricing.
* This endpoint does not require authentication.
*/
export const getObjectStorageTypes = (params?: Params) =>
Request<ResourcePage<PriceType>>(
setURL(`${API_ROOT}/object-storage/types`),
setMethod('GET'),
setParams(params)
);
1 change: 1 addition & 0 deletions packages/api-v4/src/regions/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export type Capabilities =
| 'Block Storage'
| 'Block Storage Migrations'
| 'Cloud Firewall'
| 'Disk Encryption'
| 'GPU Linodes'
| 'Kubernetes'
| 'Linodes'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tech Stories
---

Add script to generate internal test results payload ([#10422](https://github.com/linode/manager/pull/10422))
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Upcoming Features
---

Linode Create Refactor - Scroll Errors Into View ([#10454](https://github.com/linode/manager/pull/10454))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10462-tests-1716303824484.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Cypress test coverage for Disk Encryption in Linode Create flow ([#10462](https://github.com/linode/manager/pull/10462))
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Upcoming Features
---

Add Disk Encryption section to Linode Create flow ([#10462](https://github.com/linode/manager/pull/10462))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10468-changed-1716219242980.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Changed
---

Use dynamic pricing with `object-storage/types` endpoint ([#10468](https://github.com/linode/manager/pull/10468))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10469-tests-1715717780880.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Linode Create v2 end-to-end tests ([#10469](https://github.com/linode/manager/pull/10469))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10469-tests-1715717804841.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Linode Create v2 integration tests for VLAN flows ([#10469](https://github.com/linode/manager/pull/10469))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10469-tests-1715717849362.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Linode Create v2 integration tests for VPC flows ([#10469](https://github.com/linode/manager/pull/10469))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10469-tests-1715717865422.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Linode Create v2 integration tests for SSH key flows ([#10469](https://github.com/linode/manager/pull/10469))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10469-tests-1715717889337.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Linode Create v2 integration tests for cloud-init flows ([#10469](https://github.com/linode/manager/pull/10469))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10469-tests-1716471500474.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Cypress test coverage for Linode Create v2 flow ([#10469](https://github.com/linode/manager/pull/10469))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10473-tests-1715795923381.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add Integration Test for Linode Create with Placement Group ([#10473](https://github.com/linode/manager/pull/10473))
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Upcoming Features
---

Add Encrypted/Not Encrypted status to LKE Node Pool table ([#10480](https://github.com/linode/manager/pull/10480))
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tech Stories
---

Remove aria-label from TableRow ([#10485](https://github.com/linode/manager/pull/10485))
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Upcoming Features
---

Reset errors in PlacementGroupDeleteModal ([#10486](https://github.com/linode/manager/pull/10486))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10489-removed-1716225501082.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Removed
---

`parentChildAccountAccess` feature flag ([#10489](https://github.com/linode/manager/pull/10489))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10490-fixed-1716227619276.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Fixed
---

Duplicate speedtest helper text in Create Cluster form ([#10490](https://github.com/linode/manager/pull/10490))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10493-tests-1716312638686.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add cypress assertion and test for placement group deletion error handling ([#10493](https://github.com/linode/manager/pull/10493))
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-10495-fixed-1716307990793.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Fixed
---

`RegionSelect` unexpected keyboard behavior ([#10495](https://github.com/linode/manager/pull/10495))
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Changed
---

Make all tooltips Interactive and prevent `disableInteractive` for future usage ([#10501](https://github.com/linode/manager/pull/10501))
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,6 @@ import {
} from 'support/util/random';
import type { CancelAccount } from '@linode/api-v4';
import { mockWebpageUrl } from 'support/intercepts/general';
import {
mockAppendFeatureFlags,
mockGetFeatureFlagClientstream,
} from 'support/intercepts/feature-flags';
import { makeFeatureFlagData } from 'support/util/feature-flags';

describe('Account cancellation', () => {
/*
Expand Down Expand Up @@ -325,12 +320,6 @@ describe('Parent/Child account cancellation', () => {

const cancellationComments = randomPhrase();

// TODO: Parent/Child - M3-7559 clean up when feature is live in prod and feature flag is removed.
mockAppendFeatureFlags({
parentChildAccountAccess: makeFeatureFlagData(true),
}).as('getFeatureFlags');
mockGetFeatureFlagClientstream().as('getClientStream');

mockGetAccount(mockAccount).as('getAccount');
mockGetProfile(mockProfile).as('getProfile');
mockCancelAccountError(cancellationPaymentErrorMessage, 409).as(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,7 @@ import { profileFactory } from 'src/factories';
import { accountLoginFactory } from 'src/factories/accountLogin';
import { formatDate } from 'src/utilities/formatDate';
import { mockGetAccountLogins } from 'support/intercepts/account';
import {
mockAppendFeatureFlags,
mockGetFeatureFlagClientstream,
} from 'support/intercepts/feature-flags';
import { mockGetProfile } from 'support/intercepts/profile';
import { makeFeatureFlagData } from 'support/util/feature-flags';
import { PARENT_USER } from 'src/features/Account/constants';

describe('Account login history', () => {
Expand Down Expand Up @@ -42,15 +37,9 @@ describe('Account login history', () => {
'getAccountLogins'
);

// TODO: Parent/Child - M3-7559 clean up when feature is live in prod and feature flag is removed.
mockAppendFeatureFlags({
parentChildAccountAccess: makeFeatureFlagData(false),
}).as('getFeatureFlags');
mockGetFeatureFlagClientstream().as('getClientStream');

// Navigate to Account Login History page.
cy.visitWithLogin('/account/login-history');
cy.wait(['@getClientStream', '@getFeatureFlags', '@getProfile']);
cy.wait(['@getProfile']);

// Confirm helper text above table is visible.
cy.findByText(
Expand Down Expand Up @@ -114,15 +103,9 @@ describe('Account login history', () => {

mockGetProfile(mockProfile).as('getProfile');

// TODO: Parent/Child - M3-7559 clean up when feature is live in prod and feature flag is removed.
mockAppendFeatureFlags({
parentChildAccountAccess: makeFeatureFlagData(true),
}).as('getFeatureFlags');
mockGetFeatureFlagClientstream().as('getClientStream');

// Navigate to Account Login History page.
cy.visitWithLogin('/account/login-history');
cy.wait(['@getClientStream', '@getFeatureFlags', '@getProfile']);
cy.wait(['@getProfile']);

// Confirm helper text above table and table are not visible.
cy.findByText(
Expand All @@ -149,15 +132,9 @@ describe('Account login history', () => {

mockGetProfile(mockProfile).as('getProfile');

// TODO: Parent/Child - M3-7559 clean up when feature is live in prod and feature flag is removed.
mockAppendFeatureFlags({
parentChildAccountAccess: makeFeatureFlagData(true),
}).as('getFeatureFlags');
mockGetFeatureFlagClientstream().as('getClientStream');

// Navigate to Account Login History page.
cy.visitWithLogin('/account/login-history');
cy.wait(['@getClientStream', '@getFeatureFlags', '@getProfile']);
cy.wait(['@getProfile']);

// Confirm helper text above table and table are not visible.
cy.findByText(
Expand Down
Loading

0 comments on commit d232fa3

Please sign in to comment.