source : eventService.js

(function (angular) {
    'use strict';
    /**
     * @memberof spApp
     * @ngdoc service
     * @name EventService
     * @description
     *   Common events
     */
    angular.module('event-service', [])
        .factory('EventService', ['MapService', 'LayoutService', 'LoggerService', 'BiocacheService', '$q',
            function (MapService, LayoutService, LoggerService, BiocacheService, $q) {
                // events
                var SCATTERPLOT_CREATE_IN_OUT = ['Create', 'scatterplotCreateInOut']
                var ADHOC_CREATE_IN_OUT = ['Create', 'adhocCreateInOut']
                var FACET_NEW_LAYER = ['Create', 'facetNewLayer']
                var FACET_NEW_LAYER_OUT = ['Create', 'facetNewLayerOut']
                var thiz = {
                    execute: function (event, data) {
                        if (event == SCATTERPLOT_CREATE_IN_OUT[1]) {
                            var inFq = data.data[0].enabled ? data.data[0].facet : undefined
                            var outFq = data.data[1].enabled ? data.data[1].facet : undefined
                            return thiz.scatterplotCreateInOut(MapService.getFullLayer(data.layerId), inFq, outFq)
                        } else if (event == ADHOC_CREATE_IN_OUT[1]) {
                            var inFq = data.data[0].enabled ? data.data[0].facet : undefined
                            var outFq = data.data[1].enabled ? data.data[1].facet : undefined
                            return thiz.adhocCreateInOut(MapService.getFullLayer(data.layerId), inFq, outFq)
                        } else if (event == FACET_NEW_LAYER[1]) {
                            var newFqs = []
                            $.map(data.data, function (v) {
                                if (v.enabled) {
                                    newFqs.push(v.facet)
                                }
                            })
                            return thiz.facetNewLayer(MapService.getFullLayer(data.layerId), newFqs)
                        } else if (event == FACET_NEW_LAYER_OUT[1]) {
                            var newFqs = []
                            $.map(data.data, function (v) {
                                if (v.enabled) {
                                    newFqs.push(v.facet)
                                }
                            })
                            return thiz.facetNewLayerOut(MapService.getFullLayer(data.layerId), newFqs)
                        }
                        return $q.when(true)
                    },
                    facetNewLayerOut: function (layer, newFqs) {
                        var fq = ''
                        if (newFqs.length > 0) {
                            var fqs = $.merge([], newFqs)
                            for (var i = 0; i < fqs.length; i++) {
                                // Use (*:* AND -facet:*) instead of (-facet:*)
                                if (fqs[i].match(/^-[^\s]*:\*$/) != null || fqs[i].match(/^-[^\s]*:\[\* TO \*\]$/) != null) {
                                    fqs[i] = '*:* AND ' + fqs[i]
                                }
                            }
                            fq = "-((" + fqs.join(") AND (") + "))"
                        }
                        return BiocacheService.newLayerAddFq(layer, fq,
                            layer.name + " : " + $i18n(343, "from unselected")).then(function (data) {
                            if (data == null) {
                                return $q.when(null)
                            }
                            var logData = []
                            $.map(newFqs, function (v) {
                                logData.push({facet: v})
                            })
                            LoggerService.log(FACET_NEW_LAYER_OUT[0], FACET_NEW_LAYER_OUT[1],
                                {
                                    layerId: layer.uid,
                                    query: {
                                        qid: layer.qid, bs: layer.bs,
                                        ws: layer.ws
                                    },
                                    data: logData
                                })
                            data.log = false
                            return MapService.add(data)
                        })
                    },
                    facetNewLayer: function (layer, newFqs) {
                        return BiocacheService.newLayerAddFq(layer, newFqs,
                            layer.name + " : " + $i18n(342, "from selected")).then(function (data) {
                            if (data == null) {
                                return $q.when(null)
                            }
                            var logData = []
                            $.map(newFqs, function (v) {
                                logData.push({facet: v})
                            })
                            LoggerService.log(FACET_NEW_LAYER[0], FACET_NEW_LAYER[1],
                                {
                                    layerId: layer.uid,
                                    query: {
                                        qid: layer.qid, bs: layer.bs,
                                        ws: layer.ws
                                    },
                                    data: logData
                                })
                            data.log = false
                            return MapService.add(data)
                        })
                    },
                    adhocCreateInOut: function (layer, inFq, outFq) {
                        LoggerService.log(ADHOC_CREATE_IN_OUT[0], ADHOC_CREATE_IN_OUT[1],
                            {
                                layerId: layer.uid,
                                query: {
                                    qid: layer.qid, bs: layer.bs,
                                    ws: layer.ws
                                },
                                data: [{facet: layer.inAdhocQ},
                                    {facet: layer.outAdhocQ}]
                            })
                        var promises = []
                        if (inFq) {
                            promises.push(BiocacheService.newLayerAddFq(layer, inFq,
                                layer.name + " : " + $i18n(340, "in adhoc")).then(function (data) {
                                if (data == null) {
                                    return $q.when(null)
                                }
                                data.log = false
                                return MapService.add(data)
                            }))
                        }
                        if (outFq) {
                            promises.push(BiocacheService.newLayerAddFq(layer, outFq,
                                layer.name + " : " + $i18n(341, "out adhoc")).then(function (data) {
                                if (data == null) {
                                    return $q.when(null)
                                }
                                data.log = false
                                return MapService.add(data)
                            }))
                        }
                        return $q.all(promises)
                    },
                    scatterplotCreateInOut: function (layer, inFq, outFq) {
                        LoggerService.log(SCATTERPLOT_CREATE_IN_OUT[0], SCATTERPLOT_CREATE_IN_OUT[1],
                            {
                                layerId: layer.uid,
                                taskId: layer.scatterplotId,
                                query: {
                                    qid: layer.qid, bs: layer.bs,
                                    ws: layer.ws
                                },
                                data: [{facet: inFq, description: 'in group'},
                                    {facet: outFq, description: 'out group'}]
                            })
                        var promises = []
                        promises.push(BiocacheService.newLayerAddFq(layer, inFq,
                            layer.name + " : " + $i18n(338, "in scatterplot selection")).then(function (data) {
                            if (data == null) {
                                return $q.when(null)
                            }
                            data.log = false
                            return MapService.add(data)
                        }))
                        promises.push(BiocacheService.newLayerAddFq(layer, outFq,
                            layer.name + " : " + $i18n(339, "out scatterplot selection")).then(function (data) {
                            if (data == null) {
                                return $q.when(null)
                            }
                            data.log = false
                            return MapService.add(data)
                        }))
                        return $q.all(promises)
                    }
                }
                return thiz
            }])
}(angular));