Skip to content

Commit 04158de

Browse files
Feat: Rename and Delete for imported Models ☁️ (#6969)
## Summary Add Rename and Delete options for Personal Models. Also updates and standardizes some styles for Cards and adds a simple Confirmation dialog. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6969-WIP-Feat-Rename-and-Delete-for-custom-Models-2b86d73d36508140a687e929b0544ae6) by [Unito](https://www.unito.io) --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent 072f1f6 commit 04158de

File tree

21 files changed

+456
-161
lines changed

21 files changed

+456
-161
lines changed
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
<template>
2-
<div :class="iconGroupClasses">
2+
<div
3+
:class="
4+
cn(
5+
'flex justify-center items-center shrink-0 outline-hidden border-none p-0 rounded-lg bg-secondary-background shadow-sm transition-all duration-200 cursor-pointer'
6+
)
7+
"
8+
>
39
<slot></slot>
410
</div>
511
</template>
612

713
<script setup lang="ts">
814
import { cn } from '@/utils/tailwindUtil'
9-
10-
const iconGroupClasses = cn(
11-
'flex justify-center items-center shrink-0',
12-
'outline-hidden border-none p-0 rounded-lg',
13-
'bg-secondary-background shadow-sm',
14-
'transition-all duration-200',
15-
'cursor-pointer'
16-
)
1715
</script>

src/components/button/MoreButton.vue

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div class="relative inline-flex items-center">
3-
<IconButton :size="size" :type="type" @click="toggle">
3+
<IconButton :size="size" :type="type" @click="popover?.toggle">
44
<i v-if="!isVertical" class="icon-[lucide--ellipsis] text-sm" />
55
<i v-else class="icon-[lucide--more-vertical] text-sm" />
66
</IconButton>
@@ -25,8 +25,18 @@
2525
)
2626
}
2727
}"
28-
@show="$emit('menuOpened')"
29-
@hide="$emit('menuClosed')"
28+
@show="
29+
() => {
30+
isOpen = true
31+
$emit('menuOpened')
32+
}
33+
"
34+
@hide="
35+
() => {
36+
isOpen = false
37+
$emit('menuClosed')
38+
}
39+
"
3040
>
3141
<div class="flex min-w-40 flex-col gap-2 p-2">
3242
<slot :close="hide" />
@@ -48,8 +58,6 @@ interface MoreButtonProps extends BaseButtonProps {
4858
isVertical?: boolean
4959
}
5060
51-
const popover = ref<InstanceType<typeof Popover>>()
52-
5361
const {
5462
size = 'md',
5563
type = 'secondary',
@@ -61,15 +69,15 @@ defineEmits<{
6169
menuClosed: []
6270
}>()
6371
64-
const toggle = (event: Event) => {
65-
popover.value?.toggle(event)
66-
}
72+
const isOpen = ref(false)
73+
const popover = ref<InstanceType<typeof Popover>>()
6774
68-
const hide = () => {
75+
function hide() {
6976
popover.value?.hide()
7077
}
7178
7279
defineExpose({
73-
hide
80+
hide,
81+
isOpen
7482
})
7583
</script>

src/components/common/EditableText.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
...inputAttrs
1919
}
2020
}"
21-
@keyup.enter="blurInputElement"
22-
@keyup.escape="cancelEditing"
21+
@keyup.enter.capture.stop="blurInputElement"
22+
@keyup.escape.stop="cancelEditing"
2323
@click.stop
2424
@pointerdown.stop.capture
2525
@pointermove.stop.capture
@@ -38,7 +38,7 @@ const {
3838
} = defineProps<{
3939
modelValue: string
4040
isEditing?: boolean
41-
inputAttrs?: Record<string, any>
41+
inputAttrs?: Record<string, string>
4242
}>()
4343
4444
const emit = defineEmits(['update:modelValue', 'edit', 'cancel'])

