I would like to rename the key like:
before: Object { check: "cargo check", settings: "Cargo.toml", "create app": "cargo new APPNAME", "build and run": "cargo run / cargo-watch / cargo build --verbose" }
after: Object { MY_NEW_KEY: "cargo check", settings: "Cargo.toml", "create app": "cargo new APPNAME", "build and run": "cargo run / cargo-watch / cargo build --verbose" }
backend:
class Entry(models.Model):
tag = models.ManyToManyField(Tag, blank=True)
title = models.CharField(max_length=160, null=True, blank=True)
desc = models.TextField(null=True, blank=True)
data = models.JSONField(null=True, blank=True)
frontend:
class Entry extends React.Component {
constructor(props){
super(props)
this.state = {
entry: this.props.entry,
edit: false,
id: this.props.entry.id,
title: "",
desc: "",
data: "", // server returns: Object { check: "cargo check", settings: "Cargo.toml", "create app": "cargo new APPNAME", "build and run": "cargo run / cargo-watch / cargo build --verbose" }
}
}
componentDidMount() {
var data=this.props.entry.data
console.log(data)
this.setState({ data: data }) //Object { check: "cargo check", settings: "Cargo.toml", "create app": "cargo new APPNAME", "build and run": "cargo run / cargo-watch / cargo build --verbose" }
}
render(){
var entry = this.state.entry;
var entryData = this.state.data; <---- data is passed to showEntryForm(....)
var edit = this.state.edit;
var toggleEdit = this.toggleEdit;
var submitFunction = this.handleSubmit;
var handleChangeFunction = this.handleChange;
var handleJsonChange = this.handleJsonChange;
return(
edit ? showEntryForm(entry, entryData, submitFunction, handleChangeFunction, handleJsonChange) <-----
: showEntry(entry, entryData, toggleEdit)
)
}
}
const showEntryForm = (entry, entryData, submitFunction, handleChangeFunction, handleDataChangeFunction) => {
return <div key={ entry.id } className="container bg-danger p-5" >
<div className="row" >
<h1>Eintrag bearbeiten</h1>
</div>
<div className="row">
<form onSubmit={ submitFunction }>
<div className="row ">
<label htmlFor="title" className="form-label">Titel</label>
<input onChange={event => handleChangeFunction(event) } type="text" name="title" defaultValue={ entry.title } className="form-control" autoFocus/>
<label htmlFor="desc" className="form-label">Description</label>
<textarea onChange={event => handleChangeFunction(event) } type="text" name="desc" defaultValue={ entry.desc } className="form-control" />
<div className="row mt-2">
{entryData ? <div> {Object.keys(entryData).map(function(keyName, keyIndex){ <------- returns the state.data
return <div key={keyIndex} className="row bg-info p-1 mt-2">
<div className="col-6">
<input name={ keyName } onChange={ event => handleDataChangeFunction(event, "key", keyName) } type="text" defaultValue={ keyName } className="form-control"/> <--------
</div>
<div className="col-6">
<input name={ keyName } onChange={ event => handleDataChangeFunction(event, "value", keyName) } type="text" defaultValue={ entryData[keyName] } className="form-control"/>
</div>
</div>
})} <button>add</button> </div>: ""}
<div>
<button type="submit">ändern</button>
</div>
</div>
</div>
</form>
</div>
</div>
}
That's the function in component Entry, to change the state.data
handleDataChangeFunction(event, keyOrValue, keyName) {
console.log("HANDLE JSON CHANGE")
var name = event.target.name;
var value = event.target.value;
var data = {...this.state.data};
if(keyOrValue === "value"){ <----- changing the value is no problem
data[keyName] = value;
this.setState({ data: data })
}
if(keyOrValue === "key") { <------ big problem
delete(data[keyName])
data = (delete(data[keyName]), data)
this.setState({ data: data})
}
}
I have tried with Object.keys(data).map and some other things, but nothing worked yet.
I guess it's either some easy thing or I should change the whole thing, including backend.