@ditari/bsui 5.0.10 → 5.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/cjs/components/date/RangePicker.vue2.cjs +10 -2
  2. package/dist/cjs/components/date/RangePicker.vue2.cjs.map +1 -1
  3. package/dist/cjs/components/dic/DicReplace.cjs +93 -0
  4. package/dist/cjs/components/dic/DicReplace.cjs.map +1 -0
  5. package/dist/cjs/components/dic/index.cjs +14 -0
  6. package/dist/cjs/components/dic/index.cjs.map +1 -0
  7. package/dist/cjs/components/form/FormLayout.cjs.map +1 -1
  8. package/dist/cjs/components/icon/Moon.vue.cjs.map +1 -1
  9. package/dist/cjs/components/icon/Sun.vue.cjs.map +1 -1
  10. package/dist/cjs/components/index.cjs +3 -0
  11. package/dist/cjs/components/index.cjs.map +1 -1
  12. package/dist/cjs/components/layout/Layout.vue2.cjs +53 -39
  13. package/dist/cjs/components/layout/Layout.vue2.cjs.map +1 -1
  14. package/dist/cjs/components/layout/List.cjs +20 -28
  15. package/dist/cjs/components/layout/List.cjs.map +1 -1
  16. package/dist/cjs/components/layout/Show.cjs +36 -39
  17. package/dist/cjs/components/layout/Show.cjs.map +1 -1
  18. package/dist/cjs/components/layout/components/index.cjs.map +1 -1
  19. package/dist/cjs/components/layout/components/layout/HeaderLayout.vue2.cjs +6 -1
  20. package/dist/cjs/components/layout/components/layout/HeaderLayout.vue2.cjs.map +1 -1
  21. package/dist/cjs/components/layout/components/layout/ThemeApp.vue2.cjs +3 -0
  22. package/dist/cjs/components/layout/components/layout/ThemeApp.vue2.cjs.map +1 -1
  23. package/dist/cjs/components/layout/components/menu/Menu.cjs.map +1 -1
  24. package/dist/cjs/components/layout/components/settings/BlockCheckbox.vue2.cjs +3 -1
  25. package/dist/cjs/components/layout/components/settings/BlockCheckbox.vue2.cjs.map +1 -1
  26. package/dist/cjs/components/layout/components/settings/SettingDrawer.cjs +2 -3
  27. package/dist/cjs/components/layout/components/settings/SettingDrawer.cjs.map +1 -1
  28. package/dist/cjs/components/select/Select.vue2.cjs +61 -4
  29. package/dist/cjs/components/select/Select.vue2.cjs.map +1 -1
  30. package/dist/cjs/components/tab/Search.cjs +40 -6
  31. package/dist/cjs/components/tab/Search.cjs.map +1 -1
  32. package/dist/cjs/components/tab/Tab.vue2.cjs +31 -7
  33. package/dist/cjs/components/tab/Tab.vue2.cjs.map +1 -1
  34. package/dist/cjs/components/table/Table.cjs +5 -4
  35. package/dist/cjs/components/table/Table.cjs.map +1 -1
  36. package/dist/cjs/index.cjs +2 -0
  37. package/dist/cjs/index.cjs.map +1 -1
  38. package/dist/cjs/utils/useTheme.cjs +11 -13
  39. package/dist/cjs/utils/useTheme.cjs.map +1 -1
  40. package/dist/css/components/layout/components/settings/style/index.css +1 -1
  41. package/dist/css/index.css +1 -1
  42. package/dist/esm/components/date/RangePicker.vue2.mjs +10 -2
  43. package/dist/esm/components/date/RangePicker.vue2.mjs.map +1 -1
  44. package/dist/esm/components/dic/DicReplace.mjs +89 -0
  45. package/dist/esm/components/dic/DicReplace.mjs.map +1 -0
  46. package/dist/esm/components/dic/index.mjs +10 -0
  47. package/dist/esm/components/dic/index.mjs.map +1 -0
  48. package/dist/esm/components/form/FormLayout.mjs.map +1 -1
  49. package/dist/esm/components/icon/Moon.vue.mjs.map +1 -1
  50. package/dist/esm/components/icon/Sun.vue.mjs.map +1 -1
  51. package/dist/esm/components/index.mjs +2 -0
  52. package/dist/esm/components/index.mjs.map +1 -1
  53. package/dist/esm/components/layout/Layout.vue2.mjs +54 -40
  54. package/dist/esm/components/layout/Layout.vue2.mjs.map +1 -1
  55. package/dist/esm/components/layout/List.mjs +21 -29
  56. package/dist/esm/components/layout/List.mjs.map +1 -1
  57. package/dist/esm/components/layout/Show.mjs +38 -41
  58. package/dist/esm/components/layout/Show.mjs.map +1 -1
  59. package/dist/esm/components/layout/components/index.mjs.map +1 -1
  60. package/dist/esm/components/layout/components/layout/HeaderLayout.vue2.mjs +6 -1
  61. package/dist/esm/components/layout/components/layout/HeaderLayout.vue2.mjs.map +1 -1
  62. package/dist/esm/components/layout/components/layout/ThemeApp.vue2.mjs +3 -0
  63. package/dist/esm/components/layout/components/layout/ThemeApp.vue2.mjs.map +1 -1
  64. package/dist/esm/components/layout/components/menu/Menu.mjs.map +1 -1
  65. package/dist/esm/components/layout/components/settings/BlockCheckbox.vue2.mjs +3 -1
  66. package/dist/esm/components/layout/components/settings/BlockCheckbox.vue2.mjs.map +1 -1
  67. package/dist/esm/components/layout/components/settings/SettingDrawer.mjs +2 -3
  68. package/dist/esm/components/layout/components/settings/SettingDrawer.mjs.map +1 -1
  69. package/dist/esm/components/select/Select.vue2.mjs +63 -6
  70. package/dist/esm/components/select/Select.vue2.mjs.map +1 -1
  71. package/dist/esm/components/tab/Search.mjs +40 -6
  72. package/dist/esm/components/tab/Search.mjs.map +1 -1
  73. package/dist/esm/components/tab/Tab.vue2.mjs +32 -8
  74. package/dist/esm/components/tab/Tab.vue2.mjs.map +1 -1
  75. package/dist/esm/components/table/Table.mjs +6 -5
  76. package/dist/esm/components/table/Table.mjs.map +1 -1
  77. package/dist/esm/index.mjs +1 -0
  78. package/dist/esm/index.mjs.map +1 -1
  79. package/dist/esm/utils/useTheme.mjs +11 -13
  80. package/dist/esm/utils/useTheme.mjs.map +1 -1
  81. package/dist/style/index.scss +2 -1
  82. package/dist/style/layout/components/settings/style/index.scss +25 -25
  83. package/dist/style/tab/style/index.scss +0 -1
  84. package/dist/types/components/date/RangePicker.vue.d.ts.map +1 -1
  85. package/dist/types/components/dic/DicReplace.d.ts +24 -0
  86. package/dist/types/components/dic/DicReplace.d.ts.map +1 -0
  87. package/dist/types/components/dic/index.d.ts +3 -0
  88. package/dist/types/components/dic/index.d.ts.map +1 -0
  89. package/dist/types/components/form/FormLayout.d.ts.map +1 -1
  90. package/dist/types/components/index.d.ts +1 -0
  91. package/dist/types/components/index.d.ts.map +1 -1
  92. package/dist/types/components/layout/Layout.vue.d.ts +6 -1
  93. package/dist/types/components/layout/Layout.vue.d.ts.map +1 -1
  94. package/dist/types/components/layout/List.d.ts.map +1 -1
  95. package/dist/types/components/layout/Show.d.ts.map +1 -1
  96. package/dist/types/components/layout/components/index.d.ts.map +1 -1
  97. package/dist/types/components/layout/components/layout/HeaderLayout.vue.d.ts +2 -0
  98. package/dist/types/components/layout/components/layout/HeaderLayout.vue.d.ts.map +1 -1
  99. package/dist/types/components/layout/components/layout/ThemeApp.vue.d.ts.map +1 -1
  100. package/dist/types/components/layout/components/menu/Menu.d.ts.map +1 -1
  101. package/dist/types/components/layout/components/settings/BlockCheckbox.vue.d.ts.map +1 -1
  102. package/dist/types/components/layout/components/settings/SettingDrawer.d.ts.map +1 -1
  103. package/dist/types/components/select/Select.vue.d.ts +2 -1
  104. package/dist/types/components/select/Select.vue.d.ts.map +1 -1
  105. package/dist/types/components/tab/Search.d.ts.map +1 -1
  106. package/dist/types/components/tab/Tab.vue.d.ts +5 -2
  107. package/dist/types/components/tab/Tab.vue.d.ts.map +1 -1
  108. package/dist/types/components/table/Table.d.ts.map +1 -1
  109. package/dist/types/components/table/interface.d.ts.map +1 -1
  110. package/dist/types/index.d.ts.map +1 -1
  111. package/dist/types/utils/useTheme.d.ts.map +1 -1
  112. package/package.json +3 -3
