@gravity-ui/dashkit 9.0.0 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,7 @@ export interface PluginTextProps extends PluginWidgetProps {
17
17
  text: string;
18
18
  } & PluginWidgetProps['data'];
19
19
  onBeforeRender: () => () => void;
20
+ qa?: string;
20
21
  }
21
22
  interface PluginTextState {
22
23
  htmlText: string;
@@ -73,7 +73,7 @@ class PluginText extends react_1.default.PureComponent {
73
73
  react_1.default.createElement("br", null)));
74
74
  }
75
75
  renderText() {
76
- return (react_1.default.createElement("div", { className: b({ withMarkdown: this.withMarkdown }), [constants_1.PLUGIN_ROOT_ATTR_NAME]: 'text' }, this.withMarkdown ? (react_1.default.createElement("div", { className: "yfm" // className из стилей для markdown
76
+ return (react_1.default.createElement("div", { className: b({ withMarkdown: this.withMarkdown }), "data-qa": this.props.qa, [constants_1.PLUGIN_ROOT_ATTR_NAME]: 'text' }, this.withMarkdown ? (react_1.default.createElement("div", { className: "yfm" // className из стилей для markdown
77
77
  , dangerouslySetInnerHTML: { __html: this.state.htmlText } })) : (this.state.text)));
78
78
  }
79
79
  async getMarkdown() {
@@ -1 +1 @@
1
- {"version":3,"file":"Text.js","sourceRoot":"../../../../src","sources":["plugins/Text/Text.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {Button, Loader} from '@gravity-ui/uikit';\n\nimport {i18n} from '../../i18n';\nimport {Plugin, PluginWidgetProps} from '../../typings';\nimport {cn} from '../../utils/cn';\nimport {PLUGIN_ROOT_ATTR_NAME} from '../constants';\n\nimport './Text.scss';\n\n// need to set markdown styles separately\n// for instance can use yfm-transform\n\nconst b = cn('dashkit-plugin-text');\n\nenum LoadStatus {\n Pending = 'pending',\n Success = 'success',\n Fail = 'fail',\n}\n\nexport type PluginTextApiHandler = (data: {text: string}) => Promise<{result: string}>;\n\nexport interface PluginTextProps extends PluginWidgetProps {\n apiHandler?: PluginTextApiHandler;\n data: {\n text: string;\n } & PluginWidgetProps['data'];\n onBeforeRender: () => () => void;\n}\n\ninterface PluginTextState {\n htmlText: string;\n status: LoadStatus;\n needUpdate?: boolean;\n text?: string;\n}\n\nexport class PluginText extends React.PureComponent<PluginTextProps, PluginTextState> {\n static getDerivedStateFromProps(props: PluginTextProps, state: PluginTextState) {\n const {\n data: {text},\n } = props;\n const needUpdate = text !== state.text;\n return {\n text,\n needUpdate,\n };\n }\n\n state: PluginTextState = {\n htmlText: '',\n status: this.withMarkdown ? LoadStatus.Pending : LoadStatus.Success,\n };\n\n private _isUnmounted = false;\n\n componentDidMount() {\n this._isUnmounted = false;\n this.getMarkdown();\n }\n\n componentDidUpdate() {\n if (this.state.needUpdate) {\n this.getMarkdown();\n }\n }\n\n componentWillUnmount() {\n this._isUnmounted = true;\n }\n\n render() {\n switch (this.state.status) {\n case LoadStatus.Success:\n return this.renderText();\n case LoadStatus.Pending:\n return this.renderLoader();\n default:\n return this.renderError();\n }\n }\n\n private renderLoader() {\n return (\n <div className={b({loading: true})}>\n <div className={b('loader')}>\n <div className={b('loader-view')}>\n <Loader size=\"m\" />\n </div>\n </div>\n </div>\n );\n }\n\n private renderError() {\n return (\n <div className={b({error: true})}>\n <div className={b('error')}>{i18n('label_render-markdown-error')}</div>\n <br />\n <Button view=\"action\" size=\"m\" onClick={this.onRetryClick}>\n {i18n('button_retry')}\n </Button>\n <br />\n </div>\n );\n }\n\n private renderText() {\n return (\n <div\n className={b({withMarkdown: this.withMarkdown})}\n {...{[PLUGIN_ROOT_ATTR_NAME]: 'text'}}\n >\n {this.withMarkdown ? (\n <div\n className=\"yfm\" // className из стилей для markdown\n dangerouslySetInnerHTML={{__html: this.state.htmlText}}\n />\n ) : (\n this.state.text\n )}\n </div>\n );\n }\n\n private async getMarkdown() {\n if (typeof this.props.apiHandler !== 'function') {\n return;\n }\n this.setState({status: LoadStatus.Pending});\n\n const onLoadComplete = this.props.onBeforeLoad();\n\n try {\n let htmlText = '';\n if (this.state.text && this.state.text.trim()) {\n const loadedData = await this.props.apiHandler({text: this.state.text});\n htmlText = loadedData.result;\n }\n if (this._isUnmounted) {\n return;\n }\n this.setState({\n htmlText,\n status: LoadStatus.Success,\n });\n } catch (e) {\n if (this._isUnmounted) {\n return;\n }\n this.setState({status: LoadStatus.Fail});\n }\n onLoadComplete();\n }\n\n private onRetryClick = () => {\n this.getMarkdown();\n };\n\n get withMarkdown() {\n return typeof this.props.apiHandler === 'function';\n }\n}\n\ntype PluginDataProps = Omit<PluginTextProps, 'apiHandler'>;\n\nexport type PluginTextObjectSettings = {apiHandler?: PluginTextApiHandler};\n\nexport type PluginTextObject = Plugin<PluginDataProps> & {\n setSettings: (settings: PluginTextObjectSettings) => PluginTextObject;\n _apiHandler?: PluginTextApiHandler;\n};\n\nconst plugin: PluginTextObject = {\n type: 'text',\n defaultLayout: {w: 12, h: 6},\n setSettings(settings) {\n const {apiHandler} = settings;\n plugin._apiHandler = apiHandler;\n return plugin;\n },\n renderer(props, forwardedRef) {\n return <PluginText {...props} apiHandler={plugin._apiHandler} ref={forwardedRef} />;\n },\n};\n\nexport default plugin;\n"]}
1
+ {"version":3,"file":"Text.js","sourceRoot":"../../../../src","sources":["plugins/Text/Text.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {Button, Loader} from '@gravity-ui/uikit';\n\nimport {i18n} from '../../i18n';\nimport {Plugin, PluginWidgetProps} from '../../typings';\nimport {cn} from '../../utils/cn';\nimport {PLUGIN_ROOT_ATTR_NAME} from '../constants';\n\nimport './Text.scss';\n\n// need to set markdown styles separately\n// for instance can use yfm-transform\n\nconst b = cn('dashkit-plugin-text');\n\nenum LoadStatus {\n Pending = 'pending',\n Success = 'success',\n Fail = 'fail',\n}\n\nexport type PluginTextApiHandler = (data: {text: string}) => Promise<{result: string}>;\n\nexport interface PluginTextProps extends PluginWidgetProps {\n apiHandler?: PluginTextApiHandler;\n data: {\n text: string;\n } & PluginWidgetProps['data'];\n onBeforeRender: () => () => void;\n qa?: string;\n}\n\ninterface PluginTextState {\n htmlText: string;\n status: LoadStatus;\n needUpdate?: boolean;\n text?: string;\n}\n\nexport class PluginText extends React.PureComponent<PluginTextProps, PluginTextState> {\n static getDerivedStateFromProps(props: PluginTextProps, state: PluginTextState) {\n const {\n data: {text},\n } = props;\n const needUpdate = text !== state.text;\n return {\n text,\n needUpdate,\n };\n }\n\n state: PluginTextState = {\n htmlText: '',\n status: this.withMarkdown ? LoadStatus.Pending : LoadStatus.Success,\n };\n\n private _isUnmounted = false;\n\n componentDidMount() {\n this._isUnmounted = false;\n this.getMarkdown();\n }\n\n componentDidUpdate() {\n if (this.state.needUpdate) {\n this.getMarkdown();\n }\n }\n\n componentWillUnmount() {\n this._isUnmounted = true;\n }\n\n render() {\n switch (this.state.status) {\n case LoadStatus.Success:\n return this.renderText();\n case LoadStatus.Pending:\n return this.renderLoader();\n default:\n return this.renderError();\n }\n }\n\n private renderLoader() {\n return (\n <div className={b({loading: true})}>\n <div className={b('loader')}>\n <div className={b('loader-view')}>\n <Loader size=\"m\" />\n </div>\n </div>\n </div>\n );\n }\n\n private renderError() {\n return (\n <div className={b({error: true})}>\n <div className={b('error')}>{i18n('label_render-markdown-error')}</div>\n <br />\n <Button view=\"action\" size=\"m\" onClick={this.onRetryClick}>\n {i18n('button_retry')}\n </Button>\n <br />\n </div>\n );\n }\n\n private renderText() {\n return (\n <div\n className={b({withMarkdown: this.withMarkdown})}\n data-qa={this.props.qa}\n {...{[PLUGIN_ROOT_ATTR_NAME]: 'text'}}\n >\n {this.withMarkdown ? (\n <div\n className=\"yfm\" // className из стилей для markdown\n dangerouslySetInnerHTML={{__html: this.state.htmlText}}\n />\n ) : (\n this.state.text\n )}\n </div>\n );\n }\n\n private async getMarkdown() {\n if (typeof this.props.apiHandler !== 'function') {\n return;\n }\n this.setState({status: LoadStatus.Pending});\n\n const onLoadComplete = this.props.onBeforeLoad();\n\n try {\n let htmlText = '';\n if (this.state.text && this.state.text.trim()) {\n const loadedData = await this.props.apiHandler({text: this.state.text});\n htmlText = loadedData.result;\n }\n if (this._isUnmounted) {\n return;\n }\n this.setState({\n htmlText,\n status: LoadStatus.Success,\n });\n } catch (e) {\n if (this._isUnmounted) {\n return;\n }\n this.setState({status: LoadStatus.Fail});\n }\n onLoadComplete();\n }\n\n private onRetryClick = () => {\n this.getMarkdown();\n };\n\n get withMarkdown() {\n return typeof this.props.apiHandler === 'function';\n }\n}\n\ntype PluginDataProps = Omit<PluginTextProps, 'apiHandler'>;\n\nexport type PluginTextObjectSettings = {apiHandler?: PluginTextApiHandler};\n\nexport type PluginTextObject = Plugin<PluginDataProps> & {\n setSettings: (settings: PluginTextObjectSettings) => PluginTextObject;\n _apiHandler?: PluginTextApiHandler;\n};\n\nconst plugin: PluginTextObject = {\n type: 'text',\n defaultLayout: {w: 12, h: 6},\n setSettings(settings) {\n const {apiHandler} = settings;\n plugin._apiHandler = apiHandler;\n return plugin;\n },\n renderer(props, forwardedRef) {\n return <PluginText {...props} apiHandler={plugin._apiHandler} ref={forwardedRef} />;\n },\n};\n\nexport default plugin;\n"]}
@@ -17,6 +17,7 @@ export interface PluginTextProps extends PluginWidgetProps {
17
17
  text: string;
18
18
  } & PluginWidgetProps['data'];
19
19
  onBeforeRender: () => () => void;
20
+ qa?: string;
20
21
  }
21
22
  interface PluginTextState {
22
23
  htmlText: string;
@@ -69,7 +69,7 @@ export class PluginText extends React.PureComponent {
69
69
  React.createElement("br", null)));
70
70
  }
71
71
  renderText() {
72
- return (React.createElement("div", { className: b({ withMarkdown: this.withMarkdown }), [PLUGIN_ROOT_ATTR_NAME]: 'text' }, this.withMarkdown ? (React.createElement("div", { className: "yfm" // className из стилей для markdown
72
+ return (React.createElement("div", { className: b({ withMarkdown: this.withMarkdown }), "data-qa": this.props.qa, [PLUGIN_ROOT_ATTR_NAME]: 'text' }, this.withMarkdown ? (React.createElement("div", { className: "yfm" // className из стилей для markdown
73
73
  , dangerouslySetInnerHTML: { __html: this.state.htmlText } })) : (this.state.text)));
74
74
  }
75
75
  async getMarkdown() {
@@ -1 +1 @@
1
- {"version":3,"file":"Text.js","sourceRoot":"../../../../src","sources":["plugins/Text/Text.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {Button, Loader} from '@gravity-ui/uikit';\n\nimport {i18n} from '../../i18n';\nimport {Plugin, PluginWidgetProps} from '../../typings';\nimport {cn} from '../../utils/cn';\nimport {PLUGIN_ROOT_ATTR_NAME} from '../constants';\n\nimport './Text.scss';\n\n// need to set markdown styles separately\n// for instance can use yfm-transform\n\nconst b = cn('dashkit-plugin-text');\n\nenum LoadStatus {\n Pending = 'pending',\n Success = 'success',\n Fail = 'fail',\n}\n\nexport type PluginTextApiHandler = (data: {text: string}) => Promise<{result: string}>;\n\nexport interface PluginTextProps extends PluginWidgetProps {\n apiHandler?: PluginTextApiHandler;\n data: {\n text: string;\n } & PluginWidgetProps['data'];\n onBeforeRender: () => () => void;\n}\n\ninterface PluginTextState {\n htmlText: string;\n status: LoadStatus;\n needUpdate?: boolean;\n text?: string;\n}\n\nexport class PluginText extends React.PureComponent<PluginTextProps, PluginTextState> {\n static getDerivedStateFromProps(props: PluginTextProps, state: PluginTextState) {\n const {\n data: {text},\n } = props;\n const needUpdate = text !== state.text;\n return {\n text,\n needUpdate,\n };\n }\n\n state: PluginTextState = {\n htmlText: '',\n status: this.withMarkdown ? LoadStatus.Pending : LoadStatus.Success,\n };\n\n private _isUnmounted = false;\n\n componentDidMount() {\n this._isUnmounted = false;\n this.getMarkdown();\n }\n\n componentDidUpdate() {\n if (this.state.needUpdate) {\n this.getMarkdown();\n }\n }\n\n componentWillUnmount() {\n this._isUnmounted = true;\n }\n\n render() {\n switch (this.state.status) {\n case LoadStatus.Success:\n return this.renderText();\n case LoadStatus.Pending:\n return this.renderLoader();\n default:\n return this.renderError();\n }\n }\n\n private renderLoader() {\n return (\n <div className={b({loading: true})}>\n <div className={b('loader')}>\n <div className={b('loader-view')}>\n <Loader size=\"m\" />\n </div>\n </div>\n </div>\n );\n }\n\n private renderError() {\n return (\n <div className={b({error: true})}>\n <div className={b('error')}>{i18n('label_render-markdown-error')}</div>\n <br />\n <Button view=\"action\" size=\"m\" onClick={this.onRetryClick}>\n {i18n('button_retry')}\n </Button>\n <br />\n </div>\n );\n }\n\n private renderText() {\n return (\n <div\n className={b({withMarkdown: this.withMarkdown})}\n {...{[PLUGIN_ROOT_ATTR_NAME]: 'text'}}\n >\n {this.withMarkdown ? (\n <div\n className=\"yfm\" // className из стилей для markdown\n dangerouslySetInnerHTML={{__html: this.state.htmlText}}\n />\n ) : (\n this.state.text\n )}\n </div>\n );\n }\n\n private async getMarkdown() {\n if (typeof this.props.apiHandler !== 'function') {\n return;\n }\n this.setState({status: LoadStatus.Pending});\n\n const onLoadComplete = this.props.onBeforeLoad();\n\n try {\n let htmlText = '';\n if (this.state.text && this.state.text.trim()) {\n const loadedData = await this.props.apiHandler({text: this.state.text});\n htmlText = loadedData.result;\n }\n if (this._isUnmounted) {\n return;\n }\n this.setState({\n htmlText,\n status: LoadStatus.Success,\n });\n } catch (e) {\n if (this._isUnmounted) {\n return;\n }\n this.setState({status: LoadStatus.Fail});\n }\n onLoadComplete();\n }\n\n private onRetryClick = () => {\n this.getMarkdown();\n };\n\n get withMarkdown() {\n return typeof this.props.apiHandler === 'function';\n }\n}\n\ntype PluginDataProps = Omit<PluginTextProps, 'apiHandler'>;\n\nexport type PluginTextObjectSettings = {apiHandler?: PluginTextApiHandler};\n\nexport type PluginTextObject = Plugin<PluginDataProps> & {\n setSettings: (settings: PluginTextObjectSettings) => PluginTextObject;\n _apiHandler?: PluginTextApiHandler;\n};\n\nconst plugin: PluginTextObject = {\n type: 'text',\n defaultLayout: {w: 12, h: 6},\n setSettings(settings) {\n const {apiHandler} = settings;\n plugin._apiHandler = apiHandler;\n return plugin;\n },\n renderer(props, forwardedRef) {\n return <PluginText {...props} apiHandler={plugin._apiHandler} ref={forwardedRef} />;\n },\n};\n\nexport default plugin;\n"]}
1
+ {"version":3,"file":"Text.js","sourceRoot":"../../../../src","sources":["plugins/Text/Text.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {Button, Loader} from '@gravity-ui/uikit';\n\nimport {i18n} from '../../i18n';\nimport {Plugin, PluginWidgetProps} from '../../typings';\nimport {cn} from '../../utils/cn';\nimport {PLUGIN_ROOT_ATTR_NAME} from '../constants';\n\nimport './Text.scss';\n\n// need to set markdown styles separately\n// for instance can use yfm-transform\n\nconst b = cn('dashkit-plugin-text');\n\nenum LoadStatus {\n Pending = 'pending',\n Success = 'success',\n Fail = 'fail',\n}\n\nexport type PluginTextApiHandler = (data: {text: string}) => Promise<{result: string}>;\n\nexport interface PluginTextProps extends PluginWidgetProps {\n apiHandler?: PluginTextApiHandler;\n data: {\n text: string;\n } & PluginWidgetProps['data'];\n onBeforeRender: () => () => void;\n qa?: string;\n}\n\ninterface PluginTextState {\n htmlText: string;\n status: LoadStatus;\n needUpdate?: boolean;\n text?: string;\n}\n\nexport class PluginText extends React.PureComponent<PluginTextProps, PluginTextState> {\n static getDerivedStateFromProps(props: PluginTextProps, state: PluginTextState) {\n const {\n data: {text},\n } = props;\n const needUpdate = text !== state.text;\n return {\n text,\n needUpdate,\n };\n }\n\n state: PluginTextState = {\n htmlText: '',\n status: this.withMarkdown ? LoadStatus.Pending : LoadStatus.Success,\n };\n\n private _isUnmounted = false;\n\n componentDidMount() {\n this._isUnmounted = false;\n this.getMarkdown();\n }\n\n componentDidUpdate() {\n if (this.state.needUpdate) {\n this.getMarkdown();\n }\n }\n\n componentWillUnmount() {\n this._isUnmounted = true;\n }\n\n render() {\n switch (this.state.status) {\n case LoadStatus.Success:\n return this.renderText();\n case LoadStatus.Pending:\n return this.renderLoader();\n default:\n return this.renderError();\n }\n }\n\n private renderLoader() {\n return (\n <div className={b({loading: true})}>\n <div className={b('loader')}>\n <div className={b('loader-view')}>\n <Loader size=\"m\" />\n </div>\n </div>\n </div>\n );\n }\n\n private renderError() {\n return (\n <div className={b({error: true})}>\n <div className={b('error')}>{i18n('label_render-markdown-error')}</div>\n <br />\n <Button view=\"action\" size=\"m\" onClick={this.onRetryClick}>\n {i18n('button_retry')}\n </Button>\n <br />\n </div>\n );\n }\n\n private renderText() {\n return (\n <div\n className={b({withMarkdown: this.withMarkdown})}\n data-qa={this.props.qa}\n {...{[PLUGIN_ROOT_ATTR_NAME]: 'text'}}\n >\n {this.withMarkdown ? (\n <div\n className=\"yfm\" // className из стилей для markdown\n dangerouslySetInnerHTML={{__html: this.state.htmlText}}\n />\n ) : (\n this.state.text\n )}\n </div>\n );\n }\n\n private async getMarkdown() {\n if (typeof this.props.apiHandler !== 'function') {\n return;\n }\n this.setState({status: LoadStatus.Pending});\n\n const onLoadComplete = this.props.onBeforeLoad();\n\n try {\n let htmlText = '';\n if (this.state.text && this.state.text.trim()) {\n const loadedData = await this.props.apiHandler({text: this.state.text});\n htmlText = loadedData.result;\n }\n if (this._isUnmounted) {\n return;\n }\n this.setState({\n htmlText,\n status: LoadStatus.Success,\n });\n } catch (e) {\n if (this._isUnmounted) {\n return;\n }\n this.setState({status: LoadStatus.Fail});\n }\n onLoadComplete();\n }\n\n private onRetryClick = () => {\n this.getMarkdown();\n };\n\n get withMarkdown() {\n return typeof this.props.apiHandler === 'function';\n }\n}\n\ntype PluginDataProps = Omit<PluginTextProps, 'apiHandler'>;\n\nexport type PluginTextObjectSettings = {apiHandler?: PluginTextApiHandler};\n\nexport type PluginTextObject = Plugin<PluginDataProps> & {\n setSettings: (settings: PluginTextObjectSettings) => PluginTextObject;\n _apiHandler?: PluginTextApiHandler;\n};\n\nconst plugin: PluginTextObject = {\n type: 'text',\n defaultLayout: {w: 12, h: 6},\n setSettings(settings) {\n const {apiHandler} = settings;\n plugin._apiHandler = apiHandler;\n return plugin;\n },\n renderer(props, forwardedRef) {\n return <PluginText {...props} apiHandler={plugin._apiHandler} ref={forwardedRef} />;\n },\n};\n\nexport default plugin;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/dashkit",
3
- "version": "9.0.0",
3
+ "version": "9.1.0",
4
4
  "description": "Library for rendering dashboard grid layout",
5
5
  "license": "MIT",
6
6
  "repository": {