@veltra/desktop 1.1.3 → 1.1.5

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 (163) hide show
  1. package/dist/components/action/action-group.js +3 -110
  2. package/dist/components/action/action-group.js.map +1 -1
  3. package/dist/components/action/action-group.vue.d.ts +5 -14
  4. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js +105 -0
  5. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -0
  6. package/dist/components/action/action.js +5 -1
  7. package/dist/components/action/action.js.map +1 -1
  8. package/dist/components/action/di.js.map +1 -1
  9. package/dist/components/action/style2.css +17 -14
  10. package/dist/components/auto-complete/auto-complete.js +1 -1
  11. package/dist/components/auto-complete/auto-complete.vue.d.ts +2 -2
  12. package/dist/components/badge/badge.js +1 -1
  13. package/dist/components/batch-edit/batch-edit-form.js +94 -101
  14. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  15. package/dist/components/batch-edit/batch-edit-list.js +52 -68
  16. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  17. package/dist/components/batch-edit/style2.css +13 -89
  18. package/dist/components/breadcrumb/breadcrumb.js +1 -1
  19. package/dist/components/button/button.js +1 -1
  20. package/dist/components/card/card.js +1 -1
  21. package/dist/components/cascade/cascade-panel-item.js +4 -4
  22. package/dist/components/cascade/cascade.js +2 -2
  23. package/dist/components/cascade/cascade.vue.d.ts +5 -5
  24. package/dist/components/checkbox/checkbox-button.js +1 -1
  25. package/dist/components/checkbox/checkbox.js +1 -1
  26. package/dist/components/checkbox-group/checkbox-group.js +1 -1
  27. package/dist/components/code-editor/code-editor.js +1 -1
  28. package/dist/components/collapse/collapse.js +1 -1
  29. package/dist/components/condition-editor/components/condition-group.js +152 -0
  30. package/dist/components/condition-editor/components/condition-group.js.map +1 -0
  31. package/dist/components/condition-editor/components/condition-row.js +217 -0
  32. package/dist/components/condition-editor/components/condition-row.js.map +1 -0
  33. package/dist/components/condition-editor/condition-editor.js +134 -5
  34. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  35. package/dist/components/condition-editor/condition-editor.vue.d.ts +10 -2
  36. package/dist/components/condition-editor/core/evaluator.js +75 -0
  37. package/dist/components/condition-editor/core/evaluator.js.map +1 -0
  38. package/dist/components/condition-editor/core/operators.js +123 -0
  39. package/dist/components/condition-editor/core/operators.js.map +1 -0
  40. package/dist/components/condition-editor/style.js +7 -0
  41. package/dist/components/condition-editor/style2.css +186 -0
  42. package/dist/components/context-menu/context-menu.js +1 -1
  43. package/dist/components/date-picker/date-picker.js +2 -2
  44. package/dist/components/date-picker/date-picker.vue.d.ts +2 -2
  45. package/dist/components/date-range-picker/date-range-picker.js +2 -2
  46. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +2 -2
  47. package/dist/components/dialog/dialog.js +7 -7
  48. package/dist/components/dialog/style2.css +8 -0
  49. package/dist/components/dialog/use-maximum.js +1 -1
  50. package/dist/components/drawer/style2.css +8 -0
  51. package/dist/components/dropdown/dropdown.js +1 -1
  52. package/dist/components/expression-editor/components/variable-picker.js +8 -8
  53. package/dist/components/expression-editor/expression-editor.js +1 -1
  54. package/dist/components/expression-editor/style2.css +1 -0
  55. package/dist/components/file-viewer/file-viewer.js +13 -13
  56. package/dist/components/form-item/form-item.js.map +1 -1
  57. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js +6 -6
  58. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/components/grid-input/grid-input.js +1 -1
  60. package/dist/components/group-input/group-input.js +2 -1
  61. package/dist/components/group-input/group-input.js.map +1 -1
  62. package/dist/components/group-input/style.js +1 -0
  63. package/dist/components/index.js +154 -154
  64. package/dist/components/input/input.vue.d.ts +4 -4
  65. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js +1 -1
  66. package/dist/components/layout/layout-resizer.js +1 -1
  67. package/dist/components/layout/layout.js +1 -1
  68. package/dist/components/list/list.js +1 -1
  69. package/dist/components/loading/loading.js +1 -1
  70. package/dist/components/menu/menu-sub-collapsed.js +4 -4
  71. package/dist/components/menu/menu.js +1 -1
  72. package/dist/components/message/message.js +1 -1
  73. package/dist/components/message-confirm/message-confirm.js +1 -1
  74. package/dist/components/multi-select/multi-select-option.js +19 -14
  75. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  76. package/dist/components/multi-select/multi-select.js +15 -15
  77. package/dist/components/multi-select/multi-select.vue.d.ts +4 -4
  78. package/dist/components/multi-tree-select/multi-tree-select.js +8 -8
  79. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +6 -6
  80. package/dist/components/notification/notification.js +1 -1
  81. package/dist/components/notification/notification.vue.d.ts +1 -1
  82. package/dist/components/number/number.vue.d.ts +1 -1
  83. package/dist/components/number-input/number-input.js +2 -2
  84. package/dist/components/number-input/number-input.vue.d.ts +4 -4
  85. package/dist/components/number-range-input/number-range-input.js +1 -1
  86. package/dist/components/number-range-input/number-range-input.vue.d.ts +1 -1
  87. package/dist/components/number-range-input/style2.css +1 -0
  88. package/dist/components/paginator/paginator.js +6 -6
  89. package/dist/components/paginator/style.js +1 -1
  90. package/dist/components/palette/palette.js +1 -1
  91. package/dist/components/password-input/password-input.js +2 -2
  92. package/dist/components/password-input/password-input.vue.d.ts +1 -1
  93. package/dist/components/pop-confirm/pop-confirm.js +1 -1
  94. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
  95. package/dist/components/progress-nodes/progress-nodes.js +1 -1
  96. package/dist/components/radio/radio.js +1 -1
  97. package/dist/components/radio-group/radio-group.js +1 -1
  98. package/dist/components/rich-text-editor/rich-text-editor.js +1 -1
  99. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +1 -1
  100. package/dist/components/scroll/scroll-bar.js +1 -1
  101. package/dist/components/scroll/scroll.js +1 -1
  102. package/dist/components/select/select.js +10 -10
  103. package/dist/components/select/select.vue.d.ts +2 -2
  104. package/dist/components/slider/slider.js +1 -1
  105. package/dist/components/steps/steps.js +2 -2
  106. package/dist/components/switch/switch.js +1 -1
  107. package/dist/components/table/style2.css +4 -1
  108. package/dist/components/table/table.js +2 -2
  109. package/dist/components/table/table.js.map +1 -1
  110. package/dist/components/table/use-columns.js +1 -1
  111. package/dist/components/table/use-fixed-columns.js +8 -31
  112. package/dist/components/table/use-fixed-columns.js.map +1 -1
  113. package/dist/components/table-editor/table-editor.js +1 -1
  114. package/dist/components/tabs/tabs-horizontal.js +1 -1
  115. package/dist/components/tabs/tabs-horizontal.vue.d.ts +4 -4
  116. package/dist/components/tabs/tabs-vertical.js +1 -1
  117. package/dist/components/tabs/tabs-vertical.vue.d.ts +3 -3
  118. package/dist/components/tabs/tabs.js +1 -1
  119. package/dist/components/tabs/tabs.vue.d.ts +4 -4
  120. package/dist/components/tag/tag.js +1 -1
  121. package/dist/components/textarea/textarea.js +1 -1
  122. package/dist/components/textarea/textarea.vue.d.ts +4 -4
  123. package/dist/components/theme/style.js +1 -1
  124. package/dist/components/theme/theme.js +11 -11
  125. package/dist/components/tip/tip.js +1 -1
  126. package/dist/components/tree/tree-node.js +1 -1
  127. package/dist/components/tree/tree.js +5 -5
  128. package/dist/components/tree-select/tree-select.js +6 -6
  129. package/dist/components/tree-select/tree-select.vue.d.ts +5 -5
  130. package/dist/index.d.ts +5 -5
  131. package/dist/index.js +83 -83
  132. package/dist/style.js +2 -2
  133. package/dist/types/action.d.ts +5 -11
  134. package/dist/types/condition-editor.d.ts +41 -8
  135. package/dist/types/index.d.ts +4 -4
  136. package/package.json +11 -11
  137. package/src/components/action/action-group.vue +68 -82
  138. package/src/components/action/action.vue +9 -1
  139. package/src/components/action/di.ts +2 -1
  140. package/src/components/action/style.scss +22 -27
  141. package/src/components/batch-edit/batch-edit-form.vue +65 -70
  142. package/src/components/batch-edit/batch-edit-list.vue +35 -41
  143. package/src/components/batch-edit/style.scss +19 -118
  144. package/src/components/condition-editor/components/condition-group.vue +131 -0
  145. package/src/components/condition-editor/components/condition-row.vue +208 -0
  146. package/src/components/condition-editor/condition-editor.vue +145 -6
  147. package/src/components/condition-editor/core/evaluator.ts +93 -0
  148. package/src/components/condition-editor/core/operators.ts +57 -0
  149. package/src/components/condition-editor/style.scss +239 -1
  150. package/src/components/condition-editor/style.ts +7 -0
  151. package/src/components/dialog/style.scss +13 -0
  152. package/src/components/drawer/style.scss +13 -0
  153. package/src/components/expression-editor/style.scss +1 -0
  154. package/src/components/form-item/form-item.vue +1 -1
  155. package/src/components/group-input/group-input.vue +8 -1
  156. package/src/components/group-input/style.ts +1 -0
  157. package/src/components/multi-select/multi-select-option.vue +19 -13
  158. package/src/components/number-range-input/style.scss +1 -0
  159. package/src/components/table/style.scss +9 -1
  160. package/src/components/table/table.vue +1 -3
  161. package/src/components/table/use-fixed-columns.ts +5 -49
  162. package/src/types/action.ts +6 -11
  163. package/src/types/condition-editor.ts +39 -7
