diff --git a/src/components/inline_edit/__snapshots__/inline_edit_title.test.tsx.snap b/src/components/inline_edit/__snapshots__/inline_edit_title.test.tsx.snap
index 8c14a849bec..8e7c0da672e 100644
--- a/src/components/inline_edit/__snapshots__/inline_edit_title.test.tsx.snap
+++ b/src/components/inline_edit/__snapshots__/inline_edit_title.test.tsx.snap
@@ -1,5 +1,43 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`EuiInlineEditTitle displayDefaultValueAsPlaceholder 1`] = `
+
+
+
+
+
+
+ Hello World!
+
+
+
+
+
+ Click to edit this text inline.
+
+
+`;
+
exports[`EuiInlineEditTitle isReadOnly 1`] = `
@@ -79,7 +117,7 @@ exports[`EuiInlineEditTitle title sizes renders size l 1`] = `
>
@@ -117,7 +155,7 @@ exports[`EuiInlineEditTitle title sizes renders size m 1`] = `
>
@@ -155,7 +193,7 @@ exports[`EuiInlineEditTitle title sizes renders size s 1`] = `
>
@@ -193,7 +231,7 @@ exports[`EuiInlineEditTitle title sizes renders size xs 1`] = `
>
@@ -231,7 +269,7 @@ exports[`EuiInlineEditTitle title sizes renders size xxs 1`] = `
>
@@ -269,7 +307,7 @@ exports[`EuiInlineEditTitle title sizes renders size xxxs 1`] = `
>
diff --git a/src/components/inline_edit/inline_edit_form.styles.ts b/src/components/inline_edit/inline_edit_form.styles.ts
index 62fbc70c24e..6bdffaad9cf 100644
--- a/src/components/inline_edit/inline_edit_form.styles.ts
+++ b/src/components/inline_edit/inline_edit_form.styles.ts
@@ -22,5 +22,13 @@ export const euiInlineEditReadModeStyles = ({ euiTheme }: UseEuiTheme) => {
user-select: text;
}
`,
+
+ hasPlaceholder: css`
+ &.euiButtonEmpty .euiText,
+ &.euiButtonEmpty .euiTitle {
+ font-style: italic;
+ color: ${euiTheme.colors.subduedText};
+ }
+ `,
};
};
diff --git a/src/components/inline_edit/inline_edit_form.test.tsx b/src/components/inline_edit/inline_edit_form.test.tsx
index 8d51e56c50d..4c4891ee581 100644
--- a/src/components/inline_edit/inline_edit_form.test.tsx
+++ b/src/components/inline_edit/inline_edit_form.test.tsx
@@ -202,6 +202,24 @@ describe('EuiInlineEditForm', () => {
getByTestSubject('euiInlineEditModeInput').hasAttribute('aria-invalid')
).toBeTruthy();
});
+
+ test('displayDefaultValueAsPlaceholder', () => {
+ const { container, getByTestSubject } = render(
+
+ );
+
+ expect(container.firstChild).toMatchSnapshot();
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('placeholder')
+ ).toBeTruthy();
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('value')
+ ).toBeFalsy();
+ });
});
describe('toggling between read mode and edit mode', () => {
@@ -448,6 +466,77 @@ describe('EuiInlineEditForm', () => {
expect(getByTestSubject('euiInlineReadModeButton')).toBeTruthy();
expect(getByText('New message!')).toBeTruthy();
});
+
+ it('the placeholder remains on the editMode from control if the text edit is cancelled', () => {
+ const { getByTestSubject } = render(
+
+ );
+
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('placeholder')
+ ).toBeTruthy();
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('value')
+ ).toBeFalsy();
+
+ fireEvent.click(getByTestSubject('euiInlineEditModeCancelButton'));
+
+ waitFor(() => {
+ expect(document.activeElement).toEqual(
+ getByTestSubject('euiInlineReadModeButton')
+ );
+ });
+
+ fireEvent.click(getByTestSubject('euiInlineReadModeButton'));
+
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('placeholder')
+ ).toBeTruthy();
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('value')
+ ).toBeFalsy();
+ });
+
+ it('removes the placeholder from the editMode form control after the first successful save', () => {
+ const { getByTestSubject } = render(
+
+ );
+
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('placeholder')
+ ).toBeTruthy();
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('value')
+ ).toBeFalsy();
+
+ fireEvent.change(getByTestSubject('euiInlineEditModeInput'), {
+ target: { value: 'New message!' },
+ });
+ fireEvent.click(getByTestSubject('euiInlineEditModeSaveButton'));
+
+ waitFor(() => {
+ expect(document.activeElement).toEqual(
+ getByTestSubject('euiInlineReadModeButton')
+ );
+ });
+
+ fireEvent.click(getByTestSubject('euiInlineReadModeButton'));
+
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('placeholder')
+ ).toBeFalsy();
+ expect(
+ getByTestSubject('euiInlineEditModeInput').getAttribute('value')
+ ).toBeTruthy();
+ });
});
});
});
diff --git a/src/components/inline_edit/inline_edit_form.tsx b/src/components/inline_edit/inline_edit_form.tsx
index 3793f5e5213..623cd1eec4e 100644
--- a/src/components/inline_edit/inline_edit_form.tsx
+++ b/src/components/inline_edit/inline_edit_form.tsx
@@ -40,6 +40,7 @@ import { euiInlineEditReadModeStyles } from './inline_edit_form.styles';
export type EuiInlineEditCommonProps = HTMLAttributes &
CommonProps & {
defaultValue: string;
+ placeholder?: string;
/**
* Callback that fires when a user clicks the save button.
* Passes the current edited text value as an argument.
@@ -121,6 +122,7 @@ export const EuiInlineEditForm: FunctionComponent = ({
children,
sizes,
defaultValue,
+ placeholder,
inputAriaLabel,
startWithEditOpen,
readModeProps,
@@ -134,12 +136,6 @@ export const EuiInlineEditForm: FunctionComponent = ({
const euiTheme = useEuiTheme();
- const readModeStyles = euiInlineEditReadModeStyles(euiTheme);
- const readModeCssStyles = [
- readModeStyles.euiInlineEditReadMode,
- isReadOnly && readModeStyles.isReadOnly,
- ];
-
const { controlHeight, controlCompressedHeight } = euiFormVariables(euiTheme);
const loadingSkeletonSize = sizes.compressed
? controlCompressedHeight
@@ -168,9 +164,21 @@ export const EuiInlineEditForm: FunctionComponent = ({
editModeProps?.inputProps?.inputRef,
]);
+ const [showPlaceholder, setShowPlaceholder] = useState(
+ placeholder && !defaultValue
+ );
const [isEditing, setIsEditing] = useState(false || startWithEditOpen);
const [editModeValue, setEditModeValue] = useState(defaultValue);
- const [readModeValue, setReadModeValue] = useState(defaultValue);
+ const [readModeValue, setReadModeValue] = useState(
+ showPlaceholder ? placeholder : defaultValue
+ );
+
+ const readModeStyles = euiInlineEditReadModeStyles(euiTheme);
+ const readModeCssStyles = [
+ readModeStyles.euiInlineEditReadMode,
+ isReadOnly && readModeStyles.isReadOnly,
+ showPlaceholder && readModeStyles.hasPlaceholder,
+ ];
const activateEditMode = () => {
setIsEditing(true);
@@ -179,7 +187,10 @@ export const EuiInlineEditForm: FunctionComponent = ({
};
const cancelInlineEdit = () => {
- setEditModeValue(readModeValue);
+ // If placeholder is active and a save is cancelled, return edit mode value to an empty string
+ readModeValue && !showPlaceholder
+ ? setEditModeValue(readModeValue)
+ : setEditModeValue('');
setIsEditing(false);
requestAnimationFrame(() => readModeFocusRef.current?.focus());
};
@@ -193,6 +204,8 @@ export const EuiInlineEditForm: FunctionComponent = ({
if (awaitedReturn === false) return;
}
+ // If placeholder is active and a value is saved, stop displaying placeholder styles
+ showPlaceholder && setShowPlaceholder(false);
setReadModeValue(editModeValue);
setIsEditing(false);
requestAnimationFrame(() => readModeFocusRef.current?.focus());
@@ -234,6 +247,7 @@ export const EuiInlineEditForm: FunctionComponent = ({
isInvalid={isInvalid}
isLoading={isLoading}
data-test-subj="euiInlineEditModeInput"
+ placeholder={placeholder}
{...editModeProps?.inputProps}
inputRef={setEditModeRefs}
onChange={(e) => {
diff --git a/src/components/inline_edit/inline_edit_text.test.tsx b/src/components/inline_edit/inline_edit_text.test.tsx
index 4c6fc2ceefd..f481ee997e9 100644
--- a/src/components/inline_edit/inline_edit_text.test.tsx
+++ b/src/components/inline_edit/inline_edit_text.test.tsx
@@ -41,6 +41,17 @@ describe('EuiInlineEditText', () => {
);
});
+ test('displayDefaultValueAsPlaceholder', () => {
+ const { container } = render(
+
+ );
+
+ expect(container.firstChild).toMatchSnapshot();
+ });
+
describe('text sizes', () => {
// Remove 'relative' from text sizes available for EuiInlineEditText
const availableTextSizes = TEXT_SIZES.filter((size) => size !== 'relative');
diff --git a/src/components/inline_edit/inline_edit_title.test.tsx b/src/components/inline_edit/inline_edit_title.test.tsx
index 6de83071e6c..9b9026281c2 100644
--- a/src/components/inline_edit/inline_edit_title.test.tsx
+++ b/src/components/inline_edit/inline_edit_title.test.tsx
@@ -56,6 +56,17 @@ describe('EuiInlineEditTitle', () => {
);
});
+ test('displayDefaultValueAsPlaceholder', () => {
+ const { container } = render(
+
+ );
+
+ expect(container.firstChild).toMatchSnapshot();
+ });
+
describe('title sizes', () => {
TITLE_SIZES.forEach((size) => {
it(`renders size ${size}`, () => {