PHP Classes

File: resources/assets/js/atk-vue-multiline.js

Recommend this page to a friend!
  Classes of Francesco Danti   ATK Wordpress Plugin   resources/assets/js/atk-vue-multiline.js   Download  
File: resources/assets/js/atk-vue-multiline.js
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: ATK Wordpress Plugin
Components to build WordPress plugins
Author: By
Last change:
Date: 1 month ago
Size: 37,771 bytes
 

Contents

Class file image Download
"use strict"; (self["webpackChunkatk"] = self["webpackChunkatk"] || []).push([["atk-vue-multiline"],{ /***/ "./src/vue-components/multiline/multiline-body.component.js": /*!******************************************************************!*\ !*** ./src/vue-components/multiline/multiline-body.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 _multiline_row_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./multiline-row.component */ "./src/vue-components/multiline/multiline-row.component.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-multiline-body', template: ` <sui-table-body> <atk-multiline-row v-for="(row, idx) in rows" :key="row.__atkml" @onTabLastColumn="onTabLastColumn(idx)" :fields="fields" :rowId="row.__atkml" :isDeletable="isDeletableRow(row)" :rowValues="row" :error="getError(row.__atkml)"></atk-multiline-row> </sui-table-body> `, props: ['fieldDefs', 'rowData', 'deletables', 'errors'], data: function () { return { fields: this.fieldDefs }; }, created: function () {}, components: { 'atk-multiline-row': _multiline_row_component__WEBPACK_IMPORTED_MODULE_0__["default"] }, computed: { rows: function () { return this.rowData; } }, methods: { onTabLastColumn: function (idx) { if (idx + 1 === this.rowData.length) { this.$emit('onTabLastRow'); } }, isDeletableRow: function (row) { return this.deletables.indexOf(row.__atkml) > -1; }, getError: function (rowId) { if (rowId in this.errors) { return this.errors[rowId]; } return null; } } }); /***/ }), /***/ "./src/vue-components/multiline/multiline-cell.component.js": /*!******************************************************************!*\ !*** ./src/vue-components/multiline/multiline-cell.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 _multiline_readonly_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./multiline-readonly.component */ "./src/vue-components/multiline/multiline-readonly.component.js"); /* harmony import */ var _multiline_textarea_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./multiline-textarea.component */ "./src/vue-components/multiline/multiline-textarea.component.js"); /* harmony import */ var _share_atk_date_picker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../share/atk-date-picker */ "./src/vue-components/share/atk-date-picker.js"); /* harmony import */ var _share_atk_lookup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../share/atk-lookup */ "./src/vue-components/share/atk-lookup.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-multiline-cell', template: ` <component :is="getComponent()" :fluid="true" class="fluid" @input="onInput" @onChange="onChange" v-model="inputValue" :name="inputName" ref="cell" v-bind="getComponentProps()"></component> `, components: { 'atk-multiline-readonly': _multiline_readonly_component__WEBPACK_IMPORTED_MODULE_0__["default"], 'atk-multiline-textarea': _multiline_textarea_component__WEBPACK_IMPORTED_MODULE_1__["default"], 'atk-date-picker': _share_atk_date_picker__WEBPACK_IMPORTED_MODULE_2__["default"], 'atk-lookup': _share_atk_lookup__WEBPACK_IMPORTED_MODULE_3__["default"] }, props: ['cellData', 'fieldValue'], data: function () { return { fieldName: this.cellData.name, type: this.cellData.type, inputName: '-' + this.cellData.name, inputValue: this.fieldValue }; }, methods: { getComponent: function () { return this.cellData.definition.component; }, getComponentProps: function () { if (this.getComponent() === 'atk-multiline-readonly') { return { readOnlyValue: this.fieldValue }; } return this.cellData.definition.componentProps; }, onInput: function (value) { this.inputValue = this.getTypeValue(value); this.$emit('update-value', this.fieldName, this.inputValue); }, onChange: function (value) { this.onInput(value); }, /** * return input value based on their type. */ getTypeValue: function (value) { let r = value; if (this.type === 'boolean') { r = value.target.checked; } return r; } } }); /***/ }), /***/ "./src/vue-components/multiline/multiline-header.component.js": /*!********************************************************************!*\ !*** ./src/vue-components/multiline/multiline-header.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 core_js_modules_esnext_async_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.async-iterator.for-each.js */ "./node_modules/core-js/modules/esnext.async-iterator.for-each.js"); /* harmony import */ var core_js_modules_esnext_async_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_async_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "./node_modules/core-js/modules/esnext.iterator.constructor.js"); /* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ "./node_modules/core-js/modules/esnext.iterator.for-each.js"); /* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.async-iterator.filter.js */ "./node_modules/core-js/modules/esnext.async-iterator.filter.js"); /* harmony import */ var core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ "./node_modules/core-js/modules/esnext.iterator.filter.js"); /* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var atk__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! atk */ "./src/setup-atk.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-multiline-header', template: ` <sui-table-header> <sui-table-row v-if="hasError()"> <sui-table-cell :style="{ background: 'none' }"></sui-table-cell> <sui-table-cell :style="{ background: 'none' }" state="error" v-for="(column, idx) in columns" :key="idx" v-if="column.isVisible" :textAlign="getTextAlign(column)"><sui-icon name="attention" v-if="getErrorMsg(column)"></sui-icon>{{getErrorMsg(column)}}</sui-table-cell> </sui-table-row> <sui-table-row v-if="hasCaption()"> <sui-table-headerCell :colspan="getVisibleColumns()">{{caption}}</sui-table-headerCell> </sui-table-row> <sui-table-row :verticalAlign="'top'"> <sui-table-header-cell width="one" textAlign="center"><input type="checkbox" @input="onToggleDeleteAll" :checked.prop="isChecked" :indeterminate.prop="isIndeterminate" ref="check"></sui-table-header-cell> <sui-table-header-cell v-for="(column, idx) in columns" :key="idx" v-if="column.isVisible" :textAlign="getTextAlign(column)"> <div>{{column.caption}}</div> <div :style="{ position: 'absolute', top: '-22px' }" v-if="false"><sui-label pointing="below" basic color="red" v-if="getErrorMsg(column)">{{getErrorMsg(column)}}</sui-label></div> </sui-table-header-cell> </sui-table-row> </sui-table-header> `, props: ['fields', 'state', 'errors', 'caption'], data: function () { return { columns: this.fields, isDeleteAll: false }; }, methods: { onToggleDeleteAll: function () { this.$nextTick(() => { atk__WEBPACK_IMPORTED_MODULE_5__["default"].eventBus.emit(this.$root.$el.id + '-toggle-delete-all', { isOn: this.$refs.check.checked }); }); }, getTextAlign: function (column) { let align = 'left'; if (!column.isEditable) { switch (column.type) { case 'integer': case 'float': case 'atk4_money': align = 'right'; break; } } return align; }, getVisibleColumns: function () { let count = 1; // add deletable column; this.columns.forEach(field => { count = field.isVisible ? count + 1 : count; }); return count; }, hasError: function () { return Object.keys(this.errors).length > 0; }, hasCaption: function () { return this.caption; }, getErrorMsg: function (column) { if (this.hasError()) { const rows = Object.keys(this.errors); for (let i = 0; i < rows.length; i++) { const error = this.errors[rows[i]].filter(col => col.name === column.name); if (error.length > 0) { return error[0].msg; } } } return null; } }, computed: { isIndeterminate: function () { return this.state === 'indeterminate'; }, isChecked: function () { return this.state === 'on'; } } }); /***/ }), /***/ "./src/vue-components/multiline/multiline-readonly.component.js": /*!**********************************************************************!*\ !*** ./src/vue-components/multiline/multiline-readonly.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 */ }); /** * Simply display a readonly value. */ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ template: '<div>{{readOnlyValue}}</div>', name: 'atk-multiline-readonly', props: ['readOnlyValue'] }); /***/ }), /***/ "./src/vue-components/multiline/multiline-row.component.js": /*!*****************************************************************!*\ !*** ./src/vue-components/multiline/multiline-row.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 core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.async-iterator.filter.js */ "./node_modules/core-js/modules/esnext.async-iterator.filter.js"); /* harmony import */ var core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "./node_modules/core-js/modules/esnext.iterator.constructor.js"); /* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ "./node_modules/core-js/modules/esnext.iterator.filter.js"); /* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var atk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! atk */ "./src/setup-atk.js"); /* harmony import */ var _multiline_cell_component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./multiline-cell.component */ "./src/vue-components/multiline/multiline-cell.component.js"); /** * This will create a table td element using sui-table-cell. * The td element is created only if column as set isVisible = true; * The td element will add a multiline cell element. * the multiline cell will set it's own template component depending on the fieldType. * getValue */ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-multiline-row', template: ` <sui-table-row :verticalAlign="'middle'"> <sui-table-cell width="one" textAlign="center"><input type="checkbox" @input="onToggleDelete" v-model="toDelete"></sui-table-cell> <sui-table-cell @keydown.tab="onTab(idx)" v-for="(column, idx) in columns" :key="idx" :state="getErrorState(column)" v-bind="column.cellProps" :style="{ overflow: 'visible' }" v-if="column.isVisible"> <atk-multiline-cell :cellData="column" @update-value="onUpdateValue" :fieldValue="getValue(column)"></atk-multiline-cell> </sui-table-cell> </sui-table-row> `, props: ['fields', 'rowId', 'isDeletable', 'rowValues', 'error'], data: function () { return { columns: this.fields }; }, components: { 'atk-multiline-cell': _multiline_cell_component__WEBPACK_IMPORTED_MODULE_4__["default"] }, computed: { /** * toDelete is bind by v-model, thus we need a setter for * computed property to work. * When isDeletable is pass, will set checkbox according to it's value. */ toDelete: { get: function () { return this.isDeletable; }, set: function (v) { return v; } } }, methods: { onTab: function (idx) { if (idx === this.columns.filter(column => column.isEditable).length) { this.$emit('onTabLastColumn'); } }, getErrorState: function (column) { if (this.error) { const error = this.error.filter(e => column.name === e.name); if (error.length > 0) { return 'error'; } } return null; }, getColumnWidth: function (column) { return column.fieldOptions ? column.fieldOptions.width : null; }, onEdit: function () { this.isEditing = true; }, onToggleDelete: function (e) { atk__WEBPACK_IMPORTED_MODULE_3__["default"].eventBus.emit(this.$root.$el.id + '-toggle-delete', { rowId: this.rowId }); }, onUpdateValue: function (fieldName, value) { atk__WEBPACK_IMPORTED_MODULE_3__["default"].eventBus.emit(this.$root.$el.id + '-update-row', { rowId: this.rowId, fieldName: fieldName, value: value }); }, getValue: function (column) { return this.rowValues[column.name] || column.default; } } }); /***/ }), /***/ "./src/vue-components/multiline/multiline-textarea.component.js": /*!**********************************************************************!*\ !*** ./src/vue-components/multiline/multiline-textarea.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 default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-textarea', template: '<textarea v-model="text" @input="handleChange"></textarea>', props: { value: [String, Number] }, data: function () { return { text: this.value }; }, methods: { handleChange: function (event) { this.$emit('input', event.target.value); } } }); /***/ }), /***/ "./src/vue-components/multiline/multiline.component.js": /*!*************************************************************!*\ !*** ./src/vue-components/multiline/multiline.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 core_js_modules_esnext_async_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.async-iterator.for-each.js */ "./node_modules/core-js/modules/esnext.async-iterator.for-each.js"); /* harmony import */ var core_js_modules_esnext_async_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_async_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "./node_modules/core-js/modules/esnext.iterator.constructor.js"); /* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ "./node_modules/core-js/modules/esnext.iterator.for-each.js"); /* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.async-iterator.filter.js */ "./node_modules/core-js/modules/esnext.async-iterator.filter.js"); /* harmony import */ var core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_async_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ "./node_modules/core-js/modules/esnext.iterator.filter.js"); /* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var core_js_modules_esnext_async_iterator_find_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/esnext.async-iterator.find.js */ "./node_modules/core-js/modules/esnext.async-iterator.find.js"); /* harmony import */ var core_js_modules_esnext_async_iterator_find_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_async_iterator_find_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ "./node_modules/core-js/modules/esnext.iterator.find.js"); /* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var external_jquery__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! external/jquery */ "external/jquery"); /* harmony import */ var external_jquery__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(external_jquery__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var atk__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! atk */ "./src/setup-atk.js"); /* harmony import */ var _multiline_body_component__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./multiline-body.component */ "./src/vue-components/multiline/multiline-body.component.js"); /* harmony import */ var _multiline_header_component__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./multiline-header.component */ "./src/vue-components/multiline/multiline-header.component.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-multiline', template: `<div> <sui-table v-bind="tableProp"> <atk-multiline-header :fields="fieldData" :state="getMainToggleState" :errors="errors" :caption="caption"></atk-multiline-header> <atk-multiline-body @onTabLastRow="onTabLastRow" :fieldDefs="fieldData" :rowData="rowData" :deletables="getDeletables" :errors="errors"></atk-multiline-body> <sui-table-footer> <sui-table-row> <sui-table-header-cell /> <sui-table-header-cell :colspan="getSpan" textAlign="right"> <div is="sui-button-group"> <sui-button size="small" @click.stop.prevent="onAdd" type="button" icon="plus" ref="addBtn" :disabled="isLimitReached"></sui-button> <sui-button size="small" @click.stop.prevent="onDelete" type="button" icon="trash" :disabled="isDeleteDisable"></sui-button> </div> </sui-table-header-cell> </sui-table-row> </sui-table-footer> </sui-table> <div><input :form="form" :name="name" type="hidden" :value="value" ref="atkmlInput"></div> </div>`, props: { data: Object }, data: function () { const tableDefault = { basic: false, celled: false, collapsing: false, stackable: false, inverted: false }; return { form: this.data.formName, value: this.data.inputValue, name: this.data.inputName, // form input name where to set multiline content value. rowData: [], fieldData: this.data.fields || [], eventFields: this.data.eventFields || [], deletables: [], hasChangeCb: this.data.hasChangeCb, errors: {}, caption: this.data.caption || null, tableProp: { ...tableDefault, ...(this.data.tableProps || {}) } }; }, components: { 'atk-multiline-body': _multiline_body_component__WEBPACK_IMPORTED_MODULE_9__["default"], 'atk-multiline-header': _multiline_header_component__WEBPACK_IMPORTED_MODULE_10__["default"] }, mounted: function () { this.rowData = this.buildRowData(this.value ? this.value : '[]'); this.updateInputValue(); atk__WEBPACK_IMPORTED_MODULE_8__["default"].eventBus.on(this.$root.$el.id + '-update-row', payload => { this.onUpdate(payload.rowId, payload.fieldName, payload.value); }); atk__WEBPACK_IMPORTED_MODULE_8__["default"].eventBus.on(this.$root.$el.id + '-toggle-delete', payload => { const idx = this.deletables.indexOf(payload.rowId); if (idx > -1) { this.deletables.splice(idx, 1); } else { this.deletables.push(payload.rowId); } }); atk__WEBPACK_IMPORTED_MODULE_8__["default"].eventBus.on(this.$root.$el.id + '-toggle-delete-all', payload => { this.deletables = []; if (payload.isOn) { this.rowData.forEach(row => { this.deletables.push(row.__atkml); }); } }); atk__WEBPACK_IMPORTED_MODULE_8__["default"].eventBus.on(this.$root.$el.id + '-multiline-rows-error', payload => { this.errors = { ...payload.errors }; }); }, methods: { onTabLastRow: function () { if (!this.isLimitReached && this.data.addOnTab) { this.onAdd(); } }, onAdd: function () { const newRow = this.createRow(this.data.fields); this.rowData.push(newRow); this.updateInputValue(); if (this.data.afterAdd && typeof this.data.afterAdd === 'function') { this.data.afterAdd(JSON.parse(this.value)); } this.fetchExpression(newRow.__atkml); this.fetchOnChangeAction(); }, onDelete: function () { this.deletables.forEach(atkmlId => { this.deleteRow(atkmlId); }); this.deletables = []; this.updateInputValue(); this.fetchOnChangeAction(); if (this.data.afterDelete && typeof this.data.afterDelete === 'function') { this.data.afterDelete(JSON.parse(this.value)); } }, onUpdate: function (atkmlId, fieldName, value) { this.updateFieldInRow(atkmlId, fieldName, value); this.clearError(atkmlId, fieldName); this.updateInputValue(); if (!this.onUpdate.debouncedFx) { this.onUpdate.debouncedFx = atk__WEBPACK_IMPORTED_MODULE_8__["default"].createDebouncedFx(() => { this.onUpdate.debouncedFx = null; this.fetchExpression(atkmlId); this.fetchOnChangeAction(fieldName); }, 250); } this.onUpdate.debouncedFx.call(this); }, /** * Creates a new row of data and * set values to default if available. */ createRow: function (fields) { const row = {}; fields.forEach(field => { row[field.name] = field.default; }); row.__atkml = this.getUUID(); return row; }, deleteRow: function (atkmlId) { this.rowData.splice(this.rowData.findIndex(row => row.__atkml === atkmlId), 1); delete this.errors[atkmlId]; }, /** * Update the value of the field in rowData. */ updateFieldInRow: function (atkmlId, fieldName, value) { this.rowData.forEach(row => { if (row.__atkml === atkmlId) { row[fieldName] = value; } }); }, clearError: function (atkmlId, fieldName) { if (atkmlId in this.errors) { const errors = this.errors[atkmlId].filter(error => error.name !== fieldName); this.errors[atkmlId] = [...errors]; if (errors.length === 0) { delete this.errors[atkmlId]; } } }, /** * Update Multi-line Form input with all rowData values * as JSON string. */ updateInputValue: function () { this.value = JSON.stringify(this.rowData); }, /** * Build rowData from JSON string. */ buildRowData: function (jsonValue) { const rows = JSON.parse(jsonValue); rows.forEach(row => { row.__atkml = this.getUUID(); }); return rows; }, /** * Check if one of the field use expression. */ hasExpression: function () { return this.fieldData.filter(field => field.isExpr).length > 0; }, /** * Send on change action to server. * Use regular api call in order * for return js to be fully evaluated. */ fetchOnChangeAction: function () { let fieldName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (this.hasChangeCb && (fieldName === null || this.eventFields.indexOf(fieldName) > -1)) { external_jquery__WEBPACK_IMPORTED_MODULE_7___default()(this.$refs.addBtn.$el).api({ on: 'now', url: this.data.url, method: 'POST', data: { __atkml_action: 'on-change', rows: this.value } }); } }, postData: async function (row) { const data = { ...row }; const context = this.$refs.addBtn.$el; data.__atkml_action = 'update-row'; try { return await atk__WEBPACK_IMPORTED_MODULE_8__["default"].apiService.suiFetch(this.data.url, { data: data, method: 'POST', stateContext: context }); } catch (e) { console.error(e); } }, /** * Get expressions values from server. */ fetchExpression: async function (atkmlId) { if (this.hasExpression()) { const row = this.findRow(atkmlId); // server will return expression field - value if define. if (row) { const resp = await this.postData(row); if (resp.expressions) { const fields = Object.keys(resp.expressions); fields.forEach(field => { this.updateFieldInRow(atkmlId, field, resp.expressions[field]); }); this.updateInputValue(); } } } }, findRow: function (atkmlId) { return this.rowData.find(row => row.__atkml === atkmlId); }, getInputElement: function () { return this.$refs.atkmlInput; }, /** * UUID v4 generator. */ getUUID: function () { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { const r = Math.floor(Math.random() * 16); const v = c === 'x' ? r : r & (0x3 | 0x8); // eslint-disable-line no-bitwise return v.toString(16); }); } }, computed: { getSpan: function () { return this.fieldData.length - 1; }, getDeletables: function () { return this.deletables; }, /** * Return Delete all checkbox state base on * deletables entries. */ getMainToggleState: function () { let state = 'off'; if (this.deletables.length > 0) { if (this.deletables.length === this.rowData.length) { state = 'on'; } else { state = 'indeterminate'; } } return state; }, isDeleteDisable: function () { return !this.deletables.length > 0; }, isLimitReached: function () { if (this.data.rowLimit === 0) { return false; } return this.data.rowLimit < this.rowData.length + 1; } } }); /***/ }), /***/ "./src/vue-components/share/atk-date-picker.js": /*!*****************************************************!*\ !*** ./src/vue-components/share/atk-date-picker.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 */ }); /* global flatpickr */ // loaded after main JS /** * Wrapper for vue-flatpickr-component component. * https://github.com/ankurk91/vue-flatpickr-component * * Props: * config: Any of flatpickr options * * Will emit a dateChange event when date is set. */ const template = '<flatpickr-picker v-model="date" :config="flatPickr" @on-change="onChange"></flatpickr-picker>'; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-date-picker', template: template, props: ['config', 'value'], data: function () { const { useDefault, ...fpickr } = this.config; if (useDefault && !fpickr.defaultDate && !this.value) { fpickr.defaultDate = new Date(); } else if (this.value) { fpickr.defaultDate = this.value; } if (!fpickr.locale) { fpickr.locale = flatpickr.l10ns.default; } return { flatPickr: fpickr, date: null }; }, mounted: function () { // if value is not set but default date is, then emit proper string value to parent. if (!this.value && this.flatPickr.defaultDate) { if (this.flatPickr.defaultDate instanceof Date) { this.$emit('setDefault', flatpickr.formatDate(this.config.defaultDate, this.config.dateFormat)); } else { this.$emit('setDefault', this.flatPickr.defaultDate); } } }, methods: { onChange: function (date) { this.$emit('onChange', flatpickr.formatDate(date[0], this.flatPickr.dateFormat)); } } }); /***/ }), /***/ "./src/vue-components/share/atk-lookup.js": /*!************************************************!*\ !*** ./src/vue-components/share/atk-lookup.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 atk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! atk */ "./src/setup-atk.js"); /** * Wrapper for Fomantic-UI dropdown component into a lookup component. * * Props: * config: * url: the callback URL. Callback should return model data in form of { key: modelId, text: modelTitle, value: modelId } * reference: the reference field name associate with model or hasOne name. This field name will be sent along with URL callback parameter as of 'field=name'. * ui: the css class name to apply to dropdown. * Note: The remaining config object may contain any or sui-dropdown { props: value } pair. * * value: The selected value. * optionalValue: The initial list of options for the dropdown. */ const template = `<sui-dropdown ref="drop" v-bind="dropdownProps" :loading="isLoading" @input="onChange" @filtered="onFiltered" v-model="current" :class="css"></sui-dropdown>`; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ name: 'atk-lookup', template: template, props: ['config', 'value', 'optionalValue'], data: function () { const { url, reference, ui, ...suiDropdown } = this.config; suiDropdown.selection = true; return { dropdownProps: suiDropdown, current: this.value, url: url || null, css: [ui], isLoading: false, field: reference, query: '', temp: '' }; }, mounted: function () { if (this.optionalValue) { this.dropdownProps.options = Array.isArray(this.optionalValue) ? this.optionalValue : [this.optionalValue]; } }, methods: { onChange: function (value) { this.$emit('onChange', value); }, /** * Receive user input text for search. */ onFiltered: function (inputValue) { if (inputValue) { this.isLoading = true; } if (!this.onFiltered.debouncedFx) { this.onFiltered.debouncedFx = atk__WEBPACK_IMPORTED_MODULE_0__["default"].createDebouncedFx(() => { this.onFiltered.debouncedFx = null; if (this.query !== this.temp) { this.query = this.temp; if (this.query) { this.fetchItems(this.query); } } }, 250); } this.temp = inputValue; this.onFiltered.debouncedFx(this); }, /** * Fetch new data from server. */ fetchItems: async function (q) { try { const data = { atkVueLookupQuery: q, atkVueLookupField: this.field }; const response = await atk__WEBPACK_IMPORTED_MODULE_0__["default"].apiService.suiFetch(this.url, { method: 'get', data: data }); if (response.success) { this.dropdownProps.options = response.results; } } catch (e) { console.error(e); } finally { this.isLoading = false; } } } }); /***/ }) }]); //# sourceMappingURL=atk-vue-multiline.js.map