put overlays over the map

This commit is contained in:
2025-09-25 11:09:10 +09:00
parent e2c251f7af
commit fc045abe24

View File

@ -705,43 +705,69 @@ const MapComponent = ({
</Portal > </Portal >
} }
<div style={{ position: 'absolute', width: '100%', height: '100%' }}>
{!selectedRegion &&
<Drawer style={{ position: 'absolute', height: '100%', zIndex: 9999 }} open={!selectedRegion} type='inline'> <div id={id} key={id} style={{ position: 'relative', width: '100%', height: '100%', maxHeight: '100%' }} ref={mapElement} onDragOver={(e) => e.preventDefault()} onDrop={(e) => handleImageDrop(e, id)}>
{/* <DrawerHeader style={{ flexDirection: 'row' }}> <div ref={tooltipRef}></div>
<div style={{ position: 'absolute', width: '100%', height: '100%' }}>
{!selectedRegion &&
<Drawer style={{ position: 'absolute', height: '100%', zIndex: 9999 }} open={!selectedRegion} type='inline'>
{/* <DrawerHeader style={{ flexDirection: 'row' }}>
<Text weight='bold' size={500}></Text> <Text weight='bold' size={500}></Text>
</DrawerHeader> */} </DrawerHeader> */}
<DrawerBody> <DrawerBody>
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}> <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
{regionsData && regionsData.map((region: IRegion) => ( {regionsData && regionsData.map((region: IRegion) => (
<Link key={region.id} onClick={() => setSelectedRegion(id, region.id)} <Link key={region.id} onClick={() => setSelectedRegion(id, region.id)}
onMouseEnter={() => { onMouseEnter={() => {
const feature = getFeatureByEntityId(region.id, regionsLayer) const feature = getFeatureByEntityId(region.id, regionsLayer)
if (feature) { if (feature) {
regionSelect.getFeatures().push(feature) regionSelect.getFeatures().push(feature)
} }
}} }}
onMouseLeave={() => { onMouseLeave={() => {
regionSelect.getFeatures().clear() regionSelect.getFeatures().clear()
}} }}
>{region.name}</Link> >{region.name}</Link>
))} ))}
</div> </div>
</DrawerBody> </DrawerBody>
</Drawer>} </Drawer>}
<Drawer style={{ position: 'absolute', height: '100%', zIndex: 9999 }} open={!!selectedRegion && !selectedYear} type='inline'> <Drawer style={{ position: 'absolute', height: '100%', zIndex: 9999 }} open={!!selectedRegion && !selectedYear} type='inline'>
<DrawerHeader style={{ flexDirection: 'row' }}> <DrawerHeader style={{ flexDirection: 'row' }}>
<Button icon={<ArrowLeft24Regular />} appearance='subtle' onClick={() => { <Button icon={<ArrowLeft24Regular />} appearance='subtle' onClick={() => {
if (selectedDistrict) { if (selectedDistrict) {
setSelectedDistrict(id, null)
districtSelect.getFeatures().clear()
regionsLayer.setOpacity(1)
} else {
setSelectedRegion(id, null)
regionSelect.getFeatures().clear()
if (map) {
const extent = regionsLayer.getSource()?.getExtent()
if (extent) {
map.getView().fit(fromExtent(extent), { duration: 100 })
regionsLayer.setOpacity(1)
}
}
}
}} />
{selectedDistrict ?
<Text weight='bold' size={500}>{getDistrictData(selectedDistrict)?.name}</Text>
:
<Text weight='bold' size={500}>{selectedRegion && getRegionData(selectedRegion)?.name}</Text>}
<Button appearance='subtle' style={{ marginLeft: 'auto' }} icon={<IconX />} onClick={() => {
setSelectedYear(id, null)
setSelectedDistrict(id, null) setSelectedDistrict(id, null)
districtSelect.getFeatures().clear()
regionsLayer.setOpacity(1)
} else {
setSelectedRegion(id, null) setSelectedRegion(id, null)
regionSelect.getFeatures().clear()
if (map) { if (map) {
const extent = regionsLayer.getSource()?.getExtent() const extent = regionsLayer.getSource()?.getExtent()
@ -751,157 +777,131 @@ const MapComponent = ({
regionsLayer.setOpacity(1) regionsLayer.setOpacity(1)
} }
} }
} }} />
}} /> </DrawerHeader>
{selectedDistrict ? <DrawerBody>
<Text weight='bold' size={500}>{getDistrictData(selectedDistrict)?.name}</Text> <div key={selectedRegion} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
: {selectedDistrict ?
<Text weight='bold' size={500}>{selectedRegion && getRegionData(selectedRegion)?.name}</Text>} selectedRegion && Object.entries(getRegionData(selectedRegion) as IRegion).map(([key, value]) => (
<div key={key} style={{ display: 'flex', justifyContent: 'space-between' }}>
<span>{key}</span>
<span>{value}</span>
</div>
))
:
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
<div>
{selectedRegion && Object.entries(getRegionData(selectedRegion) as IRegion).map(([key, value]) => (
<div key={key} style={{ display: 'flex', justifyContent: 'space-between' }}>
<span>{key}</span>
<span>{value}</span>
</div>
))}
</div>
<Button appearance='subtle' style={{ marginLeft: 'auto' }} icon={<IconX />} onClick={() => { {districtsData && districtsData.map((district: IDistrict) => (
setSelectedYear(id, null) <Link key={district.id} onClick={() => setSelectedDistrict(id, district.id)}
setSelectedDistrict(id, null) onMouseEnter={() => {
setSelectedRegion(id, null) const feature = getFeatureByEntityId(district.id, districtsLayer)
if (map) { if (feature) {
const extent = regionsLayer.getSource()?.getExtent() districtSelect.getFeatures().push(feature)
}
if (extent) { }}
map.getView().fit(fromExtent(extent), { duration: 100 }) onMouseLeave={() => {
regionsLayer.setOpacity(1) districtSelect.getFeatures().clear()
} }}
} >{district.name}</Link>
}} />
</DrawerHeader>
<DrawerBody>
<div key={selectedRegion} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
{selectedDistrict ?
selectedRegion && Object.entries(getRegionData(selectedRegion) as IRegion).map(([key, value]) => (
<div key={key} style={{ display: 'flex', justifyContent: 'space-between' }}>
<span>{key}</span>
<span>{value}</span>
</div>
))
:
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
<div>
{selectedRegion && Object.entries(getRegionData(selectedRegion) as IRegion).map(([key, value]) => (
<div key={key} style={{ display: 'flex', justifyContent: 'space-between' }}>
<span>{key}</span>
<span>{value}</span>
</div>
))} ))}
</div> </div>
}
{districtsData && districtsData.map((district: IDistrict) => ( {selectedDistrict && <Combobox
<Link key={district.id} onClick={() => setSelectedDistrict(id, district.id)} placeholder="Схема"
onMouseEnter={() => { clearable
const feature = getFeatureByEntityId(district.id, districtsLayer) style={{ minWidth: 'auto' }}
value={selectedYear ? selectedYear.toString() : ""}
if (feature) { onOptionSelect={(_ev, data) => {
districtSelect.getFeatures().push(feature) if (data.optionValue) {
} setSelectedYear(id, Number(data.optionValue));
}} } else {
onMouseLeave={() => { setSelectedYear(id, null);
districtSelect.getFeatures().clear() }
}} }}
>{district.name}</Link> >
{schemas.map((el) => (
<Option key={el} value={el}>
{el}
</Option>
))} ))}
</div> </Combobox>}
} </div>
</DrawerBody>
</Drawer>
{selectedDistrict && <Combobox
placeholder="Схема" <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%' }}>
clearable <div style={{ display: 'flex', height: '94%', padding: '0.5rem', flexGrow: 1 }}>
style={{ minWidth: 'auto' }} <div style={{ display: 'flex', flexDirection: 'column', width: '100%', maxWidth: '380px' }}>
value={selectedYear ? selectedYear.toString() : ""} <div style={{ display: 'flex', width: '100%', height: '100%', gap: '0.5rem' }}>
onOptionSelect={(_ev, data) => { {selectedRegion && selectedDistrict && selectedYear &&
if (data.optionValue) { <div
setSelectedYear(id, Number(data.optionValue)); style={{
} else { ...mapControlsStyle,
setSelectedYear(id, null); transition: 'width .3s ease',
display: 'flex',
flexDirection: 'column',
height: '100%',
width: leftPaneHidden ? '0px' : '100%',
overflow: 'hidden'
}}
>
<TabsPane defaultTab='objects' tabs={objectsPane} />
<Divider />
<TabsPane defaultTab='parameters' tabs={paramsPane} />
</div>
} }
}}
>
{schemas.map((el) => (
<Option key={el} value={el}>
{el}
</Option>
))}
</Combobox>}
</div>
</DrawerBody>
</Drawer>
{!!selectedRegion && !!selectedDistrict && !!selectedYear &&
<Button
icon={<IconChevronLeft size={16}
style={{
transform: `${leftPaneHidden ? 'rotate(180deg)' : ''}`,
}} />}
<div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%' }}> style={{
<div style={{ display: 'flex', height: '94%', padding: '0.5rem', flexGrow: 1 }}> zIndex: '1',
<div style={{ display: 'flex', flexDirection: 'column', width: '100%', maxWidth: '380px' }}> display: 'flex',
<div style={{ display: 'flex', width: '100%', height: '100%', gap: '0.5rem' }}> height: 'min-content'
{selectedRegion && selectedDistrict && selectedYear && }}
<div appearance='subtle'
style={{ onClick={() => setLeftPaneHidden(!leftPaneHidden)}
...mapControlsStyle, />
transition: 'width .3s ease', }
display: 'flex', </div>
flexDirection: 'column', </div>
height: '100%',
width: leftPaneHidden ? '0px' : '100%', <div style={{ display: 'flex', flexDirection: 'column', width: '100%', alignItems: 'center' }} >
overflow: 'hidden' <div style={{ ...mapControlsStyle, display: 'flex', flexDirection: 'column', width: 'fit-content' }}>
}} {selectedDistrict && selectedYear && <MapMode map_id={id} />}
> </div>
<TabsPane defaultTab='objects' tabs={objectsPane} /> </div>
<Divider />
<TabsPane defaultTab='parameters' tabs={paramsPane} /> <div style={{ display: 'flex', flexDirection: 'column', width: '100%', maxWidth: '340px', alignItems: 'flex-end', justifyContent: 'space-between' }}>
</div> {selectedRegion && selectedDistrict && selectedYear && mode === 'edit' &&
<MapToolbar map_id={id} />
} }
{!!selectedRegion && !!selectedDistrict && !!selectedYear && {!!selectedRegion && !!selectedDistrict && !!selectedYear &&
<Button <MapLegend selectedDistrict={selectedDistrict} selectedYear={selectedYear} />
icon={<IconChevronLeft size={16}
style={{
transform: `${leftPaneHidden ? 'rotate(180deg)' : ''}`,
}} />}
style={{
zIndex: '1',
display: 'flex',
height: 'min-content'
}}
appearance='subtle'
onClick={() => setLeftPaneHidden(!leftPaneHidden)}
/>
} }
</div> </div>
</div> </div>
<div style={{ display: 'flex', flexDirection: 'column', width: '100%', alignItems: 'center' }} >
<div style={{ ...mapControlsStyle, display: 'flex', flexDirection: 'column', width: 'fit-content' }}>
{selectedDistrict && selectedYear && <MapMode map_id={id} />}
</div>
</div>
<div style={{ display: 'flex', flexDirection: 'column', width: '100%', maxWidth: '340px', alignItems: 'flex-end', justifyContent: 'space-between' }}>
{selectedRegion && selectedDistrict && selectedYear && mode === 'edit' &&
<MapToolbar map_id={id} />
}
{!!selectedRegion && !!selectedDistrict && !!selectedYear &&
<MapLegend selectedDistrict={selectedDistrict} selectedYear={selectedYear} />
}
</div>
</div> </div>
</div> </div>
</div> </div>
<div id={id} key={id} style={{ position: 'relative', width: '100%', height: '100%', maxHeight: '100%' }} ref={mapElement} onDragOver={(e) => e.preventDefault()} onDrop={(e) => handleImageDrop(e, id)}>
<div ref={tooltipRef}></div>
</div>
{(linesValidating || figuresValidating) && ( {(linesValidating || figuresValidating) && (
<div <div
style={{ style={{