You've already forked Sonarr
							
							
				mirror of
				https://github.com/Sonarr/Sonarr.git
				synced 2025-10-31 00:07:55 +02:00 
			
		
		
		
	More notificationUI changes, start notification updates
This commit is contained in:
		| @@ -1,5 +1,7 @@ | ||||
| using System.Collections.Generic; | ||||
| using NzbDrone.Api.ClientSchema; | ||||
| using NzbDrone.Common.Reflection; | ||||
| using NzbDrone.Core.Annotations; | ||||
| using NzbDrone.Core.Notifications; | ||||
| using Omu.ValueInjecter; | ||||
|  | ||||
| @@ -12,7 +14,9 @@ namespace NzbDrone.Api.Notifications | ||||
|         public NotificationModule(INotificationService notificationService) | ||||
|         { | ||||
|             _notificationService = notificationService; | ||||
|  | ||||
|             GetResourceAll = GetAll; | ||||
|             UpdateResource = Update; | ||||
|         } | ||||
|  | ||||
|         private List<NotificationResource> GetAll() | ||||
| @@ -23,14 +27,42 @@ namespace NzbDrone.Api.Notifications | ||||
|  | ||||
|             foreach (var notification in notifications) | ||||
|             { | ||||
|                 var indexerResource = new NotificationResource(); | ||||
|                 indexerResource.InjectFrom(notification); | ||||
|                 indexerResource.Fields = SchemaBuilder.GenerateSchema(notification.Settings); | ||||
|                 var notificationResource = new NotificationResource(); | ||||
|                 notificationResource.InjectFrom(notification); | ||||
|                 notificationResource.Fields = SchemaBuilder.GenerateSchema(notification.Settings); | ||||
|  | ||||
|                 result.Add(indexerResource); | ||||
|                 result.Add(notificationResource); | ||||
|             } | ||||
|  | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         private NotificationResource Update(NotificationResource notificationResource) | ||||
|         { | ||||
|             //Todo: Convert Resource back to Settings | ||||
|  | ||||
|             var notification = _notificationService.Get(notificationResource.Id); | ||||
|  | ||||
|             notification.OnGrab = notificationResource.OnGrab; | ||||
|             notification.OnDownload = notificationResource.OnDownload; | ||||
|  | ||||
|             var properties = notification.Settings.GetType().GetSimpleProperties(); | ||||
|  | ||||
|             foreach (var propertyInfo in properties) | ||||
|             { | ||||
|                 var fieldAttribute = propertyInfo.GetAttribute<FieldDefinitionAttribute>(false); | ||||
|  | ||||
|                 if (fieldAttribute != null) | ||||
|                 { | ||||
|                     //Find coresponding field | ||||
|  | ||||
|                     var field = notificationResource.Fields.Find(f => f.Name == propertyInfo.Name); | ||||
|  | ||||
|                     propertyInfo.SetValue(notification.Settings, field.Value, null); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return notificationResource; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -11,5 +11,6 @@ namespace NzbDrone.Api.Notifications | ||||
|         public Boolean OnGrab { get; set; } | ||||
|         public Boolean OnDownload { get; set; } | ||||
|         public List<Field> Fields { get; set; } | ||||
|         public String Implementation { get; set; } | ||||
|     } | ||||
| } | ||||
| @@ -13,5 +13,6 @@ namespace NzbDrone.Core.Notifications | ||||
|         public bool OnDownload { get; set; } | ||||
|         public INotifcationSettings Settings { get; set; } | ||||
|         public INotification Instance { get; set; } | ||||
|         public string Implementation { get; set; } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using NLog; | ||||
| using Newtonsoft.Json; | ||||
| using NzbDrone.Common; | ||||
| using NzbDrone.Common.Composition; | ||||
| using NzbDrone.Common.Messaging; | ||||
| @@ -13,6 +14,7 @@ namespace NzbDrone.Core.Notifications | ||||
|     public interface INotificationService | ||||
|     { | ||||
|         List<Notification> All(); | ||||
|         Notification Get(int id); | ||||
|     } | ||||
|  | ||||
|     public class NotificationService | ||||
| @@ -42,6 +44,11 @@ namespace NzbDrone.Core.Notifications | ||||
|             return _notificationRepository.All().Select(ToNotification).ToList(); | ||||
|         } | ||||
|  | ||||
|         public Notification Get(int id) | ||||
|         { | ||||
|             return ToNotification(_notificationRepository.Get(id)); | ||||
|         } | ||||
|  | ||||
|         private Notification ToNotification(NotificationDefinition definition) | ||||
|         { | ||||
|             var notification = new Notification(); | ||||
| @@ -50,6 +57,7 @@ namespace NzbDrone.Core.Notifications | ||||
|             notification.OnDownload = definition.OnDownload; | ||||
|             notification.Instance = GetInstance(definition); | ||||
|             notification.Name = definition.Name; | ||||
|             notification.Implementation = definition.Implementation; | ||||
|             notification.Settings = ((dynamic)notification.Instance).ImportSettingsFromJson(definition.Settings); | ||||
|  | ||||
|             return notification; | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Growl.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Growl.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 769 B | 
							
								
								
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Plex.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Plex.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 606 B | 
							
								
								
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Prowl.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Prowl.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Smtp.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Smtp.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 494 B | 
							
								
								
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Xbmc.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								UI/Content/Images/Notifications/Xbmc.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 718 B | 
| @@ -1,5 +1,12 @@ | ||||
| <div class="row"> | ||||
|     <div class="span12"> | ||||
|         <div id="x-notifications" class="form-horizontal"></div> | ||||
|     </div> | ||||
| </div> | ||||
| <table class="table table-hover"> | ||||
|     <thead> | ||||
|     <tr> | ||||
|         <th>Type</th> | ||||
|         <th>Name</th> | ||||
|         <th>On Grab</th> | ||||
|         <th>On Download</th> | ||||
|         <th>Controls</th> | ||||
|     </tr> | ||||
|     </thead> | ||||
|     <tbody></tbody> | ||||
| </table> | ||||
| @@ -2,7 +2,7 @@ | ||||
| define(['app', 'Settings/Notifications/ItemView'], function () { | ||||
|     NzbDrone.Settings.Notifications.CollectionView = Backbone.Marionette.CompositeView.extend({ | ||||
|         itemView                : NzbDrone.Settings.Notifications.ItemView, | ||||
|         itemViewContainer       : '#x-notifications', | ||||
|         itemViewContainer       : 'tbody', | ||||
|         template                : 'Settings/Notifications/CollectionTemplate' | ||||
|     }); | ||||
| }); | ||||
|   | ||||
							
								
								
									
										67
									
								
								UI/Settings/Notifications/EditTemplate.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								UI/Settings/Notifications/EditTemplate.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| <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"/> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="control-group"> | ||||
|             <label class="control-label">On Grab</label> | ||||
|  | ||||
|             <div class="controls"> | ||||
|                 <label class="checkbox toggle well"> | ||||
|                     <input type="checkbox" name="onGrab"/> | ||||
|                     <p> | ||||
|                         <span>On</span> | ||||
|                         <span>Off</span> | ||||
|                     </p> | ||||
|  | ||||
|                     <div class="btn btn-primary slide-button"></div> | ||||
|                 </label> | ||||
|  | ||||
|             <span class="help-inline-checkbox"> | ||||
|                 <i class="icon-question-sign" title="Do you want to get notifications when episodes are grabbed?"></i> | ||||
|             </span> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="control-group"> | ||||
|             <label class="control-label">On Download</label> | ||||
|  | ||||
|             <div class="controls"> | ||||
|                 <label class="checkbox toggle well"> | ||||
|                     <input type="checkbox" name="onDownload"/> | ||||
|                     <p> | ||||
|                         <span>On</span> | ||||
|                         <span>Off</span> | ||||
|                     </p> | ||||
|  | ||||
|                     <div class="btn btn-primary slide-button"></div> | ||||
|                 </label> | ||||
|  | ||||
|             <span class="help-inline-checkbox"> | ||||
|                 <i class="icon-question-sign" title="Do you want to get notifications when episodes are downloaded?"></i> | ||||
|             </span> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         {{#each fields}} | ||||
|             {{debug}} | ||||
|             {{order}} | ||||
|             {{value}} | ||||
|             {{formField}} | ||||
|         {{/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> | ||||
							
								
								
									
										36
									
								
								UI/Settings/Notifications/EditView.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								UI/Settings/Notifications/EditView.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| "use strict"; | ||||
|  | ||||
| define([ | ||||
|     'app', | ||||
|     'Settings/Notifications/Model' | ||||
|  | ||||
| ], function () { | ||||
|  | ||||
|     NzbDrone.Settings.Notifications.EditView = Backbone.Marionette.ItemView.extend({ | ||||
|         template  : 'Settings/Notifications/EditTemplate', | ||||
|  | ||||
|         events: { | ||||
|             'click .x-save': 'save' | ||||
|         }, | ||||
|  | ||||
|         save: function () { | ||||
|             this.model.save(); | ||||
|  | ||||
| //            window.alert('saving'); | ||||
| //            this.model.save(undefined, this.syncNotification("Notification Settings Saved", "Couldn't Save Notification Settings")); | ||||
|         }, | ||||
|  | ||||
|  | ||||
|         syncNotification: function (success, error) { | ||||
|             return { | ||||
|                 success: function () { | ||||
|                     window.alert(success); | ||||
|                 }, | ||||
|  | ||||
|                 error: function () { | ||||
|                     window.alert(error); | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -1,47 +1,9 @@ | ||||
| <fieldset> | ||||
|     <legend>{{name}}</legend> | ||||
|  | ||||
|     <div class="control-group"> | ||||
|         <label class="control-label">On Grab</label> | ||||
|  | ||||
|         <div class="controls"> | ||||
|             <label class="checkbox toggle well"> | ||||
|                 <input type="checkbox" name="onGrab"/> | ||||
|                 <p> | ||||
|                     <span>On</span> | ||||
|                     <span>Off</span> | ||||
|                 </p> | ||||
|  | ||||
|                 <div class="btn btn-primary slide-button"></div> | ||||
|             </label> | ||||
|  | ||||
|             <span class="help-inline-checkbox"> | ||||
|                 <i class="icon-question-sign" title="Do you want to get notifications when episodes are grabbed?"></i> | ||||
|             </span> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="control-group"> | ||||
|         <label class="control-label">On Download</label> | ||||
|  | ||||
|         <div class="controls"> | ||||
|             <label class="checkbox toggle well"> | ||||
|                 <input type="checkbox" name="onDownload"/> | ||||
|                 <p> | ||||
|                     <span>On</span> | ||||
|                     <span>Off</span> | ||||
|                 </p> | ||||
|  | ||||
|                 <div class="btn btn-primary slide-button"></div> | ||||
|             </label> | ||||
|  | ||||
|             <span class="help-inline-checkbox"> | ||||
|                 <i class="icon-question-sign" title="Do you want to get notifications when episodes are downloaded?"></i> | ||||
|             </span> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     {{#each fields}} | ||||
|         {{formField}} | ||||
|     {{/each}} | ||||
| </fieldset> | ||||
| <td><img src="/content/images/notifications/{{implementation}}.png" alt="{{implementation}}"/></td> | ||||
| <td name="name"></td> | ||||
| <td name="onGrab"></td> | ||||
| <td name="onDownload"></td> | ||||
| <td name="cutoffName"></td> | ||||
| <td> | ||||
|     <i class="icon-cog x-edit" title="Edit"></i> | ||||
|     | Delete | ||||
| </td> | ||||
| @@ -2,32 +2,28 @@ | ||||
|  | ||||
| define([ | ||||
|     'app', | ||||
|     'Settings/Notifications/Collection' | ||||
|     'Settings/Notifications/Collection', | ||||
|     'Settings/Notifications/EditView' | ||||
|  | ||||
| ], function () { | ||||
|  | ||||
|     NzbDrone.Settings.Notifications.ItemView = Backbone.Marionette.ItemView.extend({ | ||||
|         template  : 'Settings/Notifications/ItemTemplate', | ||||
|         initialize: function () { | ||||
|             NzbDrone.vent.on(NzbDrone.Commands.SaveSettings, this.saveSettings, this); | ||||
|         tagName: 'tr', | ||||
|  | ||||
|         events: { | ||||
|             'click .x-edit'  : 'edit', | ||||
|             'click .x-remove': 'remove' | ||||
|         }, | ||||
|  | ||||
|         saveSettings: function () { | ||||
|  | ||||
|             //this.model.save(undefined, this.syncNotification("Naming Settings Saved", "Couldn't Save Naming Settings")); | ||||
|         edit: function () { | ||||
|             var view = new NzbDrone.Settings.Notifications.EditView({ model: this.model}); | ||||
|             NzbDrone.modalRegion.show(view); | ||||
|         }, | ||||
|  | ||||
|  | ||||
|         syncNotification: function (success, error) { | ||||
|             return { | ||||
|                 success: function () { | ||||
|                     window.alert(success); | ||||
|                 }, | ||||
|  | ||||
|                 error: function () { | ||||
|                     window.alert(error); | ||||
|                 } | ||||
|             }; | ||||
|         remove: function () { | ||||
|             var view = new NzbDrone.Settings.Notifications.DeleteView({ model: this.model}); | ||||
|             NzbDrone.modalRegion.show(view); | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
|   | ||||
| @@ -16,16 +16,16 @@ define([ | ||||
|         }, | ||||
|  | ||||
|         events: { | ||||
|             'click .x-edit'  : 'editSeries', | ||||
|             'click .x-remove': 'removeSeries' | ||||
|             'click .x-edit'  : 'edit', | ||||
|             'click .x-remove': 'remove' | ||||
|         }, | ||||
|  | ||||
|         editSeries: function () { | ||||
|         edit: function () { | ||||
|             var view = new NzbDrone.Settings.Quality.Profile.EditQualityProfileView({ model: this.model}); | ||||
|             NzbDrone.modalRegion.show(view); | ||||
|         }, | ||||
|  | ||||
|         removeSeries: function () { | ||||
|         remove: function () { | ||||
|             var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model }); | ||||
|             NzbDrone.modalRegion.show(view); | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user