11<script setup lang="ts">
22import type { MaterialNode } from ' @easyink/schema'
33import type { TreeNode } from ' @easyink/ui'
4- import { UpdateMaterialMetaCommand } from ' @easyink/core'
5- import { IconHidden , IconLock } from ' @easyink/icons'
4+ import { IconDelete , IconHidden , IconLock , IconPreview } from ' @easyink/icons'
65import { EiIcon , EiTree } from ' @easyink/ui'
76import { computed } from ' vue'
87import { useDesignerStore } from ' ../composables'
8+ import { deleteMaterialNodes , toggleMaterialHidden , updateMaterialMeta } from ' ../interactions/element-actions'
99import { selectOne } from ' ../interactions/selection-api'
1010
1111const store = useDesignerStore ()
@@ -43,18 +43,20 @@ function handleSelect(node: TreeNode) {
4343 selectOne (store , node .id )
4444}
4545
46- function updateNodeMeta (node : MaterialNode , updates : Partial < Record < ' hidden ' | ' locked ' , boolean | undefined >> ) {
47- store . commands . execute ( new UpdateMaterialMetaCommand ( store . schema . elements , node . id , updates ) )
46+ function handleUnlock (node : MaterialNode ) {
47+ updateMaterialMeta ( store , ' Unlock ' , [ node ], { locked: false } )
4848}
4949
50- function handleUnlock(node : MaterialNode ) {
51- updateNodeMeta (node , { locked: false })
50+ function handleToggleHidden(node : MaterialNode ) {
51+ toggleMaterialHidden (store , node )
52+ }
53+
54+ function handleDelete(node : MaterialNode ) {
55+ deleteMaterialNodes (store , [node ])
5256}
5357
54- function handleShow(node : MaterialNode ) {
55- if (node .locked )
56- return
57- updateNodeMeta (node , { hidden: false })
58+ function visibilityTitle(node : MaterialNode ): string {
59+ return store .t (node .hidden ? ' designer.context.show' : ' designer.context.hide' )
5860}
5961 </script >
6062
@@ -66,37 +68,86 @@ function handleShow(node: MaterialNode) {
6668 @select =" handleSelect"
6769 >
6870 <template #suffix =" { node } " >
69- <EiIcon
71+ <button
7072 v-if =" (node.data as MaterialNode)?.locked"
71- :icon = " IconLock "
72- :size = " 12 "
73- :stroke-width = " 1.5 "
74- class = " structure-tree__status structure-tree__status--action "
73+ type = " button "
74+ class = " structure-tree__action "
75+ :title = " store.t('designer.context.unlock') "
76+ :aria-label = " store.t('designer.context.unlock') "
7577 @click.stop =" handleUnlock(node.data as MaterialNode)"
76- />
77- <EiIcon
78- v-if =" (node.data as MaterialNode)?.hidden"
79- :icon =" IconHidden"
80- :size =" 12"
81- :stroke-width =" 1.5"
82- class =" structure-tree__status"
83- :class =" { 'structure-tree__status--action': !(node.data as MaterialNode)?.locked }"
84- @click.stop =" handleShow(node.data as MaterialNode)"
85- />
78+ >
79+ <EiIcon
80+ :icon =" IconLock"
81+ :size =" 12"
82+ :stroke-width =" 1.5"
83+ />
84+ </button >
85+ <button
86+ type =" button"
87+ class =" structure-tree__action"
88+ :disabled =" (node.data as MaterialNode)?.locked"
89+ :title =" visibilityTitle(node.data as MaterialNode)"
90+ :aria-label =" visibilityTitle(node.data as MaterialNode)"
91+ @click.stop =" handleToggleHidden(node.data as MaterialNode)"
92+ >
93+ <EiIcon
94+ :icon =" (node.data as MaterialNode)?.hidden ? IconHidden : IconPreview"
95+ :size =" 12"
96+ :stroke-width =" 1.5"
97+ />
98+ </button >
99+ <button
100+ type =" button"
101+ class =" structure-tree__action structure-tree__action--danger"
102+ :disabled =" (node.data as MaterialNode)?.locked"
103+ :title =" store.t('designer.context.delete')"
104+ :aria-label =" store.t('designer.context.delete')"
105+ @click.stop =" handleDelete(node.data as MaterialNode)"
106+ >
107+ <EiIcon
108+ :icon =" IconDelete"
109+ :size =" 12"
110+ :stroke-width =" 1.5"
111+ />
112+ </button >
86113 </template >
87114 </EiTree >
88115</template >
89116
90117<style scoped lang="scss">
91- .structure-tree__status {
118+ .structure-tree__action {
119+ width : 18px ;
120+ height : 18px ;
121+ display : inline-flex ;
122+ align-items : center ;
123+ justify-content : center ;
124+ padding : 0 ;
92125 color : var (--ei-text-secondary , #999 );
126+ background : transparent ;
127+ border : 0 ;
128+ border-radius : 4px ;
129+ cursor : pointer ;
130+
131+ & :hover {
132+ color : var (--ei-primary , #1890ff );
133+ background : var (--ei-hover-bg , #f0f0f0 );
134+ }
93135
94- & --action {
95- cursor : pointer ;
136+ & :disabled {
137+ color : var (--ei-text-tertiary , #ccc );
138+ cursor : not-allowed ;
96139
97140 & :hover {
98- color : var ( --ei-primary , #1890ff ) ;
141+ background : transparent ;
99142 }
100143 }
101144}
145+
146+ .structure-tree__action--danger {
147+ color : var (--ei-text-secondary , #999 );
148+
149+ & :hover:not (:disabled ) {
150+ color : var (--ei-danger , #ff4d4f );
151+ }
152+ }
102153 </style >
0 commit comments