// 系统内置属性组件
var resourceHtml = '
';
//CSS·组件
Vue.component("css", {
props: ["src"],
template: resourceHtml,
created: function () {
var self = this;
//内联样式
if (this.$slots.default) {
var css = "';
//防止重复加载资源
if ($("head").html().indexOf(css) == -1) {
$("head").append(css);
}
//延迟
setTimeout(function () {
self.$parent.data.lazyLoadCss = true;
}, 10);
}
//外联样式
if (this.src) {
//防止重复加载资源
if ($("head").html().indexOf(this.src) == -1) {
var styleNode = createLink(this.src);
styleOnload(styleNode, function () {
self.$parent.data.lazyLoadCss = true;
});
} else {
//延迟
setTimeout(function () {
self.$parent.data.lazyLoadCss = true;
}, 10);
}
}
}
});
//JavaScript脚本·组件
Vue.component("js", {
props: ["src"],
template: resourceHtml,
created: function () {
var self = this;
//如果JS全部是内部代码,则延迟10毫秒
//如果JS有内部代码、也有外部JS,则以外部JS加载完成时间为准,同时延迟10毫秒,让外部JS中的组件进行加载
//如果JS全部是外部代码,则以外部JS加载完成时间为准,同时延迟10毫秒,让外部JS中的组件进行加载
//内联js
if (this.$slots.default) {
var script = "";
$("body").append(script);
//如果有外部JS,则以外部JS加载完成时间为准
if (this.$parent.data.outerCountJs == 0) {
setTimeout(function () {
self.$parent.data.lazyLoad = true;
}, 10);
}
}
//外联js
if (this.src) {
$.getScript(this.src, function (res) {
setTimeout(function () {
self.$parent.data.lazyLoad = true;
}, 10);
});
}
}
});
//[颜色]属性组件
var colorHtml = '';
/**
* 颜色组件:
* 参数说明:
* data:{ field : 字段名, value : 值(默认:#333333), 'label' : 文本标签(默认:文字颜色) }
*/
Vue.component("color", {
props: {
data: {
type: Object,
default: function () {
return {
field: "textColor",
label: "文字颜色",
defaultcolor: ""
};
}
},
},
data: function () {
return {
d: this.data,
class_name: "",
parent: (Object.keys(this.$parent.data).length) ? this.$parent.data : this.$parent.global,
};
},
created: function () {
this.bindColor();
},
watch:{
},
methods: {
init:function(){
if (this.data.field == undefined) this.data.field = "textColor";
if (this.data.label == undefined) this.data.label = "文字颜色";
if (this.data.value == undefined) this.data.value = "#333333";
if (this.data.defaultcolor == undefined) this.data.defaultcolor = "";
if (this.data.defaultvalue == undefined) this.data.defaultvalue = "";
if(this.data.global == 1) this.parent = this.$parent.global;
if (this.parent[this.data.field] == undefined) this.$set(this.parent, this.data.field, this.data.value);
else this.data.value = this.parent[this.data.field];
this.parent[this.data.field] = this.data.value;
this.d = this.data;
},
reset: function () {
try {
if(this.data.global == 1) this.parent = this.$parent.global;
this.parent[this.d.field] = this.d.defaultcolor;
} catch (e) {
console.log("color reset() ERROR:" + e.message);
}
},
bindColor() {
this.init();
this.class_name = "colorSelector_" + (this.data.field ? this.data.field : "textColor") + get_math_rant(10);
var class_name = "." + this.class_name;
var $self = this;
setColorPicker($self.data.value, this.class_name, function (hex) {
try {
if(hex) {
$self.parent[$self.d.field] = hex;
} else {
$self.parent[$self.d.field] = "";
}
} catch (e) {
console.log("color ERROR:" + e.message);
}
});
},
refreshData(){
// 刷新parent、data
// console.log("this.parent",this.parent);
if(this.parent.controller && this.parent.controller != vue.data[vue.currentIndex].controller){
// 数据发送变动
this.parent = vue.data[vue.currentIndex];
this.init();
// console.log("数据发送变动",this.d);
}
return this.parent;
}
},
template: colorHtml
});
/**
* 生成颜色选择器
* @param defaultColor
* @param obj
* @param callBack
*/
function setColorPicker(defaultColor, name, callBack) {
setTimeout(function () {
var obj = document.getElementById("picker");
var a = Colorpicker.create({
el: name,
color: defaultColor,
change: function (elem, hex) {
$(elem).find("div").css('background', hex);
if (callBack) callBack(hex);
}
});
if(defaultColor) $("#" + name).find("div").css('background', defaultColor);
}, 500);
}
//[图片上传]组件
var imageSecHtml = '';
imageSecHtml += '
';
imageSecHtml += '
';
imageSecHtml += '';
imageSecHtml += '更换图片';
// imageSecHtml += 'x';
imageSecHtml += '';
imageSecHtml += '
';
imageSecHtml += '+';
// imageSecHtml += 'x';
imageSecHtml += '';
imageSecHtml += '
';
imageSecHtml += '
';
/**
* 图片上传
* 参数说明:
* data:{ field : 字段名, value : 值(默认:14), 'label' : 文本标签(默认:文字大小) }
*/
Vue.component("img-sec-upload", {
template: imageSecHtml,
props: {
data: {
type: Object,
default: function () {
return {
data: {},
field: "imageUrl",
callback: null,
text: "添加图片"
};
}
},
condition: {
type: Boolean,
default: true
},
currIndex: {
type: Number,
default: 0
},
isShow:{
type: Boolean,
default: true
}
},
data: function () {
return {
myData: this.data,
upload : null,
id : get_math_rant(10),
// parent: (Object.keys(this.$parent.data).length) ? this.$parent.data : this.data,
};
},
watch: {
data: function (val, oldVal) {
if (val.field == undefined) val.field = oldVal.field;
if (val.text == undefined) val.text = "添加图片";
this.myData = val;
}
},
created: function () {
if (this.data.field == undefined) this.data.field = "imageUrl";
if (this.data.data[this.data.field] == undefined) this.$set(this.data.data, this.data.field, "");
if (this.data.text == undefined) this.data.text = "添加图片";
this.id = get_math_rant(10);
},
methods: {
del: function () {
// console.log(this.$parent.list)
// this.$parent.list.splice(this.currIndex,1)
this.data.data[this.data.field] = "";
},
//转换图片路径
changeImgUrl: function (url) {
if (url == null || url == "") return '';
else return url;
},
showImageDialog: function(elm, options) {
var self = this;
var ipt = $(elm).prev();
var val = ipt.val();
require(["util"], function (util) {
options = {
'class_extra': 'order_menu_icon',
'global': false,
'direct': true,
'multiple': false,
'fileSizeLimit': 10240
};
util.image(val, function (url) {
if (url.url) {
self.data.data[self.data.field] = url.url;
}
}, options);
})
}
}
});
//滑块属性组件 用于间距等
var sliderHtml = '';
Vue.component("slide", {
props: {
data: {
type: Object,
default: function () {
return {
field: "height",
label: "空白高度",
max: 100,
min: 0
};
}
}
},
created: function () {
if (this.data.label == undefined) this.data.label = "空白高度";
if (this.data.field == undefined) this.data.field = "height";
if (this.data.max == undefined) this.data.max = 100;
if (this.data.min == undefined) this.data.min = 0;
var _self = this;
setTimeout(function () {
layui.use('slider', function(){
var slider = layui.slider;
var ins = slider.render({
elem: '#'+_self.id,
max: _self.data.max,
min: _self.data.min,
tips: false,
theme: '#FF6A00',
value : _self.parent[_self.data.field],
change: function(value){
_self.parent[_self.data.field] = value;
}
});
});
},10);
},
watch: {
data: function (val, oldVal) {
if (val.field == undefined) val.field = oldVal.field;
if (val.label == undefined) val.label = "空白高度";
if (val.max == undefined) val.max = 100;
if (val.min == undefined) val.min = 0;
},
},
template: sliderHtml,
data: function () {
return {
id : "slide_" + get_math_rant(10),
parent: this.$parent.data,
};
}
});
//链接属性组件
var linkHtml = '';
/**
* 链接组件:
* 参数说明:data:当前链接对象, click:绑定事件,触发回调
*/
Vue.component("sel-link", {
//data:链接对象,callback:回调,refresh:刷新filed
props: {
data: {
type: Object,
default: function () {
return {
//链接对象
field: null,
//文本
label: "链接地址",
//批量操作对象
operation: [
{key: "system", method: '', label: "请选择链接"}
],
supportDiyView: "",
supportToApplet: 1
};
}
},
callback: null,
refresh: null,
},
template: linkHtml,
data: function () {
return {
myData: [this.data],//此处用数组的目的是触发变异方法,进行视图更新
};
},
created: function () {
if (this.data.supportToApplet == undefined) this.data.supportToApplet = 1;
if (this.data.supportDiyView == undefined) this.data.supportDiyView = "";
if (this.data.label == undefined) this.data.label = "链接地址";
if (this.data.operation == undefined) this.data.operation = [{ key : "system", method : '' , label: "请选择链接" }];
},
watch: {
data: function (val, oldVal) {
if (this.data.supportDiyView == undefined) this.data.supportDiyView = "";
if (this.data.label == undefined) this.data.label = "链接地址";
if (this.data.operation == undefined) this.data.operation = [{ key : "system", method : '' , label: "请选择链接" }];
this.myData[0].field= this.data.field;
},
refresh:function (val,oldVal) {
this.myData[0].field = val;
this.set(val);
}
},
methods: {
//设置链接地址
set: function (link) {
//由于Vue2.0是单向绑定的:子组件无法修改父组件,但是可以修改单个属性,循环遍历属性赋值
if (this.data.field) {
for (var k in link) {
this.data.field[k] = link[k];
}
}
//触发变异方法,进行视图更新
this.myData.push({});
this.myData.pop();
},
selected: function (key,method) {
var $self = this;
if(key == "system") {
//系统链接
select_link($self.myData[0].field,$self.myData[0].supportDiyView, function (data) {
$self.set(data);
if ($self.callback) $self.callback.call(this, data);
}, $self.data.supportToApplet);
}else {
//插件自定义链接
ns[method]($self.myData[0].field, $self.myData[0].supportDiyView, function (data) {
$self.set(data);
if ($self.callback) $self.callback.call(this, data);
}, $self.data.supportToApplet);
}
}
}
});
//[视频上传]组件
var videoSecHtml = '';
videoSecHtml += '
';
videoSecHtml += '';
videoSecHtml += '';
videoSecHtml += '更换视频';
videoSecHtml += 'x';
videoSecHtml += '';
videoSecHtml += '';
videoSecHtml += '+';
videoSecHtml += 'x';
videoSecHtml += '';
videoSecHtml += '
';
videoSecHtml += '
';
/**
* 视频上传
* 参数说明:
* data:{ field : 字段名, value : 值(默认:14), 'label' : 文本标签(默认:文字大小) }
*/
Vue.component("video-upload", {
template: videoSecHtml,
props: {
data: {
type: Object,
default: function () {
return {
data: {},
field: "videoUrl",
callback: null,
text: "添加视频"
};
}
},
condition: {
type: Boolean,
default: true
},
currIndex: {
type: Number,
default: 0
},
isShow:{
type: Boolean,
default: true
}
},
data: function () {
return {
myData: this.data,
upload : null,
id : get_math_rant(10),
};
},
watch: {
data: function (val, oldVal) {
if (val.field == undefined) val.field = oldVal.field;
if (val.text == undefined) val.text = "添加视频";
this.myData = val;
}
},
created: function () {
if (this.data.field == undefined) this.data.field = "videoUrl";
if (this.data.data[this.data.field] == undefined) this.$set(this.data.data, this.data.field, "");
if (this.data.text == undefined) this.data.text = "添加视频";
this.id = get_math_rant(10);
},
methods: {
del: function () {
this.data.data[this.data.field] = "";
},
//转换图片路径
changeVideoUrl: function (url) {
if (url == null || url == "") return '';
else return url;
},
showVideoDialog: function(elm, options) {
var self = this;
var ipt = $(elm).prev();
var val = ipt.val();
require(["util"], function (util) {
options = { type: 'video' };
util.audio(val, function (url) {
if (url.url) {
self.data.data[self.data.field] = url.url;
}
}, options);
})
}
}
});