@jari-ace/element-plus-component 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/components/autoComplete/JaAutoComplete.vue.d.ts +18 -18
- package/dist/components/button/JaButton.vue.d.ts +24 -24
- package/dist/components/customGroupTree/src/customGroupTree.vue.d.ts +1 -1
- package/dist/components/departmentPicker/src/DepartmentPicker.vue.d.ts +2 -2
- package/dist/components/departmentTree/src/departmentTree.vue.d.ts +1 -1
- package/dist/components/dropdownButton/JaDropdownButton.vue.d.ts +55 -55
- package/dist/components/enumList/EnumListInput.vue.d.ts +2 -2
- package/dist/components/enumPicker/src/EnumPicker.vue.d.ts +1 -1
- package/dist/components/form/JaForm.vue.d.ts +1 -1
- package/dist/components/formItem/JaFormItem.vue.d.ts +12 -12
- package/dist/components/input/JaInput.vue.d.ts +18 -18
- package/dist/components/inputI18n/I18nBundleEditor.vue.d.ts +1 -1
- package/dist/components/inputI18n/InputI18n.vue.d.ts +2 -2
- package/dist/components/inputI18n/JaInputI18n.vue.d.ts +70 -70
- package/dist/components/inputNumber/JaInputNumber.vue.d.ts +12 -12
- package/dist/components/mapItemList/MapItemListInput.vue.d.ts +2 -2
- package/dist/components/numberList/NumberListInput.vue.d.ts +2 -2
- package/dist/components/rolePicker/RoleEditor.vue.d.ts +1 -1
- package/dist/components/rolePicker/baseRolePicker.vue.d.ts +1 -1
- package/dist/components/rolePicker/baseRolePicker.vue.d.ts.map +1 -1
- package/dist/components/rolePicker/baseRolePicker.vue.js +4 -2
- package/dist/components/rolePicker/baseRolePicker.vue.js.map +1 -1
- package/dist/components/scrollbar/Scrollbar.vue.d.ts +8 -8
- package/dist/components/select/JaSelect.vue.d.ts +70 -70
- package/dist/components/stringList/StringListInput.vue.d.ts +2 -2
- package/dist/components/tip/index.d.ts +6 -6
- package/dist/components/tip/src/AceTip.vue.d.ts +1 -1
- package/dist/components/upload/index.d.ts +23 -4
- package/dist/components/upload/index.d.ts.map +1 -1
- package/dist/components/upload/index.js +1 -3
- package/dist/components/upload/index.js.map +1 -1
- package/dist/components/upload/pdf-viewer/PdfViewerModal.vue.d.ts +27 -0
- package/dist/components/upload/pdf-viewer/PdfViewerModal.vue.d.ts.map +1 -0
- package/dist/components/upload/pdf-viewer/PdfViewerModal.vue.js +94 -0
- package/dist/components/upload/pdf-viewer/PdfViewerModal.vue.js.map +1 -0
- package/dist/components/upload/uploader-locale-zh-cn.d.ts +223 -0
- package/dist/components/upload/uploader-locale-zh-cn.d.ts.map +1 -0
- package/dist/components/upload/uploader-locale-zh-cn.js +224 -0
- package/dist/components/upload/uploader-locale-zh-cn.js.map +1 -0
- package/dist/components/upload/uploader.vue.d.ts +42 -0
- package/dist/components/upload/uploader.vue.d.ts.map +1 -0
- package/dist/components/upload/uploader.vue.js +713 -0
- package/dist/components/upload/uploader.vue.js.map +1 -0
- package/dist/components/userGroupPicker/src/UserGroupPicker.vue.d.ts +2 -2
- package/dist/components/userPicker/src/UserPicker.vue.d.ts +3 -3
- package/dist/components/userSelectDialog/src/userSelectDialog.vue.d.ts +1 -1
- package/dist/components/userTag/UserInfoTag.vue.d.ts +2 -2
- package/lib/index.css +9 -1
- package/lib/index.js +37354 -2740
- package/lib/index.umd.cjs +407 -2
- package/package.json +70 -61
- package/packages/components/autoComplete/JaAutoComplete.vue +47 -47
- package/packages/components/autoComplete/index.ts +5 -5
- package/packages/components/avatar/JaAvatar.vue +126 -126
- package/packages/components/avatar/avatarToken.ts +11 -11
- package/packages/components/avatar/defaultImg.ts +14 -14
- package/packages/components/avatar/index.ts +7 -7
- package/packages/components/button/JaButton.vue +51 -51
- package/packages/components/button/index.ts +4 -4
- package/packages/components/channelPicker/index.ts +7 -7
- package/packages/components/channelPicker/src/ChannelPicker.vue +43 -43
- package/packages/components/channelPicker/src/JaChannelPicker.vue +42 -42
- package/packages/components/checkbox/JaCheckbox.vue +73 -73
- package/packages/components/checkbox/index.ts +4 -4
- package/packages/components/checkboxGroup/JaCheckboxGroup.vue +45 -45
- package/packages/components/checkboxGroup/index.ts +4 -4
- package/packages/components/customGroupTree/index.ts +10 -10
- package/packages/components/customGroupTree/src/customGroupTree.vue +91 -91
- package/packages/components/datePicker/JaDatePicker.vue +52 -52
- package/packages/components/datePicker/index.ts +4 -4
- package/packages/components/departmentPicker/index.ts +4 -4
- package/packages/components/departmentPicker/src/DepartmentPicker.vue +107 -107
- package/packages/components/departmentPicker/src/consts.ts +2 -2
- package/packages/components/departmentTree/index.ts +10 -10
- package/packages/components/departmentTree/src/departmentTree.vue +135 -135
- package/packages/components/dropdownButton/JaDropdownButton.vue +59 -59
- package/packages/components/dropdownButton/index.ts +4 -4
- package/packages/components/enumList/EnumListInput.vue +107 -107
- package/packages/components/enumList/JaEnumList.vue +39 -39
- package/packages/components/enumList/index.ts +7 -7
- package/packages/components/enumPicker/index.ts +5 -5
- package/packages/components/enumPicker/src/EnumPicker.vue +103 -103
- package/packages/components/form/JaForm.vue +146 -146
- package/packages/components/form/index.ts +5 -5
- package/packages/components/form/types.ts +4 -4
- package/packages/components/formItem/JaFormItem.vue +87 -87
- package/packages/components/formItem/index.ts +4 -4
- package/packages/components/index.ts +34 -34
- package/packages/components/input/JaInput.vue +143 -143
- package/packages/components/input/index.ts +4 -4
- package/packages/components/inputI18n/I18nBundleEditor.vue +76 -76
- package/packages/components/inputI18n/InputI18n.vue +146 -146
- package/packages/components/inputI18n/JaInputI18n.vue +50 -50
- package/packages/components/inputI18n/index.ts +8 -8
- package/packages/components/inputNumber/JaInputNumber.vue +98 -98
- package/packages/components/inputNumber/index.ts +4 -4
- package/packages/components/mapItemList/JaMapItemList.vue +35 -35
- package/packages/components/mapItemList/MapItemListInput.vue +191 -191
- package/packages/components/mapItemList/index.ts +7 -7
- package/packages/components/numberList/JaNumberList.vue +36 -36
- package/packages/components/numberList/NumberListInput.vue +111 -111
- package/packages/components/numberList/index.ts +7 -7
- package/packages/components/properyPicker/JaPropertyPicker.vue +38 -38
- package/packages/components/properyPicker/PropertyPicker.vue +314 -314
- package/packages/components/properyPicker/index.ts +7 -7
- package/packages/components/radioGroup/JaRadioGroup.vue +50 -50
- package/packages/components/radioGroup/index.ts +4 -4
- package/packages/components/rolePicker/RoleEditor.vue +129 -129
- package/packages/components/rolePicker/RolePicker.vue +44 -44
- package/packages/components/rolePicker/RolePickerRaw.vue +56 -56
- package/packages/components/rolePicker/baseRolePicker.vue +91 -87
- package/packages/components/rolePicker/index.ts +10 -10
- package/packages/components/scrollbar/Scrollbar.vue +89 -89
- package/packages/components/scrollbar/index.ts +5 -5
- package/packages/components/scrollbar/utils.ts +17 -17
- package/packages/components/select/JaSelect.vue +48 -48
- package/packages/components/select/index.ts +4 -4
- package/packages/components/stringList/JaStringList.vue +36 -36
- package/packages/components/stringList/StringListInput.vue +96 -96
- package/packages/components/stringList/index.ts +7 -7
- package/packages/components/switch/JaSwitch.vue +50 -50
- package/packages/components/switch/index.ts +4 -4
- package/packages/components/timePicker/JaTimePicker.vue +52 -52
- package/packages/components/timePicker/index.ts +5 -5
- package/packages/components/tip/index.ts +4 -4
- package/packages/components/tip/src/AceTip.vue +43 -43
- package/packages/components/upload/index.ts +4 -6
- package/packages/components/upload/pdf-viewer/PdfViewerModal.vue +32 -0
- package/packages/components/upload/uploader-locale-zh-cn.ts +223 -0
- package/packages/components/upload/uploader.vue +513 -0
- package/packages/components/userGroupPicker/index.ts +4 -4
- package/packages/components/userGroupPicker/src/UserGroupPicker.vue +94 -94
- package/packages/components/userGroupTree/index.ts +10 -10
- package/packages/components/userGroupTree/src/userGroupTree.vue +149 -149
- package/packages/components/userPicker/index.ts +10 -10
- package/packages/components/userPicker/src/CustomGroupManager.vue +189 -189
- package/packages/components/userPicker/src/JaUserList.vue +317 -317
- package/packages/components/userPicker/src/JaUserPicker.vue +40 -40
- package/packages/components/userPicker/src/UserPicker.vue +472 -472
- package/packages/components/userSelectDialog/index.ts +6 -6
- package/packages/components/userSelectDialog/src/userSelectDialog.vue +462 -462
- package/packages/components/userTag/UserInfoTag.vue +397 -397
- package/packages/components/userTag/index.ts +6 -6
- package/packages/components/userTag/sharedAxios.ts +8 -8
- package/packages/directives/auth/index.ts +41 -41
- package/packages/directives/autofocus/index.ts +29 -29
- package/packages/directives/index.ts +10 -10
- package/packages/directives/shortcut/index.ts +192 -192
- package/packages/hooks/useAppInstances.ts +34 -34
- package/packages/hooks/useBackendValidations.ts +81 -81
- package/packages/hooks/useBridage.ts +157 -157
- package/packages/hooks/useClassificationLevels.ts +62 -62
- package/packages/hooks/useDateTimeShortCuts.ts +65 -65
- package/packages/hooks/useRealms.ts +28 -28
- package/packages/hooks/useTreeData.ts +45 -45
- package/packages/hooks/useUserRefQuery.ts +232 -232
- package/packages/index.ts +24 -24
- package/packages/list.json +7 -7
- package/packages/types/custom.d.ts +13 -13
- package/packages/types/window.d.ts +16 -16
- package/packages/utils/install.ts +43 -43
- package/packages/utils/objectUtils.ts +31 -31
- package/theme-style/fonts/iconfont.json +5196 -5196
- package/theme-style/index.scss +10 -10
- package/theme-style/styles/element-plus-var.scss +1419 -1419
- package/theme-style/styles/iconfont.css +2979 -2979
- package/theme-style/styles/theme-var.scss +72 -72
- package/theme-style/styles/transition.scss +122 -122
- package/packages/components/upload/src/Upload.vue +0 -25
- package/packages/components/upload/src/type.ts +0 -3
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
createAxiosWithoutCache,
|
|
4
|
-
type CreateAppMessageBundleCommand, useAppMessageApi, type AppInstance
|
|
5
|
-
} from "@jari-ace/app-bolts";
|
|
6
|
-
import {ref, watch} from 'vue'
|
|
7
|
-
import {useAppInstances} from "../../hooks/useAppInstances";
|
|
8
|
-
import {ElDrawer, ElForm, ElFormItem, ElInput, ElButton} from "element-plus";
|
|
9
|
-
import {JaButton} from "../button";
|
|
10
|
-
|
|
11
|
-
const visible = defineModel<boolean>({
|
|
12
|
-
default: false,
|
|
13
|
-
required: true
|
|
14
|
-
});
|
|
15
|
-
const props = defineProps<{
|
|
16
|
-
appId: string,
|
|
17
|
-
preKey?: string
|
|
18
|
-
}>();
|
|
19
|
-
const axios = createAxiosWithoutCache();
|
|
20
|
-
const api = useAppMessageApi(axios);
|
|
21
|
-
const app = ref<AppInstance>();
|
|
22
|
-
const key = ref("");
|
|
23
|
-
const messages = ref<Record<string, string>>({})
|
|
24
|
-
const emits = defineEmits(["success"])
|
|
25
|
-
const appInstances = await useAppInstances();
|
|
26
|
-
|
|
27
|
-
function onOpen() {
|
|
28
|
-
loadApp();
|
|
29
|
-
key.value = props.preKey ?? "";
|
|
30
|
-
messages.value = {};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async function onSubmit() {
|
|
34
|
-
const cmd = {
|
|
35
|
-
key: key.value,
|
|
36
|
-
messages: messages.value,
|
|
37
|
-
appInstance: {
|
|
38
|
-
id: props.appId
|
|
39
|
-
}
|
|
40
|
-
} as CreateAppMessageBundleCommand;
|
|
41
|
-
await api.createBundle(cmd);
|
|
42
|
-
visible.value = false;
|
|
43
|
-
emits('success', key.value);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
async function loadApp() {
|
|
47
|
-
app.value = await appInstances.getById(props.appId)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
watch(() => props.appId, async () => {
|
|
51
|
-
await loadApp();
|
|
52
|
-
})
|
|
53
|
-
</script>
|
|
54
|
-
|
|
55
|
-
<template>
|
|
56
|
-
<el-drawer destroy-on-close append-to-body v-model="visible"
|
|
57
|
-
title="创建国际化文本" @open="onOpen">
|
|
58
|
-
<el-form label-position="top" size="default">
|
|
59
|
-
<el-form-item label="文本键" required>
|
|
60
|
-
<el-input v-model="key" v-focus></el-input>
|
|
61
|
-
</el-form-item>
|
|
62
|
-
<el-form-item v-for="l in app?.supportedLocales" :key="l" :label="l">
|
|
63
|
-
<el-input type="textarea" :rows="4" v-model="messages[l]"></el-input>
|
|
64
|
-
</el-form-item>
|
|
65
|
-
</el-form>
|
|
66
|
-
<template #footer>
|
|
67
|
-
<ja-button size="default" shortcut="Alt+Enter" type="primary" @click="onSubmit">确定
|
|
68
|
-
</ja-button>
|
|
69
|
-
<el-button size="default" plain @click="visible = false">取消</el-button>
|
|
70
|
-
</template>
|
|
71
|
-
</el-drawer>
|
|
72
|
-
</template>
|
|
73
|
-
|
|
74
|
-
<style scoped lang="scss">
|
|
75
|
-
|
|
76
|
-
</style>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
createAxiosWithoutCache,
|
|
4
|
+
type CreateAppMessageBundleCommand, useAppMessageApi, type AppInstance
|
|
5
|
+
} from "@jari-ace/app-bolts";
|
|
6
|
+
import {ref, watch} from 'vue'
|
|
7
|
+
import {useAppInstances} from "../../hooks/useAppInstances";
|
|
8
|
+
import {ElDrawer, ElForm, ElFormItem, ElInput, ElButton} from "element-plus";
|
|
9
|
+
import {JaButton} from "../button";
|
|
10
|
+
|
|
11
|
+
const visible = defineModel<boolean>({
|
|
12
|
+
default: false,
|
|
13
|
+
required: true
|
|
14
|
+
});
|
|
15
|
+
const props = defineProps<{
|
|
16
|
+
appId: string,
|
|
17
|
+
preKey?: string
|
|
18
|
+
}>();
|
|
19
|
+
const axios = createAxiosWithoutCache();
|
|
20
|
+
const api = useAppMessageApi(axios);
|
|
21
|
+
const app = ref<AppInstance>();
|
|
22
|
+
const key = ref("");
|
|
23
|
+
const messages = ref<Record<string, string>>({})
|
|
24
|
+
const emits = defineEmits(["success"])
|
|
25
|
+
const appInstances = await useAppInstances();
|
|
26
|
+
|
|
27
|
+
function onOpen() {
|
|
28
|
+
loadApp();
|
|
29
|
+
key.value = props.preKey ?? "";
|
|
30
|
+
messages.value = {};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function onSubmit() {
|
|
34
|
+
const cmd = {
|
|
35
|
+
key: key.value,
|
|
36
|
+
messages: messages.value,
|
|
37
|
+
appInstance: {
|
|
38
|
+
id: props.appId
|
|
39
|
+
}
|
|
40
|
+
} as CreateAppMessageBundleCommand;
|
|
41
|
+
await api.createBundle(cmd);
|
|
42
|
+
visible.value = false;
|
|
43
|
+
emits('success', key.value);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function loadApp() {
|
|
47
|
+
app.value = await appInstances.getById(props.appId)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
watch(() => props.appId, async () => {
|
|
51
|
+
await loadApp();
|
|
52
|
+
})
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
<template>
|
|
56
|
+
<el-drawer destroy-on-close append-to-body v-model="visible"
|
|
57
|
+
title="创建国际化文本" @open="onOpen">
|
|
58
|
+
<el-form label-position="top" size="default">
|
|
59
|
+
<el-form-item label="文本键" required>
|
|
60
|
+
<el-input v-model="key" v-focus></el-input>
|
|
61
|
+
</el-form-item>
|
|
62
|
+
<el-form-item v-for="l in app?.supportedLocales" :key="l" :label="l">
|
|
63
|
+
<el-input type="textarea" :rows="4" v-model="messages[l]"></el-input>
|
|
64
|
+
</el-form-item>
|
|
65
|
+
</el-form>
|
|
66
|
+
<template #footer>
|
|
67
|
+
<ja-button size="default" shortcut="Alt+Enter" type="primary" @click="onSubmit">确定
|
|
68
|
+
</ja-button>
|
|
69
|
+
<el-button size="default" plain @click="visible = false">取消</el-button>
|
|
70
|
+
</template>
|
|
71
|
+
</el-drawer>
|
|
72
|
+
</template>
|
|
73
|
+
|
|
74
|
+
<style scoped lang="scss">
|
|
75
|
+
|
|
76
|
+
</style>
|
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {ElInput, ElOption, ElSelect} from "element-plus";
|
|
3
|
-
import {nextTick, onUnmounted, ref, watch} from "vue"
|
|
4
|
-
import {
|
|
5
|
-
createAxiosWithoutCache,
|
|
6
|
-
useAppMessageApi,
|
|
7
|
-
useLoginUser
|
|
8
|
-
} from "@jari-ace/app-bolts";
|
|
9
|
-
import MessageEditor from "./I18nBundleEditor.vue"
|
|
10
|
-
import {trim} from "lodash-es";
|
|
11
|
-
import {useAppInstances} from "../../hooks/useAppInstances";
|
|
12
|
-
import debounce from "lodash-es/debounce";
|
|
13
|
-
import {JaButton} from "../button";
|
|
14
|
-
|
|
15
|
-
const props = withDefaults(defineProps<{
|
|
16
|
-
appId?: string,
|
|
17
|
-
size?: 'default' | 'large' | 'small',
|
|
18
|
-
textarea?: boolean,
|
|
19
|
-
disabled?: boolean
|
|
20
|
-
}>(), {
|
|
21
|
-
size: 'default',
|
|
22
|
-
textarea: false
|
|
23
|
-
})
|
|
24
|
-
const model = defineModel<string>({
|
|
25
|
-
default: ""
|
|
26
|
-
})
|
|
27
|
-
const axios = createAxiosWithoutCache()
|
|
28
|
-
const api = useAppMessageApi(axios)
|
|
29
|
-
const locale = useLoginUser().locale
|
|
30
|
-
const messageKeys = ref<string[]>()
|
|
31
|
-
const focused = ref(false)
|
|
32
|
-
const editorVisible = ref(false)
|
|
33
|
-
const select = ref<InstanceType<typeof ElSelect>>()
|
|
34
|
-
const appName = ref("");
|
|
35
|
-
const appInstances = await useAppInstances();
|
|
36
|
-
const filterKey = ref("")
|
|
37
|
-
const i18nTxt = ref("")
|
|
38
|
-
const selectI18n = ref<InstanceType<typeof ElSelect>>();
|
|
39
|
-
const emits = defineEmits(["change", "focus", "blur"])
|
|
40
|
-
const debounceLoadMessage = debounce(loadMessage, 500)
|
|
41
|
-
let timeoutHandle: number | undefined = undefined;
|
|
42
|
-
|
|
43
|
-
async function loadMessage(val?: string) {
|
|
44
|
-
if (!val) val = model.value;
|
|
45
|
-
if (!props.appId) return
|
|
46
|
-
const app = await appInstances.getById(props.appId)
|
|
47
|
-
appName.value = app.name
|
|
48
|
-
if (!val || !appName.value) {
|
|
49
|
-
i18nTxt.value = "";
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
i18nTxt.value = val
|
|
53
|
-
let key = val;
|
|
54
|
-
if (val && val.length > 0) {
|
|
55
|
-
key = trim(key);
|
|
56
|
-
if (key.startsWith('{') && key.endsWith('}')) {
|
|
57
|
-
key = key.substring(1, key.length - 1);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
const messages = await api.getByKey(appName.value, key, {
|
|
61
|
-
cancelDuplicatedRequest: false
|
|
62
|
-
});
|
|
63
|
-
const message = messages.find(m => m.locale === locale)
|
|
64
|
-
if (message) {
|
|
65
|
-
i18nTxt.value = message.message
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async function filterMessages(filterName: string) {
|
|
70
|
-
filterKey.value = filterName
|
|
71
|
-
messageKeys.value = await api.searchKeys(appName.value, filterName)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async function onFocus() {
|
|
75
|
-
focused.value = true;
|
|
76
|
-
await nextTick()
|
|
77
|
-
emits("focus")
|
|
78
|
-
select.value?.focus()
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function onBlur() {
|
|
82
|
-
timeoutHandle = setTimeout(() => {
|
|
83
|
-
focused.value = false
|
|
84
|
-
}, 200)
|
|
85
|
-
emits("blur")
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
onUnmounted(() => {
|
|
89
|
-
debounceLoadMessage.cancel()
|
|
90
|
-
if (timeoutHandle) {
|
|
91
|
-
clearTimeout(timeoutHandle)
|
|
92
|
-
}
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
watch(model, () => {
|
|
96
|
-
debounceLoadMessage();
|
|
97
|
-
}, {
|
|
98
|
-
deep: true,
|
|
99
|
-
immediate: true
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
function onChange(value: string) {
|
|
103
|
-
emits('change', value)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function onNewI18nCreated(messageKey: string) {
|
|
107
|
-
await filterMessages(filterKey.value);
|
|
108
|
-
model.value = "{" + messageKey + "}";
|
|
109
|
-
selectI18n.value.focus
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
defineExpose({
|
|
113
|
-
focus() {
|
|
114
|
-
selectI18n?.value.focus()
|
|
115
|
-
},
|
|
116
|
-
blur() {
|
|
117
|
-
select?.value.blur()
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
</script>
|
|
121
|
-
|
|
122
|
-
<template>
|
|
123
|
-
<el-input ref="selectI18n" @focus="onFocus" v-show="!focused" v-model="i18nTxt" :size="size"
|
|
124
|
-
:disabled="disabled"
|
|
125
|
-
:type="textarea ? 'textarea': undefined">
|
|
126
|
-
</el-input>
|
|
127
|
-
<el-select ref="select" filterable remote :remote-method="filterMessages" v-show="focused"
|
|
128
|
-
:disabled="disabled" default-first-option
|
|
129
|
-
remote-show-suffix @change="onChange" :size="size" allow-create clearable
|
|
130
|
-
@blur="onBlur" v-model="model">
|
|
131
|
-
<el-option v-for="k in messageKeys" :key="k" :value="'{' + k +'}'"
|
|
132
|
-
:label="'{' + k +'}'"></el-option>
|
|
133
|
-
<template #footer>
|
|
134
|
-
<ja-button link :style="{width: '100%'}" type="primary" @click="editorVisible=true"
|
|
135
|
-
shortcut="Alt+I">
|
|
136
|
-
新建国际化文本(Alt+I)
|
|
137
|
-
</ja-button>
|
|
138
|
-
</template>
|
|
139
|
-
</el-select>
|
|
140
|
-
<message-editor :app-id="appId" :pre-key="filterKey" v-model="editorVisible"
|
|
141
|
-
@success="onNewI18nCreated"></message-editor>
|
|
142
|
-
</template>
|
|
143
|
-
|
|
144
|
-
<style scoped lang="scss">
|
|
145
|
-
|
|
146
|
-
</style>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {ElInput, ElOption, ElSelect} from "element-plus";
|
|
3
|
+
import {nextTick, onUnmounted, ref, watch} from "vue"
|
|
4
|
+
import {
|
|
5
|
+
createAxiosWithoutCache,
|
|
6
|
+
useAppMessageApi,
|
|
7
|
+
useLoginUser
|
|
8
|
+
} from "@jari-ace/app-bolts";
|
|
9
|
+
import MessageEditor from "./I18nBundleEditor.vue"
|
|
10
|
+
import {trim} from "lodash-es";
|
|
11
|
+
import {useAppInstances} from "../../hooks/useAppInstances";
|
|
12
|
+
import debounce from "lodash-es/debounce";
|
|
13
|
+
import {JaButton} from "../button";
|
|
14
|
+
|
|
15
|
+
const props = withDefaults(defineProps<{
|
|
16
|
+
appId?: string,
|
|
17
|
+
size?: 'default' | 'large' | 'small',
|
|
18
|
+
textarea?: boolean,
|
|
19
|
+
disabled?: boolean
|
|
20
|
+
}>(), {
|
|
21
|
+
size: 'default',
|
|
22
|
+
textarea: false
|
|
23
|
+
})
|
|
24
|
+
const model = defineModel<string>({
|
|
25
|
+
default: ""
|
|
26
|
+
})
|
|
27
|
+
const axios = createAxiosWithoutCache()
|
|
28
|
+
const api = useAppMessageApi(axios)
|
|
29
|
+
const locale = useLoginUser().locale
|
|
30
|
+
const messageKeys = ref<string[]>()
|
|
31
|
+
const focused = ref(false)
|
|
32
|
+
const editorVisible = ref(false)
|
|
33
|
+
const select = ref<InstanceType<typeof ElSelect>>()
|
|
34
|
+
const appName = ref("");
|
|
35
|
+
const appInstances = await useAppInstances();
|
|
36
|
+
const filterKey = ref("")
|
|
37
|
+
const i18nTxt = ref("")
|
|
38
|
+
const selectI18n = ref<InstanceType<typeof ElSelect>>();
|
|
39
|
+
const emits = defineEmits(["change", "focus", "blur"])
|
|
40
|
+
const debounceLoadMessage = debounce(loadMessage, 500)
|
|
41
|
+
let timeoutHandle: number | undefined = undefined;
|
|
42
|
+
|
|
43
|
+
async function loadMessage(val?: string) {
|
|
44
|
+
if (!val) val = model.value;
|
|
45
|
+
if (!props.appId) return
|
|
46
|
+
const app = await appInstances.getById(props.appId)
|
|
47
|
+
appName.value = app.name
|
|
48
|
+
if (!val || !appName.value) {
|
|
49
|
+
i18nTxt.value = "";
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
i18nTxt.value = val
|
|
53
|
+
let key = val;
|
|
54
|
+
if (val && val.length > 0) {
|
|
55
|
+
key = trim(key);
|
|
56
|
+
if (key.startsWith('{') && key.endsWith('}')) {
|
|
57
|
+
key = key.substring(1, key.length - 1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const messages = await api.getByKey(appName.value, key, {
|
|
61
|
+
cancelDuplicatedRequest: false
|
|
62
|
+
});
|
|
63
|
+
const message = messages.find(m => m.locale === locale)
|
|
64
|
+
if (message) {
|
|
65
|
+
i18nTxt.value = message.message
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function filterMessages(filterName: string) {
|
|
70
|
+
filterKey.value = filterName
|
|
71
|
+
messageKeys.value = await api.searchKeys(appName.value, filterName)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function onFocus() {
|
|
75
|
+
focused.value = true;
|
|
76
|
+
await nextTick()
|
|
77
|
+
emits("focus")
|
|
78
|
+
select.value?.focus()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function onBlur() {
|
|
82
|
+
timeoutHandle = setTimeout(() => {
|
|
83
|
+
focused.value = false
|
|
84
|
+
}, 200)
|
|
85
|
+
emits("blur")
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
onUnmounted(() => {
|
|
89
|
+
debounceLoadMessage.cancel()
|
|
90
|
+
if (timeoutHandle) {
|
|
91
|
+
clearTimeout(timeoutHandle)
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
watch(model, () => {
|
|
96
|
+
debounceLoadMessage();
|
|
97
|
+
}, {
|
|
98
|
+
deep: true,
|
|
99
|
+
immediate: true
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
function onChange(value: string) {
|
|
103
|
+
emits('change', value)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function onNewI18nCreated(messageKey: string) {
|
|
107
|
+
await filterMessages(filterKey.value);
|
|
108
|
+
model.value = "{" + messageKey + "}";
|
|
109
|
+
selectI18n.value.focus
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
defineExpose({
|
|
113
|
+
focus() {
|
|
114
|
+
selectI18n?.value.focus()
|
|
115
|
+
},
|
|
116
|
+
blur() {
|
|
117
|
+
select?.value.blur()
|
|
118
|
+
}
|
|
119
|
+
})
|
|
120
|
+
</script>
|
|
121
|
+
|
|
122
|
+
<template>
|
|
123
|
+
<el-input ref="selectI18n" @focus="onFocus" v-show="!focused" v-model="i18nTxt" :size="size"
|
|
124
|
+
:disabled="disabled"
|
|
125
|
+
:type="textarea ? 'textarea': undefined">
|
|
126
|
+
</el-input>
|
|
127
|
+
<el-select ref="select" filterable remote :remote-method="filterMessages" v-show="focused"
|
|
128
|
+
:disabled="disabled" default-first-option
|
|
129
|
+
remote-show-suffix @change="onChange" :size="size" allow-create clearable
|
|
130
|
+
@blur="onBlur" v-model="model">
|
|
131
|
+
<el-option v-for="k in messageKeys" :key="k" :value="'{' + k +'}'"
|
|
132
|
+
:label="'{' + k +'}'"></el-option>
|
|
133
|
+
<template #footer>
|
|
134
|
+
<ja-button link :style="{width: '100%'}" type="primary" @click="editorVisible=true"
|
|
135
|
+
shortcut="Alt+I">
|
|
136
|
+
新建国际化文本(Alt+I)
|
|
137
|
+
</ja-button>
|
|
138
|
+
</template>
|
|
139
|
+
</el-select>
|
|
140
|
+
<message-editor :app-id="appId" :pre-key="filterKey" v-model="editorVisible"
|
|
141
|
+
@success="onNewI18nCreated"></message-editor>
|
|
142
|
+
</template>
|
|
143
|
+
|
|
144
|
+
<style scoped lang="scss">
|
|
145
|
+
|
|
146
|
+
</style>
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import type {ValidationInstance} from '../../hooks/useBackendValidations'
|
|
3
|
-
import {inject, ref, watch} from "vue";
|
|
4
|
-
import {ElSelect} from "element-plus";
|
|
5
|
-
import {getValue, setValue} from "../../utils/objectUtils";
|
|
6
|
-
import InputI18n from "./InputI18n.vue";
|
|
7
|
-
|
|
8
|
-
const input = ref<typeof ElSelect>({} as typeof ElSelect)
|
|
9
|
-
const model = inject('aceFormModel') as Record<string, any>
|
|
10
|
-
const prop = inject('aceFormItemProp') as string
|
|
11
|
-
const validator = inject('aceFormValidator') as ValidationInstance
|
|
12
|
-
const emit = defineEmits<{
|
|
13
|
-
change: [value: string]
|
|
14
|
-
}>()
|
|
15
|
-
const props = defineProps<{
|
|
16
|
-
appId: string
|
|
17
|
-
}>()
|
|
18
|
-
|
|
19
|
-
function onChange(value: string) {
|
|
20
|
-
validator.removeFieldError(prop)
|
|
21
|
-
setValue(model.formData, prop, value);
|
|
22
|
-
emit('change', value)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
type modelType = string;
|
|
26
|
-
|
|
27
|
-
const mv = ref<modelType>();
|
|
28
|
-
watch(() => model.formData, () => {
|
|
29
|
-
const v = getValue(model.formData, prop) as modelType
|
|
30
|
-
mv.value = v;
|
|
31
|
-
}, {
|
|
32
|
-
immediate: true,
|
|
33
|
-
deep: true
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
defineExpose({
|
|
37
|
-
focus: () => input.value.focus(),
|
|
38
|
-
blur: () => input.value.blur(),
|
|
39
|
-
elSelect: input
|
|
40
|
-
})
|
|
41
|
-
</script>
|
|
42
|
-
|
|
43
|
-
<template>
|
|
44
|
-
<input-i18n
|
|
45
|
-
ref="input"
|
|
46
|
-
v-model="mv"
|
|
47
|
-
@change="onChange"
|
|
48
|
-
v-bind="$attrs" :app-id="props.appId">
|
|
49
|
-
</input-i18n>
|
|
50
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type {ValidationInstance} from '../../hooks/useBackendValidations'
|
|
3
|
+
import {inject, ref, watch} from "vue";
|
|
4
|
+
import {ElSelect} from "element-plus";
|
|
5
|
+
import {getValue, setValue} from "../../utils/objectUtils";
|
|
6
|
+
import InputI18n from "./InputI18n.vue";
|
|
7
|
+
|
|
8
|
+
const input = ref<typeof ElSelect>({} as typeof ElSelect)
|
|
9
|
+
const model = inject('aceFormModel') as Record<string, any>
|
|
10
|
+
const prop = inject('aceFormItemProp') as string
|
|
11
|
+
const validator = inject('aceFormValidator') as ValidationInstance
|
|
12
|
+
const emit = defineEmits<{
|
|
13
|
+
change: [value: string]
|
|
14
|
+
}>()
|
|
15
|
+
const props = defineProps<{
|
|
16
|
+
appId: string
|
|
17
|
+
}>()
|
|
18
|
+
|
|
19
|
+
function onChange(value: string) {
|
|
20
|
+
validator.removeFieldError(prop)
|
|
21
|
+
setValue(model.formData, prop, value);
|
|
22
|
+
emit('change', value)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type modelType = string;
|
|
26
|
+
|
|
27
|
+
const mv = ref<modelType>();
|
|
28
|
+
watch(() => model.formData, () => {
|
|
29
|
+
const v = getValue(model.formData, prop) as modelType
|
|
30
|
+
mv.value = v;
|
|
31
|
+
}, {
|
|
32
|
+
immediate: true,
|
|
33
|
+
deep: true
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
defineExpose({
|
|
37
|
+
focus: () => input.value.focus(),
|
|
38
|
+
blur: () => input.value.blur(),
|
|
39
|
+
elSelect: input
|
|
40
|
+
})
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<template>
|
|
44
|
+
<input-i18n
|
|
45
|
+
ref="input"
|
|
46
|
+
v-model="mv"
|
|
47
|
+
@change="onChange"
|
|
48
|
+
v-bind="$attrs" :app-id="props.appId">
|
|
49
|
+
</input-i18n>
|
|
50
|
+
</template>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {type SFCWithInstall, withInstall} from "../../utils/install";
|
|
2
|
-
import InputI18n from "./InputI18n.vue";
|
|
3
|
-
import _JaInputI18n from "./JaInputI18n.vue";
|
|
4
|
-
|
|
5
|
-
// 存在绑定的model watch不响应的问题,需用点击第二次watch才响应mv变化,这个问题无法解决
|
|
6
|
-
// export const JaInputI18n: SFCWithInstall<typeof _JaInputI18n> = withInstall(_JaInputI18n);
|
|
7
|
-
|
|
8
|
-
export const JaInputI18nRaw: SFCWithInstall<typeof InputI18n> = withInstall(InputI18n);
|
|
1
|
+
import {type SFCWithInstall, withInstall} from "../../utils/install";
|
|
2
|
+
import InputI18n from "./InputI18n.vue";
|
|
3
|
+
import _JaInputI18n from "./JaInputI18n.vue";
|
|
4
|
+
|
|
5
|
+
// 存在绑定的model watch不响应的问题,需用点击第二次watch才响应mv变化,这个问题无法解决
|
|
6
|
+
// export const JaInputI18n: SFCWithInstall<typeof _JaInputI18n> = withInstall(_JaInputI18n);
|
|
7
|
+
|
|
8
|
+
export const JaInputI18nRaw: SFCWithInstall<typeof InputI18n> = withInstall(InputI18n);
|