Skip to content

Commit 4af7b98

Browse files
authored
fix: raw value of read-only date field in data browser cannot be copied (#2326)
1 parent d5788b8 commit 4af7b98

File tree

4 files changed

+53
-67
lines changed

4 files changed

+53
-67
lines changed

src/components/BrowserCell/BrowserCell.react.js

+32-65
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import Pill from 'components/Pill/Pill.react';
1414
import React, { Component } from 'react';
1515
import styles from 'components/BrowserCell/BrowserCell.scss';
1616
import baseStyles from 'stylesheets/base.scss';
17-
import Tooltip from '../Tooltip/PopperTooltip.react';
1817
import * as ColumnPreferences from 'lib/ColumnPreferences';
1918

2019
export default class BrowserCell extends Component {
@@ -388,8 +387,7 @@ export default class BrowserCell extends Component {
388387
//#endregion
389388

390389
render() {
391-
let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, onPointerCmdClick, row, col, field, onEditSelectedRow, readonly, isRequired, markRequiredFieldRow } = this.props;
392-
let isNewRow = row < 0;
390+
let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, onPointerCmdClick, row, col, field, onEditSelectedRow, isRequired, markRequiredFieldRow } = this.props;
393391

394392
let classes = [...this.state.classes];
395393

@@ -400,68 +398,37 @@ export default class BrowserCell extends Component {
400398
classes.push(styles.required);
401399
}
402400

403-
return readonly ? (
404-
<Tooltip placement='bottom' tooltip='Read only (CTRL+C to copy)' visible={this.state.showTooltip}>
405-
<span
406-
ref={this.cellRef}
407-
className={classes.join(' ')}
408-
style={{ width }}
409-
onClick={(e) => {
410-
if (e.metaKey === true && type === 'Pointer') {
411-
onPointerCmdClick(value);
412-
} else {
413-
onSelect({ row, col });
414-
setCopyableValue(hidden ? undefined : this.copyableValue);
415-
}
416-
}}
417-
onDoubleClick={() => {
418-
if (field === 'objectId' && onEditSelectedRow) {
419-
onEditSelectedRow(true, value);
420-
} else {
421-
this.setState({ showTooltip: true });
422-
setTimeout(() => {
423-
this.setState({ showTooltip: false });
424-
}, 2000);
425-
}
426-
}}
427-
onContextMenu={this.onContextMenu}
428-
>
429-
{row < 0 || isNewRow ? '(auto)' : this.state.content}
430-
</span>
431-
</Tooltip>
432-
) : (
433-
<span
434-
ref={this.cellRef}
435-
className={classes.join(' ')}
436-
style={{ width }}
437-
onClick={(e) => {
438-
if (e.metaKey === true && type === 'Pointer') {
439-
onPointerCmdClick(value);
440-
}
441-
else {
442-
onSelect({ row, col });
443-
setCopyableValue(hidden ? undefined : this.copyableValue);
444-
}
445-
}}
446-
onDoubleClick={() => {
447-
// Since objectId can't be edited, double click event opens edit row dialog
448-
if (field === 'objectId' && onEditSelectedRow) {
449-
onEditSelectedRow(true, value);
450-
} else if (type !== 'Relation') {
451-
onEditChange(true)
401+
return <span
402+
ref={this.cellRef}
403+
className={classes.join(' ')}
404+
style={{ width }}
405+
onClick={(e) => {
406+
if (e.metaKey === true && type === 'Pointer') {
407+
onPointerCmdClick(value);
408+
}
409+
else {
410+
onSelect({ row, col });
411+
setCopyableValue(hidden ? undefined : this.copyableValue);
412+
}
413+
}}
414+
onDoubleClick={() => {
415+
// Since objectId can't be edited, double click event opens edit row dialog
416+
if (field === 'objectId' && onEditSelectedRow) {
417+
onEditSelectedRow(true, value);
418+
} else if (type !== 'Relation') {
419+
onEditChange(true)
420+
}
421+
}}
422+
onTouchEnd={e => {
423+
if (current && type !== 'Relation') {
424+
// The touch event may trigger an unwanted change in the column value
425+
if (['ACL', 'Boolean', 'File'].includes(type)) {
426+
e.preventDefault();
452427
}
453-
}}
454-
onTouchEnd={e => {
455-
if (current && type !== 'Relation') {
456-
// The touch event may trigger an unwanted change in the column value
457-
if (['ACL', 'Boolean', 'File'].includes(type)) {
458-
e.preventDefault();
459-
}
460-
}}}
461-
onContextMenu={this.onContextMenu.bind(this)}
462-
>
463-
{this.state.content}
464-
</span>
465-
);
428+
}}}
429+
onContextMenu={this.onContextMenu.bind(this)}
430+
>
431+
{this.state.content}
432+
</span>
466433
}
467434
}

src/components/BrowserCell/BrowserCell.scss

+4
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,7 @@
7474
bottom: 0;
7575
}
7676
}
77+
78+
.readonly {
79+
color: #04263bd1;
80+
}

src/components/StringEditor/StringEditor.react.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,12 @@ export default class StringEditor extends React.Component {
4949
}
5050

5151
render() {
52+
let classes = [styles.editor];
5253
let onChange = this.props.readonly ? () => {} : (e) => this.setState({ value: e.target.value });
54+
if (this.props.readonly) {
55+
classes.push(styles.readonly)
56+
}
57+
5358
if (this.props.multiline) {
5459
var style = { minWidth: this.props.minWidth };
5560
if (this.props.resizable) {
@@ -66,11 +71,12 @@ export default class StringEditor extends React.Component {
6671
);
6772
}
6873
return (
69-
<div style={{ width: this.props.width }} className={styles.editor}>
74+
<div style={{ width: this.props.width }} className={classes.join(' ')}>
7075
<input
7176
ref={this.inputRef}
7277
value={this.state.value}
73-
onChange={onChange} />
78+
onChange={onChange}
79+
disabled={this.props.readonly} />
7480
</div>
7581
);
7682
}

src/components/StringEditor/StringEditor.scss

+9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@
2323
font-size: 12px;
2424
}
2525

26+
&.readonly {
27+
box-shadow: 0px 0px 2px 1px rgb(0 0 0 / 20%);
28+
}
29+
30+
input:disabled {
31+
background-color: #f2f2f2;
32+
color: #666;
33+
}
34+
2635
textarea {
2736
@include MonospaceFont;
2837
width: 200px;

0 commit comments

Comments
 (0)