forked from community/device-mgt-core
parent
7effaa844b
commit
746e6269e0
@ -0,0 +1,66 @@
|
||||
import React from 'react';
|
||||
import {Button, Form, Row, Col, Card, Steps, Input, message, Modal, notification, Typography} from "antd";
|
||||
import axios from "axios";
|
||||
import {withConfigContext} from "../../context/ConfigContext";
|
||||
import DeviceType from "./DeviceType";
|
||||
import EnrollAgent from "./EnrollAgent";
|
||||
const {Step} = Steps;
|
||||
|
||||
class AddDevice extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.config = this.props.context;
|
||||
this.state = {
|
||||
isAddDeviceModalVisible: false,
|
||||
current : 0,
|
||||
}
|
||||
};
|
||||
|
||||
onClickType = () =>{
|
||||
this.setState({
|
||||
current: 1,
|
||||
})
|
||||
};
|
||||
|
||||
openAddDeviceModal = () =>{
|
||||
this.setState({
|
||||
isAddDeviceModalVisible : true,
|
||||
})
|
||||
};
|
||||
|
||||
render() {
|
||||
const {loading, current, isError, supportedOsVersions, errorText, forbiddenErrors} = this.state;
|
||||
const { getFieldDecorator } = this.props.form;
|
||||
return (
|
||||
<div>
|
||||
<Row>
|
||||
<Col span={16} offset={4}>
|
||||
<Steps style={{minHeight: 32}} current={current}>
|
||||
<Step key="DeviceType" title="Device Type"/>
|
||||
<Step key="EnrollAgent" title="Enroll Agent"/>
|
||||
<Step key="Result" title="Result"/>
|
||||
</Steps>
|
||||
</Col>
|
||||
<Col span={16} offset={4}>
|
||||
|
||||
<Card style={{marginTop: 24}}>
|
||||
<div style={{display: (current === 0 ? 'unset' : 'none')}}>
|
||||
<DeviceType onClickType={this.onClickType}/>
|
||||
</div>
|
||||
<div style={{display: (current === 1 ? 'unset' : 'none')}}>
|
||||
<EnrollAgent />
|
||||
</div>
|
||||
|
||||
<div style={{display: (current === 2 ? 'unset' : 'none')}}>
|
||||
</div>
|
||||
</Card>
|
||||
</Col>
|
||||
</Row>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default withConfigContext(Form.create({name: 'add-device'})(AddDevice));
|
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (pvt) Ltd. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
import axios from "axios";
|
||||
import {Card, Col, Icon, message, notification, Row, Typography} from "antd";
|
||||
import TimeAgo from 'javascript-time-ago'
|
||||
// Load locale-specific relative date/time formatting rules.
|
||||
import en from 'javascript-time-ago/locale/en'
|
||||
import {withConfigContext} from "../../context/ConfigContext";
|
||||
|
||||
const {Text} = Typography;
|
||||
|
||||
let config = null;
|
||||
let apiUrl;
|
||||
|
||||
class DeviceType extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
config = this.props.context;
|
||||
TimeAgo.addLocale(en);
|
||||
this.state = {
|
||||
data: [],
|
||||
pagination: {},
|
||||
loading: false,
|
||||
selectedRows: []
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.fetchUsers();
|
||||
}
|
||||
|
||||
onClickCard = (data) =>{
|
||||
console.log(data);
|
||||
this.props.onClickType();
|
||||
};
|
||||
|
||||
//fetch data from api
|
||||
fetchUsers = (params = {}) => {
|
||||
const config = this.props.context;
|
||||
this.setState({loading: true});
|
||||
|
||||
// get current page
|
||||
const currentPage = (params.hasOwnProperty("page")) ? params.page : 1;
|
||||
|
||||
const extraParams = {
|
||||
offset: 10 * (currentPage - 1), //calculate the offset
|
||||
limit: 10,
|
||||
};
|
||||
|
||||
const encodedExtraParams = Object.keys(extraParams)
|
||||
.map(key => key + '=' + extraParams[key]).join('&');
|
||||
|
||||
apiUrl = window.location.origin + config.serverConfig.invoker.uri +
|
||||
config.serverConfig.invoker.deviceMgt +
|
||||
"/device-types";
|
||||
|
||||
//send request to the invokerss
|
||||
axios.get(apiUrl).then(res => {
|
||||
if (res.status === 200) {
|
||||
const pagination = {...this.state.pagination};
|
||||
this.setState({
|
||||
loading: false,
|
||||
data: JSON.parse(res.data.data),
|
||||
pagination,
|
||||
});
|
||||
}
|
||||
|
||||
}).catch((error) => {
|
||||
if (error.hasOwnProperty("response") && error.response.status === 401) {
|
||||
//todo display a popop with error
|
||||
message.error('You are not logged in');
|
||||
window.location.href = window.location.origin + '/entgra/login';
|
||||
} else {
|
||||
notification["error"]({
|
||||
message: "There was a problem",
|
||||
duration: 0,
|
||||
description:"Error occurred while trying to load device types.",
|
||||
});
|
||||
}
|
||||
|
||||
this.setState({loading: false});
|
||||
});
|
||||
};
|
||||
|
||||
handleTableChange = (pagination, filters, sorter) => {
|
||||
const pager = {...this.state.pagination};
|
||||
pager.current = pagination.current;
|
||||
this.setState({
|
||||
pagination: pager,
|
||||
});
|
||||
this.fetch({
|
||||
results: pagination.pageSize,
|
||||
page: pagination.current,
|
||||
sortField: sorter.field,
|
||||
sortOrder: sorter.order,
|
||||
...filters,
|
||||
});
|
||||
};
|
||||
|
||||
render() {
|
||||
|
||||
const {data, pagination, loading, selectedRows} = this.state;
|
||||
const { Meta } = Card;
|
||||
const itemCard = data.map((data) =>
|
||||
<Col span={5} key={data.id}>
|
||||
<Card
|
||||
size="default"
|
||||
style={{ width: 150 }}
|
||||
bordered={true}
|
||||
onClick={this.onClickCard}
|
||||
cover={<Icon type="android" key="device-types" style={{color:'#ffffff',
|
||||
backgroundColor:'#4b92db', fontSize: '100px', padding:'20px'}}/>}
|
||||
>
|
||||
<Meta
|
||||
title={data.name}
|
||||
/>
|
||||
|
||||
</Card>
|
||||
</Col>
|
||||
);
|
||||
return (
|
||||
<div>
|
||||
<Row gutter={16}>
|
||||
{itemCard}
|
||||
</Row>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default withConfigContext(DeviceType);
|
@ -0,0 +1,87 @@
|
||||
import React from 'react';
|
||||
import {Collapse, Button, Divider, message, notification , Select} from 'antd';
|
||||
import TimeAgo from "javascript-time-ago/modules/JavascriptTimeAgo";
|
||||
import en from "javascript-time-ago/locale/en";
|
||||
import axios from "axios";
|
||||
import {withConfigContext} from "../../context/ConfigContext";
|
||||
const { Option } = Select;
|
||||
|
||||
class EnrollAgent extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.config = this.props.context;
|
||||
TimeAgo.addLocale(en);
|
||||
this.state = {
|
||||
data: [],
|
||||
pagination: {},
|
||||
loading: false,
|
||||
selectedRows: [],
|
||||
visibleSelector: {display : 'none'}
|
||||
};
|
||||
}
|
||||
componentDidMount() {
|
||||
this.getConfigData();
|
||||
};
|
||||
|
||||
onGetEnrollmentQR = () =>{
|
||||
this.setState({
|
||||
visibleSelector: {display : 'block'}
|
||||
})
|
||||
};
|
||||
|
||||
getConfigData = () =>{
|
||||
axios.get(
|
||||
window.location.origin + this.config.serverConfig.invoker.uri +
|
||||
"/device-mgt/android/v1.0/configuration"
|
||||
).then(res => {
|
||||
let data = res.data.data;
|
||||
}).catch((error) => {
|
||||
if (error.hasOwnProperty("response") && error.response.status === 401) {
|
||||
//todo display a popop with error
|
||||
message.error('You are not logged in');
|
||||
window.location.href = window.location.origin + '/entgra/login';
|
||||
} else {
|
||||
notification["error"]({
|
||||
message: "There was a problem",
|
||||
duration: 0,
|
||||
description:
|
||||
"Error occurred while retrieving device groups.",
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
<Divider orientation="left">Step 01 - Get your Android Agent.</Divider>
|
||||
<div>
|
||||
<p>The Android agent can be downloaded by using following QR.
|
||||
The generated QR code can be scanned, and the agent APK downloaded from the link,
|
||||
and transferred to the device and then installed.</p>
|
||||
</div>
|
||||
<div style={{ margin:'30px'}}>
|
||||
<Button type="primary" size={"default"}>
|
||||
Get Android Agent
|
||||
</Button>
|
||||
</div>
|
||||
<Divider orientation="left">Step 02 - Enroll the Android Agent.</Divider>
|
||||
|
||||
<div>
|
||||
<p> Your device can be enrolled with Entgra IoTS automatically via QR code.
|
||||
To enroll first download agent as mentioned in Step 1 then proceed with the ENROLL WITH
|
||||
QR option from the device setup activity. Thereafter select the ownership configuration
|
||||
and scan the generated QR to complete the process.</p>
|
||||
</div>
|
||||
<div style={{ margin:'30px'}}>
|
||||
<Button type="primary" size={"default"} onClick={this.onGetEnrollmentQR}>
|
||||
Enroll Using QR
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default withConfigContext(EnrollAgent);
|
@ -0,0 +1,50 @@
|
||||
import React from 'react';
|
||||
import {
|
||||
PageHeader,
|
||||
Typography,
|
||||
Breadcrumb,
|
||||
Icon,
|
||||
Button, Select
|
||||
} from "antd";
|
||||
import {Link} from "react-router-dom";
|
||||
import AddDevice from "../../../components/Devices/AddDevice";
|
||||
|
||||
const {Paragraph} = Typography;
|
||||
|
||||
class DeviceEnroll extends React.Component {
|
||||
routes;
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.routes = props.routes;
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
<PageHeader style={{paddingTop: 0}}>
|
||||
<Breadcrumb style={{paddingBottom: 16}}>
|
||||
<Breadcrumb.Item>
|
||||
<Link to="/entgra/devices"><Icon type="home"/> Home</Link>
|
||||
</Breadcrumb.Item>
|
||||
<Breadcrumb.Item><Link to="/entgra/devices">Devices</Link></Breadcrumb.Item>
|
||||
<Breadcrumb.Item>Enroll Device</Breadcrumb.Item>
|
||||
</Breadcrumb>
|
||||
<div className="wrap">
|
||||
<h3>Devices</h3>
|
||||
<Paragraph>All enrolled devices</Paragraph>
|
||||
</div>
|
||||
<div style={{borderRadius: 5}}>
|
||||
<AddDevice/>
|
||||
</div>
|
||||
</PageHeader>
|
||||
<div style={{background: '#f0f2f5', padding: 24, minHeight: 720}}>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default DeviceEnroll;
|
Loading…
Reference in new issue