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