Skip to content

Commit 2dfd579

Browse files
Sergiu Micleaalexpilotti
authored andcommitted
Added modal for replica execution options CORWEB-82
The modal is opened when executing a replica from replica detail view.
1 parent 83f92a0 commit 2dfd579

7 files changed

Lines changed: 309 additions & 14 deletions

File tree

src/actions/MigrationActions/MigrationActions.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ MigrationActions.deleteReplica.listen((replica, callback = null) => {
119119
.catch(MigrationActions.deleteReplica.failed);
120120
})
121121

122-
MigrationActions.executeReplica.listen((replica, callback = null, errorCallback = null) => {
122+
MigrationActions.executeReplica.listen((replica, callback = null, errorCallback = null, options = null) => {
123123
if (replica.type == 'replica') {
124124
// check if endpoints exists
125125
let connections = Reflux.GlobalState.connectionStore.connections
@@ -145,10 +145,11 @@ MigrationActions.executeReplica.listen((replica, callback = null, errorCallback
145145
}
146146
let projectId = Reflux.GlobalState.userStore.currentUser.project.id
147147

148-
let payload = {
149-
execution: {
150-
shutdown_instances: false
151-
}
148+
let payload = { execution: { shutdown_instances: false } }
149+
if (options) {
150+
options.forEach(o => {
151+
payload.execution[o.field] = o.value || false
152+
})
152153
}
153154

154155
Api.sendAjaxRequest({
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
Copyright (C) 2017 Cloudbase Solutions SRL
3+
4+
This program is free software: you can redistribute it and/or modify
5+
it under the terms of the GNU Affero General Public License as
6+
published by the Free Software Foundation, either version 3 of the
7+
License, or (at your option) any later version.
8+
9+
This program is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
GNU Affero General Public License for more details.
13+
14+
You should have received a copy of the GNU Affero General Public License
15+
along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
/* eslint-disable dot-notation */
18+
19+
import React, { PropTypes } from 'react';
20+
import Reflux from 'reflux';
21+
import withStyles from 'isomorphic-style-loader/lib/withStyles';
22+
import s from './ReplicaExecutionOptions.scss';
23+
import Dropdown from '../NewDropdown';
24+
import Helper from "../Helper";
25+
26+
class ReplicaExecutionOptions extends Reflux.Component {
27+
static propTypes = {
28+
onCancel: PropTypes.func.isRequired,
29+
onExecute: PropTypes.func.isRequired
30+
}
31+
32+
constructor(props) {
33+
super(props)
34+
35+
this.state = {
36+
fields: [
37+
{
38+
field: 'shutdown_instances',
39+
type: 'boolean'
40+
}
41+
]
42+
}
43+
}
44+
45+
componentWillMount() {
46+
super.componentWillMount.call(this)
47+
}
48+
49+
componentWillUnmount() {
50+
super.componentWillMount.call(this)
51+
}
52+
53+
fieldChange(e, field) {
54+
let fields = this.state.fields.concat([]);
55+
fields.find(f => f.field === field).value = e.value === 'true'
56+
this.setState({ fields: fields })
57+
}
58+
59+
render() {
60+
let booleanOptions = [{ label: 'Yes', value: 'true' }, { label: 'No', value: 'false' }]
61+
62+
let fields = this.state.fields.map((f, i) => {
63+
if (f.type !== 'boolean') {
64+
return null
65+
}
66+
67+
return (
68+
<div className="form-group" key={i}>
69+
<label>{Helper.convertCloudFieldLabel(f.field)}</label>
70+
<Dropdown
71+
options={booleanOptions}
72+
onChange={(e) => { this.fieldChange(e, f.field) }}
73+
placeholder="Choose a value"
74+
value={f.value ? booleanOptions[0] : booleanOptions[1]}
75+
/>
76+
</div>
77+
)
78+
})
79+
let modalBody = (
80+
<div className={s.container}>
81+
<div className={s.formContainer}>
82+
{fields}
83+
</div>
84+
<div className={s.buttons}>
85+
<button className="gray" onClick={() => this.props.onCancel()}>Cancel</button>
86+
<button onClick={() => this.props.onExecute(this.state.fields)}>Execute</button>
87+
</div>
88+
</div>
89+
)
90+
91+
return (
92+
<div className={s.root}>
93+
<div className={s.header}>
94+
<h3>Replica Execution Options</h3>
95+
</div>
96+
<div className={s.images}>
97+
<div className={s.replicaImage} />
98+
<div className={s.arrowImage} />
99+
<div className={s.executionImage} />
100+
</div>
101+
{modalBody}
102+
</div>
103+
)
104+
}
105+
}
106+
107+
export default withStyles(ReplicaExecutionOptions, s)
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
Copyright (C) 2017 Cloudbase Solutions SRL
3+
4+
This program is free software: you can redistribute it and/or modify
5+
it under the terms of the GNU Affero General Public License as
6+
published by the Free Software Foundation, either version 3 of the
7+
License, or (at your option) any later version.
8+
9+
This program is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
GNU Affero General Public License for more details.
13+
14+
You should have received a copy of the GNU Affero General Public License
15+
along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
@import '../variables.scss';
19+
20+
.root {
21+
:global(.Dropdown-control) {
22+
text-align: left;
23+
}
24+
}
25+
.header {
26+
h3 {
27+
font-weight: $weight-light;
28+
font-size: 24px;
29+
color: $gray-darker;
30+
padding: 10px;
31+
background-color: $gray-light;
32+
text-align: center;
33+
margin: 0;
34+
border-radius: 4px 4px 0 0;
35+
}
36+
}
37+
38+
.formContainer {
39+
display: flex;
40+
flex-wrap: wrap;
41+
margin-left: -64px;
42+
padding: 0 32px;
43+
position: relative;
44+
:global(.form-group) {
45+
min-width: 224px;
46+
margin-bottom: 16px;
47+
margin-left: 64px;
48+
&> label {
49+
font-weight: 500;
50+
font-size: 10px;
51+
color: $task-gray-light;
52+
letter-spacing: -0.33px;
53+
text-transform: uppercase;
54+
}
55+
}
56+
}
57+
58+
.buttons {
59+
display: flex;
60+
justify-content: space-between;
61+
margin: 16px 32px 32px 32px;
62+
63+
button {
64+
width: 224px;
65+
}
66+
}
67+
68+
.images {
69+
display: flex;
70+
align-items: center;
71+
justify-content: center;
72+
margin-top: 64px;
73+
margin-bottom: 80px;
74+
> div {
75+
margin-right: 32px;
76+
}
77+
.replicaImage {
78+
width: 96px;
79+
height: 84px;
80+
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI5NnB4IiBoZWlnaHQ9Ijg0cHgiIHZpZXdCb3g9IjAgMCA5NiA4NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5JY29uLVJlcGxpY2EtVkw8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iU3ltYm9scyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+ICAgICAgICA8ZyBpZD0iTW9kYWwtTmV3TWlncmF0aW9uIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTQ0LjAwMDAwMCwgLTExOC4wMDAwMDApIiBzdHJva2U9IiNGOTE2NjEiIHN0cm9rZS13aWR0aD0iMiI+ICAgICAgICAgICAgPGcgaWQ9Ikljb24tUmVwbGljYS1WTCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ0LjAwMDAwMCwgMTEyLjAwMDAwMCkiPiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODQuOTkxNjc3NywzOC4wNzY5NDM0IEM5MS4wMTI2NjQ4LDQwLjg0OTUxOTUgOTQuNTk0Njg1NSw0NC4zMTU3Nzc2IDk0LjU5NDY4NTUsNDguMDcyMjc3NSBDOTQuNTk0Njg1NSw1MS45MzAxOTc4IDkwLjgxNDk5LDU1LjQ4MjIxNjMgODQuNDk0NTY2Niw1OC4yOTA4ODgzIEM4Ny4zMTI4NDc1LDY4Ljc2NzI2NjkgODYuMzA3MzkzNCw3OC4xMzQzNDYgODAuODI2OTA0OSw4My43MTAxMjUgQzc3LjU3MzEwOTIsODcuMDIyNDgyNSA3Mi45MjQ4Mjk2LDg4LjcwMjM0OTEgNjcuMzc3MjA4OSw4OC42MTU0OTM1IEM2MS41OTk1NjgxLDg4LjUwNzkwMSA1NS4xNDYwNDg3LDg2LjQ5NzQwODggNDguNjg5NTA1OCw4Mi45NTg2NjI1IEM0Mi4yMzMzMDY3LDg2LjQ5NzA2ODYgMzUuNzc5OTAyNyw4OC41MDc1MTQ4IDMwLjAwMjM1NTYsODguNjE2MDc0OSBDMjQuNDY2ODYwOCw4OC43Mjg1OTI0IDE5LjgwODQ3NjMsODcuMDIzMDYzOSAxNi41NTI2NTk1LDgzLjcxMDcwNjQgQzExLjE2NDMzNTcsNzguMjI4Njk0NSAxMC4xMDE3OTk3LDY5LjA4MTgyNiAxMi43NDYwNjExLDU4LjgxOTA1NTUgQzUuNjgzNjUzNDIsNTUuOTM0MDE2MiAxLjQwNjkxNDQ1LDUyLjE3NjIyOCAxLjQwNjkxNDQ1LDQ4LjA3MjI3NzUgQzEuNDA2OTE0NDUsNDQuMDY2MzE1OCA1LjQ4MDA4OTk4LDQwLjM5MDQyNDYgMTIuMjQwNTUxMywzNy41MzM4NzQ5IEM5LjQ4MDQ3Nzc1LDI3LjEyODAzOSAxMC41MDUwNjk1LDE3LjgzMzk0NjIgMTUuOTU1MTEwMywxMi4yODkxNDQyIEMxOS4xMTU5NDA1LDkuMDcxNTM4MjggMjMuNTk0NDU2OSw3LjM3OTgyNzcgMjguOTI3ODUyNSw3LjM3OTgyNzcgQzI5LjA4NTQ4OTgsNy4zNzk4Mjc3IDI5LjI0NTE0ODEsNy4zODE4MDE2OSAyOS40MDQ4MDY0LDcuMzgzNzc1NjggQzM1LjM2MDk1MSw3LjQ5NDY5MjM2IDQyLjAzNTM4MjcsOS42Mjc5MDc2MSA0OC42OTA2NzMsMTMuMzcyOTY3MyBDNTUuMzQ1ODgyOCw5LjYyODI2ODIyIDYyLjAxOTk0NDcsNy40OTUyNjggNjcuOTc0NzU4MSw3LjM4NDM1NzA2IEM2OC4xMzQ0MTY0LDcuMzgyMzgzMDcgNjguMjk0MDc0Nyw3LjM4MDQwOTA4IDY4LjQ1MTcxMiw3LjM4MDQwOTA4IEM3My43ODUxMDc2LDcuMzgwNDA5MDggNzguMjYzNjIzOSw5LjA3MjExOTY2IDgxLjQyNDQ1NDEsMTIuMjg5NzI1NiBDODYuOTY5MDMxMSwxNy45MzA3MDc0IDg3LjkzMzMwMDIsMjcuNDUyMTc4MiA4NC45OTE2Nzc3LDM4LjA3Njk0MzQgWiBNMjUuNjcyNjA3NSwzMy42MzIxMDYgQzIwLjUzMDgxNDYsMzQuNjI3NjAwOSAxNS45NzU1NTk3LDM1Ljk1NTY5MzEgMTIuMjQwNTUxMywzNy41MzM4NzQ5IEMxMy4xOTU3OTU2LDQxLjEzNTI3MDMgMTQuNjA0MzcwNyw0NC44Njk4MzEzIDE2LjQzOTcxMjUsNDguNjI4MjE3MiBDMTguNzY4NjIyNyw0My42MDY2NDkyIDIxLjg2NzQ3NzcsMzguNTIwNTQ5NyAyNS42NzI2MDc1LDMzLjYzMjEwNiBaIE03Mi41NDk3Nzg1LDYyLjA1MTY4NCBDNzcuMTE3MzkwOCw2MS4wNDc4NzY0IDgxLjE1OTY1NCw1OS43NzI4NTc5IDg0LjQ5NDU2NjYsNTguMjkwODg4MyBDODMuNjQ4NDMzLDU1LjE0NTU2MSA4Mi40NTc2MzQ0LDUxLjkwMDI0MzMgODAuOTM5Nzk2Niw0OC42Mjc1MTYzIEM3OC43NDA2NDM4LDUzLjEzMDcxMDcgNzUuOTI4NzQ2Niw1Ny42NjgxMjY0IDcyLjU0OTc3ODUsNjIuMDUxNjg0IFogTTg0Ljk5MTY3NzcsMzguMDc2OTQzNCBDODEuNDI1NzM5MywzNi40MzQ4ODExIDc3LjAwNDMwNDYsMzUuMDM2MTM2MSA3MS45NjQ4MzA4LDMzLjk2NDUxODUgQzcwLjU1MDc1NDIsMzIuMTI5MTAxOSA2OS4wMzcyNzE5LDMwLjMyMDYxNTQgNjcuNDI3NzMzNywyOC41NTI4NTg5IEM2MS42NTY1ODc5LDIyLjIxMzEzNjggNTUuMTgyNzM3NSwxNy4wMjYxNzY3IDQ4LjY5MDY3MywxMy4zNzI5NjczIEM0Mi4xOTgwMDY2LDE3LjAyNjIwNzggMzUuNzIzMjgyNywyMi4yMTMzODE5IDI5Ljk1MTgzMDgsMjguNTUzNDQwMiBDMjguNDM5NzE3MiwzMC4yMTQxOTUyIDI3LjAxMjM4MzEsMzEuOTEwODk4NyAyNS42NzI2MDc1LDMzLjYzMjEwNiBDMzIuMzA2MDYwMywzMi4zNDc4MTMxIDM5LjkxNTcyOTgsMzEuNjE3MDg1NiA0Ny45OTk3OTQyLDMxLjYxNzA4NTYgQzU2Ljc1NzM1MjgsMzEuNjE3MDg1NiA2NC45NTg0MTI2LDMyLjQ3NDY0MDcgNzEuOTY0ODMwOCwzMy45NjQ1MTg1IEM3NS42NTIyNTgzLDM4Ljc1MDY1NyA3OC42NjM3MjUyLDQzLjcxOTkwMzcgODAuOTM5Nzk2Niw0OC42Mjc1MTYzIEM4Mi42ODMwMTgsNDUuMDU3OTMwMyA4NC4wNDEyMjc5LDQxLjUwOTg0NyA4NC45OTE2Nzc3LDM4LjA3Njk0MzQgWiBNNDguNjg5NTA1OCw4Mi45NTg2NjI1IEM1NS4zODE2MTkzLDc5LjI5MDk2MDQgNjIuMDc2NzM2LDczLjk4MTU5MjQgNjguMDI1MjgyOCw2Ny40NDY5OTE3IEM2OS42MzAwNDE3LDY1LjY4NDQ4NDMgNzEuMTM5MzE0Miw2My44ODE0ODg2IDcyLjU0OTc3ODUsNjIuMDUxNjg0IEM2NS40MTY2MzIsNjMuNjE5MzA5OSA1Ny4wMDIyNDE1LDY0LjUyNTQ5NTMgNDcuOTk5Nzk0Miw2NC41MjU0OTUzIEMzOS42ODA2MzExLDY0LjUyNTQ5NTMgMzEuODYzODU2NSw2My43NTE2NDgyIDI1LjA5NjM1OTYsNjIuMzk3MDkzNCBDMjEuNTk4NDg0NCw1Ny45MDY5NjM3IDE4LjY5NjQ3MzYsNTMuMjQ5NTc5NCAxNi40Mzk3MTI1LDQ4LjYyODIxNzIgQzE0LjgzNjg4MjUsNTIuMDg0MjE5NyAxMy41OTg3NDY4LDU1LjUwOTY1NTkgMTIuNzQ2MDYxMSw1OC44MTkwNTU1IEMxNi4yNDA5MDYsNjAuMjQ2NzIyNCAyMC40MTc5MDA3LDYxLjQ2MDY3MiAyNS4wOTYzNTk2LDYyLjM5NzA5MzQgQzI2LjQyOTM2Nyw2NC4xMDgyMzk2IDI3Ljg0ODkxMTcsNjUuNzk1MDk1NCAyOS4zNTIyNjA2LDY3LjQ0NjQxMDMgQzM1LjMwMTc0MzEsNzMuOTgwOTA5IDQxLjk5NzI0ODYsNzkuMjkwNzI0NCA0OC42ODk1MDU4LDgyLjk1ODY2MjUgWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIj48L3BhdGg+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);
81+
}
82+
.arrowImage {
83+
width: 34px;
84+
height: 22px;
85+
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIzNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAzNCAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BcnJvdy1CaWc8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iU3ltYm9scyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4gICAgICAgIDxnIGlkPSJNb2RhbC1OZXdNaWdyYXRpb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNzEuMDAwMDAwLCAtMTQ5LjAwMDAwMCkiIHN0cm9rZT0iIzYxNjg3MCIgc3Ryb2tlLXdpZHRoPSIyIj4gICAgICAgICAgICA8ZyBpZD0iQXJyb3ctQmlnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNzIuMDAwMDAwLCAxNTAuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iUGF0aC0xODEtQ29weS00IiBwb2ludHM9IjIyIDAgMzIgMTEgMjIgMjIiPjwvcG9seWxpbmU+ICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDEwIEwzMiwxMCIgaWQ9IkxpbmUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2LjAwMDAwMCwgMTAuNTAwMDAwKSByb3RhdGUoLTE4MC4wMDAwMDApIHRyYW5zbGF0ZSgtMTYuMDAwMDAwLCAtMTAuNTAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8L2c+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=);
86+
}
87+
.executionImage {
88+
width: 98px;
89+
height: 86px;
90+
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI5OHB4IiBoZWlnaHQ9Ijg2cHgiIHZpZXdCb3g9IjAgMCA5OCA4NiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5QYWdlIDE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iU3ltYm9scyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLjY3MSw1LjM0Myw5LjM1LDUuMzQzIj4gICAgICAgIDxnIGlkPSJNb2RhbC1OZXdNaWdyYXRpb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNTEuMDAwMDAwLCAtMTE3LjAwMDAwMCkiIHN0cm9rZT0iIzAwNDRDQSIgc3Ryb2tlLXdpZHRoPSIxLjMiPiAgICAgICAgICAgIDxnIGlkPSJQYWdlLTEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM1Mi4wMDAwMDAsIDExOC4wMDAwMDApIj4gICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ3Ljk5ODY2OTMsMjUgQzIxLjUzMTM1ODksMjUgMCwzMi42MjU2NDQ0IDAsNDIuMDAwNDQ0OSBDMCw1MS4zNzUyNDUzIDIxLjUzMTM1ODksNTkgNDcuOTk4NjY5Myw1OSBDNzQuNDY2ODY2OSw1OSA5Niw1MS4zNzUyNDUzIDk2LDQyLjAwMDQ0NDkgQzk2LDMyLjYyNTY0NDQgNzQuNDY2ODY2OSwyNSA0Ny45OTg2NjkzLDI1IiBpZD0iU3Ryb2tlLTEiPjwvcGF0aD4gICAgICAgICAgICAgICAgPHBhdGggZD0iTTI3LjgyODI0NSwwIEMyMi4zMDExNjQ3LDAgMTcuNjU4NTI0NCwxLjc0ODc0MzYzIDE0LjM4NDA0MzksNS4wNzYxNjQ2OCBDMy40NjAxODQyNSwxNi4xNjI1MjI2IDkuNjg5NjQwMTUsNDEuNzQ4MTM3NyAyOC4yNjgyMzM4LDYyLjEwODAwMTIgQzQwLjM4MjY1MTMsNzUuMzgyOTU5OCA1NS40ODIzODgzLDgzLjc2OTYyOCA2Ny42NzcxMjgzLDgzLjk5NjY3OTcgQzczLjQyNjQzNDIsODQuMDg2NjEgNzguMjQzOTk5MSw4Mi4zNDg1NTEyIDgxLjYxNjY1MTUsNzguOTI0OTY3IEM5Mi41Mzk2MTg3LDY3LjgzNzcxODcgODYuMzEwMTYyOCw0Mi4yNTIxMDM2IDY3LjcyOTc4NDIsMjEuODkyMjQwMSBDNTUuNjE3MTUxNiw4LjYxNzI4MTQ4IDQwLjUxNzQxNDYsMC4yMzA2MTMzNCAyOC4zMjI2NzQ2LDAuMDAzNTYxNTk1OTggQzI4LjE1NjY3NDcsMC4wMDE3ODA3OTc5OSAyNy45OTI0NTk5LDAgMjcuODI4MjQ1LDAiIGlkPSJTdHJva2UtMyI+PC9wYXRoPiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjkuMTcxNDUzNywwIEM2OS4wMDgxMzA0LDAgNjguODQzMDIyMSwwLjAwMjY3MTEyOTgxIDY4LjY3NzAyMTQsMC4wMDQ0NTE4ODMwMiBDNTYuNDg0ODkxMywwLjIzMTQ5NzkxNyA0MS4zODMyODU3LDguNjE3OTU1MTYgMjkuMjcwNTg2MSwyMS44OTI1OCBDMTAuNjkwMTA0Nyw0Mi4yNTE5MzE0IDQuNDYwNjE0MjksNjcuODM2MDEyOCAxNS4zODI3NDk0LDc4LjkyMjk4MjIgQzE4Ljc1ODA5NzksODIuMzQ3MzcwNyAyMy41ODU1MDY4LDg0LjExMTIwNjcgMjkuMzIzMjQyMiw4My45OTQ1Njc0IEM0MS41MTcxNTczLDgzLjc2NjYzMSA1Ni42MTY5Nzc5LDc1LjM4MTk1NDUgNjguNzI5Njc3NSw2Mi4xMDczMjk3IEM4Ny4zMTAxNTksNDEuNzQ3OTc4MiA5My41Mzk2NDkzLDE2LjE2MzAwNjUgODIuNjE2NjIxNyw1LjA3NjAzNzAyIEM3OS4zNDEyMzA2LDEuNzQ5NTkwMDMgNzQuNjk4NTY0NiwwIDY5LjE3MTQ1MzcsMCIgaWQ9IlN0cm9rZS01Ij48L3BhdGg+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);
91+
}
92+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "ReplicaExecutionOptions",
3+
"version": "0.0.0",
4+
"private": true,
5+
"main": "./ReplicaExecutionOptions.js"
6+
}

src/components/ReplicaExecutions/ReplicaExecutions.js

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717
/* eslint-disable no-trailing-spaces */
1818
import React, { Component, PropTypes } from 'react';
19+
import Modal from 'react-modal'
1920
import withStyles from 'isomorphic-style-loader/lib/withStyles';
2021
import s from './ReplicaExecutions.scss';
2122
import Helper from '../Helper';
@@ -27,6 +28,7 @@ import Tasks from '../Tasks';
2728
import ExecutionsTimeline from '../ExecutionsTimeline';
2829
import { tasksPollTimeout } from '../../config'
2930
import ConfirmationDialog from '../ConfirmationDialog'
31+
import ReplicaExecutionOptions from '../ReplicaExecutionOptions'
3032

3133

3234
const title = 'Replica Executions';
@@ -48,6 +50,7 @@ class ReplicaExecutions extends Component {
4850
this.state = {
4951
executionRef: null,
5052
tasks: null,
53+
showExecutionModal: false,
5154
deleteConfirmationDialog: {
5255
visible: false,
5356
message: "Are you sure?",
@@ -117,8 +120,17 @@ class ReplicaExecutions extends Component {
117120
})
118121
}
119122

120-
executeNow() {
121-
MigrationActions.executeReplica(this.props.replica)
123+
showExecutionModal() {
124+
this.setState({ showExecutionModal: true })
125+
}
126+
127+
closeExecutionModal() {
128+
this.setState({ showExecutionModal: false })
129+
}
130+
131+
executeNow(options) {
132+
this.closeExecutionModal()
133+
MigrationActions.executeReplica(this.props.replica, null, null, options)
122134
clearInterval(this.timeout)
123135
this.timeout = setInterval((e) => this.pollTasks(e), tasksPollTimeout)
124136
}
@@ -194,6 +206,28 @@ class ReplicaExecutions extends Component {
194206
}
195207

196208
render() {
209+
let modalStyle = {
210+
overlay: {
211+
position: "fixed",
212+
top: 0,
213+
left: 0,
214+
right: 0,
215+
bottom: 0,
216+
backgroundColor: "rgba(164, 170, 181, 0.69)"
217+
},
218+
content: {
219+
padding: "0px",
220+
borderRadius: "4px",
221+
border: "none",
222+
bottom: "auto",
223+
width: "576px",
224+
height: "auto",
225+
left: "50%",
226+
top: "120px",
227+
marginLeft: "-288px"
228+
}
229+
}
230+
197231
if (this.props.replica) {
198232
if (this.props.replica.executions.length && this.state.executionRef) {
199233
let executionBtn = <button className="wire red" onClick={(e) => this.deleteExecution(e)}>Delete</button>
@@ -259,9 +293,20 @@ class ReplicaExecutions extends Component {
259293
<span className="icon"></span>
260294
<h3>It looks like there are no executions in this replica</h3>
261295
<p>This replica has not been executed yet</p>
262-
<button onClick={(e) => this.executeNow(e)}>Execute Now</button>
296+
<button onClick={this.showExecutionModal.bind(this)}>Execute Now</button>
263297
</div>
264298
</div>
299+
<Modal
300+
isOpen={this.state.showExecutionModal}
301+
style={modalStyle}
302+
onRequestClose={this.closeExecutionModal.bind(this)}
303+
contentLabel="Replica Execution Options"
304+
>
305+
<ReplicaExecutionOptions
306+
onCancel={this.closeExecutionModal.bind(this)}
307+
onExecute={this.executeNow.bind(this)}
308+
/>
309+
</Modal>
265310
</div>
266311
)
267312
}

0 commit comments

Comments
 (0)