|
|
@ -17,10 +17,11 @@
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
import React from "react";
|
|
|
|
import React from "react";
|
|
|
|
import {Button, Col, Divider, Form, Icon, Input, notification, Row, Select, Switch, Upload} from "antd";
|
|
|
|
import {Button, Col, Divider, Form, Icon, Input, notification, Row, Select, Spin, Switch, Upload} from "antd";
|
|
|
|
import axios from "axios";
|
|
|
|
import axios from "axios";
|
|
|
|
import {withConfigContext} from "../../../context/ConfigContext";
|
|
|
|
import {withConfigContext} from "../../../context/ConfigContext";
|
|
|
|
import {handleApiError} from "../../../js/Utils";
|
|
|
|
import {handleApiError} from "../../../js/Utils";
|
|
|
|
|
|
|
|
import debounce from 'lodash.debounce';
|
|
|
|
|
|
|
|
|
|
|
|
const formItemLayout = {
|
|
|
|
const formItemLayout = {
|
|
|
|
labelCol: {
|
|
|
|
labelCol: {
|
|
|
@ -42,12 +43,15 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
this.state = {
|
|
|
|
this.state = {
|
|
|
|
categories: [],
|
|
|
|
categories: [],
|
|
|
|
tags: [],
|
|
|
|
tags: [],
|
|
|
|
deviceTypes:[]
|
|
|
|
deviceTypes: [],
|
|
|
|
|
|
|
|
fetching: false,
|
|
|
|
|
|
|
|
roleSearchValue: [],
|
|
|
|
|
|
|
|
unrestrictedRoles: []
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
this.lastFetchId = 0;
|
|
|
|
|
|
|
|
this.fetchUser = debounce(this.fetchRoles, 800);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handleSubmit = e => {
|
|
|
|
handleSubmit = e => {
|
|
|
|
e.preventDefault();
|
|
|
|
e.preventDefault();
|
|
|
|
const {formConfig} = this.props;
|
|
|
|
const {formConfig} = this.props;
|
|
|
@ -58,13 +62,17 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
this.setState({
|
|
|
|
this.setState({
|
|
|
|
loading: true
|
|
|
|
loading: true
|
|
|
|
});
|
|
|
|
});
|
|
|
|
const {name, description, categories, tags, price, isSharedWithAllTenants, binaryFile, icon, screenshots, releaseDescription, releaseType} = values;
|
|
|
|
const {name, description, categories, tags, unrestrictedRoles} = values;
|
|
|
|
|
|
|
|
const unrestrictedRolesData = [];
|
|
|
|
|
|
|
|
unrestrictedRoles.map(val=>{
|
|
|
|
|
|
|
|
unrestrictedRolesData.push(val.key);
|
|
|
|
|
|
|
|
});
|
|
|
|
const application = {
|
|
|
|
const application = {
|
|
|
|
name,
|
|
|
|
name,
|
|
|
|
description,
|
|
|
|
description,
|
|
|
|
categories,
|
|
|
|
categories,
|
|
|
|
tags,
|
|
|
|
tags,
|
|
|
|
unrestrictedRoles: [],
|
|
|
|
unrestrictedRoles: unrestrictedRolesData,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (formConfig.installationType !== "WEB_CLIP") {
|
|
|
|
if (formConfig.installationType !== "WEB_CLIP") {
|
|
|
@ -141,15 +149,15 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
const allowedDeviceTypes = [];
|
|
|
|
const allowedDeviceTypes = [];
|
|
|
|
|
|
|
|
|
|
|
|
// exclude mobile device types if installation type is custom
|
|
|
|
// exclude mobile device types if installation type is custom
|
|
|
|
if(installationType==="CUSTOM"){
|
|
|
|
if (installationType === "CUSTOM") {
|
|
|
|
allDeviceTypes.forEach(deviceType=>{
|
|
|
|
allDeviceTypes.forEach(deviceType => {
|
|
|
|
if(!mobileDeviceTypes.includes(deviceType.name)){
|
|
|
|
if (!mobileDeviceTypes.includes(deviceType.name)) {
|
|
|
|
allowedDeviceTypes.push(deviceType);
|
|
|
|
allowedDeviceTypes.push(deviceType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}else{
|
|
|
|
} else {
|
|
|
|
allDeviceTypes.forEach(deviceType=>{
|
|
|
|
allDeviceTypes.forEach(deviceType => {
|
|
|
|
if(mobileDeviceTypes.includes(deviceType.name)){
|
|
|
|
if (mobileDeviceTypes.includes(deviceType.name)) {
|
|
|
|
allowedDeviceTypes.push(deviceType);
|
|
|
|
allowedDeviceTypes.push(deviceType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
@ -168,9 +176,49 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fetchRoles = value => {
|
|
|
|
|
|
|
|
const config = this.props.context;
|
|
|
|
|
|
|
|
this.lastFetchId += 1;
|
|
|
|
|
|
|
|
const fetchId = this.lastFetchId;
|
|
|
|
|
|
|
|
this.setState({data: [], fetching: true});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
axios.get(
|
|
|
|
|
|
|
|
window.location.origin + config.serverConfig.invoker.uri + config.serverConfig.invoker.deviceMgt + "/roles?filter=" + value,
|
|
|
|
|
|
|
|
).then(res => {
|
|
|
|
|
|
|
|
if (res.status === 200) {
|
|
|
|
|
|
|
|
if (fetchId !== this.lastFetchId) {
|
|
|
|
|
|
|
|
// for fetch callback order
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const data = res.data.data.roles.map(role => ({
|
|
|
|
|
|
|
|
text: role,
|
|
|
|
|
|
|
|
value: role,
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.setState({
|
|
|
|
|
|
|
|
unrestrictedRoles: data,
|
|
|
|
|
|
|
|
fetching: false
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}).catch((error) => {
|
|
|
|
|
|
|
|
handleApiError(error, "Error occurred while trying to load roles.");
|
|
|
|
|
|
|
|
this.setState({fetching: false});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handleRoleSearch = roleSearchValue => {
|
|
|
|
|
|
|
|
this.setState({
|
|
|
|
|
|
|
|
roleSearchValue,
|
|
|
|
|
|
|
|
unrestrictedRoles: [],
|
|
|
|
|
|
|
|
fetching: false,
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
render() {
|
|
|
|
render() {
|
|
|
|
const {formConfig} = this.props;
|
|
|
|
const {formConfig} = this.props;
|
|
|
|
const {categories, tags, deviceTypes} = this.state;
|
|
|
|
const {categories, tags, deviceTypes, fetching, roleSearchValue, unrestrictedRoles} = this.state;
|
|
|
|
const {getFieldDecorator} = this.props.form;
|
|
|
|
const {getFieldDecorator} = this.props.form;
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
return (
|
|
|
@ -198,8 +246,7 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
<Select
|
|
|
|
<Select
|
|
|
|
style={{width: '100%'}}
|
|
|
|
style={{width: '100%'}}
|
|
|
|
placeholder="select device type"
|
|
|
|
placeholder="select device type"
|
|
|
|
onChange={this.handleCategoryChange}
|
|
|
|
onChange={this.handleCategoryChange}>
|
|
|
|
>
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
deviceTypes.map(deviceType => {
|
|
|
|
deviceTypes.map(deviceType => {
|
|
|
|
return (
|
|
|
|
return (
|
|
|
@ -238,6 +285,29 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
<TextArea placeholder="Enter the description..." rows={7}/>
|
|
|
|
<TextArea placeholder="Enter the description..." rows={7}/>
|
|
|
|
)}
|
|
|
|
)}
|
|
|
|
</Form.Item>
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{/*Unrestricted Roles*/}
|
|
|
|
|
|
|
|
<Form.Item {...formItemLayout} label="Unrestricted Roles">
|
|
|
|
|
|
|
|
{getFieldDecorator('unrestrictedRoles', {
|
|
|
|
|
|
|
|
rules: [],
|
|
|
|
|
|
|
|
initialValue: []
|
|
|
|
|
|
|
|
})(
|
|
|
|
|
|
|
|
<Select
|
|
|
|
|
|
|
|
mode="multiple"
|
|
|
|
|
|
|
|
labelInValue
|
|
|
|
|
|
|
|
value={roleSearchValue}
|
|
|
|
|
|
|
|
placeholder="Search roles"
|
|
|
|
|
|
|
|
notFoundContent={fetching ? <Spin size="small"/> : null}
|
|
|
|
|
|
|
|
filterOption={false}
|
|
|
|
|
|
|
|
onSearch={this.fetchRoles}
|
|
|
|
|
|
|
|
onChange={this.handleRoleSearch}
|
|
|
|
|
|
|
|
style={{width: '100%'}}>
|
|
|
|
|
|
|
|
{unrestrictedRoles.map(d => (
|
|
|
|
|
|
|
|
<Option key={d.value}>{d.text}</Option>
|
|
|
|
|
|
|
|
))}
|
|
|
|
|
|
|
|
</Select>
|
|
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item {...formItemLayout} label="Categories">
|
|
|
|
<Form.Item {...formItemLayout} label="Categories">
|
|
|
|
{getFieldDecorator('categories', {
|
|
|
|
{getFieldDecorator('categories', {
|
|
|
|
rules: [{
|
|
|
|
rules: [{
|
|
|
@ -249,8 +319,7 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
mode="multiple"
|
|
|
|
mode="multiple"
|
|
|
|
style={{width: '100%'}}
|
|
|
|
style={{width: '100%'}}
|
|
|
|
placeholder="Select a Category"
|
|
|
|
placeholder="Select a Category"
|
|
|
|
onChange={this.handleCategoryChange}
|
|
|
|
onChange={this.handleCategoryChange}>
|
|
|
|
>
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
categories.map(category => {
|
|
|
|
categories.map(category => {
|
|
|
|
return (
|
|
|
|
return (
|
|
|
@ -274,8 +343,7 @@ class NewAppDetailsForm extends React.Component {
|
|
|
|
<Select
|
|
|
|
<Select
|
|
|
|
mode="tags"
|
|
|
|
mode="tags"
|
|
|
|
style={{width: '100%'}}
|
|
|
|
style={{width: '100%'}}
|
|
|
|
placeholder="Tags"
|
|
|
|
placeholder="Tags">
|
|
|
|
>
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
tags.map(tag => {
|
|
|
|
tags.map(tag => {
|
|
|
|
return (
|
|
|
|
return (
|
|
|
|