public IActionResult Edit([Required] string deviceId, [Required] string traitId)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.Get(deviceId);

            var traitEnumId = traitId.ToEnum <TraitType>();

            if (!device.Traits.Any(x => x.Trait == traitEnumId))
            {
                return(NotFound());
            }

            // Get trait
            var trait = device.Traits.First(x => x.Trait == traitEnumId);
            var model = new TraitViewModel
            {
                Trait      = trait.Trait,
                Attributes = trait.Attributes != null?JsonConvert.SerializeObject(trait.Attributes, Formatting.Indented) : null,
                                 Commands                         = trait.Commands != null?JsonConvert.SerializeObject(trait.Commands, Formatting.Indented) : null,
                                                            State = trait.State != null?JsonConvert.SerializeObject(trait.State, Formatting.Indented) : null
            };

            return(View(model));
        }
        public IActionResult Create([Required] string deviceId, TraitViewModel viewModel)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.Get(deviceId);

            if (device.Traits.Any(x => x.Trait == viewModel.Trait))
            {
                ModelState.AddModelError("Trait", "Device already contains trait");
            }

            if (!ModelState.IsValid)
            {
                return(RedirectToAction("Create", new { deviceId }));
            }

            // Set values
            var trait = new DeviceTrait
            {
                Trait      = viewModel.Trait,
                Attributes = !string.IsNullOrEmpty(viewModel.Attributes) ? JsonConvert.DeserializeObject <Dictionary <string, object> >(viewModel.Attributes, new ObjectDictionaryConverter()) : null,
                Commands   = !string.IsNullOrEmpty(viewModel.Commands) ? JsonConvert.DeserializeObject <Dictionary <string, IDictionary <string, string> > >(viewModel.Commands) : null,
                State      = !string.IsNullOrEmpty(viewModel.State) ? JsonConvert.DeserializeObject <Dictionary <string, DeviceState> >(viewModel.State) : null
            };

            device.Traits.Add(trait);

            // Save changes
            _deviceRepository.Persist();

            return(RedirectToAction("Edit", "Devices", new { deviceId }));
        }
Beispiel #3
0
        public IActionResult Create([Required] string deviceId, TraitViewModel viewModel)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.GetDetached(deviceId);

            if (device.Traits.Any(x => x.Trait == viewModel.Trait))
            {
                ModelState.AddModelError("Trait", "Device already contains trait");
            }

            // Set values
            var trait = new DeviceTrait
            {
                Trait      = viewModel.Trait,
                Attributes = !string.IsNullOrEmpty(viewModel.Attributes) ? JsonConvert.DeserializeObject <Dictionary <string, object> >(viewModel.Attributes, new ObjectDictionaryConverter()) : null,
                Commands   = !string.IsNullOrEmpty(viewModel.Commands) ? JsonConvert.DeserializeObject <Dictionary <string, IDictionary <string, string> > >(viewModel.Commands) : new Dictionary <string, IDictionary <string, string> >(),
                State      = !string.IsNullOrEmpty(viewModel.State) ? JsonConvert.DeserializeObject <Dictionary <string, DeviceState> >(viewModel.State) : null
            };

            // Handle any challenges
            switch (viewModel.ChallengeType)
            {
            case ChallengeType.Acknowledge:
                trait.Challenge = new AcknowledgeChallenge();
                break;

            case ChallengeType.Pin:
                trait.Challenge = new PinChallenge
                {
                    Pin = viewModel.ChallengePin
                };
                break;

            case ChallengeType.None:
            default:
                trait.Challenge = null;
                break;
            }

            // Final validation
            foreach (var error in DeviceTraitValidator.Validate(trait))
            {
                ModelState.AddModelError(string.Empty, error);
            }

            if (!ModelState.IsValid)
            {
                return(RedirectToAction("Create", new { deviceId }));
            }

            // Save changes
            device.Traits.Add(trait);
            _deviceRepository.Update(deviceId, device);

            return(RedirectToAction("Edit", "GoogleDevice", new { deviceId }));
        }
        public IActionResult Create([Required] string deviceId)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var model = new TraitViewModel();

            return(View(model));
        }
        public TraitViewModel GetOrAdd(string text)
        {
            var index = this.Collection.BinarySearch(text, StringComparer.Ordinal, vm => vm.Text);

            if (index < 0)
            {
                var viewModel = new TraitViewModel(text);
                this.Collection.Insert(~index, viewModel);
                return viewModel;
            }

            return this.Collection[index];
        }
Beispiel #6
0
        public IActionResult Edit([Required] string deviceId, [Required] string traitId)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.Get(deviceId);

            var traitEnumId = traitId.ToEnum <TraitType>();

            if (!device.Traits.Any(x => x.Trait == traitEnumId))
            {
                return(NotFound());
            }

            ViewBag.SupportedTraits = DeviceMetadata.SupportedTraits.TryGetValue(device.Type, out IList <TraitType> supportedDevices)
                ? supportedDevices.Select(x => new SelectListItem {
                Text = x.ToString(), Value = ((int)x).ToString(), Selected = traitEnumId == x
            })
                : Enumerable.Empty <SelectListItem>();

            // Get trait
            var trait = device.Traits.First(x => x.Trait == traitEnumId);
            var model = new TraitViewModel
            {
                Trait      = trait.Trait,
                Attributes = trait.Attributes != null?JsonConvert.SerializeObject(trait.Attributes, Formatting.Indented) : null,
                                 Commands                         = trait.Commands != null?JsonConvert.SerializeObject(trait.Commands, Formatting.Indented) : null,
                                                            State = trait.State != null?JsonConvert.SerializeObject(trait.State, Formatting.Indented) : null
            };

            // Handle any challenges
            switch (trait.Challenge)
            {
            case AcknowledgeChallenge ackChallenge:
                model.ChallengeType = ChallengeType.Acknowledge;
                break;

            case PinChallenge pinChallenge:
                model.ChallengeType = ChallengeType.Pin;
                model.ChallengePin  = pinChallenge.Pin;
                break;

            default:
                model.ChallengeType = ChallengeType.None;
                break;
            }

            return(View(model));
        }
        public TraitElementControl(User user, TraitViewModel model, TraitCategoryType categoryType)
        {
            this.Model = model;
            DataContext = model;
            InitializeComponent();
            txtValue.BindUser(user, PickListType.DistinctTraitList, model.Name, categoryType);
            if (!String.IsNullOrEmpty(model.Comment)) {
                commentLink.Inlines.Clear();
                commentLink.Inlines.Add(new Run("Edit comment"));
            }

            Model.DataChanged += new DataChangedHandler((vm) => {
                FireTraitChanged();
            });
        }
        public ActionResult Details(int?id)
        {
            if (!id.HasValue)
            {
                return(RedirectToAction("Index"));
            }
            var genus          = m_repo.GetGenus(id.Value);
            var traitViewModel = new TraitViewModel
            {
                Genus            = genus,
                RetiredQuestions = genus.Questions.Where(t => t.Retired == true).OrderBy(t => t.Order),
                ActiveQuestions  = genus.Questions.Where(t => t.Retired == false).OrderBy(t => t.Order)
            };

            return(View(traitViewModel));
        }
Beispiel #9
0
        public IActionResult Edit([Required] string deviceId, [Required] string traitId)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.Get(deviceId);

            var traitEnumId = traitId.ToEnum <TraitType>();

            if (!device.Traits.Any(x => x.Trait == traitEnumId))
            {
                return(NotFound());
            }

            // Get trait
            var trait = device.Traits.First(x => x.Trait == traitEnumId);
            var model = new TraitViewModel
            {
                Trait      = trait.Trait,
                Attributes = trait.Attributes != null?JsonConvert.SerializeObject(trait.Attributes, Formatting.Indented) : null,
                                 Commands                         = trait.Commands != null?JsonConvert.SerializeObject(trait.Commands, Formatting.Indented) : null,
                                                            State = trait.State != null?JsonConvert.SerializeObject(trait.State, Formatting.Indented) : null
            };

            // Handle any challenges
            switch (trait.Challenge)
            {
            case AcknowledgeChallenge ackChallenge:
                model.ChallengeType = ChallengeType.Acknowledge;
                break;

            case PinChallenge pinChallenge:
                model.ChallengeType = ChallengeType.Pin;
                model.ChallengePin  = pinChallenge.Pin;
                break;

            default:
                model.ChallengeType = ChallengeType.None;
                break;
            }

            return(View(model));
        }
Beispiel #10
0
        public IActionResult Create([Required] string deviceId)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.Get(deviceId);

            ViewBag.SupportedTraits = DeviceMetadata.SupportedTraits.TryGetValue(device.Type, out IList <TraitType> supportedDevices)
                ? supportedDevices.Select(x => new SelectListItem {
                Text = x.ToString(), Value = ((int)x).ToString()
            })
                : Enumerable.Empty <SelectListItem>();

            var model = new TraitViewModel();

            return(View(model));
        }
        public IActionResult Edit([Required] string deviceId, [Required] string traitId, TraitViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                return(RedirectToAction("Edit", new { deviceId, traitId }));
            }

            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.Get(deviceId);

            var traitEnumId = traitId.ToEnum <TraitType>();

            if (!device.Traits.Any(x => x.Trait == traitEnumId))
            {
                return(NotFound());
            }

            // Lock the trait type just in case
            viewModel.Trait = traitEnumId;

            // Set new values
            var trait = device.Traits.FirstOrDefault(x => x.Trait == traitEnumId);

            trait.Attributes = !string.IsNullOrEmpty(viewModel.Attributes) ? JsonConvert.DeserializeObject <Dictionary <string, object> >(viewModel.Attributes, new ObjectDictionaryConverter()) : null;
            trait.Commands   = !string.IsNullOrEmpty(viewModel.Commands) ? JsonConvert.DeserializeObject <Dictionary <string, IDictionary <string, string> > >(viewModel.Commands) : null;
            trait.State      = !string.IsNullOrEmpty(viewModel.State) ? JsonConvert.DeserializeObject <Dictionary <string, DeviceState> >(viewModel.State) : null;

            // Save changes
            _deviceRepository.Persist();

            return(RedirectToAction("Edit", "Devices", new { deviceId }));
        }
Beispiel #12
0
        public IActionResult Edit([Required] string deviceId, [Required] string traitId, TraitViewModel viewModel)
        {
            if (!_deviceRepository.Contains(deviceId))
            {
                return(NotFound());
            }

            var device = _deviceRepository.GetDetached(deviceId);

            var traitEnumId = traitId.ToEnum <TraitType>();

            if (!device.Traits.Any(x => x.Trait == traitEnumId))
            {
                return(NotFound());
            }

            // Lock the trait type just in case
            viewModel.Trait = traitEnumId;

            if (DeviceMetadata.SupportedTraits.TryGetValue(device.Type, out IList <TraitType> supportedTraits) && !supportedTraits.Contains(viewModel.Trait))
            {
                ModelState.AddModelError("Trait", "Device does not support trait type");
            }

            // Set new values
            var trait = device.Traits.FirstOrDefault(x => x.Trait == traitEnumId);

            trait.Attributes = !string.IsNullOrEmpty(viewModel.Attributes) ? JsonConvert.DeserializeObject <Dictionary <string, object> >(viewModel.Attributes, new ObjectDictionaryConverter()) : null;
            trait.Commands   = !string.IsNullOrEmpty(viewModel.Commands) ? JsonConvert.DeserializeObject <Dictionary <string, IDictionary <string, string> > >(viewModel.Commands) : null;
            trait.State      = !string.IsNullOrEmpty(viewModel.State) ? JsonConvert.DeserializeObject <Dictionary <string, DeviceState> >(viewModel.State) : null;

            // Handle any challenges
            switch (viewModel.ChallengeType)
            {
            case ChallengeType.Acknowledge:
                trait.Challenge = new AcknowledgeChallenge();
                break;

            case ChallengeType.Pin:
                trait.Challenge = new PinChallenge
                {
                    Pin = viewModel.ChallengePin
                };
                break;

            case ChallengeType.None:
            default:
                trait.Challenge = null;
                break;
            }

            // Final validation
            foreach (var error in DeviceTraitValidator.Validate(trait))
            {
                ModelState.AddModelError(string.Empty, error);
            }

            if (!ModelState.IsValid)
            {
                return(RedirectToAction("Edit", new { deviceId, traitId }));
            }

            // Save changes
            _deviceRepository.Update(deviceId, device);

            return(RedirectToAction("Edit", "GoogleDevice", new { deviceId }));
        }
Beispiel #13
0
 private void SelectTrait(TraitViewModel vm)
 {
     // find the trait editor for the selected trait...
     foreach (TraitElementControl ctl in traitsPanel.Children) {
         if (ctl.Model == vm) {
             if (!ctl.txtValue.IsLoaded) {
                 ctl.txtValue.txt.Loaded += new RoutedEventHandler((source, e) => {
                     Keyboard.Focus(ctl.txtValue.txt);
                 });
             } else {
                 Keyboard.Focus(ctl.txtValue.txt);
             }
             return;
         }
     }
 }
Beispiel #14
0
        private void AddTraitEditor(TraitViewModel model)
        {
            var itemControl = new TraitElementControl(User, model, TraitCategory);
            itemControl.TraitChanged += new TraitElementControl.TraitEventHandler((source, trait) => {
                RegisterUniquePendingChange(new UpdateTraitDatabaseCommand(trait.Model, Owner));
            });

            itemControl.TraitDeleted += new TraitElementControl.TraitEventHandler((source, trait) => {
                _model.Remove(trait);
                ReloadTraitPanel();
                RegisterPendingChange(new DeleteTraitDatabaseCommand(trait.Model, Owner));
            });

            itemControl.IsReadOnly = this.IsReadOnly;

            traitsPanel.Children.Add(itemControl);
        }
Beispiel #15
0
        private void AddNewTrait()
        {
            var service = new SupportService(User);

            List<String> traitTypes = service.GetTraitNamesForCategory(TraitCategory.ToString());

            var picklist = new PickListWindow(User, "Choose a trait type...", () => {
                return traitTypes;
            }, (text) => {
                traitTypes.Add(text);
                return true;
            });

            picklist.Owner = this.FindParentWindow();
            if (picklist.ShowDialog().ValueOrFalse()) {

                var existing = FindTraitByName(picklist.SelectedValue as string);
                if (existing == null) {
                    Trait t = new Trait();
                    t.TraitID = -1;
                    t.Value = "<New Trait Value>";
                    t.Category = TraitCategory.ToString();
                    t.IntraCatID = Owner.ObjectID.Value;
                    t.Name = picklist.SelectedValue as string;

                    TraitViewModel viewModel = new TraitViewModel(t);
                    _model.Add(viewModel);
                    RegisterUniquePendingChange(new UpdateTraitDatabaseCommand(t, Owner));
                    ReloadTraitPanel();

                    SelectTrait(viewModel);
                } else {
                    SelectTrait(existing);
                }
            }
        }