fix development environment, fix resp vacaciones, add nodemon for dev, y prop-types packages

parent 411915d1
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
dist dist
src/config src/config
node_modules node_modules
.history
*.zip
.vagrant
/path.json /path.json
./path.json ./path.json
.npminstall .npminstall
......
1.5:5dc6ad1e-bcee-42fd-9310-3736c040cf90
\ No newline at end of file
5dc6ad1e-bcee-42fd-9310-3736c040cf90
\ No newline at end of file
c4c8e8aa02ab4bcfa7eb51a3b350c71e
\ No newline at end of file
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAmOtAU9rkxwDGG8ug6vkfOwJ+Gm4+9T2vzf//4DY48Ud7Oux8
1q2JOCT/usGqOYxZ7zwok5bb3wQAnglRCyWZmpw4Kxzq5U8FCaHGZFddAs6Yiqqr
amipsQSzSmzZ5V0ASKXe6vk/WmGoL+RQuoCBwxvAZd9NhjPRROcI+vjnHZ+dLnwq
QDgG5cJsrzhhfRowGomcoYnk2U0rKxWWMmAWcOYiAiiBbUjW/0FZeL6TJq9TbhmV
bPcSGWxi63NUPPwZ8YHRHMB/OqaIbBGQTfb+rwopq+yHj2uqoqy+w+95H0vt7QCe
DvHcOD2iknsna66vBiU6yQzHCa7q1FAo5/F98QIDAQABAoIBAQCBvV6nhpkBqktq
u7o8gb6Yf0XkQNMTmRG2klNStE5dj0sjNA+6yCMaynFZzwQQrV6EViMLDTxgm3G2
o6rp7S3EenRBR9iXUxKwGFxNN74HKqdLRwAGWORX9ufy5iV8rwoVmP1nmK7CjQZ4
E5rWkT8G/V2gUPPiP8Z2UhpRbKoRe9HM0grgBC0wvXEyQ2l0CZMU5o5bJBi/ed62
qZu9xL9/CAyKdVIfR2CDUWXi+yHgS3+9kKloZNwwLxeCWaJEGtxUsWpe2oc7fD6c
UK/unpJcjqdO0SDX+78XLQYnOjt+flqpKlzvhQW+FUk89TfWssC+XBIXKbaSFEMP
QthLXBqdAoGBAMej2Awx6ahseRF9goDk7Fa9xFH2kj7V3w8bNDOQ5xfq83fz1yQf
sGDt6X8dajUPSBD5LnjiLIL2fovQGEfTV7eiCJekNQXMNvGCeLEFUnovjRP9FfL1
J/bMmVQzaito6UVIyrl0Ehw0OKzlu9MAW6Ka5cPdZhwAFTxDkJJjDXvjAoGBAMQW
1e9Qqz72w03x7XDF/B63Q+qKeEN+L39+XzjIWzkdmUrFvD7HrLqxWnZnwX+ZDVxD
IM8Rud3gAMc4hZLMIuk4jRFXMFYfay7W7SFPLZg2R31G5Q6mvSAPUCbQg/cOUbXh
XvATAhcxeHlo7WdS7LrzDhHssnN+tvtGp9LlWm8bAoGAChYGAT+4TVEFoNOVd0uZ
gRxfQcDSTKhjd5DpRz2n3zZ4jHPeR63uLEd4x3pF9l5KRslABs1ucENhy1B9GYvc
36MpCfg60Ysqr3LnBBJ/wzqJxxu/MyIdncNib7WVRJItTtnJnCr4C0K8JkgJADUB
bCqlNwsFcJ60c/H56NtmP/8CgYBFxjpp5bKJvRTR73wl3M1RwLSSCKOyoHwWSclo
UyLit/2L9cB+Nl7oL6OY7mKUHMn8QoayKASTRtoACcS975Wcl1rbCMNSYeupxyCp
8ZqvxuC5Wzi2de5mMgy7QwcyKg45QfCeTKU5y4iq6wNO+Nrzyvj+t9Ln9fb2grXE
/YeocQKBgQCAU7aq4U6Fm6nWL9n8pzkn+A2YHWnk9TfwMsnY3Q91Gu6/PSOvO0Qj
4YI4Tm5kPnmxqCl9NTu81cS9+x5Pc6jFqXOIM1hoLYNsyxUSd223eugO9jNpEs3W
5infFbB4MO5fGUAfXYav0BNpI1o9EugP9A9iX2PgBMwMtG7sI3k8Ig==
-----END RSA PRIVATE KEY-----
{"virtualbox":{"/opt/zimbra/zimlets-deployed/_dev":{"guestpath":"/opt/zimbra/zimlets-deployed/_dev","hostpath":"/Applications/MAMP/htdocs/manager-react/src","disabled":false,"__vagrantfile":true},"/vagrant":{"guestpath":"/vagrant","hostpath":"/Applications/MAMP/htdocs/manager-react","disabled":false,"__vagrantfile":true}}}
\ No newline at end of file
...@@ -23,7 +23,13 @@ build: | install test ...@@ -23,7 +23,13 @@ build: | install test
@npm run build @npm run build
run: | install start-server # comment out to avoid install every restart server
# run: | install start-server
# @echo Running ZBox Manager Webapp for development
# @npm run run &
run: | start-server
@echo Running ZBox Manager Webapp for development @echo Running ZBox Manager Webapp for development
@npm run run & @npm run run &
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
"node-sass": "^3.8.0", "node-sass": "^3.8.0",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"object-assign": "4.0.1", "object-assign": "4.0.1",
"prop-types": "^15.6.1",
"react": "15.0.1", "react": "15.0.1",
"react-bootstrap": "0.29.2", "react-bootstrap": "0.29.2",
"react-bootstrap-datetimepicker": "0.0.22", "react-bootstrap-datetimepicker": "0.0.22",
...@@ -31,10 +32,11 @@ ...@@ -31,10 +32,11 @@
"react-toastr": "^2.6.0", "react-toastr": "^2.6.0",
"sweetalert": "^1.1.3", "sweetalert": "^1.1.3",
"toastr": "^2.1.2", "toastr": "^2.1.2",
"zimbra-admin-api-js": "ZBoxApp/zimbra-admin-api-js#manager" "zimbra-admin-api-js": "git+https://github.com/ZBoxApp/zimbra-admin-api-js.git#manager"
}, },
"devDependencies": { "devDependencies": {
"assets-webpack-plugin": "^3.4.0", "assets-webpack-plugin": "^3.4.0",
"axios": "^0.18.0",
"babel-cli": "^6.18.0", "babel-cli": "^6.18.0",
"babel-eslint": "6.0.4", "babel-eslint": "6.0.4",
"babel-loader": "^6.2.7", "babel-loader": "^6.2.7",
...@@ -44,7 +46,7 @@ ...@@ -44,7 +46,7 @@
"babel-preset-react": "6.5.0", "babel-preset-react": "6.5.0",
"babel-preset-stage-0": "6.5.0", "babel-preset-stage-0": "6.5.0",
"babel-runtime": "^6.6.1", "babel-runtime": "^6.6.1",
"body-parser": "^1.15.0", "body-parser": "^1.18.3",
"cookie-parser": "^1.4.1", "cookie-parser": "^1.4.1",
"copy-webpack-plugin": "2.1.3", "copy-webpack-plugin": "2.1.3",
"cors": "^2.7.1", "cors": "^2.7.1",
...@@ -53,7 +55,8 @@ ...@@ -53,7 +55,8 @@
"eslint": "2.8.0", "eslint": "2.8.0",
"eslint-plugin-react": "5.0.1", "eslint-plugin-react": "5.0.1",
"exports-loader": "0.6.3", "exports-loader": "0.6.3",
"express": "^4.13.4", "express": "^4.16.3",
"express-http-proxy": "^1.2.0",
"extract-text-webpack-plugin": "1.0.1", "extract-text-webpack-plugin": "1.0.1",
"file-loader": "0.8.5", "file-loader": "0.8.5",
"html-loader": "0.4.3", "html-loader": "0.4.3",
...@@ -62,7 +65,10 @@ ...@@ -62,7 +65,10 @@
"imports-loader": "0.6.5", "imports-loader": "0.6.5",
"json-loader": "0.5.4", "json-loader": "0.5.4",
"morgan": "^1.7.0", "morgan": "^1.7.0",
"nodemon": "^1.17.5",
"npm-run-all": "^4.1.3",
"raw-loader": "0.5.1", "raw-loader": "0.5.1",
"request": "^2.87.0",
"sass-loader": "3.2.0", "sass-loader": "3.2.0",
"style-loader": "0.13.1", "style-loader": "0.13.1",
"url-loader": "0.5.7", "url-loader": "0.5.7",
...@@ -75,7 +81,8 @@ ...@@ -75,7 +81,8 @@
"run": "webpack --progress --watch", "run": "webpack --progress --watch",
"run-fullmap": "webpack --progress --watch", "run-fullmap": "webpack --progress --watch",
"companies-service": "babel-node companies-service.js", "companies-service": "babel-node companies-service.js",
"server": "babel-node server.js", "server": "nodemon server.js",
"sales-service": "babel-node sales-services.js" "sales-service": "babel-node sales-services.js",
"start-webapp": "NODE_ENV=development npm-run-all --parallel run server"
} }
} }
module.exports = {"main":{"js":"/209210bundle.js"}} module.exports = {"main":{"js":"/996870bundle.js"}}
\ No newline at end of file \ No newline at end of file
// Copyright (c) 2016 ZBox, Spa. All Rights Reserved. // Copyright (c) 2016 ZBox, Spa. All Rights Reserved.
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
const proxy = require('express-http-proxy');
const env = typeof process.env.NODE_ENV === 'undefined' ? 'development' : process.env.NODE_ENV;
const configPath = env === 'development' ? './src/config/config.development.json' : './src/config/config.json';
const config = require(configPath);
const express = require('express');
const server = express();
const bodyParser = require('body-parser');
const port = process.env.PORT || 8000;
const http = require('http'); const managerProxyURL = process.env.managerProxy || config.managerProxy; //eslint-disable-line no-process-env
const fs = require('fs'); const URlsToProxy = ['/zimbra_proxy', '/powerdns_proxy', '/folio'];
const path = require('path');
const httpProxy = require('http-proxy');
const config = require('./src/config/config.json');
const mimes = { server.use(bodyParser.json());
js: 'text/javascript', server.use(bodyParser.urlencoded({ extended: true }));
json: 'application/json', server.use(express.static(__dirname + '/dist'));
css: 'text/css',
png: 'image/png',
jpg: 'image/jpg',
svg: 'image/svg+xml',
eot: 'application/vnd.ms-fontobject',
woff2: 'application/font-woff2',
woff: 'application/font-woff',
ttf: 'application/x-font-truetype'
};
const proxy = httpProxy.createProxyServer({}); // server.post('/*', proxy(managerProxyURL));
const server = http.createServer((req, res) => { server.all('/*', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*'); const hasToBeProxied = URlsToProxy.find((endpoint) => req.url.toString().startsWith(endpoint));
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
const zimbraProxy = process.env.zimbra || config.zimbraProxy; //eslint-disable-line no-process-env
if (req.url.indexOf('/service') === 0) { if (hasToBeProxied) {
return proxy.web(req, res, {target: zimbraProxy, secure: false}); return proxy(managerProxyURL)(req, res);
} }
const mime = (/^\/[a-zA-Z0-9\/]*\.(js|json|css|jpg|png|gif|svg|ttf|eot|woff|woff2)$/).exec(req.url.toString()); res.sendFile(__dirname + '/dist/index.html');
if (mime) {
const ext = mime[1];
const filename = path.join(__dirname, 'dist', req.url.toString().substring(1));
return sendFileContent(res, filename, mimes[ext]);
}
return sendFileContent(res, 'dist/index.html', 'text/html');
}); });
server.listen(8000); server.listen(port, () => {
console.log("ZBox Manager 1.5 is running at port:", port);
server.on('listening', () => {
const addr = server.address();
const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
console.info('ZBox Manager 2.0 Test Server listening on ' + bind); //eslint-disable-line no-console
}); });
function sendFileContent(response, fileName, contentType) {
fs.readFile(fileName, (err, data) => {
if (err) {
response.writeHead(404);
response.write('Not Found!');
} else {
response.writeHead(200, {'Content-Type': contentType});
response.write(data);
}
response.end();
});
}
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import * as Utils from '../../utils/utils.jsx'; import * as Utils from '../../utils/utils.jsx';
...@@ -59,7 +60,7 @@ export default class NotFound404 extends React.Component { ...@@ -59,7 +60,7 @@ export default class NotFound404 extends React.Component {
} }
NotFound404.propTypes = { NotFound404.propTypes = {
location: React.PropTypes.object location: PropTypes.object
}; };
class ZBoxShip { class ZBoxShip {
......
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class Alert extends React.Component { export default class Alert extends React.Component {
constructor() { constructor() {
...@@ -49,10 +50,10 @@ export default class Alert extends React.Component { ...@@ -49,10 +50,10 @@ export default class Alert extends React.Component {
} }
Alert.propTypes = { Alert.propTypes = {
className: React.PropTypes.string, className: PropTypes.string,
iconClass: React.PropTypes.string, iconClass: PropTypes.string,
withClose: React.PropTypes.bool, withClose: PropTypes.bool,
children: React.PropTypes.any children: PropTypes.any
}; };
Alert.defaultProps = { Alert.defaultProps = {
......
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class Anchor extends React.Component { export default class Anchor extends React.Component {
render() { render() {
...@@ -15,12 +16,12 @@ export default class Anchor extends React.Component { ...@@ -15,12 +16,12 @@ export default class Anchor extends React.Component {
} }
Anchor.propTypes = { Anchor.propTypes = {
badgeName: React.PropTypes.string, badgeName: PropTypes.string,
isBadge: React.PropTypes.bool, isBadge: PropTypes.bool,
badgeClass: React.PropTypes.string, badgeClass: PropTypes.string,
url: React.PropTypes.string, url: PropTypes.string,
label: React.PropTypes.string, label: PropTypes.string,
attrs: React.PropTypes.object attrs: PropTypes.object
}; };
Anchor.defaultProps = { Anchor.defaultProps = {
......
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class Button extends React.Component { export default class Button extends React.Component {
render() { render() {
...@@ -9,9 +10,6 @@ export default class Button extends React.Component { ...@@ -9,9 +10,6 @@ export default class Button extends React.Component {
} }
Button.propTypes = { Button.propTypes = {
btnAttrs: React.PropTypes.object, btnAttrs: PropTypes.object,
children: React.PropTypes.any children: PropTypes.any
};
Button.defaultProps = {
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Promise from 'bluebird'; import Promise from 'bluebird';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
...@@ -365,5 +366,5 @@ export default class Companies extends React.Component { ...@@ -365,5 +366,5 @@ export default class Companies extends React.Component {
} }
Companies.propTypes = { Companies.propTypes = {
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import _ from 'lodash'; import _ from 'lodash';
import Promise from 'bluebird'; import Promise from 'bluebird';
...@@ -191,6 +192,6 @@ export default class CompanyAdmins extends React.Component { ...@@ -191,6 +192,6 @@ export default class CompanyAdmins extends React.Component {
} }
CompanyAdmins.propTypes = { CompanyAdmins.propTypes = {
company: React.PropTypes.object.isRequired, company: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Promise from 'bluebird'; import Promise from 'bluebird';
import CompanyInfo from './company_info.jsx'; import CompanyInfo from './company_info.jsx';
...@@ -217,6 +218,6 @@ export default class CompaniesDetails extends React.Component { ...@@ -217,6 +218,6 @@ export default class CompaniesDetails extends React.Component {
} }
CompaniesDetails.propTypes = { CompaniesDetails.propTypes = {
location: React.PropTypes.object.isRequired, location: PropTypes.object.isRequired,
params: React.PropTypes.object.isRequired params: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import UserStore from '../../stores/user_store.jsx'; import UserStore from '../../stores/user_store.jsx';
import ZimbraStore from '../../stores/zimbra_store.jsx'; import ZimbraStore from '../../stores/zimbra_store.jsx';
...@@ -150,6 +151,6 @@ export default class CompanyDomains extends React.Component { ...@@ -150,6 +151,6 @@ export default class CompanyDomains extends React.Component {
} }
CompanyDomains.propTypes = { CompanyDomains.propTypes = {
company: React.PropTypes.object.isRequired, company: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
...@@ -35,5 +36,5 @@ export default class CompanyInfo extends React.Component { ...@@ -35,5 +36,5 @@ export default class CompanyInfo extends React.Component {
} }
CompanyInfo.propTypes = { CompanyInfo.propTypes = {
company: React.PropTypes.object.isRequired company: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import moment from 'moment'; import moment from 'moment';
import _ from 'lodash'; import _ from 'lodash';
...@@ -27,35 +28,32 @@ export default class CompanyInvoices extends React.Component { ...@@ -27,35 +28,32 @@ export default class CompanyInvoices extends React.Component {
componentDidMount() { componentDidMount() {
this.getInvoices(); this.getInvoices();
} }
getInvoices() { getInvoices() {
if (global.window.manager_config.companiesEndPoints.invoices) { if (global.window.manager_config.companiesEndPoints.invoices) {
return Client.getInvoices( Client.getInvoices(this.props.company.id).then((invoices) => {
this.props.company.id, const hasDebt = _.find(invoices, {status: 2});
(invoices) => { if (hasDebt) {
const hasDebt = _.find(invoices, {status: 2}); GlobalActions.showAlert({
if (hasDebt) { type: 'error',
GlobalActions.showAlert({ title: 'Cuenta con deuda',
type: 'error', body: 'Tiene una o más facturas impagas. Por favor corrija esta situación para prevenir un bloqueo de los servicios',
title: 'Cuenta con deuda', options: {
body: 'Tiene una o más facturas impagas. Por favor corrija esta situación para prevenir un bloqueo de los servicios', timeOut: 10000,
options: { extendedTimeOut: 5000,
timeOut: 10000, closeButton: true
extendedTimeOut: 5000,
closeButton: true
}
});
}
this.setState({invoices});
},
(error) => {
this.setState({
error: {
message: error.message,
type: messageType.ERROR
} }
}); });
} }
); this.setState({invoices});
}).catch((error) => {
this.setState({
error: {
message: error.message,
type: messageType.ERROR
}
});
});
} }
return this.setState({ return this.setState({
...@@ -186,6 +184,6 @@ export default class CompanyInvoices extends React.Component { ...@@ -186,6 +184,6 @@ export default class CompanyInvoices extends React.Component {
} }
CompanyInvoices.propTypes = { CompanyInvoices.propTypes = {
company: React.PropTypes.object.isRequired, company: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
...@@ -172,5 +173,5 @@ export default class CompanyMailboxPlans extends React.Component { ...@@ -172,5 +173,5 @@ export default class CompanyMailboxPlans extends React.Component {
} }
CompanyMailboxPlans.propTypes = { CompanyMailboxPlans.propTypes = {
company: React.PropTypes.object.isRequired company: PropTypes.object.isRequired
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import EventStore from '../../stores/event_store.jsx'; import EventStore from '../../stores/event_store.jsx';
...@@ -509,6 +510,6 @@ export default class DistributionLists extends React.Component { ...@@ -509,6 +510,6 @@ export default class DistributionLists extends React.Component {
} }
DistributionLists.propTypes = { DistributionLists.propTypes = {
location: React.PropTypes.object, location: PropTypes.object,
params: React.PropTypes.object params: PropTypes.object
}; };
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Button from '../button.jsx'; import Button from '../button.jsx';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
...@@ -255,6 +256,6 @@ export default class EditDistributionList extends React.Component { ...@@ -255,6 +256,6 @@ export default class EditDistributionList extends React.Component {
} }
EditDistributionList.propTypes = { EditDistributionList.propTypes = {
location: React.PropTypes.object, location: PropTypes.object,
params: React.PropTypes.any params: PropTypes.any
}; };
...@@ -15,6 +15,7 @@ import StatusLabel from '../status_label.jsx'; ...@@ -15,6 +15,7 @@ import StatusLabel from '../status_label.jsx';
import {Modal} from 'react-bootstrap'; import {Modal} from 'react-bootstrap';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class AddAdminModal extends React.Component { export default class AddAdminModal extends React.Component {
constructor(props) { constructor(props) {
...@@ -272,7 +273,7 @@ export default class AddAdminModal extends React.Component { ...@@ -272,7 +273,7 @@ export default class AddAdminModal extends React.Component {
} }
AddAdminModal.propTypes = { AddAdminModal.propTypes = {
show: React.PropTypes.bool.isRequired, show: PropTypes.bool.isRequired,
onHide: React.PropTypes.func.isRequired, onHide: PropTypes.func.isRequired,
domain: React.PropTypes.object.isRequired domain: PropTypes.object.isRequired
}; };
...@@ -10,6 +10,7 @@ import * as Utils from '../../utils/utils.jsx'; ...@@ -10,6 +10,7 @@ import * as Utils from '../../utils/utils.jsx';
import {Modal} from 'react-bootstrap'; import {Modal} from 'react-bootstrap';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class AddDistributionListModal extends React.Component { export default class AddDistributionListModal extends React.Component {
constructor(props) { constructor(props) {
...@@ -165,7 +166,7 @@ export default class AddDistributionListModal extends React.Component { ...@@ -165,7 +166,7 @@ export default class AddDistributionListModal extends React.Component {
} }
AddDistributionListModal.propTypes = { AddDistributionListModal.propTypes = {
show: React.PropTypes.bool.isRequired, show: PropTypes.bool.isRequired,
onHide: React.PropTypes.func.isRequired, onHide: PropTypes.func.isRequired,
domain: React.PropTypes.object.isRequired domain: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Button from '../button.jsx'; import Button from '../button.jsx';
import * as Client from '../../utils/client.jsx'; import * as Client from '../../utils/client.jsx';
import * as Utils from '../../utils/utils.jsx'; import * as Utils from '../../utils/utils.jsx';
...@@ -510,5 +511,5 @@ export default class AntiSpam extends React.Component { ...@@ -510,5 +511,5 @@ export default class AntiSpam extends React.Component {
} }
AntiSpam.propTypes = { AntiSpam.propTypes = {
data: React.PropTypes.object.isRequired data: PropTypes.object.isRequired
}; };
//import * as Utils from '../../utils/utils.jsx'; //import * as Utils from '../../utils/utils.jsx';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
import CreateDomainForm from './multiform/create_domain_form.jsx'; import CreateDomainForm from './multiform/create_domain_form.jsx';
import MailCleanerForm from './multiform/mailcleaner_form.jsx'; import MailCleanerForm from './multiform/mailcleaner_form.jsx';
...@@ -174,6 +175,6 @@ export default class CreateDomain extends React.Component { ...@@ -174,6 +175,6 @@ export default class CreateDomain extends React.Component {
} }
CreateDomain.propTypes = { CreateDomain.propTypes = {
params: React.PropTypes.object.isRequired params: PropTypes.object.isRequired
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {FormGroup, Button, FormControl, InputGroup} from 'react-bootstrap'; import {FormGroup, Button, FormControl, InputGroup} from 'react-bootstrap';
import sweetAlert from 'sweetalert'; import sweetAlert from 'sweetalert';
import * as Utils from '../../utils/utils.jsx'; import * as Utils from '../../utils/utils.jsx';
...@@ -616,10 +617,10 @@ export default class DNSZoneForm extends React.Component { ...@@ -616,10 +617,10 @@ export default class DNSZoneForm extends React.Component {
} }
DNSZoneForm.propTypes = { DNSZoneForm.propTypes = {
domain: React.PropTypes.object, domain: PropTypes.object,
zone: React.PropTypes.oneOfType([ zone: PropTypes.oneOfType([
React.PropTypes.string, PropTypes.string,
React.PropTypes.object PropTypes.object
]), ]),
location: React.PropTypes.object location: PropTypes.object
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import sweetAlert from 'sweetalert'; import sweetAlert from 'sweetalert';
import DomainStore from '../../stores/domain_store.jsx'; import DomainStore from '../../stores/domain_store.jsx';
...@@ -263,6 +264,6 @@ export default class DomainAdminList extends React.Component { ...@@ -263,6 +264,6 @@ export default class DomainAdminList extends React.Component {
} }
DomainAdminList.propTypes = { DomainAdminList.propTypes = {
domain: React.PropTypes.object.isRequired, domain: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import Promise from 'bluebird'; import Promise from 'bluebird';
...@@ -422,6 +423,6 @@ export default class DomainDetails extends React.Component { ...@@ -422,6 +423,6 @@ export default class DomainDetails extends React.Component {
} }
DomainDetails.propTypes = { DomainDetails.propTypes = {
location: React.PropTypes.object.isRequired, location: PropTypes.object.isRequired,
params: React.PropTypes.object.isRequired params: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import sweetAlert from 'sweetalert'; import sweetAlert from 'sweetalert';
import DomainStore from '../../stores/domain_store.jsx'; import DomainStore from '../../stores/domain_store.jsx';
...@@ -309,6 +310,6 @@ export default class DomainDistributionList extends React.Component { ...@@ -309,6 +310,6 @@ export default class DomainDistributionList extends React.Component {
} }
DomainDistributionList.propTypes = { DomainDistributionList.propTypes = {
domain: React.PropTypes.object.isRequired, domain: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import moment from 'moment'; import moment from 'moment';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
...@@ -72,7 +73,13 @@ export default class DomainGeneralInfo extends React.Component { ...@@ -72,7 +73,13 @@ export default class DomainGeneralInfo extends React.Component {
} }
} }
renovationDate() { renovationDate() {
const timestamp = moment(this.props.domain.attrs.zimbraCreateTimestamp); const utc = Utils.getUTCTime(this.props.domain.attrs.zimbraCreateTimestamp);
if (!utc) {
return 'No disponible';
}
const timestamp = moment.utc(utc);
const now = moment(); const now = moment();
timestamp.year(now.year()); timestamp.year(now.year());
if (timestamp.isBefore(now)) { if (timestamp.isBefore(now)) {
...@@ -188,7 +195,7 @@ export default class DomainGeneralInfo extends React.Component { ...@@ -188,7 +195,7 @@ export default class DomainGeneralInfo extends React.Component {
} }
DomainGeneralInfo.propTypes = { DomainGeneralInfo.propTypes = {
domain: React.PropTypes.object.isRequired, domain: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired, location: PropTypes.object.isRequired,
params: React.PropTypes.object.isRequired params: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
...@@ -226,7 +227,7 @@ export default class DomainMailboxPlans extends React.Component { ...@@ -226,7 +227,7 @@ export default class DomainMailboxPlans extends React.Component {
} }
DomainMailboxPlans.propTypes = { DomainMailboxPlans.propTypes = {
domain: React.PropTypes.object.isRequired, domain: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired, location: PropTypes.object.isRequired,
params: React.PropTypes.object.isRequired params: PropTypes.object.isRequired
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Promise from 'bluebird'; import Promise from 'bluebird';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
...@@ -364,5 +365,5 @@ export default class Domains extends React.Component { ...@@ -364,5 +365,5 @@ export default class Domains extends React.Component {
} }
Domains.propTypes = { Domains.propTypes = {
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
//import Textarea from 'react-textarea-autosize'; //import Textarea from 'react-textarea-autosize';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
...@@ -423,5 +424,5 @@ export default class EditDomain extends React.Component { ...@@ -423,5 +424,5 @@ export default class EditDomain extends React.Component {
} }
EditDomain.propTypes = { EditDomain.propTypes = {
params: React.PropTypes.object.isRequired params: PropTypes.object.isRequired
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import CompanyStore from '../../../stores/company_store.jsx'; import CompanyStore from '../../../stores/company_store.jsx';
...@@ -342,6 +343,6 @@ export default class CreateDomainForm extends React.Component { ...@@ -342,6 +343,6 @@ export default class CreateDomainForm extends React.Component {
} }
CreateDomainForm.propTypes = { CreateDomainForm.propTypes = {
params: React.PropTypes.object.isRequired, params: PropTypes.object.isRequired,
state: React.PropTypes.object state: PropTypes.object
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import * as Utils from '../../../utils/utils.jsx'; import * as Utils from '../../../utils/utils.jsx';
import Constants from '../../../utils/constants.jsx'; import Constants from '../../../utils/constants.jsx';
...@@ -332,5 +333,5 @@ export default class DNSZoneForm extends React.Component { ...@@ -332,5 +333,5 @@ export default class DNSZoneForm extends React.Component {
} }
DNSZoneForm.propTypes = { DNSZoneForm.propTypes = {
state: React.PropTypes.object state: PropTypes.object
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import * as Utils from '../../../utils/utils.jsx'; import * as Utils from '../../../utils/utils.jsx';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
...@@ -95,5 +96,5 @@ export default class MailCleanerForm extends React.Component { ...@@ -95,5 +96,5 @@ export default class MailCleanerForm extends React.Component {
} }
MailCleanerForm.propTypes = { MailCleanerForm.propTypes = {
state: React.PropTypes.object state: PropTypes.object
}; };
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {Modal} from 'react-bootstrap'; import {Modal} from 'react-bootstrap';
import DateTimeField from 'react-bootstrap-datetimepicker'; import DateTimeField from 'react-bootstrap-datetimepicker';
import * as Client from '../../utils/client.jsx'; import * as Client from '../../utils/client.jsx';
...@@ -406,7 +406,7 @@ export default class MultipleTaskModal extends React.Component { ...@@ -406,7 +406,7 @@ export default class MultipleTaskModal extends React.Component {
} }
MultipleTaskModal.propTypes = { MultipleTaskModal.propTypes = {
show: React.PropTypes.bool.isRequired, show: PropTypes.bool.isRequired,
onHide: React.PropTypes.func.isRequired, onHide: PropTypes.func.isRequired,
data: React.PropTypes.object data: PropTypes.object
}; };
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {Link} from 'react-router'; import {Link} from 'react-router';
export default class ErrorPage extends React.Component { export default class ErrorPage extends React.Component {
...@@ -37,8 +37,6 @@ export default class ErrorPage extends React.Component { ...@@ -37,8 +37,6 @@ export default class ErrorPage extends React.Component {
} }
} }
ErrorPage.defaultProps = {
};
ErrorPage.propTypes = { ErrorPage.propTypes = {
location: React.PropTypes.object location: PropTypes.object
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {Modal} from 'react-bootstrap'; import {Modal} from 'react-bootstrap';
import * as GlobalActions from '../action_creators/global_actions.jsx'; import * as GlobalActions from '../action_creators/global_actions.jsx';
import SelectCols from './select-col.jsx'; import SelectCols from './select-col.jsx';
...@@ -537,6 +538,6 @@ export default class ImportMassiveModal extends React.Component { ...@@ -537,6 +538,6 @@ export default class ImportMassiveModal extends React.Component {
} }
ImportMassiveModal.propTypes = { ImportMassiveModal.propTypes = {
show: React.PropTypes.bool.isRequired, show: PropTypes.bool.isRequired,
onHide: React.PropTypes.func.isRequired onHide: PropTypes.func.isRequired
}; };
...@@ -8,6 +8,7 @@ import ToastAlert from './toast_alert.jsx'; ...@@ -8,6 +8,7 @@ import ToastAlert from './toast_alert.jsx';
import ProgressTask from './progress_task.jsx'; import ProgressTask from './progress_task.jsx';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class LoggedIn extends React.Component { export default class LoggedIn extends React.Component {
render() { render() {
...@@ -26,13 +27,10 @@ export default class LoggedIn extends React.Component { ...@@ -26,13 +27,10 @@ export default class LoggedIn extends React.Component {
} }
} }
LoggedIn.defaultProps = {
};
LoggedIn.propTypes = { LoggedIn.propTypes = {
children: React.PropTypes.oneOfType([ children: PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element), PropTypes.arrayOf(PropTypes.element),
React.PropTypes.element PropTypes.element
]), ]),
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import UserStore from '../../stores/user_store.jsx'; import UserStore from '../../stores/user_store.jsx';
...@@ -152,8 +153,6 @@ export default class Login extends React.Component { ...@@ -152,8 +153,6 @@ export default class Login extends React.Component {
} }
} }
Login.defaultProps = {
};
Login.propTypes = { Login.propTypes = {
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class LoginEmail extends React.Component { export default class LoginEmail extends React.Component {
constructor(props) { constructor(props) {
...@@ -74,10 +75,8 @@ export default class LoginEmail extends React.Component { ...@@ -74,10 +75,8 @@ export default class LoginEmail extends React.Component {
); );
} }
} }
LoginEmail.defaultProps = {
};
LoginEmail.propTypes = { LoginEmail.propTypes = {
submit: React.PropTypes.func.isRequired, submit: PropTypes.func.isRequired,
loginError: React.PropTypes.string loginError: PropTypes.string
}; };
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {Modal} from 'react-bootstrap'; import {Modal} from 'react-bootstrap';
import UserStore from '../../stores/user_store.jsx'; import UserStore from '../../stores/user_store.jsx';
import PasswordStrengthMeter from 'react-password-strength-meter'; import PasswordStrengthMeter from 'react-password-strength-meter';
...@@ -169,8 +170,8 @@ export default class ConfirmDeleteModal extends React.Component { ...@@ -169,8 +170,8 @@ export default class ConfirmDeleteModal extends React.Component {
} }
ConfirmDeleteModal.propTypes = { ConfirmDeleteModal.propTypes = {
show: React.PropTypes.bool.isRequired, show: PropTypes.bool.isRequired,
onHide: React.PropTypes.func.isRequired, onHide: PropTypes.func.isRequired,
data: React.PropTypes.object, data: PropTypes.object,
location: React.PropTypes.object location: PropTypes.object
}; };
...@@ -10,6 +10,7 @@ import * as GlobalActions from '../../action_creators/global_actions.jsx'; ...@@ -10,6 +10,7 @@ import * as GlobalActions from '../../action_creators/global_actions.jsx';
import MailboxStore from '../../stores/mailbox_store.jsx'; import MailboxStore from '../../stores/mailbox_store.jsx';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class ConfirmDeleteModal extends React.Component { export default class ConfirmDeleteModal extends React.Component {
constructor(props) { constructor(props) {
...@@ -161,8 +162,8 @@ export default class ConfirmDeleteModal extends React.Component { ...@@ -161,8 +162,8 @@ export default class ConfirmDeleteModal extends React.Component {
} }
ConfirmDeleteModal.propTypes = { ConfirmDeleteModal.propTypes = {
show: React.PropTypes.bool.isRequired, show: PropTypes.bool.isRequired,
onHide: React.PropTypes.func.isRequired, onHide: PropTypes.func.isRequired,
data: React.PropTypes.object, data: PropTypes.object,
location: React.PropTypes.object location: PropTypes.object
}; };
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import PasswordStrengthMeter from 'react-password-strength-meter'; import PasswordStrengthMeter from 'react-password-strength-meter';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
import Button from '../button.jsx'; import Button from '../button.jsx';
...@@ -766,6 +767,6 @@ export default class CreateMailBox extends React.Component { ...@@ -766,6 +767,6 @@ export default class CreateMailBox extends React.Component {
} }
CreateMailBox.propTypes = { CreateMailBox.propTypes = {
location: React.PropTypes.object, location: PropTypes.object,
params: React.PropTypes.object params: PropTypes.object
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
//import ToggleModalButton from '../toggle_modal_button.jsx'; //import ToggleModalButton from '../toggle_modal_button.jsx';
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import sweetAlert from 'sweetalert'; import sweetAlert from 'sweetalert';
import Button from '../button.jsx'; import Button from '../button.jsx';
import MessageBar from '../message_bar.jsx'; import MessageBar from '../message_bar.jsx';
...@@ -1124,6 +1125,6 @@ export default class EditMailBox extends React.Component { ...@@ -1124,6 +1125,6 @@ export default class EditMailBox extends React.Component {
} }
EditMailBox.propTypes = { EditMailBox.propTypes = {
location: React.PropTypes.object, location: PropTypes.object,
params: React.PropTypes.any params: PropTypes.any
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Button from '../button.jsx'; import Button from '../button.jsx';
import DateTimeField from 'react-bootstrap-datetimepicker'; import DateTimeField from 'react-bootstrap-datetimepicker';
import * as Client from '../../utils/client.jsx'; import * as Client from '../../utils/client.jsx';
import * as Utils from '../../utils/utils.jsx'; import * as Utils from '../../utils/utils.jsx';
import Constants from '../../utils/constants.jsx'; import Constants from '../../utils/constants.jsx';
import moment from 'moment';
import * as GlobalActions from '../../action_creators/global_actions.jsx'; import * as GlobalActions from '../../action_creators/global_actions.jsx';
...@@ -15,59 +17,66 @@ export default class FormVacacionesMailbox extends React.Component { ...@@ -15,59 +17,66 @@ export default class FormVacacionesMailbox extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = this.getOwnInitialState(props);
this.handleSaveAutoResp = this.handleSaveAutoResp.bind(this); this.handleSaveAutoResp = this.handleSaveAutoResp.bind(this);
this.dateStart = null;
this.dateEnd = null;
this.initialDate = Utils.setInitialDate();
this.domain_id = this.props.domainId || null; this.domain_id = this.props.domainId || null;
} }
handleChangeDate(x, from) { handleChange(timestamp, fieldName) {
const ref = this.refs[from]; this.setState({
const timestamp = Utils.getInitialDateFromTimestamp(x); [fieldName]: timestamp
});
ref.value = timestamp;
} }
handleSaveAutoResp() { handleSaveAutoResp() {
const data = this.props.data; const { id: accountId } = this.props.data;
const refs = this.refs; const {zimbraPrefOutOfOfficeFromDate, zimbraPrefOutOfOfficeUntilDate, zimbraPrefOutOfOfficeReply, zimbraPrefOutOfOfficeReplyEnabled} = this.state;
const attrs = {}; const isEnabled = zimbraPrefOutOfOfficeReplyEnabled;
const isEnabled = refs.zimbraPrefOutOfOfficeReplyEnabled.checked;
const start = refs.zimbraPrefOutOfOfficeFromDate.value;
const end = refs.zimbraPrefOutOfOfficeUntilDate.value;
let formatedStart = document.getElementById('zimbraPrefOutOfOfficeFromDate').value.split('/').reverse().join('') + '000000Z';
let formatedEnd = document.getElementById('zimbraPrefOutOfOfficeUntilDate').value.split('/').reverse().join('') + '000000Z';
if ((start > end) && isEnabled) {
GlobalActions.emitMessage({
error: 'La fecha en la que termina su respuesta automática, debe ser mayor que en la que comienza.',
typeError: messageType.ERROR
});
return false; const startTs = Utils.stringTSToNumber(zimbraPrefOutOfOfficeFromDate);
} else if ((start === end) && isEnabled) { const endTs = Utils.stringTSToNumber(zimbraPrefOutOfOfficeUntilDate);
GlobalActions.emitMessage({ const message = zimbraPrefOutOfOfficeReply && zimbraPrefOutOfOfficeReply.trim();
error: 'La fecha en la que comienza su respuesta automática no puede ser la misma fecha en la que termina.',
typeError: messageType.ERROR
});
return false; const attrs = {
} zimbraPrefOutOfOfficeReplyEnabled: isEnabled.toString().toUpperCase()
};
if (isEnabled) { if (isEnabled) {
attrs.zimbraPrefOutOfOfficeReplyEnabled = isEnabled.toString().toUpperCase(); if (startTs > endTs) {
attrs.zimbraPrefOutOfOfficeReply = refs.zimbraPrefOutOfOfficeReply.value; return GlobalActions.emitMessage({
attrs.zimbraPrefOutOfOfficeUntilDate = formatedEnd; error: 'La fecha en la que termina su respuesta automática, debe ser mayor que en la que comienza.',
attrs.zimbraPrefOutOfOfficeFromDate = formatedStart; typeError: messageType.ERROR
} else { });
attrs.zimbraPrefOutOfOfficeReplyEnabled = isEnabled.toString().toUpperCase(); }
if (startTs === endTs) {
return GlobalActions.emitMessage({
error: 'La fecha en la que comienza su respuesta automática no puede ser la misma fecha con la que termina.',
typeError: messageType.ERROR
});
}
if (!message || message.length === 0) {
return GlobalActions.emitMessage({
error: 'Debe ingresar su mensaje de respuesta automática.',
typeError: messageType.ERROR
});
}
// add message to payload to be sent to zimbra server
attrs.zimbraPrefOutOfOfficeReply = message;
// get uct date string from timestamp
const uctDateStart = Utils.timestampToUTCDate(zimbraPrefOutOfOfficeFromDate);
const uctDateEnd = Utils.timestampToUTCDate(zimbraPrefOutOfOfficeUntilDate);
attrs.zimbraPrefOutOfOfficeFromDate = uctDateStart;
attrs.zimbraPrefOutOfOfficeUntilDate = uctDateEnd;
} }
Client.modifyAccount(data.id, attrs, (mailbox) => { Client.modifyAccount(accountId, attrs, (mailbox) => {
MailboxStore.updateMailbox(data.id, mailbox, this.domain_id); MailboxStore.updateMailbox(accountId, mailbox, this.domain_id);
GlobalActions.emitMessage({ GlobalActions.emitMessage({
error: 'Se ha modificado su respuesta de vacaciones con éxito.', error: 'Se ha modificado su respuesta de vacaciones con éxito.',
typeError: messageType.SUCCESS typeError: messageType.SUCCESS
...@@ -78,47 +87,28 @@ export default class FormVacacionesMailbox extends React.Component { ...@@ -78,47 +87,28 @@ export default class FormVacacionesMailbox extends React.Component {
typeError: messageType.ERROR typeError: messageType.ERROR
}); });
}); });
return null;
} }
componentDidMount() { getOwnInitialState(props) {
const data = this.props.data.attrs; const { data } = props;
const { attrs } = data;
if (data.hasOwnProperty('zimbraPrefOutOfOfficeReplyEnabled')) {
this.refs.zimbraPrefOutOfOfficeReplyEnabled.checked = data.zimbraPrefOutOfOfficeReplyEnabled.toString().toLowerCase() === 'true';
}
if (data.hasOwnProperty('zimbraPrefOutOfOfficeReply')) {
this.refs.zimbraPrefOutOfOfficeReply.value = data.zimbraPrefOutOfOfficeReply;
}
if (this.dateStart) { const zimbraPrefOutOfOfficeFromDate = Utils.getTSFromUTC(Utils.getUTCTime(attrs.zimbraPrefOutOfOfficeFromDate));
this.refs.zimbraPrefOutOfOfficeFromDate.value = Utils.forceTimestampFromHumanDate(this.dateStart); const zimbraPrefOutOfOfficeUntilDate = Utils.getTSFromUTC(Utils.getUTCTime(attrs.zimbraPrefOutOfOfficeUntilDate));
}
if (this.dateEnd) { const nextState = {
this.refs.zimbraPrefOutOfOfficeUntilDate.value = Utils.forceTimestampFromHumanDate(this.dateEnd); zimbraPrefOutOfOfficeReplyEnabled: Utils.parseBooleanValue(attrs.zimbraPrefOutOfOfficeReplyEnabled),
} zimbraPrefOutOfOfficeReply: attrs.zimbraPrefOutOfOfficeReply,
} zimbraPrefOutOfOfficeFromDate,
zimbraPrefOutOfOfficeUntilDate
componentWillMount() { };
const data = this.props.data.attrs;
if (data.hasOwnProperty('zimbraPrefOutOfOfficeFromDate')) { return nextState;
this.dateStart = Utils.dateFormatted(data.zimbraPrefOutOfOfficeFromDate, true, '/');
} else {
this.dateStart = this.initialDate.formatted;
}
if (data.hasOwnProperty('zimbraPrefOutOfOfficeUntilDate')) {
this.dateEnd = Utils.dateFormatted(data.zimbraPrefOutOfOfficeUntilDate, true, '/');
} else {
this.dateEnd = this.initialDate.formatted;
}
} }
render() { render() {
const {zimbraPrefOutOfOfficeFromDate, zimbraPrefOutOfOfficeReply, zimbraPrefOutOfOfficeUntilDate, zimbraPrefOutOfOfficeReplyEnabled} = this.state;
return ( return (
<form <form
className='simple_form form-horizontal mailbox-form' className='simple_form form-horizontal mailbox-form'
...@@ -136,9 +126,11 @@ export default class FormVacacionesMailbox extends React.Component { ...@@ -136,9 +126,11 @@ export default class FormVacacionesMailbox extends React.Component {
<label className='radio-inline pretty-input'> <label className='radio-inline pretty-input'>
<div className='pretty-checkbox'> <div className='pretty-checkbox'>
<input <input
checked={zimbraPrefOutOfOfficeReplyEnabled}
onChange={({ target: { checked, name } }) => this.handleChange(checked, name)}
type='checkbox' type='checkbox'
className='pretty' className='pretty'
ref='zimbraPrefOutOfOfficeReplyEnabled' name={'zimbraPrefOutOfOfficeReplyEnabled'}
/> />
<span></span> <span></span>
</div> </div>
...@@ -156,19 +148,17 @@ export default class FormVacacionesMailbox extends React.Component { ...@@ -156,19 +148,17 @@ export default class FormVacacionesMailbox extends React.Component {
inputFormat='DD/MM/YYYY' inputFormat='DD/MM/YYYY'
inputProps={ inputProps={
{ {
id: 'zimbraPrefOutOfOfficeFromDate',
readOnly: 'readOnly' readOnly: 'readOnly'
} }
} }
onChange={(x) => { onChange={(timestamp) => {
this.handleChangeDate(x, 'zimbraPrefOutOfOfficeFromDate'); this.handleChange(timestamp, 'zimbraPrefOutOfOfficeFromDate');
}} }}
defaultText={this.dateStart} minDate={moment()}
dateTime={zimbraPrefOutOfOfficeFromDate}
value={zimbraPrefOutOfOfficeFromDate}
mode={'date'} mode={'date'}
/> showToday={true}
<input
type='hidden'
ref='zimbraPrefOutOfOfficeFromDate'
/> />
</div> </div>
</div> </div>
...@@ -183,21 +173,17 @@ export default class FormVacacionesMailbox extends React.Component { ...@@ -183,21 +173,17 @@ export default class FormVacacionesMailbox extends React.Component {
inputFormat='DD/MM/YYYY' inputFormat='DD/MM/YYYY'
inputProps={ inputProps={
{ {
id: 'zimbraPrefOutOfOfficeUntilDate',
readOnly: 'readOnly' readOnly: 'readOnly'
} }
} }
onChange={(x) => { onChange={(timestamp) => {
this.handleChangeDate(x, 'zimbraPrefOutOfOfficeUntilDate'); this.handleChange(timestamp, 'zimbraPrefOutOfOfficeUntilDate');
}} }}
defaultText={this.dateEnd} minDate={moment()}
dateTime={zimbraPrefOutOfOfficeUntilDate}
value={zimbraPrefOutOfOfficeUntilDate}
mode={'date'} mode={'date'}
/> />
<input
type='hidden'
ref='zimbraPrefOutOfOfficeUntilDate'
/>
</div> </div>
</div> </div>
...@@ -208,11 +194,12 @@ export default class FormVacacionesMailbox extends React.Component { ...@@ -208,11 +194,12 @@ export default class FormVacacionesMailbox extends React.Component {
<div className='col-sm-8'> <div className='col-sm-8'>
<textarea <textarea
name='response'
id='responseBox' id='responseBox'
className='form-control' className='form-control'
rows='4' rows='4'
ref='zimbraPrefOutOfOfficeReply' value={zimbraPrefOutOfOfficeReply}
name={'zimbraPrefOutOfOfficeReply'}
onChange={({ target: { name, value } }) => this.handleChange(value, name)}
> >
</textarea> </textarea>
</div> </div>
...@@ -240,9 +227,9 @@ export default class FormVacacionesMailbox extends React.Component { ...@@ -240,9 +227,9 @@ export default class FormVacacionesMailbox extends React.Component {
} }
FormVacacionesMailbox.propTypes = { FormVacacionesMailbox.propTypes = {
data: React.PropTypes.oneOfType([ data: PropTypes.oneOfType([
React.PropTypes.object, PropTypes.object,
React.PropTypes.string PropTypes.string
]), ]),
domainId: React.PropTypes.string domainId: PropTypes.string
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Button from '../button.jsx'; import Button from '../button.jsx';
import StatusLabel from '../status_label.jsx'; import StatusLabel from '../status_label.jsx';
import * as Client from '../../utils/client.jsx'; import * as Client from '../../utils/client.jsx';
...@@ -166,7 +167,7 @@ export default class BlockGeneralInfoMailbox extends React.Component { ...@@ -166,7 +167,7 @@ export default class BlockGeneralInfoMailbox extends React.Component {
} }
BlockGeneralInfoMailbox.propTypes = { BlockGeneralInfoMailbox.propTypes = {
data: React.PropTypes.object.isRequired, data: PropTypes.object.isRequired,
webmail: React.PropTypes.string, webmail: PropTypes.string,
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Promise from 'bluebird'; import Promise from 'bluebird';
import EventStore from '../../stores/event_store.jsx'; import EventStore from '../../stores/event_store.jsx';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
...@@ -191,19 +192,23 @@ export default class Mailboxes extends React.Component { ...@@ -191,19 +192,23 @@ export default class Mailboxes extends React.Component {
); );
} }
getAccounts(domainName, maxResult) { countAllLockoutAccounts(domainName) {
//const promises = []; return new Promise((resolve, reject) => {
Client.countAllLockoutAccounts(domainName, (response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
getAccountsFromAPI(domainName, maxResult) {
const attrneeded = Utils.getAttrsBySectionFromConfig('mailboxes'); const attrneeded = Utils.getAttrsBySectionFromConfig('mailboxes');
const attrs = { const attrs = {
maxResults: maxResult maxResults: maxResult
}; };
if (!this.state.loading) {
this.setState({
loading: true
});
}
if (attrneeded) { if (attrneeded) {
attrs.attrs = attrneeded; attrs.attrs = attrneeded;
} }
...@@ -213,57 +218,32 @@ export default class Mailboxes extends React.Component { ...@@ -213,57 +218,32 @@ export default class Mailboxes extends React.Component {
this.domainName = domainName; this.domainName = domainName;
} }
new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// if domain name exists, just search all mailbox from this domain Client.getAllAccounts(attrs, resolve, reject);
if (domainName) { });
const hasMailboxForDomain = this.isStoreEnabled ? MailboxStore.getMailboxByDomainId(this.domainId) : null; }
// if mailbox by domain exists return it
if (hasMailboxForDomain) {
return resolve(hasMailboxForDomain);
}
// get all mailboxes from domain getAccounts(domainName, maxResult) {
return Client.getAllAccounts(attrs, (success) => { if (!this.state.loading) {
if (success.total) { this.setState({ loading: true });
const data = Utils.extractLockOuts(success); }
if (this.isStoreEnabled) {
MailboxStore.setMailboxesByDomain(this.domainId, data);
} else {
this.setState({
accounts: data
});
}
}
return resolve(success); const countLockoutAccounts = this.countAllLockoutAccounts(domainName);
}, (error) => { const allAccounts = this.getAccountsFromAPI(domainName, maxResult);
return reject(error);
});
}
// if all mailbox exists just return it Promise.all([countLockoutAccounts, allAccounts]).then((results) => {
const hasMailboxes = this.isStoreEnabled ? MailboxStore.hasMailboxes() : null; const lockout = results[0];
const accounts = results[1];
if (hasMailboxes) { if (lockout.total > 0) {
return resolve(MailboxStore.getMailboxes()); GlobalActions.emitMessage({
error: `${lockout.total} casillas bloqueadas.`,
typeError: messageType.LOCKED
});
} }
// if all mailboxes doesn't exist just search them. if (accounts.total > 0) {
return Client.getAllAccounts(attrs, (success) => { this.mailboxes = accounts;
const data = Utils.extractLockOuts(success);
if (this.isStoreEnabled) {
MailboxStore.setMailboxes(data);
}
return resolve(data);
}, (error) => {
return reject(error);
});
}).then((data) => {
if (data.account) {
this.mailboxes = data;
this.isRefreshing = false; this.isRefreshing = false;
...@@ -281,7 +261,7 @@ export default class Mailboxes extends React.Component { ...@@ -281,7 +261,7 @@ export default class Mailboxes extends React.Component {
return this.setState({ return this.setState({
data: tables, data: tables,
loading: false, loading: false,
ac: data.account ac: accounts.account
}); });
} }
...@@ -290,33 +270,19 @@ export default class Mailboxes extends React.Component { ...@@ -290,33 +270,19 @@ export default class Mailboxes extends React.Component {
domain: domainName, domain: domainName,
loading: false loading: false
}); });
}).catch((error) => { }).catch(console.error.bind('error'));
if (error.code === codes.TOO_MANY_SEARCH_RESULTS) {
this.isRefreshing = true;
const newMaxResult = (parseInt(maxResult, 10) + window.manager_config.autoincrementOnFailRequestZimbra);
window.manager_config.maxResultOnRequestZimbra = newMaxResult;
setTimeout(() => {
this.getAccounts(domainName, newMaxResult);
}, 250);
}
}).finally(() => {
if (!this.isRefreshing) {
return GlobalActions.emitEndLoading();
}
return GlobalActions.emitEndLoading();
});
} }
getAllMailboxes(domainId) { getAllMailboxes(domainId) {
const MAX_RESULTS = 0; //window.manager_config.maxResultOnRequestZimbra;
if (domainId) { if (domainId) {
return this.domainInfo(domainId).then((data) => { return this.domainInfo(domainId).then((data) => {
const domain = this.isStoreEnabled ? DomainStore.getCurrent() : data; const domain = this.isStoreEnabled ? DomainStore.getCurrent() : data;
this.getAccounts(domain.name, window.manager_config.maxResultOnRequestZimbra); this.getAccounts(domain.name, MAX_RESULTS);
}); });
} }
return this.getAccounts(null, window.manager_config.maxResultOnRequestZimbra); return this.getAccounts(null, MAX_RESULTS);
} }
refreshAllAccounts() { refreshAllAccounts() {
...@@ -767,6 +733,6 @@ export default class Mailboxes extends React.Component { ...@@ -767,6 +733,6 @@ export default class Mailboxes extends React.Component {
} }
Mailboxes.propTypes = { Mailboxes.propTypes = {
location: React.PropTypes.object.isRequired, location: PropTypes.object.isRequired,
params: React.PropTypes.object.isRequired params: PropTypes.object.isRequired
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import EventStore from '../../stores/event_store.jsx'; import EventStore from '../../stores/event_store.jsx';
...@@ -432,6 +433,6 @@ export default class MailboxDetails extends React.Component { ...@@ -432,6 +433,6 @@ export default class MailboxDetails extends React.Component {
} }
MailboxDetails.propTypes = { MailboxDetails.propTypes = {
location: React.PropTypes.object, location: PropTypes.object,
params: React.PropTypes.object params: PropTypes.object
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import * as Client from '../../utils/client.jsx'; import * as Client from '../../utils/client.jsx';
import EventStore from '../../stores/event_store.jsx'; import EventStore from '../../stores/event_store.jsx';
...@@ -159,5 +160,5 @@ export default class ResendForm extends React.Component { ...@@ -159,5 +160,5 @@ export default class ResendForm extends React.Component {
} }
ResendForm.propTypes = { ResendForm.propTypes = {
mailbox: React.PropTypes.object mailbox: PropTypes.object
}; };
//import ZimbraStore from '../../stores/zimbra_store.jsx'; //import ZimbraStore from '../../stores/zimbra_store.jsx';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import * as Utils from '../../utils/utils.jsx'; import * as Utils from '../../utils/utils.jsx';
import bytesConvertor from 'bytes'; import bytesConvertor from 'bytes';
import Constants from '../../utils/constants.jsx'; import Constants from '../../utils/constants.jsx';
...@@ -118,5 +119,5 @@ export default class BlockGeneralInfoMailbox extends React.Component { ...@@ -118,5 +119,5 @@ export default class BlockGeneralInfoMailbox extends React.Component {
} }
BlockGeneralInfoMailbox.propTypes = { BlockGeneralInfoMailbox.propTypes = {
data: React.PropTypes.object.isRequired data: PropTypes.object.isRequired
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {Link} from 'react-router'; import {Link} from 'react-router';
import Constants from '../utils/constants.jsx'; import Constants from '../utils/constants.jsx';
...@@ -129,12 +130,12 @@ MessageBar.defaultProps = { ...@@ -129,12 +130,12 @@ MessageBar.defaultProps = {
}; };
MessageBar.propTypes = { MessageBar.propTypes = {
message: React.PropTypes.string.isRequired, message: PropTypes.string.isRequired,
type: React.PropTypes.oneOf(['SUCCESS', 'ERROR', 'WARNING', 'INFO', 'LOCKED']), type: PropTypes.oneOf(['SUCCESS', 'ERROR', 'WARNING', 'INFO', 'LOCKED']),
position: React.PropTypes.oneOf(['absolute', 'fixed', 'relative', 'static', 'inherit']), position: PropTypes.oneOf(['absolute', 'fixed', 'relative', 'static', 'inherit']),
canClose: React.PropTypes.bool, canClose: PropTypes.bool,
autoclose: React.PropTypes.bool, autoclose: PropTypes.bool,
autocloseInSecs: React.PropTypes.number, autocloseInSecs: PropTypes.number,
link: React.PropTypes.string, link: PropTypes.string,
linkText: React.PropTypes.string linkText: PropTypes.string
}; };
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import $ from 'jquery'; import $ from 'jquery';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class NotLoggedIn extends React.Component { export default class NotLoggedIn extends React.Component {
componentDidMount() { componentDidMount() {
...@@ -19,10 +19,7 @@ export default class NotLoggedIn extends React.Component { ...@@ -19,10 +19,7 @@ export default class NotLoggedIn extends React.Component {
} }
} }
NotLoggedIn.defaultProps = {
};
NotLoggedIn.propTypes = { NotLoggedIn.propTypes = {
children: React.PropTypes.object, children: PropTypes.object,
location: React.PropTypes.object location: PropTypes.object
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class PageInfo extends React.Component { export default class PageInfo extends React.Component {
render() { render() {
...@@ -18,8 +19,8 @@ export default class PageInfo extends React.Component { ...@@ -18,8 +19,8 @@ export default class PageInfo extends React.Component {
} }
PageInfo.propTypes = { PageInfo.propTypes = {
titlePage: React.PropTypes.any.isRequired, titlePage: PropTypes.any.isRequired,
descriptionPage: React.PropTypes.any descriptionPage: PropTypes.any
}; };
PageInfo.defaultProps = { PageInfo.defaultProps = {
......
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
export default class Pagination extends React.Component { export default class Pagination extends React.Component {
...@@ -199,12 +200,12 @@ export default class Pagination extends React.Component { ...@@ -199,12 +200,12 @@ export default class Pagination extends React.Component {
} }
Pagination.propTypes = { Pagination.propTypes = {
url: React.PropTypes.string.isRequired, url: PropTypes.string.isRequired,
currentPage: React.PropTypes.number.isRequired, currentPage: PropTypes.number.isRequired,
totalPages: React.PropTypes.number.isRequired, totalPages: PropTypes.number.isRequired,
range: React.PropTypes.number, range: PropTypes.number,
total: React.PropTypes.number, total: PropTypes.number,
name: React.PropTypes.string name: PropTypes.string
}; };
Pagination.defaultProps = { Pagination.defaultProps = {
......
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Button from './button.jsx'; import Button from './button.jsx';
export default class Panel extends React.Component { export default class Panel extends React.Component {
...@@ -47,14 +48,14 @@ export default class Panel extends React.Component { ...@@ -47,14 +48,14 @@ export default class Panel extends React.Component {
} }
Panel.propTypes = { Panel.propTypes = {
hasHeader: React.PropTypes.bool, hasHeader: PropTypes.bool,
btnsHeader: React.PropTypes.array, btnsHeader: PropTypes.array,
title: React.PropTypes.string, title: PropTypes.string,
classHeader: React.PropTypes.string, classHeader: PropTypes.string,
error: React.PropTypes.element, error: PropTypes.element,
children: React.PropTypes.any, children: PropTypes.any,
filter: React.PropTypes.element, filter: PropTypes.element,
classCss: React.PropTypes.array classCss: PropTypes.array
}; };
Panel.defaultProps = { Panel.defaultProps = {
......
//import Datalist from 'react-datalist'; //import Datalist from 'react-datalist';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Button from './button.jsx'; import Button from './button.jsx';
import PaginateArray from '../stores/paginate_array_store.jsx'; import PaginateArray from '../stores/paginate_array_store.jsx';
import DataList from 'react-datalist'; import DataList from 'react-datalist';
...@@ -638,22 +639,22 @@ export default class PanelActions extends React.Component { ...@@ -638,22 +639,22 @@ export default class PanelActions extends React.Component {
} }
PanelActions.propTypes = { PanelActions.propTypes = {
name: React.PropTypes.string.isRequired, name: PropTypes.string.isRequired,
onApplyChanges: React.PropTypes.func.isRequired, onApplyChanges: PropTypes.func.isRequired,
data: React.PropTypes.oneOfType([ data: PropTypes.oneOfType([
React.PropTypes.array, PropTypes.array,
React.PropTypes.string PropTypes.string
]), ]),
options: React.PropTypes.array, options: PropTypes.array,
hasComboInput: React.PropTypes.bool, hasComboInput: PropTypes.bool,
onAdd: React.PropTypes.func, onAdd: PropTypes.func,
onDelete: React.PropTypes.func, onDelete: PropTypes.func,
onCancel: React.PropTypes.func, onCancel: PropTypes.func,
hasExport: React.PropTypes.bool, hasExport: PropTypes.bool,
showNameOnButton: React.PropTypes.bool, showNameOnButton: PropTypes.bool,
onExport: React.PropTypes.func, onExport: PropTypes.func,
isEmail: React.PropTypes.bool, isEmail: PropTypes.bool,
nameFunc: React.PropTypes.string.isRequired nameFunc: PropTypes.string.isRequired
}; };
PanelActions.defaultProps = { PanelActions.defaultProps = {
......
//import Datalist from 'react-datalist'; //import Datalist from 'react-datalist';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Button from './button.jsx'; import Button from './button.jsx';
import PaginateArray from '../stores/paginate_array_store.jsx'; import PaginateArray from '../stores/paginate_array_store.jsx';
import DataList from 'react-datalist'; import DataList from 'react-datalist';
...@@ -639,22 +640,22 @@ export default class PanelActions extends React.Component { ...@@ -639,22 +640,22 @@ export default class PanelActions extends React.Component {
} }
PanelActions.propTypes = { PanelActions.propTypes = {
name: React.PropTypes.string.isRequired, name: PropTypes.string.isRequired,
onApplyChanges: React.PropTypes.func.isRequired, onApplyChanges: PropTypes.func.isRequired,
data: React.PropTypes.oneOfType([ data: PropTypes.oneOfType([
React.PropTypes.array, PropTypes.array,
React.PropTypes.string PropTypes.string
]), ]),
options: React.PropTypes.array, options: PropTypes.array,
hasComboInput: React.PropTypes.bool, hasComboInput: PropTypes.bool,
onAdd: React.PropTypes.func, onAdd: PropTypes.func,
onDelete: React.PropTypes.func, onDelete: PropTypes.func,
onCancel: React.PropTypes.func, onCancel: PropTypes.func,
hasExport: React.PropTypes.bool, hasExport: PropTypes.bool,
showNameOnButton: React.PropTypes.bool, showNameOnButton: PropTypes.bool,
onExport: React.PropTypes.func, onExport: PropTypes.func,
isEmail: React.PropTypes.bool, isEmail: PropTypes.bool,
nameFunc: React.PropTypes.string.isRequired nameFunc: PropTypes.string.isRequired
}; };
PanelActions.defaultProps = { PanelActions.defaultProps = {
......
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import * as Utils from '../utils/utils.jsx'; import * as Utils from '../utils/utils.jsx';
export default class Panel extends React.Component { export default class Panel extends React.Component {
...@@ -75,8 +76,8 @@ export default class Panel extends React.Component { ...@@ -75,8 +76,8 @@ export default class Panel extends React.Component {
} }
Panel.propTypes = { Panel.propTypes = {
tabNames: React.PropTypes.arrayOf(React.PropTypes.string).isRequired, tabNames: PropTypes.arrayOf(PropTypes.string).isRequired,
tabs: React.PropTypes.object.isRequired, tabs: PropTypes.object.isRequired,
location: React.PropTypes.object.isRequired, location: PropTypes.object.isRequired,
onClick: React.PropTypes.func onClick: PropTypes.func
}; };
// Copyright (c) 2016 ZBox, Spa. All Rights Reserved. // Copyright (c) 2016 ZBox, Spa. All Rights Reserved.
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import EventStore from '../stores/event_store.jsx'; import EventStore from '../stores/event_store.jsx';
export default class ProgressTask extends React.Component { export default class ProgressTask extends React.Component {
...@@ -128,12 +129,9 @@ export default class ProgressTask extends React.Component { ...@@ -128,12 +129,9 @@ export default class ProgressTask extends React.Component {
} }
} }
ProgressTask.defaultProps = {
};
ProgressTask.propTypes = { ProgressTask.propTypes = {
children: React.PropTypes.oneOfType([ children: PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element), PropTypes.arrayOf(PropTypes.element),
React.PropTypes.element PropTypes.element
]) ])
}; };
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import * as Client from '../utils/client.jsx'; import * as Client from '../utils/client.jsx';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
...@@ -42,9 +43,7 @@ export default class Root extends React.Component { ...@@ -42,9 +43,7 @@ export default class Root extends React.Component {
return this.props.children; return this.props.children;
} }
} }
Root.defaultProps = {
};
Root.propTypes = { Root.propTypes = {
children: React.PropTypes.object children: PropTypes.object
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import PageInfo from '../page_info.jsx'; import PageInfo from '../page_info.jsx';
import Panel from '../panel.jsx'; import Panel from '../panel.jsx';
import UserStore from '../../stores/user_store.jsx'; import UserStore from '../../stores/user_store.jsx';
...@@ -245,5 +246,5 @@ export default class SalesForm extends React.Component { ...@@ -245,5 +246,5 @@ export default class SalesForm extends React.Component {
} }
SalesForm.propTypes = { SalesForm.propTypes = {
params: React.PropTypes.object params: PropTypes.object
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import PageInfo from '../page_info.jsx'; import PageInfo from '../page_info.jsx';
import * as GlobalActions from '../../action_creators/global_actions.jsx'; import * as GlobalActions from '../../action_creators/global_actions.jsx';
import * as Client from '../../utils/client.jsx'; import * as Client from '../../utils/client.jsx';
...@@ -247,5 +248,5 @@ export default class SearchView extends React.Component { ...@@ -247,5 +248,5 @@ export default class SearchView extends React.Component {
} }
SearchView.propTypes = { SearchView.propTypes = {
params: React.PropTypes.object params: PropTypes.object
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class SelectCol extends React.Component { export default class SelectCol extends React.Component {
constructor(props) { constructor(props) {
...@@ -92,15 +93,15 @@ export default class SelectCol extends React.Component { ...@@ -92,15 +93,15 @@ export default class SelectCol extends React.Component {
} }
SelectCol.propTypes = { SelectCol.propTypes = {
options: React.PropTypes.object.isRequired, options: PropTypes.object.isRequired,
selectAttrs: React.PropTypes.object, selectAttrs: PropTypes.object,
onSelected: React.PropTypes.func, onSelected: PropTypes.func,
disabledOptions: React.PropTypes.object, disabledOptions: PropTypes.object,
selected: React.PropTypes.oneOfType([ selected: PropTypes.oneOfType([
React.PropTypes.string, PropTypes.string,
React.PropTypes.bool PropTypes.bool
]), ]),
id: React.PropTypes.any.isRequired id: PropTypes.any.isRequired
}; };
SelectCol.defaultProps = { SelectCol.defaultProps = {
......
...@@ -5,6 +5,7 @@ import UserStore from '../stores/user_store.jsx'; ...@@ -5,6 +5,7 @@ import UserStore from '../stores/user_store.jsx';
import SidebarMenu from './sidebar_menu.jsx'; import SidebarMenu from './sidebar_menu.jsx';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {Link} from 'react-router'; import {Link} from 'react-router';
export default class Sidebar extends React.Component { export default class Sidebar extends React.Component {
...@@ -58,5 +59,5 @@ export default class Sidebar extends React.Component { ...@@ -58,5 +59,5 @@ export default class Sidebar extends React.Component {
} }
Sidebar.propTypes = { Sidebar.propTypes = {
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
...@@ -5,6 +5,7 @@ import * as GlobalActions from '../action_creators/global_actions.jsx'; ...@@ -5,6 +5,7 @@ import * as GlobalActions from '../action_creators/global_actions.jsx';
import UserStore from '../stores/user_store.jsx'; import UserStore from '../stores/user_store.jsx';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import {browserHistory, Link} from 'react-router'; import {browserHistory, Link} from 'react-router';
export default class SidebarMenu extends React.Component { export default class SidebarMenu extends React.Component {
...@@ -119,5 +120,5 @@ export default class SidebarMenu extends React.Component { ...@@ -119,5 +120,5 @@ export default class SidebarMenu extends React.Component {
} }
SidebarMenu.propTypes = { SidebarMenu.propTypes = {
location: React.PropTypes.object.isRequired location: PropTypes.object.isRequired
}; };
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
// Cambiar por algo que reciba el status y el tamaño y se cree el componente de una vez // Cambiar por algo que reciba el status y el tamaño y se cree el componente de una vez
export default class StatusLabel extends React.Component { export default class StatusLabel extends React.Component {
...@@ -12,8 +13,8 @@ export default class StatusLabel extends React.Component { ...@@ -12,8 +13,8 @@ export default class StatusLabel extends React.Component {
} }
StatusLabel.propTypes = { StatusLabel.propTypes = {
classes: React.PropTypes.string, classes: PropTypes.string,
children: React.PropTypes.any children: PropTypes.any
}; };
StatusLabel.defaultProps = { StatusLabel.defaultProps = {
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
export default class ModalToggleButton extends React.Component { export default class ModalToggleButton extends React.Component {
constructor(props) { constructor(props) {
...@@ -68,10 +69,10 @@ export default class ModalToggleButton extends React.Component { ...@@ -68,10 +69,10 @@ export default class ModalToggleButton extends React.Component {
} }
ModalToggleButton.propTypes = { ModalToggleButton.propTypes = {
children: React.PropTypes.node.isRequired, children: PropTypes.node.isRequired,
dialogType: React.PropTypes.func.isRequired, dialogType: PropTypes.func.isRequired,
dialogProps: React.PropTypes.object, dialogProps: PropTypes.object,
onClick: React.PropTypes.func onClick: PropTypes.func
}; };
ModalToggleButton.defaultProps = { ModalToggleButton.defaultProps = {
......
{ {
"debug": true, "debug": true,
"DEV": true, "dev": false,
"enableStores" : false, "enableStores": false,
"zimbraUrl": "http://zimbra.zboxapp.dev:9081/zimbra_proxy/service/admin/soap", "zimbraUrl": "/zimbra_proxy/service/admin/soap",
"zimbraProxy": "https://192.168.1.8:7071", "zimbraProxy": "https://zimbra.zboxapp.dev:7071",
"dnsApiUrl": "http://zimbra.zboxapp.dev:3000", "dnsApiUrl": "http://zimbra.zboxapp.dev:3000",
"webMailUrl": "https://192.168.1.8:8443", "webMailUrl": "https://admin-mail.zboxapp.com/",
"salesAPI": { "salesAPI": {
"base": "http://localhost:8080/parse", "base": "https://manager-api.zboxapp.com/parse",
"getPrices": "/functions/getPrices", "getPrices": "/functions/getPrices",
"makeSale": "/functions/makeSale", "makeSale": "/functions/makeSale",
"appId": "salesZboxManagerApp" "requestSale": "/functions/setPurchase",
"appId": "salesZboxManagerApp"
}, },
"invoiceAPI": { "invoiceAPI": { "currency": "CLP", "requireTax": true },
"currency": "CLP", "timeoutRequest": 600000,
"requireTax": true
},
"timeoutRequest": 60000,
"dns": { "dns": {
"url": "http://zimbra.zboxapp.dev:9081/powerdns_proxy", "url": "https://manager.zboxapp.com/powerdns_proxy/",
"token": "otto", "token": "otto",
"inmutable": ["mx", "soa", "ns", "spf"], "inmutable": ["mx", "soa", "ns", "spf"],
"template": { "template": {
"zone_data": { "zone_data": {
"kind": "Master", "kind": "Master",
"nameservers": ["ns.zboxapp.com", "ns2.zboxapp.com"], "nameservers": ["ns.zboxapp.com", "ns2.zboxapp.com"],
"soa_edit": "DEFAULT", "soa_edit": "DEFAULT",
"soa_edit_api": "DEFAULT", "soa_edit_api": "DEFAULT",
"masters": [] "masters": []
}, },
"zone_records": "zone_records": [
[ {
{ "name": "{{=zone.name}}",
"name": "{{=zone.name}}", "type": "SOA", "content": "ns.zboxapp.com. dns.zboxapp.com. 0 10800 3600 604800 3600", "disabled": false, "ttl": 900, "priority": 0 "type": "SOA",
}, "content":
{ "ns.zboxapp.com. dns.zboxapp.com. 0 10800 3600 604800 3600",
"name": "{{=zone.name}}", "type": "NS", "content": "ns.zboxapp.com.", "disabled": false, "ttl": 900, "priority": 0 "disabled": false,
}, "ttl": 900,
{ "priority": 0
"name": "{{=zone.name}}", "type": "NS", "content": "ns2.zboxapp.com.", "disabled": false, "ttl": 900, "priority": 0 },
}, {
{ "name": "{{=zone.name}}",
"name": "{{=zone.name}}", "type": "MX", "content": "5 mailcleaner.zboxapp.com.", "disabled": false, "ttl": 900, "priority": 5 "type": "NS",
}, "content": "ns.zboxapp.com.",
{ "disabled": false,
"name": "{{=zone.name}}", "type": "TXT", "content": "\"v=spf1 include:_spf.zboxapp.com -all\"", "disabled": false, "ttl": 900, "priority": 0 "ttl": 900,
}, "priority": 0
{ },
"name": "mail.{{=zone.name}}", "type": "CNAME", "content": "mail.zboxapp.com.", "disabled": false, "ttl": 900, "priority": 0 {
} "name": "{{=zone.name}}",
] "type": "NS",
} "content": "ns2.zboxapp.com.",
}, "disabled": false,
"maxAttachmentLimit": { "ttl": 900,
"max": 52428800, "priority": 0
"min": 1048576, },
"step": 1048576 {
"name": "{{=zone.name}}",
"type": "MX",
"content": "5 mailcleaner.zboxapp.com.",
"disabled": false,
"ttl": 900,
"priority": 5
},
{
"name": "{{=zone.name}}",
"type": "TXT",
"content": "\"v=spf1 include:_spf.zboxapp.com -all\"",
"disabled": false,
"ttl": 900,
"priority": 0
},
{
"name": "mail.{{=zone.name}}",
"type": "CNAME",
"content": "mail.zboxapp.com.",
"disabled": false,
"ttl": 900,
"priority": 0
}
]
}
}, },
"maxResultOnRequestZimbra": 3000, "maxAttachmentLimit": { "max": 52428800, "min": 1048576, "step": 1048576 },
"maxResultOnRequestZimbra": 4000,
"autoincrementOnFailRequestZimbra": 500, "autoincrementOnFailRequestZimbra": 500,
"plans": { "plans": {
"basic": { "Basic": {
"statusCos": "btn-success", "statusCos": "btn-success",
"label": "Básica", "label": "Basica",
"isEnabledToEdit": true, "isEnabledToEdit": true,
"forRights": true, "forRights": true,
"sales": [ "sales": [
{ { "disabled": false },
"disabled": false { "disabled": true, "label": "Precio", "hasPrice": true },
}, { "disabled": true, "label": "$", "ref": "total" }
{ ]
"disabled": true, },
"label": "Precio", "Premium": {
"hasPrice": true "statusCos": "btn-primary2",
}, "label": "Premium",
{ "isEnabledToEdit": true,
"disabled": true, "forRights": true,
"label": "$", "archiving": true,
"ref": "total" "refer": "archiving",
} "sales": [
] { "disabled": false },
}, { "disabled": true, "label": "Precio", "hasPrice": true },
"premium": { { "disabled": true, "label": "$", "ref": "total" }
"statusCos": "btn-primary2", ]
"label": "Premium", },
"isEnabledToEdit": true, "Professional": {
"forRights": true, "statusCos": "btn-primary",
"archiving": true, "label": "Profesional",
"refer": "archiving", "isEnabledToEdit": true,
"sales": [ "forRights": true,
{ "sales": [
"disabled": false { "disabled": false },
}, { "disabled": true, "label": "Precio", "hasPrice": true },
{ { "disabled": true, "label": "$", "ref": "total" }
"disabled": true, ]
"label": "Precio", },
"hasPrice": true "archiving": {
}, "statusCos": "btn-primary",
{ "label": "Archiving",
"disabled": true, "isEnabledToEdit": false,
"label": "$", "regexp": ".archive$"
"ref": "total" },
} "default": false
]
},
"professional": {
"statusCos": "btn-primary",
"label": "Profesional",
"isEnabledToEdit": true,
"forRights": true,
"sales": [
{
"disabled": false
},
{
"disabled": true,
"label": "Precio",
"hasPrice": true
},
{
"disabled": true,
"label": "$",
"ref": "total"
}
]
},
"default": false,
"archiving": {
"statusCos": "btn-warning",
"label": "Archiving",
"isEnabledToEdit": false,
"regexp": ".archive$"
}
},
"multiFormDomain": {
"hasMailCleaner": false,
"hasDNSZone": true
}, },
"multiFormDomain": { "hasMailCleaner": false, "hasDNSZone": true },
"webmailLifetime": 3600, "webmailLifetime": 3600,
"companiesEndPoints": { "companiesEndPoints": {
"list": "http://zimbra.zboxapp.dev:9081/folio/companies.json", "list": "https://manager.zboxapp.com/folio/companies.json",
"detail": "http://zimbra.zboxapp.dev:9081/folio/companies/{id}.json", "detail": "https://manager.zboxapp.com/folio/companies/{id}.json",
"invoices": "http://zimbra.zboxapp.dev:9081/folio/companies/{id}/invoices.json" "invoices":
"https://manager.zboxapp.com/folio/companies/{id}/invoices.json?exclude=draft"
}, },
"globalAttrsBySection": { "globalAttrsBySection": {
"mailboxes": { "mailboxes": {
"attrs": { "attrs": {
"givenName": true, "givenName": true,
"sn": true, "sn": true,
"cn": true, "cn": true,
"displayName": true, "displayName": true,
"description": true, "description": true,
"zimbraCOSId": true, "zimbraCOSId": true,
"zimbraAccountStatus": true, "zimbraAccountStatus": true,
"zimbraMailHost": true, "zimbraMailHost": true,
"zimbraMailQuota": true, "zimbraMailQuota": true,
"zimbraArchiveAccount": true, "zimbraArchiveAccount": true,
"zimbraMailAlias": true, "zimbraMailAlias": true,
"zimbraPrefOutOfOfficeReplyEnabled": true, "zimbraPrefOutOfOfficeReplyEnabled": true,
"zimbraPrefOutOfOfficeFromDate": true, "zimbraPrefOutOfOfficeFromDate": true,
"zimbraPrefOutOfOfficeUntilDate": true, "zimbraPrefOutOfOfficeUntilDate": true,
"zimbraPrefOutOfOfficeReply": true, "zimbraPrefOutOfOfficeReply": true,
"zimbraCreateTimestamp": true, "zimbraCreateTimestamp": true,
"zimbraLastLogonTimestamp": true, "zimbraLastLogonTimestamp": true,
"zimbraIsDelegatedAdminAccount": true "zimbraIsDelegatedAdminAccount": true
}
},
"domains": {
"attrs": {
"zimbraDomainStatus": true,
"description": true,
"businessCategory": true,
"zimbraCreateTimestamp": true,
"zimbraDomainType": true,
"zimbraMailCatchAllForwardingAddress": true,
"amavisMessageSizeLimit": true
}
},
"search": {
"attrs": {
"zimbraDomainType": true,
"zimbraMailCatchAllForwardingAddress": true,
"objectClass": true
}
} }
}, },
"export" : { "domains": {
"domain": { "attrs": {
"name": "Email", "zimbraDomainStatus": true,
"giverName": "Nombre", "description": true,
"sn": "Apellido", "businessCategory": true,
"cn": "Usuario", "zimbraCreateTimestamp": true,
"zimbraCOSId": "Plan", "zimbraDomainType": true,
"zimbraAccountStatus": "Status" "zimbraMailCatchAllForwardingAddress": true,
}, "amavisMessageSizeLimit": true
"members": { }
"name": "Miembros" },
}, "search": {
"allowers": { "attrs": {
"name": "Permitidos" "zimbraDomainType": true,
"zimbraMailCatchAllForwardingAddress": true,
"objectClass": true
} }
}
},
"export": {
"domain": {
"name": "Email",
"givenName": "Nombre",
"sn": "Apellido",
"cn": "Usuario",
"zimbraCOSId": "Plan",
"zimbraAccountStatus": "Status"
},
"members": { "name": "Miembros" },
"allowers": { "name": "Permitidos" }
},
"messageCode": {
"200":
"Se le ha enviado a su correo una copia de las casillas que ha solicitado, en breve estarán disponibles.",
"201": "Se ha notificado su pedido al departamento de ventas.",
"401": "Algunos parámetros son requeridos",
"402": "Debe agregar las casillas que desea comprar",
"409": "Hubo un error, intente de nuevo por favor."
} }
} }
...@@ -46,27 +46,24 @@ const notFoundParams = { ...@@ -46,27 +46,24 @@ const notFoundParams = {
}; };
function preRenderSetup(callwhendone) { function preRenderSetup(callwhendone) {
const d1 = Client.getClientConfig( Client.getClientConfig().then((response) => {
(data) => { const data = response.data;
const config = data.result || data; const config = data.result || data;
if (!config) { if (!config) {
return; return;
}
global.window.manager_config = config;
if (config.debug) {
global.window.Client = Client;
global.window.Utils = Utils;
}
},
(err) => {
console.error(err); //eslint-disable-line no-console
} }
);
$.when(d1).done(callwhendone); global.window.manager_config = config;
if (config.debug) {
global.window.Client = Client;
global.window.Utils = Utils;
}
callwhendone();
}).catch((err) => {
console.error(err); //eslint-disable-line no-console
});
} }
function onPreLoggedIn(nextState, replace, callback) { function onPreLoggedIn(nextState, replace, callback) {
......
.datepicker-days {
padding: 10px 10px 0px 10px;
.switch {
text-align: center;
}
.today {
color: #337ab7;
}
.day {
text-align: center;
&.disabled {
opacity: .5;
}
}
.active {
color: #FFF;
background-color: #337ab7;
}
}
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
@import 'fonts'; @import 'fonts';
@import 'grid'; @import 'grid';
@import 'icheck'; @import 'icheck';
@import 'datepicker';
@import 'lists'; @import 'lists';
@import 'importer'; @import 'importer';
@import 'loader'; @import 'loader';
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import $ from 'jquery'; import $ from 'jquery';
import Promise from 'bluebird'; import Promise from 'bluebird';
import axios from 'axios';
import ZimbraAdminApi from 'zimbra-admin-api-js'; import ZimbraAdminApi from 'zimbra-admin-api-js';
import Powerdns from 'js-powerdns'; import Powerdns from 'js-powerdns';
...@@ -25,8 +26,6 @@ function handleError(methodName, err) { ...@@ -25,8 +26,6 @@ function handleError(methodName, err) {
return err; return err;
} }
console.error(methodName, err); //eslint-disable-line no-console
const error = { const error = {
type: Constants.MessageType.ERROR type: Constants.MessageType.ERROR
}; };
...@@ -73,23 +72,30 @@ function initZimbra() { ...@@ -73,23 +72,30 @@ function initZimbra() {
}); });
} }
export function getClientConfig(success, error) { export function getClientConfig() {
return $.ajax({ const method = Utils.isDevMode() ? 'GET' : 'POST';
url: 'https://manager.zboxapp.com/ventas_api/parse/functions/getConfigManager', const url = Utils.getConfigName();
//url: './config/config.json', return axios({
dataType: 'json', url,
method: 'POST', method,
//method: 'GET',
headers: { headers: {
'X-Parse-Application-Id': 'salesZboxManagerApp' 'X-Parse-Application-Id': 'salesZboxManagerApp'
},
data: {target: 'manager'},
success,
error: function onError(xhr, status, err) {
var e = handleError('getClientConfig', err);
error(e);
} }
}); });
// return $.ajax({
// url,
// dataType: 'json',
// method,
// headers: {
// 'X-Parse-Application-Id': 'salesZboxManagerApp'
// },
// //data: {target: 'manager'},
// success,
// error: function onError(xhr, status, err) {
// var e = handleError('getClientConfig', err);
// error(e);
// }
// });
} }
export function clearCacheZimbra(flushData, success, error) { export function clearCacheZimbra(flushData, success, error) {
...@@ -222,37 +228,45 @@ export function getAllCompanies() { ...@@ -222,37 +228,45 @@ export function getAllCompanies() {
export function getCompany(id) { export function getCompany(id) {
const url = global.window.manager_config.companiesEndPoints.detail.replace('{id}', id); const url = global.window.manager_config.companiesEndPoints.detail.replace('{id}', id);
return new Promise((resolve, reject) => { return axios.get(url, {
return $.ajax({ headers: {
url, 'x-api-key': window.manager_config.user_token
beforeSend: function setApiToken(xhrObj) { }
xhrObj.setRequestHeader('x-api-key', window.manager_config.user_token);
},
dataType: 'json',
success: function onSuccess(data) {
return resolve(data);
},
error: function onError(xhr) {
return reject(xhr.responseJSON);
}
});
}); });
// return new Promise((resolve, reject) => {
// $.ajax({
// url,
// beforeSend: function setApiToken(xhrObj) {
// xhrObj.setRequestHeader('x-api-key', window.manager_config.user_token);
// },
// dataType: 'json',
// success: resolve,
// error: reject
// });
// });
} }
export function getInvoices(id, success, error) { export function getInvoices(id) {
const url = global.window.manager_config.companiesEndPoints.invoices.replace('{id}', id); const url = global.window.manager_config.companiesEndPoints.invoices.replace('{id}', id);
return $.ajax({ return axios.get(url, {
url, headers: {
beforeSend: function setApiToken(xhrObj) { 'x-api-key': window.manager_config.user_token
xhrObj.setRequestHeader('x-api-key', window.manager_config.user_token);
},
dataType: 'json',
success,
error: function onError(xhr, status, err) {
error(err);
} }
}); });
// return $.ajax({
// url,
// beforeSend: function setApiToken(xhrObj) {
// xhrObj.setRequestHeader('x-api-key', window.manager_config.user_token);
// },
// dataType: 'json',
// success,
// error: function onError(xhr, status, err) {
// error(err);
// }
// });
} }
export function getAllDomains(opts, success, error) { export function getAllDomains(opts, success, error) {
...@@ -598,6 +612,37 @@ export function addAccountAlias(alias, success, error) { ...@@ -598,6 +612,37 @@ export function addAccountAlias(alias, success, error) {
); );
} }
export function countAllLockoutAccounts(domainName, success, error) {
const searchObject = {
query: '(|(zimbraAccountStatus=*lockout*))',
types: 'accounts',
maxResults: 0,
attrs: '*'
};
if (domainName) {
searchObject.domain = domainName;
}
initZimbra().then((zimbra) => {
zimbra.directorySearch(
searchObject,
(err, data) => {
if (err) {
const e = handleError('getAllLockoutAccounts', err);
return error(e);
}
return success(data);
}
);
},
(err) => {
const e = handleError('getAllLockoutAccounts', err);
return error(e);
});
}
export function search(query, success, error) { export function search(query, success, error) {
initZimbra().then( initZimbra().then(
(zimbra) => { (zimbra) => {
......
...@@ -6,6 +6,7 @@ import * as GlobalActions from '../action_creators/global_actions.jsx'; ...@@ -6,6 +6,7 @@ import * as GlobalActions from '../action_creators/global_actions.jsx';
import Constants from './constants.jsx'; import Constants from './constants.jsx';
import ZimbraStore from '../stores/zimbra_store.jsx'; import ZimbraStore from '../stores/zimbra_store.jsx';
import sweetAlert from 'sweetalert'; import sweetAlert from 'sweetalert';
import moment from 'moment';
const messageType = Constants.MessageType; const messageType = Constants.MessageType;
...@@ -600,6 +601,25 @@ export function getInitialDateFromTimestamp(timestamp) { ...@@ -600,6 +601,25 @@ export function getInitialDateFromTimestamp(timestamp) {
return timestampReseted; return timestampReseted;
} }
export function timestampToUTCDate(timestamp) {
const timestampAsNumber = stringTSToNumber(timestamp);
const momentDate = moment(new Date(timestampAsNumber)).format('YYYY/MM/DD');
const UCTDate = momentDate.split('/').join('');
return `${UCTDate}000000Z`;
}
export function parseBooleanValue(boolean) {
if (typeof boolean === 'undefined') {
return false;
}
return boolean.toString().toLowerCase() === 'true';
}
export function stringTSToNumber(ts) {
return parseInt(ts, 10);
}
export function forceTimestampFromHumanDate(date) { export function forceTimestampFromHumanDate(date) {
const arrDate = date.split('/').reverse(); const arrDate = date.split('/').reverse();
const newDateArr = arrDate.map((pos, i) => { const newDateArr = arrDate.map((pos, i) => {
...@@ -846,3 +866,49 @@ export function getDaysFromDate2Date(dateFrom, dateTo) { ...@@ -846,3 +866,49 @@ export function getDaysFromDate2Date(dateFrom, dateTo) {
export function randomRange(max, min) { export function randomRange(max, min) {
return Math.floor(Math.random() * (max - min + 1) + min); return Math.floor(Math.random() * (max - min + 1) + min);
} }
export function getHostname(nextPath) {
const { hostname, port, protocol } = window.location;
let host = `${protocol}//${hostname}`;
host = port && port.length > 0 ? `${host}:${port}` : host;
host += nextPath;
return host;
}
export function getConfigName() {
return isDevMode() ? '/config/config.development.json' : 'https://manager.zboxapp.com/ventas_api/parse/functions/getConfigManager';
}
export function isDevMode() {
return process.env.NODE_ENV === 'development';
}
export function getUTCTime(utc) {
if (!utc) {
return null;
}
const utcString = utc.slice(0, utc.length - 1);
const year = utcString.slice(0, 4);
const month = utcString.slice(4, 6);
const day = utcString.slice(6, 8);
const hours = utcString.slice(8, 10);
const minutes = utcString.slice(10, 12);
const seconds = utcString.slice(12, 14);
return [year, month, day, hours, minutes, seconds];
}
export function getTSFromUTC(utc) {
let time = utc;
const now = new Date();
if (!time) {
return now.getTime();
}
if (Object.prototype.toString.call(utc) === '[object Array]') {
time = new Date(...utc);
}
return time.getTime();
}
...@@ -111,10 +111,18 @@ var config = { ...@@ -111,10 +111,18 @@ var config = {
// Development mode configuration // Development mode configuration
if (DEV) { if (DEV) {
config.plugins.push(
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('development')
}
})
);
if (FULLMAP) { if (FULLMAP) {
//config.devtool = 'source-map'; config.devtool = 'source-map';
} else { } else {
//config.devtool = 'eval-cheap-module-source-map'; config.devtool = 'eval-cheap-module-source-map';
} }
} }
...@@ -125,7 +133,8 @@ if (!DEV) { ...@@ -125,7 +133,8 @@ if (!DEV) {
new webpack.optimize.UglifyJsPlugin({ new webpack.optimize.UglifyJsPlugin({
'screw-ie8': true, 'screw-ie8': true,
mangle: { mangle: {
toplevel: false toplevel: false,
keep_fnames: true
}, },
compress: { compress: {
warnings: false warnings: 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