]>
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',
11 xclass
: 'Ext.app.ViewController',
13 loadTags: function(tagstring
= '', force
= false) {
15 let view
= me
.getView();
17 if (me
.oldTags
=== tagstring
&& !force
) {
21 view
.suspendLayout
= true;
22 me
.forEachTag((tag
) => {
25 me
.getViewModel().set('tagCount', 0);
26 let newtags
= tagstring
.split(/[;, ]/).filter((t
) => !!t
) || [];
27 newtags
.forEach((tag
) => {
31 view
.suspendLayout
= false;
34 me
.oldTags
= tagstring
;
38 onRender: function(v
) {
40 let view
= me
.getView();
41 view
.toggleCls('hide-handles', PVE
.Utils
.shouldSortTags());
43 view
.dragzone
= Ext
.create('Ext.dd.DragZone', v
.getEl(), {
44 getDragData: function(e
) {
45 let source
= e
.getTarget('.handle');
49 let sourceId
= source
.parentNode
.id
;
50 let cmp
= Ext
.getCmp(sourceId
);
51 let ddel
= document
.createElement('div');
52 ddel
.classList
.add('proxmox-tags-full');
53 ddel
.innerHTML
= Proxmox
.Utils
.getTagElement(cmp
.tag
, PVE
.Utils
.tagOverrides
);
54 let repairXY
= Ext
.fly(source
).getXY();
55 cmp
.setDisabled(true);
63 onMouseUp: function(target
, e
, id
) {
64 let cmp
= Ext
.getCmp(this.dragData
.sourceId
);
65 if (cmp
&& !cmp
.isDestroyed
) {
66 cmp
.setDisabled(false);
69 getRepairXY: function() {
70 return this.dragData
.repairXY
;
72 beforeInvalidDrop: function(target
, e
, id
) {
73 let cmp
= Ext
.getCmp(this.dragData
.sourceId
);
74 if (cmp
&& !cmp
.isDestroyed
) {
75 cmp
.setDisabled(false);
79 view
.dropzone
= Ext
.create('Ext.dd.DropZone', v
.getEl(), {
80 getTargetFromEvent: function(e
) {
81 return e
.getTarget('.proxmox-tag-dark,.proxmox-tag-light');
83 getIndicator: function() {
84 if (!view
.indicator
) {
85 view
.indicator
= Ext
.create('Ext.Component', {
87 html
: '<i class="fa fa-long-arrow-up"></i>',
92 return view
.indicator
;
94 onContainerOver: function() {
95 this.getIndicator().setVisible(false);
97 notifyOut: function() {
98 this.getIndicator().setVisible(false);
100 onNodeOver: function(target
, dd
, e
, data
) {
101 let indicator
= this.getIndicator();
102 indicator
.setVisible(true);
103 indicator
.alignTo(Ext
.getCmp(target
.id
), 't50-bl', [-1, -2]);
104 return this.dropAllowed
;
106 onNodeDrop: function(target
, dd
, e
, data
) {
107 this.getIndicator().setVisible(false);
108 let sourceCmp
= Ext
.getCmp(data
.sourceId
);
112 sourceCmp
.setDisabled(false);
113 let targetCmp
= Ext
.getCmp(target
.id
);
114 view
.remove(sourceCmp
, { destroy
: false });
115 view
.insert(view
.items
.indexOf(targetCmp
), sourceCmp
);
120 forEachTag: function(func
) {
122 let view
= me
.getView();
123 view
.items
.each((field
) => {
124 if (field
.getXType() === 'pveTag') {
131 toggleEdit: function(cancel
) {
133 let vm
= me
.getViewModel();
134 let view
= me
.getView();
135 let editMode
= !vm
.get('editMode');
136 vm
.set('editMode', editMode
);
138 // get a current tag list for editing
140 PVE
.Utils
.updateUIOptions();
143 me
.forEachTag((tag
) => {
144 tag
.setMode(editMode
? 'editable' : 'normal');
147 if (!vm
.get('editMode')) {
150 me
.loadTags(me
.oldTags
, true);
153 me
.forEachTag((cmp
) => {
154 if (cmp
.isVisible() && cmp
.tag
) {
160 toRemove
.forEach(cmp
=> view
.remove(cmp
));
161 tags
= tags
.join(',');
162 if (me
.oldTags
!== tags
) {
164 me
.loadTags(tags
, true);
165 me
.getView().fireEvent('change', tags
);
169 me
.getView().updateLayout();
172 updateFilter: function() {
175 me
.forEachTag(cmp
=> {
180 me
.forEachTag(cmp
=> {
181 cmp
.updateFilter(tags
);
185 addTag: function(tag
, isNew
) {
187 let view
= me
.getView();
188 let vm
= me
.getViewModel();
189 let index
= view
.items
.length
- 5;
190 if (PVE
.Utils
.shouldSortTags() && !isNew
) {
191 index
= view
.items
.findIndexBy(tagField
=> {
192 if (tagField
.reference
=== 'noTagsField') {
195 if (tagField
.xtype
!== 'pveTag') {
198 let a
= tagField
.tag
.toLowerCase();
199 let b
= tag
.toLowerCase();
200 return a
> b
? true : a
< b
? false : tagField
.tag
.localeCompare(tag
) > 0;
203 let tagField
= view
.insert(index
, {
206 mode
: vm
.get('editMode') ? 'editable' : 'normal',
208 change
: (field
, newTag
) => {
211 destroy: function() {
212 vm
.set('tagCount', vm
.get('tagCount') - 1);
219 tagField
.selectText();
222 vm
.set('tagCount', vm
.get('tagCount') + 1);
225 addTagClick: function(event
) {
227 me
.lookup('noTagsField').setVisible(false);
231 cancelClick: function() {
232 this.toggleEdit(true);
235 editClick: function() {
236 this.toggleEdit(false);
239 init: function(view
) {
242 me
.loadTags(view
.tags
);
245 me
.mon(Ext
.GlobalEvents
, 'loadedUiOptions', () => {
246 view
.toggleCls('hide-handles', PVE
.Utils
.shouldSortTags());
247 me
.loadTags(me
.oldTags
, true); // refresh tag colors and order
259 hideNoTags: function(get) {
260 return get('tagCount') !== 0;
265 loadTags: function() {
266 return this.getController().loadTags(...arguments
);
272 reference
: 'noTagsField',
274 hidden
: '{hideNoTags}',
276 html
: gettext('No Tags'),
280 iconCls
: 'fa fa-plus',
281 tooltip
: gettext('Add Tag'),
283 hidden
: '{!editMode}',
287 ui
: 'default-toolbar',
288 handler
: 'addTagClick',
291 xtype
: 'tbseparator',
294 hidden
: '{!editMode}',
300 iconCls
: 'fa fa-times',
301 tooltip
: gettext('Cancel Edit'),
303 hidden
: '{!editMode}',
307 ui
: 'default-toolbar',
308 handler
: 'cancelClick',
312 iconCls
: 'fa fa-check',
313 tooltip
: gettext('Finish Edit'),
315 hidden
: '{!editMode}',
318 ui
: 'default-toolbar',
319 handler
: 'editClick',
323 cls
: 'pve-tag-inline-button',
324 html
: `<i data-qtip="${gettext('Edit Tags')}" class="fa fa-pencil"></i>`,
326 hidden
: '{editMode}',
339 destroy: function() {
341 Ext
.destroy(me
.dragzone
);
342 Ext
.destroy(me
.dropzone
);
343 Ext
.destroy(me
.indicator
);