feat: 格式化分组名称显示
This commit is contained in:
@@ -5,8 +5,8 @@ const mockGroups: Group[] = [
|
|||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
name: "openai-main",
|
name: "openai-main",
|
||||||
display_name: "OpenAI主组",
|
display_name: "",
|
||||||
description: "OpenAI主要API组",
|
description: "",
|
||||||
sort: 1,
|
sort: 1,
|
||||||
channel_type: "openai",
|
channel_type: "openai",
|
||||||
upstreams: [
|
upstreams: [
|
||||||
|
@@ -14,6 +14,7 @@ import {
|
|||||||
NTag,
|
NTag,
|
||||||
useMessage,
|
useMessage,
|
||||||
} from "naive-ui";
|
} from "naive-ui";
|
||||||
|
import { getGroupDisplayName } from "@/utils/display";
|
||||||
import { onMounted, ref, watch } from "vue";
|
import { onMounted, ref, watch } from "vue";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -94,7 +95,7 @@ function copyUrl(url: string) {
|
|||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div class="header-left">
|
<div class="header-left">
|
||||||
<h3 class="group-title">
|
<h3 class="group-title">
|
||||||
{{ group?.display_name || group?.name || "请选择分组" }}
|
{{ group ? getGroupDisplayName(group) : "请选择分组" }}
|
||||||
<code
|
<code
|
||||||
v-if="group"
|
v-if="group"
|
||||||
class="group-url"
|
class="group-url"
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { keysApi } from "@/api/keys";
|
import { keysApi } from "@/api/keys";
|
||||||
import type { Group } from "@/types/models";
|
import type { Group } from "@/types/models";
|
||||||
|
import { getGroupDisplayName } from "@/utils/display";
|
||||||
import { NButton, NCard, NEmpty, NInput, NSpin, NTag, useMessage } from "naive-ui";
|
import { NButton, NCard, NEmpty, NInput, NSpin, NTag, useMessage } from "naive-ui";
|
||||||
import { computed, ref } from "vue";
|
import { computed, ref } from "vue";
|
||||||
|
|
||||||
@@ -115,7 +116,7 @@ async function createDemoGroup() {
|
|||||||
<span v-else>🔧</span>
|
<span v-else>🔧</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="group-content">
|
<div class="group-content">
|
||||||
<div class="group-name">{{ group.display_name || group.name }}</div>
|
<div class="group-name">{{ getGroupDisplayName(group) }}</div>
|
||||||
<div class="group-meta">
|
<div class="group-meta">
|
||||||
<n-tag size="tiny" :type="getChannelTagType(group.channel_type)">
|
<n-tag size="tiny" :type="getChannelTagType(group.channel_type)">
|
||||||
{{ group.channel_type }}
|
{{ group.channel_type }}
|
||||||
|
39
web/src/utils/display.ts
Normal file
39
web/src/utils/display.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import type { Group } from "@/types/models";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a string from camelCase, snake_case, or kebab-case
|
||||||
|
* into a more readable format with spaces and capitalized words.
|
||||||
|
*
|
||||||
|
* @param name The input string.
|
||||||
|
* @returns The formatted string.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* formatDisplayName("myGroupName") // "My Group Name"
|
||||||
|
* formatDisplayName("my_group_name") // "My Group Name"
|
||||||
|
* formatDisplayName("my-group-name") // "My Group Name"
|
||||||
|
* formatDisplayName("MyGroup") // "My Group"
|
||||||
|
*/
|
||||||
|
export function formatDisplayName(name: string): string {
|
||||||
|
if (!name) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace snake_case and kebab-case with spaces, and add a space before uppercase letters in camelCase.
|
||||||
|
const result = name.replace(/[_-]/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2");
|
||||||
|
|
||||||
|
// Capitalize the first letter of each word.
|
||||||
|
return result
|
||||||
|
.split(" ")
|
||||||
|
.filter(word => word.length > 0)
|
||||||
|
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
||||||
|
.join(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the display name for a group, falling back to a formatted version of its name.
|
||||||
|
* @param group The group object.
|
||||||
|
* @returns The display name for the group.
|
||||||
|
*/
|
||||||
|
export function getGroupDisplayName(group: Group): string {
|
||||||
|
return group.display_name || formatDisplayName(group.name);
|
||||||
|
}
|
Reference in New Issue
Block a user