"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GridDataSource = void 0;
var breeze = __importStar(require("breeze-client"));
var predicate_utils_1 = require("./predicate-utils");
var aurelia_framework_1 = require("aurelia-framework");
var GridDataSource = (function () {
    function GridDataSource(entityTypeName, metadataStore) {
        this.entityTypeName = entityTypeName;
        this.metadataStore = metadataStore;
        this.filterText = "";
        this.predicates = null;
        this.predicateUtils = aurelia_framework_1.Container.instance.get(predicate_utils_1.PredicateUtils);
    }
    Object.defineProperty(GridDataSource.prototype, "entityType", {
        get: function () {
            return this.metadataStore.getEntityType(this.entityTypeName);
        },
        enumerable: false,
        configurable: true
    });
    GridDataSource.prototype.getRows = function (params) {
        var _this = this;
        if (this.getPredicatesFunction != null) {
            this.predicates = this.getPredicatesFunction(this.filterText);
        }
        var promise = this.getDataFunction(params, this.expands, this.quickFilter, this.queryCriteria, this.queryParameters);
        promise
            .then(function (results) { return __awaiter(_this, void 0, void 0, function () {
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        if (!(this.onSuccessGetRowsCallback != null)) return [3, 2];
                        _a = results;
                        return [4, this.onSuccessGetRowsCallback(results.results, results.fullCount)];
                    case 1:
                        _a.results = _b.sent();
                        _b.label = 2;
                    case 2:
                        params.successCallback(results.results, results.fullCount);
                        return [2];
                }
            });
        }); })
            .catch(function (reason) { return params.failCallback(); });
        return promise;
    };
    GridDataSource.prototype.getProp = function (property) {
        return this.getPropHelper(property.split('.'), this.entityType);
    };
    GridDataSource.prototype.getPropHelper = function (property, entityType) {
        if (property.length > 1) {
            var propName_1 = property.shift();
            if (entityType.hasOwnProperty('navigationProperties')) {
                var navProp = entityType.navigationProperties.find(function (navProp) { return navProp.name == propName_1; });
                if (navProp) {
                    return this.getPropHelper(property, navProp.entityType);
                }
            }
            if (entityType.hasOwnProperty('complexProperties')) {
                var complexProp = entityType.complexProperties.find(function (complexProp) { return complexProp.name == propName_1; });
                if (complexProp && complexProp.dataType.hasOwnProperty('dataProperties')) {
                    return this.getPropHelper(property, complexProp.dataType);
                }
            }
            return null;
        }
        return entityType.dataProperties.find(function (dataProp) { return dataProp.name == property[0]; });
    };
    GridDataSource.prototype.getRowsForSelect2 = function (params, filterText, filterProperties) {
        this.predicates = this.getPredicatesForSelect2(filterText, filterProperties);
        var promise = this.getDataFunction(params, this.expands, this.quickFilter, this.queryCriteria, this.getQueryParametersForSelect2());
        promise
            .then(function (results) {
            params.successCallback(results.results, results.fullCount);
        })
            .catch(function (reason) { return params.failCallback(); });
        return promise;
    };
    GridDataSource.prototype.getPredicatesForSelect2 = function (filterText, filterProperties) {
        var _this = this;
        var predicates = null;
        if (filterText != null && filterText.length > 0 && filterProperties != null && filterProperties.length > 0) {
            filterProperties.forEach(function (fp) {
                var _a, _b;
                var prop = _this.getProp(fp);
                var isNumericProp = true === (prop === null || prop === void 0 ? void 0 : prop.dataType.isNumeric);
                var queryOp = isNumericProp ? breeze.FilterQueryOp.Equals : breeze.FilterQueryOp.Contains;
                var tempPredicates = _this.predicateUtils.getPredicates(filterText, fp, prop === null || prop === void 0 ? void 0 : prop.dataType, queryOp);
                if (tempPredicates.length > 0) {
                    predicates = predicates == null ? (_a = breeze.Predicate).and.apply(_a, __spreadArray([], __read(tempPredicates), false)) : predicates.or((_b = breeze.Predicate).and.apply(_b, __spreadArray([], __read(tempPredicates), false)));
                }
            });
        }
        var custom = null;
        if (this.customSelect2Predicates != null) {
            custom = this.customSelect2Predicates(filterText, filterProperties);
        }
        return predicates && custom ? predicates.and(custom) : (predicates || custom);
    };
    GridDataSource.prototype.getQueryParametersForSelect2 = function () {
        return Object.assign({}, this.queryParameters, this.customSelect2QueryParameters ? this.customSelect2QueryParameters() : {});
    };
    return GridDataSource;
}());
exports.GridDataSource = GridDataSource;

//# sourceMappingURL=data-source.js.map
