属性UI(プロパティ)にチェックルール設定追加
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
<template>
|
||||
<div>
|
||||
<q-field :label="displayName" labelColor="primary" stack-label>
|
||||
<div class="q-my-md" v-bind="$attrs">
|
||||
<q-field :label="displayName" labelColor="primary" stack-label
|
||||
v-model="mappingProps"
|
||||
:rules="rulesExp"
|
||||
ref="fieldRef"
|
||||
>
|
||||
<template v-slot:control>
|
||||
<q-card flat class="full-width">
|
||||
<q-card-actions vertical>
|
||||
@@ -17,7 +21,6 @@
|
||||
</template>
|
||||
</q-field>
|
||||
<show-dialog v-model:visible="dgIsShow" name="データマッピング" @close="closeDg" min-width="55vw" min-height="60vh">
|
||||
|
||||
<div class="">
|
||||
<div class="row q-col-gutter-x-xs flex-center">
|
||||
<div class="col-5">
|
||||
@@ -36,7 +39,7 @@
|
||||
キー
|
||||
</div>
|
||||
</div>
|
||||
<q-virtual-scroll style="max-height: 60vh;" :items="mappingProps" separator v-slot="{ item, index }">
|
||||
<q-virtual-scroll style="max-height: 60vh;" :items="mappingProps.data" separator v-slot="{ item, index }">
|
||||
<!-- <div class="q-my-sm" v-for="(item, index) in mappingProps" :key="item.id"> -->
|
||||
<div class="row q-pa-sm q-col-gutter-x-md flex-center">
|
||||
<div class="col-5">
|
||||
@@ -74,19 +77,19 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<show-dialog v-model:visible="mappingProps[index].to.isDialogVisible" name="フィールド一覧"
|
||||
<show-dialog v-model:visible="mappingProps.data[index].to.isDialogVisible" name="フィールド一覧"
|
||||
@close="closeToDg" ref="fieldDlg">
|
||||
<FieldSelect v-if="onlySourceSelect" ref="fieldDlg" name="フィールド" :appId="sourceAppId" not_page
|
||||
:selectedFields="mappingProps[index].to.fields"
|
||||
:updateSelects="(fields) => { mappingProps[index].to.fields = fields; mappingProps[index].to.app = sourceApp }">
|
||||
:selectedFields="mappingProps.data[index].to.fields"
|
||||
:updateSelects="(fields) => { mappingProps.data[index].to.fields = fields; mappingProps.data[index].to.app = sourceApp }">
|
||||
</FieldSelect>
|
||||
<AppFieldSelectBox v-else v-model:selectedField="mappingProps[index].to" />
|
||||
<AppFieldSelectBox v-else v-model:selectedField="mappingProps.data[index].to" />
|
||||
</show-dialog>
|
||||
<!-- </div> -->
|
||||
</q-virtual-scroll>
|
||||
|
||||
<div class="q-mt-lg q-ml-md row ">
|
||||
<q-checkbox size="sm" v-model="createWithNull" label="キーが存在しない場合は新規に作成され、存在する場合はデータが更新されます。" />
|
||||
<q-checkbox size="sm" v-model="mappingProps.createWithNull" label="キーが存在しない場合は新規に作成され、存在する場合はデータが更新されます。" />
|
||||
</div>
|
||||
</div>
|
||||
</show-dialog>
|
||||
@@ -115,12 +118,12 @@ type ContextProps = {
|
||||
}
|
||||
};
|
||||
|
||||
type CurrentModelValueType = {
|
||||
data: MappingValueType[];
|
||||
interface IMappingSetting {
|
||||
data: IMappingValueType[];
|
||||
createWithNull: boolean;
|
||||
}
|
||||
|
||||
type MappingValueType = {
|
||||
interface IMappingValueType {
|
||||
id: string;
|
||||
from: { sharedText?: string };
|
||||
to: {
|
||||
@@ -157,7 +160,7 @@ export default defineComponent({
|
||||
default: '',
|
||||
},
|
||||
modelValue: {
|
||||
type: Object as () => CurrentModelValueType,
|
||||
type: Object as () => IMappingSetting,
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
@@ -171,27 +174,60 @@ export default defineComponent({
|
||||
type:Array,
|
||||
default:()=>[]
|
||||
},
|
||||
//例:[val=>!!val ||'入力してください']
|
||||
rules: {
|
||||
type: String,
|
||||
default: undefined
|
||||
},
|
||||
required: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
requiredMessage: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
|
||||
setup(props, { emit }) {
|
||||
const fieldRef=ref();
|
||||
const source = props.context.find(element => element?.props?.name === 'sources')
|
||||
|
||||
const sourceApp = computed(() => source?.props?.modelValue?.app);
|
||||
|
||||
const sourceAppId = computed(() => sourceApp.value?.id);
|
||||
|
||||
//ルール設定
|
||||
const checkMapping = (val:IMappingSetting)=>{
|
||||
if(!val || !val.data){
|
||||
return false;
|
||||
}
|
||||
console.log(val);
|
||||
const mappingDatas = val.data.filter(item=>item.from?.sharedText && item.to.fields?.length > 0);
|
||||
return mappingDatas.length>0;
|
||||
}
|
||||
const customExp = props.rules === undefined ? [] : eval(props.rules);
|
||||
const errmsg = props.requiredMessage?props.requiredMessage:`${props.displayName}を選択してください。`;
|
||||
const requiredExp = props.required ? [((val: any) => checkMapping(val) || errmsg)] : [];
|
||||
const rulesExp = [...requiredExp, ...customExp];
|
||||
|
||||
// const mappingProps = ref(props.modelValue?.data ?? []);
|
||||
|
||||
// const createWithNull = ref(props.modelValue?.createWithNull ?? false);
|
||||
|
||||
const mappingProps = reactive<IMappingSetting>({
|
||||
data:props.modelValue?.data ?? [],
|
||||
createWithNull:props.modelValue?.createWithNull ?? false
|
||||
});
|
||||
|
||||
const closeDg = () => {
|
||||
emit('update:modelValue', { data: mappingProps.value, createWithNull: createWithNull.value });
|
||||
fieldRef.value.validate();
|
||||
emit('update:modelValue',mappingProps);
|
||||
}
|
||||
|
||||
const closeToDg = () => {
|
||||
emit('update:modelValue', { data: mappingProps.value, createWithNull: createWithNull.value });
|
||||
emit('update:modelValue',mappingProps);
|
||||
}
|
||||
|
||||
const mappingProps = ref(props.modelValue?.data ?? []);
|
||||
|
||||
const createWithNull = ref(props.modelValue?.createWithNull ?? false)
|
||||
|
||||
// 外部ソースコンポーネントの appid をリッスンし、変更されたときに現在のコンポーネントを更新します
|
||||
watch(() => sourceAppId.value, async (newId,) => {
|
||||
if (!newId) return;
|
||||
@@ -210,7 +246,7 @@ export default defineComponent({
|
||||
.map(f => ({ name: f.label, objectType: 'field', ...f }))
|
||||
.map(f => {
|
||||
// 更新前の値を求める
|
||||
const beforeData = mappingProps.value.find(m => m.to.fields[0].code === f.code)
|
||||
const beforeData = mappingProps.data.find(m => m.to.fields[0].code === f.code)
|
||||
return {
|
||||
id: uuidv4(),
|
||||
from: beforeData?.from ?? {}, // 以前のデータを入力します
|
||||
@@ -235,12 +271,12 @@ export default defineComponent({
|
||||
ktAppFields.filter(f => lookupFixedField.includes(f.to.fields[0].code)).forEach(f => f.disabled = true)
|
||||
}
|
||||
|
||||
mappingProps.value = ktAppFields
|
||||
mappingProps.data = ktAppFields
|
||||
}
|
||||
|
||||
const mappingObjectsInputDisplay = computed(() =>
|
||||
(mappingProps.value && Array.isArray(mappingProps.value)) ?
|
||||
mappingProps.value
|
||||
(mappingProps.data && Array.isArray(mappingProps.data)) ?
|
||||
mappingProps.data
|
||||
.filter(item => item.from?.sharedText && item.to.fields?.length > 0)
|
||||
.map(item => {
|
||||
return `field(${item.to.app?.id},${item.to.fields[0].label}) = ${item.from.sharedText} `;
|
||||
@@ -251,17 +287,17 @@ export default defineComponent({
|
||||
const btnDisable = computed(() => props.onlySourceSelect ? !(source?.props?.modelValue?.app?.id) : false);
|
||||
|
||||
watchEffect(() => {
|
||||
emit('update:modelValue', { data: mappingProps.value, createWithNull: createWithNull.value });
|
||||
emit('update:modelValue', mappingProps);
|
||||
});
|
||||
|
||||
return {
|
||||
uuidv4,
|
||||
dgIsShow: ref(false),
|
||||
fieldRef,
|
||||
closeDg,
|
||||
toDgIsShow: ref(false),
|
||||
closeToDg,
|
||||
mappingProps,
|
||||
createWithNull,
|
||||
updateFields,
|
||||
// addMappingObject: () => mappingProps.push(defaultMappingProp()),
|
||||
// deleteMappingObject,
|
||||
@@ -269,6 +305,8 @@ export default defineComponent({
|
||||
sourceApp,
|
||||
sourceAppId,
|
||||
btnDisable,
|
||||
rulesExp,
|
||||
checkMapping,
|
||||
config: {
|
||||
canInput: false,
|
||||
buttonsConfig: [
|
||||
|
||||
Reference in New Issue
Block a user