"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
var _ = require("lodash");
var core_1 = require("@jsonforms/core");
var core_2 = require("@angular/core");
var ionic_angular_1 = require("ionic-angular");
var category_1 = require("./category/category");
var store_1 = require("@angular-redux/store");
var JsonFormsIonicLayout_1 = require("../JsonFormsIonicLayout");
var CategorizationLayoutRenderer = /** @class */ (function (_super) {
    __extends(CategorizationLayoutRenderer, _super);
    function CategorizationLayoutRenderer(ngRedux) {
        return _super.call(this, ngRedux) || this;
    }
    CategorizationLayoutRenderer.prototype.ngOnInit = function () {
        var _this = this;
        this.categories = this.getOwnProps().uischema.elements;
        var firstCategory = this.getOwnProps().uischema.elements[0];
        this.label = firstCategory.label;
        var state$ = this.connectLayoutToJsonForms(this.ngRedux, this.getOwnProps());
        this.subscription = state$.subscribe(function (state) {
            _this.stateProps = state;
        });
        this.renderCategory(firstCategory);
    };
    CategorizationLayoutRenderer.prototype.renderCategory = function (category) {
        this.nav.setRoot(category_1.CategoryRenderer, { category: category });
        this.label = category.label;
    };
    CategorizationLayoutRenderer.prototype.canGoBack = function () {
        // FIXME: addToStack allows explicit control when to display the 'Go back' button,
        // FIXME: is there a better way to control this?
        var count = this.nav.getViews().reduce(function (acc, view) { return acc + (view.data.addToNavStack ? 1 : 0); }, 0);
        return count > 1;
    };
    CategorizationLayoutRenderer.prototype.goBack = function () {
        return this.nav.pop();
    };
    __decorate([
        core_2.ViewChild('categoryContent'),
        __metadata("design:type", ionic_angular_1.NavController)
    ], CategorizationLayoutRenderer.prototype, "nav", void 0);
    CategorizationLayoutRenderer = __decorate([
        core_2.Component({
            selector: 'jsonforms-categorization-layout',
            template: "\n      <ion-header>\n          <ion-navbar>\n              <button ion-button menuToggle=\"categorization-menu\">\n                  <ion-icon name=\"menu\"></ion-icon>\n              </button>\n              <ion-title>\n                  {{label}}\n              </ion-title>\n              <ion-buttons end>\n                  <button ion-button *ngIf=\"canGoBack()\" (click)=\"goBack()\">\n                      Go Back\n                  </button>\n              </ion-buttons>\n          </ion-navbar>\n      </ion-header>\n\n\n      <ion-content>\n          <!-- LHS menu -->\n          <ion-menu side=\"left\" [content]=\"categoryContent\" id=\"categorization-menu\">\n              <ion-content>\n                  <ion-list>\n                      <button ion-item\n                              *ngFor=\"let category of categories\"\n                              (click)=\"renderCategory(category)\">\n                          {{category.label}}\n                      </button>\n                  </ion-list>\n              </ion-content>\n          </ion-menu>\n          <ion-nav #categoryContent></ion-nav>\n      </ion-content>\n  "
        }),
        __metadata("design:paramtypes", [store_1.NgRedux])
    ], CategorizationLayoutRenderer);
    return CategorizationLayoutRenderer;
}(JsonFormsIonicLayout_1.JsonFormsIonicLayout));
exports.CategorizationLayoutRenderer = CategorizationLayoutRenderer;
exports.isCategorization = function (category) {
    return category.type === 'Categorization';
};
exports.categorizationTester = core_1.rankWith(1, core_1.and(core_1.uiTypeIs('Categorization'), function (uischema) {
    var hasCategory = function (categorization) {
        if (_.isEmpty(categorization.elements)) {
            return false;
        }
        // all children of the categorization have to be categories
        return categorization.elements
            .map(function (elem) { return exports.isCategorization(elem) ? hasCategory(elem) : elem.type === 'Category'; })
            .reduce(function (prev, curr) { return prev && curr; }, true);
    };
    return hasCategory(uischema);
}));
//# sourceMappingURL=categorization-layout.js.map