blob: 88c22504e0fdfe78f8756e4579c326792a868ef0 [file] [log] [blame]
Matteo Scandolof6acdbe2016-12-13 10:29:37 -08001/// <reference path="../typings/index.d.ts" />
Matteo Scandolod819c922016-12-02 14:06:14 -08002
Matteo Scandolo266907e2016-12-20 13:41:42 -08003
Matteo Scandolof6acdbe2016-12-13 10:29:37 -08004import * as angular from 'angular';
Matteo Scandolod819c922016-12-02 14:06:14 -08005
Matteo Scandolof6acdbe2016-12-13 10:29:37 -08006import 'angular-ui-router';
7import 'angular-resource';
8import 'angular-cookies';
9import routesConfig from './routes';
10
11import {main} from './app/main';
Matteo Scandolod819c922016-12-02 14:06:14 -080012
13import './index.scss';
Matteo Scandolof6acdbe2016-12-13 10:29:37 -080014import {xosCore} from './app/core/index';
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080015import {xosDataSources} from './app/datasources/index';
Matteo Scandolof6acdbe2016-12-13 10:29:37 -080016import {xosViews} from './app/views/index';
Matteo Scandolo266907e2016-12-20 13:41:42 -080017import {xosTemplate} from './app/template/index';
18
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080019import {
20 interceptorConfig, userStatusInterceptor, CredentialsInterceptor,
21 NoHyperlinksInterceptor
22} from './interceptors';
23import {IRuntimeStatesService} from './app/core/services/runtime-states';
24import {IModeldefsService, IModeldef} from './app/datasources/rest/modeldefs.rest';
25import {IXosCrudData} from './app/views/crud/crud';
26import * as _ from 'lodash';
27import {IXosNavigationService} from './app/core/services/navigation';
Matteo Scandolo5655bdc2016-12-16 08:32:15 -080028import {IXosPageTitleService} from './app/core/services/page-title';
Matteo Scandolod58d5042016-12-16 16:59:21 -080029import {IXosConfigHelpersService} from './app/core/services/helpers/config.helpers';
Matteo Scandolo99fface2016-12-21 15:37:23 -080030import {StyleConfig} from './app/config/style.config';
Matteo Scandolobac22452017-01-03 16:35:32 -080031import {IXosResourceService} from './app/datasources/rest/model.rest';
32import {IXosModelHelpersService} from './app/core/services/helpers/model.helper';
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080033
34export interface IXosState extends angular.ui.IState {
35 data: IXosCrudData;
36};
37
Matteo Scandolof6acdbe2016-12-13 10:29:37 -080038angular
Matteo Scandolo266907e2016-12-20 13:41:42 -080039 .module('app', [
40 xosCore,
41 xosDataSources,
42 xosViews,
43 'ui.router',
44 'ngResource',
45 xosTemplate // template module
46 ])
Matteo Scandolof6acdbe2016-12-13 10:29:37 -080047 .config(routesConfig)
48 .config(interceptorConfig)
49 .factory('UserStatusInterceptor', userStatusInterceptor)
50 .factory('CredentialsInterceptor', CredentialsInterceptor)
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080051 .factory('NoHyperlinksInterceptor', NoHyperlinksInterceptor)
52 .component('xos', main)
Matteo Scandolo266907e2016-12-20 13:41:42 -080053 .run(function($rootScope: ng.IRootScopeService, $transitions: any) {
Matteo Scandolo99fface2016-12-21 15:37:23 -080054 $rootScope['favicon'] = `./app/images/brand/${StyleConfig.favicon}`;
Matteo Scandolo266907e2016-12-20 13:41:42 -080055 $transitions.onSuccess({ to: '**' }, (transtion) => {
56 if (transtion.$to().name === 'login') {
57 $rootScope['class'] = 'blank';
58 }
59 else {
60 $rootScope['class'] = '';
61 }
62 });
63 })
Matteo Scandolo5655bdc2016-12-16 08:32:15 -080064 .run((
Matteo Scandoloe0d71ea2016-12-19 11:56:12 -080065 $location: ng.ILocationService,
66 $state: ng.ui.IStateService,
Matteo Scandolo5655bdc2016-12-16 08:32:15 -080067 ModelDefs: IModeldefsService,
Matteo Scandolobac22452017-01-03 16:35:32 -080068 ModelRest: IXosResourceService,
Matteo Scandolo5655bdc2016-12-16 08:32:15 -080069 RuntimeStates: IRuntimeStatesService,
70 NavigationService: IXosNavigationService,
Matteo Scandolod58d5042016-12-16 16:59:21 -080071 ConfigHelpers: IXosConfigHelpersService,
Matteo Scandolobac22452017-01-03 16:35:32 -080072 ModelHelpers: IXosModelHelpersService,
73 toastr: ng.toastr.IToastrService,
Matteo Scandolo5655bdc2016-12-16 08:32:15 -080074 PageTitle: IXosPageTitleService
75 ) => {
Matteo Scandoloe0d71ea2016-12-19 11:56:12 -080076
77 // save the last visited state before reload
78 const lastRoute = window.location.hash.replace('#', '');
79
Matteo Scandolo5655bdc2016-12-16 08:32:15 -080080 // Dinamically add a core states
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080081 ModelDefs.get()
82 .then((models: IModeldef[]) => {
Matteo Scandolod58d5042016-12-16 16:59:21 -080083 // TODO move in a separate service and test
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080084 _.forEach(models, (m: IModeldef) => {
Matteo Scandoloee655a12016-12-19 15:38:43 -080085 const stateUrl = `/${ConfigHelpers.pluralize(m.name.toLowerCase())}/:id?`;
Matteo Scandoloe0d71ea2016-12-19 11:56:12 -080086 const stateName = `xos.core.${ConfigHelpers.pluralize(m.name.toLowerCase())}`;
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080087 const state: IXosState = {
Matteo Scandoloe0d71ea2016-12-19 11:56:12 -080088 parent: 'core',
89 url: stateUrl,
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080090 component: 'xosCrud',
Matteo Scandoloee655a12016-12-19 15:38:43 -080091 params: {
92 id: null
93 },
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080094 data: {
95 model: m.name,
Matteo Scandoloee655a12016-12-19 15:38:43 -080096 related: m.relations,
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080097 xosTableCfg: {
Matteo Scandolod62ea792016-12-22 14:02:28 -080098 columns: ConfigHelpers.modeldefToTableCfg(m.fields, stateUrl),
99 filter: 'fulltext',
100 order: {field: 'id', reverse: false}, // TODO understand dynamic interfaces
101 actions: [
102 {
103 label: 'delete',
104 icon: 'remove',
105 color: 'red',
106 cb: (item) => {
Matteo Scandolobac22452017-01-03 16:35:32 -0800107 let obj = angular.copy(item);
108 // check that item in an angular resource
109 if (!item.$delete) {
110 const endpoint = ModelHelpers.urlFromCoreModel(m.name);
111 const resource = ModelRest.getResource(endpoint);
112 // create a resource with that item
113 item = new resource(item);
114
115 }
Matteo Scandolod62ea792016-12-22 14:02:28 -0800116 console.log(item);
Matteo Scandolo99ac9d92017-01-03 13:58:19 -0800117 item.$delete()
Matteo Scandolobac22452017-01-03 16:35:32 -0800118 .then((res) => {
119 if (res.status === 404) {
120 // TODO understand why it does not go directly in catch
121 throw new Error();
122 }
123 toastr.info(`${m.name} ${obj.name} succesfully deleted`);
Matteo Scandolo99ac9d92017-01-03 13:58:19 -0800124 })
Matteo Scandolobac22452017-01-03 16:35:32 -0800125 .catch(() => {
126 console.log(obj);
127 toastr.error(`Error while deleting ${obj.name}`);
Matteo Scandolo99ac9d92017-01-03 13:58:19 -0800128 });
Matteo Scandolod62ea792016-12-22 14:02:28 -0800129 }
130 }
131 ]
Matteo Scandoloee655a12016-12-19 15:38:43 -0800132 },
133 // TODO add form config
Matteo Scandolof2c3ed62016-12-15 14:32:50 -0800134 }
135 };
Matteo Scandoloe0d71ea2016-12-19 11:56:12 -0800136
137 RuntimeStates.addState(stateName, state);
138 NavigationService.add({
139 label: ConfigHelpers.pluralize(m.name),
140 state: stateName,
141 parent: 'xos.core'
142 });
Matteo Scandolof2c3ed62016-12-15 14:32:50 -0800143 });
Matteo Scandoloe0d71ea2016-12-19 11:56:12 -0800144
145 // after setting up dynamic routes, redirect to previous state
146 $location.path(lastRoute);
147 // $state.get().forEach(s => {
Matteo Scandoloee655a12016-12-19 15:38:43 -0800148 // console.log(s.name, $state.href(s.name), s);
Matteo Scandoloe0d71ea2016-12-19 11:56:12 -0800149 // });
Matteo Scandolof2c3ed62016-12-15 14:32:50 -0800150 });
151 });