Commit 06606994 authored by Elias Nahum's avatar Elias Nahum

Domain edit with the ability to move between companies

parent b6f96f9d
......@@ -69,12 +69,16 @@ export default class CreateDomain extends React.Component {
handleSubmit(e) {
e.preventDefault();
GlobalActions.emitStartLoading();
const elementList = document.querySelectorAll('.has-error');
Array.from(elementList).forEach((el) => el.classList.remove('has-error'));
Utils.validateInputRequired(this.refs).
then(() => {
const plans = Object.keys(this.state.plans);
const zimbraDomainCOSMaxAccounts = [];
const name = this.refs.domainName.value.trim();
const businessCategory = this.refs.account.value.trim();
const businessCategory = this.refs.company.value.trim();
plans.forEach((p) => {
zimbraDomainCOSMaxAccounts.push(`${this.refs[`plan-${p}`].getAttribute('data-id')}:${this.refs[`plan-${p}`].value || 0}`);
......@@ -105,6 +109,7 @@ export default class CreateDomain extends React.Component {
GlobalActions.emitEndLoading();
error.refs = true;
error.type = error.typeError;
error.node.closest('.form-group').classList.add('has-error');
return this.setState({error});
});
}
......@@ -124,11 +129,7 @@ export default class CreateDomain extends React.Component {
}
let errorBar;
let formClass = 'simple_form form-horizontal mailbox-form';
if (error) {
if (error.refs) {
formClass += ' has-error';
}
errorBar = (
<MessageBar
message={error.message}
......@@ -187,7 +188,7 @@ export default class CreateDomain extends React.Component {
const form = (
<form
className={formClass}
className='simple_form form-horizontal mailbox-form'
onSubmit={this.handleSubmit}
>
<div className='form-group string required'>
......@@ -211,15 +212,15 @@ export default class CreateDomain extends React.Component {
<div className='form-group string'>
<label className='string required col-sm-3 control-label'>
<abbr title='requerido'>{'*'}</abbr>
{'Cuenta'}
{'Empresa'}
</label>
<div className='col-sm-8'>
<select
className='form-control select required'
data-required='true'
data-message='Debe especificar a que cuenta corresponde el dominio'
ref='account'
data-message='Debe especificar a que empresa corresponde el dominio'
ref='company'
defaultValue={this.state.companyId}
>
{companiesOptions}
......
import React from 'react';
import Textarea from 'react-textarea-autosize';
import {browserHistory} from 'react-router';
import MessageBar from '../message_bar.jsx';
import Panel from '../panel.jsx';
import Button from '../button.jsx';
import CompanyStore from '../../stores/company_store.jsx';
import DomainStore from '../../stores/domain_store.jsx';
import * as Client from '../../utils/client.jsx';
import * as Utils from '../../utils/utils.jsx';
import Constants from '../../utils/constants.jsx';
import * as GlobalActions from '../../action_creators/global_actions.jsx';
export default class EditDomain extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
this.getDomain = this.getDomain.bind(this);
this.getCompanies = this.getCompanies.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.state = {};
}
getDomain() {
const domainId = this.props.params.id;
const domain = DomainStore.getCurrent();
if (domain && domain.id === domainId) {
return this.getCompanies(domain);
}
return Client.getDomain(
domainId,
(data) => {
this.getCompanies(data);
},
(error) => {
GlobalActions.emitEndLoading();
this.setState({error});
}
);
}
getCompanies(domain) {
const companies = CompanyStore.getCompanies();
if (companies) {
this.setState({
domain,
companies
});
return GlobalActions.emitEndLoading();
}
this.state = {
notification: false,
notificationMsg: ''
};
return Client.getAllCompanies().
then((data) => {
this.setState({
domain,
companies: data
});
GlobalActions.emitEndLoading();
}).
catch((error) => {
error.type = Constants.MessageType.ERROR;
this.setState({error});
GlobalActions.emitEndLoading();
});
}
handleClick(e, path) {
handleSubmit(e) {
e.preventDefault();
GlobalActions.emitStartLoading();
browserHistory.push(path);
const elementList = document.querySelectorAll('.has-error');
Array.from(elementList).forEach((el) => el.classList.remove('has-error'));
Utils.validateInputRequired(this.refs).
then(() => {
const stateDomain = this.state.domain;
const id = stateDomain.id;
const prevCompanyId = stateDomain.attrs.businessCategory;
const businessCategory = this.refs.company.value.trim();
const description = this.refs.description.value.trim();
const zimbraNotes = this.refs.notes.value.trim();
const domain = {
id,
attrs: {
businessCategory,
description,
zimbraNotes
}
};
Client.modifyDomain(
domain,
(data) => {
CompanyStore.modifyDomain(prevCompanyId, data);
DomainStore.setCurrent(data);
browserHistory.push(`/domains/${data.id}`);
},
(error) => {
GlobalActions.emitEndLoading();
return this.setState({error});
}
);
}).
catch((error) => {
GlobalActions.emitEndLoading();
error.refs = true;
error.type = error.typeError;
if (error.node) {
error.node.closest('.form-group').classList.add('has-error');
}
return this.setState({error});
});
}
componentDidMount() {
this.getDomain();
}
render() {
let form = (
<form className='simple_form form-horizontal mailbox-form'>
<div className='form-group string required'>
<label className='string required col-sm-3 control-label'>
<abbr title='requerido'>{'*'}</abbr>
{'Nombre'}
</label>
<div className='col-sm-8'>
<input
type='text'
required='required'
className='form-control'
ref='domainName'
value='dominio.com'
disabled='disabled'
/>
</div>
</div>
const domain = this.state.domain;
const error = this.state.error;
if (domain || error) {
const companies = this.state.companies;
const companiesOptions = companies.map((c) => {
return (
<option
key={`company-${c.id}`}
value={c.id}
>
{c.name}
</option>
);
});
let messageBar;
if (error) {
messageBar = (
<MessageBar
message={error.message}
type={error.type}
autoclose={true}
/>
);
}
let lastRenovation;
// DESCOMENTAR ESTO Y CREAR LA FUNCIONALIDAD PARA MANEJAR LA ÚLTIMA FECHA DE RENOVACIÓN
// <div className='form-group string'>
// <label className='string required col-sm-3 control-label'>
// {'Última Renovación'}
// </label>
//
// <div className='col-sm-8'>
// <div className='input-group date datetimepicker'>
// <input
// type='text'
// className='form-control'
// ref='lastRenovation'
// />
// <span className='input-group-btn'>
// <button
// className='btn btn-default'
// type='button'
// >
// <span className='fa fa-calendar'></span>
// </button>
// </span>
// </div>
// </div>
// </div>
<div className='form-group string'>
<label className='string required col-sm-3 control-label'>
{'Última Renovación'}
</label>
const form = (
<form
className='simple_form form-horizontal mailbox-form'
onSubmit={this.handleSubmit}
>
<div className='form-group string required'>
<label className='string required col-sm-3 control-label'>
<abbr title='requerido'>{'*'}</abbr>
{'Nombre'}
</label>
<div className='col-sm-8'>
<div className='input-group date datetimepicker'>
<div className='col-sm-8'>
<input
type='text'
className='form-control'
ref='lastRenovation'
ref='domainName'
value={domain.name}
disabled='disabled'
/>
<span className='input-group-btn'>
<button
className='btn btn-default'
type='button'
>
<span className='fa fa-calendar'></span>
</button>
</span>
</div>
</div>
</div>
<div className='form-group string'>
<label className='string required col-sm-3 control-label'>
<abbr title='requerido'>{'*'}</abbr>
{'Cuenta'}
</label>
<div className='col-sm-8'>
<select
className='form-control select required'
required='required'
ref='account'
>
</select>
{lastRenovation}
<div className='form-group string'>
<label className='string required col-sm-3 control-label'>
<abbr title='requerido'>{'*'}</abbr>
{'Empresa'}
</label>
<div className='col-sm-8'>
<select
className='form-control select required'
data-required='true'
data-message='Debe especificar a que empresa corresponde el dominio'
ref='company'
defaultValue={domain.attrs.businessCategory}
>
{companiesOptions}
</select>
</div>
</div>
</div>
<div className='form-group string'>
<label className='string required col-sm-3 control-label'>
<abbr title='requerido'>{'*'}</abbr>
{'Equipo Chat'}
</label>
<div className='col-sm-8'>
<input
type='text'
className='form-control'
ref='chatTeam'
placeholder='Nombre (solo letras o números, no guiones bajos)'
/>
<div className='form-group string'>
<label className='string col-sm-3 control-label'>
{'Descripción'}
</label>
<div className='col-sm-8'>
<input
type='text'
className='form-control'
ref='description'
placeholder='Descripción del dominio'
defaultValue={domain.attrs.description}
/>
</div>
</div>
</div>
<div className='form-group string'>
<label className='string required col-sm-3 control-label'>
{'Renovación Anual'}
</label>
<div className='col-sm-8'>
<label className='radio-inline pretty-input'>
<div className='pretty-checkbox'>
<input
type='checkbox'
className='pretty'
ref='autoRenovation'
/>
<span></span>
</div>
<div className='form-group string'>
<label className='string col-sm-3 control-label'>
{'Notas'}
</label>
<div className='col-sm-8'>
<Textarea
className='form-control'
ref='notes'
defaultValue={domain.attrs.zimbraNotes}
placeholder='Notas para el dominio'
minRows={3}
maxRows={9}
/>
</div>
</div>
</div>
<div className='form-group'>
<div className='col-sm-8 col-sm-offset-3'>
<input
type='submit'
name='commit'
value='Guardar'
className='btn btn-info'
/>
<Button
btnAttrs={
{
className: 'btn btn-default',
onClick: (e) => {
this.handleClick(e, '/domains');
}
}
}
>
{'Cancelar'}
</Button>
<div className='form-group'>
<div className='col-sm-8 col-sm-offset-3'>
<input
type='submit'
name='commit'
value='Guardar'
className='btn btn-info'
/>
<a
href='#'
className='btn btn-default'
onClick={(e) => Utils.handleLink(e, `/domains/${domain.id}`)}
>
{'Cancelar'}
</a>
</div>
</div>
</div>
</form>
);
</form>
);
const actions = [
{
label: 'Cancelar',
props: {
className: 'btn btn-default btn-xs',
onClick: (e) => {
this.handleClick(e, '/domains');
const actions = [
{
label: 'Cancelar',
props: {
className: 'btn btn-default btn-xs',
onClick: (e) => Utils.handleLink(e, `/domains/${domain.id}`)
}
}
}
];
return (
<Panel
title={'Editar Dominio'}
btnsHeader={actions}
classHeader={'forum-box'}
>
{form}
</Panel>
);
];
return (
<Panel
title={'Editar Dominio'}
btnsHeader={actions}
classHeader={'forum-box'}
error={messageBar}
>
{form}
</Panel>
);
}
return <div/>;
}
}
EditDomain.propTypes = {
params: React.PropTypes.object.isRequired
};
......@@ -67,52 +67,74 @@ class CompanyStoreClass {
}
}
addDomainAdmins(companyId, domain) {
function findDomain(company) {
const domains = company.domains;
let index = -1;
if (domains) {
domains.forEach((d, i) => {
if (d.id === domain.id) {
index = i;
return false;
}
return true;
});
}
return index;
}
function replaceDomain(company, index) {
if (index >= 0) {
company.domains[index] = domain;
} else {
company.domains.push(domain);
modifyDomain(prevCompanyId, domain) {
if (this.companies) {
const domainCompanyId = domain.attrs.businessCategory;
const prevCompany = this.companies[prevCompanyId];
const newCompany = this.companies[domainCompanyId];
if (prevCompanyId !== domainCompanyId) {
if (newCompany) {
this.addDomain(newCompany.id, domain);
}
if (prevCompany) {
const index = findDomain(prevCompany, domain);
prevCompany.domains.splice(index, 1);
}
} else if (prevCompany) {
const index = findDomain(prevCompany, domain);
replaceDomain(prevCompany, domain, index);
}
}
}
addDomainAdmins(companyId, domain) {
const currentCompany = this.getCurrent();
const company = this.getCompanyById(companyId);
let index = -1;
if (currentCompany && currentCompany.id === companyId) {
index = findDomain(currentCompany);
index = findDomain(currentCompany, domain);
replaceDomain(currentCompany, index);
replaceDomain(currentCompany, domain, index);
if (company) {
this.companies[companyId] = currentCompany;
}
} else if (company) {
index = findDomain(company);
index = findDomain(company, domain);
replaceDomain(company, index);
replaceDomain(company, domain, index);
}
}
}
function findDomain(company, domain) {
const domains = company.domains;
let index = -1;
if (domains) {
domains.forEach((d, i) => {
if (d.id === domain.id) {
index = i;
return false;
}
return true;
});
}
return index;
}
function replaceDomain(company, domain, index) {
if (index >= 0) {
company.domains[index] = domain;
} else {
company.domains.push(domain);
}
}
const CompanyStore = new CompanyStoreClass();
export {CompanyStore as default};
......@@ -247,6 +247,25 @@ export function createDomain(domain, success, error) {
);
}
export function modifyDomain(domain, success, error) {
initZimbra().then(
(zimbra) => {
zimbra.modifyDomain(domain.id, domain.attrs, (err, data) => {
if (err) {
const e = handleError('modifyDomain', err);
return error(e);
}
return success(data);
});
},
(err) => {
const e = handleError('modifyDomain', err);
return error(e);
}
);
}
export function addDistributionList(name, attrs, success, error) {
initZimbra().then(
(zimbra) => {
......
......@@ -170,7 +170,7 @@ export function validateInputRequired(refs) {
}
for (const ref in refs) {
if (refs.hasOwnProperty(ref)) {
if (refs.hasOwnProperty(ref) && refs[ref].hasAttribute) {
if (refs[ref].hasAttribute('data-required') && refs[ref].getAttribute('data-required') === 'true' && refs[ref].value === '') {
let message;
if (refs[ref].getAttribute('data-message') && refs[ref].getAttribute('data-message').length > 0) {
......
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