Beispiel #1
0
        public async Task <IActionResult> Create()
        {
            var site = await GetCurrentSiteAsync();

            var siteUrl = await _siteService.GetBaseUrl(Request.Scheme, Request.Host.Value);

            var viewModel = new TriggersDetailViewModel
            {
                Action           = "Create",
                IsSecretCode     = true,
                BadgeMakerUrl    = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker    = true,
                EditAvatarBundle = UserHasPermission(Permission.ManageAvatars),
                EditMail         = UserHasPermission(Permission.ManageTriggerMail),
                EditVendorCode   = UserHasPermission(Permission.ManageVendorCodes),
                SystemList       = new SelectList((await _siteService.GetSystemList()), "Id", "Name"),
                BranchList       = new SelectList((await _siteService.GetAllBranches()), "Id", "Name"),
                ProgramList      = new SelectList((await _siteService.GetProgramList()), "Id", "Name")
            };

            if (viewModel.EditVendorCode)
            {
                viewModel.VendorCodeTypeList = new SelectList(
                    (await _vendorCodeService.GetTypeAllAsync()), "Id", "Description");
            }
            if (viewModel.EditAvatarBundle)
            {
                viewModel.UnlockableAvatarBundleList = new SelectList(
                    await _dynamicAvatarService.GetAllBundlesAsync(true), "Id", "Name");
            }

            PageTitle = "Create Trigger";
            return(View("Detail", viewModel));
        }
Beispiel #2
0
        public async Task <IActionResult> Edit(int id)
        {
            var trigger = await _triggerService.GetByIdAsync(id);

            var site = await GetCurrentSiteAsync();

            var siteUrl = await _siteService.GetBaseUrl(Request.Scheme, Request.Host.Value);

            TriggersDetailViewModel viewModel = new TriggersDetailViewModel()
            {
                Trigger             = trigger,
                Action              = "Edit",
                IsSecretCode        = !string.IsNullOrWhiteSpace(trigger.SecretCode),
                BadgeMakerUrl       = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker       = true,
                DependentTriggers   = await _triggerService.GetDependentsAsync(trigger.AwardBadgeId),
                TriggerRequirements = await _triggerService.GetTriggerRequirementsAsync(trigger),
                BadgeRequiredList   = string.Join("", trigger.BadgeIds
                                                  .Select(_ => "<" + _.ToString() + ">")),
                ChallengeRequiredList = string.Join("", trigger.ChallengeIds
                                                    .Select(_ => "<" + _.ToString() + ">")),
                SystemList         = new SelectList((await _siteService.GetSystemList()), "Id", "Name"),
                BranchList         = new SelectList((await _siteService.GetAllBranches()), "Id", "Name"),
                ProgramList        = new SelectList((await _siteService.GetProgramList()), "Id", "Name"),
                VendorCodeTypeList = new SelectList(
                    (await _vendorCodeService.GetTypeAllAsync()), "Id", "Name")
            };

            foreach (var requirement in viewModel.TriggerRequirements)
            {
                if (!string.IsNullOrWhiteSpace(requirement.BadgePath))
                {
                    requirement.BadgePath = _pathResolver.ResolveContentPath(requirement.BadgePath);
                }
            }
            if (!string.IsNullOrWhiteSpace(viewModel.Trigger.AwardBadgeFilename))
            {
                viewModel.BadgePath = _pathResolver.ResolveContentPath(viewModel.Trigger.AwardBadgeFilename);
            }
            PageTitle = $"Edit Trigger - {viewModel.Trigger.Name}";
            return(View("Detail", viewModel));
        }
Beispiel #3
0
        public async Task <IActionResult> Create()
        {
            var site = await GetCurrentSiteAsync();

            var siteUrl = await _siteService.GetBaseUrl(Request.Scheme, Request.Host.Value);

            TriggersDetailViewModel viewModel = new TriggersDetailViewModel()
            {
                Action             = "Create",
                IsSecretCode       = true,
                BadgeMakerUrl      = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker      = true,
                SystemList         = new SelectList((await _siteService.GetSystemList()), "Id", "Name"),
                BranchList         = new SelectList((await _siteService.GetAllBranches()), "Id", "Name"),
                ProgramList        = new SelectList((await _siteService.GetProgramList()), "Id", "Name"),
                VendorCodeTypeList = new SelectList(
                    (await _vendorCodeService.GetTypeAllAsync()), "Id", "Name")
            };

            PageTitle = "Create Trigger";
            return(View("Detail", viewModel));
        }
