Commit e831c39d authored by Juorder Gonzalez's avatar Juorder Gonzalez

Merge pull request #157 from ZBoxApp/issues_resolved_manager

fix dns add row, delete alert, style for sweetalert, etc
parents 97fffa12 bc68818a
...@@ -163,7 +163,7 @@ linters: ...@@ -163,7 +163,7 @@ linters:
max_depth: 5 max_depth: 5
SelectorFormat: SelectorFormat:
enabled: true enabled: false
convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern
Shorthand: Shorthand:
......
module.exports = {"main":{"js":"/354185bundle.js"}} module.exports = {"main":{"js":"/749216bundle.js"}}
\ No newline at end of file \ No newline at end of file
// Copyright (c) 2016 ZBox, Spa. All Rights Reserved. // Copyright (c) 2016 ZBox, Spa. All Rights Reserved.
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
//import CompanyAdmins from './company_admins.jsx';
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
...@@ -8,7 +9,6 @@ import Promise from 'bluebird'; ...@@ -8,7 +9,6 @@ import Promise from 'bluebird';
import CompanyInfo from './company_info.jsx'; import CompanyInfo from './company_info.jsx';
import CompanyMailboxPlans from './company_mailbox_plans.jsx'; import CompanyMailboxPlans from './company_mailbox_plans.jsx';
import CompanyDomains from './company_domains.jsx'; import CompanyDomains from './company_domains.jsx';
import CompanyAdmins from './company_admins.jsx';
import CompanyInvoices from './company_invoices.jsx'; import CompanyInvoices from './company_invoices.jsx';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
...@@ -136,12 +136,16 @@ export default class CompaniesDetails extends React.Component { ...@@ -136,12 +136,16 @@ export default class CompaniesDetails extends React.Component {
); );
} }
const tabAdmins = ( /*
<CompanyAdmins 'Administradores de dominio',
company={company} administradores_de_dominio: tabAdmins,
location={this.props.location} const tabAdmins = (
/> <CompanyAdmins
); company={company}
location={this.props.location}
/>
);
*/
const tabDomains = ( const tabDomains = (
<CompanyDomains <CompanyDomains
...@@ -152,9 +156,8 @@ export default class CompaniesDetails extends React.Component { ...@@ -152,9 +156,8 @@ export default class CompaniesDetails extends React.Component {
const panelTabs = ( const panelTabs = (
<PanelTab <PanelTab
tabNames={['Administradores de dominio', 'Dominios']} tabNames={['Dominios']}
tabs={{ tabs={{
administradores_de_dominio: tabAdmins,
dominios: tabDomains dominios: tabDomains
}} }}
location={this.props.location} location={this.props.location}
...@@ -170,11 +173,20 @@ export default class CompaniesDetails extends React.Component { ...@@ -170,11 +173,20 @@ export default class CompaniesDetails extends React.Component {
{message} {message}
<div className='content animate-panel'> <div className='content animate-panel'>
<div className='row'> <div className='row'>
<div className='col-md-6 central-content'> <div className='layout-back clearfix'>
<CompanyInfo company={company}/> <div className='back-left backstage'>
</div> <div className='backbg'></div>
<div className='col-md-6 central-content'> </div>
<CompanyMailboxPlans company={company}/> <div className='back-right backstage'>
<div className='backbg'></div>
</div>
<div className='col-md-6 central-content'>
<CompanyInfo company={company}/>
</div>
<div className='col-md-6 central-content'>
<CompanyMailboxPlans company={company}/>
</div>
</div> </div>
</div> </div>
<div className='row'> <div className='row'>
......
import React from 'react'; import React from 'react';
import {FormGroup, Button, FormControl, InputGroup} from 'react-bootstrap';
import sweetAlert from 'sweetalert';
import * as Utils from '../../utils/utils.jsx'; import * as Utils from '../../utils/utils.jsx';
import Constants from '../../utils/constants.jsx'; import Constants from '../../utils/constants.jsx';
//import * as GlobalActions from '../../action_creators/global_actions.jsx';
import EventStore from '../../stores/event_store.jsx'; import EventStore from '../../stores/event_store.jsx';
import DomainStore from '../../stores/domain_store.jsx'; import DomainStore from '../../stores/domain_store.jsx';
import Client from '../../utils/client.jsx'; import Client from '../../utils/client.jsx';
import Pagination from '../pagination.jsx';
const Labels = Constants.Labels; const Labels = Constants.Labels;
const MessageType = Constants.MessageType; //const MessageType = Constants.MessageType;
export default class DNSZoneForm extends React.Component { export default class DNSZoneForm extends React.Component {
constructor(props) { constructor(props) {
...@@ -18,6 +23,8 @@ export default class DNSZoneForm extends React.Component { ...@@ -18,6 +23,8 @@ export default class DNSZoneForm extends React.Component {
this.handleChangeInput = this.handleChangeInput.bind(this); this.handleChangeInput = this.handleChangeInput.bind(this);
this.addDNSRequest = this.addDNSRequest.bind(this); this.addDNSRequest = this.addDNSRequest.bind(this);
this.zoneDNSChange = this.zoneDNSChange.bind(this); this.zoneDNSChange = this.zoneDNSChange.bind(this);
this.showSweetConfirm = this.showSweetConfirm.bind(this);
this.handleSearchByName = this.handleSearchByName.bind(this);
this.zoneDNS = DomainStore.getZoneDNS(); this.zoneDNS = DomainStore.getZoneDNS();
...@@ -31,14 +38,37 @@ export default class DNSZoneForm extends React.Component { ...@@ -31,14 +38,37 @@ export default class DNSZoneForm extends React.Component {
}; };
this.defaultRows = this.getRecords(); this.defaultRows = this.getRecords();
this.newRows = [];
this.DEFAULT_LIMIT = Constants.QueryOptions.DEFAULT_LIMIT;
this.types = Constants.typesOfDNS; this.types = Constants.typesOfDNS;
const page = parseInt(this.props.location.query.page, 10) || 1;
this.state = { this.state = {
fields: this.defaultRows fields: this.defaultRows,
page,
offset: ((page - 1) * Constants.QueryOptions.DEFAULT_LIMIT)
}; };
} }
handleSearchByName(e) {
const value = e.target.value.trim();
const isSearching = value === '' ? null : true;
const rowsFiltered = this.defaultRows.filter((item) => {
const string = item.name;
if (string.indexOf(value) > -1) {
return true;
}
return false;
});
this.setState({
fields: rowsFiltered,
isSearching
});
}
getRecords() { getRecords() {
const records = []; const records = [];
const zoneRecords = this.zoneDNS; const zoneRecords = this.zoneDNS;
...@@ -50,7 +80,6 @@ export default class DNSZoneForm extends React.Component { ...@@ -50,7 +80,6 @@ export default class DNSZoneForm extends React.Component {
records.push(newObject); records.push(newObject);
}); });
} }
return records; return records;
} }
...@@ -63,31 +92,48 @@ export default class DNSZoneForm extends React.Component { ...@@ -63,31 +92,48 @@ export default class DNSZoneForm extends React.Component {
nameservers: [] nameservers: []
}; };
if (this.newRows.length > 0) {
Array.prototype.push.apply(records, this.newRows);
}
Utils.toggleStatusButtons('.savedns', true); Utils.toggleStatusButtons('.savedns', true);
const button = this.refs.savedns; const button = this.refs.savedns;
const oldContent = button.innerHTML; const oldContent = button.innerHTML;
button.innerHTML = '<i class=\'fa fa-spinner fa-spin\'></i> Creando Zona DNS'; button.innerHTML = '<i className=\'fa fa-spinner fa-spin\'></i> Creando Zona DNS';
if (zoneDNS) { if (zoneDNS) {
zoneDNS.createOrModifyRecords(records, (err, data) => { return zoneDNS.createOrModifyRecords(records, (err, data) => {
if (err) { if (err) {
Utils.toggleStatusButtons('.savedns', false); Utils.toggleStatusButtons('.savedns', false);
button.innerHTML = oldContent; button.innerHTML = oldContent;
return EventStore.emitMessage({ return EventStore.emitToast({
message: err.reason, type: 'error',
typeError: MessageType.ERROR title: 'Error',
body: err.reason,
options: {
timeOut: 5000,
extendedTimeOut: 2500,
closeButton: true
}
}); });
} }
this.newRows = [];
DomainStore.setZoneDNS(data); DomainStore.setZoneDNS(data);
Utils.toggleStatusButtons('.savedns', false); Utils.toggleStatusButtons('.savedns', false);
button.innerHTML = oldContent; button.innerHTML = oldContent;
return EventStore.emitMessage({ return EventStore.emitToast({
message: 'Se ha registrado su nuevo DNS éxitoxamente.', type: 'success',
typeError: MessageType.SUCCESS title: 'Creación Zona DNS',
body: 'Se ha registrado su nuevo DNS éxitoxamente.',
options: {
timeOut: 6000,
extendedTimeOut: 2500,
closeButton: true
}
}); });
}); });
} }
...@@ -96,84 +142,115 @@ export default class DNSZoneForm extends React.Component { ...@@ -96,84 +142,115 @@ export default class DNSZoneForm extends React.Component {
Utils.toggleStatusButtons('.savedns', false); Utils.toggleStatusButtons('.savedns', false);
button.innerHTML = oldContent; button.innerHTML = oldContent;
EventStore.emitMessage({ return EventStore.emitToast({
message: 'Se ha creado su zona DNS éxitosamente.', type: 'success',
typeError: MessageType.SUCCESS title: 'Creación Zona DNS',
body: 'Se ha creado su zona DNS éxitosamente.',
options: {
timeOut: 5000,
extendedTimeOut: 2500,
closeButton: true
}
}); });
}, (error) => { }, (error) => {
EventStore.emitMessage({
message: error.extra.reason,
typeError: MessageType.ERROR
});
Utils.toggleStatusButtons('.savedns', false); Utils.toggleStatusButtons('.savedns', false);
button.innerHTML = oldContent; button.innerHTML = oldContent;
return EventStore.emitToast({
type: 'error',
title: 'Creación Zona DNS',
body: error.extra.reason,
options: {
timeOut: 5000,
extendedTimeOut: 2500,
closeButton: true
}
});
}); });
} }
addDNSRow() { addDNSRow() {
const copy = Object.assign({}, this.instanceRow); const copy = Object.assign({}, this.instanceRow);
copy.enabled = true; copy.enabled = true;
this.defaultRows.push(copy); this.newRows.push(copy);
this.setState({ this.setState({
fields: this.defaultRows update: true
}); });
} }
removeRow(e, index) { showSweetConfirm(object, index) {
e.preventDefault();
const zoneDNS = this.zoneDNS; const zoneDNS = this.zoneDNS;
const button = e.target; const response = {
const old = button.innerHTML; title: 'Se ha borrado con éxito',
button.innerHTML = '<i class=\'fa fa-spinner fa-spin\'></i>'; type: 'success'
button.setAttribute('disabled', 'disabled'); };
if (this.defaultRows[index]) { sweetAlert({
if (zoneDNS && zoneDNS.records[index]) { title: 'Esta seguro que desea borrar el DNS?',
return zoneDNS.deleteRecords(this.defaultRows[index], (error, success) => { type: 'info',
if (error) { showCancelButton: true,
button.removeAttribute('disabled'); confirmButtonColor: '#DD6B55',
button.innerHTML = old; confirmButtonText: 'Si, deseo borrarlo!',
closeOnConfirm: false,
return EventStore.emitMessage({ showLoaderOnConfirm: true
message: error.message, },
typeError: MessageType.ERROR (isDeleted) => {
if (isDeleted) {
if (zoneDNS && zoneDNS.records[index]) {
return zoneDNS.deleteRecords(object, (error, success) => {
if (error) {
response.title = 'Ha ocurrido un error.';
response.type = 'error';
response.confirmButtonText = 'Intentar de nuevo';
response.confirmButtonColor = '#DD6B55';
return sweetAlert(response);
}
DomainStore.setZoneDNS(success);
this.defaultRows.splice(index, 1);
this.setState({
fields: this.defaultRows
});
return sweetAlert(response);
}); });
} }
}
const name = this.defaultRows[index].name;
DomainStore.setZoneDNS(success);
return EventStore.emitMessage({
message: `Se ha borrado su DNS ${name} éxitoxamente.`,
typeError: MessageType.ERROR
});
});
} }
);
}
this.defaultRows.splice(index, 1); removeRow(e, index, from) {
e.preventDefault();
const refer = from || null;
this.setState({ if (this.defaultRows[index] && !refer) {
fields: this.defaultRows return this.showSweetConfirm(this.defaultRows[index], index);
});
} }
return false; this.newRows.splice(index, 1);
return this.setState({
update: true
});
} }
handleChangeInput(e, index, ref) { handleChangeInput(e, index, ref) {
const value = e.target.value; const value = e.target.value;
if (this.defaultRows[index]) { if (this.newRows[index]) {
this.defaultRows[index][ref] = value; this.newRows[index][ref] = value;
return true; return true;
} }
return false; return null;
} }
zoneDNSChange() { zoneDNSChange(zone) {
this.zoneDNS = DomainStore.getZoneDNS(); this.zoneDNS = zone;
this.defaultRows = this.getRecords(); this.defaultRows = this.getRecords();
...@@ -190,11 +267,27 @@ export default class DNSZoneForm extends React.Component { ...@@ -190,11 +267,27 @@ export default class DNSZoneForm extends React.Component {
DomainStore.addZoneDNSChangeListener(this.zoneDNSChange); DomainStore.addZoneDNSChangeListener(this.zoneDNSChange);
} }
componentWillReceiveProps(newProps) {
const condition = this.props.location.query.page !== newProps.location.query.page;
if (condition) {
const page = parseInt(newProps.location.query.page, 10) || 1;
this.setState({
page,
offset: ((page - 1) * Constants.QueryOptions.DEFAULT_LIMIT)
});
}
}
render() { render() {
const textButton = this.zoneDNS ? 'Agregar otro registro' : 'Crear zona DNS'; const textButton = this.zoneDNS ? 'Agregar otro registro' : 'Crear zona DNS';
let isVisible = false; let isVisible = false;
let fields = null; let fields = null;
let newFields = null;
let header = null; let header = null;
let inputSearch = null;
let pagination = null;
const types = this.types.map((item) => { const types = this.types.map((item) => {
return ( return (
<option <option
...@@ -206,13 +299,40 @@ export default class DNSZoneForm extends React.Component { ...@@ -206,13 +299,40 @@ export default class DNSZoneForm extends React.Component {
); );
}); });
fields = ( if (this.state.fields.length > 0 || this.state.isSearching) {
<div className='text-center'> inputSearch = (
<h4>No existen Zonas DNS para su dominio : <strong>{this.props.domain.name}</strong></h4> <FormGroup>
</div> <InputGroup>
); <InputGroup.Button>
<Button bsStyle='primary'>Buscar</Button>
</InputGroup.Button>
<FormControl
placeholder='Búsqueda por Nombre'
type='text'
onKeyUp={this.handleSearchByName}
/>
</InputGroup>
</FormGroup>
);
}
if (this.newRows.length < 1) {
fields = (
<div className='text-center'>
<h4>No existen Zonas DNS para su dominio : <strong>{this.props.domain.name}</strong></h4>
</div>
);
}
if (this.defaultRows.length > 0) { if (this.state.isSearching && this.state.fields.length === 0) {
fields = (
<div className='text-center'>
<h4>No existen Zonas DNS para su búsqueda</h4>
</div>
);
}
if (this.state.fields.length > 0 || this.newRows.length > 0) {
isVisible = true; isVisible = true;
header = ( header = (
<div className='row'> <div className='row'>
...@@ -242,21 +362,21 @@ export default class DNSZoneForm extends React.Component { ...@@ -242,21 +362,21 @@ export default class DNSZoneForm extends React.Component {
</div> </div>
); );
fields = this.defaultRows.map((element, i) => { newFields = this.newRows.map((newElement, index) => {
const isDisabled = element.enabled ? null : true; const isDisabled = newElement.enabled ? null : true;
return ( return (
<div <div
className='row set-margin-up' className='row set-margin-up'
key={`row-${new Date().getTime()}-${i}`} key={`row-new-${new Date().getTime()}-${index}`}
id={`row-dns-${new Date().getTime()}-${i}`} id={`row-dns-new-${new Date().getTime()}-${index}`}
> >
<div className='col-xs-3'> <div className='col-xs-3'>
<input <input
type='text' type='text'
defaultValue={element.name} defaultValue={newElement.name}
className='form-control' className='form-control'
onChange={(e) => { onChange={(e) => {
this.handleChangeInput(e, i, Labels.name); this.handleChangeInput(e, index, Labels.name);
}} }}
disabled={isDisabled} disabled={isDisabled}
/> />
...@@ -265,9 +385,9 @@ export default class DNSZoneForm extends React.Component { ...@@ -265,9 +385,9 @@ export default class DNSZoneForm extends React.Component {
<div className='col-xs-1'> <div className='col-xs-1'>
<select <select
className='form-control' className='form-control'
defaultValue={element.type} defaultValue={newElement.type}
onChange={(e) => { onChange={(e) => {
this.handleChangeInput(e, i, Labels.type); this.handleChangeInput(e, index, Labels.type);
}} }}
disabled={isDisabled} disabled={isDisabled}
> >
...@@ -279,9 +399,9 @@ export default class DNSZoneForm extends React.Component { ...@@ -279,9 +399,9 @@ export default class DNSZoneForm extends React.Component {
<input <input
type='text' type='text'
className='form-control' className='form-control'
defaultValue={element.content} defaultValue={newElement.content}
onChange={(e) => { onChange={(e) => {
this.handleChangeInput(e, i, Labels.content); this.handleChangeInput(e, index, Labels.content);
}} }}
/> />
</div> </div>
...@@ -290,9 +410,9 @@ export default class DNSZoneForm extends React.Component { ...@@ -290,9 +410,9 @@ export default class DNSZoneForm extends React.Component {
<input <input
type='number' type='number'
className='form-control' className='form-control'
defaultValue={element.priority} defaultValue={newElement.priority}
onChange={(e) => { onChange={(e) => {
this.handleChangeInput(e, i, Labels.priority); this.handleChangeInput(e, index, Labels.priority);
}} }}
/> />
</div> </div>
...@@ -301,9 +421,9 @@ export default class DNSZoneForm extends React.Component { ...@@ -301,9 +421,9 @@ export default class DNSZoneForm extends React.Component {
<input <input
type='number' type='number'
className='form-control' className='form-control'
defaultValue={element.ttl} defaultValue={newElement.ttl}
onChange={(e) => { onChange={(e) => {
this.handleChangeInput(e, i, Labels.ttl); this.handleChangeInput(e, index, Labels.ttl);
}} }}
/> />
</div> </div>
...@@ -312,7 +432,7 @@ export default class DNSZoneForm extends React.Component { ...@@ -312,7 +432,7 @@ export default class DNSZoneForm extends React.Component {
<button <button
className='btn btn-danger' className='btn btn-danger'
onClick={(e) => { onClick={(e) => {
this.removeRow(e, i); this.removeRow(e, index, 'new');
}} }}
> >
<i <i
...@@ -325,25 +445,127 @@ export default class DNSZoneForm extends React.Component { ...@@ -325,25 +445,127 @@ export default class DNSZoneForm extends React.Component {
</div> </div>
); );
}); });
if (this.state.fields.length > 0) {
const length = this.state.fields.length;
fields = this.state.fields.map((element, i) => {
const isDisabled = element.enabled ? null : true;
return (
<div
className='row set-margin-up'
key={`row-${new Date().getTime()}-${i}`}
id={`row-dns-${new Date().getTime()}-${i}`}
>
<div className='col-xs-3'>
<input
type='text'
defaultValue={element.name}
className='form-control'
onChange={(e) => {
this.handleChangeInput(e, i, Labels.name);
}}
disabled={isDisabled}
/>
</div>
<div className='col-xs-1'>
<select
className='form-control'
defaultValue={element.type}
onChange={(e) => {
this.handleChangeInput(e, i, Labels.type);
}}
disabled={isDisabled}
>
{types}
</select>
</div>
<div className='col-xs-3'>
<input
type='text'
className='form-control'
defaultValue={element.content}
onChange={(e) => {
this.handleChangeInput(e, i, Labels.content);
}}
/>
</div>
<div className='col-xs-2'>
<input
type='number'
className='form-control'
defaultValue={element.priority}
onChange={(e) => {
this.handleChangeInput(e, i, Labels.priority);
}}
/>
</div>
<div className='col-xs-2'>
<input
type='number'
className='form-control'
defaultValue={element.ttl}
onChange={(e) => {
this.handleChangeInput(e, i, Labels.ttl);
}}
/>
</div>
<div className='col-xs-1'>
<button
className='btn btn-danger'
onClick={(e) => {
this.removeRow(e, i);
}}
>
<i
className='fa fa-trash-o'
title='Delete'
>
</i>
</button>
</div>
</div>
);
});
if (length > this.DEFAULT_LIMIT) {
fields = fields.slice(this.state.offset, (this.state.page * this.DEFAULT_LIMIT));
const totalPages = Math.ceil(length / this.DEFAULT_LIMIT);
pagination = (
<Pagination
key='panelPaginationDNS'
url={this.props.location.pathname}
currentPage={this.state.page}
totalPages={totalPages}
/>
);
}
}
} }
return ( return (
<div> <div>
<blockquote className='clearfix'> <div className='row clearfix'>
<p> <div className='col-xs-6'>
{inputSearch}
</div>
<div className='col-xs-6'>
<button <button
className='btn btn-info pull-right' className='btn btn-info pull-right'
onClick={this.addDNSRow} onClick={this.addDNSRow}
> >
<i className='fa fa-plus-circle fa-lg'></i> {textButton} <i className='fa fa-plus-circle fa-lg'></i> {textButton}
</button> </button>
</p> </div>
</blockquote> </div>
<form> <form>
{header} {header}
{fields} {[newFields, fields, pagination]}
<br/>
<br/> <br/>
<div className='col-xs-12 text-right'> <div className='col-xs-12 text-right'>
...@@ -365,5 +587,6 @@ export default class DNSZoneForm extends React.Component { ...@@ -365,5 +587,6 @@ export default class DNSZoneForm extends React.Component {
} }
DNSZoneForm.propTypes = { DNSZoneForm.propTypes = {
domain: React.PropTypes.object domain: React.PropTypes.object,
location: React.PropTypes.object
}; };
...@@ -23,6 +23,8 @@ import DomainStore from '../../stores/domain_store.jsx'; ...@@ -23,6 +23,8 @@ import DomainStore from '../../stores/domain_store.jsx';
import * as Client from '../../utils/client.jsx'; import * as Client from '../../utils/client.jsx';
import * as GlobalActions from '../../action_creators/global_actions.jsx'; import * as GlobalActions from '../../action_creators/global_actions.jsx';
//import Constants from '../../utils/constants.jsx';
export default class DomainDetails extends React.Component { export default class DomainDetails extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
...@@ -170,6 +172,7 @@ export default class DomainDetails extends React.Component { ...@@ -170,6 +172,7 @@ export default class DomainDetails extends React.Component {
const zonaDNS = ( const zonaDNS = (
<ZonaDNS <ZonaDNS
domain={domain} domain={domain}
location={this.props.location}
/> />
); );
...@@ -193,8 +196,9 @@ export default class DomainDetails extends React.Component { ...@@ -193,8 +196,9 @@ export default class DomainDetails extends React.Component {
titlePage='Dominios' titlePage='Dominios'
descriptionPage='Dominios de correos creados' descriptionPage='Dominios de correos creados'
/> />
{message}
<div className='content animate-panel'> <div className='content animate-panel'>
{message}
<div className='row'> <div className='row'>
<div className='layout-back clearfix'> <div className='layout-back clearfix'>
<div className='back-left backstage'> <div className='back-left backstage'>
......
...@@ -115,7 +115,9 @@ export default class Domains extends React.Component { ...@@ -115,7 +115,9 @@ export default class Domains extends React.Component {
}); });
} }
componentWillReceiveProps(newProps) { componentWillReceiveProps(newProps) {
if (this.props.location.query.page !== newProps.location.query.page) { const condition = this.props.location.query.page !== newProps.location.query.page;
if (condition) {
const page = parseInt(newProps.location.query.page, 10) || 1; const page = parseInt(newProps.location.query.page, 10) || 1;
GlobalActions.emitStartLoading(); GlobalActions.emitStartLoading();
...@@ -127,6 +129,8 @@ export default class Domains extends React.Component { ...@@ -127,6 +129,8 @@ export default class Domains extends React.Component {
}; };
this.getDomains(); this.getDomains();
} else {
GlobalActions.emitEndLoading();
} }
} }
componentDidMount() { componentDidMount() {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
@import 'panels'; @import 'panels';
@import 'progress_bar'; @import 'progress_bar';
@import 'progress_task'; @import 'progress_task';
@import 'sweetalert';
@import 'tabs'; @import 'tabs';
@import 'tooltip'; @import 'tooltip';
@import 'tour'; @import 'tour';
......
// eslint-disable
body {
&.stop-scrolling {
height: 100%;
overflow: hidden;
}
}
.sweet-overlay {
background-color: rgba($black, .4);
bottom: 0;
display: none;
left: 0;
position: fixed;
right: 0;
top: 0;
z-index: 10000;
}
.sweet-alert {
$width: 478px;
$padding: 17px;
background-color: $white;
border-radius: 5px;
display: none;
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
left: 50%;
margin-left: -($width / 2 + $padding);
margin-top: -200px;
overflow: hidden;
padding: $padding;
position: fixed;
text-align: center;
top: 50%;
width: $width;
z-index: 99999;
@media all and (max-width: 540px) {
left: 15px;
margin-left: 0;
margin-right: 0;
right: 15px;
width: auto;
}
h2 {
color: $h2-color;
display: block;
font-size: 30px;
font-weight: 600;
line-height: 40px;
margin: 25px 0;
padding: 0;
position: relative;
text-align: center;
text-transform: none;
}
p {
color: $p-color;
float: none;
font-size: 16px;
font-weight: 300;
line-height: normal;
margin: 0;
padding: 0;
position: relative;
text-align: inherit;
}
fieldset {
border: 0;
position: relative;
}
.sa-error-container {
background-color: $bg-error-container;
margin-left: -17px;
margin-right: -17px;
max-height: 0;
overflow: hidden;
padding: 0 10px;
transition: padding .15s, max-height .15s;
&.show {
max-height: 100px;
padding: 10px 0;
transition: padding .25s, max-height .25s;
}
.icon {
background-color: $bg-icon;
border-radius: 50%;
color: $white;
display: inline-block;
height: 24px;
line-height: 24px;
margin-right: 3px;
text-align: center;
width: 24px;
}
p {
display: inline-block;
}
}
.sa-input-error {
height: 20px;
opacity: 0;
position: absolute;
right: 26px;
top: 29px;
transform: scale(.5);
transform-origin: 50% 50%;
transition: all .1s;
width: 20px;
&::before,
&::after {
background-color: $bg-after;
border-radius: 3px;
content: '';
height: 6px;
left: 50%;
margin-left: -9px;
margin-top: -4px;
position: absolute;
top: 50%;
width: 20px;
}
&::before {
transform: rotate(-45deg);
}
&::after {
transform: rotate(45deg);
}
&.show {
opacity: 1;
transform: scale(1);
}
}
input {
border: 1px solid $input-border-color;
border-radius: 3px;
box-shadow: inset 0 1px 1px rgba($black, .06);
box-sizing: border-box;
display: none;
font-size: 18px;
height: 43px;
margin-bottom: 17px;
margin-top: 10px;
padding: 0 12px;
transition: all .3s;
width: 100%;
&:focus {
border: 1px solid $focus-border;
box-shadow: 0 0 3px $focus-shadow;
outline: none;
}
}
&.show-input input {
display: block;
}
.sa-confirm-button-container {
display: inline-block;
position: relative;
}
.la-ball-fall {
left: 50%;
margin-left: -27px;
margin-top: 4px;
opacity: 0;
position: absolute;
top: 50%;
visibility: hidden;
}
button {
background-color: $btn-blue;
border: 0;
border-radius: 5px;
box-shadow: none;
color: $white;
cursor: pointer;
font-size: 17px;
font-weight: 500;
margin: 26px 5px 0;
padding: 10px 32px;
&:focus {
box-shadow: 0 0 2px $btn-focus-one, inset 0 0 0 1px $btn-focus-two;
outline: none;
}
&:hover {
background-color: darken($btn-blue, 3%);
}
&:active {
background-color: darken($btn-blue, 10%);
}
&.cancel {
background-color: $btn-gray;
&:hover {
background-color: darken($btn-gray, 3%);
}
&:active {
background-color: darken($btn-gray, 10%);
}
// Cancel button should keep the same style
&:focus {
box-shadow: $focus-cancel-color 0 0 2px, $focus-cancel-color2 0 0 0 1px inset;
}
}
&[disabled] {
cursor: default;
opacity: .6;
}
&.confirm[disabled] {
color: transparent;
~ .la-ball-fall {
opacity: 1;
transition-delay: 0s;
visibility: visible;
}
}
// Removes selection outline in Firefox
&::-moz-focus-inner {
border: 0;
}
}
// Only show focus-style when there is multiple choice of actions
&[data-has-cancel-button=false] button {
box-shadow: 0;
}
&[data-has-confirm-button=false][data-has-cancel-button=false] {
padding-bottom: 40px;
}
.sa-icon {
border: 4px solid $gray;
border-radius: 50%;
box-sizing: content-box;
height: 80px;
margin: 20px auto;
padding: 0;
position: relative;
width: 80px;
&.sa-error {
border-color: $red;
.sa-x-mark {
display: block;
position: relative;
}
.sa-line {
background-color: $sweet-red;
border-radius: 2px;
display: block;
height: 5px;
position: absolute;
top: 37px;
width: 47px;
&.sa-left {
left: 17px;
transform: rotate(45deg);
}
&.sa-right {
right: 16px;
transform: rotate(-45deg);
}
}
}
&.sa-warning {
border-color: $sweet-orange;
.sa-body { // Exclamation mark body
background-color: $sweet-orange;
border-radius: 2px;
height: 47px;
left: 50%;
margin-left: -2px;
position: absolute;
top: 10px;
width: 5px;
}
.sa-dot { // Exclamation mark dot
background-color: $sweet-orange;
border-radius: 50%;
bottom: 10px;
height: 7px;
left: 50%;
margin-left: -3px;
position: absolute;
width: 7px;
}
}
&.sa-info {
border-color: $sweet-blue;
&::before { // i-letter body
background-color: $sweet-blue;
border-radius: 2px;
bottom: 17px;
content: '';
height: 29px;
left: 50%;
margin-left: -2px;
position: absolute;
width: 5px;
}
&::after { // i-letter dot
background-color: $sweet-blue;
border-radius: 50%;
content: '';
height: 7px;
margin-left: -3px;
position: absolute;
top: 19px;
width: 7px;
}
}
&.sa-success {
border-color: $sweet-green;
&::before,
&::after { // Emulate moving circular line
background: $white;
border-radius: 50%;
content: '';
height: 120px;
position: absolute;
transform: rotate(45deg);
width: 60px;
}
&::before {
border-radius: 120px 0 0 120px;
left: -33px;
top: -7px;
transform: rotate(-45deg);
transform-origin: 60px 60px;
}
&::after {
border-radius: 0 120px 120px 0;
left: 30px;
top: -11px;
transform: rotate(-45deg);
transform-origin: 0 60px;
}
.sa-placeholder { // Ring
border: 4px solid rgba($sweet-green, .2);
border-radius: 50%;
box-sizing: content-box;
height: 80px;
left: -4px;
position: absolute;
top: -4px;
width: 80px;
z-index: 2;
}
.sa-fix { // Hide corners left from animation
background-color: $white;
height: 90px;
left: 28px;
position: absolute;
top: 8px;
transform: rotate(-45deg);
width: 5px;
z-index: 1;
}
.sa-line {
background-color: $sweet-green;
border-radius: 2px;
display: block;
height: 5px;
position: absolute;
z-index: 2;
&.sa-tip {
left: 14px;
top: 46px;
transform: rotate(45deg);
width: 25px;
}
&.sa-long {
right: 8px;
top: 38px;
transform: rotate(-45deg);
width: 47px;
}
}
}
&.sa-custom {
background-position: center center;
background-repeat: no-repeat;
background-size: contain;
border: 0;
border-radius: 0;
}
}
}
// Animations
@mixin keyframes($animation-name) {
@keyframes #{$animation-name} {
@content;
}
}
@mixin animation($str) {
animation: #{$str};
}
// Modal animation
@include keyframes(showSweetAlert) {
0% { transform: scale(.7); }
45% { transform: scale(1.05); }
80% { transform: scale(.95); }
100% { transform: scale(1); }
}
@include keyframes(hideSweetAlert) {
0% { transform: scale(1); }
100% { transform: scale(.5); }
}
@include keyframes(slideFromTop) {
0% { top: 0; }
100% { top: 50%; }
}
@include keyframes(slideToTop) {
0% { top: 50%; }
100% { top: 0; }
}
@include keyframes(slideFromBottom) {
0% { top: 70%; }
100% { top: 50%; }
}
@include keyframes(slideToBottom) {
0% { top: 50%; }
100% { top: 70%; }
}
.showSweetAlert {
&[data-animation=pop] {
@include animation('showSweetAlert 0.3s');
}
&[data-animation=none] {
@include animation('none');
}
&[data-animation=slide-from-top] {
@include animation('slideFromTop 0.3s');
}
&[data-animation=slide-from-bottom] {
@include animation('slideFromBottom 0.3s');
}
}
.hideSweetAlert {
&[data-animation=pop] {
@include animation('hideSweetAlert 0.2s');
}
&[data-animation=none] {
@include animation('none');
}
&[data-animation=slide-from-top] {
@include animation('slideToTop 0.4s');
}
&[data-animation=slide-from-bottom] {
@include animation('slideToBottom 0.3s');
}
}
// Success icon animation
@include keyframes(animateSuccessTip) {
0% {
left: 1px;
top: 19px;
width: 0;
}
54% {
left: 1px;
top: 19px;
width: 0;
}
70% {
left: -8px;
top: 37px;
width: 50px;
}
84% {
left: 21px;
top: 48px;
width: 17px;
}
100% {
left: 14px;
top: 45px;
width: 25px;
}
}
@include keyframes(animateSuccessLong) {
0% {
right: 46px;
top: 54px;
width: 0;
}
65% {
right: 46px;
top: 54px;
width: 0;
}
84% {
right: 0;
top: 35px;
width: 55px;
}
100% {
right: 8px;
top: 38px;
width: 47px;
}
}
@include keyframes(rotatePlaceholder) {
0% {
transform: rotate(-45deg);
}
5% {
transform: rotate(-45deg);
}
12% {
transform: rotate(-405deg);
}
100% {
transform: rotate(-405deg);
}
}
.animateSuccessTip {
@include animation('animateSuccessTip 0.75s');
}
.animateSuccessLong {
@include animation('animateSuccessLong 0.75s');
}
.sa-icon.sa-success.animate::after {
@include animation('rotatePlaceholder 4.25s ease-in');
}
// Error icon animation
@include keyframes(animateErrorIcon) {
0% {
opacity: 0;
transform: rotateX(100deg);
}
100% {
opacity: 1;
transform: rotateX(0deg);
}
}
.animateErrorIcon {
@include animation('animateErrorIcon 0.5s');
}
@include keyframes(animateXMark) {
0% {
margin-top: 26px;
opacity: 0;
transform: scale(.4);
}
50% {
margin-top: 26px;
opacity: 0;
transform: scale(.4);
}
80% {
margin-top: -6px;
transform: scale(1.15);
}
100% {
margin-top: 0;
opacity: 1;
transform: scale(1);
}
}
.animateXMark {
@include animation('animateXMark 0.5s');
}
@include keyframes(pulseWarning) {
0% {
border-color: $keyframe-bg-color;
}
100% {
border-color: $keyframe-bg-color2;
}
}
.pulseWarning {
@include animation('pulseWarning 0.75s infinite alternate');
}
@include keyframes(pulseWarningIns) {
0% {
background-color: $keyframe-bg-color;
}
100% {
background-color: $keyframe-bg-color2;
}
}
.pulseWarningIns {
@include animation('pulseWarningIns 0.75s infinite alternate');
}
@include keyframes(rotate-loading) {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
...@@ -97,3 +97,27 @@ $bg-import-error: #ffe8e8; ...@@ -97,3 +97,27 @@ $bg-import-error: #ffe8e8;
// color ProgressBar // color ProgressBar
$bg-progresss-bar: #5bc0de; $bg-progresss-bar: #5bc0de;
// alert sweetalert
$h2-color: #575757;
$p-color: #797979;
$bg-error-container: #f1f1f1;
$bg-icon: rgb(234, 125, 125);
$bg-after: #f06e57;
$focus-shadow: rgb(196, 230, 245);
$focus-border: rgb(180, 219, 237);
$placeholder-color: rgba(#575757, 40);
$btn-blue: #8cd4f5;
$btn-gray: #c1c1c1;
$input-border-color: rgb(215, 215, 215);
$btn-focus-one: rgba(128, 179, 235, .5);
$btn-focus-two: rgba(0, 0, 0, .05);
$focus-cancel-color: rgba(197, 205, 211, .8);
$focus-cancel-color2: rgba(0, 0, 0, .0470588);
$sweet-red: #f27474;
$sweet-orange: #f8bb86;
$sweet-blue: #c9dae1;
$sweet-green: #a5dc86;
$keyframe-bg-color: #f8d486;
$keyframe-bg-color2: #f8bb86;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment