Skip to content
Merged
Show file tree
Hide file tree
Changes from 46 commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
3364eba
Added lazy loading of async libs to storybook.
Kuznietsov Jun 25, 2021
0bf9246
Refactored lazy loading of import for a storybook.
Kuznietsov Jun 25, 2021
03e3f4e
more refactoring stuff.
Kuznietsov Jun 25, 2021
8d76d1e
more refactoring.
Kuznietsov Jun 25, 2021
2ae8363
small refactor of waitFor.
Kuznietsov Jun 25, 2021
f58044a
Added support of async functions.
Kuznietsov Jun 25, 2021
d774c72
Types fix.
Kuznietsov Jun 25, 2021
5c82d8b
fixed docs.
Kuznietsov Jun 25, 2021
0cb68a5
Fixed some mistakes.
Kuznietsov Jun 29, 2021
cd546ba
Fixed type of tests.
Kuznietsov Jun 29, 2021
f1b6cc8
added type for async function to write dicts easier.
Kuznietsov Jun 29, 2021
cd2d713
Updated stories and view with async image.
Kuznietsov Jun 29, 2021
949dce3
Changed all static to async imports.
Kuznietsov Jun 29, 2021
9cbab0c
Removed static import of `elasticLogo`. Fixed type error.
Kuznietsov Jun 29, 2021
77b85dc
Changed way of returning async functions in `functionWrapper`.
Kuznietsov Jun 29, 2021
d53a2f7
fixed renderer test.
Kuznietsov Jun 29, 2021
24f74a8
fixed errors.
Kuznietsov Jun 29, 2021
d53e0f2
added outline and fixed types.
Kuznietsov Jun 29, 2021
b897ba9
added outline everywhere.
Kuznietsov Jun 29, 2021
9f27c37
waitFor fixed.
Kuznietsov Jun 29, 2021
0e52c75
removed useless exports.
Kuznietsov Jun 29, 2021
d32afa0
Fixed type error.
Kuznietsov Jun 29, 2021
dc8cb3b
fixed types of dropdown_control.test.ts
Kuznietsov Jun 29, 2021
31635e0
fixed `csv.test.ts` types.
Kuznietsov Jun 29, 2021
f0834d0
Tests fixed.
Kuznietsov Jun 30, 2021
c405219
Fixed storybooks.
Kuznietsov Jun 30, 2021
2188c26
Fixed failed tests.
Kuznietsov Jun 30, 2021
58bc832
[Canvas] Expression reveal image. (#101987)
Kuznietsov Jul 1, 2021
e29fcec
Fixed mistake of merge.
Kuznietsov Jul 1, 2021
8349176
Storybook fixed.
Kuznietsov Jul 2, 2021
8041a7f
Merge branch 'master' into expression_reveal_image_async_libs
Kuznietsov Jul 2, 2021
5432348
Fixed a mistake that occurred while resolving merge conflicts.
Kuznietsov Jul 2, 2021
9a58448
removed registerFunctionAsync and changed functionWrapper from async …
Kuznietsov Jul 5, 2021
b6ccd44
Fixed async functionWrapper usage and fixed `image.test.js` to run.
Kuznietsov Jul 5, 2021
06628e5
Added default value for image.
Kuznietsov Jul 5, 2021
c2f3fd9
More fixes of async.
Kuznietsov Jul 5, 2021
0aa2255
Fixed a lot of legacy.
Kuznietsov Jul 5, 2021
9acf1be
Merge branch 'master' into expression_reveal_image_async_libs
kibanamachine Jul 5, 2021
a30caa4
Type fixes.
Kuznietsov Jul 5, 2021
18b7600
Merge branch 'expression_reveal_image_async_libs' of github.com:Kunze…
Kuznietsov Jul 5, 2021
ecf112d
Fix of fallen tests.
Kuznietsov Jul 5, 2021
8b7e5b1
First part of suggestions completed.
Kuznietsov Jul 7, 2021
75305ac
Made image required.
Kuznietsov Jul 7, 2021
e22ed32
Removed useless `async`
Kuznietsov Jul 7, 2021
0afbb49
Jest test fixed.
Kuznietsov Jul 7, 2021
3ded5d9
Merge branch 'master' into expression_reveal_image_async_libs
kibanamachine Jul 7, 2021
5cc2539
Merge branch 'master' into expression_reveal_image_async_libs
kibanamachine Jul 9, 2021
5978487
Fixed code, based on nits.
Kuznietsov Jul 9, 2021
0262039
Merge branch 'master' into expression_reveal_image_async_libs
Kuznietsov Jul 9, 2021
9f6eac3
Merge branch 'master' into expression_reveal_image_async_libs
kibanamachine Jul 12, 2021
03577b6
Merge branch 'master' into expression_reveal_image_async_libs
Kuznietsov Jul 13, 2021
6504547
Moved to `emotion`.
Kuznietsov Jul 13, 2021
ae6af74
Fixed prettier error.
Kuznietsov Jul 13, 2021
f0044d8
Merge branch 'master' into expression_reveal_image_async_libs
kibanamachine Jul 15, 2021
fa6f2bf
Merge branch 'master' into expression_reveal_image_async_libs
Kuznietsov Jul 15, 2021
7ae5493
Merge branch 'master' into expression_reveal_image_async_libs
kibanamachine Jul 19, 2021
ca3f29a
replaced jsx pragma with react.
Kuznietsov Jul 19, 2021
3d4badd
Removed unused jsx.
Kuznietsov Jul 19, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/plugins/expression_reveal_image/common/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
*/
export const PLUGIN_ID = 'expressionRevealImage';
export const PLUGIN_NAME = 'expressionRevealImage';

export const BASE64 = '`base64`';
export const URL = 'URL';
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,26 @@

import {
functionWrapper,
elasticOutline,
elasticLogo,
getElasticOutline,
getElasticLogo,
} from '../../../presentation_util/common/lib';
import { getFunctionErrors } from '../i18n';
import { revealImageFunction } from './reveal_image_function';
import { revealImageFunction, errors } from './reveal_image_function';
import { Origin } from '../types';
import { ExecutionContext } from 'src/plugins/expressions';

const errors = getFunctionErrors().revealImage;

describe('revealImageFunction', () => {
const fn = functionWrapper(revealImageFunction);

it('returns a render as revealImage', () => {
const result = fn(
let elasticLogo = '';
let elasticOutline = '';

beforeEach(async () => {
elasticLogo = await (await getElasticLogo()).elasticLogo;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why the double await here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

elasticOutline = await (await getElasticOutline()).elasticOutline;
});

it('returns a render as revealImage', async () => {
const result = await fn(
0.5,
{
image: null,
Expand All @@ -36,130 +41,147 @@ describe('revealImageFunction', () => {
});

describe('context', () => {
it('throws when context is not a number between 0 and 1', () => {
expect(() => {
fn(
10,
{
image: elasticLogo,
emptyImage: elasticOutline,
origin: Origin.TOP,
},
{} as ExecutionContext
);
}).toThrow(new RegExp(errors.invalidPercent(10).message));
it('throws when context is not a number between 0 and 1', async () => {
expect.assertions(2);
await fn(
10,
{
image: elasticLogo,
emptyImage: elasticOutline,
origin: Origin.TOP,
},
{} as ExecutionContext
).catch((e: any) => {
expect(e.message).toMatch(new RegExp(errors.invalidPercent(10).message));
});

expect(() => {
fn(
-0.1,
{
image: elasticLogo,
emptyImage: elasticOutline,
origin: Origin.TOP,
},
{} as ExecutionContext
);
}).toThrow(new RegExp(errors.invalidPercent(-0.1).message));
await fn(
-0.1,
{
image: elasticLogo,
emptyImage: elasticOutline,
origin: Origin.TOP,
},
{} as ExecutionContext
).catch((e: any) => {
expect(e.message).toMatch(new RegExp(errors.invalidPercent(-0.1).message));
});
});
});

describe('args', () => {
describe('image', () => {
it('sets the image', () => {
const result = fn(
0.89,
{
emptyImage: null,
origin: Origin.TOP,
image: elasticLogo,
},
{} as ExecutionContext
it('sets the image', async () => {
const result = (
await fn(
0.89,
{
emptyImage: null,
origin: Origin.TOP,
image: elasticLogo,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('image', elasticLogo);
});

it('defaults to the Elastic outline logo', () => {
const result = fn(
0.89,
{
emptyImage: null,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
it('defaults to the Elastic outline logo', async () => {
const result = (
await fn(
0.89,
{
emptyImage: null,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('image', elasticOutline);
});
});

describe('emptyImage', () => {
it('sets the background image', () => {
const result = fn(
0,
{
emptyImage: elasticLogo,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
it('sets the background image', async () => {
const result = (
await fn(
0,
{
emptyImage: elasticLogo,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('emptyImage', elasticLogo);
});

it('sets emptyImage to null', () => {
const result = fn(
0,
{
emptyImage: null,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
it('sets emptyImage to null', async () => {
const result = (
await fn(
0,
{
emptyImage: null,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('emptyImage', null);
});
});

describe('origin', () => {
it('sets which side to start the reveal from', () => {
let result = fn(
1,
{
emptyImage: null,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
it('sets which side to start the reveal from', async () => {
let result = (
await fn(
1,
{
emptyImage: null,
origin: Origin.TOP,
image: null,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('origin', 'top');
result = fn(
1,
{
emptyImage: null,
origin: Origin.LEFT,
image: null,
},
{} as ExecutionContext
result = (
await fn(
1,
{
emptyImage: null,
origin: Origin.LEFT,
image: null,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('origin', 'left');
result = fn(
1,
{
emptyImage: null,
origin: Origin.BOTTOM,
image: null,
},
{} as ExecutionContext
result = (
await fn(
1,
{
emptyImage: null,
origin: Origin.BOTTOM,
image: null,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('origin', 'bottom');
result = fn(
1,
{
emptyImage: null,
origin: Origin.RIGHT,
image: null,
},
{} as ExecutionContext
result = (
await fn(
1,
{
emptyImage: null,
origin: Origin.RIGHT,
image: null,
},
{} as ExecutionContext
)
).value;
expect(result).toHaveProperty('origin', 'right');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,77 @@
* Side Public License, v 1.
*/

import { resolveWithMissingImage, elasticOutline } from '../../../presentation_util/common/lib';
import { getFunctionHelp, getFunctionErrors } from '../i18n';
import { ExpressionRevealImageFunction, Origin } from '../types';
import { i18n } from '@kbn/i18n';
import {
resolveWithMissingImage,
getElasticOutline,
isValidUrl,
} from '../../../presentation_util/common/lib';
import { ExpressionRevealImageFunction, Origin, Position } from '../../common/types';
import { BASE64, URL } from '../../common/constants';

const strings = {
help: i18n.translate('expressionRevealImage.functions.revealImageHelpText', {
defaultMessage: 'Configures an image reveal element.',
}),
args: {
image: i18n.translate('expressionRevealImage.functions.revealImage.args.imageHelpText', {
defaultMessage:
'The image to reveal. Provide an image asset as a {BASE64} data {URL}, ' +
'or pass in a sub-expression.',
values: {
BASE64,
URL,
},
}),
emptyImage: i18n.translate(
'expressionRevealImage.functions.revealImage.args.emptyImageHelpText',
{
defaultMessage:
'An optional background image to reveal over. ' +
'Provide an image asset as a `{BASE64}` data {URL}, or pass in a sub-expression.',
values: {
BASE64,
URL,
},
}
),
origin: i18n.translate('expressionRevealImage.functions.revealImage.args.originHelpText', {
defaultMessage: 'The position to start the image fill. For example, {list}, or {end}.',
values: {
list: Object.values(Position)
.slice(0, -1)
.map((position) => `\`"${position}"\``)
.join(', '),
end: Object.values(Position).slice(-1)[0],
},
}),
},
};

export const errors = {
invalidPercent: (percent: number) =>
new Error(
i18n.translate('expressionRevealImage.functions.revealImage.invalidPercentErrorMessage', {
defaultMessage: "Invalid value: '{percent}'. Percentage must be between 0 and 1",
values: {
percent,
},
})
),
invalidImageUrl: (imageUrl: string) =>
new Error(
i18n.translate('expressionRevealImage.functions.revealImage.invalidImageUrl', {
defaultMessage: "Invalid image url: '{imageUrl}'.",
values: {
imageUrl,
},
})
),
};

export const revealImageFunction: ExpressionRevealImageFunction = () => {
const { help, args: argHelp } = getFunctionHelp().revealImage;
const errors = getFunctionErrors().revealImage;
const { help, args: argHelp } = strings;

return {
name: 'revealImage',
Expand All @@ -24,7 +88,7 @@ export const revealImageFunction: ExpressionRevealImageFunction = () => {
image: {
types: ['string', 'null'],
help: argHelp.image,
default: elasticOutline,
default: null,
},
emptyImage: {
types: ['string', 'null'],
Expand All @@ -38,11 +102,16 @@ export const revealImageFunction: ExpressionRevealImageFunction = () => {
options: Object.values(Origin),
},
},
fn: (percent, args) => {
fn: async (percent, args) => {
if (percent > 1 || percent < 0) {
throw errors.invalidPercent(percent);
}

if (args.image && !isValidUrl(args.image)) {
throw errors.invalidImageUrl(args.image);
}

const { elasticOutline } = await getElasticOutline();
return {
type: 'render',
as: 'revealImage',
Expand Down
Loading