Beispiel #4
0
        public async Task <IActionResult> Edit(TriggersDetailViewModel model)
        {
            byte[] badgeBytes = null;

            var badgeRequiredList     = new List <int>();
            var challengeRequiredList = new List <int>();

            model.IgnorePointLimits = UserHasPermission(Permission.IgnorePointLimits);
            model.MaxPointLimit     =
                await _triggerService.GetMaximumAllowedPointsAsync(GetCurrentSiteId());

            if (!model.IgnorePointLimits &&
                model.MaxPointLimit.HasValue &&
                model.Trigger.AwardPoints > model.MaxPointLimit)
            {
                ModelState.AddModelError("Trigger.AwardPoints",
                                         $"You may award up to {model.MaxPointLimit} points.");
            }
            if (!string.IsNullOrWhiteSpace(model.BadgeRequiredList))
            {
                badgeRequiredList = model.BadgeRequiredList
                                    .Split(',')
                                    .Where(_ => !string.IsNullOrWhiteSpace(_))
                                    .Select(int.Parse)
                                    .ToList();
            }
            if (!string.IsNullOrWhiteSpace(model.ChallengeRequiredList))
            {
                challengeRequiredList = model.ChallengeRequiredList
                                        .Split(',')
                                        .Where(_ => !string.IsNullOrWhiteSpace(_))
                                        .Select(int.Parse)
                                        .ToList();
            }
            var requirementCount = badgeRequiredList.Count + challengeRequiredList.Count;

            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker))
            {
                if (!ValidImageExtensions.Contains(
                        Path.GetExtension(model.BadgeUploadImage.FileName).ToLowerInvariant()))
                {
                    ModelState.AddModelError("BadgeUploadImage", $"Image must be one of the following types: {string.Join(", ", ValidImageExtensions)}");
                }
                if (model.BadgeUploadImage != null)
                {
                    try
                    {
                        using (var ms = new MemoryStream())
                        {
                            await model.BadgeUploadImage.CopyToAsync(ms);

                            badgeBytes = ms.ToArray();
                        }
                        await _badgeService.ValidateBadgeImageAsync(badgeBytes);
                    }
                    catch (GraException gex)
                    {
                        ModelState.AddModelError("BadgeUploadImage", gex.Message);
                    }
                }
            }
            if (string.IsNullOrWhiteSpace(model.BadgeAltText))
            {
                ModelState.AddModelError("BadgeAltText", "The badge's alternative text is required.");
            }

            if (!model.IsSecretCode)
            {
                if ((!model.Trigger.Points.HasValue || model.Trigger.Points < 1) &&
                    requirementCount < 1)
                {
                    ModelState.AddModelError("TriggerRequirements", "Points or a Challenge/Trigger item is required.");
                }
                else if ((!model.Trigger.ItemsRequired.HasValue || model.Trigger.ItemsRequired < 1) &&
                         requirementCount >= 1)
                {
                    ModelState.AddModelError("Trigger.ItemsRequired", "Please enter how many of the Challenge/Trigger item are required.");
                }
                else if (model.Trigger.ItemsRequired > requirementCount)
                {
                    ModelState.AddModelError("Trigger.ItemsRequired", "Items Required can not be greater than the number of Challenge/Trigger items.");
                }
            }
            else if (string.IsNullOrWhiteSpace(model.Trigger.SecretCode))
            {
                ModelState.AddModelError("Trigger.SecretCode", "The Secret Code field is required.");
            }
            else if (await _triggerService.CodeExistsAsync(model.Trigger.SecretCode, model.Trigger.Id))
            {
                ModelState.AddModelError("Trigger.SecretCode", "That Secret Code already exists.");
            }
            if (model.AwardsPrize && string.IsNullOrWhiteSpace(model.Trigger.AwardPrizeName))
            {
                ModelState.AddModelError("Trigger.AwardPrizeName", "The Prize Name field is required.");
            }
            if (model.AwardsMail)
            {
                if (string.IsNullOrWhiteSpace(model.Trigger.AwardMailSubject))
                {
                    ModelState.AddModelError("Trigger.AwardMailSubject", "The Mail Subject field is required.");
                }
                if (string.IsNullOrWhiteSpace(model.Trigger.AwardMail))
                {
                    ModelState.AddModelError("Trigger.AwardMail", "The Mail Message field is required.");
                }
            }
            if (ModelState.IsValid)
            {
                try
                {
                    if (model.IsSecretCode)
                    {
                        model.Trigger.Points           = null;
                        model.Trigger.ItemsRequired    = null;
                        model.Trigger.LimitToSystemId  = null;
                        model.Trigger.LimitToBranchId  = null;
                        model.Trigger.LimitToProgramId = null;
                        model.Trigger.SecretCode       = model
                                                         .Trigger
                                                         .SecretCode
                                                         .Trim()
                                                         .ToLowerInvariant();
                        model.Trigger.BadgeIds     = new List <int>();
                        model.Trigger.ChallengeIds = new List <int>();
                    }
                    else
                    {
                        model.Trigger.SecretCode   = null;
                        model.Trigger.BadgeIds     = badgeRequiredList;
                        model.Trigger.ChallengeIds = challengeRequiredList;
                    }
                    if (!model.AwardsPrize)
                    {
                        model.Trigger.AwardPrizeName = "";
                        model.Trigger.AwardPrizeRedemptionInstructions = "";
                    }
                    if (!model.AwardsMail)
                    {
                        model.Trigger.AwardMailSubject = "";
                        model.Trigger.AwardMail        = "";
                    }
                    var existing = await _badgeService
                                   .GetByIdAsync(model.Trigger.AwardBadgeId);

                    string fileName;
                    if (model.BadgeUploadImage != null ||
                        !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                    {
                        if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                            (model.BadgeUploadImage == null || model.UseBadgeMaker))
                        {
                            var badgeString = model.BadgeMakerImage.Split(',').Last();
                            badgeBytes = Convert.FromBase64String(badgeString);
                            fileName   = "badge.png";
                        }
                        else
                        {
                            if (badgeBytes == null)
                            {
                                using (var ms = new MemoryStream())
                                {
                                    await model.BadgeUploadImage.CopyToAsync(ms);

                                    badgeBytes = ms.ToArray();
                                }
                            }
                            fileName = Path.GetFileName(model.BadgeUploadImage.FileName);
                        }
                        if (model.Trigger.AwardBadgeId == null)
                        {
                            var newBadge = new Badge
                            {
                                Filename = fileName,
                                AltText  = model.BadgeAltText
                            };
                            var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                            model.Trigger.AwardBadgeId = badge.Id;
                        }
                        else
                        {
                            if (!string.Equals(existing.AltText, model.BadgeAltText,
                                               StringComparison.OrdinalIgnoreCase))
                            {
                                existing.AltText = model.BadgeAltText;
                                await _badgeService.ReplaceBadgeFileAsync(existing, null, null);
                            }
                            existing.Filename = Path.GetFileName(model.BadgePath);
                            existing.AltText  = model.BadgeAltText;
                            await _badgeService.ReplaceBadgeFileAsync(existing,
                                                                      badgeBytes,
                                                                      fileName);
                        }
                    }
                    else if (!string.Equals(existing.AltText, model.BadgeAltText,
                                            StringComparison.OrdinalIgnoreCase))
                    {
                        existing.AltText = model.BadgeAltText;
                        await _badgeService.ReplaceBadgeFileAsync(existing, null, null);
                    }
                    var savedtrigger = await _triggerService.UpdateAsync(model.Trigger);

                    ShowAlertSuccess($"Trigger '<strong>{savedtrigger.Name}</strong>' was successfully modified");
                    return(RedirectToAction("Index"));
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to edit trigger: ", gex.Message);
                }
            }

            model.Action            = "Edit";
            model.DependentTriggers = await _triggerService.GetDependentsAsync(model.Trigger.Id);

            model.SystemList = new SelectList(await _siteService.GetSystemList(), "Id", "Name");
            if (model.Trigger.LimitToSystemId.HasValue)
            {
                model.BranchList = new SelectList(
                    await _siteService.GetBranches(model.Trigger.LimitToSystemId.Value), "Id", "Name");
            }
            else
            {
                model.BranchList = new SelectList(await _siteService.GetAllBranches(), "Id", "Name");
            }
            model.ProgramList         = new SelectList(await _siteService.GetProgramList(), "Id", "Name");
            model.TriggerRequirements = await _triggerService
                                        .GetRequirementsByIdsAsync(badgeRequiredList, challengeRequiredList);

            foreach (var requirement in model.TriggerRequirements)
            {
                requirement.BadgePath = _pathResolver.ResolveContentPath(requirement.BadgePath);
            }

            if (model.EditVendorCode)
            {
                model.VendorCodeTypeList = new SelectList(
                    await _vendorCodeService.GetTypeAllAsync(), "Id", "Description");
            }
            else if (model.Trigger.AwardVendorCodeTypeId.HasValue)
            {
                model.VendorCodeType = (await _vendorCodeService
                                        .GetTypeById(model.Trigger.AwardVendorCodeTypeId.Value)).Description;
            }

            if (model.EditAvatarBundle)
            {
                model.UnlockableAvatarBundleList = new SelectList(
                    await _avatarService.GetAllBundlesAsync(true), "Id", "Name");
            }
            else if (model.Trigger.AwardAvatarBundleId.HasValue)
            {
                model.UnlockableAvatarBundle = (await _avatarService
                                                .GetBundleByIdAsync(model.Trigger.AwardAvatarBundleId.Value)).Name;
            }

            if (model.MaxPointLimit.HasValue)
            {
                model.MaxPointsMessage = $"(Up to {model.MaxPointLimit.Value} points)";

                var currentTrigger = await _triggerService.GetByIdAsync(model.Trigger.Id);

                if (currentTrigger.AwardPoints > model.MaxPointLimit.Value)
                {
                    model.MaxPointsWarningMessage = $"This Trigger exceeds the maximum of {model.MaxPointLimit.Value} points per required task. Only Administrators can edit the points awarded.";
                }
            }

            PageTitle = $"Edit Trigger - {model.Trigger.Name}";
            return(View("Detail", model));
        }
