Skip to content

Commit

Permalink
Implement remembrance into the import webdav dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Feb 1, 2025
1 parent dd59f3e commit 8439c23
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 21 deletions.
64 changes: 62 additions & 2 deletions src/core/webdavconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,11 +224,10 @@ void WebdavConnection::processDirParserFinished()
}
}
}
mAvailablePaths.sort();

mIsFetchingAvailablePaths = false;
emit isFetchingAvailablePathsChanged();

mAvailablePaths.sort();
emit availablePathsChanged();
}
else if ( mIsImportingPath || mIsDownloadingPath )
Expand Down Expand Up @@ -419,6 +418,12 @@ void WebdavConnection::getWebdavItems()
jsonFile.write( jsonDocument.toJson() );
jsonFile.close();

QSettings settings;
settings.beginGroup( QStringLiteral( "/qfield/webdavImports/%1/users/%2" ).arg( QUrl::toPercentEncoding( mUrl ), QUrl::toPercentEncoding( mUsername ) ) );
settings.setValue( QStringLiteral( "lastImportPath" ), mProcessRemotePath );
settings.setValue( QStringLiteral( "lastImportTime" ), QDateTime::currentDateTime() );
settings.endGroup();

mIsImportingPath = false;
emit isImportingPathChanged();
emit importSuccessful( mProcessLocalPath );
Expand All @@ -431,6 +436,61 @@ void WebdavConnection::getWebdavItems()
}
}

QVariantMap WebdavConnection::importHistory()
{
QVariantMap history;

QSettings settings;
settings.beginGroup( QStringLiteral( "/qfield/webdavImports" ) );
const QStringList urls = settings.childGroups();
settings.endGroup();

QDateTime lastUrlImportTime( QDate( 1900, 0, 0 ), QTime( 0, 0, 0, 0 ) );
QString lastUrl;
QVariantMap urlsDetails;
for ( const QString &url : urls )
{
const QString decodedUrl = QUrl::fromPercentEncoding( url.toLatin1() );
settings.beginGroup( QStringLiteral( "/qfield/webdavImports/%1/users" ).arg( url ) );
const QStringList users = settings.childGroups();
settings.endGroup();

QDateTime lastUserImportTime( QDate( 1900, 0, 0 ), QTime( 0, 0, 0, 0 ) );
QString lastUser;
QVariantMap usersDetails;
for ( const QString &user : users )
{
const QString decodedUser = QUrl::fromPercentEncoding( user.toLatin1() );
settings.beginGroup( QStringLiteral( "/qfield/webdavImports/%1/users/%2" ).arg( url, user ) );

QVariantMap details;
details["lastImportPath"] = settings.value( "lastImportPath" ).toString();
usersDetails[decodedUser] = details;

if ( lastUserImportTime < settings.value( "lastImportTime" ).toDateTime() )
{
lastUserImportTime = settings.value( "lastImportTime" ).toDateTime();
lastUser = decodedUser;
}
if ( lastUrlImportTime < settings.value( "lastImportTime" ).toDateTime() )
{
lastUrlImportTime = settings.value( "lastImportTime" ).toDateTime();
lastUrl = decodedUrl;
}
}

QVariantMap details;
details["users"] = usersDetails;
details["lastUser"] = lastUser;
urlsDetails[decodedUrl] = details;
}

history["urls"] = urlsDetails;
history["lastUrl"] = lastUrl;

return history;
}

void WebdavConnection::putLocalItems()
{
if ( !mWebdavMkDirs.isEmpty() )
Expand Down
2 changes: 2 additions & 0 deletions src/core/webdavconnection.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ class WebdavConnection : public QObject

Q_INVOKABLE static bool hasWebdavConfiguration( const QString &path );

Q_INVOKABLE static QVariantMap importHistory();

signals:
void urlChanged();
void usernameChanged();
Expand Down
93 changes: 74 additions & 19 deletions src/qml/QFieldLocalDataPickerScreen.qml
Original file line number Diff line number Diff line change
Expand Up @@ -898,6 +898,18 @@ Page {
onImportSuccessful: path => {
table.model.currentPath = path;
}

onIsFetchingAvailablePathsChanged: {
if (!isFetchingAvailablePaths && importWebdavDialog.visible) {
importWebdavPathInput.model = [""].concat(availablePaths);
if (importWebdavDialog.importHistory["urls"][url] !== undefined && importWebdavDialog.importHistory["urls"][url]["users"][username] !== undefined) {
const index = importWebdavPathInput.find(importWebdavDialog.importHistory["urls"][url]["users"][username]["lastImportPath"]);
if (index >= 0) {
importWebdavPathInput.currentIndex = index;
}
}
}
}
}
}
}
Expand Down Expand Up @@ -1006,10 +1018,21 @@ Page {
focus: visible
parent: mainWindow.contentItem

property var importHistory: undefined

onAboutToShow: {
if (webdavConnectionLoader.item) {
webdavConnectionLoader.item.url = importWebdavUrlInput.text;
webdavConnectionLoader.item.username = importWebdavUserInput.text;
importHistory = webdavConnectionLoader.item.importHistory();
importWebdavUrlInput.model = [""].concat(Object.keys(importHistory["urls"]));
if (importHistory["lastUrl"] !== "") {
importWebdavUrlInput.editText = importHistory["lastUrl"];
importWebdavUserInput.model = [""].concat(Object.keys(importHistory["urls"][importHistory["lastUrl"]]["users"]));
importWebdavUserInput.editText = importHistory["urls"][importHistory["lastUrl"]]["lastUser"];
} else {
importWebdavUserInput.model = [];
}
webdavConnectionLoader.item.url = importWebdavUrlInput.editText;
webdavConnectionLoader.item.username = importWebdavUserInput.editText;
webdavConnectionLoader.item.password = importWebdavPasswordInput.text;
webdavConnectionLoader.item.storePassword = importWebdavStorePasswordCheck.checked;
}
Expand All @@ -1035,28 +1058,60 @@ Page {
color: Theme.mainTextColor
}

TextField {
Label {
width: importWebdavUrlLabel.width
text: qsTr("WebDAV server URL")
wrapMode: Text.WordWrap
font: Theme.defaultFont
color: Theme.secondaryTextColor
}

ComboBox {
id: importWebdavUrlInput
enabled: !webdavConnectionLoader.item || !webdavConnectionLoader.item.isFetchingAvailablePaths
width: importWebdavUrlLabel.width
placeholderText: qsTr("WebDAV server URL")

onDisplayTextChanged: {
if (webdavConnectionLoader.item) {
webdavConnectionLoader.item.url = displayText;
editable: true

Connections {
target: importWebdavUrlInput.contentItem
ignoreUnknownSignals: true

function onDisplayTextChanged() {
if (webdavConnectionLoader.item && webdavConnectionLoader.item.url !== importWebdavUrlInput.editText) {
webdavConnectionLoader.item.url = importWebdavUrlInput.editText;
if (importWebdavDialog.importHistory["urls"][importWebdavUrlInput.editText] !== undefined) {
importWebdavUserInput.model = [""].concat(Object.keys(importWebdavDialog.importHistory["urls"][importWebdavUrlInput.editText]["users"]));
importWebdavUserInput.editText = importWebdavDialog.importHistory["urls"][importWebdavUrlInput.editText]["lastUser"];
} else {
importWebdavUserInput.model = [];
}
}
}
}
}

TextField {
Label {
width: importWebdavUrlLabel.width
text: qsTr("User and password")
wrapMode: Text.WordWrap
font: Theme.defaultFont
color: Theme.secondaryTextColor
}

ComboBox {
id: importWebdavUserInput
enabled: !webdavConnectionLoader.item || !webdavConnectionLoader.item.isFetchingAvailablePaths
width: importWebdavUrlLabel.width
placeholderText: qsTr("User")
editable: true

onDisplayTextChanged: {
if (webdavConnectionLoader.item) {
webdavConnectionLoader.item.username = displayText;
Connections {
target: importWebdavUserInput.contentItem
ignoreUnknownSignals: true

function onDisplayTextChanged() {
if (webdavConnectionLoader.item) {
webdavConnectionLoader.item.username = importWebdavUserInput.editText;
}
}
}
}
Expand All @@ -1066,7 +1121,7 @@ Page {
enabled: !webdavConnectionLoader.item || !webdavConnectionLoader.item.isFetchingAvailablePaths
width: importWebdavUrlLabel.width
rightPadding: leftPadding + (importWebdavShowPasswordInput.width - leftPadding)
placeholderText: text === "" && webdavConnectionLoader.item && webdavConnectionLoader.item.isPasswordStored ? qsTr("Password (leave empty to use remembered)") : qsTr("Password")
placeholderText: text === "" && webdavConnectionLoader.item && webdavConnectionLoader.item.isPasswordStored ? qsTr("leave empty to use remembered") : ""
echoMode: TextInput.Password

onDisplayTextChanged: {
Expand Down Expand Up @@ -1123,7 +1178,7 @@ Page {
QfButton {
id: importWebdavFetchFoldersButton
anchors.verticalCenter: importWebdavPathInput.verticalCenter
visible: !webdavConnectionLoader.item || webdavConnectionLoader.item.availablePaths.length === 0
visible: importWebdavPathInput.count <= 1
enabled: !webdavConnectionLoader.item || !webdavConnectionLoader.item.isFetchingAvailablePaths
width: importWebdavUrlLabel.width - (importWebdavFetchFoldersIndicator.visible ? importWebdavFetchFoldersIndicator.width + 5 : 0)
text: !enabled ? qsTr("Fetching remote folders") : qsTr("Fetch remote folders")
Expand All @@ -1136,9 +1191,9 @@ Page {
ComboBox {
id: importWebdavPathInput
width: importWebdavUrlLabel.width - (importWebdavRefetchFoldersButton.width + 5) - (importWebdavFetchFoldersIndicator.visible ? importWebdavFetchFoldersIndicator.width + 5 : 0)
visible: webdavConnectionLoader.item && webdavConnectionLoader.item.availablePaths.length > 0
visible: importWebdavPathInput.count > 1
enabled: !webdavConnectionLoader.item || !webdavConnectionLoader.item.isFetchingAvailablePaths
model: [''].concat(webdavConnectionLoader.item ? webdavConnectionLoader.item.availablePaths : [])
model: ['']
}

QfToolButton {
Expand Down Expand Up @@ -1168,8 +1223,8 @@ Page {

onAccepted: {
if (importWebdavPathInput.displayText !== '' && webdavConnectionLoader.item) {
webdavConnectionLoader.item.url = importWebdavUrlInput.text;
webdavConnectionLoader.item.username = importWebdavUserInput.text;
webdavConnectionLoader.item.url = importWebdavUrlInput.editText;
webdavConnectionLoader.item.username = importWebdavUserInput.editText;
webdavConnectionLoader.item.password = importWebdavPasswordInput.text;
webdavConnectionLoader.item.storePassword = importWebdavStorePasswordCheck.checked;
webdavConnectionLoader.item.importPath(importWebdavPathInput.displayText, platformUtilities.applicationDirectory() + "Imported Projects/");
Expand Down

0 comments on commit 8439c23

Please sign in to comment.