Téléverser les fichiers vers "first-login-ui/src"
This commit is contained in:
+256
-73
@@ -19,16 +19,51 @@ Kirigami.ApplicationWindow {
|
|||||||
{ "title": "Terminé", "subtitle": "Poste prêt" }
|
{ "title": "Terminé", "subtitle": "Poste prêt" }
|
||||||
]
|
]
|
||||||
|
|
||||||
|
property bool passwordStepValid:
|
||||||
|
currentPassword.text.trim().length > 0 &&
|
||||||
|
newPassword.text.length > 0 &&
|
||||||
|
confirmPassword.text.length > 0 &&
|
||||||
|
newPassword.text === confirmPassword.text
|
||||||
|
|
||||||
|
property bool pinStepValid:
|
||||||
|
currentPin.text.length >= 4 &&
|
||||||
|
newPin.text.length >= 4 &&
|
||||||
|
confirmPin.text.length >= 4 &&
|
||||||
|
newPin.text === confirmPin.text
|
||||||
|
|
||||||
|
property bool workflowComplete: passwordStepValid && pinStepValid
|
||||||
|
property bool closeAttempted: false
|
||||||
|
|
||||||
function goNext() {
|
function goNext() {
|
||||||
if (currentStep < steps.length - 1) {
|
// Défense en profondeur : même si un bouton était activé par erreur,
|
||||||
|
// on ne franchit jamais une étape dont les champs requis sont incomplets.
|
||||||
|
if (currentStep === 1 && !passwordStepValid)
|
||||||
|
return
|
||||||
|
if (currentStep === 2 && !pinStepValid)
|
||||||
|
return
|
||||||
|
|
||||||
|
if (currentStep < steps.length - 1)
|
||||||
currentStep += 1
|
currentStep += 1
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function goBack() {
|
function goBack() {
|
||||||
if (currentStep > 0) {
|
if (currentStep > 0)
|
||||||
currentStep -= 1
|
currentStep -= 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onClosing: function(close) {
|
||||||
|
if (!workflowComplete) {
|
||||||
|
close.accepted = false
|
||||||
|
closeAttempted = true
|
||||||
|
closeWarningTimer.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: closeWarningTimer
|
||||||
|
interval: 3500
|
||||||
|
repeat: false
|
||||||
|
onTriggered: root.closeAttempted = false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Indicateur volontairement informatif : il ne bloque jamais
|
// Indicateur volontairement informatif : il ne bloque jamais
|
||||||
@@ -89,11 +124,6 @@ Kirigami.ApplicationWindow {
|
|||||||
return "Saisissez votre nouveau mot de passe pour obtenir une indication de robustesse."
|
return "Saisissez votre nouveau mot de passe pour obtenir une indication de robustesse."
|
||||||
}
|
}
|
||||||
|
|
||||||
Shortcut {
|
|
||||||
sequence: "Ctrl+Q"
|
|
||||||
onActivated: Qt.quit()
|
|
||||||
}
|
|
||||||
|
|
||||||
component PrimaryButton: Controls.Button {
|
component PrimaryButton: Controls.Button {
|
||||||
id: control
|
id: control
|
||||||
implicitHeight: 48
|
implicitHeight: 48
|
||||||
@@ -196,6 +226,29 @@ Kirigami.ApplicationWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
component FieldLabel: RowLayout {
|
||||||
|
id: fieldLabel
|
||||||
|
|
||||||
|
property string iconName: "dialog-password"
|
||||||
|
property string labelText: ""
|
||||||
|
|
||||||
|
spacing: 8
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
source: fieldLabel.iconName
|
||||||
|
implicitWidth: 17
|
||||||
|
implicitHeight: 17
|
||||||
|
color: "#64748b"
|
||||||
|
}
|
||||||
|
|
||||||
|
Controls.Label {
|
||||||
|
text: fieldLabel.labelText
|
||||||
|
color: "#334155"
|
||||||
|
font.pixelSize: 13
|
||||||
|
font.weight: Font.DemiBold
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
component StepDot: Rectangle {
|
component StepDot: Rectangle {
|
||||||
required property int stepIndex
|
required property int stepIndex
|
||||||
|
|
||||||
@@ -301,37 +354,49 @@ Kirigami.ApplicationWindow {
|
|||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
spacing: 16
|
spacing: 16
|
||||||
|
|
||||||
ColumnLayout {
|
// Colonne de largeur fixe : tous les marqueurs et tous
|
||||||
Layout.alignment: Qt.AlignTop
|
// les titres commencent exactement au même endroit.
|
||||||
spacing: 0
|
Item {
|
||||||
|
Layout.preferredWidth: 42
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
StepDot { stepIndex: index }
|
StepDot {
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
stepIndex: index
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
visible: index < root.steps.length - 1
|
visible: index < root.steps.length - 1
|
||||||
Layout.alignment: Qt.AlignHCenter
|
anchors.top: parent.top
|
||||||
Layout.preferredWidth: 2
|
anchors.topMargin: 34
|
||||||
Layout.preferredHeight: 36
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
width: 2
|
||||||
color: index < root.currentStep ? "#22c55e" : "#28517e"
|
color: index < root.currentStep ? "#22c55e" : "#28517e"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.alignment: Qt.AlignTop
|
Layout.alignment: Qt.AlignVCenter
|
||||||
spacing: 3
|
spacing: 3
|
||||||
|
|
||||||
Controls.Label {
|
Controls.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
text: modelData.title
|
text: modelData.title
|
||||||
color: index === root.currentStep ? "white" : "#c1d3e8"
|
color: index === root.currentStep ? "white" : "#c1d3e8"
|
||||||
font.pixelSize: 15
|
font.pixelSize: 15
|
||||||
font.weight: index === root.currentStep ? Font.DemiBold : Font.Medium
|
font.weight: index === root.currentStep ? Font.DemiBold : Font.Medium
|
||||||
|
horizontalAlignment: Text.AlignLeft
|
||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
Controls.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
text: modelData.subtitle
|
text: modelData.subtitle
|
||||||
color: "#7699c2"
|
color: "#7699c2"
|
||||||
font.pixelSize: 12
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignLeft
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -382,11 +447,22 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
Item { Layout.preferredHeight: 20 }
|
Item { Layout.preferredHeight: 20 }
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
spacing: 6
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
source: "lock"
|
||||||
|
implicitWidth: 14
|
||||||
|
implicitHeight: 14
|
||||||
|
color: "#6289b6"
|
||||||
|
}
|
||||||
|
|
||||||
Controls.Label {
|
Controls.Label {
|
||||||
text: "Ctrl+Q : quitter l'aperçu"
|
text: "Assistant obligatoire jusqu'à la fin"
|
||||||
color: "#6289b6"
|
color: "#6289b6"
|
||||||
font.pixelSize: 11
|
font.pixelSize: 11
|
||||||
Layout.alignment: Qt.AlignHCenter
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -431,9 +507,37 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
Item { Layout.fillWidth: true }
|
Item { Layout.fillWidth: true }
|
||||||
|
|
||||||
SecondaryButton {
|
Rectangle {
|
||||||
text: "Quitter l'aperçu"
|
implicitWidth: lockStatusRow.implicitWidth + 24
|
||||||
onClicked: Qt.quit()
|
implicitHeight: 34
|
||||||
|
radius: 17
|
||||||
|
color: root.closeAttempted ? "#fef2f2" : "#f8fafc"
|
||||||
|
border.width: 1
|
||||||
|
border.color: root.closeAttempted ? "#fecaca" : "#cbd5e1"
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: lockStatusRow
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 7
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
source: root.workflowComplete ? "lock-open" : "lock"
|
||||||
|
implicitWidth: 16
|
||||||
|
implicitHeight: 16
|
||||||
|
color: root.closeAttempted ? "#dc2626" : "#64748b"
|
||||||
|
}
|
||||||
|
|
||||||
|
Controls.Label {
|
||||||
|
text: root.closeAttempted
|
||||||
|
? "Terminez la configuration avant de quitter"
|
||||||
|
: root.workflowComplete
|
||||||
|
? "Configuration complète"
|
||||||
|
: "Configuration en cours"
|
||||||
|
color: root.closeAttempted ? "#b91c1c" : "#475569"
|
||||||
|
font.pixelSize: 11
|
||||||
|
font.weight: Font.DemiBold
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -597,6 +701,31 @@ Kirigami.ApplicationWindow {
|
|||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
spacing: 18
|
spacing: 18
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
Layout.preferredWidth: 80
|
||||||
|
Layout.preferredHeight: 80
|
||||||
|
radius: 22
|
||||||
|
color: "#eff6ff"
|
||||||
|
border.width: 1
|
||||||
|
border.color: "#bfdbfe"
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
source: "dialog-password"
|
||||||
|
implicitWidth: 38
|
||||||
|
implicitHeight: 38
|
||||||
|
color: "#2563eb"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: 5
|
||||||
|
|
||||||
Controls.Label {
|
Controls.Label {
|
||||||
text: "Mot de passe local"
|
text: "Mot de passe local"
|
||||||
color: "#0f172a"
|
color: "#0f172a"
|
||||||
@@ -605,13 +734,15 @@ Kirigami.ApplicationWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
Controls.Label {
|
||||||
Layout.maximumWidth: 720
|
Layout.fillWidth: true
|
||||||
text: "Ce mot de passe reste disponible comme solution de secours si votre YubiKey est momentanément indisponible."
|
text: "Ce mot de passe reste disponible comme solution de secours si votre YubiKey est momentanément indisponible."
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
color: "#64748b"
|
color: "#64748b"
|
||||||
font.pixelSize: 15
|
font.pixelSize: 15
|
||||||
lineHeight: 1.2
|
lineHeight: 1.2
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
@@ -626,11 +757,11 @@ Kirigami.ApplicationWindow {
|
|||||||
anchors.margins: 16
|
anchors.margins: 16
|
||||||
spacing: 12
|
spacing: 12
|
||||||
|
|
||||||
Controls.Label {
|
Kirigami.Icon {
|
||||||
text: "ℹ"
|
source: "emblem-information"
|
||||||
|
implicitWidth: 22
|
||||||
|
implicitHeight: 22
|
||||||
color: "#2563eb"
|
color: "#2563eb"
|
||||||
font.pixelSize: 22
|
|
||||||
font.weight: Font.Bold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
Controls.Label {
|
||||||
@@ -645,11 +776,9 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
Item { Layout.preferredHeight: 4 }
|
Item { Layout.preferredHeight: 4 }
|
||||||
|
|
||||||
Controls.Label {
|
FieldLabel {
|
||||||
text: "Mot de passe temporaire actuel"
|
iconName: "dialog-password"
|
||||||
color: "#334155"
|
labelText: "Mot de passe temporaire actuel"
|
||||||
font.pixelSize: 13
|
|
||||||
font.weight: Font.DemiBold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SecretField {
|
SecretField {
|
||||||
@@ -657,11 +786,9 @@ Kirigami.ApplicationWindow {
|
|||||||
placeholderText: "Saisissez le mot de passe temporaire"
|
placeholderText: "Saisissez le mot de passe temporaire"
|
||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
FieldLabel {
|
||||||
text: "Nouveau mot de passe"
|
iconName: "document-edit"
|
||||||
color: "#334155"
|
labelText: "Nouveau mot de passe"
|
||||||
font.pixelSize: 13
|
|
||||||
font.weight: Font.DemiBold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SecretField {
|
SecretField {
|
||||||
@@ -690,6 +817,14 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
spacing: 8
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
source: "security-high"
|
||||||
|
implicitWidth: 17
|
||||||
|
implicitHeight: 17
|
||||||
|
color: root.passwordStrengthColor(strengthCard.strengthLevel)
|
||||||
|
}
|
||||||
|
|
||||||
Controls.Label {
|
Controls.Label {
|
||||||
text: "Robustesse du mot de passe"
|
text: "Robustesse du mot de passe"
|
||||||
@@ -747,11 +882,9 @@ Kirigami.ApplicationWindow {
|
|||||||
font.pixelSize: 11
|
font.pixelSize: 11
|
||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
FieldLabel {
|
||||||
text: "Confirmation"
|
iconName: "dialog-ok-apply"
|
||||||
color: "#334155"
|
labelText: "Confirmation"
|
||||||
font.pixelSize: 13
|
|
||||||
font.weight: Font.DemiBold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SecretField {
|
SecretField {
|
||||||
@@ -780,7 +913,7 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
PrimaryButton {
|
PrimaryButton {
|
||||||
text: "Continuer"
|
text: "Continuer"
|
||||||
enabled: newPassword.text.length > 0 && newPassword.text === confirmPassword.text
|
enabled: root.passwordStepValid
|
||||||
opacity: enabled ? 1.0 : 0.45
|
opacity: enabled ? 1.0 : 0.45
|
||||||
onClicked: root.goNext()
|
onClicked: root.goNext()
|
||||||
}
|
}
|
||||||
@@ -865,11 +998,9 @@ Kirigami.ApplicationWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
FieldLabel {
|
||||||
text: "PIN temporaire actuel"
|
iconName: "dialog-password"
|
||||||
color: "#334155"
|
labelText: "PIN temporaire actuel"
|
||||||
font.pixelSize: 13
|
|
||||||
font.weight: Font.DemiBold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SecretField {
|
SecretField {
|
||||||
@@ -878,11 +1009,9 @@ Kirigami.ApplicationWindow {
|
|||||||
inputMethodHints: Qt.ImhDigitsOnly
|
inputMethodHints: Qt.ImhDigitsOnly
|
||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
FieldLabel {
|
||||||
text: "Nouveau PIN"
|
iconName: "security-high"
|
||||||
color: "#334155"
|
labelText: "Nouveau PIN"
|
||||||
font.pixelSize: 13
|
|
||||||
font.weight: Font.DemiBold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SecretField {
|
SecretField {
|
||||||
@@ -891,11 +1020,9 @@ Kirigami.ApplicationWindow {
|
|||||||
inputMethodHints: Qt.ImhDigitsOnly
|
inputMethodHints: Qt.ImhDigitsOnly
|
||||||
}
|
}
|
||||||
|
|
||||||
Controls.Label {
|
FieldLabel {
|
||||||
text: "Confirmation du nouveau PIN"
|
iconName: "dialog-ok-apply"
|
||||||
color: "#334155"
|
labelText: "Confirmation du nouveau PIN"
|
||||||
font.pixelSize: 13
|
|
||||||
font.weight: Font.DemiBold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SecretField {
|
SecretField {
|
||||||
@@ -925,7 +1052,7 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
PrimaryButton {
|
PrimaryButton {
|
||||||
text: "Finaliser"
|
text: "Finaliser"
|
||||||
enabled: newPin.text.length >= 4 && newPin.text === confirmPin.text
|
enabled: root.pinStepValid
|
||||||
opacity: enabled ? 1.0 : 0.45
|
opacity: enabled ? 1.0 : 0.45
|
||||||
onClicked: root.goNext()
|
onClicked: root.goNext()
|
||||||
}
|
}
|
||||||
@@ -952,12 +1079,12 @@ Kirigami.ApplicationWindow {
|
|||||||
border.width: 1
|
border.width: 1
|
||||||
border.color: "#86efac"
|
border.color: "#86efac"
|
||||||
|
|
||||||
Controls.Label {
|
Kirigami.Icon {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
text: "✓"
|
source: "dialog-ok-apply"
|
||||||
|
implicitWidth: 52
|
||||||
|
implicitHeight: 52
|
||||||
color: "#16a34a"
|
color: "#16a34a"
|
||||||
font.pixelSize: 50
|
|
||||||
font.weight: Font.Bold
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -983,10 +1110,21 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
Item { Layout.preferredHeight: 12 }
|
Item { Layout.preferredHeight: 12 }
|
||||||
|
|
||||||
Rectangle {
|
RowLayout {
|
||||||
Layout.preferredWidth: 520
|
|
||||||
Layout.preferredHeight: 112
|
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
spacing: 12
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: [
|
||||||
|
{ "icon": "dialog-password", "title": "Mot de passe", "text": "Accès local renseigné" },
|
||||||
|
{ "icon": "security-high", "title": "YubiKey", "text": "PIN personnel renseigné" },
|
||||||
|
{ "icon": "computer-laptop", "title": "Poste", "text": "Configuration finalisée" }
|
||||||
|
]
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
required property var modelData
|
||||||
|
Layout.preferredWidth: 205
|
||||||
|
Layout.preferredHeight: 126
|
||||||
radius: 16
|
radius: 16
|
||||||
color: "#f8fafc"
|
color: "#f8fafc"
|
||||||
border.width: 1
|
border.width: 1
|
||||||
@@ -994,17 +1132,60 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: 18
|
anchors.margins: 16
|
||||||
spacing: 10
|
spacing: 7
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
Controls.Label { text: "✓"; color: "#16a34a"; font.pixelSize: 17; font.weight: Font.Bold }
|
Layout.fillWidth: true
|
||||||
Controls.Label { text: "Mot de passe personnel configuré"; color: "#334155"; font.pixelSize: 14 }
|
|
||||||
|
Rectangle {
|
||||||
|
Layout.preferredWidth: 38
|
||||||
|
Layout.preferredHeight: 38
|
||||||
|
radius: 11
|
||||||
|
color: "#eff6ff"
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
source: modelData.icon
|
||||||
|
implicitWidth: 21
|
||||||
|
implicitHeight: 21
|
||||||
|
color: "#2563eb"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
Item { Layout.fillWidth: true }
|
||||||
Controls.Label { text: "✓"; color: "#16a34a"; font.pixelSize: 17; font.weight: Font.Bold }
|
|
||||||
Controls.Label { text: "PIN personnel YubiKey configuré"; color: "#334155"; font.pixelSize: 14 }
|
Rectangle {
|
||||||
|
Layout.preferredWidth: 25
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
radius: 13
|
||||||
|
color: "#dcfce7"
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
source: "dialog-ok-apply"
|
||||||
|
implicitWidth: 15
|
||||||
|
implicitHeight: 15
|
||||||
|
color: "#16a34a"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Controls.Label {
|
||||||
|
text: modelData.title
|
||||||
|
color: "#0f172a"
|
||||||
|
font.pixelSize: 14
|
||||||
|
font.weight: Font.DemiBold
|
||||||
|
}
|
||||||
|
|
||||||
|
Controls.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: modelData.text
|
||||||
|
color: "#64748b"
|
||||||
|
font.pixelSize: 11
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1021,7 +1202,9 @@ Kirigami.ApplicationWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PrimaryButton {
|
PrimaryButton {
|
||||||
text: "Fermer l'aperçu"
|
text: "Terminer"
|
||||||
|
enabled: root.workflowComplete
|
||||||
|
opacity: enabled ? 1.0 : 0.45
|
||||||
onClicked: Qt.quit()
|
onClicked: Qt.quit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user