Beispiel #5
0
        public async Task <IActionResult> Edit(int id)
        {
            var trigger = await _triggerService.GetByIdAsync(id);

            if (trigger == null)
            {
                ShowAlertWarning($"Could not find trigger id {id}, possibly it has been deleted.");
                return(RedirectToAction("Index"));
            }
            var site = await GetCurrentSiteAsync();

            var siteUrl = await _siteService.GetBaseUrl(Request.Scheme, Request.Host.Value);

            var badge = await _badgeService.GetByIdAsync(trigger.AwardBadgeId);

            var viewModel = new TriggersDetailViewModel
            {
                Trigger             = trigger,
                CreatedByName       = await _userService.GetUsersNameByIdAsync(trigger.CreatedBy),
                CanViewParticipants = UserHasPermission(Permission.ViewParticipantDetails),
                Action                = "Edit",
                IsSecretCode          = !string.IsNullOrWhiteSpace(trigger.SecretCode),
                BadgeMakerUrl         = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker         = true,
                EditAvatarBundle      = UserHasPermission(Permission.ManageAvatars),
                EditMail              = UserHasPermission(Permission.ManageTriggerMail),
                EditVendorCode        = UserHasPermission(Permission.ManageVendorCodes),
                AwardsMail            = !string.IsNullOrWhiteSpace(trigger.AwardMailSubject),
                AwardsPrize           = !string.IsNullOrWhiteSpace(trigger.AwardPrizeName),
                DependentTriggers     = await _triggerService.GetDependentsAsync(trigger.AwardBadgeId),
                TriggerRequirements   = await _triggerService.GetTriggerRequirementsAsync(trigger),
                BadgeRequiredList     = string.Join(",", trigger.BadgeIds),
                ChallengeRequiredList = string.Join(",", trigger.ChallengeIds),
                SystemList            = new SelectList(await _siteService.GetSystemList(), "Id", "Name"),
                ProgramList           = new SelectList(await _siteService.GetProgramList(), "Id", "Name"),
                IgnorePointLimits     = UserHasPermission(Permission.IgnorePointLimits),
                MaxPointLimit         =
                    await _triggerService.GetMaximumAllowedPointsAsync(GetCurrentSiteId()),
                BadgeAltText = badge.AltText
            };

            if (viewModel?.MaxPointLimit != null)
            {
                viewModel.MaxPointsMessage = $"(Up to {viewModel.MaxPointLimit.Value} points)";
            }
            if (trigger.AwardPoints > viewModel.MaxPointLimit)
            {
                viewModel.MaxPointsWarningMessage = $"This Trigger exceeds the maximum of {viewModel.MaxPointLimit.Value} points per required task. Only Administrators can edit the points awarded.";
            }
            if (viewModel.EditVendorCode)
            {
                viewModel.VendorCodeTypeList = new SelectList(
                    await _vendorCodeService.GetTypeAllAsync(), "Id", "Description");
            }
            else if (viewModel.Trigger.AwardVendorCodeTypeId.HasValue)
            {
                viewModel.VendorCodeType = (await _vendorCodeService
                                            .GetTypeById(viewModel.Trigger.AwardVendorCodeTypeId.Value)).Description;
            }

            if (viewModel.EditAvatarBundle)
            {
                viewModel.UnlockableAvatarBundleList = new SelectList(
                    await _avatarService.GetAllBundlesAsync(true), "Id", "Name");
            }
            else if (viewModel.Trigger.AwardAvatarBundleId.HasValue)
            {
                viewModel.UnlockableAvatarBundle = (await _avatarService
                                                    .GetBundleByIdAsync(viewModel.Trigger.AwardAvatarBundleId.Value)).Name;
            }

            if (viewModel.Trigger.LimitToSystemId.HasValue)
            {
                viewModel.BranchList = new SelectList(
                    await _siteService.GetBranches(viewModel.Trigger.LimitToSystemId.Value), "Id", "Name");
            }
            else
            {
                viewModel.BranchList = new SelectList(await _siteService.GetAllBranches(), "Id", "Name");
            }
            foreach (var requirement in viewModel.TriggerRequirements)
            {
                if (!string.IsNullOrWhiteSpace(requirement.BadgePath))
                {
                    requirement.BadgePath = _pathResolver.ResolveContentPath(requirement.BadgePath);
                }
            }
            if (!string.IsNullOrWhiteSpace(viewModel.Trigger.AwardBadgeFilename))
            {
                viewModel.BadgePath = _pathResolver.ResolveContentPath(viewModel.Trigger.AwardBadgeFilename);
            }
            if (UserHasPermission(Permission.ManageEvents))
            {
                viewModel.RelatedEvents = await _eventService.GetRelatedEventsForTriggerAsync(id);
            }
            PageTitle = $"Edit Trigger - {viewModel.Trigger.Name}";
            return(View("Detail", viewModel));
        }
Beispiel #6
0
        public async Task <IActionResult> Edit(TriggersDetailViewModel model)
        {
            List <int> badgeRequiredList     = new List <int>();
            List <int> challengeRequiredList = new List <int>();

            if (!string.IsNullOrWhiteSpace(model.BadgeRequiredList))
            {
                badgeRequiredList = model.BadgeRequiredList
                                    .Replace("<", "")
                                    .Split('>')
                                    .Where(_ => !string.IsNullOrWhiteSpace(_))
                                    .Select(Int32.Parse)
                                    .ToList();
            }
            if (!string.IsNullOrWhiteSpace(model.ChallengeRequiredList))
            {
                challengeRequiredList = model.ChallengeRequiredList
                                        .Replace("<", "")
                                        .Split('>')
                                        .Where(_ => !string.IsNullOrWhiteSpace(_))
                                        .Select(Int32.Parse)
                                        .ToList();
            }
            var requirementCount = badgeRequiredList.Count + challengeRequiredList.Count;

            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker) &&
                (Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpg" &&
                 Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpeg" &&
                 Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".png"))
            {
                ModelState.AddModelError("BadgeImage", "Please use a .jpg or .png image.");
            }

            if (!model.IsSecretCode)
            {
                if ((!model.Trigger.Points.HasValue || model.Trigger.Points < 1) &&
                    requirementCount < 1)
                {
                    ModelState.AddModelError("TriggerRequirements", "Points or a Challenge/Trigger item is required.");
                }
                else if ((!model.Trigger.ItemsRequired.HasValue || model.Trigger.ItemsRequired < 1) &&
                         requirementCount >= 1)
                {
                    ModelState.AddModelError("Trigger.ItemsRequired", "Please enter how many of the Challenge/Trigger item are required.");
                }
                else if (model.Trigger.ItemsRequired > requirementCount)
                {
                    ModelState.AddModelError("Trigger.ItemsRequired", "Items Required can not be greater than the number of Challenge/Trigger items.");
                }
            }
            else if (string.IsNullOrWhiteSpace(model.Trigger.SecretCode))
            {
                ModelState.AddModelError("Trigger.SecretCode", "The Secret Code field is required.");
            }
            else if (await _triggerService.CodeExistsAsync(model.Trigger.SecretCode, model.Trigger.Id))
            {
                ModelState.AddModelError("Trigger.SecretCode", "That Secret Code already exists.");
            }
            if (ModelState.IsValid)
            {
                try
                {
                    if (model.IsSecretCode)
                    {
                        model.Trigger.Points           = null;
                        model.Trigger.ItemsRequired    = null;
                        model.Trigger.LimitToSystemId  = null;
                        model.Trigger.LimitToBranchId  = null;
                        model.Trigger.LimitToProgramId = null;
                        model.Trigger.SecretCode       = model.Trigger.SecretCode.Trim().ToLower();
                        model.Trigger.BadgeIds         = new List <int>();
                        model.Trigger.ChallengeIds     = new List <int>();
                    }
                    else
                    {
                        model.Trigger.SecretCode   = null;
                        model.Trigger.BadgeIds     = badgeRequiredList;
                        model.Trigger.ChallengeIds = challengeRequiredList;
                    }
                    if (model.BadgeUploadImage != null ||
                        !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                    {
                        byte[] badgeBytes;
                        string filename;
                        if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                            (model.BadgeUploadImage != null || model.UseBadgeMaker))
                        {
                            var badgeString = model.BadgeMakerImage.Split(',').Last();
                            badgeBytes = Convert.FromBase64String(badgeString);
                            filename   = "badge.png";
                        }
                        else
                        {
                            using (var fileStream = model.BadgeUploadImage.OpenReadStream())
                            {
                                using (var ms = new MemoryStream())
                                {
                                    fileStream.CopyTo(ms);
                                    badgeBytes = ms.ToArray();
                                }
                            }
                            filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                        }
                        var existing = await _badgeService
                                       .GetByIdAsync(model.Trigger.AwardBadgeId);

                        existing.Filename = Path.GetFileName(model.BadgePath);
                        await _badgeService.ReplaceBadgeFileAsync(existing, badgeBytes);
                    }
                    var savedtrigger = await _triggerService.UpdateAsync(model.Trigger);

                    ShowAlertSuccess($"Trigger '<strong>{savedtrigger.Name}</strong>' was successfully modified");
                    return(RedirectToAction("Index"));
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to edit trigger: ", gex.Message);
                }
            }

            model.Action            = "Edit";
            model.DependentTriggers = await _triggerService.GetDependentsAsync(model.Trigger.Id);

            model.SystemList = new SelectList((await _siteService.GetSystemList()), "Id", "Name");
            if (model.Trigger.LimitToSystemId.HasValue)
            {
                model.BranchList = new SelectList(
                    (await _siteService.GetBranches(model.Trigger.LimitToSystemId.Value)), "Id", "Name");
            }
            else
            {
                model.BranchList = new SelectList((await _siteService.GetAllBranches()), "Id", "Name");
            }
            model.ProgramList        = new SelectList((await _siteService.GetProgramList()), "Id", "Name");
            model.VendorCodeTypeList = new SelectList(
                (await _vendorCodeService.GetTypeAllAsync()), "Id", "Name");
            model.TriggerRequirements = await _triggerService
                                        .GetRequirementsByIdsAsync(badgeRequiredList, challengeRequiredList);

            foreach (var requirement in model.TriggerRequirements)
            {
                requirement.BadgePath = _pathResolver.ResolveContentPath(requirement.BadgePath);
            }
            PageTitle = $"Edit Trigger - {model.Trigger.Name}";
            return(View("Detail", model));
        }
Beispiel #7
0
        public async Task <IActionResult> Edit(int id)
        {
            var trigger = await _triggerService.GetByIdAsync(id);

            var site = await GetCurrentSiteAsync();

            var siteUrl = await _siteService.GetBaseUrl(Request.Scheme, Request.Host.Value);

            var viewModel = new TriggersDetailViewModel
            {
                Trigger               = trigger,
                Action                = "Edit",
                IsSecretCode          = !string.IsNullOrWhiteSpace(trigger.SecretCode),
                BadgeMakerUrl         = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker         = true,
                EditAvatarBundle      = UserHasPermission(Permission.ManageAvatars),
                EditMail              = UserHasPermission(Permission.ManageTriggerMail),
                EditVendorCode        = UserHasPermission(Permission.ManageVendorCodes),
                AwardsMail            = !string.IsNullOrWhiteSpace(trigger.AwardMailSubject),
                AwardsPrize           = !string.IsNullOrWhiteSpace(trigger.AwardPrizeName),
                DependentTriggers     = await _triggerService.GetDependentsAsync(trigger.AwardBadgeId),
                TriggerRequirements   = await _triggerService.GetTriggerRequirementsAsync(trigger),
                BadgeRequiredList     = string.Join(",", trigger.BadgeIds),
                ChallengeRequiredList = string.Join(",", trigger.ChallengeIds),
                SystemList            = new SelectList((await _siteService.GetSystemList()), "Id", "Name"),
                ProgramList           = new SelectList((await _siteService.GetProgramList()), "Id", "Name")
            };

            if (viewModel.EditVendorCode)
            {
                viewModel.VendorCodeTypeList = new SelectList(
                    (await _vendorCodeService.GetTypeAllAsync()), "Id", "Description");
            }
            else if (viewModel.Trigger.AwardVendorCodeTypeId.HasValue)
            {
                viewModel.VendorCodeType = (await _vendorCodeService
                                            .GetTypeById(viewModel.Trigger.AwardVendorCodeTypeId.Value)).Description;
            }

            if (viewModel.EditAvatarBundle)
            {
                viewModel.UnlockableAvatarBundleList = new SelectList(
                    await _dynamicAvatarService.GetAllBundlesAsync(true), "Id", "Name");
            }
            else if (viewModel.Trigger.AwardAvatarBundleId.HasValue)
            {
                viewModel.UnlockableAvatarBundle = (await _dynamicAvatarService
                                                    .GetBundleByIdAsync(viewModel.Trigger.AwardAvatarBundleId.Value)).Name;
            }

            if (viewModel.Trigger.LimitToSystemId.HasValue)
            {
                viewModel.BranchList = new SelectList(
                    (await _siteService.GetBranches(viewModel.Trigger.LimitToSystemId.Value)), "Id", "Name");
            }
            else
            {
                viewModel.BranchList = new SelectList((await _siteService.GetAllBranches()), "Id", "Name");
            }
            foreach (var requirement in viewModel.TriggerRequirements)
            {
                if (!string.IsNullOrWhiteSpace(requirement.BadgePath))
                {
                    requirement.BadgePath = _pathResolver.ResolveContentPath(requirement.BadgePath);
                }
            }
            if (!string.IsNullOrWhiteSpace(viewModel.Trigger.AwardBadgeFilename))
            {
                viewModel.BadgePath = _pathResolver.ResolveContentPath(viewModel.Trigger.AwardBadgeFilename);
            }

            if (UserHasPermission(Permission.ManageEvents))
            {
                viewModel.RelatedEvents = await _eventService.GetRelatedEventsForTriggerAsync(id);
            }
            PageTitle = $"Edit Trigger - {viewModel.Trigger.Name}";
            return(View("Detail", viewModel));
        }
