mirror of https://github.com/usual2970/certimate
				
				
				
			chore: remove unused code
							parent
							
								
									ef9ddd27a5
								
							
						
					
					
						commit
						a1fec5f6ac
					
				| 
						 | 
				
			
			@ -10,12 +10,9 @@
 | 
			
		|||
      "dependencies": {
 | 
			
		||||
        "@ant-design/pro-components": "^2.8.2",
 | 
			
		||||
        "@hookform/resolvers": "^3.9.0",
 | 
			
		||||
        "@radix-ui/react-accordion": "^1.2.0",
 | 
			
		||||
        "@radix-ui/react-collapsible": "^1.1.1",
 | 
			
		||||
        "@radix-ui/react-dialog": "^1.1.2",
 | 
			
		||||
        "@radix-ui/react-dropdown-menu": "^2.1.1",
 | 
			
		||||
        "@radix-ui/react-label": "^2.1.0",
 | 
			
		||||
        "@radix-ui/react-radio-group": "^1.2.0",
 | 
			
		||||
        "@radix-ui/react-scroll-area": "^1.1.0",
 | 
			
		||||
        "@radix-ui/react-select": "^2.1.1",
 | 
			
		||||
        "@radix-ui/react-slot": "^1.1.0",
 | 
			
		||||
| 
						 | 
				
			
			@ -2752,65 +2749,6 @@
 | 
			
		|||
      "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-accordion": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-accordion/-/react-accordion-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@radix-ui/primitive": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-collapsible": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-collection": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-compose-refs": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-context": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-direction": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-id": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-primitive": "2.0.0",
 | 
			
		||||
        "@radix-ui/react-use-controllable-state": "1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@types/react": "*",
 | 
			
		||||
        "@types/react-dom": "*",
 | 
			
		||||
        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
			
		||||
        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@types/react": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "@types/react-dom": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collapsible": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@radix-ui/primitive": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-compose-refs": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-context": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-id": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-presence": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-primitive": "2.0.0",
 | 
			
		||||
        "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-use-layout-effect": "1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@types/react": "*",
 | 
			
		||||
        "@types/react-dom": "*",
 | 
			
		||||
        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
			
		||||
        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@types/react": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "@types/react-dom": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-arrow": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -2833,72 +2771,6 @@
 | 
			
		|||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-collapsible": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@radix-ui/primitive": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-compose-refs": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-context": "1.1.1",
 | 
			
		||||
        "@radix-ui/react-id": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-presence": "1.1.1",
 | 
			
		||||
        "@radix-ui/react-primitive": "2.0.0",
 | 
			
		||||
        "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-use-layout-effect": "1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@types/react": "*",
 | 
			
		||||
        "@types/react-dom": "*",
 | 
			
		||||
        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
			
		||||
        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@types/react": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "@types/react-dom": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-context": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@types/react": "*",
 | 
			
		||||
        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@types/react": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@radix-ui/react-compose-refs": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-use-layout-effect": "1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@types/react": "*",
 | 
			
		||||
        "@types/react-dom": "*",
 | 
			
		||||
        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
			
		||||
        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@types/react": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "@types/react-dom": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-collection": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -3394,37 +3266,6 @@
 | 
			
		|||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-radio-group": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-radio-group/-/react-radio-group-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@radix-ui/primitive": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-compose-refs": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-context": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-direction": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-presence": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-primitive": "2.0.0",
 | 
			
		||||
        "@radix-ui/react-roving-focus": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-use-previous": "1.1.0",
 | 
			
		||||
        "@radix-ui/react-use-size": "1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@types/react": "*",
 | 
			
		||||
        "@types/react-dom": "*",
 | 
			
		||||
        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
			
		||||
        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@types/react": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "@types/react-dom": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-roving-focus": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,12 +12,9 @@
 | 
			
		|||
  "dependencies": {
 | 
			
		||||
    "@ant-design/pro-components": "^2.8.2",
 | 
			
		||||
    "@hookform/resolvers": "^3.9.0",
 | 
			
		||||
    "@radix-ui/react-accordion": "^1.2.0",
 | 
			
		||||
    "@radix-ui/react-collapsible": "^1.1.1",
 | 
			
		||||
    "@radix-ui/react-dialog": "^1.1.2",
 | 
			
		||||
    "@radix-ui/react-dropdown-menu": "^2.1.1",
 | 
			
		||||
    "@radix-ui/react-label": "^2.1.0",
 | 
			
		||||
    "@radix-ui/react-radio-group": "^1.2.0",
 | 
			
		||||
    "@radix-ui/react-scroll-area": "^1.1.0",
 | 
			
		||||
    "@radix-ui/react-select": "^2.1.1",
 | 
			
		||||
    "@radix-ui/react-slot": "^1.1.0",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,46 +0,0 @@
 | 
			
		|||
import * as React from "react";
 | 
			
		||||
import * as AccordionPrimitive from "@radix-ui/react-accordion";
 | 
			
		||||
import { ChevronDown } from "lucide-react";
 | 
			
		||||
 | 
			
		||||
import { cn } from "./utils";
 | 
			
		||||
 | 
			
		||||
const Accordion = AccordionPrimitive.Root;
 | 
			
		||||
 | 
			
		||||
const AccordionItem = React.forwardRef<React.ElementRef<typeof AccordionPrimitive.Item>, React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>>(
 | 
			
		||||
  ({ className, ...props }, ref) => <AccordionPrimitive.Item ref={ref} className={cn("border-b", className)} {...props} />
 | 
			
		||||
);
 | 
			
		||||
AccordionItem.displayName = "AccordionItem";
 | 
			
		||||
 | 
			
		||||
const AccordionTrigger = React.forwardRef<
 | 
			
		||||
  React.ElementRef<typeof AccordionPrimitive.Trigger>,
 | 
			
		||||
  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
 | 
			
		||||
>(({ className, children, ...props }, ref) => (
 | 
			
		||||
  <AccordionPrimitive.Header className="flex">
 | 
			
		||||
    <AccordionPrimitive.Trigger
 | 
			
		||||
      ref={ref}
 | 
			
		||||
      className={cn("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", className)}
 | 
			
		||||
      {...props}
 | 
			
		||||
    >
 | 
			
		||||
      {children}
 | 
			
		||||
      <ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" />
 | 
			
		||||
    </AccordionPrimitive.Trigger>
 | 
			
		||||
  </AccordionPrimitive.Header>
 | 
			
		||||
));
 | 
			
		||||
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
 | 
			
		||||
 | 
			
		||||
const AccordionContent = React.forwardRef<
 | 
			
		||||
  React.ElementRef<typeof AccordionPrimitive.Content>,
 | 
			
		||||
  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
 | 
			
		||||
>(({ className, children, ...props }, ref) => (
 | 
			
		||||
  <AccordionPrimitive.Content
 | 
			
		||||
    ref={ref}
 | 
			
		||||
    className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
 | 
			
		||||
    {...props}
 | 
			
		||||
  >
 | 
			
		||||
    <div className={cn("pb-4 pt-0", className)}>{children}</div>
 | 
			
		||||
  </AccordionPrimitive.Content>
 | 
			
		||||
));
 | 
			
		||||
 | 
			
		||||
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
 | 
			
		||||
 | 
			
		||||
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
 | 
			
		||||
| 
						 | 
				
			
			@ -1,22 +0,0 @@
 | 
			
		|||
import * as React from "react";
 | 
			
		||||
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
 | 
			
		||||
 | 
			
		||||
import { cn } from "./utils";
 | 
			
		||||
 | 
			
		||||
const Collapsible = CollapsiblePrimitive.Root;
 | 
			
		||||
 | 
			
		||||
const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
 | 
			
		||||
 | 
			
		||||
const CollapsibleContent = React.forwardRef<
 | 
			
		||||
  React.ElementRef<typeof CollapsiblePrimitive.CollapsibleContent>,
 | 
			
		||||
  React.ComponentPropsWithoutRef<typeof CollapsiblePrimitive.CollapsibleContent>
 | 
			
		||||
>(({ className, ...props }, ref) => (
 | 
			
		||||
  <CollapsiblePrimitive.CollapsibleContent
 | 
			
		||||
    ref={ref}
 | 
			
		||||
    className={cn("overflow-y-hidden transition-all data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down", className)}
 | 
			
		||||
    {...props}
 | 
			
		||||
  />
 | 
			
		||||
));
 | 
			
		||||
CollapsibleContent.displayName = CollapsiblePrimitive.CollapsibleContent.displayName;
 | 
			
		||||
 | 
			
		||||
export { Collapsible, CollapsibleTrigger, CollapsibleContent };
 | 
			
		||||
| 
						 | 
				
			
			@ -1,34 +0,0 @@
 | 
			
		|||
import * as React from "react";
 | 
			
		||||
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
 | 
			
		||||
import { Circle } from "lucide-react";
 | 
			
		||||
 | 
			
		||||
import { cn } from "./utils";
 | 
			
		||||
 | 
			
		||||
const RadioGroup = React.forwardRef<React.ElementRef<typeof RadioGroupPrimitive.Root>, React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>>(
 | 
			
		||||
  ({ className, ...props }, ref) => {
 | 
			
		||||
    return <RadioGroupPrimitive.Root className={cn("grid gap-2", className)} {...props} ref={ref} />;
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
 | 
			
		||||
 | 
			
		||||
const RadioGroupItem = React.forwardRef<React.ElementRef<typeof RadioGroupPrimitive.Item>, React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>>(
 | 
			
		||||
  ({ className, ...props }, ref) => {
 | 
			
		||||
    return (
 | 
			
		||||
      <RadioGroupPrimitive.Item
 | 
			
		||||
        ref={ref}
 | 
			
		||||
        className={cn(
 | 
			
		||||
          "aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
 | 
			
		||||
          className
 | 
			
		||||
        )}
 | 
			
		||||
        {...props}
 | 
			
		||||
      >
 | 
			
		||||
        <RadioGroupPrimitive.Indicator className="flex items-center justify-center">
 | 
			
		||||
          <Circle className="h-2.5 w-2.5 fill-current text-current" />
 | 
			
		||||
        </RadioGroupPrimitive.Indicator>
 | 
			
		||||
      </RadioGroupPrimitive.Item>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
 | 
			
		||||
 | 
			
		||||
export { RadioGroup, RadioGroupItem };
 | 
			
		||||
| 
						 | 
				
			
			@ -1,13 +1,12 @@
 | 
			
		|||
import { memo, useEffect } from "react";
 | 
			
		||||
import { useForm } from "react-hook-form";
 | 
			
		||||
import { useTranslation } from "react-i18next";
 | 
			
		||||
import { Switch, Tooltip } from "antd";
 | 
			
		||||
import { Collapse, Switch, Tooltip } from "antd";
 | 
			
		||||
import z from "zod";
 | 
			
		||||
import { zodResolver } from "@hookform/resolvers/zod";
 | 
			
		||||
import { ChevronsUpDown, Plus, CircleHelp } from "lucide-react";
 | 
			
		||||
import { ChevronsUpDown as ChevronsUpDownIcon, Plus as PlusIcon, CircleHelp as CircleHelpIcon } from "lucide-react";
 | 
			
		||||
 | 
			
		||||
import { Button } from "@/components/ui/button";
 | 
			
		||||
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible";
 | 
			
		||||
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
 | 
			
		||||
import { Input } from "@/components/ui/input";
 | 
			
		||||
import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from "@/components/ui/select";
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +120,7 @@ const ApplyForm = ({ data }: ApplyFormProps) => {
 | 
			
		|||
                  <EmailsEdit
 | 
			
		||||
                    trigger={
 | 
			
		||||
                      <div className="flex items-center font-normal cursor-pointer text-primary hover:underline">
 | 
			
		||||
                        <Plus size={14} />
 | 
			
		||||
                        <PlusIcon size={14} />
 | 
			
		||||
                        {t("common.button.add")}
 | 
			
		||||
                      </div>
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +167,7 @@ const ApplyForm = ({ data }: ApplyFormProps) => {
 | 
			
		|||
                    mode="add"
 | 
			
		||||
                    trigger={
 | 
			
		||||
                      <div className="flex items-center font-normal cursor-pointer text-primary hover:underline">
 | 
			
		||||
                        <Plus size={14} />
 | 
			
		||||
                        <PlusIcon size={14} />
 | 
			
		||||
                        {t("common.button.add")}
 | 
			
		||||
                      </div>
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -210,134 +209,143 @@ const ApplyForm = ({ data }: ApplyFormProps) => {
 | 
			
		|||
 | 
			
		||||
          <div>
 | 
			
		||||
            <hr />
 | 
			
		||||
            <Collapsible>
 | 
			
		||||
              <CollapsibleTrigger className="w-full my-4">
 | 
			
		||||
                <div className="flex items-center justify-between space-x-4">
 | 
			
		||||
                  <span className="flex-1 text-sm text-left text-gray-600">{t("domain.application.form.advanced_settings.label")}</span>
 | 
			
		||||
                  <ChevronsUpDown className="w-4 h-4" />
 | 
			
		||||
                </div>
 | 
			
		||||
              </CollapsibleTrigger>
 | 
			
		||||
              <CollapsibleContent>
 | 
			
		||||
                <div className="flex flex-col space-y-8">
 | 
			
		||||
                  {/* 证书算法 */}
 | 
			
		||||
                  <FormField
 | 
			
		||||
                    control={form.control}
 | 
			
		||||
                    name="keyAlgorithm"
 | 
			
		||||
                    render={({ field }) => (
 | 
			
		||||
                      <FormItem>
 | 
			
		||||
                        <FormLabel>{t("domain.application.form.key_algorithm.label")}</FormLabel>
 | 
			
		||||
                        <Select
 | 
			
		||||
                          {...field}
 | 
			
		||||
                          value={field.value}
 | 
			
		||||
                          onValueChange={(value) => {
 | 
			
		||||
                            form.setValue("keyAlgorithm", value);
 | 
			
		||||
                          }}
 | 
			
		||||
                        >
 | 
			
		||||
                          <SelectTrigger>
 | 
			
		||||
                            <SelectValue placeholder={t("domain.application.form.key_algorithm.placeholder")} />
 | 
			
		||||
                          </SelectTrigger>
 | 
			
		||||
                          <SelectContent>
 | 
			
		||||
                            <SelectGroup>
 | 
			
		||||
                              <SelectItem value="RSA2048">RSA2048</SelectItem>
 | 
			
		||||
                              <SelectItem value="RSA3072">RSA3072</SelectItem>
 | 
			
		||||
                              <SelectItem value="RSA4096">RSA4096</SelectItem>
 | 
			
		||||
                              <SelectItem value="RSA8192">RSA8192</SelectItem>
 | 
			
		||||
                              <SelectItem value="EC256">EC256</SelectItem>
 | 
			
		||||
                              <SelectItem value="EC384">EC384</SelectItem>
 | 
			
		||||
                            </SelectGroup>
 | 
			
		||||
                          </SelectContent>
 | 
			
		||||
                        </Select>
 | 
			
		||||
                      </FormItem>
 | 
			
		||||
                    )}
 | 
			
		||||
                  />
 | 
			
		||||
 | 
			
		||||
                  {/* DNS */}
 | 
			
		||||
                  <FormField
 | 
			
		||||
                    control={form.control}
 | 
			
		||||
                    name="nameservers"
 | 
			
		||||
                    render={({ field }) => (
 | 
			
		||||
                      <FormItem>
 | 
			
		||||
                        <StringList
 | 
			
		||||
                          value={field.value ?? ""}
 | 
			
		||||
                          onValueChange={(val: string) => {
 | 
			
		||||
                            form.setValue("nameservers", val);
 | 
			
		||||
                          }}
 | 
			
		||||
                          valueType="dns"
 | 
			
		||||
                        ></StringList>
 | 
			
		||||
 | 
			
		||||
                        <FormMessage />
 | 
			
		||||
                      </FormItem>
 | 
			
		||||
                    )}
 | 
			
		||||
                  />
 | 
			
		||||
 | 
			
		||||
                  {/* DNS 超时时间 */}
 | 
			
		||||
                  <FormField
 | 
			
		||||
                    control={form.control}
 | 
			
		||||
                    name="timeout"
 | 
			
		||||
                    render={({ field }) => (
 | 
			
		||||
                      <FormItem>
 | 
			
		||||
                        <FormLabel>{t("domain.application.form.timeout.label")}</FormLabel>
 | 
			
		||||
                        <FormControl>
 | 
			
		||||
                          <Input
 | 
			
		||||
                            type="number"
 | 
			
		||||
                            placeholder={t("domain.application.form.timeout.placeholder")}
 | 
			
		||||
                            {...field}
 | 
			
		||||
                            value={field.value}
 | 
			
		||||
                            onChange={(e) => {
 | 
			
		||||
                              form.setValue("timeout", parseInt(e.target.value));
 | 
			
		||||
                            }}
 | 
			
		||||
                          />
 | 
			
		||||
                        </FormControl>
 | 
			
		||||
 | 
			
		||||
                        <FormMessage />
 | 
			
		||||
                      </FormItem>
 | 
			
		||||
                    )}
 | 
			
		||||
                  />
 | 
			
		||||
 | 
			
		||||
                  {/* 禁用 CNAME 跟随 */}
 | 
			
		||||
                  <FormField
 | 
			
		||||
                    control={form.control}
 | 
			
		||||
                    name="disableFollowCNAME"
 | 
			
		||||
                    render={({ field }) => (
 | 
			
		||||
                      <FormItem>
 | 
			
		||||
                        <FormLabel>
 | 
			
		||||
                          <div className="flex">
 | 
			
		||||
                            <span className="mr-1">{t("domain.application.form.disable_follow_cname.label")} </span>
 | 
			
		||||
                            <Tooltip
 | 
			
		||||
                              title={
 | 
			
		||||
                                <p>
 | 
			
		||||
                                  {t("domain.application.form.disable_follow_cname.tips")}
 | 
			
		||||
                                  <a
 | 
			
		||||
                                    className="text-primary"
 | 
			
		||||
                                    target="_blank"
 | 
			
		||||
                                    href="https://letsencrypt.org/2019/10/09/onboarding-your-customers-with-lets-encrypt-and-acme/#the-advantages-of-a-cname"
 | 
			
		||||
                                  >
 | 
			
		||||
                                    {t("domain.application.form.disable_follow_cname.tips_link")}
 | 
			
		||||
                                  </a>
 | 
			
		||||
                                </p>
 | 
			
		||||
                              }
 | 
			
		||||
                            >
 | 
			
		||||
                              <CircleHelp size={14} />
 | 
			
		||||
                            </Tooltip>
 | 
			
		||||
                          </div>
 | 
			
		||||
                        </FormLabel>
 | 
			
		||||
                        <FormControl>
 | 
			
		||||
                          <div>
 | 
			
		||||
                            <Switch
 | 
			
		||||
                              defaultChecked={field.value}
 | 
			
		||||
                              onChange={(value) => {
 | 
			
		||||
                                form.setValue(field.name, value);
 | 
			
		||||
            <Collapse
 | 
			
		||||
              bordered={false}
 | 
			
		||||
              ghost={true}
 | 
			
		||||
              items={[
 | 
			
		||||
                {
 | 
			
		||||
                  key: "advanced",
 | 
			
		||||
                  styles: {
 | 
			
		||||
                    header: { paddingLeft: 0, paddingRight: 0 },
 | 
			
		||||
                    body: { paddingLeft: 0, paddingRight: 0 },
 | 
			
		||||
                  },
 | 
			
		||||
                  label: <>{t("domain.application.form.advanced_settings.label")}</>,
 | 
			
		||||
                  children: (
 | 
			
		||||
                    <div className="flex flex-col space-y-8">
 | 
			
		||||
                      {/* 证书算法 */}
 | 
			
		||||
                      <FormField
 | 
			
		||||
                        control={form.control}
 | 
			
		||||
                        name="keyAlgorithm"
 | 
			
		||||
                        render={({ field }) => (
 | 
			
		||||
                          <FormItem>
 | 
			
		||||
                            <FormLabel>{t("domain.application.form.key_algorithm.label")}</FormLabel>
 | 
			
		||||
                            <Select
 | 
			
		||||
                              {...field}
 | 
			
		||||
                              value={field.value}
 | 
			
		||||
                              onValueChange={(value) => {
 | 
			
		||||
                                form.setValue("keyAlgorithm", value);
 | 
			
		||||
                              }}
 | 
			
		||||
                            />
 | 
			
		||||
                          </div>
 | 
			
		||||
                        </FormControl>
 | 
			
		||||
                        <FormMessage />
 | 
			
		||||
                      </FormItem>
 | 
			
		||||
                    )}
 | 
			
		||||
                  />
 | 
			
		||||
                </div>
 | 
			
		||||
              </CollapsibleContent>
 | 
			
		||||
            </Collapsible>
 | 
			
		||||
                            >
 | 
			
		||||
                              <SelectTrigger>
 | 
			
		||||
                                <SelectValue placeholder={t("domain.application.form.key_algorithm.placeholder")} />
 | 
			
		||||
                              </SelectTrigger>
 | 
			
		||||
                              <SelectContent>
 | 
			
		||||
                                <SelectGroup>
 | 
			
		||||
                                  <SelectItem value="RSA2048">RSA2048</SelectItem>
 | 
			
		||||
                                  <SelectItem value="RSA3072">RSA3072</SelectItem>
 | 
			
		||||
                                  <SelectItem value="RSA4096">RSA4096</SelectItem>
 | 
			
		||||
                                  <SelectItem value="RSA8192">RSA8192</SelectItem>
 | 
			
		||||
                                  <SelectItem value="EC256">EC256</SelectItem>
 | 
			
		||||
                                  <SelectItem value="EC384">EC384</SelectItem>
 | 
			
		||||
                                </SelectGroup>
 | 
			
		||||
                              </SelectContent>
 | 
			
		||||
                            </Select>
 | 
			
		||||
                          </FormItem>
 | 
			
		||||
                        )}
 | 
			
		||||
                      />
 | 
			
		||||
 | 
			
		||||
                      {/* DNS */}
 | 
			
		||||
                      <FormField
 | 
			
		||||
                        control={form.control}
 | 
			
		||||
                        name="nameservers"
 | 
			
		||||
                        render={({ field }) => (
 | 
			
		||||
                          <FormItem>
 | 
			
		||||
                            <StringList
 | 
			
		||||
                              value={field.value ?? ""}
 | 
			
		||||
                              onValueChange={(val: string) => {
 | 
			
		||||
                                form.setValue("nameservers", val);
 | 
			
		||||
                              }}
 | 
			
		||||
                              valueType="dns"
 | 
			
		||||
                            ></StringList>
 | 
			
		||||
 | 
			
		||||
                            <FormMessage />
 | 
			
		||||
                          </FormItem>
 | 
			
		||||
                        )}
 | 
			
		||||
                      />
 | 
			
		||||
 | 
			
		||||
                      {/* DNS 超时时间 */}
 | 
			
		||||
                      <FormField
 | 
			
		||||
                        control={form.control}
 | 
			
		||||
                        name="timeout"
 | 
			
		||||
                        render={({ field }) => (
 | 
			
		||||
                          <FormItem>
 | 
			
		||||
                            <FormLabel>{t("domain.application.form.timeout.label")}</FormLabel>
 | 
			
		||||
                            <FormControl>
 | 
			
		||||
                              <Input
 | 
			
		||||
                                type="number"
 | 
			
		||||
                                placeholder={t("domain.application.form.timeout.placeholder")}
 | 
			
		||||
                                {...field}
 | 
			
		||||
                                value={field.value}
 | 
			
		||||
                                onChange={(e) => {
 | 
			
		||||
                                  form.setValue("timeout", parseInt(e.target.value));
 | 
			
		||||
                                }}
 | 
			
		||||
                              />
 | 
			
		||||
                            </FormControl>
 | 
			
		||||
 | 
			
		||||
                            <FormMessage />
 | 
			
		||||
                          </FormItem>
 | 
			
		||||
                        )}
 | 
			
		||||
                      />
 | 
			
		||||
 | 
			
		||||
                      {/* 禁用 CNAME 跟随 */}
 | 
			
		||||
                      <FormField
 | 
			
		||||
                        control={form.control}
 | 
			
		||||
                        name="disableFollowCNAME"
 | 
			
		||||
                        render={({ field }) => (
 | 
			
		||||
                          <FormItem>
 | 
			
		||||
                            <FormLabel>
 | 
			
		||||
                              <div className="flex">
 | 
			
		||||
                                <span className="mr-1">{t("domain.application.form.disable_follow_cname.label")} </span>
 | 
			
		||||
                                <Tooltip
 | 
			
		||||
                                  title={
 | 
			
		||||
                                    <p>
 | 
			
		||||
                                      {t("domain.application.form.disable_follow_cname.tips")}
 | 
			
		||||
                                      <a
 | 
			
		||||
                                        className="text-primary"
 | 
			
		||||
                                        target="_blank"
 | 
			
		||||
                                        href="https://letsencrypt.org/2019/10/09/onboarding-your-customers-with-lets-encrypt-and-acme/#the-advantages-of-a-cname"
 | 
			
		||||
                                      >
 | 
			
		||||
                                        {t("domain.application.form.disable_follow_cname.tips_link")}
 | 
			
		||||
                                      </a>
 | 
			
		||||
                                    </p>
 | 
			
		||||
                                  }
 | 
			
		||||
                                >
 | 
			
		||||
                                  <CircleHelpIcon size={14} />
 | 
			
		||||
                                </Tooltip>
 | 
			
		||||
                              </div>
 | 
			
		||||
                            </FormLabel>
 | 
			
		||||
                            <FormControl>
 | 
			
		||||
                              <div>
 | 
			
		||||
                                <Switch
 | 
			
		||||
                                  defaultChecked={field.value}
 | 
			
		||||
                                  onChange={(value) => {
 | 
			
		||||
                                    form.setValue(field.name, value);
 | 
			
		||||
                                  }}
 | 
			
		||||
                                />
 | 
			
		||||
                              </div>
 | 
			
		||||
                            </FormControl>
 | 
			
		||||
                            <FormMessage />
 | 
			
		||||
                          </FormItem>
 | 
			
		||||
                        )}
 | 
			
		||||
                      />
 | 
			
		||||
                    </div>
 | 
			
		||||
                  ),
 | 
			
		||||
                  extra: <ChevronsUpDownIcon size={14} />,
 | 
			
		||||
                  forceRender: true,
 | 
			
		||||
                  showArrow: false,
 | 
			
		||||
                },
 | 
			
		||||
              ]}
 | 
			
		||||
            />
 | 
			
		||||
          </div>
 | 
			
		||||
 | 
			
		||||
          <div className="flex justify-end">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,17 +1,17 @@
 | 
			
		|||
import { WorkflowNode, WorkflowNodeConfig } from "@/domain/workflow";
 | 
			
		||||
import { zodResolver } from "@hookform/resolvers/zod";
 | 
			
		||||
import React, { useEffect } from "react";
 | 
			
		||||
import { useEffect, useState } from "react";
 | 
			
		||||
import { useTranslation } from "react-i18next";
 | 
			
		||||
import { useForm } from "react-hook-form";
 | 
			
		||||
import { zodResolver } from "@hookform/resolvers/zod";
 | 
			
		||||
import { Radio } from "antd";
 | 
			
		||||
import { parseExpression } from "cron-parser";
 | 
			
		||||
import { z } from "zod";
 | 
			
		||||
import { useShallow } from "zustand/shallow";
 | 
			
		||||
 | 
			
		||||
import { Button } from "../ui/button";
 | 
			
		||||
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "../ui/form";
 | 
			
		||||
import { Input } from "../ui/input";
 | 
			
		||||
import { RadioGroup, RadioGroupItem } from "../ui/radio-group";
 | 
			
		||||
import { Label } from "../ui/label";
 | 
			
		||||
import { useTranslation } from "react-i18next";
 | 
			
		||||
import { parseExpression } from "cron-parser";
 | 
			
		||||
import { useWorkflowStore, WorkflowState } from "@/stores/workflow";
 | 
			
		||||
import { useShallow } from "zustand/shallow";
 | 
			
		||||
import { WorkflowNode, WorkflowNodeConfig } from "@/domain/workflow";
 | 
			
		||||
import { usePanel } from "./PanelProvider";
 | 
			
		||||
 | 
			
		||||
const formSchema = z
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ const StartForm = ({ data }: StartFormProps) => {
 | 
			
		|||
 | 
			
		||||
  const { t } = useTranslation();
 | 
			
		||||
 | 
			
		||||
  const [method, setMethod] = React.useState("auto");
 | 
			
		||||
  const [method, setMethod] = useState("auto");
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (data.config && data.config.executionMethod) {
 | 
			
		||||
| 
						 | 
				
			
			@ -95,23 +95,17 @@ const StartForm = ({ data }: StartFormProps) => {
 | 
			
		|||
              <FormItem>
 | 
			
		||||
                <FormLabel>{t(`${i18nPrefix}.executionMethod.label`)}</FormLabel>
 | 
			
		||||
                <FormControl>
 | 
			
		||||
                  <RadioGroup
 | 
			
		||||
                  <Radio.Group
 | 
			
		||||
                    {...field}
 | 
			
		||||
                    value={method}
 | 
			
		||||
                    onValueChange={(val: string) => {
 | 
			
		||||
                      setMethod(val);
 | 
			
		||||
                    onChange={(e) => {
 | 
			
		||||
                      setMethod(e.target.value);
 | 
			
		||||
                    }}
 | 
			
		||||
                    className="flex space-x-3"
 | 
			
		||||
                  >
 | 
			
		||||
                    <div className="flex items-center space-x-2">
 | 
			
		||||
                      <RadioGroupItem value="auto" id="option-one" />
 | 
			
		||||
                      <Label htmlFor="option-one">{t(`${i18nPrefix}.executionMethod.options.auto`)}</Label>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="flex items-center space-x-2">
 | 
			
		||||
                      <RadioGroupItem value="manual" id="option-two" />
 | 
			
		||||
                      <Label htmlFor="option-two">{t(`${i18nPrefix}.executionMethod.options.manual`)}</Label>
 | 
			
		||||
                    </div>
 | 
			
		||||
                  </RadioGroup>
 | 
			
		||||
                    <Radio value="auto">{t(`${i18nPrefix}.executionMethod.options.auto`)}</Radio>
 | 
			
		||||
                    <Radio value="manual">{t(`${i18nPrefix}.executionMethod.options.manual`)}</Radio>
 | 
			
		||||
                  </Radio.Group>
 | 
			
		||||
                </FormControl>
 | 
			
		||||
 | 
			
		||||
                <FormMessage />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,11 @@
 | 
			
		|||
import { useEffect, useMemo, useState } from "react";
 | 
			
		||||
import { useNavigate, useSearchParams } from "react-router-dom";
 | 
			
		||||
import { useTranslation } from "react-i18next";
 | 
			
		||||
import { message, notification, Switch } from "antd";
 | 
			
		||||
import { Button, message, notification, Switch } from "antd";
 | 
			
		||||
import { useShallow } from "zustand/shallow";
 | 
			
		||||
import { ArrowLeft as ArrowLeftIcon } from "lucide-react";
 | 
			
		||||
 | 
			
		||||
import Show from "@/components/Show";
 | 
			
		||||
import { Button } from "@/components/ui/button";
 | 
			
		||||
import End from "@/components/workflow/End";
 | 
			
		||||
import NodeRender from "@/components/workflow/NodeRender";
 | 
			
		||||
import WorkflowBaseInfoEditDialog from "@/components/workflow/WorkflowBaseInfoEditDialog";
 | 
			
		||||
| 
						 | 
				
			
			@ -160,12 +159,12 @@ const WorkflowDetail = () => {
 | 
			
		|||
              <Show
 | 
			
		||||
                when={!!workflow.hasDraft}
 | 
			
		||||
                fallback={
 | 
			
		||||
                  <Button variant={"secondary"} onClick={handleRunClick}>
 | 
			
		||||
                  <Button type="text" onClick={handleRunClick}>
 | 
			
		||||
                    {running ? t("workflow.detail.action.running") : t("workflow.detail.action.run")}
 | 
			
		||||
                  </Button>
 | 
			
		||||
                }
 | 
			
		||||
              >
 | 
			
		||||
                <Button variant={"secondary"} onClick={handleWorkflowSaveClick}>
 | 
			
		||||
                <Button type="primary" onClick={handleWorkflowSaveClick}>
 | 
			
		||||
                  {t("workflow.detail.action.save")}
 | 
			
		||||
                </Button>
 | 
			
		||||
              </Show>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
/** @type {import('tailwindcss').Config} */
 | 
			
		||||
module.exports = {
 | 
			
		||||
  darkMode: ["class"],
 | 
			
		||||
  content: ["./pages/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}", "./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"],
 | 
			
		||||
  content: ["./src/**/*.{ts,tsx}"],
 | 
			
		||||
  prefix: "",
 | 
			
		||||
  theme: {
 | 
			
		||||
    container: {
 | 
			
		||||
| 
						 | 
				
			
			@ -49,38 +49,6 @@ module.exports = {
 | 
			
		|||
        md: "calc(var(--radius) - 2px)",
 | 
			
		||||
        sm: "calc(var(--radius) - 4px)",
 | 
			
		||||
      },
 | 
			
		||||
      keyframes: {
 | 
			
		||||
        "accordion-down": {
 | 
			
		||||
          from: {
 | 
			
		||||
            height: "0",
 | 
			
		||||
          },
 | 
			
		||||
          to: {
 | 
			
		||||
            height: "var(--radix-accordion-content-height)",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "accordion-up": {
 | 
			
		||||
          from: {
 | 
			
		||||
            height: "var(--radix-accordion-content-height)",
 | 
			
		||||
          },
 | 
			
		||||
          to: {
 | 
			
		||||
            height: "0",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "collapsible-down": {
 | 
			
		||||
          from: { height: 0 },
 | 
			
		||||
          to: { height: "var(--radix-collapsible-content-height)" },
 | 
			
		||||
        },
 | 
			
		||||
        "collapsible-up": {
 | 
			
		||||
          from: { height: "var(--radix-collapsible-content-height)" },
 | 
			
		||||
          to: { height: 0 },
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
      animation: {
 | 
			
		||||
        "accordion-down": "accordion-down 0.2s ease-out",
 | 
			
		||||
        "accordion-up": "accordion-up 0.2s ease-out",
 | 
			
		||||
        "collapsible-down": "collapsible-down 0.2s ease-out",
 | 
			
		||||
        "collapsible-up": "collapsible-up 0.2s ease-out",
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  plugins: [require("tailwindcss-animate")],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue