Commit ec3c99ca authored by Juorder Gonzalez's avatar Juorder Gonzalez

Merge pull request #92 from ZBoxApp/issues_resolved_manager

add travis test, and modify some css to wrap all content inside wrapper.
parents a7d98ba7 702b5d68
module.exports = {"main":{"js":"/928473bundle.js"}} module.exports = {"main":{"js":"/531271bundle.js"}}
\ No newline at end of file \ No newline at end of file
...@@ -120,6 +120,10 @@ export default class Companies extends React.Component { ...@@ -120,6 +120,10 @@ export default class Companies extends React.Component {
}); });
} }
componentWillReceiveProps() {
GlobalActions.emitEndLoading();
}
componentDidMount() { componentDidMount() {
$('#sidebar-companies').addClass('active'); $('#sidebar-companies').addClass('active');
this.getCompanies(); this.getCompanies();
......
...@@ -3,6 +3,7 @@ import * as Utils from '../../utils/utils.jsx'; ...@@ -3,6 +3,7 @@ import * as Utils from '../../utils/utils.jsx';
import Constants from '../../utils/constants.jsx'; import Constants from '../../utils/constants.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';
const Labels = Constants.Labels; const Labels = Constants.Labels;
...@@ -56,6 +57,11 @@ export default class DNSZoneForm extends React.Component { ...@@ -56,6 +57,11 @@ export default class DNSZoneForm extends React.Component {
addDNSRequest() { addDNSRequest() {
const records = this.defaultRows; const records = this.defaultRows;
const zoneDNS = this.zoneDNS; const zoneDNS = this.zoneDNS;
const request = {
name: this.props.domain.name,
kind: 'Master',
nameservers: []
};
Utils.toggleStatusButtons('.savedns', true); Utils.toggleStatusButtons('.savedns', true);
const button = this.refs.savedns; const button = this.refs.savedns;
...@@ -84,12 +90,25 @@ export default class DNSZoneForm extends React.Component { ...@@ -84,12 +90,25 @@ export default class DNSZoneForm extends React.Component {
typeError: MessageType.SUCCESS typeError: MessageType.SUCCESS
}); });
}); });
} else { }
Client.createZoneWithRecords(request, records, () => {
Utils.toggleStatusButtons('.savedns', false);
button.innerHTML = oldContent;
EventStore.emitMessage({ EventStore.emitMessage({
message: 'Ha ocurrido un error general al intentar agregar un registro DNS', message: 'Se ha creado su zona DNS éxitosamente.',
typeError: MessageType.SUCCESS
});
}, (error) => {
EventStore.emitMessage({
message: error.extra.reason,
typeError: MessageType.ERROR typeError: MessageType.ERROR
}); });
}
Utils.toggleStatusButtons('.savedns', false);
button.innerHTML = oldContent;
});
} }
addDNSRow() { addDNSRow() {
...@@ -172,6 +191,7 @@ export default class DNSZoneForm extends React.Component { ...@@ -172,6 +191,7 @@ export default class DNSZoneForm extends React.Component {
} }
render() { render() {
const textButton = this.zoneDNS ? 'Agregar otro registro' : 'Crear zona DNS';
let isVisible = false; let isVisible = false;
let fields = null; let fields = null;
let header = null; let header = null;
...@@ -315,7 +335,7 @@ export default class DNSZoneForm extends React.Component { ...@@ -315,7 +335,7 @@ export default class DNSZoneForm extends React.Component {
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> Agregar otro registro <i className='fa fa-plus-circle fa-lg'></i> {textButton}
</button> </button>
</p> </p>
</blockquote> </blockquote>
......
...@@ -33,7 +33,8 @@ export default class Domains extends React.Component { ...@@ -33,7 +33,8 @@ export default class Domains extends React.Component {
this.state = { this.state = {
page, page,
offset: ((page - 1) * QueryOptions.DEFAULT_LIMIT) offset: ((page - 1) * QueryOptions.DEFAULT_LIMIT),
loading: true
}; };
} }
...@@ -41,7 +42,7 @@ export default class Domains extends React.Component { ...@@ -41,7 +42,7 @@ export default class Domains extends React.Component {
const self = this; const self = this;
Client.getAllDomains( Client.getAllDomains(
{ {
limit: 200, limit: QueryOptions.DEFAULT_LIMIT,
offset: this.state.offset offset: this.state.offset
}, },
(data) => { (data) => {
...@@ -49,14 +50,16 @@ export default class Domains extends React.Component { ...@@ -49,14 +50,16 @@ export default class Domains extends React.Component {
this.getPlans(domains). this.getPlans(domains).
then(() => { then(() => {
self.setState({ self.setState({
data data,
loading: false
}); });
}). }).
catch(() => { catch(() => {
this.setState({ this.setState({
error: { error: {
message: 'No se obtuvieron los planes de las cuentas', message: 'No se obtuvieron los planes de las cuentas',
type: messageType.ERROR type: messageType.ERROR,
loading: false
} }
}); });
}). }).
...@@ -68,7 +71,8 @@ export default class Domains extends React.Component { ...@@ -68,7 +71,8 @@ export default class Domains extends React.Component {
this.setState({ this.setState({
error: { error: {
message: error.message, message: error.message,
type: messageType.ERROR type: messageType.ERROR,
loading: false
} }
}); });
GlobalActions.emitEndLoading(); GlobalActions.emitEndLoading();
...@@ -104,7 +108,8 @@ export default class Domains extends React.Component { ...@@ -104,7 +108,8 @@ export default class Domains extends React.Component {
this.state = { this.state = {
page, page,
offset: ((page - 1) * QueryOptions.DEFAULT_LIMIT) offset: ((page - 1) * QueryOptions.DEFAULT_LIMIT),
loading: true
}; };
this.getDomains(); this.getDomains();
...@@ -121,8 +126,12 @@ export default class Domains extends React.Component { ...@@ -121,8 +126,12 @@ export default class Domains extends React.Component {
render() { render() {
const error = this.state.error; const error = this.state.error;
let message; let message = null;
let addDomainButton = null; let addDomainButton = null;
let pagination = null;
let panelBody = null;
let tableResults = null;
if (error) { if (error) {
message = ( message = (
<MessageBar <MessageBar
...@@ -133,7 +142,16 @@ export default class Domains extends React.Component { ...@@ -133,7 +142,16 @@ export default class Domains extends React.Component {
); );
} }
if (!this.isGlobalAdmin) { if (this.state.loading) {
panelBody = (
<div className='text-center'>
<i className='fa fa-spinner fa-spin fa-4x fa-fw'></i>
<p>{'Cargando Dominios...'}</p>
</div>
);
}
if (this.isGlobalAdmin) {
addDomainButton = [{ addDomainButton = [{
label: 'Agregar Dominio', label: 'Agregar Dominio',
props: { props: {
...@@ -145,7 +163,6 @@ export default class Domains extends React.Component { ...@@ -145,7 +163,6 @@ export default class Domains extends React.Component {
}]; }];
} }
let tableResults;
if (this.state.data) { if (this.state.data) {
const configPlans = global.window.manager_config.plans; const configPlans = global.window.manager_config.plans;
tableResults = this.state.data.domain.map((d) => { tableResults = this.state.data.domain.map((d) => {
...@@ -224,47 +241,46 @@ export default class Domains extends React.Component { ...@@ -224,47 +241,46 @@ export default class Domains extends React.Component {
</tr> </tr>
); );
}); });
}
const panelBody = ( if (this.state.offset > 0 || (this.state.data && this.state.data.more)) {
<div key='panelBody'> const totalPages = this.state.data ? Math.ceil(this.state.data.total / QueryOptions.DEFAULT_LIMIT) : 0;
<div pagination = (
id='index-domains-table' <Pagination
className='table-responsive' key='panelPagination'
> url='domains'
<table currentPage={this.state.page}
id='index-domains' totalPages={totalPages}
cellPadding='1' />
cellSpacing='1' );
className='table table-condensed table-striped vertical-align' }
panelBody = (
<div>
<div
id='index-domains-table'
className='table-responsive'
> >
<thead> <table
<tr> id='index-domains'
<th>{'Nombre'}</th> cellPadding='1'
<th className='text-center'>{'Casillas Compradas'}</th> cellSpacing='1'
<th className='text-center'>{'Descripción'}</th> className='table table-condensed table-striped vertical-align'
<th className='text-center'>{'Estado'}</th> >
</tr> <thead>
</thead> <tr key='table-heading'>
<tbody> <th>{'Nombre'}</th>
{tableResults} <th className='text-center'>{'Casillas Compradas'}</th>
</tbody> <th className='text-center'>{'Descripción'}</th>
</table> <th className='text-center'>{'Estado'}</th>
</tr>
</thead>
<tbody>
{tableResults}
</tbody>
</table>
</div>
</div> </div>
</div>
);
let pagination;
if (this.state.offset > 0 || (this.state.data && this.state.data.more)) {
const totalPages = this.state.data ? Math.ceil(this.state.data.total / QueryOptions.DEFAULT_LIMIT) : 0;
pagination = (
<Pagination
key='panelPagination'
url='domains'
currentPage={this.state.page}
totalPages={totalPages}
/>
); );
} }
......
...@@ -508,10 +508,10 @@ export default class Mailboxes extends React.Component { ...@@ -508,10 +508,10 @@ export default class Mailboxes extends React.Component {
} }
]; ];
const totalPage = Math.ceil(totalAccounts / QueryOptions.DEFAULT_LIMIT);
let activePagination = { let activePagination = {
total: totalAccounts total: totalPage
}; };
const totalPage = Math.ceil(totalAccounts / QueryOptions.DEFAULT_LIMIT);
if (activeAccounts.length > QueryOptions.DEFAULT_LIMIT) { if (activeAccounts.length > QueryOptions.DEFAULT_LIMIT) {
activeAccounts = activeAccounts.slice(this.state.offset, (this.state.page * QueryOptions.DEFAULT_LIMIT)); activeAccounts = activeAccounts.slice(this.state.offset, (this.state.page * QueryOptions.DEFAULT_LIMIT));
activePagination = { activePagination = {
......
import React from 'react'; import React from 'react';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import Constants from '../utils/constants.jsx';
const limit = Constants.QueryOptions.DEFAULT_LIMIT;
export default class Pagination extends React.Component { export default class Pagination extends React.Component {
constructor(props) { constructor(props) {
...@@ -51,14 +48,13 @@ export default class Pagination extends React.Component { ...@@ -51,14 +48,13 @@ export default class Pagination extends React.Component {
} }
handleLast(e) { handleLast(e) {
e.preventDefault(); e.preventDefault();
const page = this.getPageQueryString(Math.ceil(this.props.totalPages / limit)); const page = this.getPageQueryString(this.props.totalPages);
browserHistory.push(`/${this.props.url}${page}`); browserHistory.push(`/${this.props.url}${page}`);
} }
render() { render() {
//let i = 1; //let i = 1;
const total = this.props.totalPages; const total = this.props.totalPages;
const current = this.props.currentPage; const current = this.props.currentPage;
const totalPages = Math.ceil(total / limit);
const pages = []; const pages = [];
let first; let first;
...@@ -68,11 +64,11 @@ export default class Pagination extends React.Component { ...@@ -68,11 +64,11 @@ export default class Pagination extends React.Component {
const console = ( const console = (
<li key='console-page'> <li key='console-page'>
<span>{`${current} de ${totalPages}`}</span> <span>{`${current} de ${total}`}</span>
</li> </li>
); );
if (current > 1 && current <= totalPages) { if (current > 1 && current <= total) {
first = ( first = (
<li key='first-page'> <li key='first-page'>
<a <a
...@@ -90,7 +86,7 @@ export default class Pagination extends React.Component { ...@@ -90,7 +86,7 @@ export default class Pagination extends React.Component {
); );
} }
if (current < totalPages) { if (current < total) {
next = ( next = (
<li key='next-page'> <li key='next-page'>
<a <a
...@@ -109,7 +105,7 @@ export default class Pagination extends React.Component { ...@@ -109,7 +105,7 @@ export default class Pagination extends React.Component {
} }
const rangeBack = current - this.props.range; const rangeBack = current - this.props.range;
const rangeForward = ((current + this.props.range) + 1) > totalPages ? totalPages + 1 : ((current + this.props.range) + 1); const rangeForward = ((current + this.props.range) + 1) > total ? total + 1 : ((current + this.props.range) + 1);
for (let p = rangeBack; p < rangeForward; p++) { for (let p = rangeBack; p < rangeForward; p++) {
if ((p > 0) && (p <= total)) { if ((p > 0) && (p <= total)) {
......
...@@ -29,6 +29,9 @@ export default class SearchView extends React.Component { ...@@ -29,6 +29,9 @@ export default class SearchView extends React.Component {
} }
makeSearch(query) { makeSearch(query) {
this.setState({
loading: true
});
Client.search({ Client.search({
query: `(|(mail=*${query}*)(cn=*${query}*)(sn=*${query}*)(gn=*${query}*)(displayName=*${query}*)(zimbraMailDeliveryAddress=*${query}*)(zimbraDomainName=*${query}*)(uid=*${query}*)(zimbraMailAlias=*${query}*)(uid=*${query}*)(zimbraDomainName=*${query}*)(cn=*${query}*))`, query: `(|(mail=*${query}*)(cn=*${query}*)(sn=*${query}*)(gn=*${query}*)(displayName=*${query}*)(zimbraMailDeliveryAddress=*${query}*)(zimbraDomainName=*${query}*)(uid=*${query}*)(zimbraMailAlias=*${query}*)(uid=*${query}*)(zimbraDomainName=*${query}*)(cn=*${query}*))`,
types: 'accounts,distributionlists,domains' types: 'accounts,distributionlists,domains'
...@@ -45,12 +48,14 @@ export default class SearchView extends React.Component { ...@@ -45,12 +48,14 @@ export default class SearchView extends React.Component {
if (success.total <= 0) { if (success.total <= 0) {
return this.setState({ return this.setState({
notfound: true notfound: true,
loading: false
}); });
} }
return this.setState({ return this.setState({
result result,
loading: false
}); });
}, (error) => { }, (error) => {
console.log(error); //eslint-disable-line no-console console.log(error); //eslint-disable-line no-console
...@@ -195,6 +200,15 @@ export default class SearchView extends React.Component { ...@@ -195,6 +200,15 @@ export default class SearchView extends React.Component {
); );
} }
if (this.state.loading) {
content = (
<div className='text-center'>
<i className='fa fa-spinner fa-spin fa-4x fa-fw'></i>
<p>{'Buscando...'}</p>
</div>
);
}
return ( return (
<div> <div>
{pagelInfo} {pagelInfo}
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
"dnsApiUrl": "http://zimbra.zboxapp.dev:3000", "dnsApiUrl": "http://zimbra.zboxapp.dev:3000",
"webMailUrl": "https://zimbra.zboxapp.dev", "webMailUrl": "https://zimbra.zboxapp.dev",
"dns": { "dns": {
"url": "http://192.168.1.8:8081", "url": "http://192.168.1.8:8081/powerdns_proxy/",
"token": "otto" "token": "otto"
}, },
"maxResultOnRequestZimbra": 4000, "maxResultOnRequestZimbra": 20000,
"autoincrementOnFailRequestZimbra": 500, "autoincrementOnFailRequestZimbra": 500,
"plans": { "plans": {
"basic": { "basic": {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
> div { > div {
animation: sk-stretchdelay 1.2s infinite ease-in-out; animation: sk-stretchdelay 1.2s infinite ease-in-out;
background-color: $color-green; //background-color: $color-green;
display: inline-block; display: inline-block;
height: 100%; height: 100%;
width: 8px; width: 8px;
......
...@@ -50,7 +50,7 @@ body { ...@@ -50,7 +50,7 @@ body {
#wrapper { #wrapper {
background: $color-background; background: $color-background;
border-left: 1px solid $border-color; border-left: 1px solid $border-color;
height: inherit; height: auto;
margin: 0 0 0 $menu-width; margin: 0 0 0 $menu-width;
min-height: 100%; min-height: 100%;
padding: 0; padding: 0;
......
...@@ -668,9 +668,9 @@ export function renameAccount(account, success, error) { ...@@ -668,9 +668,9 @@ export function renameAccount(account, success, error) {
} }
export function initPowerDNS() { export function initPowerDNS() {
return new Promise((resolve, reject) => { /*return new Promise((resolve, reject) => {
const powerAttrs = window.manager_config.dns;
const api = new Powerdns({url: powerAttrs.url, token: powerAttrs.token}); const api = new Powerdns({url: powerAttrs.url, token: powerAttrs.token});
console.log(api);
if (api) { if (api) {
return resolve(api); return resolve(api);
...@@ -680,79 +680,54 @@ export function initPowerDNS() { ...@@ -680,79 +680,54 @@ export function initPowerDNS() {
type: Constants.MessageType.ERROR, type: Constants.MessageType.ERROR,
message: 'PowerDNS no instanciado' message: 'PowerDNS no instanciado'
}); });
}); });*/
const powerAttrs = window.manager_config.dns;
const api = new Powerdns({url: powerAttrs.url, token: powerAttrs.token});
return api;
} }
export function createZoneWithRecords(zoneData, records, success, error) { export function createZoneWithRecords(zoneData, records, success, error) {
initPowerDNS().then( const api = initPowerDNS();
(api) => { api.createZoneWithRecords(zoneData, records, (er, data) => {
api.createZoneWithRecords(zoneData, records, (er, data) => { if (er) {
if (er) { return error(er);
return error(er);
}
return success(data);
});
},
(err) => {
const e = handleError('createZoneWithRecords', err);
return error(e);
} }
);
return success(data);
});
} }
export function getZone(domain, success, error) { export function getZone(domain, success, error) {
initPowerDNS().then( const api = initPowerDNS();
(api) => { api.getZone(domain, (er, data) => {
api.getZone(domain, (er, data) => { if (er) {
if (er) { return error(er);
return error(er);
}
return success(data);
});
},
(err) => {
const e = handleError('getZone', err);
return error(e);
} }
);
return success(data);
});
} }
export function modifyOrCreateRecords(record, success, error) { export function modifyOrCreateRecords(record, success, error) {
initPowerDNS().then( const api = initPowerDNS();
(api) => { api.modifyOrCreateRecords(record, (err, data) => {
api.modifyOrCreateRecords(record, (err, data) => { if (err) {
if (err) {
const e = handleError('modifyOrCreateRecords', err);
return error(e);
}
return success(data);
});
},
(err) => {
const e = handleError('modifyOrCreateRecords', err); const e = handleError('modifyOrCreateRecords', err);
return error(e); return error(e);
} }
);
return success(data);
});
} }
export function deleteRecords(zoneUrl, record, success, error) { export function deleteRecords(zoneUrl, record, success, error) {
initPowerDNS().then( const api = initPowerDNS();
(api) => { api.deleteRecords(zoneUrl, record, (err, data) => {
api.deleteRecords(zoneUrl, record, (err, data) => { if (err) {
if (err) {
const e = handleError('deleteRecords', err);
return error(e);
}
return success(data);
});
},
(err) => {
const e = handleError('deleteRecords', err); const e = handleError('deleteRecords', err);
return error(e); return error(e);
} }
);
return success(data);
});
} }
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