geo/layer.service.js

/**
 * @module layerService
 * @memberof app.geo
 * @description
 *
 * The `layerService` factory exposes layer functions from geoApi
 *
 */
angular
    .module('app.geo')
    .factory('layerService', layerService);

function layerService($q, $interval, gapiService) {
    const service = {
        getLayer: getLayer
    };

    // config part to use to extend missing info from model
    const configExtend = {
        state: {
            opacity: 1,
            visibility: true,
            boundingBox: false,
            query: true,
            snapshot: false,
            userAdded: false
        },
        controls: [
            'opacity',
            'visibility',
            'boundingBox',
            'query',
            'snapshot',
            'metadata',
            'boundaryZoom',
            'refresh',
            'reload',
            'remove',
            'settings',
            'data',
            'symbology',
            'interval'
        ],
        disabledControls: [],
        userDisabledControls: []
    };

    return service;

    /***/

    function getLayer(model, featClass) {
        let config = $.extend(model, configExtend);

        return $q((resolve, reject) => {
            // get the layer record
            const layer = (model.layerType === 'esriFeature') ?
                gapiService.gapi.layer.createFeatureRecord(config) : gapiService.gapi.layer.createDynamicRecord(config);

            // wait for layer to load
            let to = $interval(() => {
                if (layer.state === 'rv-loaded') {
                    $interval.cancel(to);
                    // get featureClass to query then get fields
                    const index = (featClass === -1) ? layer._defaultFC : featClass;
                    layer._featClasses[index].getLayerData().then(data => { resolve(data) });
                } else if (layer.state === 'rv-error') {
                    reject('Not able to connect to layer');
                }
            }, 500);
        });
    }
}