diff --git a/docs/docresources/configdvrtab.png b/docs/docresources/configdvrtab.png index 8d0a52fa..834a1ff2 100644 Binary files a/docs/docresources/configdvrtab.png and b/docs/docresources/configdvrtab.png differ diff --git a/docs/docresources/configgeneraltab.png b/docs/docresources/configgeneraltab.png new file mode 100644 index 00000000..35f413f0 Binary files /dev/null and b/docs/docresources/configgeneraltab.png differ diff --git a/docs/docresources/configtimeshifttab.png b/docs/docresources/configtimeshifttab.png new file mode 100644 index 00000000..4ab3f111 Binary files /dev/null and b/docs/docresources/configtimeshifttab.png differ diff --git a/docs/html/config_dvr.html b/docs/html/config_dvr.html index 68a44ee7..ef265ebd 100644 --- a/docs/html/config_dvr.html +++ b/docs/html/config_dvr.html @@ -20,21 +20,26 @@
This tabs allow configuration of several general parameters that affect the core TVH functionality.
- The EPG information is NOT translated, this only applies to EPG providers - that give information (titles, descriptions, etc..) in multiple languages. - +
- Icon caching - this will cache any channel icons or other images (such as - EPG metadata). These will then be served from the local webserver, this - can be useful for multi-client systems and generally to reduce hits on - upstream providers. -
+
- Time Update - TVH now has a built-in capability to update the systme time.
- However you should bare in mind that DVB time is not highly accurate and is
- prone to both jitter and variation between different transponders.
-
- Where possible its probably still better to use an internet based NTP source
- to synchronise the system clock.
-
This tab is used to configure timeshift properties. diff --git a/src/webui/static/app/config.js b/src/webui/static/app/config.js index 8a87d25f..cd92fc58 100644 --- a/src/webui/static/app/config.js +++ b/src/webui/static/app/config.js @@ -34,8 +34,9 @@ tvheadend.comet.on('config', function(m) { tvheadend.miscconf = function() { /* - * Basic Config - */ + * Basic Config + */ + var confreader = new Ext.data.JsonReader({ root: 'config' }, @@ -46,12 +47,12 @@ tvheadend.miscconf = function() { ]); /* **************************************************************** - * Form Fields - * ***************************************************************/ + * Form Fields + * ***************************************************************/ /* - * DVB path - */ + * DVB path + */ var dvbscanPath = new Ext.form.TextField({ fieldLabel: 'DVB scan files path', @@ -60,9 +61,18 @@ tvheadend.miscconf = function() { width: 400 }); + var dvbscanWrap = new Ext.form.FieldSet({ + title: 'DVB Scan Files', + width: 700, + autoHeight: true, + collapsible: true, + animCollapse: true, + items : [ dvbscanPath ] + }); + /* - * Language - */ + * Language + */ var language = new Ext.ux.ItemSelector({ name: 'language', @@ -79,9 +89,19 @@ tvheadend.miscconf = function() { fromLegend: 'Available' }); + var languageWrap = new Ext.form.FieldSet({ + title: 'Language Settings', + width: 700, + autoHeight: true, + collapsible: true, + animCollapse: true, + items : [ language ] + }); + /* - * Time/Date - */ + * Time/Date + */ + var tvhtimeUpdateEnabled = new Ext.form.Checkbox({ name: 'tvhtime_update_enabled', fieldLabel: 'Update time' @@ -102,12 +122,14 @@ tvheadend.miscconf = function() { width: 700, autoHeight: true, collapsible: true, + animCollapse: true, items: [tvhtimeUpdateEnabled, tvhtimeNtpEnabled, tvhtimeTolerance] }); /* - * Image cache - */ + * Image cache + */ + if (tvheadend.capabilities.indexOf('imagecache') !== -1) { var imagecache_reader = new Ext.data.JsonReader({ root: 'entries' @@ -141,6 +163,7 @@ tvheadend.miscconf = function() { width: 700, autoHeight: true, collapsible: true, + animCollapse: true, items: [imagecacheEnabled, imagecacheOkPeriod, imagecacheFailPeriod, imagecacheIgnoreSSLCert] }); @@ -161,8 +184,9 @@ tvheadend.miscconf = function() { } /* - * Transcoding - */ + * Transcoding + */ + var transcodingEnabled = new Ext.form.Checkbox({ name: 'transcoding_enabled', fieldLabel: 'Enabled' @@ -173,15 +197,17 @@ tvheadend.miscconf = function() { width: 700, autoHeight: true, collapsible: true, + animCollapse: true, items: [transcodingEnabled] }); + if (tvheadend.capabilities.indexOf('transcoding') === -1) transcodingPanel.hide(); /* **************************************************************** - * Form - * ***************************************************************/ + * Form + * ***************************************************************/ var saveButton = new Ext.Button({ text: "Save configuration", @@ -206,18 +232,19 @@ tvheadend.miscconf = function() { layout: 'form', defaultType: 'textfield', autoHeight: true, - items: [language, dvbscanPath, - tvhtimePanel, - transcodingPanel] + items: [languageWrap, dvbscanWrap, tvhtimePanel, transcodingPanel] }); var _items = [confpanel]; + if (imagecache_form) _items.push(imagecache_form); + var panel = new Ext.Panel({ title: 'General', iconCls: 'wrench', border: false, + autoScroll: true, bodyStyle: 'padding:15px', layout: 'form', items: _items, @@ -225,8 +252,8 @@ tvheadend.miscconf = function() { }); /* **************************************************************** - * Load/Save - * ***************************************************************/ + * Load/Save + * ***************************************************************/ confpanel.on('render', function() { confpanel.getForm().load({ diff --git a/src/webui/static/app/dvr.js b/src/webui/static/app/dvr.js index eddf34b0..f7773824 100644 --- a/src/webui/static/app/dvr.js +++ b/src/webui/static/app/dvr.js @@ -14,7 +14,6 @@ tvheadend.dvrprio = new Ext.data.SimpleStore({ ['unimportant', 'Unimportant']] }); - //For the container configuration tvheadend.containers = new Ext.data.JsonStore({ autoLoad: true, @@ -39,7 +38,6 @@ tvheadend.caches = new Ext.data.JsonStore({ } }); - /** * Configuration names */ @@ -359,7 +357,6 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { text: 'Create', handler: createRecording }] - }); win = new Ext.Window({ @@ -386,6 +383,42 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { } ; + /* Create combobox to allow user to select page size for upcoming/completed/failed recordings */ + + var itemPageCombo = new Ext.form.ComboBox({ + name : 'itemsperpage', + width: 50, + mode : 'local', + store: new Ext.data.ArrayStore({ + fields: ['perpage'], + data : [['10'],['20'],['30'],['40'],['50'],['60'],['70'],['80'],['90'],['100']] + }), + value : '20', + listWidth : 40, + triggerAction : 'all', + displayField : 'perpage', + valueField : 'perpage', + editable : true, + forceSelection : true, + listeners : { + scope: this, + 'select' : function(combo, record) { + bbar.pageSize = parseInt(record.get('perpage'), 10); + bbar.doLoad(bbar.cursor); + } + } + }); + + /* Bottom toolbar to include default previous/goto-page/next and refresh buttons, also number-of-items combobox */ + + var bbar = new Ext.PagingToolbar({ + store : dvrStore, + displayInfo : true, + items : ['-','Recordings per page: ',itemPageCombo], + displayMsg : 'Programs {0} - {1} of {2}', + emptyMsg : "No programs to display" + }); + var panel = new Ext.grid.GridPanel({ loadMask: true, stripeRows: true, @@ -409,14 +442,7 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { new tvheadend.help('Digital Video Recorder', 'dvrlog.html'); } }], - bbar: new Ext.PagingToolbar({ - store: dvrStore, - pageSize: 20, - displayInfo: true, - displayMsg: 'Programs {0} - {1} of {2}', - emptyMsg: "No programs to display" - }) - + bbar: bbar }); panel.on('rowclick', rowclicked); @@ -436,7 +462,6 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { tvheadend.autoreceditor = function() { var fm = Ext.form; - var cm = new Ext.grid.ColumnModel({ defaultSortable: true, columns: @@ -938,7 +963,6 @@ tvheadend.dvrsettings = function() { name: 'whitespaceInTitle' }); - /* Sub-Panel - DVR behaviour */ var DVRBehaviour = new Ext.form.FieldSet({ @@ -946,6 +970,7 @@ tvheadend.dvrsettings = function() { width: 700, autoHeight: true, collapsible: true, + animCollapse: true, items: [recordingContainer, cacheScheme, logRetention, timeBefore, timeAfter, postProcessing] }); @@ -956,6 +981,7 @@ tvheadend.dvrsettings = function() { width: 700, autoHeight: true, collapsible: true, + animCollapse: true, items: [recordingPath, recordingPermissions, PATrewrite, PMTrewrite, tagMetadata, skipCommercials] }); @@ -966,18 +992,37 @@ tvheadend.dvrsettings = function() { width: 700, autoHeight: true, collapsible: true, + animCollapse: true, items: [directoryPermissions, dirsPerDay, dirsPerChannel, dirsPerTitle] }); - /* Sub-Panel - File operations */ + /* Sub-Panel - File operations - Break into two 4-item panels */ + + var FileHandlingPanelA = new Ext.form.FieldSet({ + width: 350, + border: false, + autoHeight: true, + items : [incChannelInTitle, incDateInTitle, incTimeInTitle, incEpisodeInTitle] + }); + + var FileHandlingPanelB = new Ext.form.FieldSet({ + width: 350, + border: false, + autoHeight: true, + items : [incSubtitleInTitle, episodeFirst, stripUnsafeChars, stripWhitespace] + }); var FileHandlingPanel = new Ext.form.FieldSet({ title: 'Filename Options', width: 700, autoHeight: true, collapsible: true, - items: [incChannelInTitle, incDateInTitle, incTimeInTitle, incEpisodeInTitle, - incSubtitleInTitle, episodeFirst, stripUnsafeChars, stripWhitespace] + animCollapse : true, + items : [{ + layout: 'column', + border: false, + items : [FileHandlingPanelA, FileHandlingPanelB] + }] }); /* Main (form) panel */ @@ -990,6 +1035,7 @@ tvheadend.dvrsettings = function() { anchor: '100% 50%', labelAlign: 'right', labelWidth: 250, + autoScroll: true, waitMsgTarget: true, reader: confreader, defaultType: 'textfield', diff --git a/src/webui/static/app/timeshift.js b/src/webui/static/app/timeshift.js index 472312eb..3e4ed45a 100644 --- a/src/webui/static/app/timeshift.js +++ b/src/webui/static/app/timeshift.js @@ -47,9 +47,9 @@ tvheadend.timeshift = function() { }); var timeshiftUnlPeriod = new Ext.form.Checkbox({ - fieldLabel: ' (unlimited)', + fieldLabel: 'Unlimited time', name: 'timeshift_unlimited_period', - Width: 300 + width: 300 }); var timeshiftMaxSize = new Ext.form.NumberField({ @@ -60,19 +60,20 @@ tvheadend.timeshift = function() { }); var timeshiftUnlSize = new Ext.form.Checkbox({ - fieldLabel: ' (unlimited)', + fieldLabel: 'Unlimited size', name: 'timeshift_unlimited_size', - Width: 300 + width: 300 }); /* **************************************************************** * Events * ***************************************************************/ - timeshiftUnlPeriod.on('check', function(e, c) { + timeshiftUnlPeriod.on('check', function(e, c){ timeshiftMaxPeriod.setDisabled(c); }); - timeshiftUnlSize.on('check', function(e, c) { + + timeshiftUnlSize.on('check', function(e, c){ timeshiftMaxSize.setDisabled(c); }); @@ -94,25 +95,53 @@ tvheadend.timeshift = function() { } }); - var confpanel = new Ext.FormPanel({ - title: 'Timeshift', - iconCls: 'clock', - border: false, - bodyStyle: 'padding:15px', - labelAlign: 'left', - labelWidth: 150, - waitMsgTarget: true, - reader: confreader, - layout: 'form', - defaultType: 'textfield', + var timeshiftPanelA = new Ext.form.FieldSet({ + width: 500, autoHeight: true, - items: [ - timeshiftEnabled, timeshiftOndemand, + border: false, + items : [timeshiftMaxPeriod, timeshiftMaxSize] + }); + + var timeshiftPanelB = new Ext.form.FieldSet({ + width: 200, + autoHeight: true, + border: false, + items : [timeshiftUnlPeriod,timeshiftUnlSize] + }); + + var timeshiftPanel = new Ext.form.FieldSet({ + title: 'Timeshift Options', + width: 700, + autoHeight: true, + collapsible: true, + animCollapse: true, + items : [ + timeshiftEnabled, + timeshiftOndemand, timeshiftPath, - timeshiftMaxPeriod, timeshiftUnlPeriod, - timeshiftMaxSize, timeshiftUnlSize - ], - tbar: [saveButton, '->', helpButton] + { + layout: 'column', + border: false, + items: [timeshiftPanelA, timeshiftPanelB] + } + ] + }); + + var confpanel = new Ext.form.FormPanel({ + title : 'Timeshift', + iconCls : 'clock', + border : false, + bodyStyle : 'padding:15px', + labelAlign : 'left', + labelWidth : 150, + waitMsgTarget : true, + reader : confreader, + layout : 'form', + defaultType : 'textfield', + autoHeight : true, + animCollapse : true, + items : [timeshiftPanel], + tbar : [saveButton, '->', helpButton] }); /* ****************************************************************