]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/TagEdit.js
18d8927d7c1dc09208a91c20278e5e3bf832bb6e
1 Ext
.define('PVE.panel.TagEditContainer', {
2 extend
: 'Ext.container.Container',
3 alias
: 'widget.pveTagEditContainer',
10 // set to false to hide the 'no tags' field and the edit button
14 xclass
: 'Ext.app.ViewController',
16 loadTags: function(tagstring
= '', force
= false) {
18 let view
= me
.getView();
20 if (me
.oldTags
=== tagstring
&& !force
) {
24 view
.suspendLayout
= true;
25 me
.forEachTag((tag
) => {
28 me
.getViewModel().set('tagCount', 0);
29 let newtags
= tagstring
.split(/[;, ]/).filter((t
) => !!t
) || [];
30 newtags
.forEach((tag
) => {
34 view
.suspendLayout
= false;
37 me
.oldTags
= tagstring
;
41 onRender: function(v
) {
43 let view
= me
.getView();
44 view
.toggleCls('hide-handles', PVE
.Utils
.shouldSortTags());
46 view
.dragzone
= Ext
.create('Ext.dd.DragZone', v
.getEl(), {
47 getDragData: function(e
) {
48 let source
= e
.getTarget('.handle');
52 let sourceId
= source
.parentNode
.id
;
53 let cmp
= Ext
.getCmp(sourceId
);
54 let ddel
= document
.createElement('div');
55 ddel
.classList
.add('proxmox-tags-full');
56 ddel
.innerHTML
= Proxmox
.Utils
.getTagElement(cmp
.tag
, PVE
.Utils
.tagOverrides
);
57 let repairXY
= Ext
.fly(source
).getXY();
58 cmp
.setDisabled(true);
66 onMouseUp: function(target
, e
, id
) {
67 let cmp
= Ext
.getCmp(this.dragData
.sourceId
);
68 if (cmp
&& !cmp
.isDestroyed
) {
69 cmp
.setDisabled(false);
72 getRepairXY: function() {
73 return this.dragData
.repairXY
;
75 beforeInvalidDrop: function(target
, e
, id
) {
76 let cmp
= Ext
.getCmp(this.dragData
.sourceId
);
77 if (cmp
&& !cmp
.isDestroyed
) {
78 cmp
.setDisabled(false);
82 view
.dropzone
= Ext
.create('Ext.dd.DropZone', v
.getEl(), {
83 getTargetFromEvent: function(e
) {
84 return e
.getTarget('.proxmox-tag-dark,.proxmox-tag-light');
86 getIndicator: function() {
87 if (!view
.indicator
) {
88 view
.indicator
= Ext
.create('Ext.Component', {
90 html
: '<i class="fa fa-long-arrow-up"></i>',
95 return view
.indicator
;
97 onContainerOver: function() {
98 this.getIndicator().setVisible(false);
100 notifyOut: function() {
101 this.getIndicator().setVisible(false);
103 onNodeOver: function(target
, dd
, e
, data
) {
104 let indicator
= this.getIndicator();
105 indicator
.setVisible(true);
106 indicator
.alignTo(Ext
.getCmp(target
.id
), 't50-bl', [-1, -2]);
107 return this.dropAllowed
;
109 onNodeDrop: function(target
, dd
, e
, data
) {
110 this.getIndicator().setVisible(false);
111 let sourceCmp
= Ext
.getCmp(data
.sourceId
);
115 sourceCmp
.setDisabled(false);
116 let targetCmp
= Ext
.getCmp(target
.id
);
117 view
.remove(sourceCmp
, { destroy
: false });
118 view
.insert(view
.items
.indexOf(targetCmp
), sourceCmp
);
123 forEachTag: function(func
) {
125 let view
= me
.getView();
126 view
.items
.each((field
) => {
127 if (field
.getXType() === 'pveTag') {
134 toggleEdit: function(cancel
) {
136 let vm
= me
.getViewModel();
137 let view
= me
.getView();
138 let editMode
= !vm
.get('editMode');
139 vm
.set('editMode', editMode
);
141 // get a current tag list for editing
143 PVE
.Utils
.updateUIOptions();
146 me
.forEachTag((tag
) => {
147 tag
.setMode(editMode
? 'editable' : 'normal');
150 if (!vm
.get('editMode')) {
153 me
.loadTags(me
.oldTags
, true);
156 me
.forEachTag((cmp
) => {
157 if (cmp
.isVisible() && cmp
.tag
) {
163 toRemove
.forEach(cmp
=> view
.remove(cmp
));
164 tags
= tags
.join(',');
165 if (me
.oldTags
!== tags
) {
167 me
.loadTags(tags
, true);
168 me
.getView().fireEvent('change', tags
);
172 me
.getView().updateLayout();
175 updateFilter: function() {
178 me
.forEachTag(cmp
=> {
183 me
.forEachTag(cmp
=> {
184 cmp
.updateFilter(tags
);
188 addTag: function(tag
, isNew
) {
190 let view
= me
.getView();
191 let vm
= me
.getViewModel();
192 let index
= view
.items
.length
- 5;
193 if (PVE
.Utils
.shouldSortTags() && !isNew
) {
194 index
= view
.items
.findIndexBy(tagField
=> {
195 if (tagField
.reference
=== 'noTagsField') {
198 if (tagField
.xtype
!== 'pveTag') {
201 let a
= tagField
.tag
.toLowerCase();
202 let b
= tag
.toLowerCase();
203 return a
> b
? true : a
< b
? false : tagField
.tag
.localeCompare(tag
) > 0;
206 let tagField
= view
.insert(index
, {
209 mode
: vm
.get('editMode') ? 'editable' : 'normal',
211 change
: (field
, newTag
) => {
214 destroy: function() {
215 vm
.set('tagCount', vm
.get('tagCount') - 1);
217 keypress: function(key
) {
218 if (key
=== 'Enter') {
220 } else if (key
=== 'Escape') {
229 tagField
.selectText();
232 vm
.set('tagCount', vm
.get('tagCount') + 1);
235 addTagClick: function(event
) {
237 me
.lookup('noTagsField').setVisible(false);
241 cancelClick: function() {
242 this.toggleEdit(true);
245 editClick: function() {
246 this.toggleEdit(false);
249 init: function(view
) {
252 me
.loadTags(view
.tags
);
254 me
.getViewModel().set('canEdit', view
.canEdit
);
256 me
.mon(Ext
.GlobalEvents
, 'loadedUiOptions', () => {
257 view
.toggleCls('hide-handles', PVE
.Utils
.shouldSortTags());
258 me
.loadTags(me
.oldTags
, true); // refresh tag colors and order
271 hideNoTags: function(get) {
272 return get('tagCount') !== 0 || !get('canEdit');
274 hideEditBtn: function(get) {
275 return get('editMode') || !get('canEdit');
280 loadTags: function() {
281 return this.getController().loadTags(...arguments
);
287 reference
: 'noTagsField',
289 hidden
: '{hideNoTags}',
291 html
: gettext('No Tags'),
298 iconCls
: 'fa fa-plus',
299 tooltip
: gettext('Add Tag'),
301 hidden
: '{!editMode}',
305 ui
: 'default-toolbar',
306 handler
: 'addTagClick',
309 xtype
: 'tbseparator',
312 hidden
: '{!editMode}',
318 iconCls
: 'fa fa-times',
319 tooltip
: gettext('Cancel Edit'),
321 hidden
: '{!editMode}',
325 ui
: 'default-toolbar',
326 handler
: 'cancelClick',
330 iconCls
: 'fa fa-check',
331 tooltip
: gettext('Finish Edit'),
333 hidden
: '{!editMode}',
336 ui
: 'default-toolbar',
337 handler
: 'editClick',
341 cls
: 'pve-tag-inline-button',
342 html
: `<i data-qtip="${gettext('Edit Tags')}" class="fa fa-pencil"></i>`,
344 hidden
: '{hideEditBtn}',
357 destroy: function() {
359 Ext
.destroy(me
.dragzone
);
360 Ext
.destroy(me
.dropzone
);
361 Ext
.destroy(me
.indicator
);