Fix the edit form so Save persists stage changes
Changing an application's stage and pressing Save closed the form without saving the stage: JobsDatabase::updateJob() deliberately skips the stage column so every move lands in stage_history, but JobEditModel::save() never followed up with setStage(). It now does, as the CLI's update command always has. Also: - Validate that company and title are non-empty and say so, instead of saving a blank field - Always set lastError on failure, clear it on the next attempt, and bind the page's error message to it - Reload the form's values when jobsModel is assigned, since QML does not guarantee it is set before editingJobId - Bind the salary spin boxes to the model and write back only on user edits; guard the notes field the same way - Add jobeditmodeltest covering load order, edits, stage history, salaries round-tripping, adding, and validation errors Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01BxDf7HqD1xPnsZP8wt3NTk
This commit is contained in:
@@ -56,11 +56,10 @@ Kirigami.ScrollablePage {
|
||||
Kirigami.Action {
|
||||
text: i18nc("@action:button", "Save")
|
||||
icon.name: "document-save"
|
||||
// On failure, editModel.lastError is set and shown by errorLabel.
|
||||
onTriggered: {
|
||||
if (editModel.save()) {
|
||||
root.done();
|
||||
} else {
|
||||
errorLabel.text = editModel.lastError;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -76,6 +75,7 @@ Kirigami.ScrollablePage {
|
||||
Layout.rightMargin: Kirigami.Units.largeSpacing
|
||||
Layout.bottomMargin: Kirigami.Units.smallSpacing
|
||||
type: Kirigami.MessageType.Error
|
||||
text: editModel.lastError
|
||||
visible: text.length > 0
|
||||
}
|
||||
|
||||
@@ -204,11 +204,11 @@ Kirigami.ScrollablePage {
|
||||
from: spinD.model.spinMin
|
||||
to: spinD.model.spinMax
|
||||
stepSize: 1000
|
||||
// One-time init, not a persistent binding: this also
|
||||
// writes back on user edits, so binding "value" live to
|
||||
// spinD.model.value would be a binding loop.
|
||||
Component.onCompleted: value = spinD.model.value
|
||||
onValueChanged: editModel.setValue(spinD.sourceRow, value)
|
||||
// Live binding so values loaded after the delegate is
|
||||
// created still show up. Writing back only on
|
||||
// valueModified (user edits) avoids a binding loop.
|
||||
value: spinD.model.value
|
||||
onValueModified: editModel.setValue(spinD.sourceRow, value)
|
||||
}
|
||||
|
||||
Kirigami.Separator {
|
||||
@@ -279,7 +279,13 @@ Kirigami.ScrollablePage {
|
||||
Layout.preferredHeight: Kirigami.Units.gridUnit * 5
|
||||
wrapMode: TextEdit.Wrap
|
||||
text: areaD.value
|
||||
onTextChanged: editModel.setValue(areaD.sourceRow, text)
|
||||
// TextArea has no textEdited signal; skip the echo from
|
||||
// the model-driven binding and only write real edits.
|
||||
onTextChanged: {
|
||||
if (text !== areaD.value) {
|
||||
editModel.setValue(areaD.sourceRow, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Kirigami.Separator {
|
||||
|
||||
Reference in New Issue
Block a user