@@ -1,7 +1,28 @@
1
- import { defineComponent, ref, watch, resolveComponent, createBlock, openBlock, unref, isRef } from 'vue';
2
- import { useDicStore } from '@ditari/store';
1
+ import { defineComponent, inject, ref, onActivated, onMounted, watch, resolveComponent, createBlock, openBlock, unref, isRef } from 'vue';
2
+ import { useRoute } from 'vue-router';
3
+ import { useDicStore, useKeepAliveStore } from '@ditari/store';
3
4
 
4
5
  "use strict";
6
+ var __async = (__this, __arguments, generator) => {
7
+ return new Promise((resolve, reject) => {
8
+ var fulfilled = (value) => {
9
+ try {
10
+ step(generator.next(value));
11
+ } catch (e) {
12
+ reject(e);
13
+ }
14
+ };
15
+ var rejected = (value) => {
16
+ try {
17
+ step(generator.throw(value));
18
+ } catch (e) {
19
+ reject(e);
20
+ }
21
+ };
22
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
23
+ step((generator = generator.apply(__this, __arguments)).next());
24
+ });
25
+ };
5
26
  var _sfc_main = /* @__PURE__ */ defineComponent({
6
27
  __name: "Select",
7
28
  props: {
@@ -16,17 +37,49 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
16
37
  const props = __props;
17
38
  const emits = __emit;
18
39
  const { getDicByKey } = useDicStore();
40
+ const { get: keepNames } = useKeepAliveStore();
19
41
  const { modelValue, data, onSelect, onChange } = useSelect();
20
42
  function useSelect() {
21
- const dicData = [...getDicByKey(props.name)];
43
+ const route = useRoute();
44
+ const isKeepAlive = keepNames.some(
45
+ (name) => name === route.name
46
+ );
47
+ const fetchDic = inject("fetchDic", (name) => __async(this, null, function* () {
48
+ console.warn(
49
+ `fetchDic \u672A\u6CE8\u5165\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u5B9E\u73B0\uFF0Cname: ${name}`
50
+ );
51
+ return [];
52
+ }));
53
+ let dicData = [...getDicByKey(props.name)];
22
54
  const data2 = ref(dicData);
23
- const modelValue2 = ref(props.value);
55
+ const modelValue2 = ref(
56
+ props.value
57
+ );
58
+ onActivated(() => {
59
+ loadDicData();
60
+ });
61
+ onMounted(() => {
62
+ if (!isKeepAlive) {
63
+ loadDicData();
64
+ }
65
+ });
24
66
  watch(
25
67
  () => props.value,
26
68
  (val) => {
27
69
  modelValue2.value = val;
28
70
  }
29
71
  );
72
+ function loadDicData() {
73
+ return __async(this, null, function* () {
74
+ try {
75
+ yield fetchDic(props.name);
76
+ dicData = [...getDicByKey(props.name)];
77
+ data2.value = dicData;
78
+ } catch (error) {
79
+ console.error("\u83B7\u53D6\u5B57\u5178\u6570\u636E\u5931\u8D25:", error);
80
+ }
81
+ });
82
+ }
30
83
  const onSearch = (keywords) => {
31
84
  sendWorkerSearch(keywords);
32
85
  };
@@ -49,7 +102,9 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
49
102
  };
50
103
  function onSelectHandler() {
51
104
  const dicList = getDicByKey(props.name);
52
- const rs = dicList.find((obj) => obj.value === modelValue2.value);
105
+ const rs = dicList.find(
106
+ (obj) => obj.value === modelValue2.value
107
+ );
53
108
  emits("select", rs);
54
109
  }
55
110
  watch(
@@ -57,7 +112,9 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
57
112
  (val) => {
58
113
  if (val.length > 0) {
59
114
  data2.value = dicData.filter((item) => {
60
- return val.some((i) => i === item.value);
115
+ return val.some(
116
+ (i) => i === item.value
117
+ );
61
118
  });
62
119
  } else {
63
120
  data2.value = dicData;
@@ -1 +1 @@
1
- {"version":3,"file":"Select.vue2.mjs","sources":["../../../../src/components/select/Select.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch } from \"vue\";\n\nimport { useDicStore } from \"@ditari/store\";\n\ninterface DicItem {\n value: string | number;\n label: string;\n}\n\nconst props = defineProps({\n value: { required: true, default: undefined },\n name: { type: String, required: true, default: \"\" },\n disabled: { type: Boolean, required: false, default: false },\n placeholder: { type: String, required: false, default: \"请填写默认占位符啊!\" },\n include: { type: Array, required: false, default: () => [] }\n});\n\nconst emits = defineEmits([\"update:value\", \"change\", \"select\"]);\n\nconst { getDicByKey } = useDicStore();\n\nconst { modelValue, data, onSelect, onChange } = useSelect();\n\nfunction useSelect() {\n // 字典数据\n const dicData: DicItem[] = [...getDicByKey(props.name)];\n const data = ref<DicItem[]>(dicData);\n // 取值\n const modelValue = ref<string | number | undefined>(props.value);\n\n // 监听value值的变化\n watch(\n () => props.value,\n val => {\n modelValue.value = val;\n }\n );\n\n // 监听用户搜索事件\n const onSearch = (keywords: string) => {\n sendWorkerSearch(keywords);\n };\n\n // 发送搜索到webworker\n function sendWorkerSearch(keywords: string) {\n keywords = keywords ?? \"\";\n data.value = dicData\n .filter((item: DicItem) => {\n return (\n item.value\n .toString()\n .toLowerCase()\n .indexOf(keywords.toLowerCase()) !== -1 ||\n item.label.toLowerCase().includes(keywords.toLowerCase())\n );\n })\n .slice(0, 10);\n if (data.value.length === 0) {\n data.value = [...dicData].slice(0, 10);\n }\n }\n\n // 监听下拉选择事件\n const onSelect = (value: string | number) => {\n // 发射选择的数据\n emits(\"update:value\", value);\n // 处理下拉后返回数据的\n onSelectHandler();\n };\n\n // 监听数据改变\n const onChange = () => {\n emits(\"update:value\", modelValue.value);\n emits(\"change\", modelValue.value);\n };\n\n /**\n * 根据当前选中的value匹配对应的整条数据\n * 然后返回给父组件\n */\n function onSelectHandler() {\n const dicList = getDicByKey(props.name);\n const rs = dicList.find((obj: DicItem) => obj.value === modelValue.value);\n emits(\"select\", rs);\n }\n\n watch(\n () => props.include,\n (val: Array<string | number>) => {\n if (val.length > 0) {\n // 只过滤出来include包含的数据\n data.value = dicData.filter((item: DicItem) => {\n return val.some((i: string | number) => i === item.value);\n });\n } else {\n data.value = dicData;\n }\n },\n {\n immediate: true\n }\n );\n\n return {\n data,\n modelValue,\n onSearch,\n onSelect,\n onChange\n };\n}\n\n/**\n * 过滤筛选\n * @param inputValue\n * @param options\n */\nconst onFilterOption = (inputValue: string, options: DicItem) => {\n return (\n options.value.toString().toLowerCase().indexOf(inputValue.toLowerCase()) !==\n -1 || options.label.toLowerCase().includes(inputValue.toLowerCase())\n );\n};\n</script>\n\n<template>\n <a-select\n v-model:value=\"modelValue\"\n style=\"width: 100%\"\n allow-clear\n show-search\n :options=\"data\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :filter-option=\"onFilterOption\"\n @select=\"onSelect\"\n @change=\"onChange\"\n >\n </a-select>\n</template>\n\n<style scoped></style>\n"],"names":["data","modelValue","onSelect","onChange"],"mappings":"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"}
1
+ {"version":3,"file":"Select.vue2.mjs","sources":["../../../../src/components/select/Select.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n inject,\n onActivated,\n onMounted,\n ref,\n watch\n} from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport {\n useDicStore,\n useKeepAliveStore\n} from \"@ditari/store\";\n\ninterface DicItem {\n value: string | number;\n label: string;\n}\n\nconst props = defineProps({\n value: { required: true, default: undefined },\n name: { type: String, required: true, default: \"\" },\n disabled: { type: Boolean, required: false, default: false },\n placeholder: { type: String, required: false, default: \"请填写默认占位符啊!\" },\n include: { type: Array, required: false, default: () => [] }\n});\n\nconst emits = defineEmits([\"update:value\", \"change\", \"select\"]);\n\nconst { getDicByKey } = useDicStore();\nconst { get: keepNames } = useKeepAliveStore();\n\nconst { modelValue, data, onSelect, onChange } =\n useSelect();\n\nfunction useSelect() {\n const route = useRoute();\n // 判断使用组件的页面是否被缓存\n const isKeepAlive = keepNames.some(\n (name: string) => name === route.name\n );\n // 注入 fetchDic,提供默认值\n const fetchDic = inject<\n (name: string) => Promise<unknown[]>\n >(\"fetchDic\", async (name: string) => {\n console.warn(\n `fetchDic 未注入,使用默认实现,name: ${name}`\n );\n return [];\n });\n\n // 字典数据\n let dicData: DicItem[] = [...getDicByKey(props.name)];\n const data = ref<DicItem[]>(dicData);\n\n // 取值\n const modelValue = ref<string | number | undefined>(\n props.value\n );\n\n onActivated(() => {\n // 缓存页面被激活的时候调用\n loadDicData();\n });\n\n onMounted(() => {\n if (!isKeepAlive) {\n // 未缓存页面 挂载的时候调用\n loadDicData();\n }\n });\n\n // 监听value值的变化\n watch(\n () => props.value,\n val => {\n modelValue.value = val;\n }\n );\n\n // 请求字典数据的函数\n async function loadDicData() {\n try {\n // 调用注入进来的fetchDic方法\n await fetchDic(props.name);\n dicData = [...getDicByKey(props.name)];\n data.value = dicData;\n } catch (error) {\n console.error(\"获取字典数据失败:\", error);\n }\n }\n\n // 监听用户搜索事件\n const onSearch = (keywords: string) => {\n sendWorkerSearch(keywords);\n };\n\n // 发送搜索到webworker\n function sendWorkerSearch(keywords: string) {\n keywords = keywords ?? \"\";\n data.value = dicData\n .filter((item: DicItem) => {\n return (\n item.value\n .toString()\n .toLowerCase()\n .indexOf(keywords.toLowerCase()) !== -1 ||\n item.label\n .toLowerCase()\n .includes(keywords.toLowerCase())\n );\n })\n .slice(0, 10);\n if (data.value.length === 0) {\n data.value = [...dicData].slice(0, 10);\n }\n }\n\n // 监听下拉选择事件\n const onSelect = (value: string | number) => {\n // 发射选择的数据\n emits(\"update:value\", value);\n // 处理下拉后返回数据的\n onSelectHandler();\n };\n\n // 监听数据改变\n const onChange = () => {\n emits(\"update:value\", modelValue.value);\n emits(\"change\", modelValue.value);\n };\n\n /**\n * 根据当前选中的value匹配对应的整条数据\n * 然后返回给父组件\n */\n function onSelectHandler() {\n const dicList = getDicByKey(props.name);\n const rs = dicList.find(\n (obj: DicItem) => obj.value === modelValue.value\n );\n emits(\"select\", rs);\n }\n\n watch(\n () => props.include,\n (val: Array<string | number>) => {\n if (val.length > 0) {\n // 只过滤出来include包含的数据\n data.value = dicData.filter((item: DicItem) => {\n return val.some(\n (i: string | number) => i === item.value\n );\n });\n } else {\n data.value = dicData;\n }\n },\n {\n immediate: true\n }\n );\n\n return {\n data,\n modelValue,\n onSearch,\n onSelect,\n onChange\n };\n}\n\n/**\n * 过滤筛选\n * @param inputValue\n * @param options\n */\nconst onFilterOption = (\n inputValue: string,\n options: DicItem\n) => {\n return (\n options.value\n .toString()\n .toLowerCase()\n .indexOf(inputValue.toLowerCase()) !== -1 ||\n options.label\n .toLowerCase()\n .includes(inputValue.toLowerCase())\n );\n};\n</script>\n\n<template>\n <a-select\n v-model:value=\"modelValue\"\n style=\"width: 100%\"\n allow-clear\n show-search\n :options=\"data\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :filter-option=\"onFilterOption\"\n @select=\"onSelect\"\n @change=\"onChange\"\n >\n </a-select>\n</template>\n\n<style scoped></style>\n"],"names":["data","modelValue","onSelect","onChange"],"mappings":"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"}
@@ -31,11 +31,29 @@ var Search = /* @__PURE__ */ defineComponent({
31
31
  const navTabList = computed(() => {
32
32
  return getList.sort((a, b) => (b.openTime || 0) - (a.openTime || 0));
33
33
  });
34
+ const searchKewords = ref("");
35
+ const filteredNavTabList = computed(() => {
36
+ const list = getList.sort((a, b) => (b.openTime || 0) - (a.openTime || 0));
37
+ if (!searchKewords.value) {
38
+ return list;
39
+ }
40
+ const query = searchKewords.value.toLowerCase();
41
+ return list.filter((item) => {
42
+ var _a, _b;
43
+ const fullPathMatch = (_a = item.fullPath) == null ? void 0 : _a.toLowerCase().includes(query);
44
+ const title = ((_b = item.meta) == null ? void 0 : _b.title) || "";
45
+ const titleMatch = title.toLowerCase().includes(query);
46
+ return fullPathMatch || titleMatch;
47
+ });
48
+ });
34
49
  watch(shiftCtrlA, (v) => {
35
50
  if (v) {
36
51
  open.value = !open.value;
37
52
  }
38
53
  });
54
+ watch(() => open.value, () => {
55
+ searchKewords.value = "";
56
+ });
39
57
  watch(() => y.value, (val) => {
40
58
  if (val > 0) {
41
59
  open.value = false;
@@ -47,6 +65,10 @@ var Search = /* @__PURE__ */ defineComponent({
47
65
  const searchStyle = computed(() => css`
48
66
  padding: 10px;
49
67
  border-bottom: 1px solid ${token.value.colorBorder};
68
+
69
+ .tip-txt {
70
+ color: ${token.value.colorPrimary};
71
+ }
50
72
  `);
51
73
  const searchListStyle = computed(() => css`
52
74
  position: relative;
@@ -75,7 +97,8 @@ var Search = /* @__PURE__ */ defineComponent({
75
97
  ::-webkit-scrollbar-thumb {
76
98
  //background: #888; /* 滑块背景色 */
77
99
  // border-radius: 6px; /* 滑块圆角 */
78
- border: 3px solid ${token.value.colorPrimaryBorder}; /* 滑块边框 */
100
+ border: 3px solid
101
+ ${token.value.colorPrimaryBorder}; /* 滑块边框 */
79
102
  }
80
103
 
81
104
  /* 滚动条滑块悬停效果 */
@@ -88,12 +111,14 @@ var Search = /* @__PURE__ */ defineComponent({
88
111
  position: sticky;
89
112
  top: 0;
90
113
  padding: 10px;
114
+ background: ${token.value.colorBgContainer};
91
115
  }
92
116
 
93
117
  ul {
94
118
  margin: 0;
95
119
  padding: 0;
96
120
  list-style: none;
121
+ min-width: 400px;
97
122
 
98
123
  li {
99
124
  display: flex;
@@ -131,6 +156,7 @@ var Search = /* @__PURE__ */ defineComponent({
131
156
  .hostname {
132
157
  max-width: 180px;
133
158
  overflow: hidden;
159
+ white-space: nowrap;
134
160
  }
135
161
 
136
162
  .split {
@@ -183,6 +209,14 @@ var Search = /* @__PURE__ */ defineComponent({
183
209
  }
184
210
  open.value = false;
185
211
  };
212
+ const closeBtnStatus = (item) => {
213
+ var _a;
214
+ if ((_a = item.meta) == null ? void 0 : _a.keepOpen) {
215
+ return false;
216
+ } else {
217
+ return navTabList.value.length !== 1;
218
+ }
219
+ };
186
220
  return () => createVNode("div", null, [createVNode(resolveComponent("a-popover"), {
187
221
  "open": open.value,
188
222
  "onUpdate:open": ($event) => open.value = $event,
@@ -200,20 +234,20 @@ var Search = /* @__PURE__ */ defineComponent({
200
234
  content: () => createVNode(Fragment, null, [createVNode("div", {
201
235
  "class": searchStyle.value
202
236
  }, [createVNode(resolveComponent("a-input"), {
237
+ "value": searchKewords.value,
238
+ "onUpdate:value": ($event) => searchKewords.value = $event,
203
239
  "placeholder": "\u641C\u7D22\u6807\u7B7E\u9875",
204
240
  "bordered": false
205
241
  }, {
206
242
  prefix: () => createVNode(SearchOutlined, null, null),
207
243
  suffix: () => createVNode("span", {
208
- "style": {
209
- color: "rgba(0, 0, 0, 0.45)"
210
- }
244
+ "class": "tip-txt"
211
245
  }, [createTextVNode("Ctrl+Shift+S")])
212
246
  })]), createVNode("div", {
213
247
  "class": searchListStyle.value
214
248
  }, [createVNode("span", {
215
249
  "class": "search-title"
216
- }, [createTextVNode("\u6253\u5F00\u7684\u6807\u7B7E\u9875")]), createVNode("ul", null, [navTabList.value.map((item) => {
250
+ }, [createTextVNode("\u6253\u5F00\u7684\u6807\u7B7E\u9875")]), createVNode("ul", null, [filteredNavTabList.value.map((item) => {
217
251
  var _a, _b;
218
252
  return createVNode("li", {
219
253
  "onClick": () => onJump(item)
@@ -231,7 +265,7 @@ var Search = /* @__PURE__ */ defineComponent({
231
265
  "class": "split"
232
266
  }, null), createVNode("span", {
233
267
  "class": "time"
234
- }, [timeAgo((_b = item.openTime) != null ? _b : 0)])])]), createVNode("div", {
268
+ }, [timeAgo((_b = item.openTime) != null ? _b : 0)])])]), closeBtnStatus(item) && createVNode("div", {
235
269
  "class": "close-wrapper"
236
270
  }, [createVNode("span", {
237
271
  "class": "close-btn",
@@ -1 +1 @@
1
- {"version":3,"file":"Search.mjs","sources":["../../../../src/components/tab/Search.tsx"],"sourcesContent":["import { computed, ComputedRef, defineComponent, h, ref, watch } from \"vue\";\r\nimport { useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { useMagicKeys, useWindowScroll } from \"@vueuse/core\";\r\n\r\nimport {\r\n CloseOutlined,\r\n DownOutlined,\r\n SearchOutlined,\r\n UnorderedListOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport { type NavTabsState, useNavTabStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default defineComponent({\r\n name: \"Search\",\r\n setup() {\r\n const router = useRouter();\r\n\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } = useToken();\r\n\r\n const { getList, deleteTabs } = useNavTabStore();\r\n // 用来监听 Ctrl + Shift + S\r\n const keys = useMagicKeys();\r\n const shiftCtrlA = keys[\"Shift+Ctrl+S\"];\r\n const open = ref(false);\r\n const { y } = useWindowScroll();\r\n\r\n const navTabList = computed(() => {\r\n return getList!.sort((a, b) => (b.openTime || 0) - (a.openTime || 0));\r\n });\r\n\r\n watch(shiftCtrlA, v => {\r\n if (v) {\r\n open.value = !open.value;\r\n }\r\n });\r\n watch(\r\n () => y.value,\r\n val => {\r\n if (val > 0) {\r\n open.value = false;\r\n }\r\n }\r\n );\r\n\r\n const onCloseTab = (path: string) => {\r\n deleteTabs(path);\r\n };\r\n\r\n const searchStyle = computed(\r\n () => css`\r\n padding: 10px;\r\n border-bottom: 1px solid ${token.value.colorBorder};\r\n `\r\n );\r\n\r\n const searchListStyle = computed(\r\n () => css`\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 400px;\r\n overflow-y: overlay;\r\n user-select: none;\r\n\r\n /* 整个滚动条 */\r\n\r\n ::-webkit-scrollbar {\r\n width: 4px; /* 垂直滚动条的宽度 */\r\n height: 4px; /* 水平滚动条的高度 */\r\n }\r\n\r\n /* 滚动条轨道 */\r\n\r\n ::-webkit-scrollbar-track {\r\n background: transparent; /* 轨道背景色 */\r\n border-radius: 0; /* 轨道圆角 */\r\n }\r\n\r\n /* 滚动条滑块 */\r\n\r\n ::-webkit-scrollbar-thumb {\r\n //background: #888; /* 滑块背景色 */\r\n // border-radius: 6px; /* 滑块圆角 */\r\n border: 3px solid ${token.value.colorPrimaryBorder}; /* 滑块边框 */\r\n }\r\n\r\n /* 滚动条滑块悬停效果 */\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: red; /* 滑块悬停背景色 */\r\n }\r\n\r\n .search-title {\r\n position: sticky;\r\n top: 0;\r\n padding: 10px;\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n\r\n li {\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 10px;\r\n width: 400px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${token.value.colorBgLayout};\r\n\r\n .close-wrapper {\r\n display: block;\r\n }\r\n }\r\n\r\n .icon {\r\n width: 42px;\r\n height: 42px;\r\n border-radius: 10px;\r\n background-color: ${token.value.colorPrimary};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n\r\n .content {\r\n padding-left: 10px;\r\n\r\n .time-ago {\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n\r\n .hostname {\r\n max-width: 180px;\r\n overflow: hidden;\r\n }\r\n\r\n .split {\r\n width: 4px;\r\n height: 4px;\r\n display: inline-block;\r\n background-color: ${token.value.colorPrimary};\r\n border-radius: 10px;\r\n margin: 0 6px;\r\n }\r\n }\r\n }\r\n\r\n .close-wrapper {\r\n display: none;\r\n flex: 1;\r\n text-align: right;\r\n\r\n .close-btn {\r\n display: inline-block;\r\n width: 22px;\r\n height: 22px;\r\n border-radius: 50%;\r\n text-align: center;\r\n\r\n &:hover {\r\n // background-color: ${token.value.colorBgLayout};\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n );\r\n\r\n function timeAgo(providedTime: number) {\r\n const now = dayjs();\r\n const diffInSeconds = now.diff(providedTime, \"second\"); // 计算时间差(秒)\r\n const diffInMinutes = now.diff(providedTime, \"minute\"); // 计算时间差(分钟)\r\n const diffInHours = now.diff(providedTime, \"hour\"); // 计算时间差(小时)\r\n\r\n if (diffInMinutes < 1) {\r\n return `${diffInSeconds} 秒前`;\r\n } else if (diffInHours < 1) {\r\n return `${diffInMinutes} 分钟前`;\r\n } else {\r\n return `${diffInHours} 小时前`;\r\n }\r\n }\r\n\r\n const onJump = (item: NavTabsState) => {\r\n if (item.fullPath) {\r\n router.push(item.fullPath);\r\n }\r\n open.value = false;\r\n };\r\n\r\n return () => (\r\n <div>\r\n <a-popover\r\n v-model:open={open.value}\r\n placement={\"bottomRight\"}\r\n trigger={\"click\"}\r\n overlayClassName={\"search-popover-wrapper\"}\r\n >\r\n {{\r\n default: () => (\r\n <div>\r\n <a-button\r\n style={{ borderRadius: \"10px\" }}\r\n icon={h(DownOutlined)}\r\n title={\"搜索标签页\"}\r\n />\r\n </div>\r\n ),\r\n content: () => (\r\n <>\r\n <div class={searchStyle.value}>\r\n <a-input placeholder={\"搜索标签页\"} bordered={false}>\r\n {{\r\n prefix: () => <SearchOutlined />,\r\n suffix: () => (\r\n <span style={{ color: \"rgba(0, 0, 0, 0.45)\" }}>\r\n Ctrl+Shift+S\r\n </span>\r\n )\r\n }}\r\n </a-input>\r\n </div>\r\n <div class={searchListStyle.value}>\r\n <span class={\"search-title\"}>打开的标签页</span>\r\n <ul>\r\n {navTabList.value.map(item => (\r\n <li onClick={() => onJump(item)}>\r\n <div class={\"icon\"}>\r\n <UnorderedListOutlined />\r\n </div>\r\n <div class={\"content\"}>\r\n <div class={\"title\"}>{item.meta?.title}</div>\r\n <div class={\"time-ago\"}>\r\n <span class={\"hostname\"}>\r\n {window.location.hostname + \"\" + item.path}\r\n </span>\r\n <span class={\"split\"}></span>\r\n <span class={\"time\"}>\r\n {timeAgo(item.openTime ?? 0)}\r\n </span>\r\n </div>\r\n </div>\r\n <div class={\"close-wrapper\"}>\r\n <span\r\n class={\"close-btn\"}\r\n onClick={() => onCloseTab(item.fullPath || \"\")}\r\n >\r\n <CloseOutlined />\r\n </span>\r\n </div>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </>\r\n )\r\n }}\r\n </a-popover>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","setup","router","useRouter","useToken","theme","token","getList","deleteTabs","useNavTabStore","keys","useMagicKeys","shiftCtrlA","open","ref","y","useWindowScroll","navTabList","computed","sort","a","b","openTime","watch","v","value","val","onCloseTab","path","searchStyle","css","colorBorder","searchListStyle","colorPrimaryBorder","colorBgLayout","colorPrimary","timeAgo","providedTime","now","dayjs","diffInSeconds","diff","diffInMinutes","diffInHours","onJump","item","fullPath","push","_createVNode","_resolveComponent","$event","default","borderRadius","h","DownOutlined","content","_Fragment","prefix","SearchOutlined","suffix","color","_createTextVNode","map","onClick","UnorderedListOutlined","meta","title","window","location","hostname","CloseOutlined"],"mappings":"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"}
1
+ {"version":3,"file":"Search.mjs","sources":["../../../../src/components/tab/Search.tsx"],"sourcesContent":["import {\r\n computed,\r\n ComputedRef,\r\n defineComponent,\r\n h,\r\n ref,\r\n watch\r\n} from \"vue\";\r\nimport { useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport {\r\n useMagicKeys,\r\n useWindowScroll\r\n} from \"@vueuse/core\";\r\n\r\nimport {\r\n CloseOutlined,\r\n DownOutlined,\r\n SearchOutlined,\r\n UnorderedListOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport {\r\n type NavTabsState,\r\n useNavTabStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default defineComponent({\r\n name: \"Search\",\r\n setup() {\r\n const router = useRouter();\r\n\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const { getList, deleteTabs } = useNavTabStore();\r\n // 用来监听 Ctrl + Shift + S\r\n const keys = useMagicKeys();\r\n const shiftCtrlA = keys[\"Shift+Ctrl+S\"];\r\n const open = ref(false);\r\n const { y } = useWindowScroll();\r\n\r\n const navTabList = computed(() => {\r\n return getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n });\r\n\r\n // 添加搜索相关状态\r\n const searchKewords = ref(\"\"); // 搜索输入框的值\r\n const filteredNavTabList = computed(() => {\r\n const list = getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n\r\n if (!searchKewords.value) {\r\n return list; // 如果没有搜索词,返回完整列表\r\n }\r\n\r\n const query = searchKewords.value.toLowerCase();\r\n return list.filter(item => {\r\n const fullPathMatch = item.fullPath\r\n ?.toLowerCase()\r\n .includes(query);\r\n\r\n const title: string =\r\n (item.meta?.title as string) || \"\";\r\n\r\n const titleMatch = title\r\n .toLowerCase()\r\n .includes(query);\r\n \r\n return fullPathMatch || titleMatch;\r\n });\r\n });\r\n\r\n watch(shiftCtrlA, v => {\r\n if (v) {\r\n open.value = !open.value;\r\n }\r\n });\r\n\r\n watch(\r\n () => open.value,\r\n () => {\r\n searchKewords.value = \"\";\r\n }\r\n );\r\n\r\n watch(\r\n () => y.value,\r\n val => {\r\n if (val > 0) {\r\n open.value = false;\r\n }\r\n }\r\n );\r\n\r\n const onCloseTab = (path: string) => {\r\n deleteTabs(path);\r\n };\r\n\r\n const searchStyle = computed(\r\n () => css`\r\n padding: 10px;\r\n border-bottom: 1px solid ${token.value.colorBorder};\r\n\r\n .tip-txt {\r\n color: ${token.value.colorPrimary};\r\n }\r\n `\r\n );\r\n\r\n const searchListStyle = computed(\r\n () => css`\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 400px;\r\n overflow-y: overlay;\r\n user-select: none;\r\n\r\n /* 整个滚动条 */\r\n\r\n ::-webkit-scrollbar {\r\n width: 4px; /* 垂直滚动条的宽度 */\r\n height: 4px; /* 水平滚动条的高度 */\r\n }\r\n\r\n /* 滚动条轨道 */\r\n\r\n ::-webkit-scrollbar-track {\r\n background: transparent; /* 轨道背景色 */\r\n border-radius: 0; /* 轨道圆角 */\r\n }\r\n\r\n /* 滚动条滑块 */\r\n\r\n ::-webkit-scrollbar-thumb {\r\n //background: #888; /* 滑块背景色 */\r\n // border-radius: 6px; /* 滑块圆角 */\r\n border: 3px solid\r\n ${token.value.colorPrimaryBorder}; /* 滑块边框 */\r\n }\r\n\r\n /* 滚动条滑块悬停效果 */\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: red; /* 滑块悬停背景色 */\r\n }\r\n\r\n .search-title {\r\n position: sticky;\r\n top: 0;\r\n padding: 10px;\r\n background: ${token.value.colorBgContainer};\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n min-width: 400px;\r\n\r\n li {\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 10px;\r\n width: 400px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${token.value\r\n .colorBgLayout};\r\n\r\n .close-wrapper {\r\n display: block;\r\n }\r\n }\r\n\r\n .icon {\r\n width: 42px;\r\n height: 42px;\r\n border-radius: 10px;\r\n background-color: ${token.value.colorPrimary};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n\r\n .content {\r\n padding-left: 10px;\r\n\r\n .time-ago {\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n\r\n .hostname {\r\n max-width: 180px;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n }\r\n\r\n .split {\r\n width: 4px;\r\n height: 4px;\r\n display: inline-block;\r\n background-color: ${token.value\r\n .colorPrimary};\r\n border-radius: 10px;\r\n margin: 0 6px;\r\n }\r\n }\r\n }\r\n\r\n .close-wrapper {\r\n display: none;\r\n flex: 1;\r\n text-align: right;\r\n\r\n .close-btn {\r\n display: inline-block;\r\n width: 22px;\r\n height: 22px;\r\n border-radius: 50%;\r\n text-align: center;\r\n\r\n &:hover {\r\n // background-color: ${token.value\r\n .colorBgLayout};\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n );\r\n\r\n function timeAgo(providedTime: number) {\r\n const now = dayjs();\r\n const diffInSeconds = now.diff(\r\n providedTime,\r\n \"second\"\r\n ); // 计算时间差(秒)\r\n const diffInMinutes = now.diff(\r\n providedTime,\r\n \"minute\"\r\n ); // 计算时间差(分钟)\r\n const diffInHours = now.diff(providedTime, \"hour\"); // 计算时间差(小时)\r\n\r\n if (diffInMinutes < 1) {\r\n return `${diffInSeconds} 秒前`;\r\n } else if (diffInHours < 1) {\r\n return `${diffInMinutes} 分钟前`;\r\n } else {\r\n return `${diffInHours} 小时前`;\r\n }\r\n }\r\n\r\n const onJump = (item: NavTabsState) => {\r\n if (item.fullPath) {\r\n router.push(item.fullPath);\r\n }\r\n open.value = false;\r\n };\r\n\r\n const closeBtnStatus = (item: NavTabsState) => {\r\n // 如果meta有设置keepOpen则隐藏关闭按钮\r\n if (item.meta?.keepOpen) {\r\n return false;\r\n } else {\r\n // 如果只有一个标签,则隐藏关闭按钮\r\n return navTabList.value.length !== 1;\r\n }\r\n };\r\n\r\n return () => (\r\n <div>\r\n <a-popover\r\n v-model:open={open.value}\r\n placement={\"bottomRight\"}\r\n trigger={\"click\"}\r\n overlayClassName={\"search-popover-wrapper\"}\r\n >\r\n {{\r\n default: () => (\r\n <div>\r\n <a-button\r\n style={{ borderRadius: \"10px\" }}\r\n icon={h(DownOutlined)}\r\n title={\"搜索标签页\"}\r\n />\r\n </div>\r\n ),\r\n content: () => (\r\n <>\r\n <div class={searchStyle.value}>\r\n <a-input\r\n v-model:value={searchKewords.value}\r\n placeholder={\"搜索标签页\"}\r\n bordered={false}\r\n >\r\n {{\r\n prefix: () => <SearchOutlined />,\r\n suffix: () => (\r\n <span class={\"tip-txt\"}>\r\n Ctrl+Shift+S\r\n </span>\r\n )\r\n }}\r\n </a-input>\r\n </div>\r\n <div class={searchListStyle.value}>\r\n <span class={\"search-title\"}>\r\n 打开的标签页\r\n </span>\r\n <ul>\r\n {filteredNavTabList.value.map(item => (\r\n <li onClick={() => onJump(item)}>\r\n <div class={\"icon\"}>\r\n <UnorderedListOutlined />\r\n </div>\r\n <div class={\"content\"}>\r\n <div class={\"title\"}>\r\n {item.meta?.title}\r\n </div>\r\n <div class={\"time-ago\"}>\r\n <span class={\"hostname\"}>\r\n {window.location.hostname +\r\n \"\" +\r\n item.path}\r\n </span>\r\n <span class={\"split\"}></span>\r\n <span class={\"time\"}>\r\n {timeAgo(item.openTime ?? 0)}\r\n </span>\r\n </div>\r\n </div>\r\n {closeBtnStatus(item) && (\r\n <div class={\"close-wrapper\"}>\r\n <span\r\n class={\"close-btn\"}\r\n onClick={() =>\r\n onCloseTab(\r\n item.fullPath || \"\"\r\n )\r\n }\r\n >\r\n <CloseOutlined />\r\n </span>\r\n </div>\r\n )}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </>\r\n )\r\n }}\r\n </a-popover>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","setup","router","useRouter","useToken","theme","token","getList","deleteTabs","useNavTabStore","keys","useMagicKeys","shiftCtrlA","open","ref","y","useWindowScroll","navTabList","computed","sort","a","b","openTime","searchKewords","filteredNavTabList","list","value","query","toLowerCase","filter","item","fullPathMatch","fullPath","includes","title","meta","titleMatch","watch","v","val","onCloseTab","path","searchStyle","css","colorBorder","colorPrimary","searchListStyle","colorPrimaryBorder","colorBgContainer","colorBgLayout","timeAgo","providedTime","now","dayjs","diffInSeconds","diff","diffInMinutes","diffInHours","onJump","push","closeBtnStatus","keepOpen","length","_createVNode","_resolveComponent","$event","default","borderRadius","h","DownOutlined","content","_Fragment","prefix","SearchOutlined","suffix","_createTextVNode","map","onClick","UnorderedListOutlined","window","location","hostname","CloseOutlined"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { defineComponent, computed, watch, resolveComponent, createElementBlock, openBlock, normalizeClass, unref, createVNode, createElementVNode, isRef, withCtx, Fragment, renderList, createBlock, toDisplayString } from 'vue';
1
+ import { defineComponent, computed, watch, resolveComponent, createElementBlock, openBlock, normalizeClass, unref, createVNode, createElementVNode, isRef, withCtx, Fragment, renderList, createBlock, createCommentVNode, toDisplayString } from 'vue';
2
2
  import { useRoute, useRouter } from 'vue-router';
3
3
  import { theme } from 'ant-design-vue';
4
4
  import { storeToRefs } from 'pinia';
@@ -10,18 +10,31 @@ import { css } from '@emotion/css';
10
10
  "use strict";
11
11
  const _hoisted_1 = { class: "d-tabs-nav" };
12
12
  const _hoisted_2 = { class: "tab-item" };
13
- const _hoisted_3 = { class: "tab-close" };
13
+ const _hoisted_3 = {
14
+ key: 0,
15
+ class: "tab-close"
16
+ };
14
17
  const _hoisted_4 = ["onClick"];
15
18
  var _sfc_main = /* @__PURE__ */ defineComponent({
16
19
  __name: "Tab",
17
20
  setup(__props) {
18
21
  const { tabsNavStyle, tabHoverBgStyle, closeBtnStyle } = useStyle();
19
- const { activeKey, list, onChange, onClose } = useTab();
22
+ const {
23
+ activeKey,
24
+ list,
25
+ closeBtnStatus,
26
+ onChange,
27
+ onClose
28
+ } = useTab();
20
29
  function useStyle() {
21
30
  const { useToken } = theme;
22
31
  const { token } = useToken();
23
- const activeTabColor = computed(() => token.value.colorBgLayout);
24
- const splitColor = computed(() => token.value.colorBorderSecondary);
32
+ const activeTabColor = computed(
33
+ () => token.value.colorBgLayout
34
+ );
35
+ const splitColor = computed(
36
+ () => token.value.colorBorderSecondary
37
+ );
25
38
  const tabsNavStyle2 = computed(() => {
26
39
  return css`
27
40
  --active-tab-color: ${activeTabColor.value};
@@ -77,7 +90,9 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
77
90
  );
78
91
  const onChange2 = (key) => {
79
92
  if (key !== route.path) {
80
- const rs = list2.value.filter((item) => item.fullPath === key)[0];
93
+ const rs = list2.value.filter(
94
+ (item) => item.fullPath === key
95
+ )[0];
81
96
  router.push(rs);
82
97
  }
83
98
  };
@@ -90,9 +105,18 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
90
105
  router.push(backRoute.fullPath);
91
106
  }
92
107
  };
108
+ const closeBtnStatus2 = (item) => {
109
+ var _a;
110
+ if ((_a = item.meta) == null ? void 0 : _a.keepOpen) {
111
+ return false;
112
+ } else {
113
+ return list2.value.length !== 1;
114
+ }
115
+ };
93
116
  return {
94
117
  activeKey: activeKey2,
95
118
  list: list2,
119
+ closeBtnStatus: closeBtnStatus2,
96
120
  onChange: onChange2,
97
121
  onClose: onClose2
98
122
  };
@@ -152,14 +176,14 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
152
176
  1
153
177
  /* TEXT */
154
178
  ),
155
- createElementVNode("div", _hoisted_3, [
179
+ unref(closeBtnStatus)(item) ? (openBlock(), createElementBlock("div", _hoisted_3, [
156
180
  createElementVNode("div", {
157
181
  class: normalizeClass(["close-btn", unref(closeBtnStyle)]),
158
182
  onClick: ($event) => unref(onClose)($event, item.fullPath)
159
183
  }, [
160
184
  createVNode(unref(CloseOutlined))
161
185
  ], 10, _hoisted_4)
162
- ])
186
+ ])) : createCommentVNode("v-if", true)
163
187
  ];
164
188
  }),
165
189
  _: 2
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.vue2.mjs","sources":["../../../../src/components/tab/Tab.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, type ComputedRef, watch } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport Search from \"./Search\";\r\nimport { CloseOutlined } from \"@ant-design/icons-vue\";\r\nimport { useAppStore, useNavTabStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nconst { tabsNavStyle, tabHoverBgStyle, closeBtnStyle } = useStyle();\r\n\r\nconst { activeKey, list, onChange, onClose } = useTab();\r\n\r\nfunction useStyle(): {\r\n tabsNavStyle: ComputedRef<string>;\r\n tabHoverBgStyle: ComputedRef<string>;\r\n closeBtnStyle: ComputedRef<string>;\r\n} {\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } = useToken();\r\n\r\n const activeTabColor = computed(() => token.value.colorBgLayout);\r\n const splitColor = computed(() => token.value.colorBorderSecondary);\r\n\r\n const tabsNavStyle = computed(() => {\r\n return css`\r\n --active-tab-color: ${activeTabColor.value};\r\n --splitColor: ${splitColor.value};\r\n padding-top: 10px;\r\n display: flex;\r\n `;\r\n });\r\n\r\n const tabHoverBgStyle = computed(() => {\r\n return css`\r\n &:before {\r\n background: ${token.value.colorPrimaryBgHover};\r\n }\r\n `;\r\n });\r\n\r\n const closeBtnStyle = computed(() => {\r\n return css`\r\n &:hover {\r\n background: ${token.value.colorPrimaryBorderHover};\r\n border-radius: 50%;\r\n }\r\n `;\r\n });\r\n\r\n return {\r\n tabsNavStyle,\r\n tabHoverBgStyle,\r\n closeBtnStyle\r\n };\r\n}\r\n\r\nfunction useTab() {\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n const store = useNavTabStore();\r\n const { list, activeKey } = storeToRefs(store);\r\n const { save, deleteTabs } = store;\r\n\r\n watch(\r\n () => route.fullPath,\r\n () => {\r\n save(route);\r\n },\r\n {\r\n immediate: true\r\n }\r\n );\r\n\r\n watch(\r\n () => route.fullPath,\r\n val => {\r\n activeKey.value = val;\r\n },\r\n {\r\n immediate: true\r\n }\r\n );\r\n\r\n const onChange = (key: string) => {\r\n if (key !== route.path) {\r\n // 匹配打开的标签路由数据\r\n const rs = list.value.filter(item => item.fullPath === key)[0];\r\n router.push(rs);\r\n }\r\n };\r\n\r\n const onClose = ($event: Event, key: string | undefined) => {\r\n if (!key) return;\r\n //阻止冒泡\r\n $event.stopPropagation();\r\n // 删除标签\r\n deleteTabs(key);\r\n // 重新push已打开的路由\r\n const backRoute = list.value[list.value.length - 1];\r\n if (backRoute.fullPath) {\r\n router.push(backRoute.fullPath);\r\n }\r\n };\r\n\r\n return {\r\n activeKey,\r\n list,\r\n onChange,\r\n onClose\r\n };\r\n}\r\n</script>\r\n<template>\r\n <div class=\"tabs-nav-wrapper\" :class=\"tabsNavStyle\">\r\n <Search />\r\n <div class=\"d-tabs-nav\">\r\n <a-tabs\r\n size=\"small\"\r\n v-model:activeKey=\"activeKey\"\r\n type=\"card\"\r\n hide-add\r\n @change=\"onChange\"\r\n >\r\n <a-tab-pane\r\n :key=\"item.fullPath\"\r\n :closable=\"false\"\r\n v-for=\"item in list\"\r\n :class=\"{ active: activeKey === item.fullPath }\"\r\n >\r\n <template #tab>\r\n <div class=\"tab-hover-bg\" :class=\"tabHoverBgStyle\"></div>\r\n <div class=\"tab-dividers\"></div>\r\n <div class=\"tab-item\">{{ item.meta?.title || \"无标题\" }}</div>\r\n <div class=\"tab-close\">\r\n <div\r\n class=\"close-btn\"\r\n :class=\"closeBtnStyle\"\r\n @click=\"onClose($event, item.fullPath)\"\r\n >\r\n <CloseOutlined />\r\n </div>\r\n </div>\r\n </template>\r\n </a-tab-pane>\r\n </a-tabs>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style lang=\"scss\"></style>\r\n"],"names":["tabsNavStyle","tabHoverBgStyle","closeBtnStyle","list","activeKey","onChange","onClose"],"mappings":"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"}
1
+ {"version":3,"file":"Tab.vue2.mjs","sources":["../../../../src/components/tab/Tab.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, type ComputedRef, watch } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport Search from \"./Search\";\r\nimport { CloseOutlined } from \"@ant-design/icons-vue\";\r\nimport {\r\n type NavTabsState,\r\n useNavTabStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nconst { tabsNavStyle, tabHoverBgStyle, closeBtnStyle } =\r\n useStyle();\r\n\r\nconst {\r\n activeKey,\r\n list,\r\n closeBtnStatus,\r\n onChange,\r\n onClose\r\n} = useTab();\r\n\r\nfunction useStyle(): {\r\n tabsNavStyle: ComputedRef<string>;\r\n tabHoverBgStyle: ComputedRef<string>;\r\n closeBtnStyle: ComputedRef<string>;\r\n} {\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const activeTabColor = computed(\r\n () => token.value.colorBgLayout\r\n );\r\n const splitColor = computed(\r\n () => token.value.colorBorderSecondary\r\n );\r\n\r\n const tabsNavStyle = computed(() => {\r\n return css`\r\n --active-tab-color: ${activeTabColor.value};\r\n --splitColor: ${splitColor.value};\r\n padding-top: 10px;\r\n display: flex;\r\n `;\r\n });\r\n\r\n const tabHoverBgStyle = computed(() => {\r\n return css`\r\n &:before {\r\n background: ${token.value.colorPrimaryBgHover};\r\n }\r\n `;\r\n });\r\n\r\n const closeBtnStyle = computed(() => {\r\n return css`\r\n &:hover {\r\n background: ${token.value.colorPrimaryBorderHover};\r\n border-radius: 50%;\r\n }\r\n `;\r\n });\r\n\r\n return {\r\n tabsNavStyle,\r\n tabHoverBgStyle,\r\n closeBtnStyle\r\n };\r\n}\r\n\r\nfunction useTab() {\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n const store = useNavTabStore();\r\n const { list, activeKey } = storeToRefs(store);\r\n const { save, deleteTabs } = store;\r\n\r\n watch(\r\n () => route.fullPath,\r\n () => {\r\n save(route);\r\n },\r\n {\r\n immediate: true\r\n }\r\n );\r\n\r\n watch(\r\n () => route.fullPath,\r\n val => {\r\n activeKey.value = val;\r\n },\r\n {\r\n immediate: true\r\n }\r\n );\r\n\r\n const onChange = (key: string) => {\r\n if (key !== route.path) {\r\n // 匹配打开的标签路由数据\r\n const rs = list.value.filter(\r\n item => item.fullPath === key\r\n )[0];\r\n router.push(rs);\r\n }\r\n };\r\n\r\n const onClose = (\r\n $event: Event,\r\n key: string | undefined\r\n ) => {\r\n if (!key) return;\r\n //阻止冒泡\r\n $event.stopPropagation();\r\n // 删除标签\r\n deleteTabs(key);\r\n // 重新push已打开的路由\r\n const backRoute = list.value[list.value.length - 1];\r\n if (backRoute.fullPath) {\r\n router.push(backRoute.fullPath);\r\n }\r\n };\r\n\r\n const closeBtnStatus = (item: NavTabsState) => {\r\n // 如果meta有设置keepOpen则隐藏关闭按钮\r\n if (item.meta?.keepOpen) {\r\n return false;\r\n } else {\r\n // 如果只有一个标签,则隐藏关闭按钮\r\n return list.value.length !== 1;\r\n }\r\n };\r\n\r\n return {\r\n activeKey,\r\n list,\r\n closeBtnStatus,\r\n onChange,\r\n onClose\r\n };\r\n}\r\n</script>\r\n<template>\r\n <div class=\"tabs-nav-wrapper\" :class=\"tabsNavStyle\">\r\n <Search />\r\n <div class=\"d-tabs-nav\">\r\n <a-tabs\r\n size=\"small\"\r\n v-model:activeKey=\"activeKey\"\r\n type=\"card\"\r\n hide-add\r\n @change=\"onChange\"\r\n >\r\n <a-tab-pane\r\n :key=\"item.fullPath\"\r\n :closable=\"false\"\r\n v-for=\"item in list\"\r\n :class=\"{ active: activeKey === item.fullPath }\"\r\n >\r\n <template #tab>\r\n <div\r\n class=\"tab-hover-bg\"\r\n :class=\"tabHoverBgStyle\"\r\n ></div>\r\n <div class=\"tab-dividers\"></div>\r\n <div class=\"tab-item\">\r\n {{ item.meta?.title || \"无标题\" }}\r\n </div>\r\n <div\r\n class=\"tab-close\"\r\n v-if=\"closeBtnStatus(item)\"\r\n >\r\n <div\r\n class=\"close-btn\"\r\n :class=\"closeBtnStyle\"\r\n @click=\"onClose($event, item.fullPath)\"\r\n >\r\n <CloseOutlined />\r\n </div>\r\n </div>\r\n </template>\r\n </a-tab-pane>\r\n </a-tabs>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style lang=\"scss\"></style>\r\n"],"names":["tabsNavStyle","tabHoverBgStyle","closeBtnStyle","list","activeKey","onChange","onClose","closeBtnStatus"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { defineComponent, ref, onMounted, computed, watch, nextTick, createVNode } from 'vue';
1
+ import { defineComponent, ref, onMounted, computed, watch, nextTick, createVNode, mergeProps } from 'vue';
2
2
  import { Flex, Table, Pagination } from 'ant-design-vue';
3
3
  import { css } from '@emotion/css';
4
4
  import { merge } from 'lodash';
@@ -91,7 +91,8 @@ const DTable = /* @__PURE__ */ defineComponent({
91
91
  emits: ["update:keys"],
92
92
  setup(props, {
93
93
  emit,
94
- slots
94
+ slots,
95
+ attrs
95
96
  }) {
96
97
  const selectedRowKeys = ref(props.keys || []);
97
98
  const {
@@ -330,7 +331,7 @@ const DTable = /* @__PURE__ */ defineComponent({
330
331
  "vertical": true,
331
332
  "ref": tableRef
332
333
  }, {
333
- default: () => [createVNode(Table, {
334
+ default: () => [createVNode(Table, mergeProps(attrs, {
334
335
  "loading": props.loading,
335
336
  "size": props.size,
336
337
  "bordered": props.bordered,
@@ -345,9 +346,9 @@ const DTable = /* @__PURE__ */ defineComponent({
345
346
  x: "100%",
346
347
  scrollToFirstRowOnChange: true
347
348
  }
348
- }, tableSlots), createVNode("div", {
349
+ }), tableSlots), pagination.value && createVNode("div", {
349
350
  "class": [paginationStyle, "d-pagination"]
350
- }, [pagination && createVNode(Pagination, {
351
+ }, [createVNode(Pagination, {
351
352
  "current": paginationConfig.value.current,
352
353
  "onUpdate:current": ($event) => paginationConfig.value.current = $event,
353
354
  "pageSize": paginationConfig.value.pageSize,