Commit 29ac4f3d authored by Juorder Gonzalez's avatar Juorder Gonzalez

Merge pull request #109 from ZBoxApp/issues_resolved_manager

fixed filter mailboxes, fixed sum to domain, fixed mx, fixed mailbox …
parents d36467ce 3061904d
1464106868 1464204428
\ No newline at end of file \ No newline at end of file
module.exports = {"main":{"js":"/699779bundle.js"}} module.exports = {"main":{"js":"/896467bundle.js"}}
\ No newline at end of file \ No newline at end of file
...@@ -35,7 +35,8 @@ export default class Companies extends React.Component { ...@@ -35,7 +35,8 @@ export default class Companies extends React.Component {
this.state = { this.state = {
page, page,
offset: ((page - 1) * Constants.QueryOptions.DEFAULT_LIMIT) offset: ((page - 1) * Constants.QueryOptions.DEFAULT_LIMIT),
loading: true
}; };
this.isGlobalAdmin = UserStore.isGlobalAdmin(); this.isGlobalAdmin = UserStore.isGlobalAdmin();
...@@ -68,13 +69,15 @@ export default class Companies extends React.Component { ...@@ -68,13 +69,15 @@ export default class Companies extends React.Component {
CompaniesStore.setCompanies(comps); CompaniesStore.setCompanies(comps);
self.setState({ self.setState({
companies: comps companies: comps,
loading: false
}); });
}). }).
catch((error) => { catch((error) => {
self.setState({error: { self.setState({error: {
message: error, message: error,
type: messageTypes.ERROR type: messageTypes.ERROR,
loading: false
}}); }});
}); });
}).catch((error) => { }).catch((error) => {
...@@ -91,7 +94,8 @@ export default class Companies extends React.Component { ...@@ -91,7 +94,8 @@ export default class Companies extends React.Component {
}, (error) => { }, (error) => {
self.setState({error: { self.setState({error: {
message: error, message: error,
type: messageTypes.ERROR type: messageTypes.ERROR,
loading: false
}}); }});
}); });
} else { } else {
...@@ -103,13 +107,15 @@ export default class Companies extends React.Component { ...@@ -103,13 +107,15 @@ export default class Companies extends React.Component {
}, (error) => { }, (error) => {
self.setState({error: { self.setState({error: {
message: error, message: error,
type: messageTypes.ERROR type: messageTypes.ERROR,
loading: false
}}); }});
}); });
}, (error) => { }, (error) => {
self.setState({ self.setState({
error, error,
type: messageTypes.ERROR type: messageTypes.ERROR,
loading: false
}); });
}); });
} }
...@@ -194,6 +200,16 @@ export default class Companies extends React.Component { ...@@ -194,6 +200,16 @@ export default class Companies extends React.Component {
let panelBody; let panelBody;
let noLimitError; let noLimitError;
let pagination = null; let pagination = null;
const textLoading = this.isGlobalAdmin ? 'Cargando Empresas...' : 'Cargando Mi Empresa...';
if (this.state.loading) {
panelBody = (
<div className='text-center'>
<i className='fa fa-spinner fa-spin fa-4x fa-fw'></i>
<p>{textLoading}</p>
</div>
);
}
if (this.state.companies.length === 0) { if (this.state.companies.length === 0) {
panelBody = ( panelBody = (
...@@ -213,7 +229,7 @@ export default class Companies extends React.Component { ...@@ -213,7 +229,7 @@ export default class Companies extends React.Component {
const totalPages = Math.ceil(data.length / Constants.QueryOptions.DEFAULT_LIMIT); const totalPages = Math.ceil(data.length / Constants.QueryOptions.DEFAULT_LIMIT);
pagination = ( pagination = (
<Pagination <Pagination
key='panelPaginationCompanies' key='paginationCompany'
url='companies' url='companies'
currentPage={this.state.page} currentPage={this.state.page}
totalPages={totalPages} totalPages={totalPages}
......
...@@ -29,25 +29,23 @@ export default class DomainGeneralInfo extends React.Component { ...@@ -29,25 +29,23 @@ export default class DomainGeneralInfo extends React.Component {
} }
componentWillMount() { componentWillMount() {
const domain = this.props.domain; const domain = this.props.domain;
this.getMXRecord(domain.name); this.getMXRecord(domain);
this.getCompany(domain.attrs.businessCategory); this.getCompany(domain.attrs.businessCategory);
} }
getMXRecord(name) { getMXRecord(domain) {
const self = this; const self = this;
Client.getDnsInfo( domain.checkMxRecord((err, data) => {
name, if (err) {
(data) => { return self.setState({
self.setState({
mx: data.mx
});
},
(err) => {
self.setState({
mx: err mx: err
}); });
} }
);
return self.setState({
mx: data.entry
});
});
} }
getCompany(id) { getCompany(id) {
const company = CompanyStore.getCompanyById(id); const company = CompanyStore.getCompanyById(id);
......
...@@ -30,13 +30,13 @@ export default class DomainMailboxPlans extends React.Component { ...@@ -30,13 +30,13 @@ export default class DomainMailboxPlans extends React.Component {
plans plans
}); });
} }
return this.props.domain.countAccounts( return this.props.domain.countAccounts(
(err, data) => { (err, data) => {
if (err) { if (err) {
return this.setState({plans: {}}); return this.setState({plans: {}});
} }
this.props.domain.plans = data;
return this.setState({plans: data}); return this.setState({plans: data});
} }
); );
...@@ -94,12 +94,12 @@ export default class DomainMailboxPlans extends React.Component { ...@@ -94,12 +94,12 @@ export default class DomainMailboxPlans extends React.Component {
}); });
} }
for (const key in plans) { for (const key in this.state.plans) {
if (plans.hasOwnProperty(key)) { if (plans.hasOwnProperty(key)) {
const plan = plans[key]; const plan = plans[key];
totalUsed += plan.used; totalUsed += (parseInt(plan.used, 10)) ? parseInt(plan.used, 10) : 0;
if (plan.limit === 0) { if (plan.limit === 0) {
totalLimit = '\u221e'; //totalLimit = '\u221e';
if (!noLimitError) { if (!noLimitError) {
noLimitError = ( noLimitError = (
...@@ -111,7 +111,6 @@ export default class DomainMailboxPlans extends React.Component { ...@@ -111,7 +111,6 @@ export default class DomainMailboxPlans extends React.Component {
); );
} }
} else { } else {
console.log(totalLimit); //eslint-disable-line no-console
totalLimit += plan.limit; totalLimit += plan.limit;
} }
......
...@@ -36,14 +36,25 @@ export default class Mailboxes extends React.Component { ...@@ -36,14 +36,25 @@ export default class Mailboxes extends React.Component {
this.showMessage = this.showMessage.bind(this); this.showMessage = this.showMessage.bind(this);
this.refreshAllAccounts = this.refreshAllAccounts.bind(this); this.refreshAllAccounts = this.refreshAllAccounts.bind(this);
this.handleFilterMailbox = this.handleFilterMailbox.bind(this);
this.handleChangeFilter = this.handleChangeFilter.bind(this); this.handleChangeFilter = this.handleChangeFilter.bind(this);
this.makeFilter = this.makeFilter.bind(this);
const page = parseInt(this.props.location.query.page, 10) || 1; const page = parseInt(this.props.location.query.page, 10) || 1;
this.mailboxes = null; this.mailboxes = null;
this.status = ''; this.mailboxesFiltered = null;
this.filtering = false;
this.selectedStatusFilter = '';
this.selectedPlanFilter = '';
this.cos = Utils.getEnabledPlansByCos(ZimbraStore.getAllCos()); this.cos = Utils.getEnabledPlansByCos(ZimbraStore.getAllCos());
this.cosById = Utils.getEnabledPlansByCosId(ZimbraStore.getAllCos()); this.cosById = Utils.getEnabledPlansByCosId(ZimbraStore.getAllCos());
this.isRefreshing = true; this.isRefreshing = true;
this.optionStatus = {
active: 'Active',
locked: 'Inactiva',
lockedout: 'Bloqueada',
closed: 'Cerrada'
};
this.optionPlans = window.manager_config.plans;
this.state = { this.state = {
page, page,
...@@ -54,65 +65,49 @@ export default class Mailboxes extends React.Component { ...@@ -54,65 +65,49 @@ export default class Mailboxes extends React.Component {
handleChangeFilter(e) { handleChangeFilter(e) {
const selected = e.target.value; const selected = e.target.value;
const cos = Utils.getEnabledPlansByCos(ZimbraStore.getAllCos());
if (e.target.className.indexOf('plans') > -1) { if (e.target.className.indexOf('plans') > -1) {
this.cos = cos[selected]; this.selectedPlanFilter = '';
if (this.cos[selected]) {
this.selectedPlanFilter = this.cos[selected];
}
} }
if (e.target.className.indexOf('status') > -1) { if (e.target.className.indexOf('status') > -1) {
this.status = selected; this.selectedStatusFilter = selected.length > 0 ? selected : null;
} }
const data = Object.assign({}, this.mailboxes); const domainId = this.props.params.domain_id;
const arrayFiltered = data.account.filter((strArray) => { this.getAllMailboxes(domainId, window.manager_config.maxResultOnRequestZimbra);
const status = this.status === '' ? strArray.attrs.zimbraAccountStatus : this.status; }
const plan = this.cos ? this.cos : strArray.attrs.zimbraCOSId;
if (strArray.attrs.zimbraAccountStatus === status && strArray.attrs.zimbraCOSId === plan) { makeFilter() {
return strArray; const mailboxes = Object.assign({}, this.mailboxes);
} let cos = this.selectedPlanFilter;
let status = this.selectedStatusFilter;
if (cos === '' && status === '') {
return false; return false;
}); }
data.account = arrayFiltered;
data.total = arrayFiltered.length;
const tables = this.buildTableFromData(data, ['Todas', 'Bloqueadas']);
return this.setState({
data: tables
});
}
handleFilterMailbox(e, info) {
const search = e.target.value;
const data = Object.assign({}, info);
const arrayFiltered = data.account.filter((strArray) => { const arrayFiltered = mailboxes.account.filter((strArray) => {
if (this.status === '') { const CurrentStatus = status || strArray.attrs.zimbraAccountStatus;
if (strArray.name.match(search)) { const plan = cos || strArray.attrs.zimbraCOSId;
return strArray;
}
}
if (strArray.name.match(search) && strArray.attrs.zimbraAccountStatus === this.status) { if (strArray.attrs.zimbraAccountStatus === CurrentStatus && strArray.attrs.zimbraCOSId === plan) {
return strArray; return strArray;
} }
return false; return false;
}); });
data.account = arrayFiltered; mailboxes.account = arrayFiltered;
data.total = arrayFiltered.length; mailboxes.total = arrayFiltered.length;
const tables = this.buildTableFromData(data, ['Todas', 'Bloqueadas']); this.mailboxesFiltered = mailboxes;
return this.setState({ return this.mailboxesFiltered;
data: tables
});
} }
showMessage(attrs) { showMessage(attrs) {
...@@ -224,7 +219,9 @@ export default class Mailboxes extends React.Component { ...@@ -224,7 +219,9 @@ export default class Mailboxes extends React.Component {
this.isRefreshing = false; this.isRefreshing = false;
const tables = this.buildTableFromData(data, ['Todas', 'Bloqueadas']); const items = this.makeFilter() || this.mailboxes;
const tables = this.buildTableFromData(items, ['Todas', 'Bloqueadas']);
if (tables.lockedAlert) { if (tables.lockedAlert) {
GlobalActions.emitMessage({ GlobalActions.emitMessage({
...@@ -441,26 +438,33 @@ export default class Mailboxes extends React.Component { ...@@ -441,26 +438,33 @@ export default class Mailboxes extends React.Component {
if (data.account) { if (data.account) {
const accounts = data.account; const accounts = data.account;
const totalAccounts = data.total; const totalAccounts = data.total;
const limit = data.account.length; let limit = data.account.length;
const hasPage = totalAccounts > Constants.QueryOptions.DEFAULT_LIMIT;
let activeAccounts = []; let activeAccounts = [];
let lockedAccounts = []; let lockedAccounts = [];
const tabs = {}; const tabs = {};
let partialAccounts = accounts;
if (hasPage) {
partialAccounts = accounts.slice(this.state.offset, (this.state.page * Constants.QueryOptions.DEFAULT_LIMIT));
limit = partialAccounts.length;
}
for (let i = 0; i < limit; i++) { for (let i = 0; i < limit; i++) {
const account = accounts[i].attrs; const account = partialAccounts[i].attrs;
switch (account.zimbraAccountStatus) { switch (account.zimbraAccountStatus) {
case 'active': case 'active':
activeAccounts.push(this.buildRow(accounts[i], 'label label-success m-r', 'Activa')); activeAccounts.push(this.buildRow(partialAccounts[i], 'label label-success m-r', 'Activa'));
break; break;
case 'closed': case 'closed':
activeAccounts.push(this.buildRow(accounts[i], 'label label-default m-r', 'Cerrada')); activeAccounts.push(this.buildRow(partialAccounts[i], 'label label-default m-r', 'Cerrada'));
break; break;
case 'locked': case 'locked':
activeAccounts.push(this.buildRow(accounts[i], 'label label-warning m-r', 'Inactiva')); activeAccounts.push(this.buildRow(partialAccounts[i], 'label label-warning m-r', 'Inactiva'));
break; break;
case 'lockedout': case 'lockedout':
lockedAccounts.push(this.buildRow(accounts[i], 'label label-locked m-r', 'Bloqueada')); lockedAccounts.push(this.buildRow(partialAccounts[i], 'label label-locked m-r', 'Bloqueada'));
activeAccounts.push(this.buildRow(accounts[i], 'label label-locked m-r', 'Bloqueada')); activeAccounts.push(this.buildRow(partialAccounts[i], 'label label-locked m-r', 'Bloqueada'));
break; break;
} }
} }
...@@ -513,24 +517,40 @@ export default class Mailboxes extends React.Component { ...@@ -513,24 +517,40 @@ export default class Mailboxes extends React.Component {
} }
]; ];
const totalPage = Math.ceil(totalAccounts / QueryOptions.DEFAULT_LIMIT); let activePagination = null;
let activePagination = { let lockedPagination = null;
total: totalPage if (hasPage) {
}; const totalPage = Math.ceil(totalAccounts / QueryOptions.DEFAULT_LIMIT);
if (activeAccounts.length > QueryOptions.DEFAULT_LIMIT) {
activeAccounts = activeAccounts.slice(this.state.offset, (this.state.page * QueryOptions.DEFAULT_LIMIT));
activePagination = { activePagination = {
total: totalPage total: totalPage
}; };
} }
let lockedPagination = null; const status = Object.keys(this.optionStatus).map((item, i) => {
if (lockedAccounts.length > QueryOptions.DEFAULT_LIMIT) { return (
lockedAccounts = lockedAccounts.slice(this.state.offset, (this.state.page * QueryOptions.DEFAULT_LIMIT)); <option
lockedPagination = { key={`status-${i}`}
total: totalPage value={`${item}`}
}; >
} {Utils.titleCase(this.optionStatus[item])}
</option>
);
});
const plans = Object.keys(this.optionPlans).map((item, i) => {
if (item.toLowerCase() === 'default') {
return false;
}
return (
<option
key={`plan-${i}`}
value={`${item}`}
>
{Utils.titleCase(this.optionPlans[item].label)}
</option>
);
});
const filter = ( const filter = (
<div> <div>
...@@ -538,12 +558,10 @@ export default class Mailboxes extends React.Component { ...@@ -538,12 +558,10 @@ export default class Mailboxes extends React.Component {
<select <select
className='form-control status' className='form-control status'
onChange={this.handleChangeFilter} onChange={this.handleChangeFilter}
value={this.selectedStatusFilter}
> >
<option value=''>Todas</option> <option value=''>Todas</option>
<option value='active'>Activa</option> {status}
<option value='locked'>Inactiva</option>
<option value='lockedout'>Bloqueada</option>
<option value='closed'>Cerradas</option>
</select> </select>
</div> </div>
...@@ -551,11 +569,10 @@ export default class Mailboxes extends React.Component { ...@@ -551,11 +569,10 @@ export default class Mailboxes extends React.Component {
<select <select
className='form-control plans' className='form-control plans'
onChange={this.handleChangeFilter} onChange={this.handleChangeFilter}
value={this.selectedPlanFilter}
> >
<option value=''>Todos los planes</option> <option value=''>Todos los planes</option>
<option value='basic'>Básico</option> {plans}
<option value='professional'>Profesional</option>
<option value='premium'>Premium</option>
</select> </select>
</div> </div>
</div> </div>
......
...@@ -107,7 +107,7 @@ export default class BlockGeneralInfoMailbox extends React.Component { ...@@ -107,7 +107,7 @@ export default class BlockGeneralInfoMailbox extends React.Component {
<div className='col-xs-6'> <div className='col-xs-6'>
{sizeEnaled && ( {sizeEnaled && (
<p> <p>
<span className='center-block'>Espacio Disponible</span> <span className='center-block'>Espacio Total</span>
<strong>{sizeEnaled}</strong> <strong>{sizeEnaled}</strong>
</p> </p>
)} )}
......
...@@ -12,13 +12,16 @@ ...@@ -12,13 +12,16 @@
"autoincrementOnFailRequestZimbra": 500, "autoincrementOnFailRequestZimbra": 500,
"plans": { "plans": {
"basic": { "basic": {
"statusCos": "btn-success" "statusCos": "btn-success",
"label": "Básica"
}, },
"premium": { "premium": {
"statusCos": "btn-primary2" "statusCos": "btn-primary2",
"label": "Premium"
}, },
"professional": { "professional": {
"statusCos": "btn-primary" "statusCos": "btn-primary",
"label": "Profesional"
}, },
"default": false "default": false
}, },
......
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