mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-21 05:53:33 -07:00
removed backbone from VS solution,
renamed NzbDrone.Backbone to UI
This commit is contained in:
parent
c7776f74e1
commit
663160c06a
230 changed files with 57 additions and 386 deletions
290
UI/Settings/DownloadClient/DownloadClientTemplate.html
Normal file
290
UI/Settings/DownloadClient/DownloadClientTemplate.html
Normal file
|
@ -0,0 +1,290 @@
|
|||
<fieldset>
|
||||
<legend>General</legend>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Download Client</label>
|
||||
<div class="controls">
|
||||
<select class="inputClass x-backlog-setting" name="downloadClient">
|
||||
<option value="0">SABnzbd</option>
|
||||
<option value="1">Blackhole</option>
|
||||
<option value="2">Pneumatic</option>
|
||||
<option value="3">NZBGet</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="What method do you download NZBs with?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">Unsorted TV Directory</label>
|
||||
<div class="controls">
|
||||
<input type="text" placeholder="C:\Unsorted TV" name="downloadClientDropDirectory" class="x-path" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="The directory where your download client downloads TV shows to."></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Use Scene Name</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="useSceneName" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Use Scene name when adding NZB to queue?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>SABnzbd</legend>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Auto-Configure</label>
|
||||
<div class="controls">
|
||||
<input type="button" value="Auto-Configure" class="btn btn-inverse" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="(Windows only) If access to SABnzbd doesn't require a username & password and it is on the same system as NzbDrone, you can auto-configure it"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Host</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="sabHost" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Hostname or IP Address running SABnzbd"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Port</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="sabPort" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Port for the SABnzbd Web Interface"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">API Key</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="sabApiKey" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="API Key for SABnzbd<br/>Found in Config -> General"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Username</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="sabUsername" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Username for the SABnzbd web interface"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Password</label>
|
||||
<div class="controls">
|
||||
<input type="password" name="sabPassword" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Password for the SABnzbd web interface"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">TV Category</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="sabTvCategory" placeholder="This is not the dropdownlist you're looking for"/>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Category to use when sending NZBs to SABnzbd"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Backlog Priority</label>
|
||||
<div class="controls">
|
||||
<select name="sabBacklogTvPriority">
|
||||
<option>Default</option>
|
||||
<option>Paused</option>
|
||||
<option>Low</option>
|
||||
<option>Normal</option>
|
||||
<option>High</option>
|
||||
<option>Force</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Priority to use when sending episodes older than 7 days to SABnzbd"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Recent Priority</label>
|
||||
<div class="controls">
|
||||
<select name="sabRecentTvPriority">
|
||||
<option>Default</option>
|
||||
<option>Paused</option>
|
||||
<option>Low</option>
|
||||
<option>Normal</option>
|
||||
<option>High</option>
|
||||
<option>Force</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Priority to use when sending episodes that aired within the last 7 days to SABnzbd"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Test</label>
|
||||
<div class="controls">
|
||||
<input type="button" value="Test" class="btn btn-inverse" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Test SABnzbd settings"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Blackhole</legend>
|
||||
<div class="control-group">
|
||||
<label class="control-label">Blackhole Directory</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="blackholeDirectory" class="x-path" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="The directory where your download client will pickup .nzb files"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Pneumatic</legend>
|
||||
<div class="control-group">
|
||||
<label class="control-label">Nzb Directory</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="pneumaticDirectory" class="x-path" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Directory to save NZBs for Pneumatic<br/>must be accessible from XBMC"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>NZBGet</legend>
|
||||
<div class="control-group">
|
||||
<label class="control-label">Host</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="nzbgetHost" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Hostname or IP Address running NZBGet"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Port</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="nzbgetPort" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Port for the NZBGet Web Interface"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">API Key</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="nzbgetApiKey" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="API Key for NZBGet<br/>Found in Config -> General"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Username</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="nzbgetUsername" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Username for the NZBGet web interface"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Password</label>
|
||||
<div class="controls">
|
||||
<input type="password" name="nzbgetPassword" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Password for the NZBGet web interface"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">TV Category</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="nzbgetTvCategory" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Category to use when sending NZBs to NZBGet"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Backlog Priority</label>
|
||||
<div class="controls">
|
||||
<select name="nzbgetBacklogTvPriority">
|
||||
<option>Default</option>
|
||||
<option>Paused</option>
|
||||
<option>Low</option>
|
||||
<option>Normal</option>
|
||||
<option>High</option>
|
||||
<option>Force</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Priority to use when sending episodes older than 7 days to NZBGet"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Recent Priority</label>
|
||||
<div class="controls">
|
||||
<select name="nzbgetRecentTvPriority">
|
||||
<option>Default</option>
|
||||
<option>Paused</option>
|
||||
<option>Low</option>
|
||||
<option>Normal</option>
|
||||
<option>High</option>
|
||||
<option>Force</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Priority to use when sending episodes that aired within the last 7 days to NZBGet"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Test</label>
|
||||
<div class="controls">
|
||||
<input type="button" value="Test" class="btn btn-inverse" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Test NZBGet settings"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
25
UI/Settings/DownloadClient/DownloadClientView.js
Normal file
25
UI/Settings/DownloadClient/DownloadClientView.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app', 'Settings/SettingsModel'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.DownloadClient.DownloadClientView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/DownloadClient/DownloadClientTemplate',
|
||||
className: 'form-horizontal',
|
||||
|
||||
ui: {
|
||||
switch: '.switch',
|
||||
tooltip: '[class^="help-inline"] i',
|
||||
pathInput: '.x-path'
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
this.ui.switch.bootstrapSwitch();
|
||||
this.ui.tooltip.tooltip({ placement: 'right', html: true });
|
||||
this.ui.pathInput.autoComplete('/directories');
|
||||
}
|
||||
});
|
||||
});
|
3
UI/Settings/Indexers/IndexersTemplate.html
Normal file
3
UI/Settings/Indexers/IndexersTemplate.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
<div>
|
||||
Indexer settings will go here
|
||||
</div>
|
15
UI/Settings/Indexers/IndexersView.js
Normal file
15
UI/Settings/Indexers/IndexersView.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app', 'Settings/SettingsModel'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.Indexers.IndexersView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Indexers/IndexersTemplate',
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
}
|
||||
});
|
||||
});
|
40
UI/Settings/Misc/MiscTemplate.html
Normal file
40
UI/Settings/Misc/MiscTemplate.html
Normal file
|
@ -0,0 +1,40 @@
|
|||
<fieldset>
|
||||
<legend>General</legend>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Backlog Searching</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="enableBacklogSearching" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Should NzbDrone try to download missing episodes automatically?"></i>
|
||||
<i class="icon-exclamation-sign danger" title="Enabling backlog searching can use a lot of bandwidth and is not
|
||||
recommended for users with block usenet accounts or bandwidth restrictions."></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Ignore Deleted Episodes</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="autoIgnorePreviouslyDownloadedEpisodes" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Episodes deleted from disk are automatically ignored in NzbDrone"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Nzb Restrictions</label>
|
||||
<div class="controls">
|
||||
<textarea rows="3" name="nzbRestrictions" class="nzb-restrictions"></textarea>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="White list or black list nzbs based on these rules<br/>White list: +:LoL<br/>Black list: -:French"></i>
|
||||
</span>
|
||||
<span class="text-area-help">Newline-delimited set of rules in the form of +|-:</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
23
UI/Settings/Misc/MiscView.js
Normal file
23
UI/Settings/Misc/MiscView.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app', 'Settings/SettingsModel'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.Misc.MiscView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Misc/MiscTemplate',
|
||||
className: 'form-horizontal',
|
||||
|
||||
ui: {
|
||||
switch: '.switch',
|
||||
tooltip: '[class^="help-inline"] i'
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
this.ui.switch.bootstrapSwitch();
|
||||
this.ui.tooltip.tooltip({ placement: 'right', html: true });
|
||||
}
|
||||
});
|
||||
});
|
159
UI/Settings/Naming/NamingTemplate.html
Normal file
159
UI/Settings/Naming/NamingTemplate.html
Normal file
|
@ -0,0 +1,159 @@
|
|||
<fieldset>
|
||||
<legend>Episode Naming</legend>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Use Scene Name</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="sortingUseSceneName" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Use the scene name, ignoring all other naming settings"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Series Name</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="sortingIncludeSeriesName" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Should filenames contain the series name when renamed?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Episode Name</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="sortingIncludeEpisodeTitle" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Should filenames contain the episode name when renamed?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Replace Spaces</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="sortingReplaceSpaces" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Do you want to replace spaces in the filename with periods?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Append Quality</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="sortingAppendQuality" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Should filenames have the quality appended to the end?"></i>
|
||||
</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Use Scene Folders</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="useSeasonFolder" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Should files be stored in season folders by default? (Applied only when a series is added)"></i>
|
||||
</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Season Folder Format</label>
|
||||
<div class="controls">
|
||||
<input type="text" placeholder="Season %s" name="sortingSeasonFolderFormat" />
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="How should season folders be named? (Use %0s to pad to two digits)"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Separator Style</label>
|
||||
<div class="controls">
|
||||
<select class="inputClass x-backlog-setting" name="sortingSeparatorStyle">
|
||||
<option value="0">Dash</option>
|
||||
<option value="1">Space</option>
|
||||
<option value="2">Period</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="How should NzbDrone separate sections of the filename?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Numbering Style</label>
|
||||
<div class="controls">
|
||||
<select class="inputClass x-backlog-setting" name="sortingNumberStyle">
|
||||
<option value="0">1x05</option>
|
||||
<option value="1">01x05</option>
|
||||
<option value="2">S01E05</option>
|
||||
<option value="3">s01e05</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="What numbering style do you want?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Multi-Episode Style</label>
|
||||
<div class="controls">
|
||||
<select class="inputClass x-backlog-setting" name="sortingMultiEpisodeStyle">
|
||||
<option value="0">Extend</option>
|
||||
<option value="1">Duplicate</option>
|
||||
<option value="2">Repeat</option>
|
||||
<option value="3">Scene</option>
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="How will multi-episode files be named?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Metadata</legend>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">XBMC</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="metadataXbmcEnabled" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Enable creating metadata for XBMC"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Use Banners</label>
|
||||
<div class="controls">
|
||||
<div class="switch">
|
||||
<input type="checkbox" name="metadataUseBanners" />
|
||||
</div>
|
||||
<span class="help-inline-checkbox">
|
||||
<i class="icon-question-sign" title="Use banners instead of posters?"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
27
UI/Settings/Naming/NamingView.js
Normal file
27
UI/Settings/Naming/NamingView.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app', 'Settings/SettingsModel'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.Naming.NamingView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Naming/NamingTemplate',
|
||||
className: 'form-horizontal',
|
||||
|
||||
ui: {
|
||||
switch: '.switch',
|
||||
tooltip: '[class^="help-inline"] i'
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
//Listen to save event
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
this.ui.switch.bootstrapSwitch();
|
||||
this.ui.tooltip.tooltip({ placement: 'right' });
|
||||
}
|
||||
});
|
||||
});
|
3
UI/Settings/Notifications/NotificationsTemplate.html
Normal file
3
UI/Settings/Notifications/NotificationsTemplate.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
<div>
|
||||
Notification settings will go here
|
||||
</div>
|
15
UI/Settings/Notifications/NotificationsView.js
Normal file
15
UI/Settings/Notifications/NotificationsView.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app', 'Settings/SettingsModel'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.Notifications.NotificationsView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Notifications/NotificationsTemplate',
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
}
|
||||
});
|
||||
});
|
54
UI/Settings/Quality/Profile/EditQualityProfileTemplate.html
Normal file
54
UI/Settings/Quality/Profile/EditQualityProfileTemplate.html
Normal file
|
@ -0,0 +1,54 @@
|
|||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3>Edit</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-horizontal">
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Name</label>
|
||||
<div class="controls">
|
||||
<input type="text" name="name">
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="The name for this quality profile"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Cutoff</label>
|
||||
<div class="controls">
|
||||
|
||||
<select class="x-cutoff" name="cutoff">
|
||||
{{#each allowed}}
|
||||
<option value="{{id}}">{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="Once this quality is reached NzbDrone will no longer download episodes"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!--Todo: Why is a null allowed being treated as a true?-->
|
||||
{{#each qualities}}
|
||||
<div class="control-group">
|
||||
<label class="control-label">{{name}}</label>
|
||||
<div class="controls">
|
||||
<div class="switch" data-on-label="Yes" data-off-label="No">
|
||||
<input type="checkbox" name="allowed" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-danger pull-left x-remove" >delete</button>
|
||||
<button class="btn" data-dismiss="modal">cancel</button>
|
||||
<button class="btn btn-primary x-save">save</button>
|
||||
</div>
|
38
UI/Settings/Quality/Profile/EditQualityProfileView.js
Normal file
38
UI/Settings/Quality/Profile/EditQualityProfileView.js
Normal file
|
@ -0,0 +1,38 @@
|
|||
'use strict';
|
||||
define(['app', 'Quality/QualityProfileModel'], function () {
|
||||
|
||||
NzbDrone.Settings.Quality.Profile.EditQualityProfileView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Quality/Profile/EditQualityProfileTemplate',
|
||||
tagName: 'div',
|
||||
className: "modal",
|
||||
|
||||
ui: {
|
||||
switch: '.switch'
|
||||
},
|
||||
|
||||
events: {
|
||||
'click .x-save': 'saveQualityProfile',
|
||||
//'click .x-remove': 'removeSeries'
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
this.ui.switch.bootstrapSwitch();
|
||||
},
|
||||
|
||||
|
||||
saveQualityProfile: function () {
|
||||
//Todo: Make sure model is updated with Allowed, Cutoff, Name
|
||||
|
||||
this.model.save();
|
||||
this.trigger('saved');
|
||||
this.$el.parent().modal('hide');
|
||||
},
|
||||
|
||||
// removeSeries: function () {
|
||||
// var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model });
|
||||
// NzbDrone.modalRegion.show(view);
|
||||
// }
|
||||
});
|
||||
|
||||
});
|
|
@ -0,0 +1,14 @@
|
|||
<fieldset>
|
||||
<legend>Quality Profiles</legend>
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Allowed</th>
|
||||
<th>Cutoff</th>
|
||||
<th>Controls</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</fieldset>
|
21
UI/Settings/Quality/Profile/QualityProfileCollectionView.js
Normal file
21
UI/Settings/Quality/Profile/QualityProfileCollectionView.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
'use strict';
|
||||
|
||||
define(['app', 'Settings/Quality/Profile/QualityProfileView'], function (app) {
|
||||
NzbDrone.Settings.Quality.Profile.QualityProfileCollectionView = Backbone.Marionette.CompositeView.extend({
|
||||
itemView: NzbDrone.Settings.Quality.Profile.QualityProfileView,
|
||||
itemViewContainer: 'tbody',
|
||||
template: 'Settings/Quality/Profile/QualityProfileCollectionTemplate',
|
||||
|
||||
initialize: function (options) {
|
||||
},
|
||||
|
||||
ui:{
|
||||
|
||||
},
|
||||
|
||||
onCompositeCollectionRendered: function()
|
||||
{
|
||||
|
||||
}
|
||||
});
|
||||
});
|
11
UI/Settings/Quality/Profile/QualityProfileTemplate.html
Normal file
11
UI/Settings/Quality/Profile/QualityProfileTemplate.html
Normal file
|
@ -0,0 +1,11 @@
|
|||
<td name="name"></td>
|
||||
<td>
|
||||
{{#each allowed}}
|
||||
{{name}} |
|
||||
{{/each}}
|
||||
</td>
|
||||
<td name="cutoffName"></td>
|
||||
<td>
|
||||
<i class="icon-cog x-edit" title="Edit Series"></i>
|
||||
| Delete
|
||||
</td>
|
45
UI/Settings/Quality/Profile/QualityProfileView.js
Normal file
45
UI/Settings/Quality/Profile/QualityProfileView.js
Normal file
|
@ -0,0 +1,45 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app',
|
||||
'Quality/QualityProfileCollection',
|
||||
'Settings/Quality/Profile/EditQualityProfileView'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.Quality.Profile.QualityProfileView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Quality/Profile/QualityProfileTemplate',
|
||||
tagName: 'tr',
|
||||
|
||||
ui: {
|
||||
'progressbar': '.progress .bar'
|
||||
},
|
||||
|
||||
events: {
|
||||
'click .x-edit': 'editSeries',
|
||||
'click .x-remove': 'removeSeries'
|
||||
},
|
||||
|
||||
initialize: function () {
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
},
|
||||
|
||||
editSeries: function () {
|
||||
var view = new NzbDrone.Settings.Quality.Profile.EditQualityProfileView({ model: this.model});
|
||||
|
||||
NzbDrone.vent.trigger(NzbDrone.Events.OpenModalDialog, {
|
||||
view: view
|
||||
});
|
||||
},
|
||||
|
||||
removeSeries: function () {
|
||||
var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model });
|
||||
NzbDrone.vent.trigger(NzbDrone.Events.OpenModalDialog, {
|
||||
view: view
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
41
UI/Settings/Quality/QualityLayout.js
Normal file
41
UI/Settings/Quality/QualityLayout.js
Normal file
|
@ -0,0 +1,41 @@
|
|||
define([
|
||||
'app',
|
||||
'Quality/QualityProfileCollection',
|
||||
'Quality/QualitySizeCollection',
|
||||
'Settings/Quality/QualityView',
|
||||
'Settings/Quality/Profile/QualityProfileCollectionView',
|
||||
'Settings/Quality/Size/QualitySizeCollectionView'
|
||||
],
|
||||
function (app, qualityProfileCollection) {
|
||||
NzbDrone.Settings.Quality.QualityLayout = Backbone.Marionette.Layout.extend({
|
||||
template: 'Settings/Quality/QualityLayoutTemplate',
|
||||
|
||||
regions: {
|
||||
qualityStandard: '#quality-standard',
|
||||
qualityProfile: '#quality-profile',
|
||||
qualitySize: '#quality-size'
|
||||
},
|
||||
|
||||
ui: {
|
||||
|
||||
},
|
||||
|
||||
events: {
|
||||
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.settings = options.settings;
|
||||
qualityProfileCollection.fetch();
|
||||
this.qualitySizeCollection = new NzbDrone.Quality.QualitySizeCollection();
|
||||
this.qualitySizeCollection.fetch();
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
this.qualityStandard.show(new NzbDrone.Settings.Quality.QualityView({model: this.settings, qualityProfiles: qualityProfileCollection}));
|
||||
this.qualityProfile.show(new NzbDrone.Settings.Quality.Profile.QualityProfileCollectionView({collection: qualityProfileCollection}));
|
||||
this.qualitySize.show(new NzbDrone.Settings.Quality.Size.QualitySizeCollectionView({collection: this.qualitySizeCollection}));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
9
UI/Settings/Quality/QualityLayoutTemplate.html
Normal file
9
UI/Settings/Quality/QualityLayoutTemplate.html
Normal file
|
@ -0,0 +1,9 @@
|
|||
<div class="row">
|
||||
<div class="span12" id="quality-standard"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span12" id="quality-profile"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span12" id="quality-size"></div>
|
||||
</div>
|
14
UI/Settings/Quality/QualityTemplate.html
Normal file
14
UI/Settings/Quality/QualityTemplate.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Default Quality Profile</label>
|
||||
<div class="controls">
|
||||
<select class="x-quality-profile" name="qualityProfileId">
|
||||
{{#each qualityProfiles.models}}
|
||||
<option value="{{id}}">{{attributes.name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-inline">
|
||||
<i class="icon-question-sign" title="The default quality to use when adding series to NzbDrone "></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
21
UI/Settings/Quality/QualityView.js
Normal file
21
UI/Settings/Quality/QualityView.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app', 'Settings/SettingsModel'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.Quality.QualityView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Quality/QualityTemplate',
|
||||
className: 'form-horizontal',
|
||||
|
||||
initialize: function(options) {
|
||||
this.qualityProfileCollection = options.qualityProfiles;
|
||||
this.model.set({ qualityProfiles: this.qualityProfileCollection });
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
}
|
||||
});
|
||||
});
|
|
@ -0,0 +1,4 @@
|
|||
<fieldset>
|
||||
<legend>Quality Size Limits</legend>
|
||||
<div id="quality-sizes-container"></div>
|
||||
</fieldset>
|
22
UI/Settings/Quality/Size/QualitySizeCollectionView.js
Normal file
22
UI/Settings/Quality/Size/QualitySizeCollectionView.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
'use strict';
|
||||
|
||||
define(['app', 'Settings/Quality/Size/QualitySizeView'], function (app) {
|
||||
NzbDrone.Settings.Quality.Size.QualitySizeCollectionView = Backbone.Marionette.CompositeView.extend({
|
||||
itemView: NzbDrone.Settings.Quality.Size.QualitySizeView,
|
||||
itemViewContainer: '#quality-sizes-container',
|
||||
template: 'Settings/Quality/Size/QualitySizeCollectionTemplate',
|
||||
|
||||
initialize: function () {
|
||||
var test = 1;
|
||||
},
|
||||
|
||||
ui:{
|
||||
|
||||
},
|
||||
|
||||
onCompositeCollectionRendered: function()
|
||||
{
|
||||
|
||||
}
|
||||
});
|
||||
});
|
5
UI/Settings/Quality/Size/QualitySizeTemplate.html
Normal file
5
UI/Settings/Quality/Size/QualitySizeTemplate.html
Normal file
|
@ -0,0 +1,5 @@
|
|||
<b>{{name}}</b>
|
||||
<div class="quality-slider-container">
|
||||
<input type="text" class="span4 slider" />
|
||||
</div>
|
||||
30 minute size: <span name="thirtyMinuteSize" class="thirty-minute-size"></span>MB | 60 minute size: <span name="sixtyMinuteSize" class="sixty-minute-size"></span>MB
|
49
UI/Settings/Quality/Size/QualitySizeView.js
Normal file
49
UI/Settings/Quality/Size/QualitySizeView.js
Normal file
|
@ -0,0 +1,49 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app',
|
||||
'Quality/QualitySizeCollection'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.Quality.Size.QualitySizeView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/Quality/Size/QualitySizeTemplate',
|
||||
className: 'quality-size-item',
|
||||
|
||||
ui: {
|
||||
slider: '.slider',
|
||||
thirtyMinuteSize: '.thirty-minute-size',
|
||||
sixtyMinuteSize: '.sixty-minute-size'
|
||||
},
|
||||
|
||||
events: {
|
||||
'slide .slider': 'slide'
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.qualityProfileCollection = options.qualityProfiles;
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
|
||||
var self = this;
|
||||
this.ui.slider.slider({
|
||||
min: 0,
|
||||
max: 200,
|
||||
step: 1,
|
||||
value: self.model.get('maxSize'),
|
||||
tooltip: 'hide'
|
||||
});
|
||||
},
|
||||
|
||||
slide: function (e) {
|
||||
var newSize = e.value;
|
||||
|
||||
this.model.set({ maxSize: newSize, thirtyMinuteSize: newSize * 30, sixtyMinuteSize: newSize * 60 });
|
||||
|
||||
this.ui.thirtyMinuteSize.html(newSize * 30);
|
||||
this.ui.sixtyMinuteSize.html(newSize * 60);
|
||||
}
|
||||
});
|
||||
});
|
161
UI/Settings/SettingsLayout.js
Normal file
161
UI/Settings/SettingsLayout.js
Normal file
|
@ -0,0 +1,161 @@
|
|||
define([
|
||||
'app',
|
||||
'Settings/Naming/NamingView',
|
||||
'Settings/Quality/QualityLayout',
|
||||
'Settings/Indexers/IndexersView',
|
||||
'Settings/DownloadClient/DownloadClientView',
|
||||
'Settings/Notifications/NotificationsView',
|
||||
'Settings/System/SystemView',
|
||||
'Settings/Misc/MiscView'
|
||||
],
|
||||
function (app) {
|
||||
NzbDrone.Settings.SettingsLayout = Backbone.Marionette.Layout.extend({
|
||||
template: 'Settings/SettingsLayoutTemplate',
|
||||
|
||||
regions: {
|
||||
naming: '#naming',
|
||||
quality: '#quality',
|
||||
indexers: '#indexers',
|
||||
downloadClient: '#download-client',
|
||||
notifications: '#notifications',
|
||||
system: '#system',
|
||||
misc: '#misc'
|
||||
},
|
||||
|
||||
ui: {
|
||||
namingTab: '.x-naming-tab',
|
||||
qualityTab: '.x-quality-tab',
|
||||
indexersTab: '.x-indexers-tab',
|
||||
downloadClientTab: '.x-download-client-tab',
|
||||
notificationsTab: '.x-notifications-tab',
|
||||
systemTab: '.x-system-tab',
|
||||
miscTab: '.x-misc-tab'
|
||||
},
|
||||
|
||||
events: {
|
||||
'click .x-naming-tab': 'showNaming',
|
||||
'click .x-quality-tab': 'showQuality',
|
||||
'click .x-indexers-tab': 'showIndexers',
|
||||
'click .x-download-client-tab': 'showDownloadClient',
|
||||
'click .x-notifications-tab': 'showNotifications',
|
||||
'click .x-system-tab': 'showSystem',
|
||||
'click .x-misc-tab': 'showMisc',
|
||||
'click .x-save-settings': 'save'
|
||||
},
|
||||
|
||||
showNaming: function (e) {
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
this.ui.namingTab.tab('show');
|
||||
NzbDrone.Router.navigate('settings/naming');
|
||||
},
|
||||
|
||||
showQuality: function (e) {
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
this.ui.qualityTab.tab('show');
|
||||
NzbDrone.Router.navigate('settings/quality');
|
||||
},
|
||||
|
||||
showIndexers: function (e) {
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
this.ui.indexersTab.tab('show');
|
||||
NzbDrone.Router.navigate('settings/indexers');
|
||||
},
|
||||
|
||||
showDownloadClient: function (e) {
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
this.ui.downloadClientTab.tab('show');
|
||||
NzbDrone.Router.navigate('settings/downloadclient');
|
||||
},
|
||||
|
||||
showNotifications: function (e) {
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
this.ui.notificationsTab.tab('show');
|
||||
NzbDrone.Router.navigate('settings/notifications');
|
||||
},
|
||||
|
||||
showSystem: function (e) {
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
this.ui.systemTab.tab('show');
|
||||
NzbDrone.Router.navigate('settings/system');
|
||||
},
|
||||
|
||||
showMisc: function (e) {
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
this.ui.miscTab.tab('show');
|
||||
NzbDrone.Router.navigate('settings/misc');
|
||||
},
|
||||
|
||||
initialize: function (context, action, query, settings) {
|
||||
this.settings = settings;
|
||||
|
||||
if (action) {
|
||||
this.action = action.toLowerCase();
|
||||
}
|
||||
|
||||
if (query) {
|
||||
this.query = query.toLowerCase();
|
||||
}
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
this.naming.show(new NzbDrone.Settings.Naming.NamingView({model: this.settings}));
|
||||
this.quality.show(new NzbDrone.Settings.Quality.QualityLayout({settings: this.settings}));
|
||||
this.indexers.show(new NzbDrone.Settings.Indexers.IndexersView({model: this.settings}));
|
||||
this.downloadClient.show(new NzbDrone.Settings.DownloadClient.DownloadClientView({model: this.settings}));
|
||||
this.notifications.show(new NzbDrone.Settings.Notifications.NotificationsView({model: this.settings}));
|
||||
this.system.show(new NzbDrone.Settings.System.SystemView({model: this.settings}));
|
||||
this.misc.show(new NzbDrone.Settings.Misc.MiscView({model: this.settings}));
|
||||
},
|
||||
|
||||
onShow: function () {
|
||||
switch (this.action) {
|
||||
case 'quality':
|
||||
this.showQuality();
|
||||
break;
|
||||
case 'indexers':
|
||||
this.showIndexers();
|
||||
break;
|
||||
case 'downloadclient':
|
||||
this.showDownloadClient();
|
||||
break;
|
||||
case 'notifications':
|
||||
this.showNotifications();
|
||||
break;
|
||||
case 'system':
|
||||
this.showSystem();
|
||||
break;
|
||||
case 'misc':
|
||||
this.showMisc();
|
||||
break;
|
||||
default:
|
||||
this.showNaming();
|
||||
}
|
||||
},
|
||||
|
||||
save: function () {
|
||||
this.settings.save();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
21
UI/Settings/SettingsLayoutTemplate.html
Normal file
21
UI/Settings/SettingsLayoutTemplate.html
Normal file
|
@ -0,0 +1,21 @@
|
|||
<ul class="nav nav-tabs" id="myTab">
|
||||
<li><a href="#naming" class="x-naming-tab">Naming</a></li>
|
||||
<li><a href="#quality" class="x-quality-tab">Quality</a></li>
|
||||
<li><a href="#indexers" class ="x-indexers-tab">Indexers</a></li>
|
||||
<li><a href="#download-client" class ="x-download-client-tab">Download Client</a></li>
|
||||
<li><a href="#notifications" class ="x-notifications-tab">Notifications</a></li>
|
||||
<li><a href="#system" class ="x-system-tab">System</a></li>
|
||||
<li><a href="#misc" class ="x-misc-tab">Misc</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane" id="naming">Naming Settings</div>
|
||||
<div class="tab-pane" id="quality">Quality Settings</div>
|
||||
<div class="tab-pane" id="indexers">Indexer Settings</div>
|
||||
<div class="tab-pane" id="download-client">Download Client Settings</div>
|
||||
<div class="tab-pane" id="notifications">Notification Settings</div>
|
||||
<div class="tab-pane" id="system">System Settings</div>
|
||||
<div class="tab-pane" id="misc">Misc Settings</div>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-primary x-save-settings">Save</button>
|
5
UI/Settings/SettingsModel.js
Normal file
5
UI/Settings/SettingsModel.js
Normal file
|
@ -0,0 +1,5 @@
|
|||
define(['app'], function (app) {
|
||||
NzbDrone.Settings.SettingsModel = Backbone.Model.extend({
|
||||
url: NzbDrone.Constants.ApiRoot + '/settings'
|
||||
});
|
||||
});
|
3
UI/Settings/System/SystemTemplate.html
Normal file
3
UI/Settings/System/SystemTemplate.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
<div>
|
||||
System settings will go here
|
||||
</div>
|
15
UI/Settings/System/SystemView.js
Normal file
15
UI/Settings/System/SystemView.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
'use strict';
|
||||
|
||||
define([
|
||||
'app', 'Settings/SettingsModel'
|
||||
|
||||
], function () {
|
||||
|
||||
NzbDrone.Settings.System.SystemView = Backbone.Marionette.ItemView.extend({
|
||||
template: 'Settings/System/SystemTemplate',
|
||||
|
||||
onRender: function () {
|
||||
NzbDrone.ModelBinder.bind(this.model, this.el);
|
||||
}
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue