Loopback 3, errores solucionados, codigo reorganizado

This commit is contained in:
Juan Ferrer Toribio 2017-06-05 09:01:21 +02:00
parent b427361156
commit 609c984426
56 changed files with 282 additions and 239 deletions

View File

@ -5,7 +5,7 @@
data="$ctrl.address"
form="form">
</vn-watcher>
<form ng-submit="watcher.submitGo('clientCard.addresses')" pad-medium>
<form name="form" ng-submit="watcher.submitGo('clientCard.addresses')" pad-medium>
<vn-card >
<vn-vertical pad-large>
<vn-title>Consignatario</vn-title>

View File

@ -1,11 +1,11 @@
import ngModule from '../module';
export default class Controller {
constructor($scope, $http, $timeout, vnAppLogger, $translate) {
constructor($scope, $http, $timeout, vnApp, $translate) {
this.$ = $scope;
this.http = $http;
this.timeout = $timeout;
this.logger = vnAppLogger;
this.vnApp = vnApp;
this.translate = $translate;
this.payId = null;
this.dueDay = null;
@ -34,8 +34,8 @@ export default class Controller {
returnDialog(response) {
if (response === 'ACCEPT') {
this.sendMail().then(
() => this.logger.showMessage(this.translate.instant('Notification sent!')),
() => this.logger.showMessage(this.translate.instant('Notification error'))
() => this.vnApp.showMessage(this.translate.instant('Notification sent!')),
() => this.vnApp.showMessage(this.translate.instant('Notification error'))
);
}
this.timeout(() => this.$.watcher.submit());
@ -44,7 +44,7 @@ export default class Controller {
return this.http.post(`/mailer/manuscript/paymentUpdate`, {user: this.client.id});
}
}
Controller.$inject = ['$scope', '$http', '$timeout', 'vnAppLogger', '$translate'];
Controller.$inject = ['$scope', '$http', '$timeout', 'vnApp', '$translate'];
ngModule.component('vnClientBillingData', {
template: require('./billing-data.html'),

View File

@ -5,14 +5,14 @@ export default class Controller {
constructor($scope, $http) {
this.$http = $http;
}
$onChanges(changes) {
let active = changes.active;
let sendPut = active
&& !active.isFirstChange()
&& active.previousValue !== active.currentValue;
set active(value) {
if (this._active !== value && this._active !== undefined)
this.$http.put(`/client/api/Clients/${this.client.id}/activate`);
if (sendPut)
$http.put(`/client/api/Clients/${this.client.id}/activate`);
this._active = value;
}
get active() {
return this._active;
}
}
Controller.$inject = ['$scope', '$http'];

View File

@ -5,7 +5,7 @@
data="$ctrl.note"
form="form">
</vn-watcher>
<form ng-submit="watcher.submitGo('clientCard.notes.list')" pad-medium>
<form name="form" ng-submit="watcher.submitGo('clientCard.notes.list')" pad-medium>
<vn-card>
<vn-vertical pad-large>
<vn-title>Nueva nota</vn-title>

View File

@ -1,5 +1,5 @@
<div pad-large style="min-width: 30em">
<form name="form" ng-submit="$ctrl.onSearch()">
<form ng-submit="$ctrl.onSearch()">
<vn-horizontal>
<vn-textfield vn-one label="Id Cliente" model="$ctrl.filter.id" vn-focus></vn-textfield>
<vn-textfield vn-one label="NIF/CIF" model="$ctrl.filter.fi"></vn-textfield>
@ -23,4 +23,3 @@
</vn-horizontal>
</form>
</div>

View File

@ -3,16 +3,6 @@ import ngModule from '../module';
export default class Controller {
constructor($window) {
this.$window = $window;
this.filter = {
id: null,
fi: null,
name: null,
socialName: null,
city: null,
postcode: null,
email: null,
phone: null
};
}
onSearch() {
this.setStorageValue();

View File

@ -1,10 +1,10 @@
import ngModule from '../module';
export default class Controller {
constructor($scope, $http, vnAppLogger) {
constructor($scope, $http, vnApp) {
this.$ = $scope;
this.$http = $http;
this.vnAppLogger = vnAppLogger;
this.vnApp = vnApp;
}
$onChanges() {
if (this.client)
@ -28,14 +28,14 @@ export default class Controller {
this.$http.patch(`/client/api/Accounts/${this.client.id}`, account);
} catch (e) {
this.vnAppLogger.showError(e.message);
this.vnApp.showError(e.message);
return false;
}
return true;
}
}
Controller.$inject = ['$scope', '$http', 'vnAppLogger'];
Controller.$inject = ['$scope', '$http', 'vnApp'];
ngModule.component('vnClientWebAccess', {
template: require('./web-access.html'),

View File

@ -0,0 +1,23 @@
import {module} from '../module';
/**
* The main application class.
*
* @property {String} name The application name.
* @property {Snackbar} snackbar The main object to show messages.
*/
export default class App {
show(message) {
if (this.snackbar)
this.snackbar.show({message: message});
else
console.log(message);
}
showMessage(message) {
this.show(message);
}
showError(message) {
this.show(`Error: ${message}`);
}
}
module.service('vnApp', App);

View File

@ -2,6 +2,8 @@ import './moduleLoader';
import './crud';
import './template';
import './getTemplate';
import './app';
import './interceptor';
export * from './util';
export {default as splitingRegister} from './splitingRegister';

View File

@ -0,0 +1,53 @@
import {module} from '../module';
interceptor.$inject = ['$q', '$rootScope', '$window', 'vnApp', '$translate', '$cookies'];
function interceptor($q, $rootScope, $window, vnApp, $translate, $cookies) {
$rootScope.loading = false;
return {
request: function(config) {
$rootScope.loading = true;
let token = $cookies.get('vnToken');
if (token)
config.headers.Authorization = token;
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
},
response: function(response) {
switch (response.config.method) {
case 'PUT':
case 'POST':
case 'PATCH':
vnApp.showMessage($translate.instant('Data saved!'));
}
$rootScope.loading = false;
return response;
},
responseError: function(rejection) {
$rootScope.loading = false;
let data = rejection.data;
let error;
if (data && data.error instanceof Object)
error = data.error.message;
else if (rejection.status === -1)
error = $translate.instant(`Can't contact with server`);
else
error = `${rejection.status}: ${rejection.statusText}`;
if (rejection.status === 401) {
let location = $window.location;
let continueUrl = location.pathname + location.search + location.hash;
continueUrl = encodeURIComponent(continueUrl);
$window.location = `/auth/?apiKey=${vnApp.name}&continue=${continueUrl}`;
}
vnApp.showError(error);
return $q.reject(rejection);
}
};
}
module.factory('vnInterceptor', interceptor);

View File

@ -4,8 +4,6 @@ import * as util from './util';
export const NAME = util.getProviderName('interpolate');
function minErr() {}
function stringify(value) {
if (value === null) { // null || undefined
return '';
@ -89,9 +87,8 @@ function $get($parse, $exceptionHandler, $sce) {
while (index < textLength) {
if (((startIndex = text.indexOf(self._startSymbol, index)) !== -1) &&
((endIndex = text.indexOf(self._endSymbol, startIndex + startSymbolLength)) !== -1)) {
if (index !== startIndex) {
concat.push(unescapeText(text.substring(index, startIndex)));
}
if (index !== startIndex)
concat.push(unescapeText(text.substring(index, startIndex)));
exp = text.substring(startIndex + startSymbolLength, endIndex);
expressions.push(exp);
parseFns.push($parse(exp, parseStringifyInterceptor));
@ -100,9 +97,8 @@ function $get($parse, $exceptionHandler, $sce) {
concat.push('');
} else {
// we did not find an interpolation, so we have to add the remainder to the separators array
if (index !== textLength) {
concat.push(unescapeText(text.substring(index)));
}
if (index !== textLength)
concat.push(unescapeText(text.substring(index)));
break;
}
}
@ -114,9 +110,9 @@ function $get($parse, $exceptionHandler, $sce) {
if (!mustHaveExpression || expressions.length) {
var compute = function(values) {
for (var i = 0, ii = expressions.length; i < ii; i++) {
if (allOrNothing && isUndefined(values[i])) return;
concat[expressionPositions[i]] = values[i];
}
if (allOrNothing && isUndefined(values[i])) return;
concat[expressionPositions[i]] = values[i];
}
return concat.join('');
};
@ -132,19 +128,19 @@ function $get($parse, $exceptionHandler, $sce) {
var values = new Array(ii);
try {
for (; i < ii; i++) {
values[i] = parseFns[i](context);
}
return compute(values);
} catch (err) {
$exceptionHandler($interpolateMinErr.interr(text, err));
for (; i < ii; i++) {
values[i] = parseFns[i](context);
}
return compute(values);
} catch (err) {
$exceptionHandler($interpolateMinErr.interr(text, err));
}
}, {
// all of these properties are undocumented for now
exp: text, // just for compatibility with regular watchers created via $watch
expressions: expressions
});
// all of these properties are undocumented for now
exp: text, // just for compatibility with regular watchers created via $watch
expressions: expressions
});
}
function parseStringifyInterceptor(value) {
@ -170,31 +166,25 @@ function $get($parse, $exceptionHandler, $sce) {
$get.$inject = ['$parse', '$exceptionHandler', '$sce'];
export class Interpolate
{
export class Interpolate {
constructor() {
this._startSymbol = '*[';
this._endSymbol = ']*';
}
set startSymbol(value) {
if (value) {
this._startSymbol = value;
return this;
} else {
return this._startSymbol;
}
return this._startSymbol;
}
set endSymbol(value) {
if (value) {
this._endSymbol = value;
return this;
} else {
return this._endSymbol;
}
return this._endSymbol;
}
}
Interpolate.prototype.$get = $get;

View File

@ -1,39 +1,28 @@
import {module} from '../module';
import * as util from './util';
import constant from './constants';
import Interpolate from './interpolate';
export const NAME = util.getProviderName('ResolveDefaultComponent');
export const NAME = 'vnComponentResolver';
function $get($injector, vnInterpolate) {
return {
getTemplate: function(name, attrs) {
this._frameworkName = 'Mdl';
let _name = util.getFactoryName(name + this._frameworkName);
let defaultfactory = $injector.has(_name) ? $injector.get(_name) : undefined;
if (!defaultfactory) {
throw new Error("factory is not defined");
}
let defaultValues = defaultfactory.default;
let template = defaultfactory.template;
let scope = Object.assign({}, defaultValues || {}, attrs || {});
return template && vnInterpolate(template)(scope);
}
};
}
$get.$inject = ['$injector', 'vnInterpolate'];
export class ResolveDefaultComponent {
constructor() {
this._frameworkName = 'Mdl';
export default class ComponentResolver {
constructor($injector, vnInterpolate) {
this.$injector = $injector;
this.vnInterpolate = vnInterpolate;
this.frameworkName = 'Mdl';
}
set frameworkName(value) {
this._frameworkName = value;
getTemplate(name, attrs) {
let factoryName = util.getFactoryName(name + this.frameworkName);
let factory = this.$injector.has(factoryName) ?
this.$injector.get(factoryName) : undefined;
if (!factory)
throw new Error(`ComponentResolver: Factory '${factoryName}' is not defined`);
let defaultValues = factory.default;
let template = factory.template;
let scope = Object.assign({}, defaultValues || {}, attrs || {});
return template && this.vnInterpolate(template)(scope);
}
}
ComponentResolver.$inject = ['$injector', 'vnInterpolate'];
ResolveDefaultComponent.prototype.$get = $get;
var resolve = new ResolveDefaultComponent();
module.provider(NAME, () => resolve);
module.service('vnComponentResolver', ComponentResolver);

View File

@ -12,14 +12,15 @@ class SplitingRegister {
array.push(dependency);
var first = this._graph[dependency];
while (first && first.length > 0) {
dependency = first.shift();
array = array.concat(this.getDependencies(dependency));
}
if (first)
while (first.length > 0) {
dependency = first.shift();
array = array.concat(this.getDependencies(dependency));
}
return array;
}
registerGraph(graph) {
this._graph = graph;
this._graph = graph;
}
register(moduleName, loader) {
this._modules[moduleName] = loader;

View File

@ -6,7 +6,7 @@
* @return {String} The camelized string
*/
export function kebabToCamel(str) {
var camelCased = str.replace (/-([a-z])/, function(g) {
var camelCased = str.replace(/-([a-z])/, function(g) {
return g[1].toUpperCase();
});
return camelCased;

View File

@ -11,13 +11,13 @@ import isEqual from '../lib/equals';
* properties are provided.
*/
export default class Watcher extends Component {
constructor($element, $scope, $state, $transitions, $http, vnAppLogger, $translate) {
constructor($element, $scope, $state, $transitions, $http, vnApp, $translate) {
super($element);
this.$scope = $scope;
this.$state = $state;
this.$http = $http;
this.$translate = $translate;
this.vnAppLogger = vnAppLogger;
this.vnApp = vnApp;
this.state = null;
this.deregisterCallback = $transitions.onStart({},
@ -121,13 +121,13 @@ export default class Watcher extends Component {
resolve(json);
}
noChanges(resolve) {
this.vnAppLogger.showMessage(
this.vnApp.showMessage(
this.$translate.instant('No changes to save')
);
resolve();
}
invalidForm(resolve) {
this.vnAppLogger.showMessage(
this.vnApp.showMessage(
this.$translate.instant('Some fields are invalid')
);
resolve();
@ -156,7 +156,7 @@ export default class Watcher extends Component {
}
}
}
Watcher.$inject = ['$element', '$scope', '$state', '$transitions', '$http', 'vnAppLogger', '$translate'];
Watcher.$inject = ['$element', '$scope', '$state', '$transitions', '$http', 'vnApp', '$translate'];
module.component('vnWatcher', {
template: require('./watcher.html'),

View File

@ -1,11 +1,13 @@
<vn-vertical full-height class="bg-content">
<vn-topbar vn-empty>
<a ui-sref="home" title="{{'home' | translate}}"><img class="logo" src="./logo.svg" alt="Logo" ></img></a>
<a ui-sref="home" title="{{'Home' | translate}}">
<img class="logo" src="./logo.svg" alt="Logo" ></img>
</a>
<vn-spinner enable="$root.loading"></vn-spinner>
<vn-main-menu></vn-main-menu>
</vn-topbar>
<vn-vertical vn-auto ui-view scrollable class="main-view">
<vn-home></vn-home>
</vn-vertical>
<vn-snackbar></vn-snackbar>
<vn-snackbar vn-id="snackbar"></vn-snackbar>
</vn-vertical>

View File

@ -1,85 +1,18 @@
import ngModule, {appName} from '../../module';
import ngModule from '../../module';
import './style.scss';
export const NAME = 'vnApp';
export const COMPONENT = {
template: require('./app.html')
};
ngModule.component(NAME, COMPONENT);
vnAppLogger.$inject = ['$document'];
function vnAppLogger($document) {
return {
showMessage: function(message) {
let snackbar = $document.find('vn-snackbar').controller('vnSnackbar');
snackbar.show({message: message});
},
showError: function(message) {
this.showMessage(`Error: ${message}`);
}
};
export default class App {
constructor($scope, vnApp) {
this.$ = $scope;
this.vnApp = vnApp;
}
$postLink() {
this.vnApp.snackbar = this.$.snackbar;
}
}
ngModule.provider('vnAppLogger', function() {
this.$get = vnAppLogger;
App.$inject = ['$scope', 'vnApp'];
ngModule.component('vnApp', {
template: require('./app.html'),
controller: App
});
vnAppInterceptor.$inject = ['$q', '$rootScope', '$window', 'vnAppLogger', '$translate', '$cookies'];
function vnAppInterceptor($q, $rootScope, $window, logger, $translate, $cookies) {
$rootScope.loading = false;
return {
request: function(config) {
$rootScope.loading = true;
let token = $cookies.get('vnToken');
if (token)
config.headers.Authorization = token;
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
},
response: function(response) {
switch (response.config.method) {
case 'PUT':
case 'POST':
logger.showMessage($translate.instant('Data saved!'));
}
$rootScope.loading = false;
return response;
},
responseError: function(rejection) {
$rootScope.loading = false;
let data = rejection.data;
let error;
if (data && data.error instanceof Object)
error = data.error.message;
else if (rejection.status === -1)
error = $translate.instant(`Can't contact with server`);
else
error = `${rejection.status}: ${rejection.statusText}`;
if (rejection.status === 401) {
let location = $window.location;
let continueUrl = location.pathname + location.search + location.hash;
continueUrl = encodeURIComponent(continueUrl);
$window.location = `/auth/?apiKey=salix&continue=${continueUrl}`;
}
logger.showError(error);
return $q.reject(rejection);
}
};
}
ngModule.factory('vnAppInterceptor', vnAppInterceptor);
interceptorConfig.$inject = ['$httpProvider'];
function interceptorConfig($httpProvider) {
$httpProvider.interceptors.push('vnAppInterceptor');
}
ngModule.config(interceptorConfig);
var acl = window[appName] ? window[appName].acl : {};
ngModule.constant('aclConstant', acl);

View File

@ -7,7 +7,6 @@ vn-app {
height: 100%;
vn-topbar {
.logo {
float: left;
height: 30px;

View File

@ -1,19 +1,15 @@
import ngModule from '../../module';
import './style.scss';
export const NAME = 'vnHome';
export default class vnHome {
export default class Home {
constructor(modulesFactory, $state) {
this.modules = modulesFactory.getModules();
this.state = $state;
}
}
vnHome.$inject = ['modulesFactory', '$state'];
Home.$inject = ['modulesFactory', '$state'];
export const COMPONENT = {
ngModule.component('vnHome', {
template: require('./home.html'),
controller: vnHome
};
ngModule.component(NAME, COMPONENT);
controller: Home
});

View File

@ -27,8 +27,8 @@ MenuActions.$inject = ['$state', '$transitions'];
ngModule.component('vnActions', {
template: require('./actions.html'),
controller: MenuActions,
bindings: {
items: '<'
},
controller: MenuActions
}
});

View File

@ -1,14 +1,13 @@
import ngModule from '../../module';
import './style.css';
export default class vnLeftMenu {
export default class LeftMenu {
constructor(aclService, $state) {
this.aclService = aclService;
this.$state = $state;
this.items = [];
this.init();
}
init() {
let station = this.$state.current.data.station || 'default';
if (routes[station]) {
@ -23,9 +22,9 @@ export default class vnLeftMenu {
}
}
}
vnLeftMenu.$inject = ['aclService', '$state'];
LeftMenu.$inject = ['aclService', '$state'];
ngModule.component('vnLeftMenu', {
template: require('./left-menu.html'),
controller: vnLeftMenu
controller: LeftMenu
});

View File

@ -6,16 +6,16 @@
<vn-icon icon="account_circle" translate-attr="{title: 'Profile'}" style="font-size: 35px;"></vn-icon>
<ul class="mdl-menu mdl-js-menu mdl-menu--bottom-right" pad-medium for="apps">
<vn-horizontal>
<div ng-repeat="mod in $ctrl.modules">
<vn-vertical>
<a ui-sref="{{::mod.route.state}}">
<button vn-one class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored popover-button">
<vn-icon vn-one icon="{{::mod.icon}}" style="font-size:40px"></vn-icon>
</button>
</a>
<vn-label class="popover-label" text="{{::mod.name}}"></vn-label>
</vn-vertical>
</div>
<div ng-repeat="mod in $ctrl.modules">
<vn-vertical>
<a ui-sref="{{::mod.route.state}}">
<button vn-one class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored popover-button">
<vn-icon vn-one icon="{{::mod.icon}}" style="font-size:40px"></vn-icon>
</button>
</a>
<vn-label class="popover-label" text="{{::mod.name}}"></vn-label>
</vn-vertical>
</div>
</vn-horizontal>
</ul>
</div>

View File

@ -1,7 +1,7 @@
import ngModule from '../../module';
import './style.scss';
export default class Controller {
export default class MainMenu {
constructor($translate, $window, modulesFactory) {
this.$translate = $translate;
this.$window = $window;
@ -16,9 +16,9 @@ export default class Controller {
console.log(`Locale changed: ${lang}`);
}
}
Controller.$inject = ['$translate', '$window', 'modulesFactory'];
MainMenu.$inject = ['$translate', '$window', 'modulesFactory'];
ngModule.component('vnMainMenu', {
template: require('./main-menu.html'),
controller: Controller
controller: MainMenu
});

View File

@ -16,6 +16,7 @@ export default class Controller {
// XXX: ¿Existe una forma más adecuada de acceder al controlador de un componente?
var childCtrl = angular.element(child).isolateScope().$ctrl;
childCtrl.filter = Object.assign({}, this.index.filter);
childCtrl.onSubmit = filter => this.onChildSubmit(filter);
event.preventDefault();

View File

@ -1,13 +1,20 @@
import ngModule, {appName} from './module';
import ngModule from './module';
config.$inject = ['$translatePartialLoaderProvider'];
export function config($translatePartialLoaderProvider) {
export const appName = 'salix';
var acl = window[appName] ? window[appName].acl : {};
ngModule.constant('aclConstant', acl);
config.$inject = ['$translatePartialLoaderProvider', '$httpProvider'];
export function config($translatePartialLoaderProvider, $httpProvider) {
$translatePartialLoaderProvider.addPart(appName);
$httpProvider.interceptors.push('vnInterceptor');
}
ngModule.config(config);
run.$inject = ['$window', '$rootScope'];
export function run($window, $rootScope) {
run.$inject = ['$window', '$rootScope', 'vnApp'];
export function run($window, $rootScope, vnApp) {
$window.validations = {};
vnApp.name = appName;
}
ngModule.run(run);

View File

@ -1,5 +1,6 @@
{
"Applications": "Applications",
"Home": "Home",
"Notifications":"Notifications",
"Logout": "Logout",
"Change language": "Change language",

View File

@ -1,5 +1,6 @@
{
"Applications": "Aplicaciones",
"Home": "Inicio",
"Notifications":"Notificaciones",
"Logout": "Cerrar sesión",
"Change language": "Cambiar idioma",

View File

@ -1,6 +1,5 @@
import {ng} from 'vendor';
import 'core';
export const appName = 'salix';
const ngModule = ng.module(appName, ['vnCore']);
const ngModule = ng.module('salix', ['vnCore']);
export default ngModule;

View File

@ -0,0 +1,11 @@
{
"name": "user",
"base": "User",
"properties": {
"id": {
"id": true,
"type": "Number",
"forceId": false
}
}
}

View File

@ -12,6 +12,8 @@
"host": "localhost",
"port": 3306,
"username": "root",
"password": ""
"password": "",
"connectTimeout": 20000,
"acquireTimeout": 20000
}
}

View File

@ -13,11 +13,18 @@
"./mixins"
]
},
"User": {
"user": {
"dataSource": "auth"
},
"AccessToken": {
"dataSource": "auth"
"dataSource": "auth",
"relations": {
"user": {
"type": "belongsTo",
"model": "user",
"foreignKey": "userId"
}
}
},
"ACL": {
"dataSource": "auth"

View File

@ -0,0 +1,11 @@
{
"name": "user",
"base": "User",
"properties": {
"id": {
"id": true,
"type": "Number",
"forceId": false
}
}
}

View File

@ -12,7 +12,9 @@
"host": "localhost",
"port": 3306,
"username": "root",
"password": ""
"password": "",
"connectTimeout": 20000,
"acquireTimeout": 20000
},
"vn": {
"name": "mysql",
@ -22,6 +24,8 @@
"host": "localhost",
"port": 3306,
"username": "root",
"password": ""
"password": "",
"connectTimeout": 20000,
"acquireTimeout": 20000
}
}

View File

@ -13,13 +13,18 @@
"./mixins"
]
},
"User": {
"dataSource": "auth",
"public": false
"user": {
"dataSource": "auth"
},
"AccessToken": {
"dataSource": "auth",
"public": false
"relations": {
"user": {
"type": "belongsTo",
"model": "user",
"foreignKey": "userId"
}
}
},
"ACL": {
"dataSource": "auth",

View File

@ -0,0 +1,11 @@
{
"name": "user",
"base": "User",
"properties": {
"id": {
"id": true,
"type": "Number",
"forceId": false
}
}
}

View File

@ -11,6 +11,8 @@
"host": "localhost",
"port": 3306,
"username": "root",
"password": ""
"password": "",
"connectTimeout": 20000,
"acquireTimeout": 20000
}
}

View File

@ -13,13 +13,18 @@
"./mixins"
]
},
"User": {
"dataSource": "auth",
"public": false
"user": {
"dataSource": "auth"
},
"AccessToken": {
"dataSource": "auth",
"public": false
"relations": {
"user": {
"type": "belongsTo",
"model": "user",
"foreignKey": "userId"
}
}
},
"ACL": {
"dataSource": "auth",

View File

@ -57,7 +57,7 @@ var config = {
names: ['bundle.vendor', 'bundle.manifest']
})
],
devtool: 'eval-source-map'
devtool: 'source-map'
};
if (!devMode) {