123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- import { css } from '@emotion/css';
- import React from 'react';
- import { connect } from 'react-redux';
- import { GrafanaTheme2, NavModel } from '@grafana/data';
- import { LinkButton, useStyles2 } from '@grafana/ui';
- import Page from '../../core/components/Page/Page';
- import { getNavModel } from '../../core/selectors/navModel';
- import { StoreState } from '../../types';
- import { LicenseChrome } from './LicenseChrome';
- import { ServerStats } from './ServerStats';
- interface Props {
- navModel: NavModel;
- }
- export function UpgradePage({ navModel }: Props) {
- return (
- <Page navModel={navModel}>
- <Page.Contents>
- <ServerStats />
- <UpgradeInfo
- editionNotice="You are running the open-source version of Grafana.
- You have to install the Enterprise edition in order enable Enterprise features."
- />
- </Page.Contents>
- </Page>
- );
- }
- const titleStyles = { fontWeight: 500, fontSize: '26px', lineHeight: '123%' };
- interface UpgradeInfoProps {
- editionNotice?: string;
- }
- export const UpgradeInfo: React.FC<UpgradeInfoProps> = ({ editionNotice }) => {
- const styles = useStyles2(getStyles);
- return (
- <>
- <h2 className={styles.title}>Enterprise license</h2>
- <LicenseChrome header="Grafana Enterprise" subheader="Get your free trial" editionNotice={editionNotice}>
- <div className={styles.column}>
- <FeatureInfo />
- <ServiceInfo />
- </div>
- </LicenseChrome>
- </>
- );
- };
- const getStyles = (theme: GrafanaTheme2) => {
- return {
- column: css`
- display: grid;
- grid-template-columns: 100%;
- column-gap: 20px;
- row-gap: 40px;
- @media (min-width: 1050px) {
- grid-template-columns: 50% 50%;
- }
- `,
- title: css`
- margin: ${theme.spacing(4)} 0;
- `,
- };
- };
- const GetEnterprise: React.FC = () => {
- return (
- <div style={{ marginTop: '40px', marginBottom: '30px' }}>
- <h2 style={titleStyles}>Get Grafana Enterprise</h2>
- <CallToAction />
- <p style={{ paddingTop: '12px' }}>
- You can use the trial version for free for 30 days. We will remind you about it five days before the trial
- period ends.
- </p>
- </div>
- );
- };
- const CallToAction: React.FC = () => {
- return (
- <LinkButton
- variant="primary"
- size="lg"
- href="https://grafana.com/contact?about=grafana-enterprise&utm_source=grafana-upgrade-page"
- >
- Contact us and get a free trial
- </LinkButton>
- );
- };
- const ServiceInfo: React.FC = () => {
- return (
- <div>
- <h4>At your service</h4>
- <List>
- <Item title="Enterprise Plugins" image="public/img/licensing/plugin_enterprise.svg" />
- <Item title="Critical SLA: 2 hours" image="public/img/licensing/sla.svg" />
- <Item title="Unlimited Expert Support" image="public/img/licensing/customer_support.svg">
- 24 x 7 x 365 support via
- <List nested={true}>
- <Item title="Email" />
- <Item title="Private Slack channel" />
- <Item title="Phone" />
- </List>
- </Item>
- <Item title="Hand-in-hand support" image="public/img/licensing/handinhand_support.svg">
- in the upgrade process
- </Item>
- </List>
- <div style={{ marginTop: '20px' }}>
- <strong>Also included:</strong>
- <br />
- Indemnification, working with Grafana Labs on future prioritization, and training from the core Grafana team.
- </div>
- <GetEnterprise />
- </div>
- );
- };
- const FeatureInfo: React.FC = () => {
- return (
- <div style={{ paddingRight: '11px' }}>
- <h4>Enhanced functionality</h4>
- <FeatureListing />
- </div>
- );
- };
- const FeatureListing: React.FC = () => {
- return (
- <List>
- <Item title="Data source permissions" />
- <Item title="Reporting" />
- <Item title="SAML authentication" />
- <Item title="Enhanced LDAP integration" />
- <Item title="Team Sync">LDAP, GitHub OAuth, Auth Proxy, Okta</Item>
- <Item title="White labeling" />
- <Item title="Auditing" />
- <Item title="Settings updates at runtime" />
- <Item title="Grafana usage insights">
- <List nested={true}>
- <Item title="Sort dashboards by popularity in search" />
- <Item title="Find unused dashboards" />
- <Item title="Dashboard usage stats drawer" />
- <Item title="Dashboard presence indicators" />
- </List>
- </Item>
- <Item title="Enterprise plugins">
- <List nested={true}>
- <Item title="Oracle" />
- <Item title="Splunk" />
- <Item title="Service Now" />
- <Item title="Dynatrace" />
- <Item title="New Relic" />
- <Item title="DataDog" />
- <Item title="AppDynamics" />
- <Item title="SAP HANA®" />
- <Item title="Gitlab" />
- <Item title="Honeycomb" />
- <Item title="Jira" />
- <Item title="MongoDB" />
- <Item title="Salesforce" />
- <Item title="Snowflake" />
- <Item title="Wavefront" />
- </List>
- </Item>
- </List>
- );
- };
- interface ListProps {
- nested?: boolean;
- }
- const List: React.FC<ListProps> = ({ children, nested }) => {
- const listStyle = css`
- display: flex;
- flex-direction: column;
- padding-top: 8px;
- > div {
- margin-bottom: ${nested ? 0 : 8}px;
- }
- `;
- return <div className={listStyle}>{children}</div>;
- };
- interface ItemProps {
- title: string;
- image?: string;
- }
- const Item: React.FC<ItemProps> = ({ children, title, image }) => {
- const imageUrl = image ? image : 'public/img/licensing/checkmark.svg';
- const itemStyle = css`
- display: flex;
- > img {
- display: block;
- height: 22px;
- flex-grow: 0;
- padding-right: 12px;
- }
- `;
- const titleStyle = css`
- font-weight: 500;
- line-height: 1.7;
- `;
- return (
- <div className={itemStyle}>
- <img src={imageUrl} alt="" />
- <div>
- <div className={titleStyle}>{title}</div>
- {children}
- </div>
- </div>
- );
- };
- const mapStateToProps = (state: StoreState) => ({
- navModel: getNavModel(state.navIndex, 'upgrading'),
- });
- export default connect(mapStateToProps)(UpgradePage);
|