blob: 292c6f55009133ffaf798e88b78abab8bbfab7a2 [file] [log] [blame]
Matteo Scandolo5d962a32017-08-01 18:16:14 -07001import {IXosModelRelation} from './crud';
2import {IXosModelStoreService} from '../../datasources/stores/model.store';
3import {IXosModelDiscovererService} from '../../datasources/helpers/model-discoverer.service';
4import * as _ from 'lodash';
5import {IXosFormCfg} from '../../core/form/form';
6import {IXosTableCfg} from '../../core/table/table';
7import {IXosConfigHelpersService} from '../../core/services/helpers/config.helpers';
8
9interface IXosCrudRelationBaseTabData {
10 model: any;
11 class?: 'full' | 'empty';
12}
13
14export interface IXosCrudRelationFormTabData extends IXosCrudRelationBaseTabData {
15 formConfig: IXosFormCfg;
16}
17
18export interface IXosCrudRelationTableTabData extends IXosCrudRelationBaseTabData {
19 tableConfig: IXosTableCfg;
20}
21
22export interface IXosCrudRelationService {
23 getModel(r: IXosModelRelation, id: string | number): Promise<IXosCrudRelationFormTabData>;
24 getModels(r: IXosModelRelation, source_id: string | number): Promise<IXosCrudRelationTableTabData>;
25 existsRelatedItem(r: IXosModelRelation, item: any): boolean;
26 getHumanReadableOnField(r: IXosModelRelation, baseModel: string): string;
27}
28
29export class XosCrudRelationService implements IXosCrudRelationService {
30
31 static $inject = [
32 '$log',
33 '$q',
34 'XosModelStore',
35 'XosModelDiscoverer',
36 'ConfigHelpers'
37 ];
38
39 constructor (
40 private $log: ng.ILogService,
41 private $q: ng.IQService,
42 private XosModelStore: IXosModelStoreService,
43 private XosModelDiscovererService: IXosModelDiscovererService,
44 private ConfigHelpers: IXosConfigHelpersService
45 ) {}
46
47 public getModel (r: IXosModelRelation, id: string | number): Promise<IXosCrudRelationFormTabData> {
48 const d = this.$q.defer();
49 this.XosModelStore.get(r.model, id)
50 .subscribe(
51 item => {
52 this.$log.debug(`[XosCrud] Loaded manytoone relation with ${r.model} on ${r.on_field}`, item);
53
54 const data: IXosCrudRelationFormTabData = {
55 model: item,
56 formConfig: this.XosModelDiscovererService.get(r.model).formCfg,
57 class: angular ? 'full' : 'empty'
58 };
59
60 d.resolve(data);
61 },
62 err => d.reject
63 );
64 return d.promise;
65 };
66
67 public getModels(r: IXosModelRelation, source_id: string | number): Promise<IXosCrudRelationTableTabData> {
68 const d = this.$q.defer();
69
70 this.XosModelStore.query(r.model)
71 .subscribe(
72 items => {
73 this.$log.debug(`[XosCrud] Loaded onetomany relation with ${r.model} on ${r.on_field}`, items);
74 // building the filter parameters
75 const match = {};
76 match[`${r.on_field.toLowerCase()}_id`] = source_id;
77 const filtered = _.filter(items, match);
78 // removing search bar from table
79 const tableCfg = this.XosModelDiscovererService.get(r.model).tableCfg;
80 tableCfg.filter = null;
81
82 const data: IXosCrudRelationTableTabData = {
83 model: filtered,
84 tableConfig: tableCfg,
85 class: filtered.length > 0 ? 'full' : 'empty'
86 };
87
88 d.resolve(data);
89 },
90 err => d.reject
91 );
92
93 return d.promise;
94 }
95
96 public existsRelatedItem(r: IXosModelRelation, item: any): boolean {
97 return item && angular.isDefined(item[`${r.on_field.toLowerCase()}_id`]);
98 }
99
100 public getHumanReadableOnField(r: IXosModelRelation, baseModel: string): string {
101 if (r.on_field.toLowerCase() === baseModel.toLowerCase()) {
102 return '';
103 }
104 if (r.model.toLowerCase() === r.on_field.toLowerCase()) {
105 return '';
106 }
107 return `[${this.ConfigHelpers.toLabel(r.on_field, false)}]`;
108 }
109}