wahyu
10 months ago
2 changed files with 263 additions and 0 deletions
@ -0,0 +1,261 @@ |
|||||||
|
import React, { useState } from 'react'; |
||||||
|
import { Row, Col, Button } from 'antd'; |
||||||
|
import { RightOutlined, LeftOutlined } from '@ant-design/icons'; |
||||||
|
import { Widgets } from 'react-awesome-query-builder'; |
||||||
|
|
||||||
|
const DashboardDyna = () => { |
||||||
|
const [templates, setTemplates] = useState([]); |
||||||
|
const [widgets, setWidgets] = useState([]); |
||||||
|
const [templateColSpan, setTemplateColSpan] = useState(5); |
||||||
|
const [widgetColSpan, setWidgetColSpan] = useState(5); |
||||||
|
const [dashboardColSpan, setDashboardColSpan] = useState(14); |
||||||
|
|
||||||
|
const addWidget = (widget) => { |
||||||
|
const lastIndex = templates.length - 1; |
||||||
|
if (lastIndex >= 0) { |
||||||
|
let id = templates[lastIndex].id; |
||||||
|
let updatedTemplate = checkTemplate(id, [...widgets, widget]); |
||||||
|
let updatedTemplates = [...templates]; |
||||||
|
updatedTemplates[lastIndex] = updatedTemplate; |
||||||
|
setTemplates(updatedTemplates); |
||||||
|
} |
||||||
|
setWidgets([...widgets, widget]); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
const addTemplate = (template) => { |
||||||
|
const lastIndex = templates.length - 1; |
||||||
|
if (templates.length == 0 || templates[lastIndex].widgetCount <= widgets.length) { |
||||||
|
setTemplates([...templates, checkTemplate(template)]); |
||||||
|
setWidgets([]); |
||||||
|
} else { |
||||||
|
alert("Please select a template first") |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const clearTemplates = () => { |
||||||
|
setTemplates([]); |
||||||
|
clearWidgets() |
||||||
|
}; |
||||||
|
|
||||||
|
const clearWidgets = () => { |
||||||
|
setWidgets([]); |
||||||
|
}; |
||||||
|
|
||||||
|
const checkTemplate = (template, widgets = null) => { |
||||||
|
let component, widgetCount, id = template; |
||||||
|
switch (template) { |
||||||
|
case 0: |
||||||
|
component = ( |
||||||
|
<Row style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={24}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[0] : null} |
||||||
|
</div> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
); |
||||||
|
widgetCount = 1; |
||||||
|
break; |
||||||
|
case 1: |
||||||
|
component = ( |
||||||
|
<Row style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10, height: '25vh' }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[0] : null} |
||||||
|
</div> </Col> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[1] : null} |
||||||
|
</div> </Col> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[2] : null} |
||||||
|
</div> </Col> |
||||||
|
<Col span={6}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[3] : null} |
||||||
|
</div> </Col> |
||||||
|
</Row> |
||||||
|
); |
||||||
|
widgetCount = 4; |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
component = ( |
||||||
|
<Row style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10, height: '25vh' }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[0] : null} |
||||||
|
</div> </Col> |
||||||
|
<Col span={18}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[1] : null} |
||||||
|
</div> </Col> |
||||||
|
</Row> |
||||||
|
); |
||||||
|
widgetCount = 2; |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
component = ( |
||||||
|
<Row style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10, height: '25vh' }}> |
||||||
|
<Col span={17}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[0] : null} |
||||||
|
</div> </Col> |
||||||
|
<Col span={6}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10, height: '25vh' }}> |
||||||
|
{widgets ? widgets[1] : null} |
||||||
|
</div> </Col> |
||||||
|
</Row> |
||||||
|
); |
||||||
|
widgetCount = 2; |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
return { component, widgetCount, id }; |
||||||
|
}; |
||||||
|
|
||||||
|
const toggleTemplateColumn = () => { |
||||||
|
if (templateColSpan === 1) { |
||||||
|
setTemplateColSpan(5); |
||||||
|
setDashboardColSpan(dashboardColSpan - 4); |
||||||
|
} else { |
||||||
|
setTemplateColSpan(1); |
||||||
|
setDashboardColSpan(dashboardColSpan + 4); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const toggleWidgetColumn = () => { |
||||||
|
if (widgetColSpan === 1) { |
||||||
|
setWidgetColSpan(5); |
||||||
|
setDashboardColSpan(dashboardColSpan - 4); |
||||||
|
} else { |
||||||
|
setWidgetColSpan(1); |
||||||
|
setDashboardColSpan(dashboardColSpan + 4); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return ( |
||||||
|
<div style={{ marginLeft: -25, marginRight: -25 }}> |
||||||
|
<Row> |
||||||
|
<Col span={templateColSpan}> |
||||||
|
<div style={{ backgroundColor: '#F8F8F8', margin: 2, paddingLeft: 20, paddingRight: 20, paddingTop: 10, height: '90vh' }}> |
||||||
|
<div style={{ display: 'flex', flexDirection: 'row', marginBottom: 10 }}> |
||||||
|
<div style={{ flex: 20, display: 'flex', flexDirection: 'column' }}> |
||||||
|
{templateColSpan === 1 ? |
||||||
|
<Button icon={<RightOutlined />} onClick={toggleTemplateColumn}></Button> |
||||||
|
: |
||||||
|
<> |
||||||
|
<div style={{ color: '#444444', fontSize: 14, fontWeight: 'bold', marginBottom: 10 }}>Template</div> |
||||||
|
|
||||||
|
<Row onClick={() => addTemplate(0)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={24}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Row onClick={() => addTemplate(1)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={6}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Row onClick={() => addTemplate(2)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={18}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Row onClick={() => addTemplate(3)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={17}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={6}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Button icon={<LeftOutlined />} onClick={toggleTemplateColumn}></Button> |
||||||
|
</> |
||||||
|
} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</Col> |
||||||
|
<Col span={widgetColSpan}> |
||||||
|
<div style={{ backgroundColor: '#F8F8F8', margin: 2, paddingLeft: 20, paddingRight: 20, paddingTop: 10, height: '90vh' }}> |
||||||
|
<div style={{ display: 'flex', flexDirection: 'row', marginBottom: 10 }}> |
||||||
|
<div style={{ flex: 20, display: 'flex', flexDirection: 'column' }}> |
||||||
|
{widgetColSpan === 1 ? |
||||||
|
<Button icon={<RightOutlined />} onClick={toggleWidgetColumn}></Button> |
||||||
|
: |
||||||
|
<> |
||||||
|
<div style={{ color: '#444444', fontSize: 14, fontWeight: 'bold', marginBottom: 10 }}>Widget</div> |
||||||
|
|
||||||
|
<Row onClick={() => addWidget(0)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={18}> |
||||||
|
<div style={{ padding: 0 }}>Pie Chart Project By Role</div> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Row onClick={() => addWidget(1)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={18}> |
||||||
|
<div style={{ padding: 0 }}>Pie Chart Project By Role</div> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Row onClick={() => addWidget(2)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={18}> |
||||||
|
<div style={{ padding: 0 }}>Pie Chart Project By Role</div> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Row onClick={() => addWidget(3)} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}> |
||||||
|
<Col span={5}> |
||||||
|
<div style={{ backgroundColor: '#CCCCCC', padding: 10 }} /> |
||||||
|
</Col> |
||||||
|
<Col span={18}> |
||||||
|
<div style={{ padding: 0 }}>Pie Chart Project By Role</div> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
<Button icon={<LeftOutlined />} onClick={toggleWidgetColumn}></Button> |
||||||
|
</> |
||||||
|
} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</Col> |
||||||
|
<Col span={dashboardColSpan}> |
||||||
|
<div style={{ backgroundColor: '#F8F8F8', margin: 2, paddingLeft: 20, paddingRight: 20, paddingTop: 10, height: '90vh' }}> |
||||||
|
<div style={{ display: 'flex', flexDirection: 'row', marginBottom: 10 }}> |
||||||
|
<div style={{ flex: 20, display: 'flex', flexDirection: 'column' }}> |
||||||
|
<div style={{ color: '#444444', fontSize: 14, fontWeight: 'bold', marginBottom: 10 }}>Dashboard</div> |
||||||
|
{templates.length > 0 ? templates.map((template) => { |
||||||
|
return template.component; |
||||||
|
}) : null} |
||||||
|
<Button onClick={() => clearTemplates()}>Clear</Button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</Col> |
||||||
|
</Row> |
||||||
|
</div> |
||||||
|
); |
||||||
|
}; |
||||||
|
|
||||||
|
export default DashboardDyna; |
Loading…
Reference in new issue