|
|
@@ -36,61 +36,100 @@
|
|
|
</el-popover>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="24" v-if="form.langTabs && form.langTabs.length > 0">
|
|
|
- <el-tabs v-model="activeLang" @tab-click="onLangTabChange" type="card" style="margin-top: 10px;">
|
|
|
- <el-tab-pane
|
|
|
+ <el-col
|
|
|
+ :span="24"
|
|
|
+ v-if="form.langTabs && form.langTabs.length > 0"
|
|
|
+ >
|
|
|
+ <div class="lang-tabs">
|
|
|
+ <span
|
|
|
v-for="tab in form.langTabs"
|
|
|
:key="tab.languagecode"
|
|
|
- :label="tab.languagename"
|
|
|
- :name="tab.languagecode"
|
|
|
- ></el-tab-pane>
|
|
|
- </el-tabs>
|
|
|
- </el-col>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item>
|
|
|
- <p style="font-size: 14px; margin-top: 10px">
|
|
|
- {{ $t("技术参数") }}
|
|
|
- </p>
|
|
|
- <div style="margin-top: 10px; min-height: 200px !important">
|
|
|
- <myEditor
|
|
|
- ref="technicalparam"
|
|
|
- height="360px"
|
|
|
- :content="form.technicalparam"
|
|
|
- :id="form.sa_fadid"
|
|
|
- ></myEditor>
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item>
|
|
|
- <p style="font-size: 14px; margin-top: 10px">
|
|
|
- {{ $t("材质说明") }}
|
|
|
- </p>
|
|
|
- <div style="margin-top: 10px; min-height: 200px !important">
|
|
|
- <myEditor
|
|
|
- ref="materialdescription"
|
|
|
- height="360px"
|
|
|
- :content="form.materialdescription"
|
|
|
- :id="form.sa_fadid"
|
|
|
- ></myEditor>
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item>
|
|
|
- <p style="font-size: 14px; margin-top: 10px">
|
|
|
- {{ $t("产品概述") }}
|
|
|
- </p>
|
|
|
- <div style="margin-top: 10px; min-height: 200px !important">
|
|
|
- <myEditor
|
|
|
- ref="content"
|
|
|
- height="360px"
|
|
|
- :content="form.content"
|
|
|
- :id="form.sa_fadid"
|
|
|
- ></myEditor>
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
+ class="lang-tab"
|
|
|
+ :class="{ active: activeLang === tab.languagecode }"
|
|
|
+ @click="activeLang = tab.languagecode"
|
|
|
+ >{{ tab.languagename }}</span>
|
|
|
+ </div>
|
|
|
</el-col>
|
|
|
+ <template v-for="tab in form.langTabs">
|
|
|
+ <el-col
|
|
|
+ :span="24"
|
|
|
+ v-show="activeLang === tab.languagecode"
|
|
|
+ :key="'technicalparam_' + tab.languagecode"
|
|
|
+ >
|
|
|
+ <el-form-item>
|
|
|
+ <p style="font-size: 14px; margin-top: 10px">
|
|
|
+ {{ $t("技术参数") }}
|
|
|
+ </p>
|
|
|
+ <div style="margin-top: 10px; min-height: 200px !important">
|
|
|
+ <myEditor
|
|
|
+ :ref="'technicalparam_' + tab.languagecode"
|
|
|
+ height="360px"
|
|
|
+ :content="langData[tab.languagecode]?.technicalparam || ''"
|
|
|
+ @update:content="
|
|
|
+ val =>
|
|
|
+ onEditorChange(
|
|
|
+ tab.languagecode,
|
|
|
+ 'technicalparam',
|
|
|
+ val
|
|
|
+ )
|
|
|
+ "
|
|
|
+ :id="form.sa_fadid"
|
|
|
+ ></myEditor>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col
|
|
|
+ :span="24"
|
|
|
+ v-show="activeLang === tab.languagecode"
|
|
|
+ :key="'materialdescription_' + tab.languagecode"
|
|
|
+ >
|
|
|
+ <el-form-item>
|
|
|
+ <p style="font-size: 14px; margin-top: 10px">
|
|
|
+ {{ $t("材质说明") }}
|
|
|
+ </p>
|
|
|
+ <div style="margin-top: 10px; min-height: 200px !important">
|
|
|
+ <myEditor
|
|
|
+ :ref="'materialdescription_' + tab.languagecode"
|
|
|
+ height="360px"
|
|
|
+ :content="
|
|
|
+ langData[tab.languagecode]?.materialdescription || ''
|
|
|
+ "
|
|
|
+ @update:content="
|
|
|
+ val =>
|
|
|
+ onEditorChange(
|
|
|
+ tab.languagecode,
|
|
|
+ 'materialdescription',
|
|
|
+ val
|
|
|
+ )
|
|
|
+ "
|
|
|
+ :id="form.sa_fadid"
|
|
|
+ ></myEditor>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col
|
|
|
+ :span="24"
|
|
|
+ v-show="activeLang === tab.languagecode"
|
|
|
+ :key="'content_' + tab.languagecode"
|
|
|
+ >
|
|
|
+ <el-form-item>
|
|
|
+ <p style="font-size: 14px; margin-top: 10px">
|
|
|
+ {{ $t("产品概述") }}
|
|
|
+ </p>
|
|
|
+ <div style="margin-top: 10px; min-height: 200px !important">
|
|
|
+ <myEditor
|
|
|
+ :ref="'content_' + tab.languagecode"
|
|
|
+ height="360px"
|
|
|
+ :content="langData[tab.languagecode]?.content || ''"
|
|
|
+ @update:content="
|
|
|
+ val => onEditorChange(tab.languagecode, 'content', val)
|
|
|
+ "
|
|
|
+ :id="form.sa_fadid"
|
|
|
+ ></myEditor>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </template>
|
|
|
<el-col :span="24">
|
|
|
<el-form-item :label="$t('分类')" prop="classmx">
|
|
|
<el-cascader
|
|
|
@@ -187,16 +226,11 @@ export default {
|
|
|
loading: false,
|
|
|
disabled: false,
|
|
|
classData: [],
|
|
|
- activeLang: '',
|
|
|
- previousLang: '',
|
|
|
- translations: {
|
|
|
- technicalparam: {},
|
|
|
- materialdescription: {},
|
|
|
- content: {},
|
|
|
- },
|
|
|
+ activeLang: "",
|
|
|
+ langData: {},
|
|
|
form: {
|
|
|
siteid: JSON.parse(sessionStorage.getItem("active_account")).siteid,
|
|
|
- sa_fadid: 0, //sa_brandid<=0时 为新增
|
|
|
+ sa_fadid: 0,
|
|
|
itemid: "",
|
|
|
itemname: "",
|
|
|
itemno: "",
|
|
|
@@ -218,12 +252,6 @@ export default {
|
|
|
};
|
|
|
},
|
|
|
updated() {
|
|
|
- if (this.$refs.technicalparam)
|
|
|
- this.$refs.technicalparam.innerHTML = this.form.technicalparam;
|
|
|
- if (this.$refs.materialdescription)
|
|
|
- this.$refs.materialdescription.innerHTML = this.form.materialdescription;
|
|
|
- if (this.$refs.content)
|
|
|
- this.$refs.content.innerHTML = this.form.content;
|
|
|
try {
|
|
|
if (!this.$refs.upload.filelist.length)
|
|
|
this.$refs.upload.filelist = this.fileType
|
|
|
@@ -257,23 +285,73 @@ export default {
|
|
|
this.form = res.data;
|
|
|
this.form.isonsale = res.data.isonsale == 1 ? "1" : "0";
|
|
|
this.form.langTabs = langRes.data || [];
|
|
|
- this.initTranslations();
|
|
|
- if (this.form.langTabs.length > 0) {
|
|
|
- this.activeLang = this.form.langTabs[0].languagecode;
|
|
|
- this.previousLang = this.form.langTabs[0].languagecode;
|
|
|
+
|
|
|
+ const defaultLang =
|
|
|
+ langRes.data && langRes.data[0]
|
|
|
+ ? langRes.data[0].languagecode
|
|
|
+ : "";
|
|
|
+ const langData = {};
|
|
|
+ langRes.data.forEach((tab) => {
|
|
|
+ const isDefault = tab.languagecode === defaultLang;
|
|
|
+ langData[tab.languagecode] = {
|
|
|
+ technicalparam: isDefault ? res.data.technicalparam || "" : "",
|
|
|
+ materialdescription: isDefault
|
|
|
+ ? res.data.materialdescription || ""
|
|
|
+ : "",
|
|
|
+ content: isDefault ? res.data.content || "" : "",
|
|
|
+ };
|
|
|
+ });
|
|
|
+ this.langData = langData;
|
|
|
+
|
|
|
+ if (langRes.data && langRes.data.length > 0) {
|
|
|
+ this.activeLang = defaultLang;
|
|
|
}
|
|
|
- await this.queryTranslations(this.form.sa_fadid);
|
|
|
+
|
|
|
+ await this.loadTranslations(this.form.sa_fadid, defaultLang);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async loadTranslations(ownerid, defaultLang) {
|
|
|
+ const fields = ["technicalparam", "materialdescription", "content"];
|
|
|
+ for (const tab of this.form.langTabs) {
|
|
|
+ if (tab.languagecode === defaultLang) continue;
|
|
|
+ for (const field of fields) {
|
|
|
+ try {
|
|
|
+ const res = await this.$api.requested({
|
|
|
+ id: 10027101,
|
|
|
+ content: {
|
|
|
+ ownertable: "sa_fad",
|
|
|
+ ownerid: ownerid,
|
|
|
+ languagecode: tab.languagecode,
|
|
|
+ columnname: field,
|
|
|
+ },
|
|
|
+ });
|
|
|
+ let value = "";
|
|
|
+ if (res.data && res.data.value_translate !== undefined) {
|
|
|
+ value = res.data.value_translate;
|
|
|
+ } else if (res.data && typeof res.data === "string") {
|
|
|
+ value = res.data;
|
|
|
+ }
|
|
|
+ if (value) {
|
|
|
+ this.langData[tab.languagecode][field] = value;
|
|
|
+ }
|
|
|
+ } catch (e) {}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onEditorChange(langCode, field, val) {
|
|
|
+ if (this.langData[langCode]) {
|
|
|
+ this.langData[langCode][field] = val;
|
|
|
}
|
|
|
},
|
|
|
onSubmit() {
|
|
|
this.$refs.form.validate(async (valid) => {
|
|
|
if (!valid) return false;
|
|
|
this.loading = true;
|
|
|
- this.saveCurrentTranslations(this.activeLang);
|
|
|
- const defaultLang = this.form.langTabs[0]?.languagecode || '';
|
|
|
- this.form.technicalparam = this.translations.technicalparam[defaultLang] || '';
|
|
|
- this.form.materialdescription = this.translations.materialdescription[defaultLang] || '';
|
|
|
- this.form.content = this.translations.content[defaultLang] || '';
|
|
|
+ const defaultLang = this.form.langTabs[0]?.languagecode || "";
|
|
|
+ const defaultData = this.langData[defaultLang] || {};
|
|
|
+ this.form.technicalparam = defaultData.technicalparam || "";
|
|
|
+ this.form.materialdescription = defaultData.materialdescription || "";
|
|
|
+ this.form.content = defaultData.content || "";
|
|
|
const selectdep = this.$refs.selectdep._data.inputValue.split(" / ");
|
|
|
this.form.class = selectdep[0] || "";
|
|
|
this.form.classmx = selectdep[1] || "";
|
|
|
@@ -307,91 +385,6 @@ export default {
|
|
|
this.form.itemid = data.itemid;
|
|
|
this.form.itemno = data.itemno;
|
|
|
},
|
|
|
- initTranslations() {
|
|
|
- const fields = ['technicalparam', 'materialdescription', 'content']
|
|
|
- fields.forEach(field => {
|
|
|
- this.translations[field] = {}
|
|
|
- this.form.langTabs.forEach(tab => {
|
|
|
- this.translations[field][tab.languagecode] = ''
|
|
|
- })
|
|
|
- })
|
|
|
- },
|
|
|
- saveCurrentTranslations(lang) {
|
|
|
- const fields = ['technicalparam', 'materialdescription', 'content']
|
|
|
- const refs = this.$refs
|
|
|
- fields.forEach(field => {
|
|
|
- if (refs[field] && refs[field].html !== undefined) {
|
|
|
- this.translations[field][lang] = refs[field].html
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- loadCurrentTranslations() {
|
|
|
- const fields = ['technicalparam', 'materialdescription', 'content']
|
|
|
- const refs = this.$refs
|
|
|
- this.$nextTick(() => {
|
|
|
- fields.forEach(field => {
|
|
|
- const comp = refs[field]
|
|
|
- if (comp) {
|
|
|
- comp.html = this.translations[field][this.activeLang] || ''
|
|
|
- }
|
|
|
- })
|
|
|
- })
|
|
|
- },
|
|
|
- async onLangTabChange(tab) {
|
|
|
- this.saveCurrentTranslations(this.previousLang)
|
|
|
- this.previousLang = tab.name
|
|
|
- const defaultLang = this.form.langTabs[0]?.languagecode || ''
|
|
|
- if (tab.name !== defaultLang) {
|
|
|
- await this.queryTranslationsByLang(this.form.sa_fadid, tab.name)
|
|
|
- }
|
|
|
- this.loadCurrentTranslations()
|
|
|
- },
|
|
|
- async queryTranslationsByLang(ownerid, lang) {
|
|
|
- const fields = ['technicalparam', 'materialdescription', 'content']
|
|
|
- for (const field of fields) {
|
|
|
- try {
|
|
|
- const res = await this.$api.requested({
|
|
|
- id: 10027101,
|
|
|
- content: {
|
|
|
- ownertable: 'sa_fad',
|
|
|
- ownerid: ownerid,
|
|
|
- languagecode: lang,
|
|
|
- columnname: field,
|
|
|
- },
|
|
|
- })
|
|
|
- if (res.data && res.data.value_translate !== undefined) {
|
|
|
- this.translations[field][lang] = res.data.value_translate
|
|
|
- } else if (res.data && typeof res.data === 'string') {
|
|
|
- this.translations[field][lang] = res.data
|
|
|
- }
|
|
|
- } catch (e) {}
|
|
|
- }
|
|
|
- },
|
|
|
- async queryTranslations(ownerid) {
|
|
|
- const fields = ['technicalparam', 'materialdescription', 'content']
|
|
|
- const defaultLang = this.form.langTabs[0]?.languagecode || ''
|
|
|
- for (const field of fields) {
|
|
|
- for (const tab of this.form.langTabs) {
|
|
|
- if (tab.languagecode === defaultLang) continue
|
|
|
- try {
|
|
|
- const res = await this.$api.requested({
|
|
|
- id: 10027101,
|
|
|
- content: {
|
|
|
- ownertable: 'sa_fad',
|
|
|
- ownerid: ownerid,
|
|
|
- languagecode: tab.languagecode,
|
|
|
- columnname: field,
|
|
|
- },
|
|
|
- })
|
|
|
- if (res.data && res.data.value_translate !== undefined) {
|
|
|
- this.translations[field][tab.languagecode] = res.data.value_translate
|
|
|
- } else if (res.data && typeof res.data === 'string') {
|
|
|
- this.translations[field][tab.languagecode] = res.data
|
|
|
- }
|
|
|
- } catch (e) {}
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
async queryClass() {
|
|
|
const res = await this.$store.dispatch(
|
|
|
"optiontypeselect",
|
|
|
@@ -417,18 +410,26 @@ export default {
|
|
|
this.loading = false;
|
|
|
this.dialogFormVisible = false;
|
|
|
this.$refs.form.resetFields();
|
|
|
- this.$refs.technicalparam.html = this.form.technicalparam;
|
|
|
- this.$refs.materialdescription.html = this.form.materialdescription;
|
|
|
- this.$refs.content.html = this.form.content;
|
|
|
- this.activeLang = '';
|
|
|
- this.previousLang = '';
|
|
|
- this.translations = {
|
|
|
- technicalparam: {},
|
|
|
- materialdescription: {},
|
|
|
- content: {},
|
|
|
- };
|
|
|
+ this.clearAllEditors();
|
|
|
+ this.activeLang = "";
|
|
|
+ this.langData = {};
|
|
|
this.$emit("onSuccess");
|
|
|
},
|
|
|
+ clearAllEditors() {
|
|
|
+ const fields = ["technicalparam", "materialdescription", "content"];
|
|
|
+ (this.form.langTabs || []).forEach((tab) => {
|
|
|
+ fields.forEach((field) => {
|
|
|
+ const ref = this.$refs[field + "_" + tab.languagecode];
|
|
|
+ if (ref) {
|
|
|
+ if (Array.isArray(ref)) {
|
|
|
+ ref.forEach((r) => r.clearContent());
|
|
|
+ } else {
|
|
|
+ ref.clearContent();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
},
|
|
|
mounted() {},
|
|
|
};
|
|
|
@@ -447,4 +448,32 @@ export default {
|
|
|
margin-top: 3px;
|
|
|
color: #606266;
|
|
|
}
|
|
|
+
|
|
|
+.lang-tabs {
|
|
|
+ display: flex;
|
|
|
+ border-bottom: 1px solid #e4e7ed;
|
|
|
+ margin-top: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.lang-tab {
|
|
|
+ padding: 8px 16px;
|
|
|
+ cursor: pointer;
|
|
|
+ border: 1px solid transparent;
|
|
|
+ border-bottom: none;
|
|
|
+ margin-bottom: -1px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #606266;
|
|
|
+ border-radius: 4px 4px 0 0;
|
|
|
+ transition: color 0.15s;
|
|
|
+}
|
|
|
+
|
|
|
+.lang-tab.active {
|
|
|
+ color: #409eff;
|
|
|
+ border-color: #e4e7ed;
|
|
|
+ background: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.lang-tab:hover {
|
|
|
+ color: #409eff;
|
|
|
+}
|
|
|
</style>
|