User Flag Expressions

Adds the ability to have expressions evaluated when flags are added and
removed.
This commit is contained in:
Gary Sharp
2016-11-09 20:06:24 +11:00
parent cbf16a41a6
commit 065b14b158
24 changed files with 1241 additions and 210 deletions
+7
View File
@@ -154,6 +154,10 @@
<Compile Include="Migrations\201609260741183_DBv17.Designer.cs">
<DependentUpon>201609260741183_DBv17.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\201611090729100_DBv18.cs" />
<Compile Include="Migrations\201611090729100_DBv18.Designer.cs">
<DependentUpon>201611090729100_DBv18.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\Configuration.cs" />
<Compile Include="Migrations\DiscoDataMigrator.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -220,6 +224,9 @@
<EmbeddedResource Include="Migrations\201609260741183_DBv17.resx">
<DependentUpon>201609260741183_DBv17.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Migrations\201611090729100_DBv18.resx">
<DependentUpon>201611090729100_DBv18.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
+27
View File
@@ -0,0 +1,27 @@
// <auto-generated />
namespace Disco.Data.Migrations
{
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
public sealed partial class DBv18 : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(DBv18));
string IMigrationMetadata.Id
{
get { return "201611090729100_DBv18"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}
@@ -0,0 +1,24 @@
namespace Disco.Data.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class DBv18 : DbMigration
{
public override void Up()
{
AddColumn("dbo.UserFlagAssignments", "OnAssignmentExpressionResult", c => c.String());
AddColumn("dbo.UserFlagAssignments", "OnUnassignmentExpressionResult", c => c.String());
AddColumn("dbo.UserFlags", "OnAssignmentExpression", c => c.String());
AddColumn("dbo.UserFlags", "OnUnassignmentExpression", c => c.String());
}
public override void Down()
{
DropColumn("dbo.UserFlags", "OnUnassignmentExpression");
DropColumn("dbo.UserFlags", "OnAssignmentExpression");
DropColumn("dbo.UserFlagAssignments", "OnUnassignmentExpressionResult");
DropColumn("dbo.UserFlagAssignments", "OnAssignmentExpressionResult");
}
}
}
File diff suppressed because one or more lines are too long
@@ -22,6 +22,11 @@ namespace Disco.Models.Repository
public string UsersLinkedGroup { get; set; }
public string UserDevicesLinkedGroup { get; set; }
[DataType(DataType.MultilineText)]
public string OnAssignmentExpression { get; set; }
[DataType(DataType.MultilineText)]
public string OnUnassignmentExpression { get; set; }
public virtual IList<UserFlagAssignment> UserFlagAssignments { get; set; }
public override string ToString()
@@ -22,6 +22,9 @@ namespace Disco.Models.Repository
public string Comments { get; set; }
public string OnAssignmentExpressionResult { get; set; }
public string OnUnassignmentExpressionResult { get; set; }
[ForeignKey("UserFlagId"), InverseProperty("UserFlagAssignments")]
public virtual UserFlag UserFlag { get; set; }
+1
View File
@@ -333,6 +333,7 @@
<Compile Include="Interop\ActiveDirectory\ADSite.cs" />
<Compile Include="Interop\ActiveDirectory\ADNetworkLogonDatesUpdateTask.cs" />
<Compile Include="Interop\ActiveDirectory\ADUserAccount.cs" />
<Compile Include="Interop\ActiveDirectory\ADUserAccountControlFlags.cs" />
<Compile Include="Interop\ActiveDirectory\Description.cs" />
<Compile Include="Interop\ActiveDirectory\IADObject.cs" />
<Compile Include="Interop\DiscoServices\DiscoServiceHelpers.cs" />
@@ -1,6 +1,8 @@
using Disco.Data.Repository;
using Disco.Models.Repository;
using Disco.Services.Authorization;
using Disco.Services.Expressions;
using Disco.Services.Logging;
using Disco.Services.Users;
using System;
using System.Linq;
@@ -32,13 +34,36 @@ namespace Disco.Services
return UserService.CurrentAuthorization.Has(Claims.User.Actions.RemoveFlags);
}
public static void OnRemove(this UserFlagAssignment fa, User Technician)
public static void OnRemove(this UserFlagAssignment fa, DiscoDataContext Database, User RemovingUser)
{
if (!fa.CanRemove())
throw new InvalidOperationException("Removing user flags is denied");
fa.OnRemoveUnsafe(Database, RemovingUser);
}
public static void OnRemoveUnsafe(this UserFlagAssignment fa, DiscoDataContext Database, User RemovingUser)
{
fa.RemovedDate = DateTime.Now;
fa.RemovedUserId = Technician.UserId;
fa.RemovedUserId = RemovingUser.UserId;
if (!string.IsNullOrWhiteSpace(fa.UserFlag.OnUnassignmentExpression))
{
try
{
Database.SaveChanges();
var expressionResult = fa.EvaluateOnUnassignmentExpression(Database, RemovingUser, fa.AddedDate);
if (!string.IsNullOrWhiteSpace(expressionResult))
{
fa.OnUnassignmentExpressionResult = expressionResult;
Database.SaveChanges();
}
}
catch (Exception ex)
{
SystemLog.LogException("User Flag Expression - OnUnassignmentExpression", ex);
}
}
}
#endregion
@@ -59,24 +84,116 @@ namespace Disco.Services
return true;
}
public static UserFlagAssignment OnAddUserFlag(this User u, DiscoDataContext Database, UserFlag flag, User Technician, string Comments)
public static UserFlagAssignment OnAddUserFlag(this User u, DiscoDataContext Database, UserFlag flag, User AddingUser, string Comments)
{
if (!u.CanAddUserFlag(flag))
throw new InvalidOperationException("Adding user flag is denied");
return u.OnAddUserFlagUnsafe(Database, flag, AddingUser, Comments);
}
public static UserFlagAssignment OnAddUserFlagUnsafe(this User u, DiscoDataContext Database, UserFlag flag, User AddingUser, string Comments)
{
var fa = new UserFlagAssignment()
{
UserFlagId = flag.Id,
UserId = u.UserId,
UserFlag = flag,
User = u,
AddedDate = DateTime.Now,
AddedUserId = Technician.UserId,
AddedUser = AddingUser,
Comments = string.IsNullOrWhiteSpace(Comments) ? null : Comments.Trim()
};
Database.UserFlagAssignments.Add(fa);
if (!string.IsNullOrWhiteSpace(flag.OnAssignmentExpression))
{
try
{
Database.SaveChanges();
fa = Database.UserFlagAssignments.Where(ufa => ufa.Id == fa.Id).First();
var expressionResult = fa.EvaluateOnAssignmentExpression(Database, AddingUser, fa.AddedDate);
if (!string.IsNullOrWhiteSpace(expressionResult))
{
fa.OnAssignmentExpressionResult = expressionResult;
Database.SaveChanges();
}
}
catch (Exception ex)
{
SystemLog.LogException("User Flag Expression - OnAssignmentExpression", ex);
}
}
return fa;
}
#endregion
#region Expressions
public static Expression OnAssignmentExpressionFromCache(this UserFlag uf)
{
return ExpressionCache.GetValue("UserFlag_OnAssignmentExpression", uf.Id.ToString(), () => { return Expression.TokenizeSingleDynamic(null, uf.OnAssignmentExpression, 0); });
}
public static void OnAssignmentExpressionInvalidateCache(this UserFlag uf)
{
ExpressionCache.InvalidateKey("UserFlag_OnAssignmentExpression", uf.Id.ToString());
}
public static string EvaluateOnAssignmentExpression(this UserFlagAssignment ufa, DiscoDataContext Database, User AddingUser, DateTime TimeStamp)
{
if (!string.IsNullOrEmpty(ufa.UserFlag.OnAssignmentExpression))
{
Expression compiledExpression = ufa.UserFlag.OnAssignmentExpressionFromCache();
System.Collections.IDictionary evaluatorVariables = Expression.StandardVariables(null, Database, AddingUser, TimeStamp, null);
try
{
object result = compiledExpression.EvaluateFirst<object>(ufa, evaluatorVariables);
if (result == null)
return null;
else
return result.ToString();
}
catch
{
throw;
}
}
return null;
}
public static Expression OnUnassignmentExpressionFromCache(this UserFlag uf)
{
return ExpressionCache.GetValue("UserFlag_OnUnassignmentExpression", uf.Id.ToString(), () => { return Expression.TokenizeSingleDynamic(null, uf.OnUnassignmentExpression, 0); });
}
public static void OnUnassignmentExpressionInvalidateCache(this UserFlag uf)
{
ExpressionCache.InvalidateKey("UserFlag_OnUnassignmentExpression", uf.Id.ToString());
}
public static string EvaluateOnUnassignmentExpression(this UserFlagAssignment ufa, DiscoDataContext Database, User RemovingUser, DateTime TimeStamp)
{
if (!string.IsNullOrEmpty(ufa.UserFlag.OnUnassignmentExpression))
{
Expression compiledExpression = ufa.UserFlag.OnUnassignmentExpressionFromCache();
System.Collections.IDictionary evaluatorVariables = Expression.StandardVariables(null, Database, RemovingUser, TimeStamp, null);
try
{
object result = compiledExpression.EvaluateFirst<object>(ufa, evaluatorVariables);
if (result == null)
return null;
else
return result.ToString();
}
catch
{
throw;
}
}
return null;
}
#endregion
}
}
@@ -146,17 +146,7 @@ namespace Disco.Services.Users.UserFlags
{
Status.UpdateStatus((chunkIndexOffset + index) * progressInterval, string.Format("Assigning Flag: {0}", user.ToString()));
var fa = new UserFlagAssignment()
{
UserFlagId = UserFlag.Id,
UserId = user.UserId,
AddedDate = DateTime.Now,
AddedUserId = Technician.UserId,
Comments = comments
};
Database.UserFlagAssignments.Add(fa);
return fa;
return user.OnAddUserFlag(Database, UserFlag, Technician, comments);
}).ToList();
// Save Chunk Items to Database
@@ -202,8 +192,7 @@ namespace Disco.Services.Users.UserFlags
{
Status.UpdateStatus((chunkIndexOffset + index) * progressInterval, string.Format("Removing Flag: {0}", flagAssignment.User.ToString()));
flagAssignment.RemovedDate = removedDateTime;
flagAssignment.RemovedUserId = Technician.UserId;
flagAssignment.OnRemoveUnsafe(Database, Technician);
return flagAssignment;
}).ToList();
@@ -223,17 +212,7 @@ namespace Disco.Services.Users.UserFlags
{
Status.UpdateStatus((chunkIndexOffset + index) * progressInterval, string.Format("Assigning Flag: {0}", user.ToString()));
var fa = new UserFlagAssignment()
{
UserFlagId = UserFlag.Id,
UserId = user.UserId,
AddedDate = DateTime.Now,
AddedUserId = Technician.UserId,
Comments = comments
};
Database.UserFlagAssignments.Add(fa);
return fa;
return user.OnAddUserFlag(Database, UserFlag, Technician, comments);
}).ToList();
// Save Chunk Items to Database
@@ -29,9 +29,9 @@ namespace Disco.Services.Users.UserFlags
{
// Load Flag
var userFlag = Database.UserFlags.FirstOrDefault(uf => uf.Id == UserFlagId);
if (userFlag == null)
throw new Exception("Invalid User Flag Id");
Status.UpdateStatus(0, string.Format("Bulk Assigning Users to User Flag: {0}", userFlag.Name), "Preparing to start");
// Load Technician
@@ -75,7 +75,9 @@ namespace Disco.Web.Areas.API.Controllers
[DiscoAuthorizeAny(Claims.User.Actions.AddFlags)]
public virtual ActionResult AddUser(int id, string UserId, string Comments)
{
var userFlag = UserFlagService.GetUserFlag(id);
Database.Configuration.LazyLoadingEnabled = true;
var userFlag = Database.UserFlags.Find(id);
if (userFlag == null)
throw new ArgumentException("Invalid User Flag Id", "id");
@@ -86,8 +88,9 @@ namespace Disco.Web.Areas.API.Controllers
if (!user.CanAddUserFlag(userFlag))
throw new InvalidOperationException("Adding user flag is denied");
var userFlagAssignment = user.OnAddUserFlag(Database, userFlag, CurrentUser, Comments);
Database.SaveChanges();
var addingUser = Database.Users.Find(CurrentUser.UserId);
var userFlagAssignment = user.OnAddUserFlag(Database, userFlag, addingUser, Comments);
return Redirect(string.Format("{0}#UserDetailTab-Flags", Url.Action(MVC.User.Show(user.UserId))));
}
@@ -95,6 +98,8 @@ namespace Disco.Web.Areas.API.Controllers
[DiscoAuthorizeAny(Claims.User.Actions.RemoveFlags)]
public virtual ActionResult RemoveUser(int id)
{
Database.Configuration.LazyLoadingEnabled = true;
var userFlagAssignment = Database.UserFlagAssignments.FirstOrDefault(a => a.Id == id);
if (userFlagAssignment == null)
throw new ArgumentException("Invalid User Flag Assignment Id", "id");
@@ -102,7 +107,9 @@ namespace Disco.Web.Areas.API.Controllers
if (!userFlagAssignment.CanRemove())
throw new InvalidOperationException("Removing user flag assignment is denied");
userFlagAssignment.OnRemove(CurrentUser);
var removingUser = Database.Users.Find(CurrentUser.UserId);
userFlagAssignment.OnRemove(Database, removingUser);
Database.SaveChanges();
return Redirect(string.Format("{0}#UserDetailTab-Flags", Url.Action(MVC.User.Show(userFlagAssignment.UserId))));
@@ -1,4 +1,5 @@
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
using Disco.Services.Interop.ActiveDirectory;
using Disco.Services.Tasks;
@@ -16,6 +17,8 @@ namespace Disco.Web.Areas.API.Controllers
const string pDescription = "description";
const string pIcon = "icon";
const string pIconColour = "iconcolour";
const string pOnAssignmentExpression = "onassignmentexpression";
const string pOnUnassignmentExpression = "onunassignmentexpression";
[DiscoAuthorize(Claims.Config.UserFlag.Configure)]
public virtual ActionResult Update(int id, string key, string value = null, Nullable<bool> redirect = null)
@@ -45,6 +48,12 @@ namespace Disco.Web.Areas.API.Controllers
case pIconColour:
UpdateIconColour(flag, value);
break;
case pOnAssignmentExpression:
UpdateOnAssignmentExpression(flag, value);
break;
case pOnUnassignmentExpression:
UpdateOnUnassignmentExpression(flag, value);
break;
default:
throw new Exception("Invalid Update Key");
}
@@ -123,6 +132,16 @@ namespace Disco.Web.Areas.API.Controllers
}
}
[DiscoAuthorize(Claims.Config.UserFlag.Configure)]
public virtual ActionResult UpdateOnAssignmentExpression(int id, string OnAssignmentExpression = null, bool redirect = false)
{
return Update(id, pOnAssignmentExpression, OnAssignmentExpression, redirect);
}
[DiscoAuthorize(Claims.Config.UserFlag.Configure)]
public virtual ActionResult UpdateOnUnassignmentExpression(int id, string OnUnassignmentExpression = null, bool redirect = false)
{
return Update(id, pOnUnassignmentExpression, OnUnassignmentExpression, redirect);
}
[DiscoAuthorize(Claims.Config.UserFlag.Configure)]
public virtual ActionResult UpdateAssignedUsersLinkedGroup(int id, string GroupId = null, DateTime? FilterBeginDate = null, bool redirect = false)
{
try
@@ -247,6 +266,38 @@ namespace Disco.Web.Areas.API.Controllers
}
}
private void UpdateOnAssignmentExpression(UserFlag UserFlag, string OnAssignmentExpression)
{
if (string.IsNullOrWhiteSpace(OnAssignmentExpression))
{
UserFlag.OnAssignmentExpression = null;
}
else
{
UserFlag.OnAssignmentExpression = OnAssignmentExpression.Trim();
}
// Invalidate Cache
UserFlag.OnAssignmentExpressionInvalidateCache();
UserFlagService.Update(Database, UserFlag);
}
private void UpdateOnUnassignmentExpression(UserFlag UserFlag, string OnUnassignmentExpression)
{
if (string.IsNullOrWhiteSpace(OnUnassignmentExpression))
{
UserFlag.OnUnassignmentExpression = null;
}
else
{
UserFlag.OnUnassignmentExpression = OnUnassignmentExpression.Trim();
}
// Invalidate Cache
UserFlag.OnUnassignmentExpressionInvalidateCache();
UserFlagService.Update(Database, UserFlag);
}
private ScheduledTaskStatus UpdateAssignedUsersLinkedGroup(UserFlag UserFlag, string AssignedUsersLinkedGroup, DateTime? FilterBeginDate)
{
var configJson = ADManagedGroup.ValidConfigurationToJson(UserFlagUsersManagedGroup.GetKey(UserFlag), AssignedUsersLinkedGroup, FilterBeginDate);
@@ -14,7 +14,9 @@
var hideAdvanced =
Model.UserFlag.UserDevicesLinkedGroup == null &&
Model.UserFlag.UsersLinkedGroup == null;
Model.UserFlag.UsersLinkedGroup == null &&
Model.UserFlag.OnAssignmentExpression == null &&
Model.UserFlag.OnUnassignmentExpression == null;
Html.BundleDeferred("~/ClientScripts/Modules/Disco-PropertyChangeHelpers");
}
@@ -222,6 +224,147 @@
</td>
</tr>
}
<tr class="Config_HideAdvanced_Item">
<th>
On Assignment<br />Expression:
</th>
<td>
@if (canConfig)
{
@Html.EditorFor(model => model.UserFlag.OnAssignmentExpression)
@AjaxHelpers.AjaxRemove()
@AjaxHelpers.AjaxSave()
@AjaxHelpers.AjaxLoader()
<script type="text/javascript">
$(function () {
var field = $('#UserFlag_OnAssignmentExpression');
var fieldRemove = field.next('.ajaxRemove');
var fieldOriginalWidth, fieldOriginalHeight;
document.DiscoFunctions.PropertyChangeHelper(
field,
'None',
'@Url.Action(MVC.API.UserFlag.UpdateOnAssignmentExpression(Model.UserFlag.Id))',
'OnAssignmentExpression'
);
field.focus(function () {
fieldOriginalWidth = field.width();
fieldOriginalHeight = field.height();
field.css('overflow', 'visible').animate({ width: field.parent().width() - 42, height: 75 }, 200);
}).blur(function () {
field.css('overflow', 'hidden').animate({ width: fieldOriginalWidth, height: fieldOriginalHeight }, 200);
}).change(function () {
if (!!field.val()) {
fieldRemove.show();
} else {
fieldRemove.hide();
}
}).attr('placeholder', 'None').attr('spellcheck', 'false');
fieldRemove.click(function () {
field.val('').change();
});
if (!!field.val()) {
fieldRemove.show();
} else {
fieldRemove.hide();
}
});
</script>
}
else
{
if (string.IsNullOrWhiteSpace(Model.UserFlag.OnAssignmentExpression))
{
<span class="smallMessage">&lt;None Specified&gt;</span>
}
else
{
<div class="code">
@Model.UserFlag.OnAssignmentExpression
</div>
}
}
<div class="info-box">
<p class="fa-p">
<i class="fa fa-fw fa-info-circle"></i>This expression will be evaluated whenever the user flag is assigned to a user. The output of the expression will be shown with the flag assignment.
</p>
</div>
</td>
</tr>
<tr class="Config_HideAdvanced_Item">
<th>
On Unassignment<br />Expression:
</th>
<td>
@if (canConfig)
{
@Html.EditorFor(model => model.UserFlag.OnUnassignmentExpression)
@AjaxHelpers.AjaxRemove()
@AjaxHelpers.AjaxSave()
@AjaxHelpers.AjaxLoader()
<script type="text/javascript">
$(function () {
var field = $('#UserFlag_OnUnassignmentExpression');
var fieldRemove = field.next('.ajaxRemove');
var fieldOriginalWidth, fieldOriginalHeight;
document.DiscoFunctions.PropertyChangeHelper(
field,
'None',
'@Url.Action(MVC.API.UserFlag.UpdateOnUnassignmentExpression(Model.UserFlag.Id))',
'OnUnassignmentExpression'
);
field.focus(function () {
fieldOriginalWidth = field.width();
fieldOriginalHeight = field.height();
field.css('overflow', 'visible').animate({ width: field.parent().width() - 42, height: 75 }, 200);
}).blur(function () {
field.css('overflow', 'hidden').animate({ width: fieldOriginalWidth, height: fieldOriginalHeight }, 200);
}).change(function () {
if (!!field.val()) {
fieldRemove.show();
} else {
fieldRemove.hide();
}
}).attr('placeholder', 'None').attr('spellcheck', 'false');
fieldRemove.click(function () {
field.val('').change();
});
if (!!field.val()) {
fieldRemove.show();
} else {
fieldRemove.hide();
}
});
</script>
}
else
{
if (string.IsNullOrWhiteSpace(Model.UserFlag.OnUnassignmentExpression))
{
<span class="smallMessage">&lt;None Specified&gt;</span>
}
else
{
<div class="code">
@Model.UserFlag.OnUnassignmentExpression
</div>
}
}
<div class="info-box">
<p class="fa-p">
<i class="fa fa-fw fa-info-circle"></i>This expression will be evaluated whenever the user flag is removed from a user. The output of the expression will be shown with the flag assignment.
</p>
</div>
</td>
</tr>
<tr class="Config_HideAdvanced_Item">
<th>
Linked Groups:
File diff suppressed because it is too large Load Diff
+7
View File
@@ -1461,6 +1461,13 @@ div.logEventsViewport table.logEventsViewport > tbody > tr > td.eventType {
#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li .remove:hover {
opacity: 1;
}
#Config_UserFlags_Show #UserFlag_OnAssignmentExpression,
#Config_UserFlags_Show #UserFlag_OnUnassignmentExpression {
height: 16px;
min-height: 16px;
overflow: hidden;
font-family: Consolas, "Courier New", monospace;
}
#Config_UserFlags_Index i {
width: 1.2857142857142858em;
text-align: center;
+29 -18
View File
@@ -261,13 +261,13 @@ table.deviceProfileTable {
border: none;
}
span.fancytree-node > span.fancytree-icon {
background: none;
display: inline-block;
font-family: FontAwesome;
font-size: 1.2em;
width: 14px;
}
span.fancytree-node > span.fancytree-icon {
background: none;
display: inline-block;
font-family: FontAwesome;
font-size: 1.2em;
width: 14px;
}
span.fancytree-ico-ef > span.fancytree-icon:before {
color: @StatusInformation;
@@ -487,10 +487,10 @@ div.logEventsViewport {
}
}
.session:hover {
border: 5px solid #6C7A87;
background-color: #DFE1F8;
}
.session:hover {
border: 5px solid #6C7A87;
background-color: #DFE1F8;
}
}
}
@@ -1169,13 +1169,13 @@ div.logEventsViewport {
border: none;
}
span.fancytree-node > span.fancytree-icon {
background: none;
display: inline-block;
font-family: FontAwesome;
font-size: 1.2em;
width: 14px;
}
span.fancytree-node > span.fancytree-icon {
background: none;
display: inline-block;
font-family: FontAwesome;
font-size: 1.2em;
width: 14px;
}
span.fancytree-ico-ef > span.fancytree-icon:before {
color: @StatusClosed;
@@ -1677,6 +1677,17 @@ div.logEventsViewport {
}
}
#Config_UserFlags_Show {
#UserFlag_OnAssignmentExpression, #UserFlag_OnUnassignmentExpression {
height: 16px;
min-height: 16px;
overflow: hidden;
font-family: @FontFamilyMono;
}
}
#Config_UserFlags_Index {
i {
width: 1.2857142857142858em;
File diff suppressed because one or more lines are too long
+5
View File
@@ -290,6 +290,11 @@
#UserDetailTab-Flags #userFlags td.removed {
vertical-align: middle;
}
#UserDetailTab-Flags #userFlags td.added .expressionResult,
#UserDetailTab-Flags #userFlags td.removed .expressionResult {
margin-top: 4px;
font-style: italic;
}
#UserDetailTab-Flags #userFlags td.comments {
vertical-align: middle;
}
+5
View File
@@ -267,6 +267,11 @@
td.added, td.removed {
vertical-align: middle;
.expressionResult {
margin-top: 4px;
font-style: italic;
}
}
td.comments {
File diff suppressed because one or more lines are too long
@@ -95,6 +95,18 @@ namespace Disco.Web.Areas.API.Controllers
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public virtual System.Web.Mvc.ActionResult UpdateOnAssignmentExpression()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnAssignmentExpression);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public virtual System.Web.Mvc.ActionResult UpdateOnUnassignmentExpression()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnUnassignmentExpression);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public virtual System.Web.Mvc.ActionResult UpdateAssignedUsersLinkedGroup()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateAssignedUsersLinkedGroup);
@@ -145,6 +157,8 @@ namespace Disco.Web.Areas.API.Controllers
public readonly string UpdateIcon = "UpdateIcon";
public readonly string UpdateIconColour = "UpdateIconColour";
public readonly string UpdateIconAndColour = "UpdateIconAndColour";
public readonly string UpdateOnAssignmentExpression = "UpdateOnAssignmentExpression";
public readonly string UpdateOnUnassignmentExpression = "UpdateOnUnassignmentExpression";
public readonly string UpdateAssignedUsersLinkedGroup = "UpdateAssignedUsersLinkedGroup";
public readonly string UpdateAssignedUserDevicesLinkedGroup = "UpdateAssignedUserDevicesLinkedGroup";
public readonly string Delete = "Delete";
@@ -161,6 +175,8 @@ namespace Disco.Web.Areas.API.Controllers
public const string UpdateIcon = "UpdateIcon";
public const string UpdateIconColour = "UpdateIconColour";
public const string UpdateIconAndColour = "UpdateIconAndColour";
public const string UpdateOnAssignmentExpression = "UpdateOnAssignmentExpression";
public const string UpdateOnUnassignmentExpression = "UpdateOnUnassignmentExpression";
public const string UpdateAssignedUsersLinkedGroup = "UpdateAssignedUsersLinkedGroup";
public const string UpdateAssignedUserDevicesLinkedGroup = "UpdateAssignedUserDevicesLinkedGroup";
public const string Delete = "Delete";
@@ -231,6 +247,26 @@ namespace Disco.Web.Areas.API.Controllers
public readonly string IconColour = "IconColour";
public readonly string redirect = "redirect";
}
static readonly ActionParamsClass_UpdateOnAssignmentExpression s_params_UpdateOnAssignmentExpression = new ActionParamsClass_UpdateOnAssignmentExpression();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_UpdateOnAssignmentExpression UpdateOnAssignmentExpressionParams { get { return s_params_UpdateOnAssignmentExpression; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_UpdateOnAssignmentExpression
{
public readonly string id = "id";
public readonly string OnAssignmentExpression = "OnAssignmentExpression";
public readonly string redirect = "redirect";
}
static readonly ActionParamsClass_UpdateOnUnassignmentExpression s_params_UpdateOnUnassignmentExpression = new ActionParamsClass_UpdateOnUnassignmentExpression();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_UpdateOnUnassignmentExpression UpdateOnUnassignmentExpressionParams { get { return s_params_UpdateOnUnassignmentExpression; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_UpdateOnUnassignmentExpression
{
public readonly string id = "id";
public readonly string OnUnassignmentExpression = "OnUnassignmentExpression";
public readonly string redirect = "redirect";
}
static readonly ActionParamsClass_UpdateAssignedUsersLinkedGroup s_params_UpdateAssignedUsersLinkedGroup = new ActionParamsClass_UpdateAssignedUsersLinkedGroup();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_UpdateAssignedUsersLinkedGroup UpdateAssignedUsersLinkedGroupParams { get { return s_params_UpdateAssignedUsersLinkedGroup; } }
@@ -386,6 +422,34 @@ namespace Disco.Web.Areas.API.Controllers
return callInfo;
}
[NonAction]
partial void UpdateOnAssignmentExpressionOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string OnAssignmentExpression, bool redirect);
[NonAction]
public override System.Web.Mvc.ActionResult UpdateOnAssignmentExpression(int id, string OnAssignmentExpression, bool redirect)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnAssignmentExpression);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "OnAssignmentExpression", OnAssignmentExpression);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect);
UpdateOnAssignmentExpressionOverride(callInfo, id, OnAssignmentExpression, redirect);
return callInfo;
}
[NonAction]
partial void UpdateOnUnassignmentExpressionOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string OnUnassignmentExpression, bool redirect);
[NonAction]
public override System.Web.Mvc.ActionResult UpdateOnUnassignmentExpression(int id, string OnUnassignmentExpression, bool redirect)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnUnassignmentExpression);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "OnUnassignmentExpression", OnUnassignmentExpression);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect);
UpdateOnUnassignmentExpressionOverride(callInfo, id, OnUnassignmentExpression, redirect);
return callInfo;
}
[NonAction]
partial void UpdateAssignedUsersLinkedGroupOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string GroupId, System.DateTime? FilterBeginDate, bool redirect);
+1 -2
View File
@@ -2,7 +2,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34014
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -27,7 +27,6 @@ namespace Disco.Web.Views.User
using System.Web.UI;
using System.Web.WebPages;
using Disco;
using Disco.BI.Extensions;
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
@@ -37,6 +37,10 @@
</td>
<td class="added">
@CommonHelpers.FriendlyDateAndUser(fa.Item1.AddedDate, fa.Item1.AddedUser)
@if (fa.Item1.OnAssignmentExpressionResult != null)
{
<div class="expressionResult">@fa.Item1.OnAssignmentExpressionResult</div>
}
</td>
<td class="comments">
@if (hasEdit)
@@ -57,6 +61,10 @@
@if (fa.Item1.RemovedDate.HasValue)
{
@CommonHelpers.FriendlyDateAndUser(fa.Item1.RemovedDate.Value, fa.Item1.RemovedUser)
if (fa.Item1.OnUnassignmentExpressionResult != null)
{
<div class="expressionResult">@fa.Item1.OnUnassignmentExpressionResult</div>
}
}
else if (fa.Item1.CanRemove())
{
@@ -2,7 +2,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34014
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -27,7 +27,6 @@ namespace Disco.Web.Views.User.UserParts
using System.Web.UI;
using System.Web.WebPages;
using Disco;
using Disco.BI.Extensions;
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
@@ -43,9 +42,9 @@ namespace Disco.Web.Views.User.UserParts
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")]
[System.Web.WebPages.PageVirtualPathAttribute("~/Views/User/UserParts/_Flags.cshtml")]
public partial class Flags : Disco.Services.Web.WebViewPage<Disco.Web.Models.User.ShowModel>
public partial class _Flags : Disco.Services.Web.WebViewPage<Disco.Web.Models.User.ShowModel>
{
public Flags()
public _Flags()
{
}
public override void Execute()
@@ -249,20 +248,58 @@ WriteLiteral(" ");
#line default
#line hidden
WriteLiteral("\r\n </td>\r\n <td");
WriteLiteral("\r\n");
#line 40 "..\..\Views\User\UserParts\_Flags.cshtml"
#line default
#line hidden
#line 40 "..\..\Views\User\UserParts\_Flags.cshtml"
if (fa.Item1.OnAssignmentExpressionResult != null)
{
#line default
#line hidden
WriteLiteral(" <div");
WriteLiteral(" class=\"expressionResult\"");
WriteLiteral(">");
#line 42 "..\..\Views\User\UserParts\_Flags.cshtml"
Write(fa.Item1.OnAssignmentExpressionResult);
#line default
#line hidden
WriteLiteral("</div>\r\n");
#line 43 "..\..\Views\User\UserParts\_Flags.cshtml"
}
#line default
#line hidden
WriteLiteral(" </td>\r\n <td");
WriteLiteral(" class=\"comments\"");
WriteLiteral(">\r\n");
#line 42 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 46 "..\..\Views\User\UserParts\_Flags.cshtml"
#line default
#line hidden
#line 42 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 46 "..\..\Views\User\UserParts\_Flags.cshtml"
if (hasEdit)
{
@@ -282,7 +319,7 @@ WriteLiteral(" title=\"Edit Comments\"");
WriteLiteral("></i></div>\r\n");
#line 45 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 49 "..\..\Views\User\UserParts\_Flags.cshtml"
}
@@ -291,7 +328,7 @@ WriteLiteral("></i></div>\r\n");
WriteLiteral(" ");
#line 46 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 50 "..\..\Views\User\UserParts\_Flags.cshtml"
if (fa.Item1.Comments == null)
{
@@ -305,7 +342,7 @@ WriteLiteral(" class=\"comments smallMessage\"");
WriteLiteral(">[no comments]</div>\r\n");
#line 49 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 53 "..\..\Views\User\UserParts\_Flags.cshtml"
}
else
{
@@ -320,7 +357,7 @@ WriteLiteral(" class=\"comments\"");
WriteLiteral(">");
#line 52 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 56 "..\..\Views\User\UserParts\_Flags.cshtml"
Write(fa.Item1.Comments.ToHtmlComment());
@@ -335,7 +372,7 @@ WriteLiteral(" class=\"commentsRaw\"");
WriteLiteral(">");
#line 53 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 57 "..\..\Views\User\UserParts\_Flags.cshtml"
Write(fa.Item1.Comments);
@@ -344,7 +381,7 @@ WriteLiteral(">");
WriteLiteral("</div>\r\n");
#line 54 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 58 "..\..\Views\User\UserParts\_Flags.cshtml"
}
@@ -352,27 +389,27 @@ WriteLiteral("</div>\r\n");
#line hidden
WriteLiteral(" </td>\r\n <td");
WriteAttribute("class", Tuple.Create(" class=\"", 2719), Tuple.Create("\"", 2782)
, Tuple.Create(Tuple.Create("", 2727), Tuple.Create("removed", 2727), true)
WriteAttribute("class", Tuple.Create(" class=\"", 2954), Tuple.Create("\"", 3017)
, Tuple.Create(Tuple.Create("", 2962), Tuple.Create("removed", 2962), true)
#line 56 "..\..\Views\User\UserParts\_Flags.cshtml"
, Tuple.Create(Tuple.Create("", 2734), Tuple.Create<System.Object, System.Int32>(!fa.Item1.RemovedDate.HasValue ? " na" : null
#line 60 "..\..\Views\User\UserParts\_Flags.cshtml"
, Tuple.Create(Tuple.Create("", 2969), Tuple.Create<System.Object, System.Int32>(!fa.Item1.RemovedDate.HasValue ? " na" : null
#line default
#line hidden
, 2734), false)
, 2969), false)
);
WriteLiteral(">\r\n");
#line 57 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 61 "..\..\Views\User\UserParts\_Flags.cshtml"
#line default
#line hidden
#line 57 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 61 "..\..\Views\User\UserParts\_Flags.cshtml"
if (fa.Item1.RemovedDate.HasValue)
{
@@ -380,15 +417,39 @@ WriteLiteral(">\r\n");
#line default
#line hidden
#line 59 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 63 "..\..\Views\User\UserParts\_Flags.cshtml"
Write(CommonHelpers.FriendlyDateAndUser(fa.Item1.RemovedDate.Value, fa.Item1.RemovedUser));
#line default
#line hidden
#line 59 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 63 "..\..\Views\User\UserParts\_Flags.cshtml"
if (fa.Item1.OnUnassignmentExpressionResult != null)
{
#line default
#line hidden
WriteLiteral(" <div");
WriteLiteral(" class=\"expressionResult\"");
WriteLiteral(">");
#line 66 "..\..\Views\User\UserParts\_Flags.cshtml"
Write(fa.Item1.OnUnassignmentExpressionResult);
#line default
#line hidden
WriteLiteral("</div>\r\n");
#line 67 "..\..\Views\User\UserParts\_Flags.cshtml"
}
}
else if (fa.Item1.CanRemove())
{
@@ -405,7 +466,7 @@ WriteLiteral(" class=\"button small remove\"");
WriteLiteral(">Remove</a>\r\n");
#line 64 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 72 "..\..\Views\User\UserParts\_Flags.cshtml"
}
@@ -414,7 +475,7 @@ WriteLiteral(">Remove</a>\r\n");
WriteLiteral(" </td>\r\n </tr>\r\n");
#line 67 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 75 "..\..\Views\User\UserParts\_Flags.cshtml"
}
@@ -433,13 +494,13 @@ WriteLiteral(" title=\"Remove this flag from the user?\"");
WriteLiteral(">\r\n");
#line 70 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 78 "..\..\Views\User\UserParts\_Flags.cshtml"
#line default
#line hidden
#line 70 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 78 "..\..\Views\User\UserParts\_Flags.cshtml"
using (Html.BeginForm(MVC.API.UserFlagAssignment.RemoveUser()))
{
@@ -465,7 +526,7 @@ WriteLiteral(" class=\"fa fa-exclamation-triangle fa-lg\"");
WriteLiteral("></i>&nbsp;Are you sure?\r\n </p>\r\n");
#line 76 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 84 "..\..\Views\User\UserParts\_Flags.cshtml"
}
@@ -484,13 +545,13 @@ WriteLiteral(" title=\"Edit the Comments\"");
WriteLiteral(">\r\n");
#line 79 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 87 "..\..\Views\User\UserParts\_Flags.cshtml"
#line default
#line hidden
#line 79 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 87 "..\..\Views\User\UserParts\_Flags.cshtml"
using (Html.BeginForm(MVC.API.UserFlagAssignment.UpdateComments()))
{
@@ -532,7 +593,7 @@ WriteLiteral(" class=\"block\"");
WriteLiteral("></textarea>\r\n </p>\r\n");
#line 87 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 95 "..\..\Views\User\UserParts\_Flags.cshtml"
}
@@ -590,7 +651,7 @@ WriteLiteral(">\r\n $(function () {\r\n var userFlags
";\r\n });\r\n </script>\r\n");
#line 166 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 174 "..\..\Views\User\UserParts\_Flags.cshtml"
}
else
{
@@ -605,7 +666,7 @@ WriteLiteral(" class=\"none\"");
WriteLiteral(">This user has no associated flags</div>\r\n");
#line 170 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 178 "..\..\Views\User\UserParts\_Flags.cshtml"
}
@@ -615,7 +676,7 @@ WriteLiteral(" <script>\r\n $(\'#UserDetailTabItems\').append(\'<li><a
"b-Flags\">Flags [");
#line 172 "..\..\Views\User\UserParts\_Flags.cshtml"
#line 180 "..\..\Views\User\UserParts\_Flags.cshtml"
Write(activeAssignmentCount);