mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Use bookmark icon for Saved Items, add support for solid bookmark icon (#46775)
* Use bookmark icon for Saved Items, add support for solid bookmark icon * Add some unit tests * Refactor utils into own file * Update test title * Fix import * consistent function style
This commit is contained in:
parent
4631bb2c54
commit
5f67d78219
@ -6,8 +6,7 @@ import { useTheme } from '../../themes/ThemeContext';
|
|||||||
import { IconName, IconType, IconSize } from '../../types/icon';
|
import { IconName, IconType, IconSize } from '../../types/icon';
|
||||||
import SVG from 'react-inlinesvg';
|
import SVG from 'react-inlinesvg';
|
||||||
import { cacheInitialized, initIconCache, iconRoot } from './iconBundle';
|
import { cacheInitialized, initIconCache, iconRoot } from './iconBundle';
|
||||||
|
import { getIconSubDir, getSvgSize } from './utils';
|
||||||
const alwaysMonoIcons: IconName[] = ['grafana', 'favorite', 'heart-break', 'heart', 'panel-add', 'library-panel'];
|
|
||||||
|
|
||||||
export interface IconProps extends React.HTMLAttributes<HTMLDivElement> {
|
export interface IconProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||||
name: IconName;
|
name: IconName;
|
||||||
@ -34,16 +33,6 @@ const getIconStyles = stylesFactory((theme: GrafanaTheme) => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
function getIconSubDir(name: IconName, type: string): string {
|
|
||||||
return name?.startsWith('gf-')
|
|
||||||
? 'custom'
|
|
||||||
: alwaysMonoIcons.includes(name)
|
|
||||||
? 'mono'
|
|
||||||
: type === 'default'
|
|
||||||
? 'unicons'
|
|
||||||
: 'mono';
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Icon = React.forwardRef<HTMLDivElement, IconProps>(
|
export const Icon = React.forwardRef<HTMLDivElement, IconProps>(
|
||||||
({ size = 'md', type = 'default', name, className, style, title = '', ...divElementProps }, ref) => {
|
({ size = 'md', type = 'default', name, className, style, title = '', ...divElementProps }, ref) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
@ -94,23 +83,3 @@ function getFontAwesomeIconStyles(iconName: string, className?: string): string
|
|||||||
className
|
className
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Transform string with px to number and add 2 pxs as path in svg is 2px smaller */
|
|
||||||
export const getSvgSize = (size: IconSize) => {
|
|
||||||
switch (size) {
|
|
||||||
case 'xs':
|
|
||||||
return 12;
|
|
||||||
case 'sm':
|
|
||||||
return 14;
|
|
||||||
case 'md':
|
|
||||||
return 16;
|
|
||||||
case 'lg':
|
|
||||||
return 18;
|
|
||||||
case 'xl':
|
|
||||||
return 24;
|
|
||||||
case 'xxl':
|
|
||||||
return 36;
|
|
||||||
case 'xxxl':
|
|
||||||
return 48;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
18
packages/grafana-ui/src/components/Icon/utils.test.ts
Normal file
18
packages/grafana-ui/src/components/Icon/utils.test.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { getIconSubDir } from './utils';
|
||||||
|
|
||||||
|
describe('Icon utils', () => {
|
||||||
|
describe('getIconSubDir', () => {
|
||||||
|
it.each`
|
||||||
|
name | type | expected
|
||||||
|
${'gf-panel'} | ${undefined} | ${'custom'}
|
||||||
|
${'grafana'} | ${undefined} | ${'mono'}
|
||||||
|
${'bookmark'} | ${'default'} | ${'unicons'}
|
||||||
|
${'bookmark'} | ${'solid'} | ${'solid'}
|
||||||
|
${'bookmark'} | ${undefined} | ${'mono'}
|
||||||
|
${'folder'} | ${'mono'} | ${'mono'}
|
||||||
|
`('it returns the correct iconSubDir for icon $name with type $type', ({ name, type, expected }) => {
|
||||||
|
const iconSubDir = getIconSubDir(name, type);
|
||||||
|
expect(iconSubDir).toEqual(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
37
packages/grafana-ui/src/components/Icon/utils.ts
Normal file
37
packages/grafana-ui/src/components/Icon/utils.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { IconName, IconSize } from '../../types/icon';
|
||||||
|
|
||||||
|
const alwaysMonoIcons: IconName[] = ['grafana', 'favorite', 'heart-break', 'heart', 'panel-add', 'library-panel'];
|
||||||
|
|
||||||
|
export function getIconSubDir(name: IconName, type: string): string {
|
||||||
|
if (name?.startsWith('gf-')) {
|
||||||
|
return 'custom';
|
||||||
|
} else if (alwaysMonoIcons.includes(name)) {
|
||||||
|
return 'mono';
|
||||||
|
} else if (type === 'default') {
|
||||||
|
return 'unicons';
|
||||||
|
} else if (type === 'solid') {
|
||||||
|
return 'solid';
|
||||||
|
} else {
|
||||||
|
return 'mono';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Transform string with px to number and add 2 pxs as path in svg is 2px smaller */
|
||||||
|
export function getSvgSize(size: IconSize) {
|
||||||
|
switch (size) {
|
||||||
|
case 'xs':
|
||||||
|
return 12;
|
||||||
|
case 'sm':
|
||||||
|
return 14;
|
||||||
|
case 'md':
|
||||||
|
return 16;
|
||||||
|
case 'lg':
|
||||||
|
return 18;
|
||||||
|
case 'xl':
|
||||||
|
return 24;
|
||||||
|
case 'xxl':
|
||||||
|
return 36;
|
||||||
|
case 'xxxl':
|
||||||
|
return 48;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Icon, getSvgSize } from '../Icon/Icon';
|
import { Icon } from '../Icon/Icon';
|
||||||
|
import { getSvgSize } from '../Icon/utils';
|
||||||
import { IconName, IconSize, IconType } from '../../types/icon';
|
import { IconName, IconSize, IconType } from '../../types/icon';
|
||||||
import { stylesFactory } from '../../themes/stylesFactory';
|
import { stylesFactory } from '../../themes/stylesFactory';
|
||||||
import { css, cx } from '@emotion/css';
|
import { css, cx } from '@emotion/css';
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Field, FieldType } from '@grafana/data';
|
import { Field, FieldType } from '@grafana/data';
|
||||||
import { ComponentSize } from './size';
|
import { ComponentSize } from './size';
|
||||||
export type IconType = 'mono' | 'default';
|
export type IconType = 'mono' | 'default' | 'solid';
|
||||||
export type IconSize = ComponentSize | 'xl' | 'xxl' | 'xxxl';
|
export type IconSize = ComponentSize | 'xl' | 'xxl' | 'xxxl';
|
||||||
|
|
||||||
export const getAvailableIcons = () =>
|
export const getAvailableIcons = () =>
|
||||||
@ -28,6 +28,7 @@ export const getAvailableIcons = () =>
|
|||||||
'bell-slash',
|
'bell-slash',
|
||||||
'bolt',
|
'bolt',
|
||||||
'book',
|
'book',
|
||||||
|
'bookmark',
|
||||||
'book-open',
|
'book-open',
|
||||||
'brackets-curly',
|
'brackets-curly',
|
||||||
'building',
|
'building',
|
||||||
|
@ -167,7 +167,7 @@ func (hs *HTTPServer) getNavTree(c *models.ReqContext, hasEditPerm bool) ([]*dto
|
|||||||
navTree = append(navTree, &dtos.NavLink{
|
navTree = append(navTree, &dtos.NavLink{
|
||||||
Text: "Saved Items",
|
Text: "Saved Items",
|
||||||
Id: "saved-items",
|
Id: "saved-items",
|
||||||
Icon: "heart",
|
Icon: "bookmark",
|
||||||
SortWeight: dtos.WeightSavedItems,
|
SortWeight: dtos.WeightSavedItems,
|
||||||
Section: dtos.NavSectionCore,
|
Section: dtos.NavSectionCore,
|
||||||
Children: savedItemsLinks,
|
Children: savedItemsLinks,
|
||||||
|
4
public/img/icons/.gitignore
vendored
4
public/img/icons/.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
# unicons folder is imported via webpack
|
# unicons and solid folders are imported via webpack
|
||||||
# https://github.com/Iconscout/unicons/tarball/d0859416ab8d8e60dcfa1c0b50716874fcf11778
|
# https://github.com/Iconscout/unicons/tarball/d0859416ab8d8e60dcfa1c0b50716874fcf11778
|
||||||
# just the line icons
|
|
||||||
unicons
|
unicons
|
||||||
|
solid
|
||||||
|
@ -16,6 +16,16 @@ class CopyUniconsPlugin {
|
|||||||
);
|
);
|
||||||
fs.copySync(srcDir, destDir);
|
fs.copySync(srcDir, destDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let solidDestDir = path.resolve(__dirname, '../../public/img/icons/solid');
|
||||||
|
|
||||||
|
if (!fs.pathExistsSync(solidDestDir)) {
|
||||||
|
let srcDir = path.join(
|
||||||
|
path.dirname(require.resolve('iconscout-unicons-tarball/package.json')),
|
||||||
|
'unicons/svg/solid'
|
||||||
|
);
|
||||||
|
fs.copySync(srcDir, solidDestDir);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user