diff --git a/app/assets/locales/locale-de.json b/app/assets/locales/locale-de.json index 6a5e99cfa1..92f877abb3 100644 --- a/app/assets/locales/locale-de.json +++ b/app/assets/locales/locale-de.json @@ -764,7 +764,8 @@ "synced": "Synced", "title": "BitShares", "unsynced": "Out of sync", - "update_available": "UPDATE AVAILABLE" + "update_available": "UPDATE AVAILABLE", + "debug_report": "Bericht" }, "gateway": { "add_funds": "Quickly and easily add funds to your BitShares account %(account)s. This service is provided by Openledger.", diff --git a/app/assets/locales/locale-en.json b/app/assets/locales/locale-en.json index 94f29e902f..73520159cd 100644 --- a/app/assets/locales/locale-en.json +++ b/app/assets/locales/locale-en.json @@ -455,8 +455,7 @@ "buy": "Buy", "buy_sell": "Buy/Sell", "buy_quick": "Quick Buy", - "buy_description": - "Buy %(baseAsset)s %(baseName)s for %(quoteAsset)s %(quoteName)s", + "buy_description": "Buy %(baseAsset)s %(baseName)s for %(quoteAsset)s %(quoteName)s", "buy_min": "Buy at least", "buysell_formatter": "{direction} {asset}", "call": "Call Price", @@ -779,7 +778,8 @@ "synced": "Synced", "title": "%(wallet_name)s", "unsynced": "Out of sync", - "update_available": "UPDATE AVAILABLE" + "update_available": "UPDATE AVAILABLE", + "debug_report": "Report" }, "gateway": { "add_funds": "Quickly and easily add funds to your %(wallet_name)s account %(account)s. This service is provided by Openledger.", @@ -1330,6 +1330,17 @@ "enter_refcode": "Enter referral code", "refcode_optional": "Referral Code (optional)" }, + "report": { + "advanced_report": "Advanced report", + "console_report": "Console report", + "copy_to_clipboard": "Copy to clipboard", + "hide": "Hide", + "title": "Error report", + "report_description": "This report collects the last entries in the console log and takes a screenshot of the current view before the modal is opened.", + "link_to_github": "Please report the issue you have found to GitHub:", + "how_to_report": "You can copy and paste (CTRL+V) the screenshot as well as the log entries directly into the issue content text area, pasting the screenshot also works in telegram chat.", + "security_report_link": "If your issue affects user security you might be eligible for a bounty. In that case do not report it publicly, but rather through:" + }, "settings": { "access": "Nodes", "access_text": "", diff --git a/app/assets/locales/locale-es.json b/app/assets/locales/locale-es.json index 4871bdc123..1327b50fe9 100644 --- a/app/assets/locales/locale-es.json +++ b/app/assets/locales/locale-es.json @@ -764,7 +764,8 @@ "synced": "Sincronizado", "title": "BitShares", "unsynced": "Fuera de sincronización", - "update_available": "ACTUALIZACIÓN DISPONIBLE" + "update_available": "ACTUALIZACIÓN DISPONIBLE", + "debug_report": "Informe" }, "gateway": { "add_funds": "Agregue fondos de manera rápida y fácil a su cuenta de BitShares %(account)s. Este servicio es provisto por Openledger.", diff --git a/app/assets/locales/locale-fr.json b/app/assets/locales/locale-fr.json index 9773109a69..d2fe77d7ee 100644 --- a/app/assets/locales/locale-fr.json +++ b/app/assets/locales/locale-fr.json @@ -764,7 +764,8 @@ "synced": "Synced", "title": "BitShares", "unsynced": "Out of sync", - "update_available": "UPDATE AVAILABLE" + "update_available": "UPDATE AVAILABLE", + "debug_report": "Rapport" }, "gateway": { "add_funds": "Quickly and easily add funds to your BitShares account %(account)s. This service is provided by Openledger.", diff --git a/app/assets/locales/locale-it.json b/app/assets/locales/locale-it.json index 5b880cd828..3b459fb5a0 100644 --- a/app/assets/locales/locale-it.json +++ b/app/assets/locales/locale-it.json @@ -764,7 +764,8 @@ "synced": "Sincronizzato", "title": "BitShares", "unsynced": "Fuori sincrono", - "update_available": "AGGIORNAMENTO DISPONIBILE" + "update_available": "AGGIORNAMENTO DISPONIBILE", + "debug_report": "Rapporto" }, "gateway": { "add_funds": "Aggiungi fondi rapidamente e facilmente al tuo account BitShares %(account)s. Questo servizio è fornito da Openledger.", diff --git a/app/assets/locales/locale-ja.json b/app/assets/locales/locale-ja.json index bfa66ada85..b1740f3c91 100644 --- a/app/assets/locales/locale-ja.json +++ b/app/assets/locales/locale-ja.json @@ -764,7 +764,8 @@ "synced": "同期しました", "title": "BitShares", "unsynced": "同期していません", - "update_available": "更新があります" + "update_available": "更新があります", + "debug_report": "報告書" }, "gateway": { "add_funds": "あなたのBitSharesアカウント%(account)sに素早く簡単に資金を追加します。 このサービスはOpenledgerによって提供されています。", diff --git a/app/assets/locales/locale-ko.json b/app/assets/locales/locale-ko.json index 696c3e007a..b26c484840 100644 --- a/app/assets/locales/locale-ko.json +++ b/app/assets/locales/locale-ko.json @@ -764,7 +764,8 @@ "synced": "Synced", "title": "비트쉐어 2.0", "unsynced": "Out of sync", - "update_available": "UPDATE AVAILABLE" + "update_available": "UPDATE AVAILABLE", + "debug_report": "보고서" }, "gateway": { "add_funds": "Quickly and easily add funds to your BitShares account %(account)s. This service is provided by Openledger.", diff --git a/app/assets/locales/locale-ru.json b/app/assets/locales/locale-ru.json index 9a423dc853..fc55bee0bd 100644 --- a/app/assets/locales/locale-ru.json +++ b/app/assets/locales/locale-ru.json @@ -764,7 +764,8 @@ "synced": "Синхронизирован", "title": "%(wallet_name)s", "unsynced": "Не синхронизирован", - "update_available": "ДОСТУПНО ОБНОВЛЕНИЕ" + "update_available": "ДОСТУПНО ОБНОВЛЕНИЕ", + "debug_report": "Отчет" }, "gateway": { "add_funds": "Быстро и легко добавьте средства на Ваш аккаунт %(wallet_name)s %(account)s. Эта услуга предоставляется Openledger.", @@ -873,8 +874,7 @@ "coming_soon": "Скоро", "min_amount": "Минимальная сумма: %(minAmount)s %(symbol)s", "min_amount_error": "Пожалуйста введите число >= минимума", - "support_block": - "Для получения поддержки, пожалуйста, свяжитесь с XBTS по адресу:", + "support_block": "Для получения поддержки, пожалуйста, свяжитесь с XBTS по адресу:", "under_construction": "Технические работы" }, "scan_qr": "Сканировать QR-код", diff --git a/app/assets/locales/locale-tr.json b/app/assets/locales/locale-tr.json index 95c022d6f3..7b9943c2d3 100644 --- a/app/assets/locales/locale-tr.json +++ b/app/assets/locales/locale-tr.json @@ -764,7 +764,8 @@ "synced": "Synced", "title": "Bitshares", "unsynced": "Out of sync", - "update_available": "UPDATE AVAILABLE" + "update_available": "UPDATE AVAILABLE", + "debug_report": "Rapor" }, "gateway": { "add_funds": "Quickly and easily add funds to your BitShares account %(account)s. This service is provided by Openledger.", diff --git a/app/assets/locales/locale-zh.json b/app/assets/locales/locale-zh.json index 55bb4a90fa..c6804511f9 100644 --- a/app/assets/locales/locale-zh.json +++ b/app/assets/locales/locale-zh.json @@ -764,7 +764,8 @@ "synced": "已同步", "title": "BitShares", "unsynced": "未同步", - "update_available": "有可用的更新" + "update_available": "有可用的更新", + "debug_report": "报告" }, "gateway": { "add_funds": "轻松快捷地对比特股账户 %(account)s 进行充值。此服务由 OpenLedger 提供。", diff --git a/app/assets/stylesheets/themes/_theme-template.scss b/app/assets/stylesheets/themes/_theme-template.scss index ec281eeee3..6ebf4bd309 100644 --- a/app/assets/stylesheets/themes/_theme-template.scss +++ b/app/assets/stylesheets/themes/_theme-template.scss @@ -57,19 +57,14 @@ $explorer--assets--bg ) { $hamburger-submenu-display-endpoint: 990px; - .explore-witness--info { width: 100%; - border: 1px solid $explorer--witnesses--info-border; background: $explorer--witnesses--info-bg; - padding: 12px; border-radius: 5px; - table { width: 100%; - thead { th { font-weight: 400; @@ -78,7 +73,6 @@ padding-bottom: 8px; } } - tbody { td { color: $explorer--witnesses--info-table-text-color; @@ -86,7 +80,6 @@ } } } - #incognito { background: $incognito-bg; } @@ -148,19 +141,15 @@ background-color: #fff; } } - .font-secondary { color: $secondary-text-color; } - svg > path { transition: all 0.3s ease 0s; } - #content-wrapper { @include color($primary-text-color, $bg-color); } - hr { border-color: $dark-text-color; background-color: $dark-text-color !important; @@ -214,6 +203,7 @@ .txtlabel.info { color: $info-color; } + .txtlabel.warning { color: $warning-color; } @@ -230,7 +220,6 @@ .txtann.warning { color: $warning-color; } - .txtann.error { color: $alert-color; } @@ -244,7 +233,6 @@ .notification-success { border-left-color: $success-color !important; } - .action-sheet { @include color($light-text-color, $super-light-panel-bg-color); &::after { @@ -257,7 +245,8 @@ @include color( $light-text-color, lighten($super-light-panel-bg-color, 4%) - ); // color: $link-text-color; + ); + // color: $link-text-color; } } } @@ -276,7 +265,6 @@ border-left-color: $super-light-panel-bg-color !important; } } - .json-inspector__key { color: $secondary-text-color !important; } @@ -288,7 +276,6 @@ h6 { color: $primary-text-color; } - // copyicons .copyIcon { background-color: $button-bg-color; @@ -296,12 +283,11 @@ background-color: $button-bg-color; } } - - .modal#marketPicker, .modal#settingsModal { + .modal#marketPicker, + .modal#settingsModal { background-color: $bg-color; border: 1px solid black; } - .modal { @include color($light-text-color, $account-cells); .modal__highlight { @@ -355,6 +341,7 @@ border-bottom: 1px solid lighten($bg-color, 4%); } } + .panel-left { @include color($light-text-color, $light-panel-bg-color); .block-list li > a { @@ -369,17 +356,15 @@ } .page-layout { background-color: lighten($account-header, 4%); - .column-header { > ul { border-bottom: 1px solid $panel-bg-color; - - > li.active, li:hover { + > li.active, + li:hover { border-bottom: 3px solid lightblue; } } } - .left-column { border-top-color: $bg-color; border-bottom-color: $bg-color; @@ -476,7 +461,6 @@ background-color: lighten($alert-color, 4%) !important; } } - .header a.button.create-account { transition: color 0s !important; color: $button-bg-color !important; @@ -608,7 +592,8 @@ } svg > path { fill: #fff; - } // svg:hover > path { fill: $primary-text-color; } + } + // svg:hover > path { fill: $primary-text-color; } } .settings-cog { svg > path { @@ -729,8 +714,7 @@ } > li > span { color: $light-text-color; - } - /* Hover state */ + } /* Hover state */ li:hover > span { @include color( $light-text-color, @@ -747,7 +731,6 @@ border-color: $secondary-text-color transparent; } } - .account-image { .icon:hover { svg path { @@ -902,7 +885,6 @@ border-bottom: 1px solid $button-bg-color; } } - // Tabs .tabs { border-bottom-color: $dark-text-color; @@ -1060,7 +1042,6 @@ color: $secondary-text-color; } } - // Formatted assets .facolor-success { color: $success-color; @@ -1077,7 +1058,6 @@ .facolor-error { color: $error-text-color; } - .facolor-fee { color: $fee-color; } @@ -1294,15 +1274,12 @@ color: $secondary-text-color; } } - div.exchange-content-header { background-color: transparent !important; } - .exchange-content-header { color: $light-text-color; background-color: transparent !important; - } // .block-content-header { // //text-transform: uppercase; @@ -1397,7 +1374,6 @@ height: 100%; width: 100%; } - #sticky-header-row { background-color: $panel-bg-color; } @@ -1433,7 +1409,6 @@ .stats .stressed-stat { padding: 10px 0; font-size: 16px; - &.is-call { color: $call-color !important; } @@ -1454,7 +1429,6 @@ font-size: 11px; color: gray; } - .buy-sell-box { background-color: $header-color; > select { @@ -1494,18 +1468,13 @@ text-transform: uppercase; cursor: pointer; } - - .table > tbody > tr:nth-of-type(even) { background-color: lighten($bg-color, 4%); } - .table.no-stripes > tbody > tr { background-color: transparent; - } - - //bottom stats + // bottom stats .bucket-option { @include button-focus($secondary-text-color, $panel-bg-color, 0); &:hover { @@ -1676,7 +1645,6 @@ border-bottom: 2px solid #020202; } } - ul.dashboard-links { > li.active { color: $primary-text-color; @@ -1728,7 +1696,6 @@ td.pub-key { word-break: break-all; } - /* Table view account */ div.grid-content.app-tables { background-color: $account-background; @@ -1889,7 +1856,6 @@ animation-direction: reverse; } } - @keyframes pulsate-green { 0% { color: $pulsate-green-start; @@ -1906,8 +1872,14 @@ color: $pulsate-red-end; } } - .introjs-launcher { + .debug-report-launcher { margin-left: 15px; + } + .introjs-launcher { + margin-left: 2px; + } + .introjs-launcher, + .debug-report-launcher { background-color: $bs-blue; padding: 0 10px; font-size: 18px; @@ -1977,7 +1949,6 @@ .order-book-button-v { display: none; } - @include breakpoint(large) { .order-book-button-v { display: inline-block; @@ -2094,7 +2065,6 @@ .qr-address-scanner { &-btn { background: #049cce; - height: 2.4rem; border-radius: 0 5px 5px 0; width: 40px; @@ -2154,31 +2124,27 @@ font-size: 0.7rem; height: 17px; margin: 0 0 1px 10px; + > option { background-color: $light-panel-bg-color; } } } - .table-highlight-hover { tr:hover { background-color: $settings-select-bg !important; } } - .table thead { background-color: $header-color !important; } - /* Ant Design Hacks */ .ant-select-arrow { color: $light-text-color !important; } - .ant-select-selection-selected-value { color: $light-text-color !important; } - .ant-input { border-left: 1px solid $super-light-panel-bg-color !important; border-top: 1px solid $super-light-panel-bg-color !important; @@ -2224,6 +2190,7 @@ } .clear-text:after { content: "X"; + display: block; width: 15px; height: 15px; diff --git a/app/components/Exchange/TradingViewPriceChart.jsx b/app/components/Exchange/TradingViewPriceChart.jsx index c8653df553..5f5eef3d90 100644 --- a/app/components/Exchange/TradingViewPriceChart.jsx +++ b/app/components/Exchange/TradingViewPriceChart.jsx @@ -119,13 +119,21 @@ export default class TradingViewPriceChart extends React.Component { return (
+ > +
+
); } diff --git a/app/components/Layout/Footer.jsx b/app/components/Layout/Footer.jsx index 493b0eab88..56bbe52a8d 100644 --- a/app/components/Layout/Footer.jsx +++ b/app/components/Layout/Footer.jsx @@ -21,6 +21,7 @@ import ZfApi from "react-foundation-apps/src/utils/foundation-api"; import {ChainStore} from "bitsharesjs"; import ifvisible from "ifvisible"; import {getWalletName} from "branding"; +import html2canvas from "html2canvas"; class Footer extends React.Component { static propTypes = { @@ -37,7 +38,10 @@ class Footer extends React.Component { this.state = { showNodesPopup: false, - showConnectingPopup: false + showConnectingPopup: false, + showTextArea: false, + screenshotURL: null, + showScreenshot: false }; this.confirmOutOfSync = { @@ -45,7 +49,13 @@ class Footer extends React.Component { shownOnce: false }; + this.debugReport = { + modal: null + }; + this.getNode = this.getNode.bind(this); + this.handleScreenshotButton = this.handleScreenshotButton.bind(this); + this.handleTextareaButton = this.handleTextareaButton.bind(this); } componentDidMount() { @@ -66,7 +76,10 @@ class Footer extends React.Component { nextProps.rpc_connection_status !== this.props.rpc_connection_status || nextProps.synced !== this.props.synced || - nextState.showNodesPopup !== this.state.showNodesPopup + nextState.showNodesPopup !== this.state.showNodesPopup || + nextState.showTextArea !== this.state.showTextArea || + nextState.showScreenshot !== this.state.showScreenshot || + nextState.screenshotURL !== this.state.screenshotURL ); } @@ -129,6 +142,57 @@ class Footer extends React.Component { } } + openInNewTab(url) { + window.open(url, "_blank").focus(); + } + + makeScreenshot() { + function doWork(ref, canvas) { + ref.setState({screenshotURL: canvas.toDataURL()}); + } + html2canvas(document.body) + .then(doWork.bind(null, this)) + .catch(console.error); + } + + renderConsoleMessages() { + let consoleMessages = JSON.parse( + localStorage.getItem("consoleMessages") + ); + + let textAreaValue = consoleMessages.reduce(function(sum, current) { + return sum + current + "\n"; + }, ""); + + return ( +