Commit 18a43af7 authored by Juorder Antonio's avatar Juorder Antonio

fix search to filter domain alias, now we get only needed attrs by api in...

fix search to filter domain alias, now we get only needed attrs by api in mailbox, domain, search, fix issues from github issues
parent a5e09ca2
module.exports = {"main":{"js":"/749216bundle.js"}}
\ No newline at end of file
module.exports = {"main":{"js":"/029325bundle.js"}}
\ No newline at end of file
......@@ -2,6 +2,7 @@
// See LICENSE.txt for license information.
import React from 'react';
import sweetAlert from 'sweetalert';
import DomainStore from '../../stores/domain_store.jsx';
......@@ -12,7 +13,7 @@ import AddAdminModal from './add_admin_modal.jsx';
import * as Utils from '../../utils/utils.jsx';
import Constants from '../../utils/constants.jsx';
//import Constants from '../../utils/constants.jsx';
export default class DomainAdminList extends React.Component {
constructor(props) {
......@@ -23,12 +24,14 @@ export default class DomainAdminList extends React.Component {
this.onAdminsChange = this.onAdminsChange.bind(this);
this.state = this.getStateFromStores();
}
getStateFromStores() {
const admins = DomainStore.getAdmins(this.props.domain);
return {
admins
};
}
getAdmins() {
const domain = this.props.domain;
domain.getAdmins((err, data) => {
......@@ -37,27 +40,47 @@ export default class DomainAdminList extends React.Component {
this.setState({admins});
});
}
handleRemoveAdmin(e, admin) {
e.preventDefault();
if (confirm(`¿Seguro quieres eliminar a ${admin.name} como administrador del dominio?`)) { //eslint-disable-line no-alert
// previo a esto hay que remover el usuario como admin del dominio
const response = {
title: 'Se ha borrado con éxito',
type: 'success'
};
sweetAlert({
title: 'Borrar Administrador de Dominio',
text: `¿Seguro quieres eliminar a ${admin.name} como administrador del dominio?`,
type: 'info',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: 'Si, deseo borrarlo!',
closeOnConfirm: false,
showLoaderOnConfirm: true
},
(isDeleted) => {
if (isDeleted) {
this.props.domain.removeAdmin(
admin.name,
(error) => {
if (error) {
return this.setState({
error: {
message: error.extra.reason,
type: Constants.MessageType.ERROR
}
});
response.title = 'Ha ocurrido un error.';
response.type = 'error';
response.confirmButtonText = 'Intentar de nuevo';
response.confirmButtonColor = '#DD6B55';
return sweetAlert(response);
}
return DomainStore.removeAdmin(admin.id);
DomainStore.removeAdmin(admin.id);
return sweetAlert(response);
}
);
}
}
);
}
onAdminsChange() {
const admins = DomainStore.getAdmins(this.props.domain);
if (!admins) {
......@@ -66,6 +89,7 @@ export default class DomainAdminList extends React.Component {
return this.setState({admins});
}
componentDidMount() {
DomainStore.addAdminsChangeListener(this.onAdminsChange);
......
......@@ -46,26 +46,25 @@ export default class DomainDetails extends React.Component {
getDomain() {
const domain = DomainStore.getCurrent();
const states = {};
if (domain && domain.id === this.props.params.id) {
states.domain = domain;
GlobalActions.emitEndLoading();
this.setState({
domain
});
this.setState(states);
Client.getZone(domain.name, (zone) => {
DomainStore.setZoneDNS(zone);
this.setState({
domain
});
this.setState(states);
GlobalActions.emitEndLoading();
}, () => {
DomainStore.setZoneDNS(null);
this.setState({
domain
});
this.setState(states);
GlobalActions.emitEndLoading();
});
......@@ -74,19 +73,16 @@ export default class DomainDetails extends React.Component {
this.props.params.id,
(data) => {
DomainStore.setCurrent(data);
states.domain = data;
Client.getZone(data.name, (zone) => {
DomainStore.setZoneDNS(zone);
this.setState({
domain: data
});
this.setState(states);
GlobalActions.emitEndLoading();
}, () => {
this.setState({
domain: data
});
this.setState(states);
GlobalActions.emitEndLoading();
});
......@@ -101,6 +97,15 @@ export default class DomainDetails extends React.Component {
}
}
componentWillReceiveProps(nextProps) {
const condition = nextProps.params.id !== this.props.params.id;
if (condition) {
this.props.params.id = nextProps.params.id;
this.getDomain();
}
}
componentDidMount() {
EventStore.addMessageListener(this.showMessage);
$('#sidebar-domains').addClass('active');
......@@ -114,9 +119,19 @@ export default class DomainDetails extends React.Component {
render() {
const domain = this.state.domain;
let message = null;
let classForCol = 'col-xs-6';
let isVisible = 'show';
let hasLayout = 'layout-back';
let tabNames = [];
let tabs = {};
if (domain) {
let message;
if (domain.isAliasDomain) {
classForCol = 'col-xs-12';
isVisible = 'hide';
}
if (this.state.error) {
message = (
<MessageBar
......@@ -176,16 +191,27 @@ export default class DomainDetails extends React.Component {
/>
);
const panelTabs = (
<PanelTab
tabNames={['Administradores', 'AntiSpam', 'Listas De Distribución', 'Tareas Masivas', 'Zona DNS']}
tabs={{
tabNames = ['Administradores', 'AntiSpam', 'Listas De Distribución', 'Tareas Masivas', 'Zona DNS'];
tabs = {
administradores: tabAdmin,
antispam: tabAntiSpam,
listas_de_distribución: tabDistribution,
tareas_masivas: tabTareasMasivas,
zona_dns: zonaDNS
}}
};
if (domain.isAliasDomain) {
tabNames = ['Zona DNS'];
tabs = {
zona_dns: zonaDNS
};
hasLayout = '';
}
const panelTabs = (
<PanelTab
tabNames={tabNames}
tabs={tabs}
location={this.props.location}
/>
);
......@@ -200,27 +226,29 @@ export default class DomainDetails extends React.Component {
<div className='content animate-panel'>
{message}
<div className='row'>
<div className='layout-back clearfix'>
<div className='back-left backstage'>
<div className={`${hasLayout} clearfix`}>
<div className={`back-left backstage ${isVisible}`}>
<div className='backbg'></div>
</div>
<div className='back-right backstage'>
<div className={`back-right backstage ${isVisible}`}>
<div className='backbg'></div>
</div>
<div className='col-md-6 central-content'>
<div className={`${classForCol} central-content`}>
<DomainGeneralInfo
domain={domain}
location={this.props.location}
params={this.props.params}
/>
</div>
<div className='col-md-6 central-content'>
{!domain.isAliasDomain && (
<div className={`${classForCol} central-content`}>
<DomainMailboxPlans
domain={domain}
location={this.props.location}
params={this.props.params}
/>
</div>
)}
</div>
</div>
<div className='row'>
......
......@@ -2,6 +2,7 @@
// See LICENSE.txt for license information.
import React from 'react';
import sweetAlert from 'sweetalert';
import DomainStore from '../../stores/domain_store.jsx';
......@@ -47,19 +48,43 @@ export default class DomainDistributionList extends React.Component {
}
handleRemoveAdmin(e, list) {
e.preventDefault();
const response = {
title: 'Se ha borrado con éxito',
type: 'success'
};
if (confirm(`¿Seguro quieres eliminar la lista de distribución ${list.name} del dominio?`)) { //eslint-disable-line no-alert
sweetAlert({
title: 'Borrar Lista de Distribución',
text: `¿Seguro quieres eliminar la lista de distribución ${list.name} del dominio?`,
type: 'info',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: 'Si, deseo borrarlo!',
closeOnConfirm: false,
showLoaderOnConfirm: true
},
(isDeleted) => {
if (isDeleted) {
Client.removeDistributionList(
list.id,
() => {
DomainStore.removeDistributionList(list.id);
return sweetAlert(response);
},
(error) => {
this.setState({error});
response.title = 'Ha ocurrido un error.';
response.text = `${error.message}`;
response.type = 'error';
response.confirmButtonText = 'Intentar de nuevo';
response.confirmButtonColor = '#DD6B55';
return sweetAlert(response);
}
);
}
}
);
}
componentDidMount() {
DomainStore.addDistributionListsChangeListener(this.onListsChange);
......
......@@ -83,6 +83,12 @@ export default class DomainGeneralInfo extends React.Component {
render() {
const domain = this.props.domain;
let editDomainButton = null;
let masterID = null;
if (domain.attrs.zimbraDomainAliasTargetId) {
masterID = domain.attrs.zimbraDomainAliasTargetId;
}
const infoBody = (
<div className='row'>
<div className='col-md-12'>
......@@ -108,14 +114,31 @@ export default class DomainGeneralInfo extends React.Component {
<strong>{'MX Record: '}</strong>
{this.state.mx}
</li>
{domain.isAliasDomain && domain.masterDomainName && (
<li>
<strong>{'Próxima renovación: '}</strong>
{this.state.date}
<strong>{'Dominio Maestro: '}</strong>
<a
className='account-name'
onClick={(e) => Utils.handleLink(e, `/domains/${masterID}`, this.props.location)}
>
{domain.masterDomainName}
</a>
</li>
)}
<li>
<strong>{'Próxima renovación: '}</strong>
{this.state.date}
</li>
</ul>
<ul className='list-inline list-unstyled'>
{domain.isAliasDomain && (
<li>
<StatusLabel
classes='btn btn-md btn-warning'
children='Dominio Alias'
/>
</li>
)}
<li>
<StatusLabel
classes='btn btn-md btn-info'
......@@ -128,7 +151,17 @@ export default class DomainGeneralInfo extends React.Component {
</div>
);
if (this.isGlobalAdmin) {
if (domain.isAliasDomain && domain.attrs.zimbraDomainAliasTargetId) {
editDomainButton = [{
label: 'Ir a Dominio Maestro',
props: {
className: 'btn btn-info btn-xs',
onClick: (e) => Utils.handleLink(e, `/domains/${masterID}/`, this.props.location)
}
}];
}
if (this.isGlobalAdmin && !domain.isAliasDomain) {
editDomainButton = [{
label: 'Editar',
props: {
......
......@@ -100,12 +100,12 @@ export default class CreateMailBox extends React.Component {
MailboxStore.setMailbox(data);
//return Utils.handleLink(event, `/mailboxes/${data.id}`, this.props.location);
return Utils.handleLink(event, `/mailboxes/${data.id}`, this.props.location);
GlobalActions.emitMessage({
/*GlobalActions.emitMessage({
message: 'Se ha creado su cuenta con éxito.',
typeError: messageType.SUCCESS
});
});*/
},
(error) => {
GlobalActions.emitMessage({
......
......@@ -190,9 +190,9 @@ export default class Mailboxes extends React.Component {
getAccounts(domainName, maxResult) {
//const promises = [];
const attrs = {
maxResults: maxResult
maxResults: maxResult,
limit: 5000
};
const attrneeded = Utils.getAttrsBySectionFromConfig('mailboxes');
......
......@@ -61,6 +61,7 @@ export default class SearchView extends React.Component {
}
makeSearch(query) {
const attrsNeeded = Utils.getAttrsBySectionFromConfig('search');
let advanceQuery = false;
try {
advanceQuery = JSON.parse(query).advance_query;
......@@ -74,7 +75,7 @@ export default class SearchView extends React.Component {
maxResults: window.manager_config.maxResultOnRequestZimbra,
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',
attrs: 'objectClass'
attrs: attrsNeeded
};
this.runSearch(queryObject);
}
......@@ -101,17 +102,19 @@ export default class SearchView extends React.Component {
const id = item.id;
switch (type) {
case 'domain':
case 'domain': {
const label = item.isAliasDomain ? 'Dominio Alias' : 'Dominio';
tipo = (
<div>
<i className='fa fa-globe fa-lg'></i>
<span className='margin-left'>{'Dominio'}</span>
<span className='margin-left'>{label}</span>
</div>
);
url = `/domains/${id}`;
objectDomain[item.name] = id;
break;
}
case 'account':
tipo = (
<div>
......
......@@ -8,7 +8,7 @@
"url": "http://zimbra.zboxapp.dev:9081/powerdns_proxy",
"token": "otto"
},
"maxResultOnRequestZimbra": 20000,
"maxResultOnRequestZimbra": 3000,
"autoincrementOnFailRequestZimbra": 500,
"plans": {
"basic": {
......@@ -72,7 +72,18 @@
"domains": {
"attrs": {
"zimbraDomainStatus": true,
"description": true
"description": true,
"businessCategory": true,
"zimbraCreateTimestamp": true,
"zimbraDomainType": true,
"zimbraMailCatchAllForwardingAddress": true
}
},
"search": {
"attrs": {
"zimbraDomainType": true,
"zimbraMailCatchAllForwardingAddress": true,
"objectClass": true
}
}
},
......
// Load Awesome v1.1.0 (http://github.danielcardoso.net/load-awesome/)
//Copyright 2015 Daniel Cardoso <@DanielCardoso>
//Licensed under MIT
.la-ball-fall {
box-sizing: border-box;
color: $white;
display: block;
font-size: 0;
height: 18px;
position: relative;
width: 54px;
&.la-dark {
color: $la-dark-color;
}
> div {
animation: ball-fall 1s ease-in-out infinite;
background-color: currentColor;
border: 0 solid currentColor;
border-radius: 100%;
box-sizing: border-box;
display: inline-block;
float: none;
height: 10px;
margin: 4px;
opacity: 0;
position: relative;
width: 10px;
&:nth-child(1) {
animation-delay: -200ms;
}
&:nth-child(2) {
animation-delay: -100ms;
}
&:nth-child(3) {
animation-delay: 0ms;
}
}
&.la-sm {
height: 8px;
width: 26px;
> div {
height: 4px;
margin: 2px;
width: 4px;
}
}
&.la-2x {
height: 36px;
width: 108px;
> div {
height: 20px;
margin: 8px;
width: 20px;
}
}
&.la-3x {
height: 54px;
width: 162px;
> div {
height: 30px;
margin: 12px;
width: 30px;
}
}
}
// Animation
@keyframes ball-fall {
0% {
opacity: 0;
transform: translateY(-145%);
}
10% {
opacity: .5;
}
20% {
opacity: 1;
transform: translateY(0);
}
80% {
opacity: 1;
transform: translateY(0);
}
90% {
opacity: .5;
}
100% {
opacity: 0;
transform: translateY(145%);
}
}
......@@ -696,3 +696,5 @@ body {
transform: rotate(360deg);
}
}
@import 'loader_animation';
......@@ -121,3 +121,4 @@ $sweet-blue: #c9dae1;
$sweet-green: #a5dc86;
$keyframe-bg-color: #f8d486;
$keyframe-bg-color2: #f8bb86;
$la-dark-color: #333;
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