405 lines
10 KiB
JavaScript
405 lines
10 KiB
JavaScript
/*
|
||
* XmlDigitalTeaching v0.0.1
|
||
* Copyright ©Mon Apr 28 2025 08:58:41 GMT+0800 (中国标准时间) smile
|
||
* Released under the ISC License.
|
||
*/
|
||
var singleGroupMixin = {
|
||
props: {
|
||
activeIndex: {
|
||
type: Number,
|
||
default: -1
|
||
},
|
||
location: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
islast: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
isBatchEditing: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
batchRuleIndexs: {
|
||
type: Array,
|
||
default: () => []
|
||
}
|
||
},
|
||
provide() {
|
||
return {
|
||
getSingleGroupLocation: () => this.location
|
||
};
|
||
},
|
||
computed: {
|
||
groupIsActive() {
|
||
if (this.isBatchEditing) {
|
||
return this.batchRuleIndexs.includes(this.ruleIndex);
|
||
}
|
||
return this.ruleIndex === this.activeIndex;
|
||
}
|
||
},
|
||
watch: {
|
||
pGroupData: {
|
||
handler() {
|
||
if (this.pGroupData.options?.marginTop !== undefined && this.pGroupData.options.marginTop !== -1) {
|
||
this.$nextTick(() => {
|
||
this.$el && this.$el.style.setProperty('--book-marginTop', this.pGroupData.options.marginTop + 'px');
|
||
});
|
||
}
|
||
},
|
||
deep: true,
|
||
immediate: true
|
||
}
|
||
},
|
||
created() {
|
||
if (this.pGroupData.options?.marginTop === undefined) {
|
||
let options = this.pGroupData.options ? {
|
||
...this.pGroupData.options,
|
||
marginTop: -1
|
||
} : {
|
||
marginTop: -1
|
||
};
|
||
this.$emit('updateModel', {
|
||
key: 'pGroupData',
|
||
value: {
|
||
...this.pGroupData,
|
||
options
|
||
}
|
||
});
|
||
}
|
||
},
|
||
mounted() {
|
||
if (this.islast) {
|
||
this.$nextTick(() => {
|
||
this.$EventBus.$emit('mounted_success');
|
||
});
|
||
}
|
||
},
|
||
methods: {
|
||
emitClick(e) {
|
||
this.$emit('click', e, this.ruleIndex, this.currentRule);
|
||
}
|
||
}
|
||
};
|
||
|
||
//
|
||
var script = {
|
||
name: 'XmlSingleQuestionGroupRender',
|
||
mixins: [singleGroupMixin],
|
||
// components: { },
|
||
data() {
|
||
return {
|
||
typeText: '题库',
|
||
questionDataName: 'questionData',
|
||
groupData: {}
|
||
};
|
||
},
|
||
props: {
|
||
//模式:preview 预览 (默认),editor 编辑
|
||
mode: {
|
||
type: String,
|
||
default: function () {
|
||
return 'editor';
|
||
}
|
||
},
|
||
//必须有此属性,接收初始化值
|
||
pGroupData: {
|
||
type: Object,
|
||
default: function () {
|
||
return {};
|
||
}
|
||
},
|
||
//当前所处组的规则
|
||
currentRule: {
|
||
type: Object,
|
||
default: function () {
|
||
return {};
|
||
}
|
||
},
|
||
ruleIndex: Number,
|
||
//必须有此属性,页面类型,取值h5、pc、pad
|
||
pageType: {
|
||
type: String,
|
||
default: 'h5'
|
||
},
|
||
extendParams: {
|
||
type: Object,
|
||
default: function () {
|
||
return {};
|
||
}
|
||
},
|
||
isShowAi: {
|
||
type: String,
|
||
default: '1'
|
||
},
|
||
resourceBasisPath: {
|
||
type: String,
|
||
default: ''
|
||
}
|
||
},
|
||
created() {
|
||
this.groupData = this.pGroupData;
|
||
},
|
||
methods: {
|
||
changeAnswer() {
|
||
this.$refs.xmlQuestion.changeAnswer();
|
||
},
|
||
//
|
||
/***
|
||
* 固定方法。接收固定参数
|
||
* 此方法接收块儿点击事件,事件传递块相关参数
|
||
* @param blockData 块中的data属性数据
|
||
* @param dataName 块data数据在组中时,属性key
|
||
* @param propertyComponentsName 块儿对应的属性组件名
|
||
*/
|
||
handleBlockClick({
|
||
blockData,
|
||
dataName,
|
||
propertyComponentsName,
|
||
blockId,
|
||
ruleIndex
|
||
}) {
|
||
this.$emit('blockclick', {
|
||
groupData: this.groupData,
|
||
blockData,
|
||
dataName,
|
||
propertyComponentsName,
|
||
currentRule: this.currentRule,
|
||
blockId,
|
||
ruleIndex
|
||
});
|
||
}
|
||
}
|
||
};
|
||
|
||
function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {
|
||
if (typeof shadowMode !== 'boolean') {
|
||
createInjectorSSR = createInjector;
|
||
createInjector = shadowMode;
|
||
shadowMode = false;
|
||
}
|
||
// Vue.extend constructor export interop.
|
||
const options = typeof script === 'function' ? script.options : script;
|
||
// render functions
|
||
if (template && template.render) {
|
||
options.render = template.render;
|
||
options.staticRenderFns = template.staticRenderFns;
|
||
options._compiled = true;
|
||
// functional template
|
||
if (isFunctionalTemplate) {
|
||
options.functional = true;
|
||
}
|
||
}
|
||
// scopedId
|
||
if (scopeId) {
|
||
options._scopeId = scopeId;
|
||
}
|
||
let hook;
|
||
if (moduleIdentifier) {
|
||
// server build
|
||
hook = function (context) {
|
||
// 2.3 injection
|
||
context = context ||
|
||
// cached call
|
||
this.$vnode && this.$vnode.ssrContext ||
|
||
// stateful
|
||
this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext; // functional
|
||
// 2.2 with runInNewContext: true
|
||
if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
|
||
context = __VUE_SSR_CONTEXT__;
|
||
}
|
||
// inject component styles
|
||
if (style) {
|
||
style.call(this, createInjectorSSR(context));
|
||
}
|
||
// register component module identifier for async chunk inference
|
||
if (context && context._registeredComponents) {
|
||
context._registeredComponents.add(moduleIdentifier);
|
||
}
|
||
};
|
||
// used by ssr in case component is cached and beforeCreate
|
||
// never gets called
|
||
options._ssrRegister = hook;
|
||
} else if (style) {
|
||
hook = shadowMode ? function (context) {
|
||
style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));
|
||
} : function (context) {
|
||
style.call(this, createInjector(context));
|
||
};
|
||
}
|
||
if (hook) {
|
||
if (options.functional) {
|
||
// register for functional component in vue file
|
||
const originalRender = options.render;
|
||
options.render = function renderWithStyleInjection(h, context) {
|
||
hook.call(context);
|
||
return originalRender(h, context);
|
||
};
|
||
} else {
|
||
// inject component registration as beforeCreate hook
|
||
const existing = options.beforeCreate;
|
||
options.beforeCreate = existing ? [].concat(existing, hook) : [hook];
|
||
}
|
||
}
|
||
return script;
|
||
}
|
||
|
||
/* script */
|
||
const __vue_script__ = script;
|
||
/* template */
|
||
var __vue_render__ = function () {
|
||
var _vm = this;
|
||
var _h = _vm.$createElement;
|
||
var _c = _vm._self._c || _h;
|
||
return _c(
|
||
"div",
|
||
{
|
||
staticClass: "parent-group parent-group-mark",
|
||
class: [
|
||
"xml-single-question-group",
|
||
"xml-single-question-group-" + _vm.pageType,
|
||
_vm.groupIsActive ? "active" : "",
|
||
],
|
||
on: { click: _vm.emitClick },
|
||
},
|
||
[
|
||
_c(
|
||
"xml-group-render",
|
||
{
|
||
ref: "xmlGroup",
|
||
attrs: {
|
||
"page-type": _vm.pageType,
|
||
mode: _vm.mode,
|
||
"type-text": _vm.typeText,
|
||
"rule-index": _vm.ruleIndex,
|
||
},
|
||
scopedSlots: _vm._u(
|
||
[
|
||
{
|
||
key: "action-buttons",
|
||
fn: function () {
|
||
return [_vm._t("default")]
|
||
},
|
||
proxy: true,
|
||
},
|
||
],
|
||
null,
|
||
true
|
||
),
|
||
},
|
||
[
|
||
_vm._v(" "),
|
||
_c("xml-question-render", {
|
||
ref: "xmlQuestion",
|
||
attrs: {
|
||
"p-block-data": _vm.groupData[_vm.questionDataName],
|
||
"current-rule": _vm.currentRule,
|
||
"block-data-name": _vm.questionDataName,
|
||
"extend-params": _vm.extendParams,
|
||
"rule-index": _vm.ruleIndex,
|
||
mode: _vm.mode,
|
||
isShowAi: _vm.isShowAi,
|
||
pageType: _vm.pageType,
|
||
isSubmit:
|
||
_vm.groupData[_vm.questionDataName].questionMode == "false"
|
||
? false
|
||
: true,
|
||
resourceBasisPath: _vm.resourceBasisPath,
|
||
},
|
||
on: {
|
||
blockclick: _vm.handleBlockClick,
|
||
submitAnswer: function ($event) {
|
||
return _vm.$emit("submitAnswer", $event)
|
||
},
|
||
setanalysis: function ($event) {
|
||
return _vm.$emit("setanalysis", $event)
|
||
},
|
||
},
|
||
}),
|
||
],
|
||
1
|
||
),
|
||
_vm._v(" "),
|
||
_vm.groupData[_vm.questionDataName].questionMode == "false"
|
||
? _c(
|
||
"div",
|
||
{
|
||
staticClass: "xml-submit-answer xml-submit-answer-right",
|
||
on: {
|
||
click: function ($event) {
|
||
return _vm.changeAnswer()
|
||
},
|
||
},
|
||
},
|
||
[_vm._v("\n 提交作答\n ")]
|
||
)
|
||
: _vm._e(),
|
||
],
|
||
1
|
||
)
|
||
};
|
||
var __vue_staticRenderFns__ = [];
|
||
__vue_render__._withStripped = true;
|
||
|
||
/* style */
|
||
const __vue_inject_styles__ = undefined;
|
||
/* scoped */
|
||
const __vue_scope_id__ = "data-v-0f0ca4f3";
|
||
/* module identifier */
|
||
const __vue_module_identifier__ = undefined;
|
||
/* functional template */
|
||
const __vue_is_functional_template__ = false;
|
||
/* style inject */
|
||
|
||
/* style inject SSR */
|
||
|
||
/* style inject shadow dom */
|
||
|
||
|
||
|
||
const __vue_component__ = /*#__PURE__*/normalizeComponent(
|
||
{ render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
|
||
__vue_inject_styles__,
|
||
__vue_script__,
|
||
__vue_scope_id__,
|
||
__vue_is_functional_template__,
|
||
__vue_module_identifier__,
|
||
false,
|
||
undefined,
|
||
undefined,
|
||
undefined
|
||
);
|
||
|
||
let componentNamespace = 'xml';
|
||
// 组件前缀命名只能更新一次,防止重复执行修改组件注册出错
|
||
let isUpdated = false;
|
||
function createNamespace(name, {
|
||
prefix,
|
||
isUnPrefix
|
||
}) {
|
||
let useNamespace;
|
||
if (!isUpdated) {
|
||
isUpdated = true;
|
||
useNamespace = prefix || componentNamespace; // 更改前缀
|
||
}
|
||
if (prefix) {
|
||
if (name.indexOf(componentNamespace) === 0) {
|
||
return name.replace(componentNamespace, prefix);
|
||
}
|
||
return useNamespace.charAt(0).toUpperCase() + useNamespace.substr(1) + name;
|
||
}
|
||
if (name.indexOf(componentNamespace) === 0 || name.indexOf(componentNamespace.charAt(0).toUpperCase()) === 0) {
|
||
return name.charAt(0).toUpperCase() + name.substr(1);
|
||
}
|
||
return isUnPrefix ? name.charAt(0).toLowerCase() + name.substr(1) : componentNamespace + name.charAt(0).toUpperCase() + name.substr(1);
|
||
}
|
||
|
||
__vue_component__.install = (Vue, options = {}) => {
|
||
Vue.component(createNamespace('single-question-group-render', {
|
||
prefix: options.prefix
|
||
}), __vue_component__);
|
||
};
|
||
|
||
export { __vue_component__ as default };
|