diff --git a/superset-frontend/src/SqlLab/components/HighlightedSql.jsx b/superset-frontend/src/SqlLab/components/HighlightedSql.jsx deleted file mode 100644 index b143b37c74..0000000000 --- a/superset-frontend/src/SqlLab/components/HighlightedSql.jsx +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; -import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'; -import github from 'react-syntax-highlighter/dist/cjs/styles/hljs/github'; -import { t } from '@superset-ui/core'; - -import ModalTrigger from '../../components/ModalTrigger'; - -SyntaxHighlighter.registerLanguage('sql', sql); - -const defaultProps = { - maxWidth: 50, - maxLines: 5, - shrink: false, -}; - -const propTypes = { - sql: PropTypes.string.isRequired, - rawSql: PropTypes.string, - maxWidth: PropTypes.number, - maxLines: PropTypes.number, - shrink: PropTypes.bool, -}; - -class HighlightedSql extends React.Component { - constructor(props) { - super(props); - this.state = { - modalBody: null, - }; - } - - shrinkSql() { - const ssql = this.props.sql || ''; - let lines = ssql.split('\n'); - if (lines.length >= this.props.maxLines) { - lines = lines.slice(0, this.props.maxLines); - lines.push('{...}'); - } - return lines - .map(line => { - if (line.length > this.props.maxWidth) { - return `${line.slice(0, this.props.maxWidth)}{...}`; - } - return line; - }) - .join('\n'); - } - - triggerNode() { - const shownSql = this.props.shrink - ? this.shrinkSql(this.props.sql) - : this.props.sql; - return ( - - {shownSql} - - ); - } - - generateModal() { - let rawSql; - if (this.props.rawSql && this.props.rawSql !== this.props.sql) { - rawSql = ( -
-

{t('Raw SQL')}

- - {this.props.rawSql} - -
- ); - } - this.setState({ - modalBody: ( -
-

{t('Source SQL')}

- - {this.props.sql} - - {rawSql} -
- ), - }); - } - - render() { - return ( - - ); - } -} -HighlightedSql.propTypes = propTypes; -HighlightedSql.defaultProps = defaultProps; - -export default HighlightedSql; diff --git a/superset-frontend/src/SqlLab/components/HighlightedSql.tsx b/superset-frontend/src/SqlLab/components/HighlightedSql.tsx new file mode 100644 index 0000000000..2682f83a05 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/HighlightedSql.tsx @@ -0,0 +1,116 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; +import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'; +import github from 'react-syntax-highlighter/dist/cjs/styles/hljs/github'; +import { t } from '@superset-ui/core'; + +import ModalTrigger from '../../components/ModalTrigger'; + +SyntaxHighlighter.registerLanguage('sql', sql); + +interface HighlightedSqlProps { + sql: string; + rawSql?: string; + maxWidth?: number; + maxLines?: number; + shrink?: any; +} + +interface HighlightedSqlModalTypes { + rawSql?: string; + sql: string; +} + +interface TriggerNodeProps { + shrink: boolean; + sql: string; + maxLines: number; + maxWidth: number; +} + +const shrinkSql = (sql: string, maxLines: number, maxWidth: number) => { + const ssql = sql || ''; + let lines = ssql.split('\n'); + if (lines.length >= maxLines) { + lines = lines.slice(0, maxLines); + lines.push('{...}'); + } + return lines + .map(line => { + if (line.length > maxWidth) { + return `${line.slice(0, maxWidth)}{...}`; + } + return line; + }) + .join('\n'); +}; + +function TriggerNode({ shrink, sql, maxLines, maxWidth }: TriggerNodeProps) { + return ( + + {shrink ? shrinkSql(sql, maxLines, maxWidth) : sql} + + ); +} + +function HighlightSqlModal({ rawSql, sql }: HighlightedSqlModalTypes) { + return ( +
+

{t('Source SQL')}

+ + {sql} + + {rawSql && rawSql !== sql && ( +
+

{t('Raw SQL')}

+ + {rawSql} + +
+ )} +
+ ); +} + +function HighlightedSql({ + sql, + rawSql, + maxWidth = 50, + maxLines = 5, + shrink = false, +}: HighlightedSqlProps) { + return ( + } + triggerNode={ + + } + /> + ); +} + +export default HighlightedSql;