Commit 335a0fad authored by Juorder Gonzalez's avatar Juorder Gonzalez

Merge pull request #169 from ZBoxApp/issues_resolved_manager

fix search to filter domain alias, now we get only needed attrs by ap…
parents a5e09ca2 18a43af7
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