var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        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 extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __rest = (this && this.__rest) || function (s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
};
import * as React from 'react';
import { createEditor } from '../Lib/createEditor';
import { Button, Form } from 'semantic-ui-react';
import { mapFieldDef } from './createCrudList';
import { EditorField } from '../Lib/EditorField';
export var createCrudEditor = function (itemDefinition) {
    var saveItem = itemDefinition.saveItem;
    var newItem = function () { return itemDefinition.defaultNewItem || {}; };
    var getItem = function (id) { return itemDefinition.getItemById(id).then(function (r) { return r; }); };
    var Editor = /** @class */ (function (_super) {
        __extends(Editor, _super);
        function Editor() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        Editor.prototype.render = function () {
            return <InnerEditor {...this.props}/>;
        };
        return Editor;
    }(React.Component));
    var InnerEditor = function (props) {
        var needToSave = props.needToSave, hasErrors = props.hasErrors, onSave = props.onSave, onQuit = props.onQuit, onCancel = props.onCancel;
        var StandardMenu = function (props) {
            return <>
        <Button disabled={needToSave || hasErrors} primary title="Go back" icon="chevron left" content="Back" onClick={onQuit}/>
        <Button disabled={!needToSave || hasErrors} primary icon="save" content="Save" onClick={onSave}/>
        <Button title="Cancel" secondary icon="cancel" content="Cancel" onClick={onCancel}/>
      </>;
        };
        var item = props.item, changeValue = props.changeValue, errors = props.errors;
        var StandardEditor = function (props) {
            return item && <Form>
        {itemDefinition.fields.map(mapFieldDef)
                .filter(function (fld) { return !fld.skipEditor; })
                .map(function (fld, ix) {
                var asLink = fld.asLink, rest = __rest(fld, ["asLink"]);
                return <EditorField key={fld.field} inline //DEFAULT
                 {...rest} item={item} field={fld.field} onChange={changeValue} errors={errors}/>;
            })}
      </Form> || <span />;
        };
        if (itemDefinition.render) {
            return itemDefinition.render(StandardMenu, StandardEditor, props);
        }
        else {
            return (<>
        <StandardMenu />
        <StandardEditor key="editor" {...props}/>
      </>);
        }
    };
    return createEditor(newItem, function (id) { return getItem(id); }, saveItem, {})(Editor);
};
