]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/Tag.js
1 Ext
.define('Proxmox.form.Tag', {
2 extend
: 'Ext.Component',
3 alias
: 'widget.pveTag',
11 '<i class="handle fa fa-bars"></i>',
13 '<i class="action fa fa-minus-square"></i>',
16 // contains tags not to show in the picker and not allowing to set
19 updateFilter: function(tags
) {
23 onClick: function(event
) {
25 if (event
.target
.tagName
=== 'I' && !event
.target
.classList
.contains('handle')) {
26 if (me
.mode
=== 'editable') {
30 } else if (event
.target
.tagName
!== 'SPAN' || me
.mode
!== 'editable') {
36 selectText: function(collapseToEnd
) {
38 let tagEl
= me
.tagEl();
39 tagEl
.contentEditable
= true;
40 let range
= document
.createRange();
41 range
.selectNodeContents(tagEl
);
43 range
.collapse(false);
45 let sel
= window
.getSelection();
46 sel
.removeAllRanges();
52 showPicker: function() {
55 me
.picker
= Ext
.widget({
61 userCls
: 'proxmox-tags-full',
64 '{[Proxmox.Utils.getTagElement(values.tag, PVE.Utils.tagOverrides)]}',
68 select: function(picker
, rec
) {
69 me
.tagEl().innerHTML
= rec
.data
.tag
;
70 me
.setTag(rec
.data
.tag
, true);
72 me
.setColor(rec
.data
.tag
);
78 me
.picker
.getStore()?.clearFilter();
79 let taglist
= PVE
.Utils
.tagList
.filter(v
=> !me
.filter
.includes(v
)).map(v
=> ({ tag
: v
}));
80 if (taglist
.length
< 1) {
83 me
.picker
.getStore().setData(taglist
);
84 me
.picker
.showBy(me
, 'tl-bl');
85 me
.picker
.setMaxHeight(200);
88 setMode: function(mode
) {
90 let tagEl
= me
.tagEl();
92 tagEl
.contentEditable
= mode
=== 'editable';
94 me
.removeCls(me
.mode
);
97 if (me
.mode
!== 'editable') {
102 onKeyPress: function(event
) {
104 let key
= event
.browserEvent
.key
;
108 me
.fireEvent('keypress', key
);
116 if (key
.match(PVE
.Utils
.tagCharRegex
)) {
119 me
.setTag(me
.tagEl().innerHTML
);
121 event
.browserEvent
.preventDefault();
122 event
.browserEvent
.stopPropagation();
126 beforeInput: function(event
) {
129 let tag
= event
.event
.data
?? event
.event
.dataTransfer
?.getData('text/plain');
133 if (tag
.match(PVE
.Utils
.tagCharRegex
) === null) {
134 event
.event
.preventDefault();
135 event
.event
.stopPropagation();
139 onInput: function(event
) {
141 me
.picker
.getStore().filter({
143 value
: me
.tagEl().innerHTML
,
146 me
.setTag(me
.tagEl().innerHTML
);
149 lostFocus: function(list
, event
) {
152 window
.getSelection().removeAllRanges();
155 setColor: function(tag
) {
157 let rgb
= PVE
.Utils
.tagOverrides
[tag
] ?? Proxmox
.Utils
.stringToRGB(tag
);
159 let cls
= Proxmox
.Utils
.getTextContrastClass(rgb
);
160 let color
= Proxmox
.Utils
.rgbToCss(rgb
);
161 me
.setUserCls(`proxmox-tag-${cls}`);
162 me
.setStyle('background-color', color
);
163 if (rgb
.length
> 3) {
164 let fgcolor
= Proxmox
.Utils
.rgbToCss([rgb
[3], rgb
[4], rgb
[5]]);
166 me
.setStyle('color', fgcolor
);
168 me
.setStyle('color');
172 setTag: function(tag
) {
177 clearTimeout(me
.colorTimeout
);
178 me
.colorTimeout
= setTimeout(() => me
.setColor(tag
), 200);
181 if (oldtag
!== tag
) {
182 me
.fireEvent('change', me
, tag
, oldtag
);
187 return this.el
?.dom
?.getElementsByTagName('span')?.[0];
192 focusleave
: 'lostFocus',
193 keydown
: 'onKeyPress',
194 beforeInput
: 'beforeInput',
200 initComponent: function() {
209 me
.setMode(me
.mode
?? 'normal');
213 destroy: function() {
216 Ext
.destroy(me
.picker
);
218 clearTimeout(me
.colorTimeout
);