@form-create/component-elm-group
Version:
@form-create/element-ui 内置组件
426 lines (425 loc) • 14 kB
JavaScript
/*!
* FormCreate 低代码表单渲染器
* @form-create/component-elm-group v2.6.3
* (c) 2018-2024 xaboy
* Github https://github.com/xaboy/form-create
* Site https://form-create.com/
* Released under the MIT License.
*/
(function(){"use strict";try{if(typeof document!="undefined"){var o=document.createElement("style");o.appendChild(document.createTextNode('._fc-group{display:flex;min-height:42px;justify-content:center;flex-direction:column}._fc-group-disabled ._fc-group-btn,._fc-group-disabled ._fc-group-add{cursor:not-allowed}._fc-group-handle{display:flex;flex-direction:row;position:absolute;bottom:-15px;right:30px;border-radius:15px;border:1px dashed #d9d9d9;padding:3px 8px;background-color:#fff}._fc-group-btn{cursor:pointer}._fc-group-idx{position:absolute;bottom:-15px;left:10px;width:30px;height:30px;display:flex;align-items:center;justify-content:center;background:#eee;border-radius:15px;font-weight:700}._fc-group-handle ._fc-group-btn+._fc-group-btn{margin-left:7px}._fc-group-container{position:relative;display:flex;flex-direction:column;border:1px dashed #d9d9d9;padding:20px 20px 25px;margin:5px 5px 25px;border-radius:5px}._fc-group-arrow{position:relative;width:20px;height:20px}._fc-group-arrow:before{content:"";position:absolute;top:8px;left:5px;width:9px;height:9px;border-left:2px solid #999;border-top:2px solid #999}._fc-group-arrow:before{transform:rotate(45deg)}._fc-group-arrow._fc-group-down{transform:rotate(180deg)}._fc-group-plus-minus{width:20px;height:20px;position:relative;cursor:pointer}._fc-group-plus-minus:before,._fc-group-plus-minus:after{content:"";position:absolute;top:50%;left:50%;width:60%;height:2px;background-color:#409eff;transform:translate(-50%,-50%)}._fc-group-plus-minus:before{transform:translate(-50%,-50%) rotate(90deg)}._fc-group-plus-minus._fc-group-minus:before{display:none}._fc-group-plus-minus._fc-group-minus:after{background-color:#f56c6c}._fc-group-add{cursor:pointer;width:25px;height:25px;border:1px solid rgb(64 158 255 / 50%);border-radius:15px}._fc-group-add._fc-group-plus-minus:before,._fc-group-add._fc-group-plus-minus:after{width:50%}')),document.head.appendChild(o)}}catch(r){console.error("vite-plugin-css-injected-by-js",r)}})();
var O = Object.defineProperty;
var g = Object.getOwnPropertySymbols;
var R = Object.prototype.hasOwnProperty, j = Object.prototype.propertyIsEnumerable;
var _ = (e, t, r) => t in e ? O(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r, d = (e, t) => {
for (var r in t || (t = {}))
R.call(t, r) && _(e, r, t[r]);
if (g)
for (var r of g(t))
j.call(t, r) && _(e, r, t[r]);
return e;
};
import A from "vue";
function V(e) {
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
}
function p() {
return p = Object.assign ? Object.assign.bind() : function(e) {
for (var t, r = 1; r < arguments.length; r++) for (var s in t = arguments[r], t) Object.prototype.hasOwnProperty.call(t, s) && (e[s] = t[s]);
return e;
}, p.apply(this, arguments);
}
var S = ["attrs", "props", "domProps"], B = ["class", "style", "directives"], D = ["on", "nativeOn"], E = function(e) {
return e.reduce(function(t, r) {
for (var s in r) if (!t[s]) t[s] = r[s];
else if (S.indexOf(s) !== -1) t[s] = p({}, t[s], r[s]);
else if (B.indexOf(s) !== -1) {
var i = t[s] instanceof Array ? t[s] : [t[s]], n = r[s] instanceof Array ? r[s] : [r[s]];
t[s] = [].concat(i, n);
} else if (D.indexOf(s) !== -1)
for (var o in r[s]) if (t[s][o]) {
var l = t[s][o] instanceof Array ? t[s][o] : [t[s][o]], f = r[s][o] instanceof Array ? r[s][o] : [r[s][o]];
t[s][o] = [].concat(l, f);
} else t[s][o] = r[s][o];
else if (s === "hook") for (var u in r[s]) t[s][u] = t[s][u] ? I(t[s][u], r[s][u]) : r[s][u];
else t[s] = r[s];
return t;
}, {});
}, I = function(e, t) {
return function() {
e && e.apply(this, arguments), t && t.apply(this, arguments);
};
}, b = E;
const k = /* @__PURE__ */ V(b), a = {
type(e, t) {
return Object.prototype.toString.call(e) === "[object " + t + "]";
},
Undef(e) {
return e == null;
},
Element(e) {
return typeof e == "object" && e !== null && e.nodeType === 1 && !a.Object(e);
},
trueArray(e) {
return Array.isArray(e) && e.length > 0;
},
Function(e) {
const t = this.getType(e);
return t === "Function" || t === "AsyncFunction";
},
getType(e) {
const t = Object.prototype.toString.call(e);
return /^\[object (.*)\]$/.exec(t)[1];
},
empty(e) {
return e == null || Array.isArray(e) && Array.isArray(e) && !e.length ? !0 : typeof e == "string" && !e;
}
};
["Date", "Object", "String", "Boolean", "Array", "Number"].forEach((e) => {
a[e] = function(t) {
return a.type(t, e);
};
});
function w(e, t) {
return {}.hasOwnProperty.call(e, t);
}
function h(e, t, r) {
A.set(e, t, r);
}
function m(e, t = {}, r) {
let s = !1;
for (let i in t)
if (Object.prototype.hasOwnProperty.call(t, i)) {
let n = t[i];
if ((s = Array.isArray(n)) || a.Object(n)) {
let o = e[i] === void 0;
if (s)
s = !1, o && h(e, i, []);
else if (n._clone && r !== void 0) {
h(e, i, n._clone());
continue;
} else
o && h(e, i, {});
e[i] = m(e[i], n, r);
} else
h(e, i, n), a.Undef(n) || (a.Undef(n.__json) || (e[i].__json = n.__json), a.Undef(n.__origin) || (e[i].__origin = n.__origin));
}
return e;
}
function v(e) {
return m({}, { value: e }).value;
}
const x = Object.assign || function(e) {
for (let t, r = 1; r < arguments.length; r++)
for (let s in t = arguments[r], t)
Object.prototype.hasOwnProperty.call(t, s) && h(e, s, t[s]);
return e;
};
function F() {
return x.apply(this, arguments);
}
const P = "fcGroup", M = {
name: P,
props: {
field: String,
rule: [Array, Object],
rules: Array,
expand: Number,
options: Object,
formCreateInject: {
type: Object,
required: !0
},
button: {
type: Boolean,
default: !0
},
max: {
type: Number,
default: 0
},
min: {
type: Number,
default: 0
},
value: {
type: Array,
default: () => []
},
sortBtn: {
type: Boolean,
default: !0
},
defaultValue: Object,
disabled: {
type: Boolean,
default: !1
},
syncDisabled: {
type: Boolean,
default: !0
},
onBeforeRemove: {
type: Function,
default: () => {
}
},
onBeforeAdd: {
type: Function,
default: () => {
}
},
parse: Function
},
data() {
return {
len: 0,
cacheRule: {},
cacheValue: {},
sort: [],
type: void 0
};
},
computed: {
formRule() {
return this.rules ? this.rules : this.rule ? Array.isArray(this.rule) ? this.rule : [this.rule] : [];
}
},
watch: {
cacheRule: {
handler(e) {
this.sort = Object.keys(e);
},
immediate: !0
},
formRule: {
handler(e, t) {
Object.keys(this.cacheRule).forEach((r) => {
const s = this.cacheRule[r];
if (s.$f) {
const i = s.$f.formData();
if (e === t)
s.$f.deferSyncValue(() => {
m(s.rule, e), s.$f.setValue(i);
}, !0);
else {
const n = s.$f.formData();
s.$f.once("reloading", () => {
s.$f.setValue(n);
}), s.rule = v(e);
}
}
});
},
deep: !0
},
expand(e) {
let t = e - this.value.length;
t > 0 && this.expandRule(t);
},
value(e, t) {
e = e || [];
let r = this.sort, s = r.length, i = s - e.length;
if (i < 0) {
for (let n = i; n < 0; n++)
this.addRule(e.length + n);
this.sort = Object.keys(this.cacheRule);
for (let n = 0; n < s; n++)
this.setValue(r[n], e[n]);
} else {
if (i > 0) {
for (let n = 0; n < i; n++)
this.removeRule(r[s - n - 1]);
this.sort = Object.keys(this.cacheRule);
}
e.forEach((n, o) => {
this.setValue(r[o], e[o]);
});
}
}
},
methods: {
_value(e) {
return e && w(e, this.field) ? e[this.field] : e;
},
cache(e, t) {
this.cacheValue[e] = JSON.stringify(t);
},
input(e) {
this.$emit("input", e), this.$emit("change", e);
},
formData(e, t) {
const r = this.cacheRule, s = this.sort;
if (s.filter((n) => r[n].$f).length !== s.length)
return;
const i = s.map((n) => {
const o = e === n ? t : d({}, this.cacheRule[n].$f.form), l = this.field ? o[this.field] || null : o;
return this.cache(n, l), l;
});
this.input(i);
},
setValue(e, t) {
const r = this.field, s = this.cacheRule[e].$f;
r && (t = {
[r]: this._value(t)
}), this.cacheValue[e] !== JSON.stringify(r ? t[r] : t) && (this.cache(e, t), s && s.coverValue(t || {}));
},
addRule(e, t) {
const r = this.formCreateInject.form.copyRules(this.formRule), s = this.options ? d({}, this.options) : {
submitBtn: !1,
resetBtn: !1
};
if (this.defaultValue) {
s.formData || (s.formData = {});
const i = v(this.defaultValue);
F(s.formData, this.field ? {
[this.field]: i
} : i);
}
this.parse && this.parse({
rule: r,
options: s,
index: this.sort.length
}), this.$set(this.cacheRule, ++this.len, {
rule: r,
options: s
}), t && this.$nextTick(() => this.$emit("add", r, Object.keys(this.cacheRule).length - 1));
},
add$f(e, t, r) {
this.cacheRule[t].$f = r, this.$nextTick(() => {
this.$emit("itemMounted", r, Object.keys(this.cacheRule).indexOf(t));
});
},
removeRule(e, t) {
const r = Object.keys(this.cacheRule).indexOf(e);
this.$delete(this.cacheRule, e), this.$delete(this.cacheValue, e), t && this.$nextTick(() => this.$emit("remove", r));
},
add(e) {
this.disabled || this.onBeforeAdd(this.value) === !1 || this.addRule(e, !0);
},
del(e, t) {
if (this.disabled || this.onBeforeRemove(this.value, e) === !1)
return;
this.removeRule(t, !0);
const r = [...this.value];
r.splice(e, 1), this.input(r);
},
addIcon(e) {
const t = this.$createElement;
return t("div", {
class: "_fc-group-btn _fc-group-plus-minus",
on: {
click: this.add
}
});
},
delIcon(e, t) {
const r = this.$createElement;
return r("div", {
class: "_fc-group-btn _fc-group-plus-minus _fc-group-minus",
on: {
click: () => this.del(e, t)
}
});
},
sortUpIcon(e) {
const t = this.$createElement;
return t("div", {
class: "_fc-group-btn _fc-group-arrow _fc-group-up",
on: {
click: () => this.changeSort(e, -1)
}
});
},
sortDownIcon(e) {
const t = this.$createElement;
return t("div", {
class: "_fc-group-btn _fc-group-arrow _fc-group-down",
on: {
click: () => this.changeSort(e, 1)
}
});
},
changeSort(e, t) {
const r = this.sort[e];
this.$set(this.sort, e, this.sort[e + t]), this.sort[e + t] = r, this.formData(0);
},
makeIcon(e, t, r) {
if (this.$scopedSlots.button)
return this.$scopedSlots.button({
total: e,
index: t,
vm: this,
key: r,
del: () => this.del(t, r),
add: this.add
});
const s = [];
return (!this.max || e < this.max) && e === t + 1 && s.push(this.addIcon(r)), e > this.min && s.push(this.delIcon(t, r)), this.sortBtn && t && s.push(this.sortUpIcon(t)), this.sortBtn && t !== e - 1 && s.push(this.sortDownIcon(t)), s;
},
emitEvent(e, t, r, s) {
this.$emit(e, ...t, this.cacheRule[s].$f, r);
},
expandRule(e) {
for (let t = 0; t < e; t++)
this.value.push(this.field ? null : {});
}
},
created() {
this.type = this.formCreateInject.form.$form();
const e = (this.expand || 0) - this.value.length;
e > 0 && this.expandRule(e);
for (let t = 0; t < this.value.length; t++)
this.addRule(t);
},
render() {
const e = arguments[0], t = this.sort, r = this.button, s = this.type, i = this.disabled, n = t.length === 0 ? this.$scopedSlots.default ? this.$scopedSlots.default({
vm: this,
add: this.add
}) : e("div", {
key: "a_def",
class: "_fc-group-plus-minus _fc-group-add",
on: {
click: this.add
}
}) : t.map((o, l) => {
const {
rule: f,
options: u
} = this.cacheRule[o], y = r && !i ? this.makeIcon(t.length, l, o) : [];
return e("div", {
class: "_fc-group-container",
key: o
}, [e(s, k([{
key: o
}, {
on: {
"update:value": (c) => this.formData(o, c),
"emit-event": (c, ...$) => this.emitEvent(c, $, l, o),
input: (c) => this.add$f(l, o, c)
}
}, {}, {
props: {
disabled: i,
inFor: !0,
value: this.field ? {
[this.field]: this._value(this.value[l])
} : this.value[l],
rule: f,
option: u,
extendOption: !0
}
}])), e("div", {
class: "_fc-group-idx"
}, [l + 1]), y.length ? e("div", {
class: "_fc-group-handle"
}, [y]) : null]);
});
return e("div", {
key: "con",
class: "_fc-group " + (i ? "_fc-group-disabled" : "")
}, [n]);
}
};
export {
M as default
};