Skip to content

Commit 4a8411e

Browse files
fix: prevent server value change for edited locked cells (#7956) (CP: 23.6) (#7966)
* fix: prevent server value change for edited locked cells (#7956) * fix: update locked state of cached cells and prevent server value change * fix: adapt 1 based indexes for cell address * refactor: revert client side fixes * chore: revert removed line * fix tests --------- Co-authored-by: Sascha Ißbrücker <sissbruecker@vaadin.com> * chore: run formatter * chore: update deprecation version --------- Co-authored-by: Sascha Ißbrücker <sissbruecker@vaadin.com>
1 parent e51269e commit 4a8411e

File tree

3 files changed

+92
-1
lines changed

3 files changed

+92
-1
lines changed

vaadin-spreadsheet-flow-parent/vaadin-spreadsheet-flow/src/main/java/com/vaadin/flow/component/spreadsheet/Spreadsheet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3760,7 +3760,7 @@ public boolean isCellHidden(Cell cell) {
37603760
* determine the locked state of cells that have not been
37613761
* created yet. Use {@link #isCellLocked(CellAddress)} instead.
37623762
*/
3763-
@Deprecated(since = "24.9.0", forRemoval = true)
3763+
@Deprecated(since = "23.6", forRemoval = true)
37643764
public boolean isCellLocked(Cell cell) {
37653765
if (isActiveSheetProtected()) {
37663766
if (cell != null) {

vaadin-spreadsheet-flow-parent/vaadin-spreadsheet-flow/src/main/java/com/vaadin/flow/component/spreadsheet/SpreadsheetHandlerImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ public void selectionDecreasePainted(int r, int c) {
131131

132132
@Override
133133
public void cellValueEdited(int row, int col, String value) {
134+
if (spreadsheet.isCellLocked(new CellAddress(row - 1, col - 1))) {
135+
protectedCellWriteAttempted();
136+
return;
137+
}
134138
spreadsheet.getCellValueManager().onCellValueChange(col, row, value);
135139
}
136140

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/**
2+
* Copyright 2000-2025 Vaadin Ltd.
3+
*
4+
* This program is available under Vaadin Commercial License and Service Terms.
5+
*
6+
* See {@literal <https://vaadin.com/commercial-license-and-service-terms>} for the full
7+
* license.
8+
*/
9+
package com.vaadin.flow.component.spreadsheet.tests;
10+
11+
import java.util.Locale;
12+
import java.util.concurrent.atomic.AtomicReference;
13+
14+
import org.junit.After;
15+
import org.junit.Assert;
16+
import org.junit.Before;
17+
import org.junit.Test;
18+
19+
import com.vaadin.flow.component.UI;
20+
import com.vaadin.flow.component.spreadsheet.Spreadsheet;
21+
import com.vaadin.flow.component.spreadsheet.Spreadsheet.ProtectedEditEvent;
22+
23+
public class LockedCellValueTest {
24+
25+
private Spreadsheet spreadsheet;
26+
27+
@Before
28+
public void init() {
29+
spreadsheet = new Spreadsheet();
30+
spreadsheet.setLocale(Locale.US);
31+
var ui = new UI();
32+
UI.setCurrent(ui);
33+
}
34+
35+
@After
36+
public void tearDown() {
37+
UI.setCurrent(null);
38+
}
39+
40+
@Test
41+
public void lockSheet_receiveCellValueEditedEvent_preventsEdit() {
42+
var cell = spreadsheet.createCell(1, 1, "Initial value");
43+
lockSheet();
44+
var protectedEditEvent = new AtomicReference<ProtectedEditEvent>();
45+
spreadsheet.addProtectedEditListener(protectedEditEvent::set);
46+
var cellValueChangeEvent = new AtomicReference<Spreadsheet.CellValueChangeEvent>();
47+
spreadsheet.addCellValueChangeListener(cellValueChangeEvent::set);
48+
spreadsheet.setSelection("B2");
49+
fireCellValueEditedEvent(2, 2, "Updated value");
50+
Assert.assertNotNull(protectedEditEvent.get());
51+
Assert.assertNull(cellValueChangeEvent.get());
52+
Assert.assertEquals("Initial value", cell.getStringCellValue());
53+
}
54+
55+
@Test
56+
public void lockSheet_unlockCell_receiveCellValueEditedEvent_allowsEdit() {
57+
var cell = spreadsheet.createCell(1, 1, "Initial value");
58+
lockSheet();
59+
unlockCell("B2");
60+
var protectedEditEvent = new AtomicReference<ProtectedEditEvent>();
61+
spreadsheet.addProtectedEditListener(protectedEditEvent::set);
62+
var cellValueChangeEvent = new AtomicReference<Spreadsheet.CellValueChangeEvent>();
63+
spreadsheet.addCellValueChangeListener(cellValueChangeEvent::set);
64+
spreadsheet.setSelection("B2");
65+
fireCellValueEditedEvent(2, 2, "Updated value");
66+
Assert.assertNull(protectedEditEvent.get());
67+
Assert.assertNotNull(cellValueChangeEvent.get());
68+
Assert.assertEquals("Updated value", cell.getStringCellValue());
69+
}
70+
71+
private void fireCellValueEditedEvent(int row, int col, String value) {
72+
TestHelper.fireClientEvent(spreadsheet, "cellValueEdited",
73+
"[" + row + ", " + col + ", \"" + value + "\"]");
74+
}
75+
76+
private void lockSheet() {
77+
spreadsheet.setSheetProtected(0, "password");
78+
}
79+
80+
private void unlockCell(String cellAddress) {
81+
spreadsheet.createCell(0, 0, "");
82+
var cellStyle = spreadsheet.getActiveSheet().getWorkbook()
83+
.createCellStyle();
84+
cellStyle.setLocked(false);
85+
spreadsheet.getCell(cellAddress).setCellStyle(cellStyle);
86+
}
87+
}

0 commit comments

Comments
 (0)