mirror of https://github.com/halo-dev/halo
				
				
				
			Add hidden flag for attachment policies in upload UI (#7792)
#### What type of PR is this? /area ui /milestone 2.22.x /kind feature #### What this PR does / why we need it: This PR adds an option in the storage policy settings to hide a policy from the upload interface. This is useful because some storage policies are not intended for direct user uploads. Hiding them can help declutter the UI and prevent users from selecting them by mistake. #### Which issue(s) this PR fixes: Fixes #7787 #### Does this PR introduce a user-facing change? ```release-note 支持在附件上传界面隐藏部分存储策略 ```pull/7794/head^2
							parent
							
								
									84eefe37fa
								
							
						
					
					
						commit
						b21e77b911
					
				| 
						 | 
				
			
			@ -1,8 +1,9 @@
 | 
			
		|||
<script lang="ts" setup>
 | 
			
		||||
import SubmitButton from "@/components/button/SubmitButton.vue";
 | 
			
		||||
import { attachmentPolicyLabels } from "@/constants/labels";
 | 
			
		||||
import { setFocus } from "@/formkit/utils/focus";
 | 
			
		||||
import type { FormKitSchemaCondition, FormKitSchemaNode } from "@formkit/core";
 | 
			
		||||
import type { Policy } from "@halo-dev/api-client";
 | 
			
		||||
import type { JsonPatchInner, Policy } from "@halo-dev/api-client";
 | 
			
		||||
import { consoleApiClient, coreApiClient } from "@halo-dev/api-client";
 | 
			
		||||
import { Toast, VButton, VLoading, VModal, VSpace } from "@halo-dev/components";
 | 
			
		||||
import { useQuery } from "@tanstack/vue-query";
 | 
			
		||||
| 
						 | 
				
			
			@ -112,6 +113,7 @@ const isSubmitting = ref(false);
 | 
			
		|||
 | 
			
		||||
const handleSave = async (data: {
 | 
			
		||||
  displayName: string;
 | 
			
		||||
  hidden: string;
 | 
			
		||||
  config: Record<string, unknown>;
 | 
			
		||||
}) => {
 | 
			
		||||
  try {
 | 
			
		||||
| 
						 | 
				
			
			@ -127,15 +129,33 @@ const handleSave = async (data: {
 | 
			
		|||
        body: data.config,
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      const jsonPatchInner: JsonPatchInner[] = [
 | 
			
		||||
        {
 | 
			
		||||
          op: "add",
 | 
			
		||||
          path: "/spec/displayName",
 | 
			
		||||
          value: data.displayName,
 | 
			
		||||
        },
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      if (policy.value.metadata.labels) {
 | 
			
		||||
        jsonPatchInner.push({
 | 
			
		||||
          op: "add",
 | 
			
		||||
          path: `/metadata/labels/${attachmentPolicyLabels.HIDDEN_WITH_JSON_PATCH}`,
 | 
			
		||||
          value: data.hidden,
 | 
			
		||||
        });
 | 
			
		||||
      } else {
 | 
			
		||||
        jsonPatchInner.push({
 | 
			
		||||
          op: "add",
 | 
			
		||||
          path: `/metadata/labels`,
 | 
			
		||||
          value: {
 | 
			
		||||
            [attachmentPolicyLabels.HIDDEN]: data.hidden,
 | 
			
		||||
          },
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      await coreApiClient.storage.policy.patchPolicy({
 | 
			
		||||
        name: policy.value.metadata.name,
 | 
			
		||||
        jsonPatchInner: [
 | 
			
		||||
          {
 | 
			
		||||
            op: "add",
 | 
			
		||||
            path: "/spec/displayName",
 | 
			
		||||
            value: data.displayName,
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
        jsonPatchInner: jsonPatchInner,
 | 
			
		||||
      });
 | 
			
		||||
    } else {
 | 
			
		||||
      const { data: policies } =
 | 
			
		||||
| 
						 | 
				
			
			@ -179,6 +199,9 @@ const handleSave = async (data: {
 | 
			
		|||
          metadata: {
 | 
			
		||||
            name: "",
 | 
			
		||||
            generateName: "attachment-policy-",
 | 
			
		||||
            labels: {
 | 
			
		||||
              [attachmentPolicyLabels.HIDDEN]: data.hidden,
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
      });
 | 
			
		||||
| 
						 | 
				
			
			@ -232,6 +255,22 @@ const modalTitle = props.policy
 | 
			
		|||
            name="displayName"
 | 
			
		||||
            validation="required|length:0,50"
 | 
			
		||||
          ></FormKit>
 | 
			
		||||
          <FormKit
 | 
			
		||||
            name="hidden"
 | 
			
		||||
            :value="
 | 
			
		||||
              policy?.metadata.labels?.[attachmentPolicyLabels.HIDDEN] ||
 | 
			
		||||
              'false'
 | 
			
		||||
            "
 | 
			
		||||
            type="checkbox"
 | 
			
		||||
            :label="
 | 
			
		||||
              $t('core.attachment.policy_editing_modal.fields.hidden.label')
 | 
			
		||||
            "
 | 
			
		||||
            :help="
 | 
			
		||||
              $t('core.attachment.policy_editing_modal.fields.hidden.help')
 | 
			
		||||
            "
 | 
			
		||||
            on-value="true"
 | 
			
		||||
            off-value="false"
 | 
			
		||||
          ></FormKit>
 | 
			
		||||
          <FormKit
 | 
			
		||||
            v-if="formSchema && configMapGroupData"
 | 
			
		||||
            :value="toRaw(configMapGroupData) || {}"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
<script lang="ts" setup>
 | 
			
		||||
import { attachmentPolicyLabels } from "@/constants/labels";
 | 
			
		||||
import type { PolicyTemplate } from "@halo-dev/api-client";
 | 
			
		||||
import {
 | 
			
		||||
  IconAddCircle,
 | 
			
		||||
| 
						 | 
				
			
			@ -9,7 +10,7 @@ import {
 | 
			
		|||
  VTabItem,
 | 
			
		||||
  VTabs,
 | 
			
		||||
} from "@halo-dev/components";
 | 
			
		||||
import { onMounted, ref } from "vue";
 | 
			
		||||
import { computed, onMounted, ref } from "vue";
 | 
			
		||||
import { useFetchAttachmentGroup } from "../composables/use-attachment-group";
 | 
			
		||||
import {
 | 
			
		||||
  useFetchAttachmentPolicy,
 | 
			
		||||
| 
						 | 
				
			
			@ -30,10 +31,6 @@ const emit = defineEmits<{
 | 
			
		|||
  (event: "close"): void;
 | 
			
		||||
}>();
 | 
			
		||||
 | 
			
		||||
const { groups, handleFetchGroups } = useFetchAttachmentGroup();
 | 
			
		||||
const { policies, handleFetchPolicies } = useFetchAttachmentPolicy();
 | 
			
		||||
const { policyTemplates } = useFetchAttachmentPolicyTemplate();
 | 
			
		||||
 | 
			
		||||
const modal = ref<InstanceType<typeof VModal> | null>(null);
 | 
			
		||||
const selectedGroupName = ref(initialGroupName || "");
 | 
			
		||||
const selectedPolicyName = ref(initialPolicyName);
 | 
			
		||||
| 
						 | 
				
			
			@ -41,10 +38,23 @@ const policyEditingModal = ref(false);
 | 
			
		|||
const groupEditingModal = ref(false);
 | 
			
		||||
const policyTemplateNameToCreate = ref();
 | 
			
		||||
 | 
			
		||||
const { groups, handleFetchGroups } = useFetchAttachmentGroup();
 | 
			
		||||
const { policyTemplates } = useFetchAttachmentPolicyTemplate();
 | 
			
		||||
const { policies: allPolicies, handleFetchPolicies } =
 | 
			
		||||
  useFetchAttachmentPolicy();
 | 
			
		||||
 | 
			
		||||
const policies = computed(() => {
 | 
			
		||||
  return allPolicies.value?.filter((policy) => {
 | 
			
		||||
    return policy.metadata.labels?.[attachmentPolicyLabels.HIDDEN] !== "true";
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  if (!selectedPolicyName.value) {
 | 
			
		||||
    selectedPolicyName.value = policies.value?.[0].metadata.name;
 | 
			
		||||
  }
 | 
			
		||||
  const initialPolicy = policies.value?.find(
 | 
			
		||||
    (p) => p.metadata.name === initialPolicyName
 | 
			
		||||
  );
 | 
			
		||||
  selectedPolicyName.value =
 | 
			
		||||
    initialPolicy?.metadata.name || policies.value?.[0]?.metadata.name;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const handleOpenCreateNewPolicyModal = async (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,3 +28,10 @@ export enum singlePageLabels {
 | 
			
		|||
  VISIBLE = "content.halo.run/visible",
 | 
			
		||||
  PHASE = "content.halo.run/phase",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// attachment
 | 
			
		||||
export enum attachmentPolicyLabels {
 | 
			
		||||
  // Used for ui display only
 | 
			
		||||
  HIDDEN = "storage.halo.run/policy-hidden-in-upload-ui",
 | 
			
		||||
  HIDDEN_WITH_JSON_PATCH = "storage.halo.run~1policy-hidden-in-upload-ui",
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -752,6 +752,11 @@ core:
 | 
			
		|||
          label: Display name
 | 
			
		||||
        config:
 | 
			
		||||
          label: Policy configuration
 | 
			
		||||
        hidden:
 | 
			
		||||
          label: Hide on upload screen
 | 
			
		||||
          help: >-
 | 
			
		||||
            If enabled, this storage policy will not be visible on the upload
 | 
			
		||||
            screen
 | 
			
		||||
      toast:
 | 
			
		||||
        policy_name_exists: Storage policy name already exists
 | 
			
		||||
    upload_modal:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -504,6 +504,9 @@ core:
 | 
			
		|||
      fields:
 | 
			
		||||
        display_name:
 | 
			
		||||
          label: Nombre para Mostrar
 | 
			
		||||
        hidden:
 | 
			
		||||
          label: Hide in upload interface
 | 
			
		||||
          help: When enabled, this storage policy will be hidden in the upload interface
 | 
			
		||||
    upload_modal:
 | 
			
		||||
      title: Cargar adjunto
 | 
			
		||||
      filters:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -706,6 +706,9 @@ core:
 | 
			
		|||
          label: 名称
 | 
			
		||||
        config:
 | 
			
		||||
          label: 策略配置
 | 
			
		||||
        hidden:
 | 
			
		||||
          label: 在上传界面隐藏
 | 
			
		||||
          help: 开启后,会在上传界面隐藏该存储策略
 | 
			
		||||
      toast:
 | 
			
		||||
        policy_name_exists: 存储策略名称已存在
 | 
			
		||||
    upload_modal:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -691,6 +691,9 @@ core:
 | 
			
		|||
          label: 名稱
 | 
			
		||||
        config:
 | 
			
		||||
          label: 策略配置
 | 
			
		||||
        hidden:
 | 
			
		||||
          label: 在上傳介面隱藏
 | 
			
		||||
          help: 開啟後,會在上傳介面隱藏該儲存策略
 | 
			
		||||
      toast:
 | 
			
		||||
        policy_name_exists: 儲存策略名稱已存在
 | 
			
		||||
    upload_modal:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue