From 3044cb73fb086535df3df32243eadcc2eb061f3c Mon Sep 17 00:00:00 2001 From: Mohsen Date: Fri, 2 Aug 2024 11:52:21 +0330 Subject: [PATCH 1/7] translate server side error messages. --- src/qml/QFieldCloudPopup.qml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/qml/QFieldCloudPopup.qml b/src/qml/QFieldCloudPopup.qml index 5ebc1fd9ba..bcac7b7a2a 100644 --- a/src/qml/QFieldCloudPopup.qml +++ b/src/qml/QFieldCloudPopup.qml @@ -304,6 +304,15 @@ Popup { titleText: detailsText.startsWith('[QF/') ? qsTr('A server error has occured, please try again.') : qsTr('A network error has occured, please try again.') detailsText: '' + function humanizeError(errorString) { + if (errorString.includes("Network Error")) { + errorString = "Network Error"; + } else if (errorString.includes("Quota Error")) { + errorString = "Quota Error"; + } + return errorString; + } + Connections { target: iface @@ -318,14 +327,14 @@ Popup { function onPushFinished(projectId, hasError, errorString) { transferError.hasError = hasError; if (transferError.visible) { - transferError.detailsText = errorString; + transferError.detailsText = transferError.humanizeError(errorString); } } function onProjectDownloaded(projectId, projectName, hasError, errorString) { transferError.hasError = hasError; if (transferError.visible) { - transferError.detailsText = errorString; + transferError.detailsText = transferError.humanizeError(errorString); } const projectData = cloudProjectsModel.getProjectData(projectId); if (projectData.PackagedLayerErrors.length !== 0) { From f1a46d5f9e043a536a730f026e52b722b85fb58a Mon Sep 17 00:00:00 2001 From: Mohsen Date: Fri, 2 Aug 2024 18:31:45 +0330 Subject: [PATCH 2/7] Move function to QFieldCloudUtils and add a reference to docs. --- src/core/utils/qfieldcloudutils.cpp | 28 ++++++++++ src/core/utils/qfieldcloudutils.h | 16 ++++++ src/qml/QFieldCloudPopup.qml | 16 ++---- .../imports/Theme/QfCollapsibleMessage.qml | 55 ++++++++++++------- 4 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/core/utils/qfieldcloudutils.cpp b/src/core/utils/qfieldcloudutils.cpp index c7fafa1a7f..8c24b9ff97 100644 --- a/src/core/utils/qfieldcloudutils.cpp +++ b/src/core/utils/qfieldcloudutils.cpp @@ -77,6 +77,34 @@ const QString QFieldCloudUtils::getProjectId( const QString &fileName ) return QString(); } +const QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorMessage ) +{ + QString resultErrorMessage = errorMessage.startsWith( "[QF/" ) ? tr( "A server error has occured, please try again." ) : tr( "A network error has occured, please try again." ); + + const QString OVER_QUOTA( "over_quota" ); + + if ( errorMessage.contains( OVER_QUOTA ) ) + { + resultErrorMessage = "Your account's available storage is full."; + } + + return resultErrorMessage; +} + +const QString QFieldCloudUtils::documentationFromErrorString( const QString &errorMessage ) +{ + QString linkToDocumentation; + + const QString OVER_QUOTA( "over_quota" ); + + if ( errorMessage.contains( OVER_QUOTA ) ) + { + linkToDocumentation = "https://docs.qfield.org/get-started/storage-qfc/"; + } + + return linkToDocumentation; +} + void QFieldCloudUtils::setProjectSetting( const QString &projectId, const QString &setting, const QVariant &value ) { thread_local QgsSettings settings; diff --git a/src/core/utils/qfieldcloudutils.h b/src/core/utils/qfieldcloudutils.h index e23f1ba9c5..93a24f69e1 100644 --- a/src/core/utils/qfieldcloudutils.h +++ b/src/core/utils/qfieldcloudutils.h @@ -99,6 +99,22 @@ class QFieldCloudUtils : public QObject */ Q_INVOKABLE static const QString getProjectId( const QString &fileName ); + /** + * Returns user-friendly message. + * + * @param errorMessage reveiced error message + * @return const QString + */ + Q_INVOKABLE static const QString userFriendlyErrorString( const QString &errorMessage ); + + /** + * Returns link to documentation page related to error message. + * + * @param errorMessage reveiced error message + * @return const QString + */ + Q_INVOKABLE static const QString documentationFromErrorString( const QString &errorMessage ); + //! Sets a \a setting to a given \a value for project with given \a projectId to the permanent storage. static void setProjectSetting( const QString &projectId, const QString &setting, const QVariant &value ); diff --git a/src/qml/QFieldCloudPopup.qml b/src/qml/QFieldCloudPopup.qml index bcac7b7a2a..1a0cd50f6e 100644 --- a/src/qml/QFieldCloudPopup.qml +++ b/src/qml/QFieldCloudPopup.qml @@ -301,18 +301,10 @@ Popup { detailsColor: Theme.secondaryTextColor font: Theme.tipFont - titleText: detailsText.startsWith('[QF/') ? qsTr('A server error has occured, please try again.') : qsTr('A network error has occured, please try again.') + externalLink: QFieldCloudUtils.documentationFromErrorString(detailsText) + titleText: QFieldCloudUtils.userFriendlyErrorString(detailsText) detailsText: '' - function humanizeError(errorString) { - if (errorString.includes("Network Error")) { - errorString = "Network Error"; - } else if (errorString.includes("Quota Error")) { - errorString = "Quota Error"; - } - return errorString; - } - Connections { target: iface @@ -327,14 +319,14 @@ Popup { function onPushFinished(projectId, hasError, errorString) { transferError.hasError = hasError; if (transferError.visible) { - transferError.detailsText = transferError.humanizeError(errorString); + transferError.detailsText = errorString; } } function onProjectDownloaded(projectId, projectName, hasError, errorString) { transferError.hasError = hasError; if (transferError.visible) { - transferError.detailsText = transferError.humanizeError(errorString); + transferError.detailsText = errorString; } const projectData = cloudProjectsModel.getProjectData(projectId); if (projectData.PackagedLayerErrors.length !== 0) { diff --git a/src/qml/imports/Theme/QfCollapsibleMessage.qml b/src/qml/imports/Theme/QfCollapsibleMessage.qml index d1b65b55ec..562624e956 100644 --- a/src/qml/imports/Theme/QfCollapsibleMessage.qml +++ b/src/qml/imports/Theme/QfCollapsibleMessage.qml @@ -6,6 +6,7 @@ import Theme 1.0 Item { property bool collapsed: true + property string externalLink: "" property alias color: titleText.color property alias detailsColor: detailsText.color property alias font: titleText.font @@ -26,7 +27,6 @@ Item { Rectangle { id: background anchors.fill: parent - color: "transparent" border.color: titleText.color border.width: 1 @@ -36,28 +36,47 @@ Item { Text { id: titleText - width: parent.width - 5 anchors.top: parent.top anchors.left: parent.left - padding: 5 + leftPadding: 8 + topPadding: 10 + bottomPadding: 10 clip: true - font: Theme.defaultFont color: "black" - - horizontalAlignment: Text.AlignHCenter + horizontalAlignment: Text.AlignLeft wrapMode: Text.WordWrap } + ToolButton { + id: externalLinkButton + z: mainMouseArea.z + 1 + visible: externalLink !== '' + flat: false + text: "?" + anchors.verticalCenter: titleText.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 4 + highlighted: true + Material.accent: Theme.mainBackgroundColor + font.bold: true + onClicked: { + Qt.openUrlExternally(externalLink); + } + background: Rectangle { + implicitWidth: 30 + implicitHeight: 30 + color: titleText.color + radius: background.radius + } + } + Rectangle { id: separator - - width: parent.width - 24 + width: parent.width - 36 anchors.top: titleText.bottom - anchors.left: parent.left - anchors.leftMargin: 12 - + anchors.horizontalCenter: parent.horizontalCenter height: 1 color: titleText.color opacity: 0.25 @@ -65,27 +84,25 @@ Item { Text { id: detailsText - width: parent.width - 5 anchors.top: separator.bottom - anchors.left: parent.left - padding: 5 + anchors.right: externalLinkButton.left + anchors.left: titleText.left + leftPadding: 8 + topPadding: 10 + bottomPadding: 10 clip: true - font.pointSize: titleText.font.pointSize / 1.5 font.weight: titleText.font.weight font.italic: titleText.font.italic font.family: titleText.font.family - color: titleText.color - - horizontalAlignment: Text.AlignHCenter wrapMode: Text.WordWrap } MouseArea { + id: mainMouseArea anchors.fill: parent - onClicked: { parent.collapsed = !parent.collapsed; } From 7a900a966ec93de60c1a4c7a97a55791b5d0ddab Mon Sep 17 00:00:00 2001 From: Mohsen Date: Fri, 2 Aug 2024 20:39:54 +0330 Subject: [PATCH 3/7] Add a translate. --- src/core/utils/qfieldcloudutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/utils/qfieldcloudutils.cpp b/src/core/utils/qfieldcloudutils.cpp index 8c24b9ff97..756b12ea92 100644 --- a/src/core/utils/qfieldcloudutils.cpp +++ b/src/core/utils/qfieldcloudutils.cpp @@ -85,7 +85,7 @@ const QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorMes if ( errorMessage.contains( OVER_QUOTA ) ) { - resultErrorMessage = "Your account's available storage is full."; + resultErrorMessage = tr( "Your account's available storage is full." ); } return resultErrorMessage; From 6ffdbbecc4cbecf09a2de35fba8ae1967145dc92 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Sat, 3 Aug 2024 16:41:46 +0330 Subject: [PATCH 4/7] Remove extra const keyword. --- src/core/utils/qfieldcloudutils.cpp | 4 ++-- src/core/utils/qfieldcloudutils.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/utils/qfieldcloudutils.cpp b/src/core/utils/qfieldcloudutils.cpp index 756b12ea92..f78e4d759b 100644 --- a/src/core/utils/qfieldcloudutils.cpp +++ b/src/core/utils/qfieldcloudutils.cpp @@ -77,7 +77,7 @@ const QString QFieldCloudUtils::getProjectId( const QString &fileName ) return QString(); } -const QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorMessage ) +QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorMessage ) { QString resultErrorMessage = errorMessage.startsWith( "[QF/" ) ? tr( "A server error has occured, please try again." ) : tr( "A network error has occured, please try again." ); @@ -91,7 +91,7 @@ const QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorMes return resultErrorMessage; } -const QString QFieldCloudUtils::documentationFromErrorString( const QString &errorMessage ) +QString QFieldCloudUtils::documentationFromErrorString( const QString &errorMessage ) { QString linkToDocumentation; diff --git a/src/core/utils/qfieldcloudutils.h b/src/core/utils/qfieldcloudutils.h index 93a24f69e1..3a280bed9b 100644 --- a/src/core/utils/qfieldcloudutils.h +++ b/src/core/utils/qfieldcloudutils.h @@ -105,7 +105,7 @@ class QFieldCloudUtils : public QObject * @param errorMessage reveiced error message * @return const QString */ - Q_INVOKABLE static const QString userFriendlyErrorString( const QString &errorMessage ); + Q_INVOKABLE static QString userFriendlyErrorString( const QString &errorMessage ); /** * Returns link to documentation page related to error message. @@ -113,7 +113,7 @@ class QFieldCloudUtils : public QObject * @param errorMessage reveiced error message * @return const QString */ - Q_INVOKABLE static const QString documentationFromErrorString( const QString &errorMessage ); + Q_INVOKABLE static QString documentationFromErrorString( const QString &errorMessage ); //! Sets a \a setting to a given \a value for project with given \a projectId to the permanent storage. static void setProjectSetting( const QString &projectId, const QString &setting, const QVariant &value ); From 18fcc0cf40fdb830e711526cc57b96d7e289d34a Mon Sep 17 00:00:00 2001 From: Mohsen Date: Sun, 4 Aug 2024 20:08:55 +0330 Subject: [PATCH 5/7] Fix PR issues. --- src/core/utils/qfieldcloudutils.cpp | 18 +++++++----------- src/core/utils/qfieldcloudutils.h | 19 +++++++++++-------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/core/utils/qfieldcloudutils.cpp b/src/core/utils/qfieldcloudutils.cpp index f78e4d759b..6b6dcd050a 100644 --- a/src/core/utils/qfieldcloudutils.cpp +++ b/src/core/utils/qfieldcloudutils.cpp @@ -77,27 +77,23 @@ const QString QFieldCloudUtils::getProjectId( const QString &fileName ) return QString(); } -QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorMessage ) +QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorString ) { - QString resultErrorMessage = errorMessage.startsWith( "[QF/" ) ? tr( "A server error has occured, please try again." ) : tr( "A network error has occured, please try again." ); + QString resultErrorString = errorString.startsWith( "[QF/" ) ? tr( "A server error has occured, please try again." ) : tr( "A network error has occured, please try again." ); - const QString OVER_QUOTA( "over_quota" ); - - if ( errorMessage.contains( OVER_QUOTA ) ) + if ( errorString.contains( ERROR_CODE_OVER_QUOTA ) ) { - resultErrorMessage = tr( "Your account's available storage is full." ); + resultErrorString = tr( "Your account's available storage is full." ); } - return resultErrorMessage; + return resultErrorString; } -QString QFieldCloudUtils::documentationFromErrorString( const QString &errorMessage ) +QString QFieldCloudUtils::documentationFromErrorString( const QString &errorString ) { QString linkToDocumentation; - const QString OVER_QUOTA( "over_quota" ); - - if ( errorMessage.contains( OVER_QUOTA ) ) + if ( errorString.contains( ERROR_CODE_OVER_QUOTA ) ) { linkToDocumentation = "https://docs.qfield.org/get-started/storage-qfc/"; } diff --git a/src/core/utils/qfieldcloudutils.h b/src/core/utils/qfieldcloudutils.h index 3a280bed9b..27413f230d 100644 --- a/src/core/utils/qfieldcloudutils.h +++ b/src/core/utils/qfieldcloudutils.h @@ -16,10 +16,13 @@ #ifndef QFIELDCLOUDUTILS_H #define QFIELDCLOUDUTILS_H +#define ERROR_CODE_OVER_QUOTA QString( "over_quota" ) + #include #include #include + class QString; class QFieldCloudProjectsModel; class DeltaFileWrapperTest; @@ -100,20 +103,20 @@ class QFieldCloudUtils : public QObject Q_INVOKABLE static const QString getProjectId( const QString &fileName ); /** - * Returns user-friendly message. + * Returns a user-friendly error message. * - * @param errorMessage reveiced error message - * @return const QString + * @param errorString the error string to be processed. + * @return A user-friendly error message that will be displayed to the user, translated based on received error code. */ - Q_INVOKABLE static QString userFriendlyErrorString( const QString &errorMessage ); + Q_INVOKABLE static QString userFriendlyErrorString( const QString &errorString ); /** - * Returns link to documentation page related to error message. + * Returns a documentation page hyperlink related to the provided error string. * - * @param errorMessage reveiced error message - * @return const QString + * @param errorString the error string to be processed + * @return The hyperlink to the documentation page related to the provided error code, or an empty string if no match is found. */ - Q_INVOKABLE static QString documentationFromErrorString( const QString &errorMessage ); + Q_INVOKABLE static QString documentationFromErrorString( const QString &errorString ); //! Sets a \a setting to a given \a value for project with given \a projectId to the permanent storage. static void setProjectSetting( const QString &projectId, const QString &setting, const QVariant &value ); From e6c73d13deaafa4ceb6cfb4718a0f57a8e7948a7 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Mon, 5 Aug 2024 18:30:08 +0330 Subject: [PATCH 6/7] Use static const instead of define. --- src/core/utils/qfieldcloudutils.cpp | 4 ++-- src/core/utils/qfieldcloudutils.h | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/core/utils/qfieldcloudutils.cpp b/src/core/utils/qfieldcloudutils.cpp index 6b6dcd050a..7ba3a458d1 100644 --- a/src/core/utils/qfieldcloudutils.cpp +++ b/src/core/utils/qfieldcloudutils.cpp @@ -81,7 +81,7 @@ QString QFieldCloudUtils::userFriendlyErrorString( const QString &errorString ) { QString resultErrorString = errorString.startsWith( "[QF/" ) ? tr( "A server error has occured, please try again." ) : tr( "A network error has occured, please try again." ); - if ( errorString.contains( ERROR_CODE_OVER_QUOTA ) ) + if ( errorString.contains( errorCodeOverQuota ) ) { resultErrorString = tr( "Your account's available storage is full." ); } @@ -93,7 +93,7 @@ QString QFieldCloudUtils::documentationFromErrorString( const QString &errorStri { QString linkToDocumentation; - if ( errorString.contains( ERROR_CODE_OVER_QUOTA ) ) + if ( errorString.contains( errorCodeOverQuota ) ) { linkToDocumentation = "https://docs.qfield.org/get-started/storage-qfc/"; } diff --git a/src/core/utils/qfieldcloudutils.h b/src/core/utils/qfieldcloudutils.h index 27413f230d..67d42a59f6 100644 --- a/src/core/utils/qfieldcloudutils.h +++ b/src/core/utils/qfieldcloudutils.h @@ -16,8 +16,6 @@ #ifndef QFIELDCLOUDUTILS_H #define QFIELDCLOUDUTILS_H -#define ERROR_CODE_OVER_QUOTA QString( "over_quota" ) - #include #include #include @@ -132,6 +130,9 @@ class QFieldCloudUtils : public QObject //! Adds removes a \a fileName for a given \a projectId to the pending attachments list static void removePendingAttachment( const QString &projectId, const QString &fileName ); + + private: + static inline const QString errorCodeOverQuota { QStringLiteral( "over_quota" ) }; }; #endif // QFIELDCLOUDUTILS_H From 9ea4392773aa5e29fc8515aeb45a8faef16afecd Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Tue, 6 Aug 2024 15:44:38 +0700 Subject: [PATCH 7/7] Update src/core/utils/qfieldcloudutils.cpp --- src/core/utils/qfieldcloudutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/utils/qfieldcloudutils.cpp b/src/core/utils/qfieldcloudutils.cpp index 7ba3a458d1..58dc175ecb 100644 --- a/src/core/utils/qfieldcloudutils.cpp +++ b/src/core/utils/qfieldcloudutils.cpp @@ -95,7 +95,7 @@ QString QFieldCloudUtils::documentationFromErrorString( const QString &errorStri if ( errorString.contains( errorCodeOverQuota ) ) { - linkToDocumentation = "https://docs.qfield.org/get-started/storage-qfc/"; + linkToDocumentation = "https://docs.qfield.org/get-started/storage-qfc/#add-qfieldcloud-storage"; } return linkToDocumentation;