]>
git.proxmox.com Git - proxmox-backup.git/blob - www/window/TrafficControlEdit.js
f81c19883d9e550e26670711b489292cdff58c82
1 Ext
.define('PBS.window.TrafficControlEdit', {
2 extend
: 'Proxmox.window.Edit',
3 alias
: 'widget.pbsTrafficControlEdit',
4 mixins
: ['Proxmox.Mixin.CBind'],
6 onlineHelp
: 'sysadmin_traffic_control',
12 subject
: gettext('Traffic Control Rule'),
14 fieldDefaults
: { labelWidth
: 120 },
16 cbindData: function(initialConfig
) {
19 let baseurl
= '/api2/extjs/config/traffic-control';
20 let name
= initialConfig
.name
;
23 me
.url
= name
? `${baseurl}/${name}` : baseurl
;
24 me
.method
= name
? 'PUT' : 'POST';
29 xclass
: 'Ext.app.ViewController',
31 weekdays
: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],
33 dowChanged: function(field
, value
) {
35 let record
= field
.getWidgetRecord();
36 if (record
=== undefined) {
37 // this is sometimes called before a record/column is initialized
40 let col
= field
.getWidgetColumn();
41 record
.set(col
.dataIndex
, value
);
44 me
.updateTimeframeField();
47 timeChanged: function(field
, value
) {
52 let record
= field
.getWidgetRecord();
53 if (record
=== undefined) {
54 // this is sometimes called before a record/column is initialized
57 let col
= field
.getWidgetColumn();
58 let hours
= value
.getHours().toString().padStart(2, '0');
59 let minutes
= value
.getMinutes().toString().padStart(2, '0');
60 record
.set(col
.dataIndex
, `${hours}:${minutes}`);
63 me
.updateTimeframeField();
66 addTimeframe: function() {
68 me
.lookup('timeframes').getStore().add({
80 me
.updateTimeframeField();
83 updateTimeframeField: function() {
87 me
.lookup('timeframes').getStore().each((rec
) => {
89 let days
= me
.weekdays
.filter(day
=> rec
.data
[day
]);
90 if (days
.length
< 7 && days
.length
> 0) {
91 timeframe
+= days
.join(',') + ' ';
93 let { start
, end
} = rec
.data
;
95 timeframe
+= `${start}-${end}`;
96 timeframes
.push(timeframe
);
99 let field
= me
.lookup('timeframe');
100 field
.suspendEvent('change');
101 field
.setValue(timeframes
.join(';'));
102 field
.resumeEvent('change');
105 removeTimeFrame: function(field
) {
107 let record
= field
.getWidgetRecord();
108 if (record
=== undefined) {
109 // this is sometimes called before a record/column is initialized
113 me
.lookup('timeframes').getStore().remove(record
);
114 me
.updateTimeframeField();
117 parseTimeframe: function(timeframe
) {
119 let [, days
, start
, end
] = /^(?:(\S*)\s+)?([0-9:]+)-([0-9:]+)$/.exec(timeframe
) || [];
134 days
= days
.split(',');
135 days
.forEach((day
) => {
140 if (me
.weekdays
.indexOf(day
) !== -1) {
143 // we have a range 'xxx..yyy'
144 let [startDay
, endDay
] = day
.split('..');
145 let startIdx
= me
.weekdays
.indexOf(startDay
);
146 let endIdx
= me
.weekdays
.indexOf(endDay
);
148 if (endIdx
< startIdx
) {
149 endIdx
+= me
.weekdays
.length
;
152 for (let dayIdx
= startIdx
; dayIdx
<= endIdx
; dayIdx
++) {
153 let curDay
= me
.weekdays
[dayIdx
%me
.weekdays
.length
];
154 if (!record
[curDay
]) {
155 record
[curDay
] = true;
164 setGridData: function(field
, value
) {
170 value
= value
.split(';');
171 let records
= value
.map((timeframe
) => me
.parseTimeframe(timeframe
));
172 me
.lookup('timeframes').getStore().setData(records
);
177 change
: 'dowChanged',
180 change
: 'timeChanged',
183 click
: 'removeTimeFrame',
185 'field[name=timeframe]': {
186 change
: 'setGridData',
193 onGetValues: function(values
) {
195 let isCreate
= me
.up('window').isCreate
;
197 if (!values
['network-select']) {
198 values
.network
= '0.0.0.0/0';
199 } else if (values
.network
) {
200 values
.network
= values
.network
.split(/\s*,\s*/);
203 if ('timeframe' in values
&& !values
.timeframe
) {
204 delete values
.timeframe
;
206 if (values
.timeframe
&& !Ext
.isArray(values
.timeframe
)) {
207 let timeframe
= [], seen
= {};
208 values
.timeframe
.split(';').forEach(tf
=> {
214 values
.timeframe
= timeframe
;
217 delete values
['network-select'];
220 PBS
.Utils
.delete_if_default(values
, 'timeframe');
221 PBS
.Utils
.delete_if_default(values
, 'rate-in');
222 PBS
.Utils
.delete_if_default(values
, 'rate-out');
223 PBS
.Utils
.delete_if_default(values
, 'burst-in');
224 PBS
.Utils
.delete_if_default(values
, 'burst-out');
225 if (typeof values
.delete === 'string') {
226 values
.delete = values
.delete.split(',');
234 xtype
: 'pmxDisplayEditField',
236 fieldLabel
: gettext('Name'),
237 renderer
: Ext
.htmlEncode
,
241 editable
: '{isCreate}',
245 xtype
: 'pmxBandwidthField',
247 fieldLabel
: gettext('Rate In'),
248 emptyText
: gettext('Unlimited'),
249 submitAutoScaledSizeUnit
: true,
252 xtype
: 'pmxBandwidthField',
254 fieldLabel
: gettext('Rate Out'),
255 emptyText
: gettext('Unlimited'),
256 submitAutoScaledSizeUnit
: true,
262 xtype
: 'proxmoxtextfield',
265 deleteEmpty
: '{!isCreate}',
267 fieldLabel
: gettext('Comment'),
270 xtype
: 'pmxBandwidthField',
272 fieldLabel
: gettext('Burst In'),
273 emptyText
: gettext('Same as Rate'),
274 submitAutoScaledSizeUnit
: true,
277 xtype
: 'pmxBandwidthField',
279 fieldLabel
: gettext('Burst Out'),
280 emptyText
: gettext('Same as Rate'),
281 submitAutoScaledSizeUnit
: true,
287 xtype
: 'proxmoxtextfield',
288 fieldLabel
: gettext('Network(s)'),
290 emptyText
: gettext('0.0.0.0/0 (Apply on all Networks)'),
293 'data-qtip': gettext('A comma-separated list of networks to apply the (shared) limit.'),
298 xtype
: 'displayfield',
299 fieldLabel
: gettext('Timeframes'),
302 xtype
: 'fieldcontainer',
308 reference
: 'timeframes',
310 emptyText
: gettext('Apply Always'),
313 fields
: ['start', 'end', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],
318 text
: gettext('Time Start'),
319 xtype
: 'widgetcolumn',
330 text
: gettext('Time End'),
331 xtype
: 'widgetcolumn',
343 text
: gettext('Mon'),
344 xtype
: 'widgetcolumn',
353 text
: gettext('Tue'),
354 xtype
: 'widgetcolumn',
363 text
: gettext('Wed'),
364 xtype
: 'widgetcolumn',
373 text
: gettext('Thu'),
374 xtype
: 'widgetcolumn',
383 text
: gettext('Fri'),
384 xtype
: 'widgetcolumn',
393 text
: gettext('Sat'),
394 xtype
: 'widgetcolumn',
403 text
: gettext('Sun'),
404 xtype
: 'widgetcolumn',
413 xtype
: 'widgetcolumn',
417 iconCls
: 'fa fa-trash-o',
426 text
: gettext('Add'),
427 iconCls
: 'fa fa-plus-circle',
428 handler
: 'addTimeframe',
432 reference
: 'timeframe',
438 initComponent: function() {
443 success: function(response
) {
444 let data
= response
.result
.data
;
445 if (data
.network
?.length
=== 1 && data
.network
[0] === '0.0.0.0/0') {
446 data
['network-select'] = 'all';
449 data
['network-select'] = 'limit';
452 if (Ext
.isArray(data
.timeframe
)) {
453 data
.timeframe
= data
.timeframe
.join(';');