diff --git a/qml/pages/setup/AddServerConnectingPage.qml b/qml/pages/setup/AddServerConnectingPage.qml index 1f63a4d..2549afe 100644 --- a/qml/pages/setup/AddServerConnectingPage.qml +++ b/qml/pages/setup/AddServerConnectingPage.qml @@ -45,17 +45,17 @@ Page { Connections { target: ApiClient - onConnectionSuccess: { - console.log("Login success: " + loginMessage); - pageStack.replace(Qt.resolvedUrl("LoginDialog.qml"), {"loginMessage": loginMessage, "firstPage": firstPage}); - } - onConnectionFailed: function(error) { - console.log("Connection failed : " + error) - pageStack.pop(); - } - onNetworkError: { - console.log("ConnectingPage: popping page!") - pageStack.pop(); - } - } + onConnectionSuccess: { + console.log("Login success: " + loginMessage); + pageStack.replace(Qt.resolvedUrl("LoginDialog.qml"), {"loginMessage": loginMessage, "firstPage": firstPage}); + } + onConnectionFailed: function(error) { + console.log("Connection failed : " + error) + pageStack.pop(); + } + onNetworkError: { + console.log("ConnectingPage: popping page!") + pageStack.pop(); + } + } } diff --git a/qml/pages/setup/AddServerPage.qml b/qml/pages/setup/AddServerPage.qml index c6bdc5f..8c218f0 100644 --- a/qml/pages/setup/AddServerPage.qml +++ b/qml/pages/setup/AddServerPage.qml @@ -56,58 +56,58 @@ Dialog { ComboBox { id: serverSelect - label: qsTr("Server") - description: qsTr("Sailfin will try to search for Jellyfin servers on your local network automatically") - - menu: ContextMenu { - MenuItem { - // Special values are cool, aren't they? - readonly property string _address: manualAddress.text - readonly property string _name: manualAddress.text - text: qsTr("enter address manually") - } - Repeater { - model: serverModel - delegate: MenuItem { - readonly property string _address: address - readonly property string _name: name - text: qsTr("%1 - %2").arg(name).arg(address) - } - } - } - } - - TextField { - id: manualAddress - width: parent.width - clip: true - - label: qsTr("Server address") - placeholderText: qsTr("e.g. https://demo.jellyfin.org") - - enabled: serverSelect.currentIndex == 0 - visible: enabled - - inputMethodHints: Qt.ImhUrlCharactersOnly - validator: RegExpValidator { - regExp: /^https?:\/\/[a-zA-Z0-9-._~:/?#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+$/m - } - - EnterKey.enabled: addressCorrect - EnterKey.iconSource: "image://theme/icon-m-enter-accept" + label: qsTr("Server") + description: qsTr("Sailfin will try to search for Jellyfin servers on your local network automatically") + + menu: ContextMenu { + MenuItem { + // Special values are cool, aren't they? + readonly property string _address: manualAddress.text + readonly property string _name: manualAddress.text + text: qsTr("enter address manually") + } + Repeater { + model: serverModel + delegate: MenuItem { + readonly property string _address: address + readonly property string _name: name + text: qsTr("%1 - %2").arg(name).arg(address) + } + } + } + } + + TextField { + id: manualAddress + width: parent.width + clip: true + + label: qsTr("Server address") + placeholderText: qsTr("e.g. https://demo.jellyfin.org") + + enabled: serverSelect.currentIndex == 0 + visible: enabled + + inputMethodHints: Qt.ImhUrlCharactersOnly + validator: RegExpValidator { + regExp: /^https?:\/\/[a-zA-Z0-9-._~:/?#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+$/m + } + + EnterKey.enabled: addressCorrect + EnterKey.iconSource: "image://theme/icon-m-enter-accept" EnterKey.onClicked: accept() - } - } - - onOpened: serverModel.refresh() - canAccept: addressCorrect - - function tryConnect() { - console.log("Hi there!") - ApiClient.baseUrl = address; - //ApiClient.setupConnection() - //fakeTimer.start() - } - - onDone: tryConnect() + } + } + + onOpened: serverModel.refresh() + canAccept: addressCorrect + + function tryConnect() { + console.log("Hi there!") + ApiClient.baseUrl = address; + //ApiClient.setupConnection() + //fakeTimer.start() + } + + onDone: tryConnect() } diff --git a/qml/pages/setup/LoginDialog.qml b/qml/pages/setup/LoginDialog.qml index 07b7739..44fdafd 100644 --- a/qml/pages/setup/LoginDialog.qml +++ b/qml/pages/setup/LoginDialog.qml @@ -29,113 +29,113 @@ import "../../components" Dialog { id: loginDialog - property string loginMessage - property Page firstPage + property string loginMessage + property Page firstPage property string error - - allowedOrientations: Orientation.All - - - acceptDestination: Page { - BusyLabel { - text: qsTr("Logging in as %1").arg(username.text) - running: true - } - onStatusChanged: { - if(status == PageStatus.Active) { - ApiClient.authenticate(username.text, password.text, true) - } - } - - Connections { - target: ApiClient - onAuthenticatedChanged: { - if (ApiClient.authenticated) { - console.log("authenticated!") + + allowedOrientations: Orientation.All + + + acceptDestination: Page { + BusyLabel { + text: qsTr("Logging in as %1").arg(username.text) + running: true + } + onStatusChanged: { + if(status == PageStatus.Active) { + ApiClient.authenticate(username.text, password.text, true) + } + } + + Connections { + target: ApiClient + onAuthenticatedChanged: { + if (ApiClient.authenticated) { + console.log("authenticated!") pageStack.replaceAbove(null, Qt.resolvedUrl("../MainPage.qml")) - } - } - onAuthenticationError: { + } + } + onAuthenticationError: { loginDialog.error = qsTr("Invalid username or password") - pageStack.completeAnimation() - pageStack.pop() - } - } - } - - PublicUserModel { - id: userModel - apiClient: ApiClient - Component.onCompleted: reload(); - } - - DialogHeader { - id: dialogHeader - anchors.left: parent.left - anchors.right: parent.right + pageStack.completeAnimation() + pageStack.pop() + } + } + } + + PublicUserModel { + id: userModel + apiClient: ApiClient + Component.onCompleted: reload(); + } + + DialogHeader { + id: dialogHeader + anchors.left: parent.left + anchors.right: parent.right //: Dialog action - acceptText: qsTr("Login"); - } - SilicaFlickable { - anchors.left: parent.left - anchors.right: parent.right - anchors.top: dialogHeader.bottom - anchors.bottom: parent.bottom - contentHeight: column.height - clip: true - - VerticalScrollDecorator {} - - Column { - id: column - width: parent.width - - Flow { - width: parent.width - Repeater { - model: userModel - delegate: UserGridDelegate { - name: model.name + acceptText: qsTr("Login"); + } + SilicaFlickable { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: dialogHeader.bottom + anchors.bottom: parent.bottom + contentHeight: column.height + clip: true + + VerticalScrollDecorator {} + + Column { + id: column + width: parent.width + + Flow { + width: parent.width + Repeater { + model: userModel + delegate: UserGridDelegate { + name: model.name image: model.primaryImageTag ? "%1/Users/%2/Images/Primary?tag=%3".arg(ApiClient.baseUrl).arg(model.id).arg(model.primaryImageTag) : "" highlighted: model.name === username.text - onClicked: { - username.text = model.name - password.focus = true - } - } - } - } - - SectionHeader { + onClicked: { + username.text = model.name + password.focus = true + } + } + } + } + + SectionHeader { //: Section header for entering username and password - text: qsTr("Credentials") - } - - TextField { - id: username - width: parent.width + text: qsTr("Credentials") + } + + TextField { + id: username + width: parent.width //: Label placeholder for username field - placeholderText: qsTr("Username") + placeholderText: qsTr("Username") label: placeholderText errorHighlight: error - EnterKey.iconSource: "image://theme/icon-m-enter-next" - EnterKey.onClicked: password.focus = true - } - - TextField { - id: password - width: parent.width - + EnterKey.iconSource: "image://theme/icon-m-enter-next" + EnterKey.onClicked: password.focus = true + } + + TextField { + id: password + width: parent.width + //: Label placeholder for password field - placeholderText: qsTr("Password") + placeholderText: qsTr("Password") label: placeholderText - echoMode: TextInput.Password + echoMode: TextInput.Password errorHighlight: error - EnterKey.iconSource: "image://theme/icon-m-enter-accept" + EnterKey.iconSource: "image://theme/icon-m-enter-accept" EnterKey.onClicked: accept() - } + } Label { anchors { @@ -148,25 +148,25 @@ Dialog { color: Theme.errorColor visible: error } - - SectionHeader { + + SectionHeader { //: Message shown on login, configured by the server owner. Some form of a MOTD - text: qsTr("Login message") + text: qsTr("Login message") visible: loginMessage - } - Label { - anchors { - left: parent.left - right: parent.right - leftMargin: Theme.horizontalPageMargin - rightMargin: Theme.horizontalPageMargin - } + } + Label { + anchors { + left: parent.left + right: parent.right + leftMargin: Theme.horizontalPageMargin + rightMargin: Theme.horizontalPageMargin + } visible: loginMessage text: loginMessage - wrapMode: Text.WordWrap - color: Theme.highlightColor - } - } - } + wrapMode: Text.WordWrap + color: Theme.highlightColor + } + } + } canAccept: username.text }