Beispiel #8
0
        public async Task <IActionResult> Create(TriggersDetailViewModel model)
        {
            var badgeRequiredList     = new List <int>();
            var challengeRequiredList = new List <int>();

            if (!string.IsNullOrWhiteSpace(model.BadgeRequiredList))
            {
                badgeRequiredList = model.BadgeRequiredList
                                    .Split(',')
                                    .Where(_ => !string.IsNullOrWhiteSpace(_))
                                    .Select(int.Parse)
                                    .ToList();
            }
            if (!string.IsNullOrWhiteSpace(model.ChallengeRequiredList))
            {
                challengeRequiredList = model.ChallengeRequiredList
                                        .Split(',')
                                        .Where(_ => !string.IsNullOrWhiteSpace(_))
                                        .Select(int.Parse)
                                        .ToList();
            }
            var requirementCount = badgeRequiredList.Count + challengeRequiredList.Count;

            if (string.IsNullOrWhiteSpace(model.BadgeMakerImage) && model.BadgeUploadImage == null)
            {
                ModelState.AddModelError("BadgePath", "A badge is required.");
            }
            else if (model.BadgeUploadImage != null &&
                     (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker) &&
                     (Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpg" &&
                      Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpeg" &&
                      Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".png"))
            {
                ModelState.AddModelError("BadgeUploadImage", "Please use a .jpg or .png image.");
            }
            if (!model.IsSecretCode)
            {
                if ((!model.Trigger.Points.HasValue || model.Trigger.Points < 1) &&
                    requirementCount < 1)
                {
                    ModelState.AddModelError("TriggerRequirements", "Points or a Challenge/Trigger item is required.");
                }
                else if ((!model.Trigger.ItemsRequired.HasValue || model.Trigger.ItemsRequired < 1) &&
                         requirementCount >= 1)
                {
                    ModelState.AddModelError("Trigger.ItemsRequired", "Please enter how many of the Challenge/Trigger item are required.");
                }
                else if (model.Trigger.ItemsRequired > requirementCount)
                {
                    ModelState.AddModelError("Trigger.ItemsRequired", "Items Required can not be greater than the number of Challenge/Trigger items.");
                }
            }
            else if (string.IsNullOrWhiteSpace(model.Trigger.SecretCode))
            {
                ModelState.AddModelError("Trigger.SecretCode", "The Secret Code field is required.");
            }
            else if (await _triggerService.CodeExistsAsync(model.Trigger.SecretCode))
            {
                ModelState.AddModelError("Trigger.SecretCode", "That Secret Code already exists.");
            }

            if (model.AwardsPrize)
            {
                if (string.IsNullOrWhiteSpace(model.Trigger.AwardPrizeName))
                {
                    ModelState.AddModelError("Trigger.AwardPrizeName", "The Prize Name field is required.");
                }
            }
            if (model.AwardsMail)
            {
                if (string.IsNullOrWhiteSpace(model.Trigger.AwardMailSubject))
                {
                    ModelState.AddModelError("Trigger.AwardMailSubject", "The Mail Subject field is required.");
                }
                if (string.IsNullOrWhiteSpace(model.Trigger.AwardMail))
                {
                    ModelState.AddModelError("Trigger.AwardMail", "The Mail Message field is required.");
                }
            }

            if (ModelState.IsValid)
            {
                try
                {
                    if (model.IsSecretCode)
                    {
                        model.Trigger.Points           = null;
                        model.Trigger.ItemsRequired    = null;
                        model.Trigger.LimitToSystemId  = null;
                        model.Trigger.LimitToBranchId  = null;
                        model.Trigger.LimitToProgramId = null;
                        model.Trigger.SecretCode       = model.Trigger.SecretCode.Trim().ToLower();
                        model.Trigger.BadgeIds         = new List <int>();
                        model.Trigger.ChallengeIds     = new List <int>();
                    }
                    else
                    {
                        model.Trigger.SecretCode   = null;
                        model.Trigger.BadgeIds     = badgeRequiredList;
                        model.Trigger.ChallengeIds = challengeRequiredList;
                    }
                    if (!model.AwardsPrize)
                    {
                        model.Trigger.AwardPrizeName = "";
                        model.Trigger.AwardPrizeRedemptionInstructions = "";
                    }
                    if (!model.AwardsMail)
                    {
                        model.Trigger.AwardMailSubject = "";
                        model.Trigger.AwardMail        = "";
                    }

                    if (model.BadgeUploadImage != null ||
                        !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                    {
                        byte[] badgeBytes;
                        string filename;
                        if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                            (model.BadgeUploadImage == null || model.UseBadgeMaker))
                        {
                            var badgeString = model.BadgeMakerImage.Split(',').Last();
                            badgeBytes = Convert.FromBase64String(badgeString);
                            filename   = "badge.png";
                        }
                        else
                        {
                            using (var fileStream = model.BadgeUploadImage.OpenReadStream())
                            {
                                using (var ms = new MemoryStream())
                                {
                                    fileStream.CopyTo(ms);
                                    badgeBytes = ms.ToArray();
                                }
                            }
                            filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                        }
                        var newBadge = new Badge
                        {
                            Filename = filename
                        };
                        var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                        model.Trigger.AwardBadgeId = badge.Id;
                    }
                    var trigger = await _triggerService.AddAsync(model.Trigger);

                    ShowAlertSuccess($"Trigger '<strong>{trigger.Name}</strong>' was successfully created");
                    return(RedirectToAction("Index"));
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to add trigger: ", gex.Message);
                }
            }
            model.Action     = "Create";
            model.SystemList = new SelectList((await _siteService.GetSystemList()), "Id", "Name");
            if (model.Trigger.LimitToSystemId.HasValue)
            {
                model.BranchList = new SelectList(
                    (await _siteService.GetBranches(model.Trigger.LimitToSystemId.Value)), "Id", "Name");
            }
            else
            {
                model.BranchList = new SelectList((await _siteService.GetAllBranches()), "Id", "Name");
            }
            model.ProgramList         = new SelectList((await _siteService.GetProgramList()), "Id", "Name");
            model.TriggerRequirements = await _triggerService
                                        .GetRequirementsByIdsAsync(badgeRequiredList, challengeRequiredList);

            foreach (var requirement in model.TriggerRequirements)
            {
                requirement.BadgePath = _pathResolver.ResolveContentPath(requirement.BadgePath);
            }
            if (model.EditVendorCode)
            {
                model.VendorCodeTypeList = new SelectList(
                    (await _vendorCodeService.GetTypeAllAsync()), "Id", "Description");
            }
            if (model.EditAvatarBundle)
            {
                model.UnlockableAvatarBundleList = new SelectList(
                    await _dynamicAvatarService.GetAllBundlesAsync(true), "Id", "Name");
            }

            PageTitle = "Create Trigger";
            return(View("Detail", model));
        }