| "use strict";
(self["webpackChunkatk"] = self["webpackChunkatk"] || []).push([["atk-vue-inline-edit"],{
/***/ "./src/vue-components/inline-edit.component.js":
/*!*****************************************************!*\
  !*** ./src/vue-components/inline-edit.component.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var external_jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! external/jquery */ "external/jquery");
/* harmony import */ var external_jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(external_jquery__WEBPACK_IMPORTED_MODULE_0__);
/**
 * Allow user to edit a db record inline and send
 * changes to server.
 *
 * Properties need for this component are:
 *
 * context: string, a jQuery selector where the 'loading' class will be apply by Fomantic-UI - default to the requesting element.
 * url:     string, the URL to call.
 * value:   array, array of value to send to server.
 */
const template = `
      <div :class="[options.inputCss, hasError ? 'error' : '' ]">
            <input
            :class="options.inlineCss"
            :name="options.fieldName"
            :type="options.fieldType"
            v-model="value"
            @keyup="onKeyup"
            @focus="onFocus"
            @blur="onBlur" /><i class="icon"></i>
      </div>`;
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
  name: 'atk-inline-edit',
  template: template,
  props: {
    url: String,
    initValue: String,
    saveOnBlur: Boolean,
    options: Object
  },
  data: function () {
    return {
      value: this.initValue,
      temp: this.initValue,
      hasError: false
    };
  },
  computed: {
    isDirty: function () {
      return this.temp !== this.value;
    }
  },
  methods: {
    onFocus: function () {
      if (this.hasError) {
        this.clearError();
      } else {
        this.temp = this.value;
      }
    },
    onKeyup: function (e) {
      const key = e.keyCode;
      this.clearError();
      if (key === 13) {
        this.onEnter(e);
      } else if (key === 27) {
        this.onEscape();
      }
    },
    onBlur: function () {
      if (this.isDirty && this.saveOnBlur) {
        this.update();
      } else {
        this.value = this.temp; // TODO will not save the value on 2nd edit and submit via enter
      }
    },
    onEscape: function () {
      this.value = this.temp;
      this.$el.querySelector('input').blur();
    },
    onEnter: function (e) {
      if (this.isDirty) {
        this.update();
      }
    },
    clearError: function () {
      this.hasError = false;
    },
    flashError: function () {
      let count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4;
      if (count === 0) {
        this.hasError = false;
        return;
      }
      this.hasError = !this.hasError;
      setTimeout(() => {
        this.flashError(count - 1);
      }, 300);
    },
    update: function () {
      const that = this;
      external_jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.$el).api({
        on: 'now',
        url: this.url,
        data: {
          value: this.value
        },
        method: 'POST',
        onComplete: function (r, e) {
          if (r.hasValidationError) {
            that.hasError = true;
          } else {
            that.temp = that.value;
          }
        }
      });
    }
  }
});
/***/ })
}]);
//# sourceMappingURL=atk-vue-inline-edit.js.map
 |