Skip to content

Commit

Permalink
chore: update table dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
YangFong committed Dec 15, 2024
1 parent 2f90f1d commit cb466a7
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 40 deletions.
77 changes: 37 additions & 40 deletions src/components/CodemirrorEditor/InsertFormDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ import {
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog'
import { Label } from '@/components/ui/label'
import {
NumberField,
NumberFieldContent,
NumberFieldDecrement,
NumberFieldIncrement,
NumberFieldInput,
} from '@/components/ui/number-field'
import { useDisplayStore, useStore } from '@/stores'
import { createTable } from '@/utils'
Expand Down Expand Up @@ -51,40 +59,36 @@ function onUpdate(val: boolean) {
<DialogHeader>
<DialogTitle>插入表格</DialogTitle>
</DialogHeader>
<el-row class="tb-options" type="flex" align="middle" :gutter="10">
<el-col :span="12">
行数:
<el-input-number
v-model="rowNum"
controls-position="right"
:min="1"
:max="100"
size="small"
/>
</el-col>
<el-col :span="12">
列数:
<el-input-number
v-model="colNum"
controls-position="right"
:min="1"
:max="100"
size="small"
<div class="space-x-2 flex justify-between">
<NumberField v-model="rowNum" :min="1" :max="100">
<Label>行数</Label>
<NumberFieldContent>
<NumberFieldDecrement />
<NumberFieldInput />
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
<NumberField v-model="colNum" :min="1" :max="100">
<Label>列数</Label>
<NumberFieldContent>
<NumberFieldDecrement />
<NumberFieldInput />
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
</div>
<div class="space-y-2 border-1 rounded p-2">
<div v-for="row in rowNum + 1" :key="row" :class="{ 'head-style': row === 1 }" class="space-x-2 flex">
<Input
v-for="col in colNum" :key="col"
v-model="tableData[`k_${row - 1}_${col - 1}`]"
:class="{
'bg-gray-100 dark:bg-gray-900': row === 1,
}"
:placeholder="row === 1 ? '表头' : ''"
/>
</el-col>
</el-row>
<table style="border-collapse: collapse" class="input-table">
<tr v-for="row in rowNum + 1" :key="row" :class="{ 'head-style': row === 1 }">
<td v-for="col in colNum" :key="col">
<el-input
v-model="tableData[`k_${row - 1}_${col - 1}`]"
align="center"
:placeholder="row === 1 ? '表头' : ''"
/>
</td>
</tr>
</table>

</div>
</div>
<DialogFooter>
<Button variant="outline" @click="toggleShowInsertFormDialog(false)">
取 消
Expand All @@ -98,11 +102,4 @@ function onUpdate(val: boolean) {
</template>

<style lang="less" scoped>
.tb-options {
margin-bottom: 20px;
}
.input-table :deep(.el-input__inner) {
border-radius: 0;
}
</style>
23 changes: 23 additions & 0 deletions src/components/ui/number-field/NumberField.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<script setup lang="ts">
import type { NumberFieldRootEmits, NumberFieldRootProps } from 'radix-vue'
import { cn } from '@/lib/utils'
import { NumberFieldRoot, useForwardPropsEmits } from 'radix-vue'
import { computed, type HTMLAttributes } from 'vue'
const props = defineProps<NumberFieldRootProps & { class?: HTMLAttributes['class'] }>()
const emits = defineEmits<NumberFieldRootEmits>()
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props
return delegated
})
const forwarded = useForwardPropsEmits(delegatedProps, emits)
</script>

<template>
<NumberFieldRoot v-bind="forwarded" :class="cn('grid gap-1.5', props.class)">
<slot />
</NumberFieldRoot>
</template>
14 changes: 14 additions & 0 deletions src/components/ui/number-field/NumberFieldContent.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue'
import { cn } from '@/lib/utils'
const props = defineProps<{
class?: HTMLAttributes['class']
}>()
</script>

<template>
<div :class="cn('relative [&>[data-slot=input]]:has-[[data-slot=increment]]:pr-5 [&>[data-slot=input]]:has-[[data-slot=decrement]]:pl-5', props.class)">
<slot />
</div>
</template>
25 changes: 25 additions & 0 deletions src/components/ui/number-field/NumberFieldDecrement.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<script setup lang="ts">
import type { NumberFieldDecrementProps } from 'radix-vue'
import { cn } from '@/lib/utils'
import { Minus } from 'lucide-vue-next'
import { NumberFieldDecrement, useForwardProps } from 'radix-vue'
import { computed, type HTMLAttributes } from 'vue'
const props = defineProps<NumberFieldDecrementProps & { class?: HTMLAttributes['class'] }>()
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props
return delegated
})
const forwarded = useForwardProps(delegatedProps)
</script>

<template>
<NumberFieldDecrement data-slot="decrement" v-bind="forwarded" :class="cn('absolute top-1/2 -translate-y-1/2 left-0 p-3 disabled:cursor-not-allowed disabled:opacity-20', props.class)">
<slot>
<Minus class="h-4 w-4" />
</slot>
</NumberFieldDecrement>
</template>
25 changes: 25 additions & 0 deletions src/components/ui/number-field/NumberFieldIncrement.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<script setup lang="ts">
import type { NumberFieldIncrementProps } from 'radix-vue'
import { cn } from '@/lib/utils'
import { Plus } from 'lucide-vue-next'
import { NumberFieldIncrement, useForwardProps } from 'radix-vue'
import { computed, type HTMLAttributes } from 'vue'
const props = defineProps<NumberFieldIncrementProps & { class?: HTMLAttributes['class'] }>()
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props
return delegated
})
const forwarded = useForwardProps(delegatedProps)
</script>

<template>
<NumberFieldIncrement data-slot="increment" v-bind="forwarded" :class="cn('absolute top-1/2 -translate-y-1/2 right-0 disabled:cursor-not-allowed disabled:opacity-20 p-3', props.class)">
<slot>
<Plus class="h-4 w-4" />
</slot>
</NumberFieldIncrement>
</template>
16 changes: 16 additions & 0 deletions src/components/ui/number-field/NumberFieldInput.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue'
import { cn } from '@/lib/utils'
import { NumberFieldInput } from 'radix-vue'
const props = defineProps<{
class?: HTMLAttributes['class']
}>()
</script>

<template>
<NumberFieldInput
data-slot="input"
:class="cn('flex h-10 w-full rounded-md border border-input bg-background py-2 text-sm text-center ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', props.class)"
/>
</template>
5 changes: 5 additions & 0 deletions src/components/ui/number-field/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export { default as NumberField } from './NumberField.vue'
export { default as NumberFieldContent } from './NumberFieldContent.vue'
export { default as NumberFieldDecrement } from './NumberFieldDecrement.vue'
export { default as NumberFieldIncrement } from './NumberFieldIncrement.vue'
export { default as NumberFieldInput } from './NumberFieldInput.vue'

0 comments on commit cb466a7

Please sign in to comment.