in src/components/side-panel/layer-manager.js [121:274]
function LayerManagerFactory(AddDataButton, LayerPanel, SourceDataCatalog) {
// By wrapping layer panel using a sortable element we don't have to implement the drag and drop logic into the panel itself;
// Developers can provide any layer panel implementation and it will still be sortable
const SortableItem = sortableElement(({children, isSorting}) => {
return (
<SortableStyledItem className={classnames('sortable-layer-items', {sorting: isSorting})}>
{children}
</SortableStyledItem>
);
});
const SortableContainer = sortableContainer(({children}) => {
return <div>{children}</div>;
});
class LayerManager extends Component {
static propTypes = {
datasets: PropTypes.object.isRequired,
layerBlending: PropTypes.string.isRequired,
layerClasses: PropTypes.object.isRequired,
layers: PropTypes.arrayOf(PropTypes.any).isRequired,
// functions
addLayer: PropTypes.func.isRequired,
layerColorUIChange: PropTypes.func.isRequired,
layerConfigChange: PropTypes.func.isRequired,
layerTextLabelChange: PropTypes.func.isRequired,
layerVisualChannelConfigChange: PropTypes.func.isRequired,
layerTypeChange: PropTypes.func.isRequired,
layerVisConfigChange: PropTypes.func.isRequired,
openModal: PropTypes.func.isRequired,
removeLayer: PropTypes.func.isRequired,
removeDataset: PropTypes.func.isRequired,
showDatasetTable: PropTypes.func.isRequired,
updateLayerBlending: PropTypes.func.isRequired,
updateLayerOrder: PropTypes.func.isRequired
};
state = {
isSorting: false
};
layerClassSelector = props => props.layerClasses;
layerTypeOptionsSelector = createSelector(this.layerClassSelector, layerClasses =>
Object.keys(layerClasses).map(key => {
const layer = new layerClasses[key]();
return {
id: key,
label: layer.name,
icon: layer.layerIcon
};
})
);
_addEmptyNewLayer = () => {
this.props.addLayer();
};
_handleSort = ({oldIndex, newIndex}) => {
this.props.updateLayerOrder(arrayMove(this.props.layerOrder, oldIndex, newIndex));
this.setState({isSorting: false});
};
_onSortStart = () => {
this.setState({isSorting: true});
};
_updateBeforeSortStart = ({index}) => {
// if layer config is active, close it
const {layerOrder, layers, layerConfigChange} = this.props;
const layerIdx = layerOrder[index];
if (layers[layerIdx].config.isConfigActive) {
layerConfigChange(layers[layerIdx], {isConfigActive: false});
}
};
render() {
const {layers, datasets, layerOrder, openModal, intl} = this.props;
const defaultDataset = Object.keys(datasets)[0];
const layerTypeOptions = this.layerTypeOptionsSelector(this.props);
const layerActions = {
layerColorUIChange: this.props.layerColorUIChange,
layerConfigChange: this.props.layerConfigChange,
layerVisualChannelConfigChange: this.props.layerVisualChannelConfigChange,
layerTypeChange: this.props.layerTypeChange,
layerVisConfigChange: this.props.layerVisConfigChange,
layerTextLabelChange: this.props.layerTextLabelChange,
removeLayer: this.props.removeLayer
};
const panelProps = {
datasets,
openModal,
layerTypeOptions
};
return (
<div className="layer-manager">
<SourceDataCatalog
datasets={datasets}
showDatasetTable={this.props.showDatasetTable}
removeDataset={this.props.removeDataset}
showDeleteDataset
/>
<AddDataButton onClick={this.props.showAddDataModal} isInactive={!defaultDataset} />
<SidePanelDivider />
<SidePanelSection>
<SortableContainer
onSortEnd={this._handleSort}
onSortStart={this._onSortStart}
updateBeforeSortStart={this._updateBeforeSortStart}
lockAxis="y"
helperClass="sorting-layers"
useDragHandle
>
{layerOrder.map(
(layerIdx, index) =>
!layers[layerIdx].config.hidden && (
<SortableItem
key={`layer-${layerIdx}`}
index={index}
isSorting={this.state.isSorting}
>
<LayerPanel
{...panelProps}
{...layerActions}
sortData={layerIdx}
key={layers[layerIdx].id}
idx={layerIdx}
layer={layers[layerIdx]}
/>
</SortableItem>
)
)}
</SortableContainer>
</SidePanelSection>
<SidePanelSection>
{defaultDataset ? (
<Button className="add-layer-button" onClick={this._addEmptyNewLayer} width="105px">
<Add height="12px" />
<FormattedMessage id={'layerManager.addLayer'} />
</Button>
) : null}
</SidePanelSection>
<LayerBlendingSelector
layerBlending={this.props.layerBlending}
updateLayerBlending={this.props.updateLayerBlending}
intl={intl}
/>
</div>
);
}
}
return injectIntl(LayerManager);
}