src/components/dialog/GlobalDialog.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<component
1515
:is="item.headerComponent"
1616
v-if="item.headerComponent"
17+
v-bind="item.headerProps"
1718
:id="item.key"
1819
/>
1920
<h3 v-else :id="item.key">
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<template>
2+
<div
3+
class="flex flex-col px-4 py-2 text-sm text-muted-foreground border-t border-border-default"
4+
>
5+
<p v-if="promptTextReal">
6+
{{ promptTextReal }}
7+
</p>
8+
</div>
9+
</template>
10+
<script setup lang="ts">
11+
import { computed, toValue } from 'vue'
12+
import type { MaybeRefOrGetter } from 'vue'
13+
14+
const { promptText } = defineProps<{
15+
promptText?: MaybeRefOrGetter<string>
16+
}>()
17+
18+
const promptTextReal = computed(() => toValue(promptText))
19+
</script>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<template>
2+
<section class="w-full flex gap-2 justify-end px-2 pb-2">
3+
<TextButton
4+
:label="cancelTextX"
5+
:disabled
6+
type="transparent"
7+
autofocus
8+
@click="$emit('cancel')"
9+
/>
10+
<TextButton
11+
:label="confirmTextX"
12+
:disabled
13+
type="transparent"
14+
:class="confirmClass"
15+
@click="$emit('confirm')"
16+
/>
17+
</section>
18+
</template>
19+
<script setup lang="ts">
20+
import { computed, toValue } from 'vue'
21+
import type { MaybeRefOrGetter } from 'vue'
22+
import { useI18n } from 'vue-i18n'
23+
24+
import TextButton from '@/components/button/TextButton.vue'
25+
26+
const { t } = useI18n()
27+
28+
const { cancelText, confirmText, confirmClass, optionsDisabled } = defineProps<{
29+
cancelText?: string
30+
confirmText?: string
31+
confirmClass?: string
32+
optionsDisabled?: MaybeRefOrGetter<boolean>
33+
}>()
34+
35+
defineEmits<{
36+
cancel: []
37+
confirm: []
38+
}>()
39+
40+
const confirmTextX = computed(() => confirmText || t('g.confirm'))
41+
const cancelTextX = computed(() => cancelText || t('g.cancel'))
42+
const disabled = computed(() => toValue(optionsDisabled))
43+
</script>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<template>
2+
<div
3+
class="flex items-center gap-2 p-4 font-bold text-sm text-base-foreground font-inter"
4+
>
5+
<span v-if="title" class="flex-auto">{{ title }}</span>
6+
</div>
7+
</template>
8+
<script setup lang="ts">
9+
defineProps<{
10+
title?: string
11+
}>()
12+
</script>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import ConfirmBody from '@/components/dialog/confirm/ConfirmBody.vue'
2+
import ConfirmFooter from '@/components/dialog/confirm/ConfirmFooter.vue'
3+
import ConfirmHeader from '@/components/dialog/confirm/ConfirmHeader.vue'
4+
import { useDialogStore } from '@/stores/dialogStore'
5+
import type { ComponentAttrs } from 'vue-component-type-helpers'
6+
7+
interface ConfirmDialogOptions {
8+
headerProps?: ComponentAttrs<typeof ConfirmHeader>
9+
props?: ComponentAttrs<typeof ConfirmBody>
10+
footerProps?: ComponentAttrs<typeof ConfirmFooter>
11+
}
12+
13+
export function showConfirmDialog(options: ConfirmDialogOptions = {}) {
14+
const dialogStore = useDialogStore()
15+
const { headerProps, props, footerProps } = options
16+
return dialogStore.showDialog({
17+
headerComponent: ConfirmHeader,
18+
component: ConfirmBody,
19+
footerComponent: ConfirmFooter,
20+
headerProps,
21+
props,
22+
footerProps,
23+
dialogComponentProps: {
24+
pt: {
25+
header: 'py-0! px-0!',
26+
content: 'p-0!',
27+
footer: 'p-0!'
28+
}
29+
}
30+
})
31+
}

src/composables/useFeatureFlags.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ export enum ServerFeatureFlag {
99
SUPPORTS_PREVIEW_METADATA = 'supports_preview_metadata',
1010
MAX_UPLOAD_SIZE = 'max_upload_size',
1111
MANAGER_SUPPORTS_V4 = 'extension.manager.supports_v4',
12-
MODEL_UPLOAD_BUTTON_ENABLED = 'model_upload_button_enabled'
12+
MODEL_UPLOAD_BUTTON_ENABLED = 'model_upload_button_enabled',
13+
ASSET_UPDATE_OPTIONS_ENABLED = 'asset_update_options_enabled'
1314
}
1415

1516
/**
@@ -31,6 +32,12 @@ export function useFeatureFlags() {
3132
ServerFeatureFlag.MODEL_UPLOAD_BUTTON_ENABLED,
3233
false
3334
)
35+
},
36+
get assetUpdateOptionsEnabled() {
37+
return api.getServerFeature(
38+
ServerFeatureFlag.ASSET_UPDATE_OPTIONS_ENABLED,
39+
false
40+
)
3441
}
3542
})
3643

src/i18n.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ export const i18n = createI18n({
163163
legacy: false,
164164
locale: navigator.language.split('-')[0] || 'en',
165165
fallbackLocale: 'en',
166+
escapeParameter: true,
166167
messages,
167168
// Ignore warnings for locale options as each option is in its own language.
168169
// e.g. "English", "中文", "Русский", "日本語", "한국어", "Français", "Español"

0 commit comments

Comments
 (0)