Skip to content

Commit 2d5f000

Browse files
committed
feat: 🎸 add ability to disable URL encoding in URL Drilldown
1 parent 7fdd0a1 commit 2d5f000

File tree

6 files changed

+46
-12
lines changed

6 files changed

+46
-12
lines changed

‎x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx‎

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,19 @@ export class UrlDrilldown implements Drilldown<Config, UrlTrigger, ActionFactory
9797
config: Config,
9898
context: ActionFactoryContext
9999
): config is Config => {
100-
const { isValid } = urlDrilldownValidateUrlTemplate(config.url, this.buildEditorScope(context));
100+
const { isValid } = urlDrilldownValidateUrlTemplate(
101+
config.url,
102+
this.buildEditorScope(context),
103+
config.disableEncoding
104+
);
101105
return isValid;
102106
};
103107

104108
public readonly isCompatible = async (config: Config, context: ActionContext) => {
105109
const { isValid, error } = urlDrilldownValidateUrlTemplate(
106110
config.url,
107-
await this.buildRuntimeScope(context)
111+
await this.buildRuntimeScope(context),
112+
config.disableEncoding
108113
);
109114

110115
if (!isValid) {
@@ -118,10 +123,18 @@ export class UrlDrilldown implements Drilldown<Config, UrlTrigger, ActionFactory
118123
};
119124

120125
public readonly getHref = async (config: Config, context: ActionContext) =>
121-
urlDrilldownCompileUrl(config.url.template, this.buildRuntimeScope(context));
126+
urlDrilldownCompileUrl(
127+
config.url.template,
128+
this.buildRuntimeScope(context),
129+
config.disableEncoding
130+
);
122131

123132
public readonly execute = async (config: Config, context: ActionContext) => {
124-
const url = urlDrilldownCompileUrl(config.url.template, this.buildRuntimeScope(context));
133+
const url = urlDrilldownCompileUrl(
134+
config.url.template,
135+
this.buildRuntimeScope(context),
136+
config.disableEncoding
137+
);
125138
if (config.openInNewTab) {
126139
window.open(url, '_blank', 'noopener');
127140
} else {

‎x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/i18n.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,10 @@ export const txtUrlTemplateOpenInNewTab = i18n.translate(
7979
defaultMessage: 'Open in new tab',
8080
}
8181
);
82+
83+
export const txtDisableEncoding = i18n.translate(
84+
'xpack.uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.disableEncoding',
85+
{
86+
defaultMessage: 'Disable encoding',
87+
}
88+
);

‎x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/url_drilldown_collect_config.tsx‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
txtUrlTemplatePlaceholder,
3535
txtUrlTemplatePreviewLabel,
3636
txtUrlTemplatePreviewLinkText,
37+
txtDisableEncoding,
3738
} from './i18n';
3839

3940
export interface UrlDrilldownCollectConfig {
@@ -55,11 +56,11 @@ export const UrlDrilldownCollectConfig: React.FC<UrlDrilldownCollectConfig> = ({
5556
const urlTemplate = config.url.template ?? '';
5657
const compiledUrl = React.useMemo(() => {
5758
try {
58-
return compile(urlTemplate, scope);
59+
return compile(urlTemplate, scope, config.disableEncoding);
5960
} catch {
6061
return urlTemplate;
6162
}
62-
}, [urlTemplate, scope]);
63+
}, [urlTemplate, scope, config.disableEncoding]);
6364
const scopeVariables = React.useMemo(() => buildScopeSuggestions(scope), [scope]);
6465

6566
function updateUrlTemplate(newUrlTemplate: string) {
@@ -74,8 +75,8 @@ export const UrlDrilldownCollectConfig: React.FC<UrlDrilldownCollectConfig> = ({
7475
}
7576
}
7677
const { error, isValid } = React.useMemo(
77-
() => validateUrlTemplate({ template: urlTemplate }, scope),
78-
[urlTemplate, scope]
78+
() => validateUrlTemplate({ template: urlTemplate }, scope, config.disableEncoding),
79+
[urlTemplate, scope, config.disableEncoding]
7980
);
8081
const isEmpty = !urlTemplate;
8182
const isInvalid = !isValid && !isEmpty;
@@ -154,6 +155,15 @@ export const UrlDrilldownCollectConfig: React.FC<UrlDrilldownCollectConfig> = ({
154155
onChange={() => onConfig({ ...config, openInNewTab: !config.openInNewTab })}
155156
/>
156157
</EuiFormRow>
158+
<EuiFormRow hasChildLabel={false}>
159+
<EuiCheckbox
160+
id="disableEncoding"
161+
name="disableEncoding"
162+
label={txtDisableEncoding}
163+
checked={config.disableEncoding}
164+
onChange={() => onConfig({ ...config, disableEncoding: !config.disableEncoding })}
165+
/>
166+
</EuiFormRow>
157167
</>
158168
);
159169
};

‎x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/types.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
export type UrlDrilldownConfig = {
88
url: { format?: 'handlebars_v1'; template: string };
99
openInNewTab: boolean;
10+
disableEncoding?: boolean;
1011
};
1112

1213
/**

‎x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/url_template.ts‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ handlebars.registerHelper('replace', (...args) => {
116116
return String(str).split(searchString).join(valueString);
117117
});
118118

119-
export function compile(url: string, context: object): string {
119+
export function compile(url: string, context: object, disableEncoding?: boolean): string {
120120
const template = handlebars.compile(url, { strict: true, noEscape: true });
121-
return encodeURI(template(context));
121+
let uri = template(context);
122+
if (!disableEncoding) uri = encodeURI(uri);
123+
return uri;
122124
}

‎x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/url_validation.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ export function validateUrl(url: string): { isValid: boolean; error?: string } {
5151

5252
export function validateUrlTemplate(
5353
urlTemplate: UrlDrilldownConfig['url'],
54-
scope: UrlDrilldownScope
54+
scope: UrlDrilldownScope,
55+
disableEncoding?: boolean
5556
): { isValid: boolean; error?: string } {
5657
if (!urlTemplate.template)
5758
return {
@@ -60,7 +61,7 @@ export function validateUrlTemplate(
6061
};
6162

6263
try {
63-
const compiledUrl = compile(urlTemplate.template, scope);
64+
const compiledUrl = compile(urlTemplate.template, scope, disableEncoding);
6465
return validateUrl(compiledUrl);
6566
} catch (e) {
6667
return {

0 commit comments

Comments
 (0)