|
|
@@ -1,7 +1,562 @@
|
|
|
-<script setup lang="ts"></script>
|
|
|
-
|
|
|
<template>
|
|
|
- <div>1</div>
|
|
|
+ <div class="menu-management-container">
|
|
|
+ <!-- 头部:Tabs和新建按钮 -->
|
|
|
+ <div class="header-section">
|
|
|
+ <el-tabs v-model="activeTab" @tab-click="handleTabClick">
|
|
|
+ <el-tab-pane label="菜单" name="menu" />
|
|
|
+ <el-tab-pane label="推荐菜" name="recommended" />
|
|
|
+ </el-tabs>
|
|
|
+ <el-button type="primary" @click="openCreateDialog"> 新建菜品 </el-button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 内容区域 -->
|
|
|
+ <div v-if="displayDishList.length > 0" class="content-section">
|
|
|
+ <!-- 菜品卡片网格 -->
|
|
|
+ <div class="dish-grid">
|
|
|
+ <div v-for="(dish, index) in paginatedDishList" :key="dish.id" class="dish-card">
|
|
|
+ <div class="dish-image-wrapper">
|
|
|
+ <img v-if="dish.image" :src="dish.image" alt="菜品图片" />
|
|
|
+ <div v-else class="image-placeholder">
|
|
|
+ <el-icon><Picture /></el-icon>
|
|
|
+ </div>
|
|
|
+ <el-tag v-if="dish.isRecommended" type="primary" class="recommend-tag"> 推荐 </el-tag>
|
|
|
+ </div>
|
|
|
+ <div class="dish-info">
|
|
|
+ <div class="dish-name">
|
|
|
+ {{ dish.name }}
|
|
|
+ </div>
|
|
|
+ <div class="dish-price">¥{{ dish.price }}/{{ dish.unit }}</div>
|
|
|
+ <div v-if="activeTab === 'recommended'" class="dish-recommend-count">{{ dish.recommendCount || 0 }}人推荐</div>
|
|
|
+ </div>
|
|
|
+ <div class="dish-actions">
|
|
|
+ <el-button type="primary" link @click="editDish(dish, index)"> 编辑 </el-button>
|
|
|
+ <el-button type="primary" link @click="deleteDish(dish.id, index)"> 删除 </el-button>
|
|
|
+ <el-button v-if="dish.isRecommended" type="primary" link @click="cancelRecommend(dish.id, index)">
|
|
|
+ 取消推荐
|
|
|
+ </el-button>
|
|
|
+ <el-button v-else type="primary" link @click="setRecommend(dish.id, index)"> 设为推荐 </el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 分页 -->
|
|
|
+ <div class="pagination-section">
|
|
|
+ <el-pagination
|
|
|
+ v-model:current-page="pageable.pageNum"
|
|
|
+ v-model:page-size="pageable.pageSize"
|
|
|
+ :page-sizes="[10, 20, 50, 100]"
|
|
|
+ :total="pageable.total"
|
|
|
+ layout="total, sizes, prev, pager, next, jumper"
|
|
|
+ @size-change="handleSizeChange"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 空状态 -->
|
|
|
+ <div v-else class="empty-state">
|
|
|
+ <el-empty description="暂无数据" />
|
|
|
+ <el-button type="primary" @click="openCreateDialog"> 新建菜品 </el-button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 新建/编辑菜品弹窗 -->
|
|
|
+ <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px" @close="resetForm">
|
|
|
+ <el-form ref="formRef" :model="formData" :rules="rules" label-width="100px">
|
|
|
+ <el-form-item label="菜品名称" prop="name">
|
|
|
+ <el-input v-model="formData.name" placeholder="请输入" maxlength="10" show-word-limit clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="价格 (¥)" prop="price">
|
|
|
+ <el-input-number
|
|
|
+ v-model="formData.price"
|
|
|
+ :min="0"
|
|
|
+ :max="99999.99"
|
|
|
+ :precision="2"
|
|
|
+ :step="0.01"
|
|
|
+ placeholder="请输入"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="成本价 (¥)" prop="costPrice">
|
|
|
+ <el-input-number
|
|
|
+ v-model="formData.costPrice"
|
|
|
+ :min="0"
|
|
|
+ :max="99999.99"
|
|
|
+ :precision="2"
|
|
|
+ :step="0.01"
|
|
|
+ placeholder="请输入"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="单位" prop="unit">
|
|
|
+ <el-select v-model="formData.unit" placeholder="请选择" style="width: 100%">
|
|
|
+ <el-option v-for="unit in unitOptions" :key="unit.value" :label="unit.label" :value="unit.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="图片" prop="image">
|
|
|
+ <UploadImg
|
|
|
+ v-model:image-url="formData.image"
|
|
|
+ :width="'200px'"
|
|
|
+ :height="'200px'"
|
|
|
+ :file-size="10"
|
|
|
+ :file-type="['image/jpeg', 'image/png', 'image/gif', 'image/webp']"
|
|
|
+ :border-radius="'8px'"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="菜品描述" prop="description">
|
|
|
+ <el-input
|
|
|
+ v-model="formData.description"
|
|
|
+ type="textarea"
|
|
|
+ :rows="4"
|
|
|
+ placeholder="请输入"
|
|
|
+ maxlength="300"
|
|
|
+ show-word-limit
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="" prop="isRecommended">
|
|
|
+ <el-checkbox v-model="formData.isRecommended"> 设为推荐 </el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="dialogVisible = false"> 取消 </el-button>
|
|
|
+ <el-button type="primary" :loading="submitLoading" @click="handleSubmit"> 新建菜品 </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
-<style scoped lang="scss"></style>
|
|
|
+<script setup lang="ts">
|
|
|
+import { ref, reactive, computed, onMounted } from "vue";
|
|
|
+import { ElMessage } from "element-plus";
|
|
|
+import type { FormInstance, FormRules } from "element-plus";
|
|
|
+import { Picture } from "@element-plus/icons-vue";
|
|
|
+import UploadImg from "@/components/Upload/Img.vue";
|
|
|
+// TODO: 导入菜单相关的 API 接口
|
|
|
+// import { getDishList, createDish, updateDish, deleteDish, setRecommendDish, cancelRecommendDish } from "@/api/modules/storeDecoration";
|
|
|
+
|
|
|
+// 菜品接口
|
|
|
+interface Dish {
|
|
|
+ id: string;
|
|
|
+ name: string;
|
|
|
+ price: number;
|
|
|
+ costPrice: number;
|
|
|
+ unit: string;
|
|
|
+ image: string;
|
|
|
+ description?: string;
|
|
|
+ isRecommended: boolean;
|
|
|
+ recommendCount?: number;
|
|
|
+}
|
|
|
+
|
|
|
+const dialogVisible = ref(false);
|
|
|
+const formRef = ref<FormInstance>();
|
|
|
+const submitLoading = ref(false);
|
|
|
+const activeTab = ref<"menu" | "recommended">("menu");
|
|
|
+const editIndex = ref<number | null>(null);
|
|
|
+
|
|
|
+// 单位选项
|
|
|
+const unitOptions = [
|
|
|
+ { label: "份", value: "份" },
|
|
|
+ { label: "个", value: "个" },
|
|
|
+ { label: "碗", value: "碗" },
|
|
|
+ { label: "杯", value: "杯" },
|
|
|
+ { label: "盘", value: "盘" },
|
|
|
+ { label: "次", value: "次" },
|
|
|
+ { label: "节", value: "节" }
|
|
|
+];
|
|
|
+
|
|
|
+// 菜品列表
|
|
|
+const dishList = ref<Dish[]>([]);
|
|
|
+
|
|
|
+// 显示菜品列表(根据tab过滤)
|
|
|
+const displayDishList = computed(() => {
|
|
|
+ if (activeTab.value === "recommended") {
|
|
|
+ return dishList.value.filter(dish => dish.isRecommended);
|
|
|
+ }
|
|
|
+ return dishList.value;
|
|
|
+});
|
|
|
+
|
|
|
+// 分页数据
|
|
|
+const pageable = reactive({
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ total: 0
|
|
|
+});
|
|
|
+
|
|
|
+// 分页后的菜品列表
|
|
|
+const paginatedDishList = computed(() => {
|
|
|
+ const list = displayDishList.value;
|
|
|
+ const start = (pageable.pageNum - 1) * pageable.pageSize;
|
|
|
+ const end = start + pageable.pageSize;
|
|
|
+ return list.slice(start, end);
|
|
|
+});
|
|
|
+
|
|
|
+// 弹窗标题
|
|
|
+const dialogTitle = computed(() => (editIndex.value !== null ? "编辑菜品" : "新建菜品"));
|
|
|
+
|
|
|
+// 表单数据
|
|
|
+const formData = reactive({
|
|
|
+ name: "",
|
|
|
+ price: undefined as number | undefined,
|
|
|
+ costPrice: undefined as number | undefined,
|
|
|
+ unit: "份",
|
|
|
+ image: "",
|
|
|
+ description: "",
|
|
|
+ isRecommended: true
|
|
|
+});
|
|
|
+
|
|
|
+// 表单校验规则
|
|
|
+const rules = reactive<FormRules>({
|
|
|
+ name: [
|
|
|
+ { required: true, message: "请输入菜品名称", trigger: "blur" },
|
|
|
+ { max: 10, message: "菜品名称不能超过10个字", trigger: "blur" }
|
|
|
+ ],
|
|
|
+ price: [
|
|
|
+ { required: true, message: "请输入价格", trigger: "blur" },
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (value === undefined || value === null || value === "") {
|
|
|
+ callback(new Error("请输入价格"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (value < 0 || value > 99999.99) {
|
|
|
+ callback(new Error("价格必须在0-99999.99之间"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ },
|
|
|
+ trigger: "blur"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ costPrice: [
|
|
|
+ { required: true, message: "请输入成本价", trigger: "blur" },
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (value === undefined || value === null || value === "") {
|
|
|
+ callback(new Error("请输入成本价"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (value < 0 || value > 99999.99) {
|
|
|
+ callback(new Error("成本价必须在0-99999.99之间"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ },
|
|
|
+ trigger: "blur"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ unit: [{ required: true, message: "请选择单位", trigger: "change" }],
|
|
|
+ image: [{ required: true, message: "请上传图片", trigger: "change" }],
|
|
|
+ description: [{ max: 300, message: "描述不能超过300个字", trigger: "blur" }]
|
|
|
+});
|
|
|
+
|
|
|
+// Tab切换
|
|
|
+const handleTabClick = () => {
|
|
|
+ pageable.pageNum = 1;
|
|
|
+ updatePagination();
|
|
|
+};
|
|
|
+
|
|
|
+// 更新分页总数
|
|
|
+const updatePagination = () => {
|
|
|
+ pageable.total = displayDishList.value.length;
|
|
|
+};
|
|
|
+
|
|
|
+// 分页大小改变
|
|
|
+const handleSizeChange = (size: number) => {
|
|
|
+ pageable.pageSize = size;
|
|
|
+ pageable.pageNum = 1;
|
|
|
+};
|
|
|
+
|
|
|
+// 当前页改变
|
|
|
+const handleCurrentChange = (page: number) => {
|
|
|
+ pageable.pageNum = page;
|
|
|
+};
|
|
|
+
|
|
|
+// 打开新建弹窗
|
|
|
+const openCreateDialog = () => {
|
|
|
+ editIndex.value = null;
|
|
|
+ resetForm();
|
|
|
+ dialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+// 编辑菜品
|
|
|
+const editDish = (dish: Dish, index: number) => {
|
|
|
+ // 在完整列表中查找索引
|
|
|
+ const actualIndex = dishList.value.findIndex(d => d.id === dish.id);
|
|
|
+ editIndex.value = actualIndex > -1 ? actualIndex : null;
|
|
|
+ formData.name = dish.name;
|
|
|
+ formData.price = dish.price;
|
|
|
+ formData.costPrice = dish.costPrice;
|
|
|
+ formData.unit = dish.unit;
|
|
|
+ formData.image = dish.image;
|
|
|
+ formData.description = dish.description || "";
|
|
|
+ formData.isRecommended = dish.isRecommended;
|
|
|
+ dialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+// 删除菜品
|
|
|
+const deleteDish = async (id: string, index: number) => {
|
|
|
+ // TODO: 调用删除菜品接口 deleteDish API
|
|
|
+ // await deleteDish({ id });
|
|
|
+
|
|
|
+ const actualIndex = dishList.value.findIndex(d => d.id === id);
|
|
|
+ if (actualIndex > -1) {
|
|
|
+ dishList.value.splice(actualIndex, 1);
|
|
|
+ updatePagination();
|
|
|
+ // 如果当前页没有数据了,回到上一页
|
|
|
+ if (paginatedDishList.value.length === 0 && pageable.pageNum > 1) {
|
|
|
+ pageable.pageNum--;
|
|
|
+ }
|
|
|
+ ElMessage.success("删除成功");
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 设为推荐
|
|
|
+const setRecommend = async (id: string, index: number) => {
|
|
|
+ // TODO: 调用设为推荐接口 setRecommendDish API
|
|
|
+ // await setRecommendDish({ id });
|
|
|
+
|
|
|
+ const dish = dishList.value.find(d => d.id === id);
|
|
|
+ if (dish) {
|
|
|
+ dish.isRecommended = true;
|
|
|
+ dish.recommendCount = (dish.recommendCount || 0) + 1;
|
|
|
+ ElMessage.success("设置推荐成功");
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 取消推荐
|
|
|
+const cancelRecommend = async (id: string, index: number) => {
|
|
|
+ // TODO: 调用取消推荐接口 cancelRecommendDish API
|
|
|
+ // await cancelRecommendDish({ id });
|
|
|
+
|
|
|
+ const dish = dishList.value.find(d => d.id === id);
|
|
|
+ if (dish) {
|
|
|
+ dish.isRecommended = false;
|
|
|
+ ElMessage.success("取消推荐成功");
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 重置表单
|
|
|
+const resetForm = () => {
|
|
|
+ formData.name = "";
|
|
|
+ formData.price = undefined;
|
|
|
+ formData.costPrice = undefined;
|
|
|
+ formData.unit = "份";
|
|
|
+ formData.image = "";
|
|
|
+ formData.description = "";
|
|
|
+ formData.isRecommended = true;
|
|
|
+ formRef.value?.clearValidate();
|
|
|
+};
|
|
|
+
|
|
|
+// 提交表单
|
|
|
+const handleSubmit = async () => {
|
|
|
+ if (!formRef.value) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ await formRef.value.validate();
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.warning("请完善必填项");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ submitLoading.value = true;
|
|
|
+ try {
|
|
|
+ if (editIndex.value !== null && editIndex.value < dishList.value.length) {
|
|
|
+ // 编辑菜品
|
|
|
+ // TODO: 调用更新菜品接口 updateDish API
|
|
|
+ // const params = {
|
|
|
+ // id: dishList.value[editIndex.value].id,
|
|
|
+ // ...formData
|
|
|
+ // };
|
|
|
+ // await updateDish(params);
|
|
|
+
|
|
|
+ const dish = dishList.value[editIndex.value];
|
|
|
+ const wasRecommended = dish.isRecommended;
|
|
|
+ dish.name = formData.name;
|
|
|
+ dish.price = formData.price!;
|
|
|
+ dish.costPrice = formData.costPrice!;
|
|
|
+ dish.unit = formData.unit;
|
|
|
+ dish.image = formData.image;
|
|
|
+ dish.description = formData.description;
|
|
|
+ dish.isRecommended = formData.isRecommended;
|
|
|
+
|
|
|
+ // 如果从非推荐变为推荐,增加推荐人数
|
|
|
+ if (formData.isRecommended && !wasRecommended) {
|
|
|
+ dish.recommendCount = (dish.recommendCount || 0) + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ ElMessage.success("编辑成功");
|
|
|
+ } else {
|
|
|
+ // 新建菜品
|
|
|
+ // TODO: 调用创建菜品接口 createDish API
|
|
|
+ // const params = {
|
|
|
+ // ...formData,
|
|
|
+ // recommendCount: formData.isRecommended ? 1 : 0
|
|
|
+ // };
|
|
|
+ // const res = await createDish(params);
|
|
|
+ // dishList.value.push(res.data);
|
|
|
+
|
|
|
+ const newDish: Dish = {
|
|
|
+ id: `dish_${Date.now()}`,
|
|
|
+ name: formData.name,
|
|
|
+ price: formData.price!,
|
|
|
+ costPrice: formData.costPrice!,
|
|
|
+ unit: formData.unit,
|
|
|
+ image: formData.image,
|
|
|
+ description: formData.description,
|
|
|
+ isRecommended: formData.isRecommended,
|
|
|
+ recommendCount: formData.isRecommended ? 1 : 0
|
|
|
+ };
|
|
|
+
|
|
|
+ dishList.value.push(newDish);
|
|
|
+ ElMessage.success("新建成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ dialogVisible.value = false;
|
|
|
+ updatePagination();
|
|
|
+ resetForm();
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.error("操作失败,请重试");
|
|
|
+ console.error("操作失败:", error);
|
|
|
+ } finally {
|
|
|
+ submitLoading.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 页面初始化
|
|
|
+onMounted(async () => {
|
|
|
+ // TODO: 调用获取菜品列表接口 getDishList API
|
|
|
+ // const res = await getDishList();
|
|
|
+ // if (res.data) {
|
|
|
+ // dishList.value = res.data;
|
|
|
+ // updatePagination();
|
|
|
+ // }
|
|
|
+
|
|
|
+ // 示例数据
|
|
|
+ // dishList.value = [
|
|
|
+ // {
|
|
|
+ // id: "1",
|
|
|
+ // name: "火锅锅底",
|
|
|
+ // price: 38,
|
|
|
+ // costPrice: 20,
|
|
|
+ // unit: "份",
|
|
|
+ // image: "",
|
|
|
+ // description: "",
|
|
|
+ // isRecommended: true,
|
|
|
+ // recommendCount: 1
|
|
|
+ // }
|
|
|
+ // ];
|
|
|
+ updatePagination();
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+.menu-management-container {
|
|
|
+ min-height: 100%;
|
|
|
+ padding: 20px;
|
|
|
+ background-color: white;
|
|
|
+ .header-section {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ margin-bottom: 24px;
|
|
|
+ :deep(.el-tabs) {
|
|
|
+ flex: 1;
|
|
|
+ .el-tabs__header {
|
|
|
+ margin: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .content-section {
|
|
|
+ .dish-grid {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
|
|
|
+ gap: 20px;
|
|
|
+ margin-bottom: 24px;
|
|
|
+ .dish-card {
|
|
|
+ overflow: hidden;
|
|
|
+ background-color: white;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
|
|
|
+ transition: all 0.3s;
|
|
|
+ &:hover {
|
|
|
+ box-shadow: 0 4px 16px 0 rgb(0 0 0 / 15%);
|
|
|
+ }
|
|
|
+ .dish-image-wrapper {
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ height: 180px;
|
|
|
+ overflow: hidden;
|
|
|
+ background-color: #f0f0f0;
|
|
|
+ img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: cover;
|
|
|
+ }
|
|
|
+ .image-placeholder {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ color: #909399;
|
|
|
+ .el-icon {
|
|
|
+ font-size: 48px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .recommend-tag {
|
|
|
+ position: absolute;
|
|
|
+ top: 8px;
|
|
|
+ right: 8px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .dish-info {
|
|
|
+ padding: 12px 16px;
|
|
|
+ .dish-name {
|
|
|
+ margin-bottom: 8px;
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #000000;
|
|
|
+ }
|
|
|
+ .dish-price {
|
|
|
+ margin-bottom: 4px;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #f56c6c;
|
|
|
+ }
|
|
|
+ .dish-recommend-count {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #909399;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .dish-actions {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 8px;
|
|
|
+ padding: 12px 16px;
|
|
|
+ border-top: 1px solid #f0f0f0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .pagination-section {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ margin-top: 24px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .empty-state {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 20px;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ min-height: 400px;
|
|
|
+ }
|
|
|
+ .dialog-footer {
|
|
|
+ display: flex;
|
|
|
+ gap: 12px;
|
|
|
+ justify-content: flex-end;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|