Merge pull request #11338 from dataease/pr@dev-v2_st

feat(工作台): 国际化
This commit is contained in:
dataeaseShu 2024-08-02 11:48:09 +08:00 committed by GitHub
commit 4ab0181f26
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 100 additions and 445 deletions

View File

@ -26,6 +26,35 @@ export default {
delete_success: 'Delete success',
no_auth_tips: 'Missing menu permissions, please contact the administrator'
},
work_branch: {
recommended_dashboard: 'Recommended dashboard',
template_market_official:
'If you have not obtained the template download link, please contact the template market official',
create_quickly: 'Create quickly',
permission_to_create: 'Missing permission to create',
new_using_template: 'Create new using template',
template_center: 'Template Center',
view_all: 'view all',
relevant_templates_found: 'No relevant templates found',
last_edited_by: 'Last edited by',
last_edit_time: 'last edit time',
big_data_screen: 'Big data screen',
dashboard: 'Dashboard',
data_set: 'data set',
data_source: 'data source',
recently_used: 'Recently Used',
my_collection: 'my collection',
relevant_content_found: 'No relevant content found',
no_content_yet: 'no content yet',
no_favorites_yet: 'No favorites yet',
search_keyword: 'search keyword',
new_page_preview: 'New page preview',
permission_denied: 'permission denied',
cancel_favorites: 'Cancel favorites',
open_dataset: 'Open dataset',
administrator_for_authorization:
'There is no business menu permission, please contact the administrator for authorization'
},
login: {
welcome: 'Welcome',
btn: 'Login',

View File

@ -51,6 +51,33 @@ export default {
no_auth_tips: '缺少菜单权限请联系管理员',
no_menu_tips: '未找到资源 401错误'
},
work_branch: {
recommended_dashboard: '推荐仪表板',
template_market_official: '未获取模板下载链接请联系模板市场官方',
create_quickly: '快速创建',
permission_to_create: '缺少创建权限',
new_using_template: '使用模板新建',
template_center: '模板中心',
view_all: '查看全部',
relevant_templates_found: '没有找到相关模板',
last_edited_by: '最近编辑人',
last_edit_time: '最近编辑时间',
big_data_screen: '数据大屏',
dashboard: '仪表板',
data_set: '数据集',
data_source: '数据源',
recently_used: '最近使用',
my_collection: '我的收藏',
relevant_content_found: '没有找到相关内容',
no_content_yet: '暂无内容',
no_favorites_yet: '暂无收藏',
permission_denied: '没有权限',
search_keyword: '搜索关键词',
new_page_preview: '新页面预览',
cancel_favorites: '取消收藏',
open_dataset: '打开数据集',
administrator_for_authorization: '没有任何业务菜单权限请联系管理员授权'
},
dynamic_time: {
set_default: '设置默认值',
fix: '固定时间',

View File

@ -310,15 +310,6 @@ const handleSelectionChange = val => {
multipleSelection.value = val
}
const confirmDelete = () => {
const options = {
title: '确定删除该任务吗?',
type: 'primary',
cb: deleteField
}
// handlerConfirm(options)
}
const delAll = () => {
if (multipleSelection.value.length === 0) {
ElMessageBox.confirm(t('data_export.sure_del_all'), {

View File

@ -1,406 +0,0 @@
<script lang="ts" setup>
import { useI18n } from '@/hooks/web/useI18n'
import { ref, reactive } from 'vue'
import type { FormInstance } from 'element-plus-secondary'
interface FieldsItem {
sourceField: string
targetField: string
targetPanel: string
}
const { t } = useI18n()
const dialogVisible = ref(true)
const formInline = reactive({
user: '',
region: '',
date: ''
})
const checkAll = ref(false)
const selectValue = ref(false)
const jumpType = ref('1')
const openType = ref('1')
const isIndeterminate = ref(true)
const checkedFields = ref(['Shanghai', 'Beijing'])
const fields = ['Shanghai', 'Beijing', 'Guangzhou', 'Shenzhen']
const fieldFormRef = ref<FormInstance>()
const formFields = reactive<{
fields: FieldsItem[]
}>({
fields: [
{
sourceField: '1',
targetField: '2',
targetPanel: '3'
},
{
sourceField: '5',
targetField: '6',
targetPanel: '7'
}
]
})
const removeField = (item: FieldsItem) => {
const index = formFields.fields.indexOf(item)
if (index !== -1) {
formFields.fields.splice(index, 1)
}
}
const addField = () => {
formFields.fields.push({
sourceField: '',
targetField: '',
targetPanel: ''
})
}
const submitForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.validate(valid => {
if (valid) {
} else {
return false
}
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
const handleCheckAllChange = (val: boolean) => {
checkedFields.value = val ? fields : []
isIndeterminate.value = false
}
const handleCheckedFieldsChange = (value: string[]) => {
const checkedCount = value.length
checkAll.value = checkedCount === fields.length
isIndeterminate.value = checkedCount > 0 && checkedCount < fields.length
}
</script>
<template>
<el-dialog class="jump-linkage" v-model="dialogVisible" width="1000px" title="跳转设置">
<div class="chart-dataset-name">
<div class="chart-name">
<span class="label">已选择图表:</span>
<span class="name">
<el-icon class="main-color">
<Icon class="toolbar-icon" name="icon_left_outlined" />
</el-icon>
折线图1
</span>
</div>
<div class="chart-name dataset">
<span class="label">所用数据集:</span>
<span class="name">
<el-icon class="main-color">
<Icon class="toolbar-icon" name="icon_left_outlined" />
</el-icon>
佩尔数据集
</span>
</div>
</div>
<div class="field-config">
<div class="select-field">
<div class="title">
选择字段
<el-switch v-model="selectValue" inactive-text="仅看已选" />
</div>
<div class="select-all">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
@change="handleCheckAllChange"
>全选</el-checkbox
>
</div>
<div class="field-list">
<el-checkbox-group v-model="checkedFields" @change="handleCheckedFieldsChange">
<div
v-for="field in fields"
:key="field"
class="list-item_primary"
:class="[checkedFields.includes(field) ? 'active' : '']"
>
<el-checkbox :label="field">{{ field }}</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
<div class="config-panel">
<div class="operation-type">
<div class="type">
<span class="label">跳转类型</span>
<el-radio-group v-model="jumpType">
<el-radio label="1">外部链接</el-radio>
<el-radio label="2">系统仪表板</el-radio>
</el-radio-group>
</div>
<div class="type">
<span class="label">打开方式</span>
<el-radio-group v-model="openType">
<el-radio label="1">当前页面</el-radio>
<el-radio label="2">新开页面</el-radio>
</el-radio-group>
</div>
</div>
<div class="panel-field">
<div class="field-scroll">
<el-form
label-position="top"
:inline="true"
:model="formInline"
class="panel-form-field"
>
<el-form-item label="当前仪表板">
<el-select v-model="formInline.region" placeholder="Activity zone" clearable>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
<el-icon class="join">
<Icon name="join-join"></Icon>
</el-icon>
<el-form-item label="目标仪表板">
<el-select v-model="formInline.region" placeholder="Activity zone" clearable>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-form>
<el-form
ref="fieldFormRef"
hide-required-asterisk
label-position="top"
:inline="true"
:model="formFields"
class="field-form"
:class="[formFields.fields.length > 1 ? 'show-trash' : 'only-one']"
>
<template v-for="(field, index) in formFields.fields" :key="field.sourceField">
<el-form-item
label="源字段"
:prop="'fields.' + index + '.sourceField'"
:rules="{
required: true,
message: '源字段 can not be null',
trigger: 'change'
}"
>
<el-select v-model="field.sourceField" placeholder="Activity zone" clearable>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
<el-icon class="join">
<Icon name="join-join"></Icon>
</el-icon>
<el-form-item
label="目标字段"
:prop="'fields.' + index + '.targetPanel'"
:rules="{
required: true,
message: '目标字段 can not be null',
trigger: 'change'
}"
>
<el-select v-model="field.targetPanel" placeholder="Activity zone" clearable>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
<el-form-item
:label="'&nbsp;'"
:prop="'fields.' + index + '.targetField'"
:rules="{
required: true,
message: '字段 can not be null',
trigger: 'change'
}"
>
<el-select v-model="field.targetField" placeholder="Activity zone" clearable>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
<el-button v-if="formFields.fields.length > 1" text @click="removeField(field)">
<template #icon>
<Icon name="icon_delete-trash_outlined"></Icon>
</template>
</el-button>
</template>
</el-form>
</div>
<el-button class="add-field" text @click="addField">
<template #icon>
<Icon name="icon_add_outlined"></Icon>
</template>
添加联动图表字段
</el-button>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetForm(fieldFormRef)">{{ t('chart.cancel') }} </el-button>
<el-button @click="submitForm(fieldFormRef)" type="primary"
>{{ t('chart.confirm') }}
</el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="less">
.jump-linkage {
font-family: '阿里巴巴普惠体 3.0 55 Regular L3';
font-size: 14px;
.chart-dataset-name {
margin-bottom: 16px;
display: flex;
align-items: center;
.chart-name {
.label {
color: #646a73;
}
.name {
color: #1f2329;
.main-color {
color: var(--ed-color-primary);
}
}
}
.dataset {
margin-left: 24px;
}
}
.field-config {
width: 952px;
height: 416px;
border: 1px solid #dee0e3;
border-radius: 4px;
.select-field {
height: 100%;
float: left;
width: 259px;
border-right: 1px solid #dee0e3;
.title {
margin: 16px 16px 0 16px;
color: #1f2329;
font-weight: 500;
display: flex;
.ed-switch {
margin-left: auto;
.ed-switch__label {
color: #646a73;
}
}
}
.select-all {
height: 40px;
display: flex;
align-items: center;
padding-left: 15px;
}
.field-list {
.list-item_primary {
border-radius: 0;
padding: 12px 15px;
}
}
}
.config-panel {
height: 100%;
margin-left: 259px;
width: calc(100% - 259px);
.operation-type {
padding: 9px;
padding-bottom: 0;
border-bottom: 1px solid #dee0e3;
.type {
margin-bottom: 9px;
display: flex;
align-items: center;
.label {
color: #646a73;
margin-right: 16px;
}
}
}
.panel-field {
height: 323px;
.field-scroll {
width: 100%;
padding: 16px 16px 8px 16px;
height: 280px;
overflow: auto;
}
.add-field {
margin-left: 16px;
}
.join {
font-size: 18px;
margin: 37px 8px 0;
}
.panel-form-field {
.ed-form-item {
margin: 0 0 24px 0;
}
.ed-select {
width: 312px;
}
}
.field-form {
.ed-form-item {
margin: 0 0 8px 0;
}
&.show-trash {
.ed-form-item {
&:nth-child(5n - 1) {
margin-left: 8px;
}
}
:nth-child(5n) {
margin: 32px 0 0 5px;
color: #646a73;
font-size: 14px;
}
}
&.only-one {
.ed-form-item {
&:nth-child(4n) {
margin-left: 8px;
}
}
}
.ed-select {
width: 196px;
}
}
}
}
}
}
</style>

View File

@ -36,8 +36,8 @@ class ShortcutOption {
columnList: [
{ field: 'type', label: t('datasource.type') },
{ field: 'creator', label: t('visualization.create_by') },
{ field: 'lastEditor', label: '最近编辑人' },
{ field: 'lastEditTime', label: '最近编辑时间', type: 'time' }
{ field: 'lastEditor', label: t('work_branch.last_edited_by') },
{ field: 'lastEditTime', label: t('work_branch.last_edit_time'), type: 'time' }
]
},
store: {
@ -47,8 +47,8 @@ class ShortcutOption {
columnList: [
{ field: 'type', label: t('datasource.type') },
{ field: 'creator', label: t('visualization.create_by') },
{ field: 'lastEditor', label: '最近编辑人' },
{ field: 'lastEditTime', label: '最近编辑时间', type: 'time' }
{ field: 'lastEditor', label: t('work_branch.last_edited_by') },
{ field: 'lastEditTime', label: t('work_branch.last_edit_time'), type: 'time' }
]
}
}

View File

@ -102,12 +102,12 @@ const formatterTime = (_, _column, cellValue) => {
}
const typeMap = {
screen: '数据大屏',
dataV: '数据大屏',
dashboard: '仪表板',
panel: '仪表板',
dataset: '数据集',
datasource: '数据源'
screen: t('work_branch.big_data_screen'),
dataV: t('work_branch.big_data_screen'),
dashboard: t('work_branch.dashboard'),
panel: t('work_branch.dashboard'),
dataset: t('work_branch.data_set'),
datasource: t('work_branch.data_source')
}
const loadTableData = () => {
@ -134,8 +134,8 @@ const loadTableData = () => {
} */
const tablePaneList = ref([
{ title: '最近使用', name: 'recent', disabled: false },
{ title: '我的收藏', name: 'store', disabled: false },
{ title: t('work_branch.recently_used'), name: 'recent', disabled: false },
{ title: t('work_branch.my_collection'), name: 'store', disabled: false },
{ title: t('visualization.share_out'), name: 'share', disabled: false }
])
@ -223,13 +223,13 @@ const getEmptyImg = (): string => {
const getEmptyDesc = (): string => {
if (panelKeyword.value) {
return '没有找到相关内容'
return t('work_branch.relevant_content_found')
}
if (activeName.value === 'recent') {
return '暂无内容'
return t('work_branch.no_content_yet')
}
if (activeName.value === 'store') {
return '暂无收藏'
return t('work_branch.no_favorites_yet')
}
return ''
}
@ -252,7 +252,11 @@ const getEmptyDesc = (): string => {
>
<template #label>
<span class="custom-tabs-label">
<el-tooltip placement="top" v-if="item.disabled" content="没有权限">
<el-tooltip
placement="top"
v-if="item.disabled"
:content="t('work_branch.permission_denied')"
>
<span>{{ item.title }}</span>
</el-tooltip>
<span v-else>{{ item.title }}</span>
@ -284,7 +288,7 @@ const getEmptyDesc = (): string => {
v-model="panelKeyword"
clearable
@change="triggerFilterPanel"
placeholder="搜索关键词"
:placeholder="t('work_branch.search_keyword')"
>
<template #prefix>
<el-icon>
@ -357,7 +361,11 @@ const getEmptyDesc = (): string => {
<el-table-column width="100" fixed="right" key="_operation" :label="$t('common.operate')">
<template #default="scope">
<template v-if="['dashboard', 'dataV', 'panel', 'screen'].includes(scope.row.type)">
<el-tooltip effect="dark" content="新页面预览" placement="top">
<el-tooltip
effect="dark"
:content="t('work_branch.new_page_preview')"
placement="top"
>
<el-icon
class="hover-icon hover-icon-in-table"
@click.stop="
@ -383,7 +391,7 @@ const getEmptyDesc = (): string => {
<el-tooltip
v-if="activeName === 'store'"
effect="dark"
content="取消收藏"
:content="t('work_branch.cancel_favorites')"
placement="top"
>
<el-icon
@ -396,7 +404,7 @@ const getEmptyDesc = (): string => {
</template>
<template v-if="['dataset'].includes(scope.row.type)">
<el-tooltip effect="dark" content="打开数据集" placement="top">
<el-tooltip effect="dark" :content="t('work_branch.open_dataset')" placement="top">
<el-icon
class="hover-icon hover-icon-in-table"
@click.stop="
@ -412,7 +420,11 @@ const getEmptyDesc = (): string => {
</GridTable>
</div>
</div>
<el-empty class="dashboard-type" v-else description="没有任何业务菜单权限,请联系管理员授权" />
<el-empty
class="dashboard-type"
v-else
:description="t('work_branch.administrator_for_authorization')"
/>
</template>
<style lang="less" scoped>

View File

@ -79,7 +79,7 @@ const activeTabChange = value => {
const tabBtnList = [
{
name: '推荐仪表板',
name: t('work_branch.recommended_dashboard'),
value: 'PANEL'
},
{
@ -221,7 +221,7 @@ const isDataEaseBi = computed(() => appStore.getIsDataEaseBi)
const apply = () => {
if (state.dvCreateForm.newFrom === 'new_market_template' && !state.dvCreateForm.templateUrl) {
ElMessage.warning('未获取模板下载链接请联系模板市场官方')
ElMessage.warning(t('work_branch.template_market_official'))
return false
}
const templateTemplate = {
@ -305,7 +305,7 @@ initMarketTemplate()
</div>
<div class="quick-creation">
<span class="label"> 快速创建 </span>
<span class="label"> {{ t('work_branch.create_quickly') }} </span>
<div class="item-creation">
<div
:key="ele.name"
@ -320,7 +320,7 @@ initMarketTemplate()
v-if="!ele['menuAuth'] || !ele['anyManage']"
class="box-item"
effect="dark"
content="缺少创建权限"
:content="t('work_branch.template_market_official')"
placement="top"
>
<div class="empty-tooltip-container" />
@ -343,7 +343,7 @@ initMarketTemplate()
v-if="!(havePanelAuth || haveScreenAuth)"
class="box-item"
effect="dark"
content="缺少创建权限"
:content="t('work_branch.permission_to_create')"
placement="top"
>
<div class="empty-tooltip-container-template" />
@ -351,7 +351,7 @@ initMarketTemplate()
<el-icon class="main-color-quick template-create">
<Icon name="icon_template_colorful" />
</el-icon>
<span class="name">使用模板新建</span>
<span class="name">{{ t('work_branch.new_using_template') }}</span>
</div>
</div>
</div>
@ -359,9 +359,11 @@ initMarketTemplate()
<div class="template-market-dashboard">
<div class="template-market">
<div class="label">
模板中心
{{ t('work_branch.template_center') }}
<div class="expand-all">
<button class="all flex-center" @click="toTemplateMarket">查看全部</button>
<button class="all flex-center" @click="toTemplateMarket">
{{ t('work_branch.view_all') }}
</button>
<el-divider direction="vertical" />
<button @click="handleExpandFold" class="expand flex-center">
{{ t(`visualization.${expandFold}`) }}
@ -397,7 +399,7 @@ initMarketTemplate()
<div style="text-align: center">
<Icon name="no_result" class="no-result"></Icon>
<br />
<span class="no-result-tips">没有找到相关模板</span>
<span class="no-result-tips">{{ t('work_branch.relevant_templates_found') }}</span>
</div>
</el-row>
<el-row v-show="!state.networkStatus" class="template-empty">