Skip to content

Instantly share code, notes, and snippets.

@stevenselcuk
Created June 16, 2020 10:11
Show Gist options
  • Save stevenselcuk/648fa4ab7ce785663406a6d565053833 to your computer and use it in GitHub Desktop.
Save stevenselcuk/648fa4ab7ce785663406a6d565053833 to your computer and use it in GitHub Desktop.
import React from 'react'
import { Table, Input, Button, Popconfirm, Form } from 'antd';
const EditableContext = React.createContext();
const EditableRow = ({ form, index, ...props }) => (
<EditableContext.Provider value={form}>
<tr {...props} />
</EditableContext.Provider>
);
const EditableFormRow = Form.create()(EditableRow);
class EditableCell extends React.Component {
state = {
editing: false,
};
toggleEdit = () => {
const editing = !this.state.editing;
this.setState({ editing }, () => {
if (editing) {
this.input.focus();
}
});
};
save = e => {
const { record, handleSave } = this.props;
this.form.validateFields((error, values) => {
if (error && error[e.currentTarget.id]) {
return;
}
this.toggleEdit();
handleSave({ ...record, ...values });
});
};
renderCell = form => {
this.form = form;
const { children, dataIndex, record, title } = this.props;
const { editing } = this.state;
return editing ? (
<Form.Item style={{ margin: 0 }}>
{form.getFieldDecorator(dataIndex, {
rules: [
{
required: true,
message: `${title} is required.`,
},
],
initialValue: record[dataIndex],
})(<Input ref={node => (this.input = node)} onPressEnter={this.save} onBlur={this.save} />)}
</Form.Item>
) : (
<div
className="editable-cell-value-wrap"
style={{ paddingRight: 24 }}
onClick={this.toggleEdit}
>
{children}
</div>
);
};
render() {
const {
editable,
dataIndex,
title,
record,
index,
handleSave,
children,
...restProps
} = this.props;
return (
<td {...restProps}>
{editable ? (
<EditableContext.Consumer>{this.renderCell}</EditableContext.Consumer>
) : (
children
)}
</td>
);
}
}
class Localization extends React.Component {
constructor(props) {
super(props);
this.state ={
send: {
en: {
},
tr: {
}
}
}
this.state = {
dataSource: [
{
key: '0',
keyName: 'NO_INTERNET_CONNECTION',
en: 'No internet connection',
tr: 'Internet bağlantısı yok',
},
{
key: '1',
keyName: 'SETTINGS',
en: 'Settings',
tr: 'Ayarlar',
},
],
count: 2,
columns: [
{
title: 'Key',
dataIndex: 'keyName',
width: '30%',
editable: true,
},
{
title: '🇺🇸English',
dataIndex: 'en',
editable: true,
},
{
title: '🇹🇷Turkish',
dataIndex: 'tr',
editable: true,
},
{
title: 'Action',
dataIndex: 'operation',
render: (text, record) =>
this.state.dataSource.length >= 1 ? (
<Popconfirm title="Sure to delete?" onConfirm={() => this.handleDelete(record.key)}>
<a>Delete</a>
</Popconfirm>
) : null,
},
]
};
}
handleDelete = key => {
const dataSource = [...this.state.dataSource];
this.setState({ dataSource: dataSource.filter(item => item.key !== key) });
};
handleAdd = () => {
const { count, dataSource } = this.state;
const newData = {
key: count,
keyName: "KEY",
en: "English",
tr: "Turkish",
};
this.setState({
dataSource: [...dataSource, newData],
count: count + 1,
});
};
handleAddNewLanguageSet = () => {
const { columns } = this.state;
const newData = {
title: '🇹🇷Lang here',
dataIndex: 'tr',
editable: true,
};
console.log("hi")
const newState = columns.splice(2, 0, newData);
this.setState({
columns: [...columns, newState]
});
};
handleSave = row => {
const newData = [...this.state.dataSource];
const index = newData.findIndex(item => row.key === item.key);
const item = newData[index];
newData.splice(index, 1, {
...item,
...row,
});
this.setState({ dataSource: newData });
console.log(row)
};
render() {
const { dataSource } = this.state;
const components = {
body: {
row: EditableFormRow,
cell: EditableCell,
},
};
const columns = this.state.columns.map(col => {
if (!col.editable) {
return col;
}
return {
...col,
onCell: record => ({
record,
editable: col.editable,
dataIndex: col.dataIndex,
title: col.title,
handleSave: this.handleSave,
}),
};
});
return (
<div>
<h1>Localization</h1>
<Button onClick={this.handleAdd} type="primary" style={{ marginBottom: 16 }}>
Add new key
</Button>
{' '}
<Button onClick={this.handleAddNewLanguageSet} type="secondary" style={{ marginBottom: 16 }}>
Add new language set
</Button>
<Table
components={components}
rowClassName={() => 'editable-row'}
bordered
dataSource={dataSource}
columns={columns}
/>
</div>
);
}
}
export default Localization
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment