Skip to content

Commit 05a8f9d

Browse files
Merge pull request #238 from terminusdb/docHistory
adding multipolygon template
2 parents e1901b3 + 0298360 commit 05a8f9d

File tree

1 file changed

+183
-0
lines changed

1 file changed

+183
-0
lines changed
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
import React, { useState, useEffect } from "react"
2+
import Card from "react-bootstrap/Card"
3+
import Stack from "react-bootstrap/Stack"
4+
import Button from "react-bootstrap/Button"
5+
import { TDBLabel} from "../components/LabelComponent"
6+
import { BiPlus } from "react-icons/bi"
7+
import { TDBInput } from "../widgets/inputWidgets"
8+
import * as CONST from "../constants"
9+
10+
function getCoordinateData (fieldName, data, polygonIndex, coordinateIndex) {
11+
if(!data[polygonIndex].length) return null
12+
else {
13+
if(!data[polygonIndex][coordinateIndex]) {
14+
return null
15+
}
16+
else return data[polygonIndex][coordinateIndex][fieldName === CONST.LATITUDE ? 0 : 1]
17+
}
18+
}
19+
20+
21+
const DisplayCoordinatesLatLng = ({ coordinatesPerPolygon, polygonID, polygonIndex, data, setData, onChangeHandler }) => {
22+
23+
if(!Object.keys(coordinatesPerPolygon).length) return <div/>
24+
const [coordinateArray, setCoordinateArray] = useState([])
25+
26+
function handleCoordinates(val, fieldName, polygonIndex, coordinateIndex) {
27+
let temp = {...data}, coord=[]
28+
if(fieldName === CONST.LATITUDE) {
29+
coord = data[polygonIndex][coordinateIndex] ? data[polygonIndex][coordinateIndex] : []
30+
coord[0] = val //lat
31+
}
32+
else {
33+
coord = data[polygonIndex][coordinateIndex] ? data[polygonIndex][coordinateIndex] : []
34+
coord[1] = val //lng
35+
}
36+
//temp[polygonIndex][coordinateIndex]=coord
37+
temp[polygonIndex][coordinateIndex]=coord
38+
if(onChangeHandler) onChangeHandler([data], CONST.COORDINATES_FIELD)
39+
setData(data)
40+
}
41+
42+
useEffect(() => {
43+
if(coordinatesPerPolygon && polygonID) {
44+
let coordArray = []
45+
for(let count = 0; count < coordinatesPerPolygon[polygonID]; count ++) {
46+
let countID = `Polygon__${polygonID}__coordinate__${count}`
47+
coordArray.push(
48+
<Card className="border border-dark bg-secondary mb-3" key={countID}>
49+
<Card.Body>
50+
<TDBInput name={CONST.LATITUDE}
51+
//value={}
52+
value={getCoordinateData (CONST.LATITUDE, data, polygonIndex, count)}
53+
required={true}
54+
mode={"Create"}
55+
//inputKey={config.key}
56+
//id={config.id}
57+
placeholder={"xsd:decimal"}
58+
className={"tdb__doc__input"}
59+
onChange={(val, fieldName) => handleCoordinates(val, fieldName, polygonIndex, count)}/>
60+
<TDBInput name={CONST.LONGITUDE}
61+
//value={data[polygonIndex].length ? data[polygonIndex][count][1] : null}
62+
value={getCoordinateData (CONST.LONGITUDE, data, polygonIndex, count)}
63+
required={true}
64+
mode={"Create"}
65+
//inputKey={config.key}
66+
//id={config.id}
67+
placeholder={"xsd:decimal"}
68+
className={"tdb__doc__input"}
69+
onChange={(val, fieldName) => handleCoordinates(val, fieldName, polygonIndex, count)}/>
70+
</Card.Body>
71+
</Card>
72+
)
73+
}
74+
setCoordinateArray(coordArray)
75+
}
76+
}, [coordinatesPerPolygon])
77+
78+
79+
80+
return <>{coordinateArray}</>
81+
}
82+
83+
function getCoordinatesPerPolygon(data) {
84+
if(!data.length) return {}
85+
let temp = {}
86+
data.map((arr, index) => {
87+
temp[`Polygon__${index}`] = arr.length
88+
})
89+
return temp
90+
}
91+
92+
const AddCoordinatesPerPolygon = ({ polygonCount, setPolygon, polygon, data, setData, onChangeHandler }) => {
93+
if(!polygonCount) return <div/>
94+
//const [coordinatesPerPolygon, setCoordinatesPerPolygon] = useState({})
95+
const [coordinatesPerPolygon, setCoordinatesPerPolygon] = useState(getCoordinatesPerPolygon(data))
96+
97+
98+
function addCoordinates(polygonNumber) {
99+
let temp = {...coordinatesPerPolygon}
100+
if(temp.hasOwnProperty(`Polygon__${polygonNumber}`)) {
101+
temp[`Polygon__${polygonNumber}`] += 1
102+
}
103+
else {
104+
// add new
105+
temp[`Polygon__${polygonNumber}`] = 1
106+
}
107+
setCoordinatesPerPolygon(temp)
108+
}
109+
110+
useEffect(() => {
111+
if(polygonCount) {
112+
let polygonArray = []
113+
for(let count = 0; count < polygonCount; count ++) {
114+
let countID = `Polygon__${count}`
115+
polygonArray.push(
116+
<Card className="bg-secondary" key={`Polygon__${count}`}>
117+
<Card.Body>
118+
<Card.Text className="text-muted fst-italic">{`Polygon number - ${count+1}`}</Card.Text>
119+
{coordinatesPerPolygon.hasOwnProperty(countID) && <DisplayCoordinatesLatLng
120+
data={data}
121+
setData={setData}
122+
polygonID={countID}
123+
polygonIndex={count}
124+
coordinatesPerPolygon={coordinatesPerPolygon}
125+
onChangeHandler={onChangeHandler}/>}
126+
<Button className="btn btn-sm bg-light text-dark" onClick={(e) => addCoordinates(count)}>
127+
<BiPlus className="mr-1"/>Add Coordinates
128+
</Button>
129+
</Card.Body>
130+
</Card>
131+
)
132+
}
133+
setPolygon(polygonArray)
134+
}
135+
}, [polygonCount, coordinatesPerPolygon])
136+
137+
138+
139+
return <>{polygon}</>
140+
}
141+
142+
function getFormDataLength(formData) {
143+
if(!formData) return 0
144+
return formData[0].length
145+
}
146+
147+
function getFormData(formData) {
148+
if(!formData) return []
149+
return formData[0]
150+
}
151+
152+
153+
export const NestedMultiPolygonArrayFieldTemplate = (args, props, property, id) => {
154+
const [polygonCount, setPolygonCount] = useState(getFormDataLength(props.formData))
155+
const [polygon, setPolygon] = useState()
156+
const [data, setData] = useState(getFormData(props.formData))
157+
158+
function addPolygon (e) {
159+
setPolygonCount(polygonCount+1)
160+
setData(arr => [...arr, []])
161+
}
162+
163+
console.log("data", data)
164+
165+
return <Stack gap={3} className="mb-3">
166+
<Stack>
167+
<TDBLabel name={props.name}
168+
required={props.required}
169+
className="tdb__label__width"
170+
id={id}/>
171+
<small className="text-muted fst-italic">Click here to add a new Polygon</small>
172+
</Stack>
173+
<AddCoordinatesPerPolygon polygonCount={polygonCount}
174+
onChangeHandler={props.onChange}
175+
data={data}
176+
setData={setData}
177+
setPolygon={setPolygon}
178+
polygon={polygon}/>
179+
<Button className="btn btn-sm bg-light text-dark" onClick={addPolygon}>
180+
<BiPlus className="mr-1"/>Add Polygon
181+
</Button>
182+
</Stack>
183+
}

0 commit comments

Comments
 (0)