@@ -2,4 +2,5 @@ import type { InjectionKey } from 'vue'
2
2
 
3
3
  import type { ActionGroupProps } from '../../types'
4
4
 
5
- export const ActionDIKey: InjectionKey<{ groupProps: ActionGroupProps }> = Symbol('ActionDIKey')
5
+ export const ActionDIKey: InjectionKey<{ groupProps: ActionGroupProps; closeTip: () => void }> =
6
+ Symbol('ActionDIKey')
@@ -1,5 +1,6 @@
1
1
  @use 'pkg:@veltra/styles/mixins' as m;
2
2
  @use 'pkg:@veltra/styles/functions' as fn;
3
+ @use 'pkg:@veltra/styles/vars';
3
4
 
4
5
  $root-name: action;
5
6
  $group-name: action-group;
@@ -8,39 +9,29 @@ $group-name: action-group;
8
9
  display: inline-flex;
9
10
  align-items: center;
10
11
  vertical-align: middle;
11
- gap: 6px;
12
+ gap: 2px;
13
+ padding: 2px 4px;
14
+ border-radius: 999px;
15
+ background-color: color-mix(in srgb, #{fn.use-var(bg-color, top)} 70%, transparent);
16
+ backdrop-filter: fn.use-var(bg-filter);
17
+ -webkit-backdrop-filter: fn.use-var(bg-filter);
18
+ box-shadow: 0 1px 4px color-mix(in srgb, #{fn.use-var(shadow, color)} 35%, transparent);
12
19
 
13
- // 下拉触发按钮的占位类(与子项一致的间距处理)
14
20
  @include m.e(more) {
15
21
  flex-shrink: 0;
16
22
  }
17
23
 
18
- // 紧凑悬浮模式:默认半透明,仅在悬浮 / 当前激活态显现
19
- // 适用于行内(表格行、列表项)操作栏,搭配 .u-action-group 子项达到一致的圆形按钮观感
20
- @include m.is(hover) {
21
- gap: 2px;
22
- padding: 2px 4px;
23
- border-radius: 999px;
24
- opacity: 0.45;
25
- transition:
26
- opacity 0.18s ease,
27
- background-color 0.18s ease,
28
- box-shadow 0.18s ease;
29
-
30
- &:hover,
31
- &:focus-within {
32
- opacity: 1;
33
- background-color: color-mix(in srgb, #{fn.use-var(bg-color, top)} 70%, transparent);
34
- backdrop-filter: fn.use-var(bg-filter);
35
- -webkit-backdrop-filter: fn.use-var(bg-filter);
36
- box-shadow: 0 1px 4px color-mix(in srgb, #{fn.use-var(shadow, color)} 35%, transparent);
37
- }
24
+ @include m.e(separator) {
25
+ display: inline-block;
26
+ flex-shrink: 0;
27
+ width: 1px;
28
+ vertical-align: middle;
29
+ height: 0.8em;
30
+ margin: 0 4px;
31
+ background-color: fn.use-var(border-color);
38
32
  }
39
33
 
40
- // 下拉菜单内容容器:模拟菜单项视觉
41
34
  @include m.e(dropdown) {
42
- padding: 4px;
43
- min-width: 140px;
44
35
  display: flex;
45
36
  flex-direction: column;
46
37
  gap: 2px;
@@ -48,9 +39,8 @@ $group-name: action-group;
48
39
  @include m.b(button) {
49
40
  width: 100%;
50
41
  justify-content: flex-start;
51
- padding: 0 12px;
42
+ padding: 0 10px;
52
43
 
53
- // 下拉项不再使用同级间距,恢复块级布局
54
44
  & + & {
55
45
  margin-left: 0;
56
46
  }
@@ -58,6 +48,11 @@ $group-name: action-group;
58
48
  }
59
49
  }
60
50
 
51
+ // 覆盖 tip 组件尺寸类(.tip--default)的 padding,下拉菜单需要更紧凑的间距
52
+ .#{vars.$namespace}#{$group-name}__dropdown#{vars.$namespace}tip__content {
53
+ padding: 4px;
54
+ }
55
+
61
56
  @include m.b($root-name) {
62
57
  flex-shrink: 0;
63
58
  }
@@ -1,77 +1,75 @@
1
1
  <template>
2
- <transition name="batch-edit-panel" appear>
3
- <aside :class="cls.e('form')" v-if="state.visible && !!props.model">
4
- <header :class="cls.e('form-header')">
5
- <span :class="[cls.e('form-icon'), bem.is(headerInfo.tone)]">
6
- <u-icon>
7
- <component :is="headerInfo.icon" />
8
- </u-icon>
2
+ <aside :class="cls.e('form')" v-if="state.visible && !!props.model">
3
+ <header :class="cls.e('form-header')">
4
+ <span :class="[cls.e('form-icon'), bem.is(headerInfo.tone)]">
5
+ <u-icon>
6
+ <component :is="headerInfo.icon" />
7
+ </u-icon>
8
+ </span>
9
+ <div :class="cls.e('form-title')">
10
+ <h3 :class="cls.e('form-title-text')">{{ headerInfo.title }}</h3>
11
+ <span v-if="headerInfo.chip" :class="cls.e('form-chip')">
12
+ {{ headerInfo.chip }}
9
13
  </span>
10
- <div :class="cls.e('form-title')">
11
- <h3 :class="cls.e('form-title-text')">{{ headerInfo.title }}</h3>
12
- <span v-if="headerInfo.chip" :class="cls.e('form-chip')">
13
- {{ headerInfo.chip }}
14
- </span>
15
- </div>
16
- <u-button
17
- :class="cls.e('form-close')"
18
- :icon="Close"
19
- text
20
- circle
21
- size="small"
22
- title="关闭"
23
- @click="handleClose"
24
- />
25
- </header>
14
+ </div>
15
+ <u-button
16
+ :class="cls.e('form-close')"
17
+ :icon="Close"
18
+ text
19
+ circle
20
+ size="small"
21
+ title="关闭"
22
+ @click="handleClose"
23
+ />
24
+ </header>
26
25
 
26
+ <u-scroll always :class="cls.e('form-body')" :key="bodyKey">
27
27
  <transition name="fade" appear mode="out-in">
28
- <u-scroll always :class="cls.e('form-body')" :key="bodyKey">
29
- <u-form
30
- :model="props.model"
31
- :readonly="props.readonly"
32
- @keyup.enter="handleSave"
33
- :label-width="props.labelWidth"
34
- >
35
- <template #default="{ data, model }">
36
- <slot
37
- v-bind="{
38
- data,
39
- model,
40
- row: state.row,
41
- depth: state.depth,
42
- indexes: insertIndexes,
43
- index: state.row?.index
44
- }"
45
- />
46
- </template>
47
- </u-form>
48
- </u-scroll>
28
+ <u-form
29
+ :model="props.model"
30
+ :readonly="props.readonly"
31
+ @keyup.enter="handleSave"
32
+ :label-width="props.labelWidth"
33
+ >
34
+ <template #default="{ data, model }">
35
+ <slot
36
+ v-bind="{
37
+ data,
38
+ model,
39
+ row: state.row,
40
+ depth: state.depth,
41
+ indexes: insertIndexes,
42
+ index: state.row?.index
43
+ }"
44
+ />
45
+ </template>
46
+ </u-form>
49
47
  </transition>
48
+ </u-scroll>
50
49
 
51
- <footer :class="cls.e('form-footer')">
52
- <span :class="cls.e('form-hint')" v-if="!props.readonly && state.dataUpdated">
53
- 有未保存改动
54
- </span>
55
- <span :class="cls.e('form-hint')" v-else-if="!props.readonly">
56
- <kbd>Enter</kbd> 保存 · <kbd>Esc</kbd> 关闭
57
- </span>
58
- <span :class="cls.e('form-hint')" v-else>只读模式</span>
50
+ <footer :class="cls.e('form-footer')">
51
+ <span :class="cls.e('form-hint')" v-if="!props.readonly && state.dataUpdated">
52
+ 有未保存改动
53
+ </span>
54
+ <span :class="cls.e('form-hint')" v-else-if="!props.readonly">
55
+ <kbd>Enter</kbd> 保存 · <kbd>Esc</kbd> 关闭
56
+ </span>
57
+ <span :class="cls.e('form-hint')" v-else>只读模式</span>
59
58
 
60
- <div :class="cls.e('form-actions')">
61
- <u-button text :loading="state.loading" @click="handleClose"> 取消 </u-button>
62
- <u-button
63
- v-if="!props.readonly && (creatable || updatable)"
64
- :type="state.type === 'create' ? 'success' : 'primary'"
65
- :loading="state.loading"
66
- :disabled="!state.dataUpdated"
67
- @click="handleSave"
68
- >
69
- {{ state.type === 'create' ? '保存新增' : '保存修改' }}
70
- </u-button>
71
- </div>
72
- </footer>
73
- </aside>
74
- </transition>
59
+ <div :class="cls.e('form-actions')">
60
+ <u-button text :loading="state.loading" @click="handleClose"> 取消 </u-button>
61
+ <u-button
62
+ v-if="!props.readonly && (creatable || updatable)"
63
+ :type="state.type === 'create' ? 'success' : 'primary'"
64
+ :loading="state.loading"
65
+ :disabled="!state.dataUpdated"
66
+ @click="handleSave"
67
+ >
68
+ 保存
69
+ </u-button>
70
+ </div>
71
+ </footer>
72
+ </aside>
75
73
  </template>
76
74
 
77
75
  <script lang="ts" setup>
@@ -140,9 +138,6 @@ const headerInfo = computed<HeaderInfo>(() => {
140
138
  return {
141
139
  icon: Plus,
142
140
  title: '新增',
143
- chip: insertIndexes.value.length
144
- ? `插入到第 ${insertIndexes.value[insertIndexes.value.length - 1]! + 1} 位`
145
- : undefined,
146
141
  tone: 'create'
147
142
  }
148
143
  }
@@ -5,20 +5,37 @@
5
5
  :class="[cls.e('table'), bem.is('editing', state.visible)]"
6
6
  :columns="columns"
7
7
  highlight-current
8
- :current-row="state.row"
8
+ :current="state.row"
9
9
  @update:current="handleUpdateCurrentRow"
10
10
  @update:checked="emit('update:checked', $event)"
11
11
  @update:selected="emit('update:selected', $event)"
12
12
  ref="tableRef"
13
13
  >
14
14
  <template #column:__action__="{ row }">
15
- <u-action-group :class="cls.e('row-actions')" hover circle :max="3" @click.stop>
15
+ <u-action-group :class="cls.e('row-actions')" :max="5" @click.stop circle>
16
16
  <u-action
17
- v-if="canEdit(row)"
18
- :icon="props.readonly ? View : EditPen"
19
- :title="props.readonly ? '查看' : '编辑'"
20
- @run="handleEdit(row)"
21
- v-bind="props.actionsProps?.update"
17
+ v-if="allowed('create', row)"
18
+ :icon="InsertToPrev"
19
+ title="在上方插入"
20
+ @run="handleInsertToPrev(row)"
21
+ />
22
+ <u-action
23
+ v-if="allowed('create', row)"
24
+ :icon="InsertToNext"
25
+ title="在下方插入"
26
+ @run="handleInsertToNext(row)"
27
+ />
28
+ <u-action
29
+ v-if="!!props.tree && allowed('createChild', row)"
30
+ :icon="AddChild"
31
+ title="添加子级"
32
+ @run="handleInsertChild(row)"
33
+ />
34
+ <u-action
35
+ v-if="allowed('copy', row)"
36
+ :icon="Copy"
37
+ title="复制此行"
38
+ @run="handleCopy(row)"
22
39
  />
23
40
 
24
41
  <u-action
@@ -29,23 +46,6 @@
29
46
  @run="handleDelete(row)"
30
47
  v-bind="props.actionsProps?.delete"
31
48
  />
32
-
33
- <u-action v-if="allowed('create', row)" in-dropdown @run="handleInsertToPrev(row)">
34
- 在上方插入
35
- </u-action>
36
- <u-action v-if="allowed('create', row)" in-dropdown @run="handleInsertToNext(row)">
37
- 在下方插入
38
- </u-action>
39
- <u-action
40
- v-if="!!props.tree && allowed('createChild', row)"
41
- in-dropdown
42
- @run="handleInsertChild(row)"
43
- >
44
- 添加子级
45
- </u-action>
46
- <u-action v-if="allowed('copy', row)" in-dropdown @run="handleCopy(row)">
47
- 复制此行
48
- </u-action>
49
49
  </u-action-group>
50
50
  </template>
51
51
 
@@ -60,17 +60,16 @@
60
60
  "
61
61
  >
62
62
  <div :class="cls.e('add')">
63
- <button
64
- type="button"
65
- :class="[cls.e('add-btn'), bem.is('loading', state.loading)]"
66
- :disabled="state.loading"
63
+ <u-button
64
+ :class="cls.e('add-btn')"
65
+ :icon="Plus"
66
+ :loading="state.loading"
67
+ type="primary"
68
+ plain
67
69
  @click.stop="handleCreate"
68
70
  >
69
- <u-icon :class="cls.e('add-icon')">
70
- <Plus />
71
- </u-icon>
72
- <span :class="cls.e('add-label')">新增一行</span>
73
- </button>
71
+ 新增一行
72
+ </u-button>
74
73
  </div>
75
74
  </template>
76
75
  </u-table>
@@ -78,13 +77,13 @@
78
77
 
79
78
  <script setup lang="ts">
80
79
  import { o } from '@cat-kit/core'
81
- import { Delete, EditPen, Plus, View } from '@veltra/icons/normal'
80
+ import { AddChild, Copy, Delete, InsertToNext, InsertToPrev, Plus } from '@veltra/icons/normal'
82
81
  import { bem } from '@veltra/utils'
83
82
  import { computed, inject, type Slots } from 'vue'
84
83
 
85
84
  import type { BatchEditFeature, TableRow } from '../../types'
86
85
  import { UAction, UActionGroup } from '../action'
87
- import { UIcon } from '../icon'
86
+ import { UButton } from '../button'
88
87
  import { UTable } from '../table'
89
88
  import { BatchEditDIKey } from './di'
90
89
 
@@ -105,7 +104,6 @@ const {
105
104
  staticFeatures,
106
105
  dynamicFeatures,
107
106
  handleCreate,
108
- handleEdit,
109
107
  handleCopy,
110
108
  handleDelete,
111
109
  handleInsertToNext,
@@ -139,7 +137,7 @@ const columns = computed(() => {
139
137
  name: '操作',
140
138
  key: '__action__',
141
139
  align: 'center',
142
- width: 132,
140
+ width: 180,
143
141
  fixed: 'right',
144
142
  resizable: false
145
143
  })
@@ -152,10 +150,6 @@ function handleUpdateCurrentRow(row?: TableRow) {
152
150
  }
153
151
  }
154
152
 
155
- function canEdit(row: TableRow) {
156
- return !props.readonly ? allowed('update', row) : true
157
- }
158
-
159
153
  function canDelete(row: TableRow) {
160
154
  return !props.readonly && allowed('delete', row)
161
155
  }
@@ -9,26 +9,17 @@ $root-name: batch-edit;
9
9
  overflow: hidden;
10
10
  border-radius: fn.use-var(radius, default);
11
11
 
12
+ &:focus,
13
+ &:focus-visible {
14
+ outline: none;
15
+ }
16
+
12
17
  // ---------- 表格容器 ----------
13
18
  @include m.e(table) {
14
19
  flex-grow: 1;
15
20
  }
16
21
 
17
- // ---------- 行内悬浮动作条(操作列) ----------
18
- // 操作组使用 `u-action-group` 的 hover 模式
19
- // 这里在父级表格行 hover / 当前激活时强制显现整组
20
- .u-table__row:hover .#{vars.$namespace}action-group.is-hover,
21
- .u-table__row.is-current .#{vars.$namespace}action-group.is-hover {
22
- opacity: 1;
23
- background-color: color-mix(in srgb, #{fn.use-var(bg-color, top)} 70%, transparent);
24
- backdrop-filter: fn.use-var(bg-filter);
25
- -webkit-backdrop-filter: fn.use-var(bg-filter);
26
- box-shadow: 0 1px 4px color-mix(in srgb, #{fn.use-var(shadow, color)} 35%, transparent);
27
- }
28
-
29
22
  // ---------- 底部"新增一行"按钮 ----------
30
- // 按钮通过水平方向 sticky 始终贴住滚动视口左侧,
31
- // 避免列很长横向滚动时按钮内容被滚出视口外
32
23
  @include m.e(add) {
33
24
  position: sticky;
34
25
  left: 0;
@@ -39,72 +30,14 @@ $root-name: batch-edit;
39
30
  }
40
31
 
41
32
  @include m.e(add-btn) {
42
- --add-color: #{fn.use-var(color, primary)};
43
- --add-border: #{color-mix(in srgb, fn.use-var(color, primary) 60%, transparent)};
44
- --add-bg: #{color-mix(in srgb, fn.use-var(color, primary) 5%, transparent)};
45
-
46
33
  position: sticky;
47
34
  left: 12px;
48
- height: 36px;
49
- min-width: 220px;
50
- max-width: 320px;
51
- display: inline-flex;
52
- align-items: center;
53
- justify-content: center;
54
- gap: 6px;
55
- padding: 0 20px;
56
- background: var(--add-bg);
57
- border: 1px dashed var(--add-border);
58
- border-radius: fn.use-var(radius, default);
59
- color: var(--add-color);
60
- font-size: fn.use-var(font-size-main, default);
61
- font-weight: 500;
62
- cursor: pointer;
63
- transition:
64
- border-color 0.18s ease,
65
- color 0.18s ease,
66
- background-color 0.18s ease,
67
- transform 0.18s ease;
68
- font-family: inherit;
69
-
70
- &:hover:not(:disabled) {
71
- --add-border: #{fn.use-var(color, primary)};
72
- --add-bg: #{fn.use-var(color, primary, light-9)};
73
- border-style: solid;
74
- }
75
-
76
- &:active:not(:disabled) {
77
- transform: translateY(1px);
78
- }
79
-
80
- &:disabled {
81
- cursor: not-allowed;
82
- opacity: 0.55;
83
- }
84
-
85
- @include m.is(loading) {
86
- pointer-events: none;
87
- }
88
- }
89
-
90
- @include m.e(add-icon) {
91
- font-size: 16px;
92
- display: inline-flex;
93
- transition: transform 0.18s ease;
94
- }
95
-
96
- .#{vars.$namespace}#{$root-name}__add-btn:hover .#{vars.$namespace}#{$root-name}__add-icon {
97
- transform: rotate(90deg);
98
- }
99
-
100
- @include m.e(add-label) {
101
- line-height: 1;
102
35
  }
103
36
 
104
37
  // ---------- 右侧表单侧栏 ----------
105
38
  @include m.e(form) {
106
39
  --u-batch-edit-form-radius: #{fn.use-var(radius, large)};
107
- --u-batch-edit-form-padding: 16px;
40
+ --u-batch-edit-form-padding: 18px;
108
41
 
109
42
  display: flex;
110
43
  flex-direction: column;
@@ -116,31 +49,19 @@ $root-name: batch-edit;
116
49
  overflow: hidden;
117
50
  isolation: isolate;
118
51
  min-height: 0;
119
-
120
- // 顶部装饰渐变条
121
- &::before {
122
- content: '';
123
- position: absolute;
124
- top: 0;
125
- left: 0;
126
- right: 0;
127
- height: 3px;
128
- background: linear-gradient(
129
- 90deg,
130
- fn.use-var(color, primary) 0%,
131
- color-mix(in srgb, #{fn.use-var(color, primary)} 50%, transparent) 100%
132
- );
133
- opacity: 0.7;
134
- z-index: 1;
135
- }
136
52
  }
137
53
 
138
54
  @include m.e(form-header) {
139
55
  display: flex;
140
56
  align-items: center;
141
- gap: 10px;
142
- padding: 8px 14px;
57
+ gap: 12px;
58
+ padding: 10px 14px;
143
59
  border-bottom: 1px solid fn.use-var(border-color);
60
+ background-color: color-mix(
61
+ in srgb,
62
+ #{fn.use-var(bg-color, top)} 96%,
63
+ #{fn.use-var(bg-color, hover)}
64
+ );
144
65
  flex-shrink: 0;
145
66
  }
146
67
 
@@ -180,8 +101,8 @@ $root-name: batch-edit;
180
101
  flex: 1 1 auto;
181
102
  min-width: 0;
182
103
  display: flex;
183
- flex-direction: column;
184
- gap: 2px;
104
+ align-items: center;
105
+ gap: 8px;
185
106
 
186
107
  &-text {
187
108
  margin: 0;
@@ -194,32 +115,26 @@ $root-name: batch-edit;
194
115
 
195
116
  @include m.e(form-chip) {
196
117
  display: inline-block;
197
- align-self: flex-start;
198
118
  padding: 1px 8px;
199
119
  font-size: 12px;
200
120
  line-height: 18px;
201
- border-radius: 999px;
202
- background-color: fn.use-var(bg-color, hover);
121
+ border-radius: fn.use-var(radius, default);
122
+ background-color: fn.use-var(bg-color, default);
203
123
  color: fn.use-var(text-color, second);
204
124
  white-space: nowrap;
205
125
  overflow: hidden;
206
126
  text-overflow: ellipsis;
207
- max-width: 100%;
127
+ max-width: 60%;
208
128
  }
209
129
 
210
130
  @include m.e(form-close) {
211
131
  flex-shrink: 0;
212
- align-self: flex-start;
213
132
  }
214
133
 
215
134
  @include m.e(form-body) {
216
135
  flex: 1 1 auto;
217
136
  min-height: 0;
218
-
219
- // 仅限定 batch-edit 内的 u-form 表单滚动区内边距
220
- .#{vars.$namespace}form__body {
221
- padding: 10px var(--u-batch-edit-form-padding) 4px;
222
- }
137
+ padding: 6px 8px 0;
223
138
  }
224
139
 
225
140
  @include m.e(form-footer) {
@@ -266,17 +181,3 @@ $root-name: batch-edit;
266
181
  flex-shrink: 0;
267
182
  }
268
183
  }
269
-
270
- // 表单面板进出过渡:从右侧滑入并轻微缩放
271
- .batch-edit-panel-enter-active,
272
- .batch-edit-panel-leave-active {
273
- transition:
274
- transform 0.32s cubic-bezier(0.32, 0.72, 0, 1),
275
- opacity 0.24s ease;
276
- }
277
-
278
- .batch-edit-panel-enter-from,
279
- .batch-edit-panel-leave-to {
280
- transform: translateX(16px) scale(0.985);
281
- opacity: 0;
282
- }