123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793 |
- /*
- * Name: skuTable
- * Author: cshaptx4869
- * Project: https://github.com/cshaptx4869/skuTable
- */
- layui.define(['jquery', 'form', 'upload', 'layer', 'sortable'], function (exports) {
- "use strict";
- var $ = layui.jquery,
- form = layui.form,
- upload = layui.upload,
- layer = layui.layer,
- sortable = layui.sortable,
- MOD_NAME = 'skuTable';
- //工具类
- class Util {
- static config = {
- shade: [0.02, '#000'],
- time: 2000
- };
- static msg = {
- // 成功消息
- success: function (msg, callback = null) {
- return layer.msg(msg, {
- icon: 1,
- shade: Util.config.shade,
- scrollbar: false,
- time: Util.config.time,
- shadeClose: true
- }, callback);
- },
- // 失败消息
- error: function (msg, callback = null) {
- return layer.msg(msg, {
- icon: 2,
- shade: Util.config.shade,
- scrollbar: false,
- time: Util.config.time,
- shadeClose: true
- }, callback);
- },
- // 警告消息框
- alert: function (msg, callback = null) {
- return layer.alert(msg, {end: callback, scrollbar: false});
- },
- // 对话框
- confirm: function (msg, ok, no) {
- var index = layer.confirm(msg, {title: '操作确认', btn: ['确认', '取消']}, function () {
- typeof ok === 'function' && ok.call(this);
- }, function () {
- typeof no === 'function' && no.call(this);
- Util.msg.close(index);
- });
- return index;
- },
- // 消息提示
- tips: function (msg, callback = null) {
- return layer.msg(msg, {
- time: Util.config.time,
- shade: Util.config.shade,
- end: callback,
- shadeClose: true
- });
- },
- // 加载中提示
- loading: function (msg, callback = null) {
- return msg ? layer.msg(msg, {
- icon: 16,
- scrollbar: false,
- shade: Util.config.shade,
- time: 0,
- end: callback
- }) : layer.load(2, {time: 0, scrollbar: false, shade: Util.config.shade, end: callback});
- },
- // 输入框
- prompt: function (option, callback = null) {
- return layer.prompt(option, callback);
- },
- // 关闭消息框
- close: function (index) {
- return layer.close(index);
- }
- };
- static request = {
- post: function (option, ok, no, ex) {
- return Util.request.ajax('post', option, ok, no, ex);
- },
- get: function (option, ok, no, ex) {
- return Util.request.ajax('get', option, ok, no, ex);
- },
- ajax: function (type, option, ok, no, ex) {
- type = type || 'get';
- option.url = option.url || '';
- option.data = option.data || {};
- option.statusName = option.statusName || 'code';
- option.statusCode = option.statusCode || 200;
- ok = ok || function (res) {
- };
- no = no || function (res) {
- var msg = res.msg == undefined ? '返回数据格式有误' : res.msg;
- Util.msg.error(msg);
- return false;
- };
- ex = ex || function (res) {
- };
- if (option.url == '') {
- Util.msg.error('请求地址不能为空');
- return false;
- }
- //var index = Util.msg.loading('加载中');
- $.ajax({
- url: option.url,
- type: type,
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
- dataType: "json",
- data: option.data,
- timeout: 60000,
- success: function (res) {
- //Util.msg.close(index);
- /*
- if (res[option.statusName] == option.statusCode) {
- return ok(res);
- } else {
- return no(res);
- }*/
- return ok(res);
- },
- error: function (xhr, textstatus, thrown) {
- Util.msg.error('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!', function () {
- ex(xhr);
- });
- return false;
- }
- });
- }
- };
- static tool = {
- uuid: function uuid(randomLength = 8) {
- return Number(Math.random().toString().substr(2, randomLength) + Date.now()).toString(36)
- }
- }
- }
- class SkuTable {
- options = {
- show : 1,//显示的选项,1是全显示,2是只显示单规格,3是只显示多规格
- isAttributeValue: 1, //规格类型 0统一规格 1多规格
- isAttributeElemId: 'fairy-is-attribute', //规格类型容器id
- specTableElemId: 'fairy-spec-table', //规格表容器id
- skuTableElemId: 'fairy-sku-table', //SKU表容器id
- rowspan: false, //是否开启SKU行合并,
- sortable: false, //规格拖拽排序
- skuIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjczN0RFNzU1MTk1RTExRTlBMEQ5OEEwMEM5NDNFOEE4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjczN0RFNzU2MTk1RTExRTlBMEQ5OEEwMEM5NDNFOEE4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzM3REU3NTMxOTVFMTFFOUEwRDk4QTAwQzk0M0U4QTgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzM3REU3NTQxOTVFMTFFOUEwRDk4QTAwQzk0M0U4QTgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5NHmJUAAAA+0lEQVR42pySPwsBYRzH7zk3KIP34CVIKSOrELLJdpuymyzew90kIwMZvACDsCldWZTFn5WQpPN5rlPXlXJ39en7/J57fn+fR9i2rYT5NNM0B2gC3n/6qHBQDMOwZNYg4LOQ3vcQld40/w6lC13Xbd/eHElC3G1JqL4DFWSNprz7BMpAFJ6YkW+jThaosuxAD/rY6R9lCmeq8IAmtKBA1A1OW9YjtIS9QvPYRZkcXo43EzqjF/mDQ5an7ALShTFk4eQOsgFTWeoNKl4nt68J0oYc1LHLbmtDp1IyLgPe4QCuMkIsyAWSuYbs5HD29DML8OTkHR9F2Ef+EWAAdwmkvBAtw94AAAAASUVORK5CYII=',
- uploadUrl: '',
- requestSuccessCode: 1, //请求成功返回状态码值
- specDataDelete: false, //开启规格删除
- productId: '', //商品id 配合specDataUrl和skuDataUrl使用
- specData: [], //规格数据
- specDataUrl: '', //优先级大于specData
- skuData: {}, //SKU数据
- skuDataUrl: '', //优先级大于skuDataUrl
- skuNameType: 0,
- skuNameDelimiter: '-',
- //统一规格配置项
- singleSkuTableConfig: {
- thead: [
- {title: '销售价(元)', icon: 'layui-icon-cols'},
- {title: '市场价(元)', icon: 'layui-icon-cols'},
- {title: '成本价(元)', icon: 'layui-icon-cols'},
- {title: '库存', icon: 'layui-icon-cols'},
- {title: '状态', icon: ''},
- ],
- tbody: [
- {type: 'input', field: 'price', value: '', verify: 'required|number', reqtext: '销售价不能为空'},
- {type: 'input', field: 'market_price', value: '0', verify: 'required|number', reqtext: '市场价不能为空'},
- {type: 'input', field: 'cost_price', value: '0', verify: 'required|number', reqtext: '成本价不能为空'},
- {type: 'input', field: 'stock', value: '0', verify: 'required|number', reqtext: '库存不能为空'},
- {type: 'select', field: 'status', option: [{key: '启用', value: '1'}, {key: '禁用', value: '0'}], verify: 'required', reqtext: '状态不能为空'},
- ]
- },
- //多规格配置项
- multipleSkuTableConfig: {
- thead: [
- {title: '图片', icon: ''},
- {title: '销售价(元)', icon: 'layui-icon-cols'},
- {title: '市场价(元)', icon: 'layui-icon-cols'},
- {title: '成本价(元)', icon: 'layui-icon-cols'},
- {title: '库存', icon: 'layui-icon-cols'},
- {title: '状态', icon: ''},
- ],
- tbody: [
- {type: 'image', field: 'picture', value: '', verify: '', reqtext: ''},
- {type: 'input', field: 'price', value: '', verify: 'required|number', reqtext: '销售价不能为空'},
- {type: 'input', field: 'market_price', value: '0', verify: 'required|number', reqtext: '市场价不能为空'},
- {type: 'input', field: 'cost_price', value: '0', verify: 'required|number', reqtext: '成本价不能为空'},
- {type: 'input', field: 'stock', value: '0', verify: 'required|number', reqtext: '库存不能为空'},
- {
- type: 'select',
- field: 'status',
- option: [{key: '启用', value: '1'}, {key: '禁用', value: '0'}],
- verify: '',
- reqtext: ''
- },
- ]
- }
- };
- constructor(options) {
- this.options = $.extend(this.options, options);
- if (this.options.skuDataUrl && this.options.productId) {
- Util.request.get({
- url: this.options.skuDataUrl,
- data: {
- product_id: this.options.productId
- },
- statusCode: this.options.requestSuccessCode
- }, (res) => {
- if (!res.data) {
- res.data = [];
- }
- this.options.skuData = res.data;
- this.css();
- this.render();
- this.listen();
- });
- } else {
- this.css();
- this.render();
- this.listen();
- }
- }
- css() {
- $('head').append(`<style>
- ${this.options.sortable ? `#${this.options.specTableElemId} tbody tr {cursor: move;transition:unset;-webkit-transition:unset;}` : ''}
- #${this.options.specTableElemId} tbody tr td:first-child > i.layui-icon-delete {
- margin-left:3px;
- }
- #${this.options.specTableElemId} tbody tr td:last-child > i.layui-icon-delete {
- margin-right:15px;
- margin-left:-7px;
- vertical-align: top;
- }
- #${this.options.specTableElemId} tbody tr td div.fairy-spec-value-create,
- #${this.options.specTableElemId} tfoot tr td div.fairy-spec-create {
- display: inline-block;
- color: #1E9FFF;
- vertical-align: middle;
- padding: 4px 6px;
- }
- #${this.options.specTableElemId} tfoot tr td div.layui-form-checkbox {
- margin-top: 0;
- }
- #${this.options.specTableElemId} tfoot tr td div.layui-form-checkbox > span{
- color: #1E9FFF;
- }
- #${this.options.skuTableElemId} tbody tr td > img.fairy-sku-img{
- width: 16px;
- height: 16px;
- padding: 6px;
- border: 1px solid #eceef1;
- vertical-align: middle;
- }
- #${this.options.specTableElemId} tbody tr td > i.layui-icon-delete,
- #${this.options.specTableElemId} tbody tr td div.fairy-spec-value-create,
- #${this.options.specTableElemId} tfoot tr td div.fairy-spec-create,
- #${this.options.skuTableElemId} thead tr th > i.layui-icon,
- #${this.options.skuTableElemId} tbody tr td > img.fairy-sku-img {
- cursor: pointer;
- }
- </style>`
- );
- }
- listen() {
- var that = this;
- /**
- * 监听规格类型选择
- */
- form.on('radio(fairy-is-attribute)', function (data) {
- that.options.isAttributeValue = data.value;
- that.render();
- });
- /**
- * 监听所选规格值的变化
- */
- form.on('checkbox(fairy-spec-filter)', function (data) {
- var specData = [];
- $.each($(`#${that.options.specTableElemId} tbody tr`), function () {
- var child = [];
- $.each($(this).find('input[type=checkbox]'), function () {
- child.push({id: $(this).val(), title: $(this).attr('title'), checked: $(this).is(':checked') ? '1' : '0'});
- });
- var specItem = {
- id: $(this).find('td').eq(0).data('spec-id'),
- title: $(this).find('td').eq(0).text(),
- child: child
- };
- specData.push(specItem);
- });
- that.options.specData = specData;
- //that.options.skuData = $.extend(that.options.skuData, that.getFormSkuData());
- that.resetRender(that.options.skuTableElemId);
- that.renderMultipleSkuTable();
- });
- /**
- * 监听批量赋值
- */
- $(document).on('click', `#${this.options.skuTableElemId} thead tr th i`, function () {
- var thisI = this;
- Util.msg.prompt({title: $(thisI).parent().text().trim() + '批量赋值'}, function (value, index, elem) {
- $.each($(`#${that.options.skuTableElemId} tbody tr`), function () {
- var index = that.options.rowspan ?
- $(thisI).parent().index() - ($(`#${that.options.skuTableElemId} thead th.fairy-spec-name`).length - $(this).children('td.fairy-spec-value').length) :
- $(thisI).parent().index();
- $(this).find('td').eq(index).children('input').val(value);
- });
- Util.msg.close(index);
- });
- });
- /**
- * 监听添加规格
- */
- $(document).on('click', `#${this.options.specTableElemId} .fairy-spec-create`, function () {
- layer.prompt({title: '添加规格'}, function (value, index, elem) {
- var specTitleArr = [];
- $.each(that.options.specData, function (k, v) {
- specTitleArr.push(v.title)
- })
- if (specTitleArr.includes(value)) {
- Util.msg.error('规格名已存在');
- } else {
- that.options.specData.push({id: Util.tool.uuid(), title: value, child: []});
- that.resetRender(that.options.specTableElemId);
- that.renderSpecTable();
- }
- Util.msg.close(index);
- });
- });
- /**
- * 监听添加规格值
- */
- $(document).on('click', `#${this.options.specTableElemId} .fairy-spec-value-create`, function () {
- var specId = $(this).parent('td').prev().data('spec-id');
- layer.prompt({title: '添加规格值'}, function (value, index, elem) {
- that.options.specData.forEach(function (v, i) {
- if (v.id == specId) {
- v.child.push({id: Util.tool.uuid(), title: value, checked: '0'});
- }
- });
- that.resetRender(that.options.specTableElemId);
- that.renderSpecTable();
- Util.msg.close(index);
- });
- });
- /**
- * 监听删除规格/规格值
- */
- $(document).on('click', `#${this.options.specTableElemId} i.layui-icon-delete`, function () {
- if (typeof $(this).attr('data-spec-index') !== "undefined") {
- that.options.specData.splice($(this).data('spec-index'), 1);
- that.resetRender([that.options.specTableElemId, that.options.skuTableElemId]);
- that.renderSpecTable();
- that.renderMultipleSkuTable();
- } else if (typeof $(this).attr('data-spec-value-index') !== "undefined") {
- var [i, ii] = $(this).data('spec-value-index').split('-');
- that.options.specData[i].child.splice(ii, 1);
- that.resetRender([that.options.specTableElemId, that.options.skuTableElemId]);
- that.renderSpecTable();
- that.renderMultipleSkuTable();
- }
- });
- /**
- * 监听规格表是否开启删除
- */
- form.on('checkbox(fairy-spec-delete-filter)', function (data) {
- that.options.specDataDelete = data.elem.checked;
- if (data.elem.checked) {
- $(`#${that.options.specTableElemId} tbody tr i.layui-icon-delete`).removeClass('layui-hide');
- } else {
- $(`#${that.options.specTableElemId} tbody tr i.layui-icon-delete`).addClass('layui-hide')
- }
- });
- /**
- * 图片移入放大/移出恢复
- */
- var imgLayerIndex = null;
- $(document).on('mouseenter', '.fairy-sku-img', function () {
- imgLayerIndex = layer.tips('<img src="' + $(this).attr('src') + '" style="max-width:200px;" alt=""/>', this, {
- tips: [2, 'rgba(41,41,41,.5)'],
- time: 0
- });
- }).on('mouseleave', '.fairy-sku-img', function () {
- layer.close(imgLayerIndex);
- })
- }
- /**
- * 渲染
- */
- render() {
- this.resetRender();
- this.renderIsAttribute(this.options.isAttributeValue);
- if (this.options.isAttributeValue == '2') {
- if (this.options.specDataUrl && this.options.productId) {
- Util.request.get({
- url: this.options.specDataUrl,
- productId: this.options.productId,
- statusCode: this.options.requestSuccessCode
- }, (res) => {
- if (!res.data) {
- res.data = [];
- }
- this.options.specData = res.data;
- this.renderSpecTable();
- this.renderMultipleSkuTable();
- });
- } else {
- this.renderSpecTable();
- this.renderMultipleSkuTable();
- }
- } else {
- this.renderSingleSkuTable();
- }
- }
- /**
- * 重新渲染
- * @param targets
- */
- resetRender(targets) {
- if (typeof targets === 'string') {
- $(`#${targets}`).parents('.dever_sku').replaceWith(`<div id="${targets}"></div>`);
- } else if ($.isArray(targets) && targets.length) {
- targets.forEach((item) => {
- $(`#${item}`).parents('.dever_sku').replaceWith(`<div id="${item}"></div>`);
- })
- } else {
- $(`#${this.options.isAttributeElemId}`).parents('.dever_sku').replaceWith(`<div id="${this.options.isAttributeElemId}"></div>`);
- $(`#${this.options.specTableElemId}`).parents('.dever_sku').replaceWith(`<div id="${this.options.specTableElemId}"></div>`);
- $(`#${this.options.skuTableElemId}`).parents('.dever_sku').replaceWith(`<div id="${this.options.skuTableElemId}"></div>`);
- }
- }
- /**
- * 渲染规格类型
- * @param checkedValue
- */
- renderIsAttribute(checkedValue) {
- var html = '';
- if (this.options.show == 1 || this.options.show == 2) {
- html += `<input type="radio" name="update_spec_type" title="单规格" value="1" lay-filter="fairy-is-attribute" ${checkedValue == '1' ? 'checked' : ''}>`;
- }
- if (this.options.show == 1 || this.options.show == 3) {
- html += `<input type="radio" name="update_spec_type" title="多规格" value="2" lay-filter="fairy-is-attribute" ${checkedValue == '2' ? 'checked' : ''}>`;
- }
-
- this.renderFormItem('规格类型', html, this.options.isAttributeElemId);
- }
- renderSingleSkuTable() {
- var that = this,
- table = `<table class="layui-table" id="${this.options.skuTableElemId}">`;
- table += '<thead>';
- table += '<tr>';
- this.options.singleSkuTableConfig.thead.forEach((item) => {
- table += `<th>${item.title}</th>`;
- });
- table += '</tr>';
- table += '</thead>';
- table += '<tbody>';
- table += '<tr>';
- that.options.singleSkuTableConfig.tbody.forEach(function (item) {
- switch (item.type) {
- case "select":
- table += '<td>';
- table += `<select style="width: 100%;" name="skus[-1][${item.field}]" lay-verify="${item.verify}" lay-reqtext="${item.reqtext}">`;
- item.option.forEach(function (o) {
- table += `<option value="${o.id}" ${that.options.skuData && that.options.skuData[-1] && that.options.skuData[-1][item.field] && that.options.skuData[item.field] == o.id ? 'selected' : ''}>${o.name}</option>`;
- });
- table += '</select>';
- table += '</td>';
- break;
- case "input":
- default:
- table += '<td>';
- table += `<input type="text" style="width: 100%;" name="skus[-1][${item.field}]" value="${that.options.skuData && that.options.skuData[-1] && that.options.skuData[-1][item.field] ? that.options.skuData[-1][item.field] : item.value}" class="layui-input" lay-verify="${item.verify}" lay-reqtext="${item.reqtext}">`;
- table += '</td>';
- break;
- }
- });
- table += '</tr>';
- table += '<tbody>';
- table += '</table>';
- this.renderFormItem('SKU', table, this.options.skuTableElemId);
- }
- /**
- * 渲染规格表
- */
- renderSpecTable() {
- var that = this,
- table = `<input type="hidden" name="spec" id="spec" value=""/><table class="layui-table" id="${this.options.specTableElemId}"><thead><tr><th>规格名</th><th>规格值</th></tr></thead><colgroup><col width="140"></colgroup><tbody>`;
- if (this.options.specData.length > 0) {
- $.each(this.options.specData, function (index, item) {
- table += that.options.sortable ? `<tr data-id="${item.id}">` : '<tr>';
- table += `<td data-spec-id="${item.id}">${item.title}<i class="layui-icon layui-icon-delete layui-anim layui-anim-scale ${that.options.specDataDelete ? '' : 'layui-hide'}" data-spec-index="${index}"></i></td>`;
- table += '<td>';
- if (item.child) {
- $.each(item.child, function (key, value) {
- table += `<input type="checkbox" title="${value.title}" lay-filter="fairy-spec-filter" value="${value.id}" ${value.checked == '1' ? 'checked' : ''} /><i class="layui-icon layui-icon-delete layui-anim layui-anim-scale ${that.options.specDataDelete ? '' : 'layui-hide'}" data-spec-value-index="${index}-${key}"></i> `;
- });
- }
-
- table += '<div class="fairy-spec-value-create"><i class="layui-icon layui-icon-addition"></i>添加规格值</div>'
- table += '</td>';
- table += '</tr>';
- });
- }
-
- table += '</tbody>';
- table += '<tfoot><tr><td colspan="2">';
- table += `<input type="checkbox" title="开启删除" lay-skin="primary" lay-filter="fairy-spec-delete-filter" ${that.options.specDataDelete ? 'checked' : ''}/>`;
- table += `<div class="fairy-spec-create"><i class="layui-icon layui-icon-addition"></i>添加规格</div>`;
- table += '</td></tr></tfoot>';
- table += '</table>';
- this.renderFormItem('商品规格', table, this.options.specTableElemId);
- if (this.options.specData.length > 0) {
- $('#spec').val(JSON.stringify(this.options.specData));
- }
- if (this.options.sortable) {
- /**
- * 拖拽
- */
- var sortableObj = sortable.create($(`#${this.options.specTableElemId} tbody`)[0], {
- animation: 1000,
- onEnd: (evt) => {
- //获取拖动后的排序
- var sortArr = sortableObj.toArray(),
- sortSpecData = [];
- this.options.specData.forEach((item) => {
- sortSpecData[sortArr.indexOf(String(item.id))] = item;
- });
- this.options.specData = sortSpecData;
- this.resetRender(that.options.skuTableElemId);
- this.renderMultipleSkuTable();
- },
- });
- }
- }
- /**
- * 渲染sku表
- */
- renderMultipleSkuTable() {
- var that = this, table = `<table class="layui-table" id="${this.options.skuTableElemId}">`;
- if ($(`#${this.options.specTableElemId} tbody input[type=checkbox]:checked`).length) {
- var prependThead = [], prependTbody = [];
- if (this.options.specData.length > 0) {
- $.each(this.options.specData, function (index, item) {
- var isShow = item.child.some(function (value, index, array) {
- return value.checked == '1' ? true : false;
- });
- if (isShow) {
- prependThead.push(item.title);
- var prependTbodyItem = [];
- if (item.child) {
- $.each(item.child, function (key, value) {
- if (value.checked == '1') {
- prependTbodyItem.push({id: value.id, title: value.title});
- }
- });
- }
-
- prependTbody.push(prependTbodyItem);
- }
- });
- $('#spec').val(JSON.stringify(that.options.specData));
- }
- table += '<colgroup>' + '<col width="70">'.repeat(prependThead.length + 1) + '</colgroup>';
- table += '<thead>';
- if (prependThead.length > 0) {
- var theadTr = '<tr>';
- theadTr += prependThead.map(function (t, i, a) {
- return '<th class="fairy-spec-name">' + t + '</th>';
- }).join('');
- this.options.multipleSkuTableConfig.thead.forEach(function (item) {
- theadTr += '<th>' + item.title + (item.icon ? ' <i class="layui-icon ' + item.icon + '"></i>' : '') + '</th>';
- });
- theadTr += '</tr>';
- table += theadTr;
- }
- table += '</thead>';
- if (this.options.rowspan) {
- var skuRowspanArr = [];
- prependTbody.forEach(function (v, i, a) {
- var num = 1, index = i;
- while (index < a.length - 1) {
- num *= a[index + 1].length;
- index++;
- }
- skuRowspanArr.push(num);
- });
- }
- var prependTbodyTrs = [];
- prependTbody.reduce(function (prev, cur, index, array) {
- var tmp = [];
- if (cur.length > 0) {
- prev.forEach(function (a) {
- cur.forEach(function (b) {
- tmp.push({id: a.id + that.options.skuNameDelimiter + b.id, title: a.title + that.options.skuNameDelimiter + b.title});
- })
- });
- } else {
- prev.forEach(function (a) {
- tmp.push({id: a.id, title: a.title});
- });
- }
-
- return tmp;
- }).forEach(function (item, index, array) {
- var tr = '<tr>';
- tr += item.title.split(that.options.skuNameDelimiter).map(function (t, i, a) {
- if (that.options.rowspan) {
- if (index % skuRowspanArr[i] === 0 && skuRowspanArr[i] > 1) {
- return '<td class="fairy-spec-value" rowspan="' + skuRowspanArr[i] + '">' + t + '</td>';
- } else if (skuRowspanArr[i] === 1) {
- return '<td class="fairy-spec-value">' + t + '</td>';
- } else {
- return '';
- }
- } else {
- return '<td>' + t + '</td>';
- }
- }).join('');
- that.options.multipleSkuTableConfig.tbody.forEach(function (c) {
- switch (c.type) {
- case "image":
- var skuValue = that.getSkuData(that.options.skuData, item, c);
- tr += '<td><input type="hidden" name="' + that.makeSkuName(item, c) + '" value="' + (skuValue ? skuValue : c.value) + '" lay-verify="' + c.verify + '" lay-reqtext="' + c.reqtext + '"><img class="fairy-sku-img" src="' + (skuValue ? skuValue : that.options.skuIcon) + '" alt="' + c.field + '图片"></td>';
- break;
- case "select":
- var skuValue = that.getSkuData(that.options.skuData, item, c);
- tr += '<td><select style="width: 100%;" name="' + that.makeSkuName(item, c) + '" lay-verify="' + c.verify + '" lay-reqtext="' + c.reqtext + '">';
- c.option.forEach(function (o) {
- tr += '<option value="' + o.id + '" ' + (skuValue && skuValue == o.id ? 'selected' : '') + '>' + o.name + '</option>';
- });
- tr += '</select></td>';
- break;
- case "input":
- default:
- var skuValue = that.getSkuData(that.options.skuData, item, c);
- tr += '<td><input style="width: 100%;" type="text" name="' + that.makeSkuName(item, c) + '" value="' + (skuValue ? skuValue : c.value) + '" class="layui-input" lay-verify="' + c.verify + '" lay-reqtext="' + c.reqtext + '"></td>';
- break;
- }
- });
- tr += '</tr>';
- tr && prependTbodyTrs.push(tr);
- });
- table += '<tbody>';
- if (prependTbodyTrs.length > 0) {
- table += prependTbodyTrs.join('');
- }
- table += '</tbody>';
- } else {
- table += '<thead></thead><tbody></tbody><tfoot><tr><td>请先选择规格值</td></tr></tfoot>';
- }
- table += '</table>';
- this.renderFormItem('SKU', table, this.options.skuTableElemId);
- //上传
- if (this.options.uploadUrl) {
- upload.render({
- elem: '.fairy-sku-img',
- url: this.options.uploadUrl,
- exts: 'png|jpg|ico|jpeg|gif',
- accept: 'images',
- acceptMime: 'image/*',
- multiple: false,
- xhr:xhrOnProgress,
- done: function (res) {
- if (res.status === that.options.requestSuccessCode) {
- var url = res.url;
- $(this.item).attr('src', url).prev().val(url);
- //Util.msg.success(res.msg);
- } else {
- var msg = res.msg == undefined ? '返回数据格式有误' : res.msg;
- Util.msg.error(msg);
- }
- return false;
- }
- });
- }
- }
- /**
- * 渲染表单项
- * @param label 标题
- * @param content 内容
- * @param target id
- * @param isRequired
- */
- renderFormItem(label, content, target, isRequired = true) {
- var html = '';
- html += '<div class="layui-form-item dever_sku">';
- html += `<label class="layui-form-label ${isRequired ? 'required' : ''}">${label.length ? label : ''}</label>`;
- html += '<div class="layui-input-block">';
- html += content;
- html += '</div>';
- html += '</div>';
- $(`#${target}`).replaceWith(html);
- form.render();
- }
- makeSkuName(sku, conf) {
- return 'skus[' + (this.options.skuNameType === 0 ? sku.id : sku.title) + '][' + conf.field + ']';
- }
- getSkuData(data, sku, conf) {
- if (data[(this.options.skuNameType === 0 ? sku.id : sku.title)]) {
- return data[(this.options.skuNameType === 0 ? sku.id : sku.title)][conf.field];
- } else {
- return false;
- }
- }
- getSpecData() {
- return this.options.specData;
- }
- getFormFilter() {
- var fariyForm = $('form.layui-form');
- if (!fariyForm.attr('lay-filter')) {
- fariyForm.attr('lay-filter', 'fairy-form-filter');
- }
- return fariyForm.attr('lay-filter');
- }
- getFormSkuData() {
- var skuData = {};
- console.info(this.getFormFilter(), form.val(this.getFormFilter()));
- $.each(form.val(this.getFormFilter()), function (key, value) {
- if (key.startsWith('skus')) {
- skuData[key] = value;
- }
- });
- return skuData;
- }
- }
- exports(MOD_NAME, {
- render: function (options) {
- return new SkuTable(options);
- }
- })
- });
|