]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/TagEdit.js
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
) => {
33 view
.suspendLayout
= false;
36 me
.oldTags
= tagstring
;
41 onRender: function(v
) {
43 let view
= me
.getView();
44 view
.toggleCls('hide-handles', PVE
.UIOptions
.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
.UIOptions
.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
);
124 forEachTag: function(func
) {
126 let view
= me
.getView();
127 view
.items
.each((field
) => {
128 if (field
.getXType() === 'pveTag') {
135 toggleEdit: function(cancel
) {
137 let vm
= me
.getViewModel();
138 let view
= me
.getView();
139 let editMode
= !vm
.get('editMode');
140 vm
.set('editMode', editMode
);
142 // get a current tag list for editing
144 PVE
.UIOptions
.update();
147 me
.forEachTag((tag
) => {
148 tag
.setMode(editMode
? 'editable' : 'normal');
151 if (!vm
.get('editMode')) {
154 me
.loadTags(me
.oldTags
, true);
157 me
.forEachTag((cmp
) => {
158 if (cmp
.isVisible() && cmp
.tag
) {
164 toRemove
.forEach(cmp
=> view
.remove(cmp
));
165 tags
= tags
.join(',');
166 if (me
.oldTags
!== tags
) {
168 me
.loadTags(tags
, true);
169 me
.getView().fireEvent('change', tags
);
173 me
.getView().updateLayout();
176 tagsChanged: function() {
179 me
.forEachTag(cmp
=> {
184 me
.getViewModel().set('isDirty', me
.oldTags
!== tags
.join(','));
185 me
.forEachTag(cmp
=> {
186 cmp
.updateFilter(tags
);
190 addTag: function(tag
, isNew
) {
192 let view
= me
.getView();
193 let vm
= me
.getViewModel();
194 let index
= view
.items
.length
- 5;
195 if (PVE
.UIOptions
.shouldSortTags() && !isNew
) {
196 index
= view
.items
.findIndexBy(tagField
=> {
197 if (tagField
.reference
=== 'noTagsField') {
200 if (tagField
.xtype
!== 'pveTag') {
203 let a
= tagField
.tag
.toLowerCase();
204 let b
= tag
.toLowerCase();
205 return a
> b
? true : a
< b
? false : tagField
.tag
.localeCompare(tag
) > 0;
208 let tagField
= view
.insert(index
, {
211 mode
: vm
.get('editMode') ? 'editable' : 'normal',
213 change
: 'tagsChanged',
214 destroy: function() {
215 vm
.set('tagCount', vm
.get('tagCount') - 1);
218 keypress: function(key
) {
219 if (key
=== 'Enter') {
221 } else if (key
=== 'Escape') {
230 tagField
.selectText();
233 vm
.set('tagCount', vm
.get('tagCount') + 1);
236 addTagClick: function(event
) {
238 me
.lookup('noTagsField').setVisible(false);
242 cancelClick: function() {
243 this.toggleEdit(true);
246 editClick: function() {
247 this.toggleEdit(false);
250 init: function(view
) {
253 me
.loadTags(view
.tags
);
255 me
.getViewModel().set('canEdit', view
.canEdit
);
257 me
.mon(Ext
.GlobalEvents
, 'loadedUiOptions', () => {
258 view
.toggleCls('hide-handles', PVE
.UIOptions
.shouldSortTags());
259 me
.loadTags(me
.oldTags
, true); // refresh tag colors and order
273 hideNoTags: function(get) {
274 return get('tagCount') !== 0 || !get('canEdit');
276 hideEditBtn: function(get) {
277 return get('editMode') || !get('canEdit');
282 loadTags: function() {
283 return this.getController().loadTags(...arguments
);
289 reference
: 'noTagsField',
291 hidden
: '{hideNoTags}',
293 html
: gettext('No Tags'),
300 iconCls
: 'fa fa-plus',
301 tooltip
: gettext('Add Tag'),
303 hidden
: '{!editMode}',
307 ui
: 'default-toolbar',
308 handler
: 'addTagClick',
311 xtype
: 'tbseparator',
314 hidden
: '{!editMode}',
320 iconCls
: 'fa fa-times',
321 tooltip
: gettext('Cancel Edit'),
323 hidden
: '{!editMode}',
327 ui
: 'default-toolbar',
328 handler
: 'cancelClick',
332 iconCls
: 'fa fa-check',
333 tooltip
: gettext('Finish Edit'),
335 hidden
: '{!editMode}',
336 disabled
: '{!isDirty}',
339 handler
: 'editClick',
343 cls
: 'pve-tag-inline-button',
344 html
: `<i data-qtip="${gettext('Edit Tags')}" class="fa fa-pencil"></i>`,
346 hidden
: '{hideEditBtn}',
359 destroy: function() {
361 Ext
.destroy(me
.dragzone
);
362 Ext
.destroy(me
.dropzone
);
363 Ext
.destroy(me
.indicator
);