123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <template>
- <a-modal v-model:open="visible" :width="334" centered>
- <template #title> 填涂区设置 </template>
- <a-form
- ref="formRef"
- :model="formData"
- :rules="rules"
- :label-col="{ style: { width: '60px' } }"
- >
- <a-form-item label="未填涂">
- <div
- class="color-block color-unfill"
- :style="{ backgroundColor: formData.unfillColor }"
- @click="onEditColor('unfillColor')"
- ></div>
- <a-checkbox v-model:checked="formData.unfillShow">显示</a-checkbox>
- </a-form-item>
- <a-form-item label="已填涂">
- <div
- class="color-block color-fill"
- :style="{ backgroundColor: formData.fillColor }"
- @click="onEditColor('fillColor')"
- ></div>
- <a-checkbox v-model:checked="formData.fillShow">显示</a-checkbox>
- </a-form-item>
- <a-form-item name="borderWidth" label="宽度">
- <a-input-number
- v-model:value="formData.borderWidth"
- style="width: 40px; margin-right: 4px"
- :min="1"
- :max="9"
- :precision="0"
- :controls="false"
- />
- <span class="input-tips">像素</span>
- </a-form-item>
- </a-form>
- <template #footer>
- <div class="box-justify">
- <a-button type="link" @click="initSet">恢复默认值</a-button>
- <div>
- <a-button type="text" @click="close">取消</a-button>
- <a-button type="primary" @click="confirm">确认</a-button>
- </div>
- </div>
- </template>
- </a-modal>
- <ColorPickerDialog
- ref="colorPickerDialogRef"
- :color="curColor"
- @confirm="onColorConfirm"
- />
- </template>
- <script setup lang="ts">
- import { reactive, ref, watch, UnwrapRef } from "vue";
- import { message } from "ant-design-vue";
- import useModal from "@/hooks/useModal";
- import { useUserStore } from "@/store";
- import { objModifyAssign } from "@/utils/tool";
- import ColorPickerDialog from "./ColorPickerDialog.vue";
- defineOptions({
- name: "FillAreaSetDialog",
- });
- /* modal */
- const { visible, open, close } = useModal();
- defineExpose({ open, close });
- const userStore = useUserStore();
- const defaultFormData = {
- fillColor: "#f53f3f",
- fillShow: true,
- unfillColor: "#165DFF",
- unfillShow: false,
- borderWidth: 2,
- };
- const emit = defineEmits(["modified"]);
- type FormDataType = typeof defaultFormData;
- const formRef = ref();
- const formData: UnwrapRef<FormDataType> = reactive({
- ...defaultFormData,
- });
- const rules: FormRules<keyof FormDataType> = {
- borderWidth: [
- {
- required: true,
- message: "请输入",
- trigger: "change",
- },
- ],
- };
- function initSet() {
- objModifyAssign(formData, defaultFormData);
- }
- async function confirm() {
- const valid = await formRef.value?.validate().catch(() => false);
- if (!valid) return;
- userStore.setRecogFillSet(formData);
- message.success("保存成功!");
- emit("modified", formData);
- close();
- }
- // color picker
- type EditType = "fillColor" | "unfillColor";
- const curColor = ref("");
- const colorPickerDialogRef = ref();
- const editType = ref<EditType>("fillColor");
- function onEditColor(type: EditType) {
- curColor.value =
- type === "fillColor" ? formData.fillColor : formData.unfillColor;
- editType.value = type;
- colorPickerDialogRef.value?.open();
- }
- function onColorConfirm(val: string) {
- if (editType.value === "fillColor") {
- formData.fillColor = val;
- } else {
- formData.unfillColor = val;
- }
- }
- /* init modal */
- watch(
- () => visible.value,
- (val) => {
- if (val) {
- modalOpenHandle();
- }
- },
- {
- immediate: true,
- }
- );
- function modalOpenHandle() {
- objModifyAssign(formData, userStore.recogFillSet || defaultFormData);
- }
- </script>
- <style lang="less" scoped>
- .color-block {
- display: inline-block;
- vertical-align: middle;
- width: 32px;
- height: 32px;
- border-radius: 6px;
- margin-right: 8px;
- cursor: pointer;
- &:hover {
- opacity: 0.8;
- }
- }
- .input-tips {
- display: inline-block;
- vertical-align: middle;
- margin-top: 3px;
- }
- </style>
|