mirror of
https://github.com/grafana/grafana.git
synced 2026-09-05 04:40:13 -05:00
SVG: Add dompurify preprocessor step (#62143)
Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
This commit is contained in:
co-authored by
Ryan McKinley
parent
dd147a3c31
commit
8b574e22b5
@@ -1,11 +1,12 @@
|
||||
import { css } from '@emotion/css';
|
||||
import React, { Dispatch, SetStateAction, useState } from 'react';
|
||||
import SVG from 'react-inlinesvg';
|
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { FileDropzone, useStyles2, Button, DropzoneFile, Field } from '@grafana/ui';
|
||||
import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG';
|
||||
|
||||
import { MediaType } from '../types';
|
||||
|
||||
interface Props {
|
||||
setFormData: Dispatch<SetStateAction<FormData>>;
|
||||
mediaType: MediaType;
|
||||
@@ -36,7 +37,7 @@ export const FileUploader = ({ mediaType, setFormData, setUpload, error }: Props
|
||||
const Preview = () => (
|
||||
<Field label="Preview">
|
||||
<div className={styles.iconPreview}>
|
||||
{mediaType === MediaType.Icon && <SVG src={file} className={styles.img} />}
|
||||
{mediaType === MediaType.Icon && <SanitizedSVG src={file} className={styles.img} />}
|
||||
{mediaType === MediaType.Image && <img src={file} alt="Preview of the uploaded file" className={styles.img} />}
|
||||
</div>
|
||||
</Field>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { css, cx } from '@emotion/css';
|
||||
import React, { memo, CSSProperties } from 'react';
|
||||
import SVG from 'react-inlinesvg';
|
||||
import AutoSizer from 'react-virtualized-auto-sizer';
|
||||
import { areEqual, FixedSizeGrid as Grid } from 'react-window';
|
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { useTheme2, stylesFactory } from '@grafana/ui';
|
||||
import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG';
|
||||
|
||||
import { ResourceItem } from './FolderPickerTab';
|
||||
|
||||
@@ -38,7 +38,7 @@ function Cell(props: CellProps) {
|
||||
onClick={() => onChange(card.value)}
|
||||
>
|
||||
{card.imgUrl.endsWith('.svg') ? (
|
||||
<SVG src={card.imgUrl} className={styles.img} />
|
||||
<SanitizedSVG src={card.imgUrl} className={styles.img} />
|
||||
) : (
|
||||
<img src={card.imgUrl} alt="" className={styles.img} />
|
||||
)}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { css } from '@emotion/css';
|
||||
import React, { createRef } from 'react';
|
||||
import SVG from 'react-inlinesvg';
|
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import {
|
||||
@@ -15,6 +14,7 @@ import {
|
||||
useTheme2,
|
||||
} from '@grafana/ui';
|
||||
import { closePopover } from '@grafana/ui/src/utils/closePopover';
|
||||
import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG';
|
||||
|
||||
import { getPublicOrAbsoluteUrl } from '../resource';
|
||||
import { MediaType, ResourceFolderName, ResourcePickerSize } from '../types';
|
||||
@@ -56,7 +56,7 @@ export const ResourcePicker = (props: Props) => {
|
||||
|
||||
const renderSmallResourcePicker = () => {
|
||||
if (value && sanitizedSrc) {
|
||||
return <SVG src={sanitizedSrc} className={styles.icon} style={{ ...colorStyle }} />;
|
||||
return <SanitizedSVG src={sanitizedSrc} className={styles.icon} style={{ ...colorStyle }} />;
|
||||
} else {
|
||||
return (
|
||||
<LinkButton variant="primary" fill="text" size="sm">
|
||||
@@ -73,7 +73,7 @@ export const ResourcePicker = (props: Props) => {
|
||||
value={name}
|
||||
placeholder={placeholder}
|
||||
readOnly={true}
|
||||
prefix={sanitizedSrc && <SVG src={sanitizedSrc} className={styles.icon} style={{ ...colorStyle }} />}
|
||||
prefix={sanitizedSrc && <SanitizedSVG src={sanitizedSrc} className={styles.icon} style={{ ...colorStyle }} />}
|
||||
suffix={<Button icon="times" variant="secondary" fill="text" size="sm" onClick={onClear} />}
|
||||
/>
|
||||
</InlineField>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { css } from '@emotion/css';
|
||||
import React, { Dispatch, SetStateAction } from 'react';
|
||||
import SVG from 'react-inlinesvg';
|
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { Field, Input, Label, useStyles2 } from '@grafana/ui';
|
||||
import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG';
|
||||
|
||||
import { getPublicOrAbsoluteUrl } from '../resource';
|
||||
import { MediaType } from '../types';
|
||||
@@ -33,7 +33,7 @@ export const URLPickerTab = (props: Props) => {
|
||||
<div className={styles.iconContainer}>
|
||||
<Field label="Preview">
|
||||
<div className={styles.iconPreview}>
|
||||
{mediaType === MediaType.Icon && <SVG src={imgSrc} className={styles.img} />}
|
||||
{mediaType === MediaType.Icon && <SanitizedSVG src={imgSrc} className={styles.img} />}
|
||||
{mediaType === MediaType.Image && newValue && (
|
||||
<img src={imgSrc} alt="Preview of the selected URL" className={styles.img} />
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user