diff --git a/application/src/main/resources/extensions/system-setting.yaml b/application/src/main/resources/extensions/system-setting.yaml index cd7aa58aa..f287d1274 100644 --- a/application/src/main/resources/extensions/system-setting.yaml +++ b/application/src/main/resources/extensions/system-setting.yaml @@ -17,9 +17,13 @@ spec: - $formkit: attachment label: Logo name: logo + accepts: + - 'image/*' - $formkit: attachment label: Favicon name: favicon + accepts: + - 'image/*' - group: post label: 文章设置 formSchema: diff --git a/console/docs/custom-formkit-input/README.md b/console/docs/custom-formkit-input/README.md index 39d1084ca..7a54ec6ab 100644 --- a/console/docs/custom-formkit-input/README.md +++ b/console/docs/custom-formkit-input/README.md @@ -13,6 +13,8 @@ 1. language: 目前支持 `yaml`, `html`, `css`, `javascript`, `json` 2. height: 编辑器高度,如:`100px` - `attachment`: 附件选择 + - 参数 + 1. accepts:允许上传的文件类型,如:`image/*` - `repeater`: 定义一个对象集合,可以让使用者可视化的操作集合。 - `menuCheckbox`:选择一组菜单 - `menuRadio`:选择一个菜单 diff --git a/console/src/formkit/inputs/attachment/AttachmentInput.vue b/console/src/formkit/inputs/attachment/AttachmentInput.vue index 53acbecad..15e694262 100644 --- a/console/src/formkit/inputs/attachment/AttachmentInput.vue +++ b/console/src/formkit/inputs/attachment/AttachmentInput.vue @@ -56,6 +56,9 @@ const onAttachmentSelect = (attachments: AttachmentLike[]) => { diff --git a/console/src/formkit/inputs/attachment/index.ts b/console/src/formkit/inputs/attachment/index.ts index bdc7253ed..ba74535ed 100644 --- a/console/src/formkit/inputs/attachment/index.ts +++ b/console/src/formkit/inputs/attachment/index.ts @@ -4,7 +4,7 @@ import AttachmentInput from "./AttachmentInput.vue"; export const attachment = createInput(AttachmentInput, { type: "input", - props: [], + props: ["accepts"], forceTypeProp: "text", features: [initialValue], }); diff --git a/console/src/modules/contents/attachments/components/AttachmentFileTypeIcon.vue b/console/src/modules/contents/attachments/components/AttachmentFileTypeIcon.vue index fd54e6b5c..125b58a17 100644 --- a/console/src/modules/contents/attachments/components/AttachmentFileTypeIcon.vue +++ b/console/src/modules/contents/attachments/components/AttachmentFileTypeIcon.vue @@ -109,7 +109,7 @@ const iconClass = computed(() => { {{ getExtname }} diff --git a/console/src/modules/contents/attachments/components/AttachmentSelectorModal.vue b/console/src/modules/contents/attachments/components/AttachmentSelectorModal.vue index ef411f811..8005c917b 100644 --- a/console/src/modules/contents/attachments/components/AttachmentSelectorModal.vue +++ b/console/src/modules/contents/attachments/components/AttachmentSelectorModal.vue @@ -1,6 +1,6 @@ diff --git a/console/src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue b/console/src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue index 64322478e..f5291e72b 100644 --- a/console/src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue +++ b/console/src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue @@ -22,13 +22,20 @@ import AttachmentUploadModal from "../AttachmentUploadModal.vue"; import AttachmentFileTypeIcon from "../AttachmentFileTypeIcon.vue"; import AttachmentDetailModal from "../AttachmentDetailModal.vue"; import AttachmentGroupList from "../AttachmentGroupList.vue"; +import { matchMediaTypes } from "@/utils/media-type"; -withDefaults( +const props = withDefaults( defineProps<{ selected: AttachmentLike[]; + accepts?: string[]; + min?: number; + max?: number; }>(), { selected: () => [], + accepts: () => ["*/*"], + min: undefined, + max: undefined, } ); @@ -66,6 +73,23 @@ const handleOpenDetail = (attachment: Attachment) => { selectedAttachment.value = attachment; detailVisible.value = true; }; + +const isDisabled = (attachment: Attachment) => { + const isMatchMediaType = matchMediaTypes( + attachment.spec.mediaType || "*/*", + props.accepts + ); + + if ( + props.max !== undefined && + props.max <= selectedAttachments.value.size && + !isChecked(attachment) + ) { + return true; + } + + return !isMatchMediaType; +};