diff --git a/Implem.CodeDefiner/Functions/Rds/Configurator.cs b/Implem.CodeDefiner/Functions/Rds/Configurator.cs index e7e316b9a..37d9d52d2 100644 --- a/Implem.CodeDefiner/Functions/Rds/Configurator.cs +++ b/Implem.CodeDefiner/Functions/Rds/Configurator.cs @@ -10,8 +10,10 @@ internal static void Configure(ISqlObjectFactory factory) { if (Environments.RdsProvider == "Local") { + UsersConfigurator.KillTask(factory: factory); RdsConfigurator.Configure(factory: factory); UsersConfigurator.Configure(factory: factory); + SchemaConfigurator.Configure(factory: factory); } TablesConfigurator.Configure(factory: factory); if (Environments.RdsProvider == "Local") diff --git a/Implem.CodeDefiner/Functions/Rds/Parts/Columns.cs b/Implem.CodeDefiner/Functions/Rds/Parts/Columns.cs index 48bf609fc..70387a1c9 100644 --- a/Implem.CodeDefiner/Functions/Rds/Parts/Columns.cs +++ b/Implem.CodeDefiner/Functions/Rds/Parts/Columns.cs @@ -13,7 +13,9 @@ internal static EnumerableRowCollection Get(ISqlObjectFactory factory, { return Def.SqlIoByAdmin(factory: factory).ExecuteTable( factory: factory, - commandText: Def.Sql.Columns.Replace("#TableName#", sourceTableName)) + commandText: Def.Sql.Columns + .Replace("#TableName#", sourceTableName) + .Replace("#SchemaName#", factory.SqlDefinitionSetting.SchemaName)) .AsEnumerable(); } diff --git a/Implem.CodeDefiner/Functions/Rds/Parts/Tables.cs b/Implem.CodeDefiner/Functions/Rds/Parts/Tables.cs index ebcfae93d..083f1d089 100644 --- a/Implem.CodeDefiner/Functions/Rds/Parts/Tables.cs +++ b/Implem.CodeDefiner/Functions/Rds/Parts/Tables.cs @@ -152,7 +152,9 @@ internal static bool Exists(ISqlObjectFactory factory, string sourceTableName) { return Def.SqlIoByAdmin(factory: factory).ExecuteTable( factory: factory, - commandText: Def.Sql.ExistsTable.Replace("#TableName#", sourceTableName)) + commandText: Def.Sql.ExistsTable + .Replace("#TableName#", sourceTableName) + .Replace("#SchemaName#", factory.SqlDefinitionSetting.SchemaName)) .Rows.Count == 1; } diff --git a/Implem.CodeDefiner/Functions/Rds/PrivilegeConfigurator.cs b/Implem.CodeDefiner/Functions/Rds/PrivilegeConfigurator.cs index 4e862e127..82322c15f 100644 --- a/Implem.CodeDefiner/Functions/Rds/PrivilegeConfigurator.cs +++ b/Implem.CodeDefiner/Functions/Rds/PrivilegeConfigurator.cs @@ -26,10 +26,10 @@ private static void Execute(ISqlObjectFactory factory, string connectionString) factory: factory, dbTransaction: null, dbConnection: null, - commandText: - Def.Sql.GrantPrivilegeAdmin + commandText: Def.Sql.GrantPrivilegeAdmin .Replace("#Uid#", cn["uid"]) - .Replace("#ServiceName#", Environments.ServiceName)); + .Replace("#ServiceName#", Environments.ServiceName) + .Replace("#SchemaName#", factory.SqlDefinitionSetting.SchemaName)); } else { @@ -37,19 +37,20 @@ private static void Execute(ISqlObjectFactory factory, string connectionString) factory: factory, dbTransaction: null, dbConnection: null, - commandText: - Def.Sql.GrantPrivilegeUser + commandText: Def.Sql.GrantPrivilegeUser .Replace("#Uid#", cn["uid"]) - .Replace("#ServiceName#", Environments.ServiceName)); + .Replace("#ServiceName#", Environments.ServiceName) + .Replace("#SchemaName#", factory.SqlDefinitionSetting.SchemaName)); } } - private static string CommandText(string uid) + private static string CommandText(ISqlObjectFactory factory, string uid) { return (uid.EndsWith("_Owner") ? Def.Sql.GrantPrivilegeAdmin.Replace("#Uid#", uid) : Def.Sql.GrantPrivilegeUser.Replace("#Uid#", uid)) - .Replace("#ServiceName#", Environments.ServiceName); + .Replace("#ServiceName#", Environments.ServiceName) + .Replace("#SchemaName#", factory.SqlDefinitionSetting.SchemaName); } } } diff --git a/Implem.CodeDefiner/Functions/Rds/RdsConfigurator.cs b/Implem.CodeDefiner/Functions/Rds/RdsConfigurator.cs index 9c6fe7ccc..047833542 100644 --- a/Implem.CodeDefiner/Functions/Rds/RdsConfigurator.cs +++ b/Implem.CodeDefiner/Functions/Rds/RdsConfigurator.cs @@ -1,5 +1,6 @@ using Implem.DefinitionAccessor; using Implem.IRds; +using Implem.Libraries.Classes; using Implem.Libraries.Utilities; namespace Implem.CodeDefiner.Functions.Rds { @@ -16,19 +17,50 @@ internal static void Configure(ISqlObjectFactory factory) private static void CreateDatabase(ISqlObjectFactory factory, string databaseName) { Consoles.Write(Environments.ServiceName, Consoles.Types.Info); + var ocn = new TextData(Parameters.Rds.OwnerConnectionString, ';', '='); + var ucn = new TextData(Parameters.Rds.UserConnectionString, ';', '='); Def.SqlIoBySa(factory).ExecuteNonQuery( factory: factory, dbTransaction: null, dbConnection: null, - commandText: Def.Sql.CreateDatabase.Replace("#InitialCatalog#", databaseName)); + commandText: Def.Sql.CreateDatabase + .Replace("#InitialCatalog#", databaseName)); + Def.SqlIoBySa(factory).ExecuteNonQuery( + factory: factory, + dbTransaction: null, + dbConnection: null, + commandText: Def.Sql.CreateUserForPostgres + .Replace("#Uid_Owner#", ocn["uid"]) + .Replace("#Pwd_Owner#", ocn["pwd"]) + .Replace("#Uid_User#", ucn["uid"]) + .Replace("#Pwd_User#", ucn["pwd"]) + .Replace("#SchemaName#", factory.SqlDefinitionSetting.SchemaName)); + Def.SqlIoBySa(factory).ExecuteNonQuery( + factory: factory, + dbTransaction: null, + dbConnection: null, + commandText: Def.Sql.CreateDatabaseForPostgres + .Replace("#InitialCatalog#", databaseName) + .Replace("#Uid_Owner#", ocn["uid"])); } private static bool Exists(ISqlObjectFactory factory, string databaseName) { - return Def.SqlIoBySa(factory).ExecuteTable( + var isExists = Def.SqlIoBySa(factory).ExecuteTable( factory: factory, commandText: Def.Sql.ExistsDatabase.Replace("#InitialCatalog#", databaseName)) .Rows.Count == 1; + var schemaName = isExists == false + ? databaseName + : (Def.SqlIoByAdmin(factory).ExecuteTable( + factory: factory, + commandText: Def.Sql.ExistsSchema.Replace("#SchemaName#", databaseName)) + .Rows.Count == 1) + ? databaseName + : "public"; + factory.SqlDefinitionSetting.SchemaName = schemaName; + if (!isExists) factory.SqlDefinitionSetting.IsCreatingDb = true; + return isExists; } } } diff --git a/Implem.CodeDefiner/Functions/Rds/SchemaConfigurator.cs b/Implem.CodeDefiner/Functions/Rds/SchemaConfigurator.cs new file mode 100644 index 000000000..30fa29a06 --- /dev/null +++ b/Implem.CodeDefiner/Functions/Rds/SchemaConfigurator.cs @@ -0,0 +1,27 @@ +using Implem.DefinitionAccessor; +using Implem.IRds; +using Implem.Libraries.Classes; +using Implem.Libraries.Utilities; +namespace Implem.CodeDefiner.Functions.Rds +{ + internal static class SchemaConfigurator + { + internal static void Configure(ISqlObjectFactory factory) + { + Consoles.Write(factory.SqlDefinitionSetting.SchemaName, Consoles.Types.Info); + if (factory.SqlDefinitionSetting.IsCreatingDb) + { + var ocn = new TextData(Parameters.Rds.OwnerConnectionString, ';', '='); + var ucn = new TextData(Parameters.Rds.UserConnectionString, ';', '='); + Def.SqlIoByAdmin(factory).ExecuteNonQuery( + factory: factory, + dbTransaction: null, + dbConnection: null, + commandText: Def.Sql.CreateSchema + .Replace("#Uid_Owner#", ocn["uid"]) + .Replace("#Uid_User#", ucn["uid"]) + .Replace("#SchemaName#", factory.SqlDefinitionSetting.SchemaName)); + } + } + } +} diff --git a/Implem.CodeDefiner/Functions/Rds/UsersConfigurator.cs b/Implem.CodeDefiner/Functions/Rds/UsersConfigurator.cs index d2cda8af2..66ffdb752 100644 --- a/Implem.CodeDefiner/Functions/Rds/UsersConfigurator.cs +++ b/Implem.CodeDefiner/Functions/Rds/UsersConfigurator.cs @@ -20,7 +20,6 @@ private static void Execute(ISqlObjectFactory factory, string connectionString) { var cn = new TextData(connectionString, ';', '='); Consoles.Write(cn["uid"], Consoles.Types.Info); - Spids.Kill(factory: factory, uid: cn["uid"]); if (Exists(factory: factory, uid: cn["uid"], sql: Def.Sql.ExistsUser)) { Alter(factory: factory, uid: cn["uid"], sql: AlterLoginRoleCommandText(pwd: cn["pwd"])); @@ -69,5 +68,21 @@ private static bool Exists(ISqlObjectFactory factory, string uid, string sql) commandText: sql.Replace("#Uid#", uid).Replace("#ServiceName#", Environments.ServiceName)) .Rows.Count == 1; } + + internal static void KillTask(ISqlObjectFactory factory) + { + KillTask( + factory: factory, + connectionString: Parameters.Rds.OwnerConnectionString); + KillTask( + factory: factory, + connectionString: Parameters.Rds.UserConnectionString); + } + + private static void KillTask(ISqlObjectFactory factory, string connectionString) + { + var cn = new TextData(connectionString, ';', '='); + Spids.Kill(factory: factory, uid: cn["uid"]); + } } } diff --git a/Implem.CodeDefiner/Implem.CodeDefiner.csproj b/Implem.CodeDefiner/Implem.CodeDefiner.csproj index 17c921977..37f4be1bf 100644 --- a/Implem.CodeDefiner/Implem.CodeDefiner.csproj +++ b/Implem.CodeDefiner/Implem.CodeDefiner.csproj @@ -5,9 +5,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 This program does the automatic code creation and merging of existing code based on the definition. Also it will make the configuration change of sql server database. - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 Linux diff --git a/Implem.CodeDefiner/Properties/launchSettings.json b/Implem.CodeDefiner/Properties/launchSettings.json index 0c4e99f1b..4b04fac14 100644 --- a/Implem.CodeDefiner/Properties/launchSettings.json +++ b/Implem.CodeDefiner/Properties/launchSettings.json @@ -5,9 +5,9 @@ "commandLineArgs": "def" }, "WSL": { - "commandName": "WSL2", - "environmentVariables": {}, - "distributionName": "" + "commandName": "WSL2", + "environmentVariables": {}, + "distributionName": "" }, "Docker": { "commandName": "Docker", diff --git a/Implem.DefinitionAccessor/Def.cs b/Implem.DefinitionAccessor/Def.cs index c5d8acebf..be2a930e6 100644 --- a/Implem.DefinitionAccessor/Def.cs +++ b/Implem.DefinitionAccessor/Def.cs @@ -407,6 +407,7 @@ public static void SetCodeDefinition() case "Model_CrosstabJsonCases": Code.Model_CrosstabJsonCases = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_CrosstabJsonCases, definitionRow, CodeXls); break; case "Model_CsvData": Code.Model_CsvData = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_CsvData, definitionRow, CodeXls); break; case "Model_CsvDataCases": Code.Model_CsvDataCases = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_CsvDataCases, definitionRow, CodeXls); break; + case "Model_DashboardsCopyAndInit": Code.Model_DashboardsCopyAndInit = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_DashboardsCopyAndInit, definitionRow, CodeXls); break; case "Model_Delete": Code.Model_Delete = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Delete, definitionRow, CodeXls); break; case "Model_Delete_GroupMembers": Code.Model_Delete_GroupMembers = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Delete_GroupMembers, definitionRow, CodeXls); break; case "Model_Delete_Item": Code.Model_Delete_Item = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Delete_Item, definitionRow, CodeXls); break; @@ -771,6 +772,7 @@ public static void SetCodeDefinition() case "Model_Utilities_EditorJson": Code.Model_Utilities_EditorJson = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_EditorJson, definitionRow, CodeXls); break; case "Model_Utilities_EditorJson_Items": Code.Model_Utilities_EditorJson_Items = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_EditorJson_Items, definitionRow, CodeXls); break; case "Model_Utilities_EditorJson_Sites": Code.Model_Utilities_EditorJson_Sites = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_EditorJson_Sites, definitionRow, CodeXls); break; + case "Model_Utilities_EditorMainCommands": Code.Model_Utilities_EditorMainCommands = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_EditorMainCommands, definitionRow, CodeXls); break; case "Model_Utilities_EditorResponse": Code.Model_Utilities_EditorResponse = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_EditorResponse, definitionRow, CodeXls); break; case "Model_Utilities_EditorResponse_Tables": Code.Model_Utilities_EditorResponse_Tables = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_EditorResponse_Tables, definitionRow, CodeXls); break; case "Model_Utilities_ExecGridNewRows": Code.Model_Utilities_ExecGridNewRows = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_ExecGridNewRows, definitionRow, CodeXls); break; @@ -839,6 +841,8 @@ public static void SetCodeDefinition() case "Model_Utilities_RedirectAfterDelete_Wikis": Code.Model_Utilities_RedirectAfterDelete_Wikis = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_RedirectAfterDelete_Wikis, definitionRow, CodeXls); break; case "Model_Utilities_RedirectAfterDeleteItem": Code.Model_Utilities_RedirectAfterDeleteItem = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_RedirectAfterDeleteItem, definitionRow, CodeXls); break; case "Model_Utilities_RedirectAfterDeleteNotItem": Code.Model_Utilities_RedirectAfterDeleteNotItem = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_RedirectAfterDeleteNotItem, definitionRow, CodeXls); break; + case "Model_Utilities_ReplaceLine": Code.Model_Utilities_ReplaceLine = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_ReplaceLine, definitionRow, CodeXls); break; + case "Model_Utilities_ResponseBreadcrumb_Tenants": Code.Model_Utilities_ResponseBreadcrumb_Tenants = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_ResponseBreadcrumb_Tenants, definitionRow, CodeXls); break; case "Model_Utilities_ResponseByUpdate_FieldResponse": Code.Model_Utilities_ResponseByUpdate_FieldResponse = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_ResponseByUpdate_FieldResponse, definitionRow, CodeXls); break; case "Model_Utilities_ResponseByUpdate_SiteSettings": Code.Model_Utilities_ResponseByUpdate_SiteSettings = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_ResponseByUpdate_SiteSettings, definitionRow, CodeXls); break; case "Model_Utilities_ResponseLinks": Code.Model_Utilities_ResponseLinks = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_ResponseLinks, definitionRow, CodeXls); break; @@ -1018,7 +1022,6 @@ public static void SetCodeDefinition() case "Rds_WherePkSemicolon": Code.Rds_WherePkSemicolon = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Rds_WherePkSemicolon, definitionRow, CodeXls); break; case "Reminder": Code.Reminder = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Reminder, definitionRow, CodeXls); break; case "Reminder_ColumnCases": Code.Reminder_ColumnCases = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Reminder_ColumnCases, definitionRow, CodeXls); break; - case "Reminder_TableCases": Code.Reminder_TableCases = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Reminder_TableCases, definitionRow, CodeXls); break; case "ResponseCollection": Code.ResponseCollection = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.ResponseCollection, definitionRow, CodeXls); break; case "ResponseCollection_Models": Code.ResponseCollection_Models = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.ResponseCollection_Models, definitionRow, CodeXls); break; case "ResponseCollection_ValueColumns": Code.ResponseCollection_ValueColumns = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.ResponseCollection_ValueColumns, definitionRow, CodeXls); break; @@ -1626,6 +1629,8 @@ public static void SetColumnDefinition() case "Binaries_TenantId": Column.Binaries_TenantId = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Binaries_TenantId, definitionRow, ColumnXls); break; case "Binaries_Thumbnail": Column.Binaries_Thumbnail = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Binaries_Thumbnail, definitionRow, ColumnXls); break; case "Binaries_Title": Column.Binaries_Title = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Binaries_Title, definitionRow, ColumnXls); break; + case "Dashboards_DashboardId": Column.Dashboards_DashboardId = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_DashboardId, definitionRow, ColumnXls); break; + case "Dashboards_Locked": Column.Dashboards_Locked = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Locked, definitionRow, ColumnXls); break; case "Demos_DemoId": Column.Demos_DemoId = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Demos_DemoId, definitionRow, ColumnXls); break; case "Demos_Initialized": Column.Demos_Initialized = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Demos_Initialized, definitionRow, ColumnXls); break; case "Demos_LoginId": Column.Demos_LoginId = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Demos_LoginId, definitionRow, ColumnXls); break; @@ -1857,6 +1862,7 @@ public static void SetColumnDefinition() case "Tenants_TenantId": Column.Tenants_TenantId = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Tenants_TenantId, definitionRow, ColumnXls); break; case "Tenants_TenantName": Column.Tenants_TenantName = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Tenants_TenantName, definitionRow, ColumnXls); break; case "Tenants_Title": Column.Tenants_Title = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Tenants_Title, definitionRow, ColumnXls); break; + case "Tenants_TopDashboards": Column.Tenants_TopDashboards = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Tenants_TopDashboards, definitionRow, ColumnXls); break; case "Tenants_TopScript": Column.Tenants_TopScript = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Tenants_TopScript, definitionRow, ColumnXls); break; case "Tenants_TopStyle": Column.Tenants_TopStyle = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Tenants_TopStyle, definitionRow, ColumnXls); break; case "Users_AfterResetPassword": Column.Users_AfterResetPassword = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Users_AfterResetPassword, definitionRow, ColumnXls); break; @@ -1933,6 +1939,18 @@ public static void SetColumnDefinition() case "Binaries_Updator": Column.Binaries_Updator = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Binaries_Updator, definitionRow, ColumnXls); break; case "Binaries_Ver": Column.Binaries_Ver = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Binaries_Ver, definitionRow, ColumnXls); break; case "Binaries_VerUp": Column.Binaries_VerUp = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Binaries_VerUp, definitionRow, ColumnXls); break; + case "Dashboards_Body": Column.Dashboards_Body = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Body, definitionRow, ColumnXls); break; + case "Dashboards_SiteId": Column.Dashboards_SiteId = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_SiteId, definitionRow, ColumnXls); break; + case "Dashboards_Title": Column.Dashboards_Title = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Title, definitionRow, ColumnXls); break; + case "Dashboards_TitleBody": Column.Dashboards_TitleBody = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_TitleBody, definitionRow, ColumnXls); break; + case "Dashboards_UpdatedTime": Column.Dashboards_UpdatedTime = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_UpdatedTime, definitionRow, ColumnXls); break; + case "Dashboards_Comments": Column.Dashboards_Comments = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Comments, definitionRow, ColumnXls); break; + case "Dashboards_CreatedTime": Column.Dashboards_CreatedTime = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_CreatedTime, definitionRow, ColumnXls); break; + case "Dashboards_Creator": Column.Dashboards_Creator = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Creator, definitionRow, ColumnXls); break; + case "Dashboards_Timestamp": Column.Dashboards_Timestamp = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Timestamp, definitionRow, ColumnXls); break; + case "Dashboards_Updator": Column.Dashboards_Updator = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Updator, definitionRow, ColumnXls); break; + case "Dashboards_Ver": Column.Dashboards_Ver = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_Ver, definitionRow, ColumnXls); break; + case "Dashboards_VerUp": Column.Dashboards_VerUp = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Dashboards_VerUp, definitionRow, ColumnXls); break; case "Demos_Comments": Column.Demos_Comments = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Demos_Comments, definitionRow, ColumnXls); break; case "Demos_CreatedTime": Column.Demos_CreatedTime = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Demos_CreatedTime, definitionRow, ColumnXls); break; case "Demos_Creator": Column.Demos_Creator = definitionRow[1].ToString(); SetColumnTable(ColumnTable.Demos_Creator, definitionRow, ColumnXls); break; @@ -4779,6 +4797,8 @@ public static void SetTemplateDefinition() { switch (definitionRow[0].ToString()) { + case "Dashboard": Template.Dashboard = definitionRow[1].ToString(); SetTemplateTable(TemplateTable.Dashboard, definitionRow, TemplateXls); break; + case "Dashboard_ja": Template.Dashboard_ja = definitionRow[1].ToString(); SetTemplateTable(TemplateTable.Dashboard_ja, definitionRow, TemplateXls); break; case "Template1": Template.Template1 = definitionRow[1].ToString(); SetTemplateTable(TemplateTable.Template1, definitionRow, TemplateXls); break; case "Template10": Template.Template10 = definitionRow[1].ToString(); SetTemplateTable(TemplateTable.Template10, definitionRow, TemplateXls); break; case "Template105": Template.Template105 = definitionRow[1].ToString(); SetTemplateTable(TemplateTable.Template105, definitionRow, TemplateXls); break; @@ -6833,6 +6853,7 @@ public class CodeColumn2nd public string Model_CrosstabJsonCases; public string Model_CsvData; public string Model_CsvDataCases; + public string Model_DashboardsCopyAndInit; public string Model_Delete; public string Model_Delete_GroupMembers; public string Model_Delete_Item; @@ -7197,6 +7218,7 @@ public class CodeColumn2nd public string Model_Utilities_EditorJson; public string Model_Utilities_EditorJson_Items; public string Model_Utilities_EditorJson_Sites; + public string Model_Utilities_EditorMainCommands; public string Model_Utilities_EditorResponse; public string Model_Utilities_EditorResponse_Tables; public string Model_Utilities_ExecGridNewRows; @@ -7265,6 +7287,8 @@ public class CodeColumn2nd public string Model_Utilities_RedirectAfterDelete_Wikis; public string Model_Utilities_RedirectAfterDeleteItem; public string Model_Utilities_RedirectAfterDeleteNotItem; + public string Model_Utilities_ReplaceLine; + public string Model_Utilities_ResponseBreadcrumb_Tenants; public string Model_Utilities_ResponseByUpdate_FieldResponse; public string Model_Utilities_ResponseByUpdate_SiteSettings; public string Model_Utilities_ResponseLinks; @@ -7444,7 +7468,6 @@ public class CodeColumn2nd public string Rds_WherePkSemicolon; public string Reminder; public string Reminder_ColumnCases; - public string Reminder_TableCases; public string ResponseCollection; public string ResponseCollection_Models; public string ResponseCollection_ValueColumns; @@ -7627,6 +7650,7 @@ public class CodeTable public CodeDefinition Model_CrosstabJsonCases = new CodeDefinition(); public CodeDefinition Model_CsvData = new CodeDefinition(); public CodeDefinition Model_CsvDataCases = new CodeDefinition(); + public CodeDefinition Model_DashboardsCopyAndInit = new CodeDefinition(); public CodeDefinition Model_Delete = new CodeDefinition(); public CodeDefinition Model_Delete_GroupMembers = new CodeDefinition(); public CodeDefinition Model_Delete_Item = new CodeDefinition(); @@ -7991,6 +8015,7 @@ public class CodeTable public CodeDefinition Model_Utilities_EditorJson = new CodeDefinition(); public CodeDefinition Model_Utilities_EditorJson_Items = new CodeDefinition(); public CodeDefinition Model_Utilities_EditorJson_Sites = new CodeDefinition(); + public CodeDefinition Model_Utilities_EditorMainCommands = new CodeDefinition(); public CodeDefinition Model_Utilities_EditorResponse = new CodeDefinition(); public CodeDefinition Model_Utilities_EditorResponse_Tables = new CodeDefinition(); public CodeDefinition Model_Utilities_ExecGridNewRows = new CodeDefinition(); @@ -8059,6 +8084,8 @@ public class CodeTable public CodeDefinition Model_Utilities_RedirectAfterDelete_Wikis = new CodeDefinition(); public CodeDefinition Model_Utilities_RedirectAfterDeleteItem = new CodeDefinition(); public CodeDefinition Model_Utilities_RedirectAfterDeleteNotItem = new CodeDefinition(); + public CodeDefinition Model_Utilities_ReplaceLine = new CodeDefinition(); + public CodeDefinition Model_Utilities_ResponseBreadcrumb_Tenants = new CodeDefinition(); public CodeDefinition Model_Utilities_ResponseByUpdate_FieldResponse = new CodeDefinition(); public CodeDefinition Model_Utilities_ResponseByUpdate_SiteSettings = new CodeDefinition(); public CodeDefinition Model_Utilities_ResponseLinks = new CodeDefinition(); @@ -8238,7 +8265,6 @@ public class CodeTable public CodeDefinition Rds_WherePkSemicolon = new CodeDefinition(); public CodeDefinition Reminder = new CodeDefinition(); public CodeDefinition Reminder_ColumnCases = new CodeDefinition(); - public CodeDefinition Reminder_TableCases = new CodeDefinition(); public CodeDefinition ResponseCollection = new CodeDefinition(); public CodeDefinition ResponseCollection_Models = new CodeDefinition(); public CodeDefinition ResponseCollection_ValueColumns = new CodeDefinition(); @@ -8873,6 +8899,8 @@ public class ColumnColumn2nd public string Binaries_TenantId; public string Binaries_Thumbnail; public string Binaries_Title; + public string Dashboards_DashboardId; + public string Dashboards_Locked; public string Demos_DemoId; public string Demos_Initialized; public string Demos_LoginId; @@ -9104,6 +9132,7 @@ public class ColumnColumn2nd public string Tenants_TenantId; public string Tenants_TenantName; public string Tenants_Title; + public string Tenants_TopDashboards; public string Tenants_TopScript; public string Tenants_TopStyle; public string Users_AfterResetPassword; @@ -9180,6 +9209,18 @@ public class ColumnColumn2nd public string Binaries_Updator; public string Binaries_Ver; public string Binaries_VerUp; + public string Dashboards_Body; + public string Dashboards_SiteId; + public string Dashboards_Title; + public string Dashboards_TitleBody; + public string Dashboards_UpdatedTime; + public string Dashboards_Comments; + public string Dashboards_CreatedTime; + public string Dashboards_Creator; + public string Dashboards_Timestamp; + public string Dashboards_Updator; + public string Dashboards_Ver; + public string Dashboards_VerUp; public string Demos_Comments; public string Demos_CreatedTime; public string Demos_Creator; @@ -9416,6 +9457,8 @@ public class ColumnTable public ColumnDefinition Binaries_TenantId = new ColumnDefinition(); public ColumnDefinition Binaries_Thumbnail = new ColumnDefinition(); public ColumnDefinition Binaries_Title = new ColumnDefinition(); + public ColumnDefinition Dashboards_DashboardId = new ColumnDefinition(); + public ColumnDefinition Dashboards_Locked = new ColumnDefinition(); public ColumnDefinition Demos_DemoId = new ColumnDefinition(); public ColumnDefinition Demos_Initialized = new ColumnDefinition(); public ColumnDefinition Demos_LoginId = new ColumnDefinition(); @@ -9647,6 +9690,7 @@ public class ColumnTable public ColumnDefinition Tenants_TenantId = new ColumnDefinition(); public ColumnDefinition Tenants_TenantName = new ColumnDefinition(); public ColumnDefinition Tenants_Title = new ColumnDefinition(); + public ColumnDefinition Tenants_TopDashboards = new ColumnDefinition(); public ColumnDefinition Tenants_TopScript = new ColumnDefinition(); public ColumnDefinition Tenants_TopStyle = new ColumnDefinition(); public ColumnDefinition Users_AfterResetPassword = new ColumnDefinition(); @@ -9723,6 +9767,18 @@ public class ColumnTable public ColumnDefinition Binaries_Updator = new ColumnDefinition(); public ColumnDefinition Binaries_Ver = new ColumnDefinition(); public ColumnDefinition Binaries_VerUp = new ColumnDefinition(); + public ColumnDefinition Dashboards_Body = new ColumnDefinition(); + public ColumnDefinition Dashboards_SiteId = new ColumnDefinition(); + public ColumnDefinition Dashboards_Title = new ColumnDefinition(); + public ColumnDefinition Dashboards_TitleBody = new ColumnDefinition(); + public ColumnDefinition Dashboards_UpdatedTime = new ColumnDefinition(); + public ColumnDefinition Dashboards_Comments = new ColumnDefinition(); + public ColumnDefinition Dashboards_CreatedTime = new ColumnDefinition(); + public ColumnDefinition Dashboards_Creator = new ColumnDefinition(); + public ColumnDefinition Dashboards_Timestamp = new ColumnDefinition(); + public ColumnDefinition Dashboards_Updator = new ColumnDefinition(); + public ColumnDefinition Dashboards_Ver = new ColumnDefinition(); + public ColumnDefinition Dashboards_VerUp = new ColumnDefinition(); public ColumnDefinition Demos_Comments = new ColumnDefinition(); public ColumnDefinition Demos_CreatedTime = new ColumnDefinition(); public ColumnDefinition Demos_Creator = new ColumnDefinition(); @@ -12382,6 +12438,8 @@ public void RestoreBySavedMemory() public class TemplateColumn2nd { + public string Dashboard; + public string Dashboard_ja; public string Template1; public string Template10; public string Template105; @@ -12788,6 +12846,8 @@ public class TemplateColumn2nd public class TemplateTable { + public TemplateDefinition Dashboard = new TemplateDefinition(); + public TemplateDefinition Dashboard_ja = new TemplateDefinition(); public TemplateDefinition Template1 = new TemplateDefinition(); public TemplateDefinition Template10 = new TemplateDefinition(); public TemplateDefinition Template105 = new TemplateDefinition(); @@ -13370,6 +13430,10 @@ public class SqlColumn2nd public string DropLoginRole; public string DropUser; public string CreateLoginRole; + public string ExistsSchema; + public string CreateSchema; + public string CreateDatabaseForPostgres; + public string CreateUserForPostgres; } /// @@ -13418,5 +13482,9 @@ public class SqlTable public SqlDefinition Spaceused = new SqlDefinition(); public SqlDefinition SelectPkName = new SqlDefinition(); public SqlDefinition CreateFullText = new SqlDefinition(); + public SqlDefinition ExistsSchema = new SqlDefinition(); + public SqlDefinition CreateSchema = new SqlDefinition(); + public SqlDefinition CreateDatabaseForPostgres = new SqlDefinition(); + public SqlDefinition CreateUserForPostgres = new SqlDefinition(); } } diff --git a/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj b/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj index 91b9e6eda..9e8432e41 100644 --- a/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj +++ b/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Implem.DefinitionAccessor/Initializer.cs b/Implem.DefinitionAccessor/Initializer.cs index 7f9a6347d..b63e0d406 100644 --- a/Implem.DefinitionAccessor/Initializer.cs +++ b/Implem.DefinitionAccessor/Initializer.cs @@ -132,6 +132,7 @@ public static void SetParameters() Parameters.Parameter = Read(); Parameters.Locations = Read(); Parameters.Validation = Read(); + Parameters.Dashboard = Read(); Parameters.Rds.SaConnectionString = Strings.CoalesceEmpty( Parameters.Rds.SaConnectionString, Environment.GetEnvironmentVariable($"{Parameters.Service.EnvironmentName}_Rds_SaConnectionString"), diff --git a/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj b/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj index 362648ca0..8347c9c93 100644 --- a/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj +++ b/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Implem.Factory/Implem.Factory.csproj b/Implem.Factory/Implem.Factory.csproj index db358751b..3b3055358 100644 --- a/Implem.Factory/Implem.Factory.csproj +++ b/Implem.Factory/Implem.Factory.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Implem.Libraries/Implem.Libraries.csproj b/Implem.Libraries/Implem.Libraries.csproj index a89b9aa8b..b329f2fb8 100644 --- a/Implem.Libraries/Implem.Libraries.csproj +++ b/Implem.Libraries/Implem.Libraries.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj b/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj index eaca06196..ecb2ed9fe 100644 --- a/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj +++ b/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Implem.ParameterAccessor/Parameters.cs b/Implem.ParameterAccessor/Parameters.cs index 6a3b52e03..8fe493e79 100644 --- a/Implem.ParameterAccessor/Parameters.cs +++ b/Implem.ParameterAccessor/Parameters.cs @@ -54,6 +54,7 @@ public static class Parameters public static User User; public static ParameterAccessor.Parts.Version Version; public static Validation Validation; + public static Dashboard Dashboard; public static bool CommercialLicense() { diff --git a/Implem.ParameterAccessor/Parts/Dashboard.cs b/Implem.ParameterAccessor/Parts/Dashboard.cs new file mode 100644 index 000000000..693713147 --- /dev/null +++ b/Implem.ParameterAccessor/Parts/Dashboard.cs @@ -0,0 +1,9 @@ +namespace Implem.ParameterAccessor.Parts +{ + public class Dashboard + { + public int TimeLineItemCount; + public int TimeLineItemCountMin; + public int TimeLineItemCountMax; + } +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_TableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_TableCases.json index b58574091..5650cd87a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_TableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_TableCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_Updates.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_Updates.json index c1c34f587..5bc443c59 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_Updates.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/FormulaUtilities_Updates.json @@ -4,5 +4,5 @@ "Indent": "2", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/GridData_KeyValues_Items.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/GridData_KeyValues_Items.json index c07f7912b..917c721b2 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/GridData_KeyValues_Items.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/GridData_KeyValues_Items.json @@ -4,5 +4,5 @@ "Indent": "6", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataRowsTableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataRowsTableCases.json index 5773e60e3..2e7496582 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataRowsTableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataRowsTableCases.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataSetTableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataSetTableCases.json index 1065e0f92..2971791b3 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataSetTableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_DataSetTableCases.json @@ -4,5 +4,5 @@ "Indent": "3", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_SelectStatementTableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_SelectStatementTableCases.json index 611c51f43..1bdff952e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_SelectStatementTableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_SelectStatementTableCases.json @@ -4,5 +4,5 @@ "Indent": "2", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_TableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_TableCases.json index 2ea05245b..5e5eda87f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_TableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_TableCases.json @@ -4,5 +4,5 @@ "Indent": "7", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Indexes_SetChoiceHash.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Indexes_SetChoiceHash.json index 9b85a1a45..7af118442 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Indexes_SetChoiceHash.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Indexes_SetChoiceHash.json @@ -2,5 +2,5 @@ "Id": "Indexes_SetChoiceHash", "Indent": "6", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_CopyWithLinks.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_CopyWithLinks.json index a4d8b10db..fab808534 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_CopyWithLinks.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_CopyWithLinks.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_DeleteWithLinks.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_DeleteWithLinks.json index 66dde074a..e89676735 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_DeleteWithLinks.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/LinkAction_DeleteWithLinks.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Lookup_Data.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Lookup_Data.json index 5a1c5241a..99ba56280 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Lookup_Data.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Lookup_Data.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "GenericUi": "1", - "Exclude": "Tenants,Registrations,SysLogs,Sites,Wikis" + "Exclude": "Tenants,Registrations,SysLogs,Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Body.txt index 095e845f5..7fc8b641b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Body.txt @@ -121,6 +121,7 @@ namespace Implem.Pleasanter.Models + diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteByApiCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteByApiCases.json index 6769c95f5..b2eb72d72 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteByApiCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteByApiCases.json @@ -4,5 +4,5 @@ "Indent": "5", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteCases.json index 22171fc62..e26aadfc6 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkDeleteCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkMoveCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkMoveCases.json index 424ad546d..0a06c73f4 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkMoveCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkMoveCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkProcessCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkProcessCases.json index e22439c0e..89dd7be0a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkProcessCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkProcessCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateCases.json index 3c3c3b28c..708f00291 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateSelectChangedCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateSelectChangedCases.json index f342b5bd3..1f6235390 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateSelectChangedCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_BulkUpdateSelectChangedCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CancelNewRowCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CancelNewRowCases.json index 11e687a7f..f86a67f4f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CancelNewRowCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CancelNewRowCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ControlConstraintsType.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ControlConstraintsType.json index daa348470..b4a0a3d68 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ControlConstraintsType.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ControlConstraintsType.json @@ -2,5 +2,5 @@ "Id": "Model_ControlConstraintsType", "Indent": "5", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyAndInit.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyAndInit.json index 89fa1f7d6..4bb66aff5 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyAndInit.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyAndInit.json @@ -3,5 +3,5 @@ "Indent": "2", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyCases.json index 40d9b3570..415cc5a84 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyRowCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyRowCases.json index 15cba3dfa..55a44766f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyRowCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyRowCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyWithLinks.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyWithLinks.json index d95e10c11..8b70f1d3b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyWithLinks.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CopyWithLinks.json @@ -2,5 +2,5 @@ "Id": "Model_CopyWithLinks", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByApiCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByApiCases.json index 73ded9105..826a0c20a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByApiCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByApiCases.json @@ -1,8 +1,8 @@ { - "Id": "Model_CreateByApiCases", - "RepeatType": "Table", - "Indent": "4", - "Separator": "\\r\\n", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_CreateByApiCases", + "RepeatType": "Table", + "Indent": "4", + "Separator": "\\r\\n", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByServerScriptCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByServerScriptCases.json index d5427498b..1affb0f3e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByServerScriptCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateByServerScriptCases.json @@ -1,7 +1,8 @@ { - "Id": "Model_CreateByServerScriptCases", - "RepeatType": "Table", - "Indent": "4", - "Separator": "\\r\\n", - "ItemOnly": "1" + "Id": "Model_CreateByServerScriptCases", + "RepeatType": "Table", + "Indent": "4", + "Separator": "\\r\\n", + "ItemOnly": "1", + "Exclude": "Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateCases.json index 7b20eb6d7..059969917 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreateCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreatePermissions.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreatePermissions.json index 2c6b8faf7..826b5a28f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreatePermissions.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_CreatePermissions.json @@ -2,5 +2,5 @@ "Id": "Model_CreatePermissions", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DashboardsCopyAndInit.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DashboardsCopyAndInit.json new file mode 100644 index 000000000..10bcea751 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DashboardsCopyAndInit.json @@ -0,0 +1,5 @@ +{ + "Id": "Model_DashboardsCopyAndInit", + "Indent": "2", + "Include": "Dashboards" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DashboardsCopyAndInit_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DashboardsCopyAndInit_Body.txt new file mode 100644 index 000000000..c580559c4 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DashboardsCopyAndInit_Body.txt @@ -0,0 +1,9 @@ +public #ModelName#Model CopyAndInit( + Context context, + SiteSettings ss) +{ + return new #ModelName#Model( + context: context, + ss: ss, + methodType: MethodTypes.New); +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByApiCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByApiCases.json index fd9e90313..90f5552f2 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByApiCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByApiCases.json @@ -1,8 +1,8 @@ { - "Id": "Model_DeleteByApiCases", - "RepeatType": "Table", - "Indent": "4", - "Separator": "\\r\\n", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_DeleteByApiCases", + "RepeatType": "Table", + "Indent": "4", + "Separator": "\\r\\n", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByServerScriptCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByServerScriptCases.json index 4773998da..796ea659b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByServerScriptCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteByServerScriptCases.json @@ -3,5 +3,6 @@ "RepeatType": "Table", "Indent": "4", "Separator": "\\r\\n", - "ItemOnly": "1" + "ItemOnly": "1", + "Exclude": "Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCases.json index 05a42596e..1f66b2085 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCases.json @@ -3,5 +3,6 @@ "RepeatType": "Table", "Indent": "4", "Separator": "\\r\\n", - "ItemOnly": "1" + "ItemOnly": "1", + "Exclude": "Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCommentCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCommentCases.json index 2b16dd19d..0b376c841 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCommentCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteCommentCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteHistoryCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteHistoryCases.json index 0a0f13f15..b073a54e5 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteHistoryCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteHistoryCases.json @@ -4,5 +4,5 @@ "Indent": "5", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteImageWhenDeleting.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteImageWhenDeleting.json index 59637ab72..1e3dc5942 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteImageWhenDeleting.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteImageWhenDeleting.json @@ -2,5 +2,5 @@ "Id": "Model_DeleteImageWhenDeleting", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteWithLinks.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteWithLinks.json index deb3a7761..7389915f4 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteWithLinks.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_DeleteWithLinks.json @@ -2,5 +2,5 @@ "Id": "Model_DeleteWithLinks", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorCases.json index c53570538..31b949e02 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorJsonCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorJsonCases.json index 3e8266f9f..95f7ee09e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorJsonCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_EditorJsonCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportAndMailNotifyCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportAndMailNotifyCases.json index 658f1bd2b..987d2a986 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportAndMailNotifyCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportAndMailNotifyCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCases.json index d52ee19ae..1dfe6efff 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCrosstabCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCrosstabCases.json index 73b2a80ab..1cd61d69c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCrosstabCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ExportCrosstabCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ForceSynchronizeSummaryExecute.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ForceSynchronizeSummaryExecute.json index e935de974..4836618c9 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ForceSynchronizeSummaryExecute.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ForceSynchronizeSummaryExecute.json @@ -2,5 +2,5 @@ "Id": "Model_ForceSynchronizeSummaryExecute", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetByApiCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetByApiCases.json index 958015564..c700eb233 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetByApiCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetByApiCases.json @@ -1,8 +1,8 @@ { - "Id": "Model_GetByApiCases", - "RepeatType": "Table", - "Indent": "4", - "Separator": "\\r\\n", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_GetByApiCases", + "RepeatType": "Table", + "Indent": "4", + "Separator": "\\r\\n", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetStatusControl.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetStatusControl.json index d503ef6cc..16ce03a25 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetStatusControl.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GetStatusControl.json @@ -2,5 +2,5 @@ "Id": "Model_GetStatusControl", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GridRowsCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GridRowsCases.json index 2ca2a5458..aeed01cad 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GridRowsCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_GridRowsCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoriesCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoriesCases.json index 86b64a15f..63eda39a3 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoriesCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoriesCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoryCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoryCases.json index f0be985c2..3751f9597 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoryCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_HistoryCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicated.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicated.json index 5592458a9..b570e9009 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicated.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicated.json @@ -2,5 +2,5 @@ "Id": "Model_IfDuplicated", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedReturn.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedReturn.json index 85568c582..d1553df46 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedReturn.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedReturn.json @@ -2,5 +2,5 @@ "Id": "Model_IfDuplicatedReturn", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedStatements.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedStatements.json index 78833ff6e..311eaca63 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedStatements.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_IfDuplicatedStatements.json @@ -2,5 +2,5 @@ "Id": "Model_IfDuplicatedStatements", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImageLibNextCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImageLibNextCases.json index 3e6d32418..224f05c7f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImageLibNextCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImageLibNextCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImportCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImportCases.json index 765f72d03..83a8d525f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImportCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ImportCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinks.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinks.json index b848ebe1f..9f42b6fc5 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinks.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinks.json @@ -2,5 +2,5 @@ "Id": "Model_InsertLinks", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByCreate.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByCreate.json index 2a6bbe4e0..4075a1b2b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByCreate.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByCreate.json @@ -2,5 +2,5 @@ "Id": "Model_InsertLinksByCreate", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByUpdate.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByUpdate.json index e75124bee..e7a49c524 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByUpdate.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_InsertLinksByUpdate.json @@ -2,5 +2,5 @@ "Id": "Model_InsertLinksByUpdate", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumbering.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumbering.json index 637bcdd22..164676c47 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumbering.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumbering.json @@ -2,5 +2,5 @@ "Id": "Model_Insert_ExecuteAutomaticNumbering", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumberingExec.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumberingExec.json index d7021e3fd..f8dfe9c3f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumberingExec.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Insert_ExecuteAutomaticNumberingExec.json @@ -2,5 +2,5 @@ "Id": "Model_Insert_ExecuteAutomaticNumberingExec", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_LockCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_LockCases.json index 260bbc808..37846094b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_LockCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_LockCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Move.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Move.json index b34a30074..256945ca2 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Move.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Move.json @@ -2,5 +2,5 @@ "Id": "Model_Move", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_MoveCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_MoveCases.json index 8af585290..fe4aa789c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_MoveCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_MoveCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewCases.json index d4cc50f5e..e572aacdb 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewJsonCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewJsonCases.json index df5cfeb15..1394ccd8f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewJsonCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewJsonCases.json @@ -4,5 +4,5 @@ "Indent": "5", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewOnGridCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewOnGridCases.json index 5a9ac9930..4ce19e7c8 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewOnGridCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_NewOnGridCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenBulkUpdateSelectorDialogCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenBulkUpdateSelectorDialogCases.json index 6bf6282f5..2f124c9da 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenBulkUpdateSelectorDialogCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenBulkUpdateSelectorDialogCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenExportSelectorDialogCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenExportSelectorDialogCases.json index 7c936c091..5df421b55 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenExportSelectorDialogCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_OpenExportSelectorDialogCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteByApiCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteByApiCases.json index f63227c00..9733ccb1c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteByApiCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteByApiCases.json @@ -4,5 +4,5 @@ "Indent": "5", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteCases.json index 9a3effc59..07538d96b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_PhysicalDeleteCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Wikis" + "Exclude": "Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadPermissions.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadPermissions.json index 7d8a8f910..867519f48 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadPermissions.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadPermissions.json @@ -2,5 +2,5 @@ "Id": "Model_ReloadPermissions", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadRowCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadRowCases.json index d41869a1d..f0c3adff2 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadRowCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_ReloadRowCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreCases.json index 6684c9297..9c5b9b125 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Wikis" + "Exclude": "Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreFromHistoryCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreFromHistoryCases.json index ff72ac98b..1cd9833d5 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreFromHistoryCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_RestoreFromHistoryCases.json @@ -3,5 +3,6 @@ "RepeatType": "Table", "Indent": "4", "Separator": "\\r\\n", - "ItemOnly": "1" + "ItemOnly": "1", + "Exclude": "Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SelectedIds.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SelectedIds.json index d0ee046fc..fad008352 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SelectedIds.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SelectedIds.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByCsvRow.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByCsvRow.json index 2cb26bf62..1b3ee2b4c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByCsvRow.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByCsvRow.json @@ -2,5 +2,5 @@ "Id": "Model_SetByCsvRow", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByDataChanges.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByDataChanges.json index dd809ad93..1953c2ab8 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByDataChanges.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByDataChanges.json @@ -2,5 +2,5 @@ "Id": "Model_SetByDataChanges", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookups.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookups.json index 6ae30a753..375867976 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookups.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookups.json @@ -2,5 +2,5 @@ "Id": "Model_SetByLookups", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExec.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExec.json index 222d0d19c..874d1739c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExec.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExec.json @@ -2,5 +2,5 @@ "Id": "Model_SetByLookupsExec", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExecFormDataOnly.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExecFormDataOnly.json index 513954cb4..92171ba2d 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExecFormDataOnly.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByLookupsExecFormDataOnly.json @@ -2,5 +2,5 @@ "Id": "Model_SetByLookupsExecFormDataOnly", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetBySettings.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetBySettings.json index 2afdf8f2d..374b7127f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetBySettings.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetBySettings.json @@ -2,5 +2,5 @@ "Id": "Model_SetBySettings", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControls.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControls.json index 13b72bea8..37ef9f162 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControls.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControls.json @@ -2,5 +2,5 @@ "Id": "Model_SetByStatusControls", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControlsExec.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControlsExec.json index f07d52b0f..bb50a6d27 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControlsExec.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByStatusControlsExec.json @@ -2,5 +2,5 @@ "Id": "Model_SetByStatusControlsExec", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByWhenloadingRecordServerScript.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByWhenloadingRecordServerScript.json index afdfba9cf..33833cb7d 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByWhenloadingRecordServerScript.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByWhenloadingRecordServerScript.json @@ -2,5 +2,5 @@ "Id": "Model_SetByWhenloadingRecordServerScript", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetCopyDefault.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetCopyDefault.json index a91e7d4b7..d6cc05912 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetCopyDefault.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetCopyDefault.json @@ -2,5 +2,5 @@ "Id": "Model_SetCopyDefault", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefault.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefault.json index fac04925e..8dd5f1c30 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefault.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefault.json @@ -2,5 +2,5 @@ "Id": "Model_SetDefault", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefaultExec.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefaultExec.json index b5759e8fa..132a0980b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefaultExec.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetDefaultExec.json @@ -2,5 +2,5 @@ "Id": "Model_SetDefaultExec", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetProcessMatchConditions.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetProcessMatchConditions.json index 19fc08c4a..d11de9852 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetProcessMatchConditions.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetProcessMatchConditions.json @@ -2,5 +2,5 @@ "Id": "Model_SetProcessMatchConditions", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetTitleExec.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetTitleExec.json index 168071de6..7bed1f965 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetTitleExec.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetTitleExec.json @@ -2,5 +2,5 @@ "Id": "Model_SetTitleExec", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItems2_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItems2_Body.txt index 8b4d020f6..744c74ece 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItems2_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItems2_Body.txt @@ -1007,6 +1007,7 @@ public string OpenImportSitePackageDialog(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": return Libraries.SitePackages.Utilities.OpenImportSitePackageDialog( context: context, ss: Site.SiteSettings); @@ -1030,6 +1031,7 @@ public string ImportSitePackage(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": default: throw new NotImplementedException(); } @@ -1051,6 +1053,7 @@ public string OpenExportSitePackageDialog(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": return Libraries.SitePackages.Utilities.OpenExportSitePackageDialog( context: context, ss: Site.SiteSettings, @@ -1075,6 +1078,7 @@ public ResponseFile ExportSitePackage(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": return Libraries.SitePackages.Utilities.ExportSitePackage( context: context, ss: Site.SiteSettings); @@ -1101,6 +1105,7 @@ public ContentResultInheritance CopySitePackageByApi(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": var response = Libraries.SitePackages.Utilities.ImportSitePackage( context: context, ss: Site.SiteSettings, diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummary.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummary.json index 31d9b2115..c75c1cfbc 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummary.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummary.json @@ -2,5 +2,5 @@ "Id": "Model_SynchronizeSummary", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummaryExecute.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummaryExecute.json index 9cba19757..a3b2dbada 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummaryExecute.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SynchronizeSummaryExecute.json @@ -2,5 +2,5 @@ "Id": "Model_SynchronizeSummaryExecute", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_TrashBoxGridRowsCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_TrashBoxGridRowsCases.json index 529ff074b..a5f7316bb 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_TrashBoxGridRowsCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_TrashBoxGridRowsCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UnlockRecordCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UnlockRecordCases.json index 67a5706b9..3ea22e9e6 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UnlockRecordCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UnlockRecordCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByApiCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByApiCases.json index b62c3d680..a0244e08b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByApiCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByApiCases.json @@ -1,8 +1,8 @@ { - "Id": "Model_UpdateByApiCases", - "RepeatType": "Table", - "Indent": "4", - "Separator": "\\r\\n", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_UpdateByApiCases", + "RepeatType": "Table", + "Indent": "4", + "Separator": "\\r\\n", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByCalendarCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByCalendarCases.json index 1d641cb19..91cae3065 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByCalendarCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByCalendarCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByGridCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByGridCases.json index 5a9672007..a1f35d71d 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByGridCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByGridCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByKambanCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByKambanCases.json index c84cf17c3..763cf4c74 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByKambanCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByKambanCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByServerScriptCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByServerScriptCases.json index 4b1c04816..6b2afdf31 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByServerScriptCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateByServerScriptCases.json @@ -1,8 +1,8 @@ { - "Id": "Model_UpdateByServerScriptCases", - "RepeatType": "Table", - "Indent": "4", - "Separator": "\\r\\n", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_UpdateByServerScriptCases", + "RepeatType": "Table", + "Indent": "4", + "Separator": "\\r\\n", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateCases.json index 69555cdc8..570eea754 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpdateCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Update_ExecuteAutomaticNumberingExec.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Update_ExecuteAutomaticNumberingExec.json index 3ea020dc3..86445b309 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Update_ExecuteAutomaticNumberingExec.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Update_ExecuteAutomaticNumberingExec.json @@ -2,5 +2,5 @@ "Id": "Model_Update_ExecuteAutomaticNumberingExec", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByApiCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByApiCases.json index 15ab6e049..d3223101a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByApiCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByApiCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByServerScriptCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByServerScriptCases.json index eff19a55c..9649a5c19 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByServerScriptCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_UpsertByServerScriptCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiCreatedMessage.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiCreatedMessage.json index 2d5acc021..a1dd39abb 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiCreatedMessage.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiCreatedMessage.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_ApiCreatedMessage", "Indent": "4", - "Include": "Sites,Wikis" + "Include": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiDuplicatedMessage.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiDuplicatedMessage.json index ebf652d22..ebfec3a39 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiDuplicatedMessage.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiDuplicatedMessage.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ApiDuplicatedMessage", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiUpdatedMessage.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiUpdatedMessage.json index d841cf866..61fa35d82 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiUpdatedMessage.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ApiUpdatedMessage.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_ApiUpdatedMessage", "Indent": "4", - "Include": "Sites,Wikis" + "Include": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Body.txt index 784cbe976..8897f0d9b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Body.txt @@ -96,6 +96,6 @@ namespace Implem.Pleasanter.Models - + } } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkMove.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkMove.json index d8d32f19c..13fc4cd8e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkMove.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkMove.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_BulkMove", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkProcess.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkProcess.json index 8560a2cec..5e6411d0e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkProcess.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkProcess.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_BulkProcess", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate.json index 9b575e18b..e7f9f4dbb 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_BulkUpdate", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Calendar.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Calendar.json index fd8326e37..ac713fadb 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Calendar.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Calendar.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Calendar", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CancelNewRow.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CancelNewRow.json index 11ca7cf18..78f69c7a9 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CancelNewRow.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CancelNewRow.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_CancelNewRow", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ClearOriginalId.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ClearOriginalId.json index c575b97ba..5953e61d9 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ClearOriginalId.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ClearOriginalId.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ClearOriginalId", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy.json index d332cc059..6cc438d63 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Copy", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy_Sites.json index af773ff58..f9d04060f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Copy_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_Copy_Sites", "Indent": "2", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Create.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Create.json index cd918b804..bef3ea946 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Create.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Create.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Create", "Indent": "2", "GenericUi": "1", - "Exclude": "Wikis" + "Exclude": "Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi.json index b80f5c4c6..de28813e2 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi.json @@ -1,6 +1,6 @@ { - "Id": "Model_Utilities_CreateByApi", - "Indent": "2", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_Utilities_CreateByApi", + "Indent": "2", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams.json index 57df8da9f..0f16b4caa 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_CreateParams", "Indent": "2", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams_Sites.json index f56bf585c..802ab7026 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateParams_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_CreateParams_Sites", "Indent": "2", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse.json index fae387514..046c212dd 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_CreatedResponse", "Indent": "5", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites.json index 2eba1c601..2dd63a962 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_CreatedResponse_Sites", "Indent": "5", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites_Body.txt index 0c8663406..610f2f806 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreatedResponse_Sites_Body.txt @@ -2,18 +2,18 @@ context: context, message: Messages.Created( context: context, - data: siteModel.Title.Value)); + data: #modelName#Model.Title.Value)); return new ResponseCollection(context: context) .Response("id", #modelName#Model.#ModelName#Id.ToString()) .SetMemory("formChanged", false) .Href(Locations.Edit( context: context, controller: context.Controller, - id: siteModel.ReferenceType == "Wikis" + id: #modelName#Model.ReferenceType == "Wikis" ? Repository.ExecuteScalar_long( context: context, statements: Rds.SelectWikis( column: Rds.WikisColumn().WikiId(), - where: Rds.WikisWhere().SiteId(siteModel.SiteId))) - : siteModel.SiteId)) + where: Rds.WikisWhere().#ModelName#Id(#modelName#Model.#ModelName#Id))) + : #modelName#Model.#ModelName#Id)) .ToJson(); \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Crosstab.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Crosstab.json index 0a6acafc7..2ee714b54 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Crosstab.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Crosstab.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Crosstab", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Delete.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Delete.json index d441e33f9..e9615b126 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Delete.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Delete.json @@ -1,5 +1,6 @@ { "Id": "Model_Utilities_Delete", "Indent": "2", - "GenericUi": "1" + "GenericUi": "1", + "Exclude": "Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteByApi.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteByApi.json index 9682291c9..ee8e4aabc 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteByApi.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteByApi.json @@ -1,6 +1,6 @@ { - "Id": "Model_Utilities_DeleteByApi", - "Indent": "2", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_Utilities_DeleteByApi", + "Indent": "2", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteHistory_Items.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteHistory_Items.json index 71b5b02b8..13e011b91 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteHistory_Items.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DeleteHistory_Items.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_DeleteHistory_Items", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DuplicatedMessage.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DuplicatedMessage.json index e4dcf8b42..69fc16c70 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DuplicatedMessage.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_DuplicatedMessage.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_DuplicatedMessage", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem.json index d0bb2e4c0..f56eac4d6 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem.json @@ -3,5 +3,5 @@ "Indent": "2", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem_Body.txt index 88b2cf73d..bd03a5d4c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorItem_Body.txt @@ -251,12 +251,7 @@ private static HtmlBuilder Editor( .DataMethod("post"), _using: context.CanManagePermission(ss: ss) && !ss.Locked() - && #modelName#Model.MethodType != BaseModel.MethodTypes.New) - .EditorMainCommands( - context: context, - ss: ss, - #modelName#Model: #modelName#Model, - serverScriptModelRow: serverScriptModelRow)) + && #modelName#Model.MethodType != BaseModel.MethodTypes.New)) .Hidden( controlId: "BaseUrl", value: Locations.BaseUrl(context: context)) diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorJson.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorJson.json index bc81f4364..e216b7fe4 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorJson.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorJson.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_EditorJson", "Indent": "2", "GenericUi": "1", - "Exclude": "Sites,Issues,Results" + "Exclude": "Sites,Issues,Results,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorMainCommands.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorMainCommands.json new file mode 100644 index 000000000..55786f145 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorMainCommands.json @@ -0,0 +1,6 @@ +{ + "Id": "Model_Utilities_EditorMainCommands", + "Indent": "8", + "ItemOnly": "1", + "Include": "Issues,Results" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorMainCommands_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorMainCommands_Body.txt new file mode 100644 index 000000000..bc8e5aaf6 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorMainCommands_Body.txt @@ -0,0 +1,6 @@ + +.EditorMainCommands( + context: context, + ss: ss, + #modelName#Model: #modelName#Model, + serverScriptModelRow: serverScriptModelRow) \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorResponse.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorResponse.json index febea7500..a8dd63ff9 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorResponse.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_EditorResponse.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_EditorResponse", "Indent": "2", "GenericUi": "1", - "Exclude": "Issues,Results" + "Exclude": "Issues,Results,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExecGridNewRows.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExecGridNewRows.json index 53555e488..feb0b7107 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExecGridNewRows.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExecGridNewRows.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ExecGridNewRows", "Indent": "5", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExistsLockedRecord.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExistsLockedRecord.json index 832c9f7bc..b17fb108c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExistsLockedRecord.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExistsLockedRecord.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ExistsLockedRecord", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export.json index 98965750b..215e232a7 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Export", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExportCrosstab.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExportCrosstab.json index 148431dc6..a9c72643a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExportCrosstab.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ExportCrosstab.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ExportCrosstab", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldResponse.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldResponse.json index 4ec104375..8b2623320 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldResponse.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldResponse.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_FieldResponse", "Indent": "2", "GenericUi": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FormDataSet.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FormDataSet.json index b1241d22a..48c5515e3 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FormDataSet.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FormDataSet.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_FormDataSet", "Indent": "6", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetByApi.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetByApi.json index 51eaf6f2d..8fcb79496 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetByApi.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetByApi.json @@ -1,6 +1,6 @@ { - "Id": "Model_Utilities_GetByApi", - "Indent": "2", - "ItemOnly": "1", - "Exclude": "Sites" + "Id": "Model_Utilities_GetByApi", + "Indent": "2", + "ItemOnly": "1", + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetFormDataSet.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetFormDataSet.json index fbf95342e..59d863686 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetFormDataSet.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetFormDataSet.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_GetFormDataSet", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetServerScriptModelRow.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetServerScriptModelRow.json index b862ffbda..03c765ee4 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetServerScriptModelRow.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GetServerScriptModelRow.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_GetServerScriptModelRow", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridCopyRowFormData.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridCopyRowFormData.json index c91e98baf..784f18c95 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridCopyRowFormData.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridCopyRowFormData.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_GridCopyRowFormData", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRowParameters.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRowParameters.json index d6efd516a..bd8518fee 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRowParameters.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRowParameters.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_GridNewRowParameters", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRows.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRows.json index 7274ca10a..6f7afdfd0 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRows.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_GridNewRows.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_GridNewRows", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Histories.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Histories.json index e0735cf88..48ae087cc 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Histories.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Histories.json @@ -1,5 +1,6 @@ { "Id": "Model_Utilities_Histories", "Indent": "2", - "GenericUi": "1" + "GenericUi": "1", + "Exclude": "Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams.json index 20589a9aa..d87647486 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_HistoriesParams", "Indent": "2", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams_Sites.json index bf4489552..b83c34600 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesParams_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_HistoriesParams_Sites", "Indent": "2", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesSetChoiceHash.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesSetChoiceHash.json index 9bd338345..0c3f25326 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesSetChoiceHash.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_HistoriesSetChoiceHash.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_HistoriesSetChoiceHash", "Indent": "8", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History.json index bec0cba75..2b122ea3a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_History", "Indent": "2", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History_Sites.json index 88e85a3ca..2ec85658c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_History_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_History_Sites", "Indent": "2", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ImageLib.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ImageLib.json index 2c6adad13..d882a4c57 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ImageLib.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ImageLib.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ImageLib", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import.json index 7f13b4284..9b171b1d3 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Import", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InRange.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InRange.json index acd3d6b65..ead7a8031 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InRange.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InRange.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_InRange", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InitSiteSettings.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InitSiteSettings.json index 794965651..994f94539 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InitSiteSettings.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InitSiteSettings.json @@ -1,4 +1,4 @@ { "Id": "Model_Utilities_InitSiteSettings", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InputValidator.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InputValidator.json index 325118a0d..01a8cfc6e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InputValidator.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_InputValidator.json @@ -3,5 +3,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Kamban.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Kamban.json index 7fe0da124..ff0dd3f95 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Kamban.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Kamban.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Kamban", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Limit_Items.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Limit_Items.json index f7f6a8b5e..c3a6efca6 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Limit_Items.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Limit_Items.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Limit_Items", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Move.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Move.json index ed3712cbe..fdf9af582 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Move.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Move.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Move", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewOnGrid.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewOnGrid.json index d4ea2092d..1e39e571f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewOnGrid.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewOnGrid.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_NewOnGrid", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowParameters.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowParameters.json index c79d803d4..faaeddc33 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowParameters.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowParameters.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_NewRowParameters", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowVal.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowVal.json index 5d10f536f..aeeb5d1dc 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowVal.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_NewRowVal.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_NewRowVal", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_OnUpdated_Breadcrumb_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_OnUpdated_Breadcrumb_Sites.json index ef721f9ba..aca63fee7 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_OnUpdated_Breadcrumb_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_OnUpdated_Breadcrumb_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_OnUpdated_Breadcrumb_Sites", "Indent": "5", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Pdf.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Pdf.json index 565bc0fb4..2ba912395 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Pdf.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Pdf.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Pdf", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items.json index a814653bb..d4368fd8f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_PhysicalBulkDeleteByApi_Items", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Items.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Items.json index 39cb35419..810545ae9 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Items.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Items.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_PhysicalBulkDelete_Items", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Sites.json index 462944b0b..6da521869 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDelete_Sites.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_PhysicalBulkDelete_Sites", "Indent": "2", "ItemOnly": "1", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PreviousTitle.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PreviousTitle.json index 5f8960440..af3df7ece 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PreviousTitle.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PreviousTitle.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_PreviousTitle", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ProcessProperty.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ProcessProperty.json index d1b32ded8..e24989dc5 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ProcessProperty.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ProcessProperty.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_ProcessProperty", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDeleteItem.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDeleteItem.json index c526ead54..0f3941bcb 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDeleteItem.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDeleteItem.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_RedirectAfterDeleteItem", "Indent": "5", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDelete_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDelete_Sites.json index f1f8d4b07..bf8e978c6 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDelete_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_RedirectAfterDelete_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_RedirectAfterDelete_Sites", "Indent": "5", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ReplaceLine.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ReplaceLine.json new file mode 100644 index 000000000..fae2b78e4 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ReplaceLine.json @@ -0,0 +1,7 @@ +{ + "Id": "Model_Utilities_ReplaceLine", + "Indent": "2", + "Separator": "\\r\\n", + "ItemOnly": "1", + "Exclude": "Sites,Wikis,Dashboards" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_TableCases_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ReplaceLine_Body.txt similarity index 51% rename from Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_TableCases_Body.txt rename to Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ReplaceLine_Body.txt index ddf8a7e14..a4a25434e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_TableCases_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ReplaceLine_Body.txt @@ -1,12 +1,28 @@ -case "#TableName#": - var #modelName#Model = new #ModelName#Model( - context: context, ss: ss, dataRow: dataRow); - ss.IncludedColumns(line).ForEach(column => +public static string ReplaceLineBy#ModelName#Model( + this #ModelName#Model #modelName#Model, + Context context, + SiteSettings ss, + string line, + string itemTitle, + bool checkColumnAccessControl = false) +{ + foreach (var column in ss.IncludedColumns(line)) { + var allowed = checkColumnAccessControl == false + || ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: #modelName#Model.Mine(context: context)); + if (!allowed) + { + line = line.Replace($"[{column.Name}]", string.Empty); + continue; + } switch (column.ColumnName) { case "Title": - line = line.Replace("[Title]", dataRow.String("ItemTitle")); + line = line.Replace("[Title]", itemTitle); break; @@ -16,41 +32,37 @@ { case "Class": line = line.Replace( - $"[{column.Name}]", - #modelName#Model.GetClass(column: column).ToExport( + $"[{column.Name}]", #modelName#Model.GetClass(column: column).ToExport( context: context, column: column)); break; case "Num": line = line.Replace( - $"[{column.Name}]", - #modelName#Model.GetNum(column: column).ToExport( + $"[{column.Name}]", #modelName#Model.GetNum(column: column).ToExport( context: context, column: column)); break; case "Date": line = line.Replace( - $"[{column.Name}]", - #modelName#Model.GetDate(column: column).ToExport( + $"[{column.Name}]", #modelName#Model.GetDate(column: column).ToExport( context: context, column: column)); break; case "Description": line = line.Replace( - $"[{column.Name}]", - #modelName#Model.GetDescription(column: column).ToExport( + $"[{column.Name}]", #modelName#Model.GetDescription(column: column).ToExport( context: context, column: column)); break; case "Check": line = line.Replace( - $"[{column.Name}]", - #modelName#Model.GetCheck(column: column).ToExport( + $"[{column.Name}]", #modelName#Model.GetCheck(column: column).ToExport( context: context, column: column)); break; } break; } - }); - break; \ No newline at end of file + } + return line; +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseBreadcrumb_Tenants.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseBreadcrumb_Tenants.json new file mode 100644 index 000000000..b6ac0ea80 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseBreadcrumb_Tenants.json @@ -0,0 +1,6 @@ +{ + "Id": "Model_Utilities_ResponseBreadcrumb_Tenants", + "Indent": "4", + "GenericUi": "1", + "Include": "Tenants" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseBreadcrumb_Tenants_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseBreadcrumb_Tenants_Body.txt new file mode 100644 index 000000000..28b27b1d1 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseBreadcrumb_Tenants_Body.txt @@ -0,0 +1,3 @@ +.ReplaceAll("#Breadcrumb", new HtmlBuilder().TenantsBreadcrumb( + context: context, + ss:ss)) \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_FieldResponse.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_FieldResponse.json index 4930b4a8a..f1155f322 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_FieldResponse.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_FieldResponse.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ResponseByUpdate_FieldResponse", "Indent": "5", "GenericUi": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_SiteSettings.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_SiteSettings.json index 9cbcb3648..efff44209 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_SiteSettings.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseByUpdate_SiteSettings.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_ResponseByUpdate_SiteSettings", "Indent": "3", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLinks.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLinks.json index 498263f0a..16cdcfa06 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLinks.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLinks.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ResponseLinks", "Indent": "5", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLockedRecord.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLockedRecord.json index 24f6de3a9..43bb2e4f4 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLockedRecord.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_ResponseLockedRecord.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_ResponseLockedRecord", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Restore_Items.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Restore_Items.json index 587bc5bf1..3dadd4158 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Restore_Items.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Restore_Items.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_Restore_Items", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SearchIndexes_TableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SearchIndexes_TableCases.json index 14cdca51d..54835ccb0 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SearchIndexes_TableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SearchIndexes_TableCases.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SelectedIds.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SelectedIds.json index fe23af993..0e5fdcae9 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SelectedIds.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SelectedIds.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SelectedIds", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions.json index 1c043a7c0..5f69946ce 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions.json @@ -3,5 +3,5 @@ "Indent": "2", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions_Items_TableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions_Items_TableCases.json index 38ab64efc..56e46095e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions_Items_TableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetChoiceHashByFilterExpressions_Items_TableCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameter.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameter.json index b86c2479d..49e43d9c2 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameter.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameter.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetEditRowParameter", "Indent": "6", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameterByContext.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameterByContext.json index bf294f86d..b9336e5ce 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameterByContext.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetEditRowParameterByContext.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetEditRowParameterByContext", "Indent": "7", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle.json index 724d01e34..f74ef966d 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle_TableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle_TableCases.json index 097fbfbb1..7875c6ac5 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle_TableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetItemTitle_TableCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetLinks.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetLinks.json index 4060baabd..544639b55 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetLinks.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetLinks.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetLinks", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNewRowParameters.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNewRowParameters.json index 6a48e5e69..d76fc7aa1 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNewRowParameters.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNewRowParameters.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetNewRowParameters", "Indent": "5", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNoticeParam.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNoticeParam.json index 26fbdb9d1..bfef6595c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNoticeParam.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetNoticeParam.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_SetNoticeParam", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessApi_Tables.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessApi_Tables.json index 047ada157..92bb65f30 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessApi_Tables.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessApi_Tables.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetProcessApi_Tables", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessMatchConditions.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessMatchConditions.json index e2000b963..e61347a9b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessMatchConditions.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessMatchConditions.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetProcessMatchConditions", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessParamApi.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessParamApi.json index 046bb63d8..5e69ceb32 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessParamApi.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcessParamApi.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetProcessParamApi", "Indent": "4", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcess_Tables.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcess_Tables.json index c3f28ce22..2d54892d5 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcess_Tables.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SetProcess_Tables.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SetProcess_Tables", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteModel.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteModel.json index 79ff05c6d..841a5ff5a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteModel.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteModel.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_SiteModel", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteSettingsUtilities.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteSettingsUtilities.json index 8ca22b744..626dcc05c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteSettingsUtilities.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_SiteSettingsUtilities.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_SiteSettingsUtilities", "Indent": "4", - "Exclude": "Sites,Permissions,OutgoingMails,Links" + "Exclude": "Sites,Permissions,OutgoingMails,Links,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableDisplayNameCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableDisplayNameCases.json index 955064328..a67ef90c6 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableDisplayNameCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableDisplayNameCases.json @@ -5,5 +5,5 @@ "Separator": "\\r\\n", "Order": "ItemId", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName.json index b9037af95..236ef1399 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_TableName", "Indent": "2", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableNameCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableNameCases.json index df2ccc6d1..e310990c0 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableNameCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableNameCases.json @@ -5,5 +5,5 @@ "Separator": ",\\r\\n", "Order": "ItemId", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName_Body.txt index 01524f690..bf36694e1 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TableName_Body.txt @@ -20,7 +20,12 @@ context: context, referenceType: "Sites")) }, - + { + "Dashboards", + new ControlData(ReferenceTypeDisplayName( + context: context, + referenceType: "Dashboards")) + }, }, @@ -36,7 +41,7 @@ private static string ReferenceTypeDisplayName(Context context, string reference switch (referenceType) { case "Sites": return Displays.Folder(context: context); - + case "Dashboards": return Displays.Get(context: context, id: "Dashboards"); default: return null; diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TimeSeries.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TimeSeries.json index d467eb141..b59d448f8 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TimeSeries.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TimeSeries.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_TimeSeries", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TitleDisplay.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TitleDisplay.json index 309092156..6c0bb3529 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TitleDisplay.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_TitleDisplay.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_TitleDisplay", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UnlockRecord.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UnlockRecord.json index ea3876fea..e63733530 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UnlockRecord.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UnlockRecord.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_UnlockRecord", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update.json index 6d619055d..dc4243d31 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update.json @@ -1,5 +1,6 @@ { "Id": "Model_Utilities_Update", "Indent": "2", - "GenericUi": "1" + "GenericUi": "1", + "Exclude": "Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi.json index 7a033564d..3bbaa5064 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_UpdateByApi", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByGrid.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByGrid.json index 815ddf88f..67f073e84 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByGrid.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByGrid.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_UpdateByGrid", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByKamban.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByKamban.json index ab27367ac..3be9a485f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByKamban.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByKamban.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_UpdateByKamban", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems.json index fd82d5a7a..da06318ca 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems.json @@ -2,5 +2,5 @@ "Id": "Model_Utilities_UpdateItems", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems_Sites.json index c1006740c..003c07ece 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateItems_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_UpdateItems_Sites", "Indent": "3", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateParameters_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateParameters_Sites.json index bb77e01cd..79bd109d3 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateParameters_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateParameters_Sites.json @@ -1,4 +1,4 @@ { "Id": "Model_Utilities_UpdateParameters_Sites", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel.json index 1e23f7d20..b1a13168c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_Update_NewModel", "Indent": "3", - "Exclude": "Sites" + "Exclude": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel_Sites.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel_Sites.json index 96e5d7c97..37235618c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel_Sites.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_NewModel_Sites.json @@ -1,5 +1,5 @@ { "Id": "Model_Utilities_Update_NewModel_Sites", "Indent": "3", - "Include": "Sites" + "Include": "Sites,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_Response_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_Response_Body.txt index ef7fd58da..c69638fa8 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_Response_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Update_Response_Body.txt @@ -11,6 +11,9 @@ return res .Val("#VerUp", verUp) .Val("#Ver", #modelName#Model.Ver) .Disabled("#VerUp", verUp) + + + .Html("#HeaderTitle", HttpUtility.HtmlEncode(#modelName#Model.Title.Value)) .Html("#RecordInfo", new HtmlBuilder().RecordInfo( context: context, diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttaching.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttaching.json index 28dc8ca94..0fe823a80 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttaching.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttaching.json @@ -2,5 +2,5 @@ "Id": "Model_Validator_OnAttaching", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod.json index b4890f50a..085befd46 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod.json @@ -2,5 +2,5 @@ "Id": "Model_Validator_OnAttachingMethod", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidating.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidating.json index 913e855a2..6c05ab86a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidating.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidating.json @@ -2,5 +2,5 @@ "Id": "Model_Validator_OnInputValidating", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidatingMethod.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidatingMethod.json index e5f2d73a8..e13b34663 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidatingMethod.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnInputValidatingMethod.json @@ -2,5 +2,5 @@ "Id": "Model_Validator_OnInputValidatingMethod", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnMoving.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnMoving.json index 29c1dd9e1..677b08188 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnMoving.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnMoving.json @@ -2,5 +2,5 @@ "Id": "Model_Validator_OnMoving", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute.json index d24b18f4f..1d131b554 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute.json @@ -2,5 +2,5 @@ "Id": "Model_WriteAttachmentsExecute", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute_Update.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute_Update.json index 9d45f5e32..2784c215a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute_Update.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_WriteAttachmentsExecute_Update.json @@ -2,5 +2,5 @@ "Id": "Model_WriteAttachmentsExecute_Update", "Indent": "3", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_Body.txt index cf60e87bb..97e9af42d 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_Body.txt @@ -6,9 +6,16 @@ { switch (ss.ReferenceType) { - - - + case "Issues": + var issueModel = new IssueModel( + context: context, ss: ss, dataRow: dataRow); + line = issueModel.ReplaceLineByIssueModel(context, ss, line, dataRow.String("ItemTitle")); + break; + case "Results": + var resultModel = new ResultModel( + context: context, ss: ss, dataRow: dataRow); + line = resultModel.ReplaceLineByResultModel(context, ss, line, dataRow.String("ItemTitle")); + break; } return line; } diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases.json index 69e6ed65d..2c6e60b10 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases.json @@ -1,7 +1,7 @@ { "Id": "Reminder_ColumnCases", "RepeatType": "Column", - "Indent": "7", + "Indent": "5", "Separator": "\\r\\n", "Update": "1", "Exclude": "Title", diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases_Body.txt index dfd561937..8aec0399a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_ColumnCases_Body.txt @@ -1,7 +1,6 @@ case "#ColumnName#": line = line.Replace( - "[#ColumnName#]", - #modelName#Model.#ColumnName#.ToExport( + "[#ColumnName#]", #modelName#Model.#ColumnName#.ToExport( context: context, column: column)); break; \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_TableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_TableCases.json deleted file mode 100644 index 429940445..000000000 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Reminder_TableCases.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Id": "Reminder_TableCases", - "RepeatType": "Table", - "Indent": "4", - "Separator": "\\r\\n", - "ItemOnly": "1", - "Exclude": "Sites,Wikis" -} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_DataTablesCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_DataTablesCases.json index 3c27f2c94..f6850df03 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_DataTablesCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_DataTablesCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageColumns.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageColumns.json index 35f658404..25a07b71c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageColumns.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageColumns.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageTableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageTableCases.json index 2e328e8e5..42e263c0e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageTableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectAverageTableCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectCountTables.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectCountTables.json index 12f162116..71552efe7 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectCountTables.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectCountTables.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxColumns.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxColumns.json index c386f226c..f9c92bb7a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxColumns.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxColumns.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxTableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxTableCases.json index 88d7c41b5..d36bc572d 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxTableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMaxTableCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinColumns.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinColumns.json index 56616aad0..1ebe1d1ad 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinColumns.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinColumns.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinTableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinTableCases.json index 1324ec5cb..3277d4230 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinTableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectMinTableCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalColumns.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalColumns.json index 190412492..c79ff6d10 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalColumns.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalColumns.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalTableCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalTableCases.json index b618c8940..3e221a268 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalTableCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SelectTotalTableCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeCases.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeCases.json index 9f5e2d727..5582b1e24 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeCases.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeCases.json @@ -4,5 +4,5 @@ "Indent": "4", "Separator": "\\r\\n", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeTables.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeTables.json index cff15dca2..b2688b59c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeTables.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_SynchronizeTables.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_WhereTables.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_WhereTables.json index 9181f882f..464e4b68e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_WhereTables.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Summaries_WhereTables.json @@ -3,5 +3,5 @@ "RepeatType": "Table", "Indent": "2", "ItemOnly": "1", - "Exclude": "Sites,Wikis" + "Exclude": "Sites,Wikis,Dashboards" } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Dashboards_DashboardId.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Dashboards_DashboardId.json new file mode 100644 index 000000000..e706e67cb --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Dashboards_DashboardId.json @@ -0,0 +1,43 @@ +{ + "Id": "Dashboards_DashboardId", + "ModelName": "Dashboard", + "TableName": "Dashboards", + "Label": "ダッシュボード", + "ColumnName": "DashboardId", + "LabelText": "ID", + "No": "4", + "History": "2", + "Export": "4", + "GridColumn": "4", + "GridEnabled": "1", + "FilterColumn": "4", + "EditorColumn": "4", + "EditorEnabled": "1", + "TitleColumn": "4", + "LinkColumn": "4", + "LinkEnabled": "1", + "HistoryColumn": "4", + "TypeName": "bigint", + "Pk": "10", + "PkHistory": "2", + "Ix1": "1", + "Ix2": "1", + "Ix3": "3", + "Unique": "1", + "Required": "1", + "SearchIndexPriority": "1", + "ItemId": "20", + "GenericUi": "1", + "ControlCss": " not-send", + "ControlType": "Id", + "EditorReadOnly": "1", + "ImportKey": "1", + "FullTextType": "1", + "SettingEnable": "1", + "LabelText_en": "ID", + "LabelText_zh": "ID", + "LabelText_de": "ID", + "LabelText_ko": "ID", + "LabelText_es": "Identificación", + "LabelText_vn": "ID" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Dashboards_Locked.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Dashboards_Locked.json new file mode 100644 index 000000000..9897a3a62 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Dashboards_Locked.json @@ -0,0 +1,30 @@ +{ + "Id": "Dashboards_Locked", + "ModelName": "Dashboard", + "TableName": "Dashboards", + "Label": "期限付きテーブル", + "ColumnName": "Locked", + "LabelText": "ロック", + "No": "109", + "History": "109", + "Export": "109", + "GridColumn": "109", + "FilterColumn": "109", + "FilterEnabled": "1", + "EditorColumn": "109", + "TitleColumn": "109", + "LinkColumn": "109", + "HistoryColumn": "109", + "TypeName": "bit", + "Ix3": "2", + "Nullable": "1", + "CheckFilterControlType": 1, + "CopyByDefault": "1", + "SettingEnable": "1", + "LabelText_en": "Locked", + "LabelText_zh": "已锁定", + "LabelText_de": "Gesperrt", + "LabelText_ko": "잠김", + "LabelText_es": "Bloqueado", + "LabelText_vn": "Khóa" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Tenants_TopDashboards.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Tenants_TopDashboards.json new file mode 100644 index 000000000..633e9504b --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Tenants_TopDashboards.json @@ -0,0 +1,20 @@ +{ + "Id": "Tenants_TopDashboards", + "ModelName": "Tenant", + "TableName": "Tenants", + "Label": "テナント", + "ColumnName": "TopDashboards", + "LabelText": "トップのダッシュボード", + "No": "120", + "History": "120", + "TypeName": "nvarchar", + "Nullable": "1", + "MaxLength": "-1", + "ByForm": "$\"[{value.ToLong()}]\"", + "LabelText_en": "Top Dashboards", + "LabelText_zh": "顶部仪表板", + "LabelText_de": "Obere Seite Dashboard", + "LabelText_ko": "홈페이지의 대시보드", + "LabelText_es": "Salpicadero de la pantalla superior", + "LabelText_vn": "Bảng điều khiển hàng đầu" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_en.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_en.json new file mode 100644 index 000000000..939f43c60 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_en.json @@ -0,0 +1,7 @@ +{ + "Id": "Dashboard_en", + "Language": "en", + "Title": "Dashboard", + "Description": "You can create a screen that allows you to freely combine various information and instantly confirm the necessary information at a glance.", + "Standard": "5" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_en_SiteSettingsTemplate.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_en_SiteSettingsTemplate.json new file mode 100644 index 000000000..0c00da0b5 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_en_SiteSettingsTemplate.json @@ -0,0 +1,4 @@ +{ + "Version": 1.011, + "ReferenceType": "Dashboards" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_ja.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_ja.json new file mode 100644 index 000000000..2e98ba130 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_ja.json @@ -0,0 +1,7 @@ +{ + "Id": "Dashboard_ja", + "Language": "ja", + "Title": "ダッシュボード", + "Description": "様々な情報を自由に組み合わせて、必要な情報をひと目で確認できる画面を作ることができます。", + "Standard": "5" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_ja_SiteSettingsTemplate.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_ja_SiteSettingsTemplate.json new file mode 100644 index 000000000..0c00da0b5 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Dashboard_ja_SiteSettingsTemplate.json @@ -0,0 +1,4 @@ +{ + "Version": 1.011, + "ReferenceType": "Dashboards" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/Columns.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/Columns.sql index f526c2d0a..5b3b79fcc 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/Columns.sql +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/Columns.sql @@ -22,6 +22,6 @@ else 0 end as "is_identity" from information_schema.columns -where table_schema = 'public' +where table_schema = '#SchemaName#' and table_name = '#TableName#' order by table_name, ordinal_position; diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateDatabase.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateDatabase.sql index 1264bf413..965aeded3 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateDatabase.sql +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateDatabase.sql @@ -1 +1 @@ -create database "#InitialCatalog#"; \ No newline at end of file +select 1 as dummy; \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateDatabaseForPostgres.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateDatabaseForPostgres.sql new file mode 100644 index 000000000..691268370 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateDatabaseForPostgres.sql @@ -0,0 +1 @@ +CREATE DATABASE "#InitialCatalog#" OWNER "#Uid_Owner#"; diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginAdmin.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginAdmin.sql index 1bcdfc4c7..5f282702b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginAdmin.sql +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginAdmin.sql @@ -1,2 +1 @@ -create user "#Uid#" with login password '#Pwd#' valid until 'infinity'; -alter role "#Uid#"; \ No newline at end of file + \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginUser.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginUser.sql index 1bcdfc4c7..5f282702b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginUser.sql +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateLoginUser.sql @@ -1,2 +1 @@ -create user "#Uid#" with login password '#Pwd#' valid until 'infinity'; -alter role "#Uid#"; \ No newline at end of file + \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateSchema.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateSchema.sql new file mode 100644 index 000000000..9b7305e71 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateSchema.sql @@ -0,0 +1,3 @@ +CREATE SCHEMA "#SchemaName#" AUTHORIZATION "#Uid_Owner#"; +GRANT USAGE ON SCHEMA "#SchemaName#" TO "#Uid_User#"; +CREATE EXTENSION IF NOT EXISTS pg_trgm; diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateUserForPostgres.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateUserForPostgres.sql new file mode 100644 index 000000000..69f32c4d1 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/CreateUserForPostgres.sql @@ -0,0 +1,7 @@ +CREATE USER "#Uid_Owner#" WITH LOGIN PASSWORD '#Pwd_Owner#' valid until 'infinity'; + +ALTER ROLE "#Uid_Owner#"; +CREATE USER "#Uid_User#" WITH LOGIN PASSWORD '#Pwd_User#' valid until 'infinity'; + +ALTER USER "#Uid_Owner#" SET search_path TO "#SchemaName#"; +ALTER USER "#Uid_User#" SET search_path TO "#SchemaName#"; diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/ExistsSchema.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/ExistsSchema.sql new file mode 100644 index 000000000..b83a3b916 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/ExistsSchema.sql @@ -0,0 +1 @@ +select nspname from pg_namespace where nspname = '#SchemaName#'; diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/ExistsTable.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/ExistsTable.sql index fff7a1481..21cd042b8 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/ExistsTable.sql +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/ExistsTable.sql @@ -1,3 +1,3 @@ select table_name from information_schema.tables -where table_schema = 'public' and table_name = '#TableName#'; \ No newline at end of file +where table_schema = '#SchemaName#' and table_name = '#TableName#'; \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/GrantPrivilegeUser.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/GrantPrivilegeUser.sql index aa1191304..b656e176f 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/GrantPrivilegeUser.sql +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/PostgreSQL/GrantPrivilegeUser.sql @@ -1 +1 @@ -grant select, insert, update, delete on all tables in schema public to "#Uid#"; \ No newline at end of file +grant select, insert, update, delete on all tables in schema "#SchemaName#" to "#Uid#"; \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateDatabaseForPostgres.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateDatabaseForPostgres.sql new file mode 100644 index 000000000..965aeded3 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateDatabaseForPostgres.sql @@ -0,0 +1 @@ +select 1 as dummy; \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateSchema.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateSchema.sql new file mode 100644 index 000000000..5a493d496 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateSchema.sql @@ -0,0 +1 @@ +select 1 as dummy; diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateUserForPostgres.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateUserForPostgres.sql new file mode 100644 index 000000000..5a493d496 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/CreateUserForPostgres.sql @@ -0,0 +1 @@ +select 1 as dummy; diff --git a/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/ExistsSchema.sql b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/ExistsSchema.sql new file mode 100644 index 000000000..965aeded3 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Sqls/SQLServer/ExistsSchema.sql @@ -0,0 +1 @@ +select 1 as dummy; \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/DashboardCustom.json b/Implem.Pleasanter/App_Data/Displays/DashboardCustom.json new file mode 100644 index 000000000..6a9414c80 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/DashboardCustom.json @@ -0,0 +1,33 @@ +{ + "Id": "DashboardCustom", + "Type": 110, + "Languages": [ + { + "Body": "Custom" + }, + { + "Language": "zh", + "Body": "自定义" + }, + { + "Language": "ja", + "Body": "カスタム" + }, + { + "Language": "de", + "Body": "Anpassen" + }, + { + "Language": "ko", + "Body": "사용자 설정" + }, + { + "Language": "es", + "Body": "Personalizado" + }, + { + "Language": "vn", + "Body": "Tùy chỉnh" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/DashboardCustomHtml.json b/Implem.Pleasanter/App_Data/Displays/DashboardCustomHtml.json new file mode 100644 index 000000000..018da2598 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/DashboardCustomHtml.json @@ -0,0 +1,33 @@ +{ + "Id": "DashboardCustomHtml", + "Type": 110, + "Languages": [ + { + "Body": "Custom HTML" + }, + { + "Language": "zh", + "Body": "自定义HTML" + }, + { + "Language": "ja", + "Body": "カスタムHTML" + }, + { + "Language": "de", + "Body": "Eigenes HTML" + }, + { + "Language": "ko", + "Body": "사용자 지정 HTML" + }, + { + "Language": "es", + "Body": "HTML personalizado" + }, + { + "Language": "vn", + "Body": "HTML tùy chỉnh" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/DashboardGuide.json b/Implem.Pleasanter/App_Data/Displays/DashboardGuide.json new file mode 100644 index 000000000..47fed8fde --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/DashboardGuide.json @@ -0,0 +1,33 @@ +{ + "Id": "DashboardGuide", + "Type": 110, + "Languages": [ + { + "Body": "Dashboard guide" + }, + { + "Language": "zh", + "Body": "仪表盘指南" + }, + { + "Language": "ja", + "Body": "ダッシュボードのガイド" + }, + { + "Language": "de", + "Body": "Dashboard-Leitfaden" + }, + { + "Language": "ko", + "Body": "대시보드 가이드" + }, + { + "Language": "es", + "Body": "Guía del tablero de instrumentos" + }, + { + "Language": "vn", + "Body": "Hướng dẫn bảng điều khiển" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/DashboardParts.json b/Implem.Pleasanter/App_Data/Displays/DashboardParts.json new file mode 100644 index 000000000..34be55682 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/DashboardParts.json @@ -0,0 +1,33 @@ +{ + "Id": "DashboardParts", + "Type": 110, + "Languages": [ + { + "Body": "Dashboard parts" + }, + { + "Language": "zh", + "Body": "仪表盘零件" + }, + { + "Language": "ja", + "Body": "ダッシュボードパーツ" + }, + { + "Language": "de", + "Body": "Armaturenbrettteile" + }, + { + "Language": "ko", + "Body": "대시보드 부품" + }, + { + "Language": "es", + "Body": "Piezas del tablero de instrumentos" + }, + { + "Language": "vn", + "Body": "Các bộ phận bảng điều khiển" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/Dashboards.json b/Implem.Pleasanter/App_Data/Displays/Dashboards.json new file mode 100644 index 000000000..78eb4d488 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/Dashboards.json @@ -0,0 +1,33 @@ +{ + "Id": "Dashboards", + "Type": 110, + "Languages": [ + { + "Body": "Dashboard" + }, + { + "Language": "zh", + "Body": "仪表盘" + }, + { + "Language": "ja", + "Body": "ダッシュボード" + }, + { + "Language": "de", + "Body": "Das Armaturenbrett" + }, + { + "Language": "ko", + "Body": "대시보드" + }, + { + "Language": "es", + "Body": "Tablero de instrumentos" + }, + { + "Language": "vn", + "Body": "Bảng điều khiển" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/DisplayCount.json b/Implem.Pleasanter/App_Data/Displays/DisplayCount.json new file mode 100644 index 000000000..6189d35a7 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/DisplayCount.json @@ -0,0 +1,33 @@ +{ + "Id": "DisplayCount", + "Type": 110, + "Languages": [ + { + "Body": "Number of displays" + }, + { + "Language": "zh", + "Body": "显示数量" + }, + { + "Language": "ja", + "Body": "表示件数" + }, + { + "Language": "de", + "Body": "Anzahl der Anzeigen" + }, + { + "Language": "ko", + "Body": "표시 개수" + }, + { + "Language": "es", + "Body": "Número de visualizaciones" + }, + { + "Language": "vn", + "Body": "Số lượng hiển thị" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/DisplayTitle.json b/Implem.Pleasanter/App_Data/Displays/DisplayTitle.json new file mode 100644 index 000000000..b3af332a7 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/DisplayTitle.json @@ -0,0 +1,33 @@ +{ + "Id": "DisplayTitle", + "Type": 110, + "Languages": [ + { + "Body": "Show title" + }, + { + "Language": "zh", + "Body": "显示标题" + }, + { + "Language": "ja", + "Body": "タイトルを表示する" + }, + { + "Language": "de", + "Body": "Titel anzeigen" + }, + { + "Language": "ko", + "Body": "타이틀 표시" + }, + { + "Language": "es", + "Body": "Mostrar título" + }, + { + "Language": "vn", + "Body": "Hiển thị tiêu đề" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/Height.json b/Implem.Pleasanter/App_Data/Displays/Height.json new file mode 100644 index 000000000..fd491a448 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/Height.json @@ -0,0 +1,33 @@ +{ + "Id": "Height", + "Type": 110, + "Languages": [ + { + "Body": "Height" + }, + { + "Language": "zh", + "Body": "高度" + }, + { + "Language": "ja", + "Body": "高さ" + }, + { + "Language": "de", + "Body": "Höhe" + }, + { + "Language": "ko", + "Body": "높이" + }, + { + "Language": "es", + "Body": "Altura" + }, + { + "Language": "vn", + "Body": "Cao" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/Horizontal.json b/Implem.Pleasanter/App_Data/Displays/Horizontal.json new file mode 100644 index 000000000..be03d46d8 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/Horizontal.json @@ -0,0 +1,33 @@ +{ + "Id": "Horizontal", + "Type": 110, + "Languages": [ + { + "Body": "Horizontal" + }, + { + "Language": "zh", + "Body": "水平" + }, + { + "Language": "ja", + "Body": "横方向" + }, + { + "Language": "de", + "Body": "Horizontal" + }, + { + "Language": "ko", + "Body": "가로" + }, + { + "Language": "es", + "Body": "Horizontal" + }, + { + "Language": "vn", + "Body": "Ngang" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/InvalidTimeLineSites.json b/Implem.Pleasanter/App_Data/Displays/InvalidTimeLineSites.json new file mode 100644 index 000000000..39ef9e45f --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/InvalidTimeLineSites.json @@ -0,0 +1,33 @@ +{ + "Id": "InvalidTimeLineSites", + "Type": 110, + "Languages": [ + { + "Body": "Specify the site ID or site group name of the record table or deadline table" + }, + { + "Language": "zh", + "Body": "指定记录表或截止日期表的站点ID或站点组名" + }, + { + "Language": "ja", + "Body": "記録テーブルまたは期限付きテーブルのサイトIDもしくはサイトグループ名を指定してください。" + }, + { + "Language": "de", + "Body": "Geben Sie die Site-ID oder den Namen der Site-Gruppe für die Aufzeichnungstabelle oder die Fristtabelle an" + }, + { + "Language": "ko", + "Body": "레코드 테이블 또는 마감 테이블의 사이트 ID 또는 사이트 그룹 이름을 지정하십시오" + }, + { + "Language": "es", + "Body": "Especifique el ID del sitio o el nombre del grupo de sitios de la tabla de registros o la tabla de plazos" + }, + { + "Language": "vn", + "Body": "Hãy chỉ định ID trang web hoặc tên nhóm trang web của bảng ghi hoặc bảng hạn chế" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/ManageDashboard.json b/Implem.Pleasanter/App_Data/Displays/ManageDashboard.json new file mode 100644 index 000000000..fef4b0379 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/ManageDashboard.json @@ -0,0 +1,33 @@ +{ + "Id": "ManageDashboard", + "Type": 110, + "Languages": [ + { + "Body": "Manage Dashboard" + }, + { + "Language": "zh", + "Body": "仪表盘管理" + }, + { + "Language": "ja", + "Body": "ダッシュボードの管理" + }, + { + "Language": "de", + "Body": "Armaturenbrett verwalten" + }, + { + "Language": "ko", + "Body": "대시보드 관리" + }, + { + "Language": "es", + "Body": "Gestionar Tablero de instrumentos" + }, + { + "Language": "vn", + "Body": "Quản lý bảng điều khiển" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/PartsType.json b/Implem.Pleasanter/App_Data/Displays/PartsType.json new file mode 100644 index 000000000..c89c88717 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/PartsType.json @@ -0,0 +1,33 @@ +{ + "Id": "PartsType", + "Type": 110, + "Languages": [ + { + "Body": "Parts type" + }, + { + "Language": "zh", + "Body": "零件类型" + }, + { + "Language": "ja", + "Body": "パーツタイプ" + }, + { + "Language": "de", + "Body": "Teiletyp" + }, + { + "Language": "ko", + "Body": "부품 유형" + }, + { + "Language": "es", + "Body": "Tipo de pieza" + }, + { + "Language": "vn", + "Body": "Loại bộ phận" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/QuickAccess.json b/Implem.Pleasanter/App_Data/Displays/QuickAccess.json new file mode 100644 index 000000000..a12e6826e --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/QuickAccess.json @@ -0,0 +1,33 @@ +{ + "Id": "QuickAccess", + "Type": 110, + "Languages": [ + { + "Body": "Quick access" + }, + { + "Language": "zh", + "Body": "快速访问" + }, + { + "Language": "ja", + "Body": "クイックアクセス" + }, + { + "Language": "de", + "Body": "Schneller Zugriff" + }, + { + "Language": "ko", + "Body": "빠른 액세스" + }, + { + "Language": "es", + "Body": "Acceso rápido" + }, + { + "Language": "vn", + "Body": "Truy cập nhanh" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/QuickAccessLayout.json b/Implem.Pleasanter/App_Data/Displays/QuickAccessLayout.json new file mode 100644 index 000000000..c99033916 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/QuickAccessLayout.json @@ -0,0 +1,33 @@ +{ + "Id": "QuickAccessLayout", + "Type": 110, + "Languages": [ + { + "Body": "Layout" + }, + { + "Language": "zh", + "Body": "布局" + }, + { + "Language": "ja", + "Body": "レイアウト" + }, + { + "Language": "de", + "Body": "Layout" + }, + { + "Language": "ko", + "Body": "레이아웃" + }, + { + "Language": "es", + "Body": "Diseño" + }, + { + "Language": "vn", + "Body": "Bố cục" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/RecordBody.json b/Implem.Pleasanter/App_Data/Displays/RecordBody.json new file mode 100644 index 000000000..d0a43ccea --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/RecordBody.json @@ -0,0 +1,33 @@ +{ + "Id": "RecordBody", + "Type": 110, + "Languages": [ + { + "Body": "Record content" + }, + { + "Language": "zh", + "Body": "记录内容" + }, + { + "Language": "ja", + "Body": "レコードの内容" + }, + { + "Language": "de", + "Body": "Datensatzinhalt" + }, + { + "Language": "ko", + "Body": "레코드 내용" + }, + { + "Language": "es", + "Body": "Contenido del registro" + }, + { + "Language": "vn", + "Body": "Nội dung bản ghi" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/RecordTitle.json b/Implem.Pleasanter/App_Data/Displays/RecordTitle.json new file mode 100644 index 000000000..4540584db --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/RecordTitle.json @@ -0,0 +1,33 @@ +{ + "Id": "RecordTitle", + "Type": 110, + "Languages": [ + { + "Body": "Record title" + }, + { + "Language": "zh", + "Body": "记录标题" + }, + { + "Language": "ja", + "Body": "レコードのタイトル" + }, + { + "Language": "de", + "Body": "Datensatztitel" + }, + { + "Language": "ko", + "Body": "레코드 제목" + }, + { + "Language": "es", + "Body": "Título del registro" + }, + { + "Language": "vn", + "Body": "Tiêu đề bản ghi" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/ResetTimeLineView.json b/Implem.Pleasanter/App_Data/Displays/ResetTimeLineView.json new file mode 100644 index 000000000..26d4d566d --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/ResetTimeLineView.json @@ -0,0 +1,34 @@ +{ + "Id": "ResetTimeLineView", + "Type": 310, + "ClientScript": true, + "Languages": [ + { + "Body": "Resetting \u0022Filters\u0022 and \u0022Sorters\u0022 because the reference site has been changed." + }, + { + "Language": "zh", + "Body": "由于参考网站已更改,正在重置“过滤器”和“排序器”。" + }, + { + "Language": "ja", + "Body": "基準となるサイトが変更されるため、「フィルタ」および「ソータ」をリセットします。" + }, + { + "Language": "de", + "Body": "Zurücksetzen von \u0022Filtern\u0022 und \u0022Sortierern\u0022, da sich die Referenzseite geändert hat." + }, + { + "Language": "ko", + "Body": "기준 사이트가 변경되었기 때문에 \u0022필터\u0022와 \u0022소터\u0022를 재설정합니다." + }, + { + "Language": "es", + "Body": "Restableciendo \u0022Filtros\u0022 y \u0022Ordenadores\u0022 porque el sitio de referencia ha cambiado." + }, + { + "Language": "vn", + "Body": "Đặt lại \u0022Bộ lọc\u0022 và \u0022Bộ sắp xếp\u0022 vì trang tham chiếu đã được thay đổi." + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/SaveLayout.json b/Implem.Pleasanter/App_Data/Displays/SaveLayout.json new file mode 100644 index 000000000..b3250bc26 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/SaveLayout.json @@ -0,0 +1,33 @@ +{ + "Id": "SaveLayout", + "Type": 110, + "Languages": [ + { + "Body": "Save layout" + }, + { + "Language": "zh", + "Body": "保存佈局" + }, + { + "Language": "ja", + "Body": "レイアウトの保存" + }, + { + "Language": "de", + "Body": "Layout speichern" + }, + { + "Language": "ko", + "Body": "레이아웃 저장" + }, + { + "Language": "es", + "Body": "Salva disposizione" + }, + { + "Language": "vn", + "Body": "Lưu bố cục" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/TimeLine.json b/Implem.Pleasanter/App_Data/Displays/TimeLine.json new file mode 100644 index 000000000..3dd8189c3 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/TimeLine.json @@ -0,0 +1,33 @@ +{ + "Id": "TimeLine", + "Type": 110, + "Languages": [ + { + "Body": "Timeline" + }, + { + "Language": "zh", + "Body": "时间轴" + }, + { + "Language": "ja", + "Body": "タイムライン" + }, + { + "Language": "de", + "Body": "Zeitleiste" + }, + { + "Language": "ko", + "Body": "타임라인" + }, + { + "Language": "es", + "Body": "Cronología" + }, + { + "Language": "vn", + "Body": "Dòng thời gian" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/TimeLineDetailed.json b/Implem.Pleasanter/App_Data/Displays/TimeLineDetailed.json new file mode 100644 index 000000000..7173e5c7f --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/TimeLineDetailed.json @@ -0,0 +1,33 @@ +{ + "Id": "TimeLineDetailed", + "Type": 110, + "Languages": [ + { + "Body": "Detail" + }, + { + "Language": "zh", + "Body": "详细" + }, + { + "Language": "ja", + "Body": "詳細" + }, + { + "Language": "de", + "Body": "Detail" + }, + { + "Language": "ko", + "Body": "상세" + }, + { + "Language": "es", + "Body": "Detalle" + }, + { + "Language": "vn", + "Body": "Chi tiết" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/TimeLineDisplayType.json b/Implem.Pleasanter/App_Data/Displays/TimeLineDisplayType.json new file mode 100644 index 000000000..9fbd59656 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/TimeLineDisplayType.json @@ -0,0 +1,33 @@ +{ + "Id": "TimeLineDisplayType", + "Type": 110, + "Languages": [ + { + "Body": "Display type" + }, + { + "Language": "zh", + "Body": "显示类型" + }, + { + "Language": "ja", + "Body": "表示タイプ" + }, + { + "Language": "de", + "Body": "Anzeigetyp" + }, + { + "Language": "ko", + "Body": "표시 유형" + }, + { + "Language": "es", + "Body": "Tipo de visualización" + }, + { + "Language": "vn", + "Body": "Loại hiển thị" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/TimeLineSimple.json b/Implem.Pleasanter/App_Data/Displays/TimeLineSimple.json new file mode 100644 index 000000000..cab6b241f --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/TimeLineSimple.json @@ -0,0 +1,33 @@ +{ + "Id": "TimeLineSimple", + "Type": 110, + "Languages": [ + { + "Body": "Simple" + }, + { + "Language": "zh", + "Body": "简易" + }, + { + "Language": "ja", + "Body": "簡易" + }, + { + "Language": "de", + "Body": " Einfach" + }, + { + "Language": "ko", + "Body": "간단" + }, + { + "Language": "es", + "Body": "Simple" + }, + { + "Language": "vn", + "Body": "Đơn giản" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/TimeLineStandard.json b/Implem.Pleasanter/App_Data/Displays/TimeLineStandard.json new file mode 100644 index 000000000..77c5cdf19 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/TimeLineStandard.json @@ -0,0 +1,33 @@ +{ + "Id": "TimeLineStandard", + "Type": 110, + "Languages": [ + { + "Body": "Standard" + }, + { + "Language": "zh", + "Body": "标准" + }, + { + "Language": "ja", + "Body": "標準" + }, + { + "Language": "de", + "Body": "Standard" + }, + { + "Language": "ko", + "Body": "표준" + }, + { + "Language": "es", + "Body": "Estándar" + }, + { + "Language": "vn", + "Body": "Tiêu chuẩn" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/Vertical.json b/Implem.Pleasanter/App_Data/Displays/Vertical.json new file mode 100644 index 000000000..cc3445595 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/Vertical.json @@ -0,0 +1,33 @@ +{ + "Id": "Vertical", + "Type": 110, + "Languages": [ + { + "Body": "Vertical" + }, + { + "Language": "zh", + "Body": "垂直" + }, + { + "Language": "ja", + "Body": "縦方向" + }, + { + "Language": "de", + "Body": "Vertikal" + }, + { + "Language": "ko", + "Body": "세로" + }, + { + "Language": "es", + "Body": "Vertical" + }, + { + "Language": "vn", + "Body": "Dọc" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/Width.json b/Implem.Pleasanter/App_Data/Displays/Width.json new file mode 100644 index 000000000..ef7114775 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/Width.json @@ -0,0 +1,33 @@ +{ + "Id": "Width", + "Type": 110, + "Languages": [ + { + "Body": "Width" + }, + { + "Language": "zh", + "Body": "宽度" + }, + { + "Language": "ja", + "Body": "幅" + }, + { + "Language": "de", + "Body": "Breite" + }, + { + "Language": "ko", + "Body": "너비" + }, + { + "Language": "es", + "Body": "Ancho" + }, + { + "Language": "vn", + "Body": "Rộng" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Parameters/Dashboard.json b/Implem.Pleasanter/App_Data/Parameters/Dashboard.json new file mode 100644 index 000000000..8fa8f7b6c --- /dev/null +++ b/Implem.Pleasanter/App_Data/Parameters/Dashboard.json @@ -0,0 +1,5 @@ +{ + "TimeLineItemCount": 20, + "TimeLineItemCountMin": 1, + "TimeLineItemCountMax": 200 +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Parameters/General.json b/Implem.Pleasanter/App_Data/Parameters/General.json index 13dc43028..cebd103ea 100644 --- a/Implem.Pleasanter/App_Data/Parameters/General.json +++ b/Implem.Pleasanter/App_Data/Parameters/General.json @@ -1,7 +1,7 @@ { "HtmlHeadKeywords": "Implem,Pleasanter,OSS", "HtmlHeadDescription": "Business application platform", - "HtmlHeadViewport": "", + "HtmlHeadViewport": "width=device-width", "HtmlLogoText": ".Pleasanter", "HtmlPortalUrl": "https://pleasanter.net", "HtmlApplicationBuildingGuideUrl": "https://pleasanter.org/downloads/hands-on1.pdf", diff --git a/Implem.Pleasanter/App_Start/BundleConfig.cs b/Implem.Pleasanter/App_Start/BundleConfig.cs index 4bf33d554..390934d5c 100644 --- a/Implem.Pleasanter/App_Start/BundleConfig.cs +++ b/Implem.Pleasanter/App_Start/BundleConfig.cs @@ -36,6 +36,7 @@ public static IEnumerable Generals() "~/scripts/confirmevents.js", "~/scripts/controloptionevents.js", "~/scripts/crosstab.js", + "~/scripts/dashboard.js", "~/scripts/dialog.js", "~/scripts/dialogevents.js", "~/scripts/display.js", diff --git a/Implem.Pleasanter/Controllers/UsersController.cs b/Implem.Pleasanter/Controllers/UsersController.cs index 8a34b441b..3225c5203 100644 --- a/Implem.Pleasanter/Controllers/UsersController.cs +++ b/Implem.Pleasanter/Controllers/UsersController.cs @@ -602,6 +602,34 @@ public string ReturnOriginalUser() return json; } + /// + /// Fixed: + /// + [HttpGet] + public ActionResult SwitchTenant(int id = 0) + { + var context = new Context(); + var log = new SysLogModel(context: context); + Extension.SetSwichTenant(context, id); + var url = Locations.Top(context: context); + log.Finish(context: context); + return Redirect(url); + } + + /// + /// Fixed: + /// + [HttpGet] + public ActionResult ReturnOriginalTenant() + { + var context = new Context(); + var log = new SysLogModel(context: context); + Extension.UnsetSwichTenant(context); + var url = Locations.Top(context: context); + log.Finish(context: context); + return Redirect(url); + } + /// /// Fixed: /// diff --git a/Implem.Pleasanter/Implem.Pleasanter.csproj b/Implem.Pleasanter/Implem.Pleasanter.csproj index bbd8babf3..f32c6e596 100644 --- a/Implem.Pleasanter/Implem.Pleasanter.csproj +++ b/Implem.Pleasanter/Implem.Pleasanter.csproj @@ -5,11 +5,11 @@ Copyright © Implem Inc 2014 - 2023 Business application platform Implem.Pleasanter - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable - Linux + Linux ..\docker-compose.dcproj diff --git a/Implem.Pleasanter/Libraries/DataSources/Extension.cs b/Implem.Pleasanter/Libraries/DataSources/Extension.cs index 67f1c38e7..256ac84ad 100644 --- a/Implem.Pleasanter/Libraries/DataSources/Extension.cs +++ b/Implem.Pleasanter/Libraries/DataSources/Extension.cs @@ -24,5 +24,19 @@ public static bool Authenticate( { throw new NotImplementedException(); } + + public static void SwichTenant(Context context) + { + } + + public static void SetSwichTenant(Context context, int targetTenantId) + { + throw new NotImplementedException(); + } + + public static void UnsetSwichTenant(Context context) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/Implem.Pleasanter/Libraries/DataSources/Rds.cs b/Implem.Pleasanter/Libraries/DataSources/Rds.cs index 58245fd04..ad54986d0 100644 --- a/Implem.Pleasanter/Libraries/DataSources/Rds.cs +++ b/Implem.Pleasanter/Libraries/DataSources/Rds.cs @@ -417,6 +417,7 @@ public static string IdColumn(string tableName) case "SysLogs": return "SysLogId"; case "Tenants": return "TenantId"; case "Users": return "UserId"; + case "Dashboards": return "DashboardId"; case "Issues": return "IssueId"; case "Results": return "ResultId"; case "Wikis": return "WikiId"; @@ -697,6 +698,17 @@ public static SqlStatement PermissionsStatement( }; } + public static SqlStatement DashboardsStatement( + string commandText, + SqlParamCollection param = null) + { + return new SqlStatement + { + CommandText = commandText, + SqlParamCollection = param + }; + } + public static SqlStatement IssuesStatement( string commandText, SqlParamCollection param = null) @@ -1441,6 +1453,7 @@ public static string ColumnBracket(Column column) case "HtmlTitleRecord": return "\"HtmlTitleRecord\""; case "TopStyle": return "\"TopStyle\""; case "TopScript": return "\"TopScript\""; + case "TopDashboards": return "\"TopDashboards\""; case "Comments": return "\"Comments\""; case "Creator": return "\"Creator\""; case "Updator": return "\"Updator\""; @@ -1549,6 +1562,28 @@ public static string ColumnBracket(Column column) ? $"\"{column.Name}\"" : null; } + case "Dashboards": + switch (column.Name) + { + case "SiteId": return "\"SiteId\""; + case "UpdatedTime": return "\"UpdatedTime\""; + case "DashboardId": return "\"DashboardId\""; + case "Ver": return "\"Ver\""; + case "Title": return "\"Title\""; + case "Body": return "\"Body\""; + case "TitleBody": return "\"TitleBody\""; + case "Locked": return "\"Locked\""; + case "Comments": return "\"Comments\""; + case "Creator": return "\"Creator\""; + case "Updator": return "\"Updator\""; + case "CreatedTime": return "\"CreatedTime\""; + case "VerUp": return "\"VerUp\""; + case "Timestamp": return "\"Timestamp\""; + default: + return Def.ExtendedColumnTypes.ContainsKey(column?.Name ?? string.Empty) + ? $"\"{column.Name}\"" + : null; + } case "Issues": switch (column.Name) { @@ -3844,6 +3879,12 @@ public static SqlOrderByCollection Add( orderType: orderType, isNullValue: isNullValue, function: function); + case "TopDashboards": + return self.Tenants_TopDashboards( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); case "Comments": return self.Tenants_Comments( tableName: column.TableName(), @@ -4294,6 +4335,91 @@ public static SqlOrderByCollection Add( function: function) : self; } + case "Dashboards": + switch (column.Name) + { + case "SiteId": + return self.Dashboards_SiteId( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "UpdatedTime": + return self.Dashboards_UpdatedTime( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "DashboardId": + return self.Dashboards_DashboardId( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "Ver": + return self.Dashboards_Ver( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "Title": + return self.Dashboards_Title( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "Body": + return self.Dashboards_Body( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "TitleBody": + return self.Dashboards_TitleBody( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "Locked": + return self.Dashboards_Locked( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "Comments": + return self.Dashboards_Comments( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "Creator": + return self.Dashboards_Creator( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "Updator": + return self.Dashboards_Updator( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + case "CreatedTime": + return self.Dashboards_CreatedTime( + tableName: column.TableName(), + orderType: orderType, + isNullValue: isNullValue, + function: function); + default: + return Def.ExtendedColumnTypes.ContainsKey(column?.Name ?? string.Empty) + ? self.Add( + columnBracket: $"\"{column.Name}\"", + orderType: orderType, + tableName: column.TableName(), + isNullValue: isNullValue, + function: function) + : self; + } case "Issues": switch (column.Name) { @@ -5977,6 +6103,48 @@ public static SqlSelect SelectPermissions( }; } + public static SqlSelect SelectDashboards( + string dataTableName = null, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + string _as = null, + SqlColumnCollection column = null, + SqlJoinCollection join = null, + SqlWhereCollection where = null, + SqlGroupByCollection groupBy = null, + SqlHavingCollection having = null, + SqlOrderByCollection orderBy = null, + SqlParamCollection param = null, + bool distinct = false, + int top = 0, + int offset = 0, + int pageSize = 0, + Sqls.UnionTypes unionType = Sqls.UnionTypes.None, + bool _using = true) + { + return new SqlSelect + { + DataTableName = dataTableName, + TableType = tableType, + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + As = _as, + SqlColumnCollection = column, + SqlJoinCollection = join, + SqlWhereCollection = where, + SqlGroupByCollection = groupBy, + SqlHavingCollection = having, + SqlOrderByCollection = orderBy, + SqlParamCollection = param, + Distinct = distinct, + Top = top, + Offset = offset, + PageSize = pageSize, + UnionType = unionType, + Using = _using + }; + } + public static SqlSelect SelectIssues( string dataTableName = null, Sqls.TableTypes tableType = Sqls.TableTypes.Normal, @@ -6563,6 +6731,26 @@ public static SqlExists ExistsPermissions( }; } + public static SqlExists ExistsDashboards( + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + bool not = false, + SqlJoinCollection join = null, + SqlWhereCollection where = null, + bool _using = true) + { + return new SqlExists + { + TableType = tableType, + Not = not, + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + SqlJoinCollection = join, + SqlWhereCollection = where, + Using = _using + }; + } + public static SqlExists ExistsIssues( Sqls.TableTypes tableType = Sqls.TableTypes.Normal, bool not = false, @@ -7993,6 +8181,65 @@ public static SqlStatement IdentityInsertPermissions_History( template: "set identity_insert \"Permissions_History\" off;")); } + public static SqlInsert InsertDashboards( + string dataTableName = null, + bool selectIdentity = false, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + SqlParamCollection param = null, + SqlStatement select = null, + bool addUpdatorParam = true, + string _if = null, + bool _using = true) + { + return new SqlInsert + { + DataTableName = dataTableName, + TableType = tableType, + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + SelectIdentity = selectIdentity, + SqlParamCollection = param, + Select = select, + AddUpdatorParam = addUpdatorParam, + If = _if, + Using = _using + }; + } + + public static SqlStatement IdentityInsertDashboards( + ISqlObjectFactory factory, + bool on) + { + return on + ? new SqlStatement(factory.SqlCommandText.CreateIdentityInsert( + template: "set identity_insert \"Dashboards\" on;")) + : new SqlStatement(factory.SqlCommandText.CreateIdentityInsert( + template: "set identity_insert \"Dashboards\" off;")); + } + + public static SqlStatement IdentityInsertDashboards_Deleted( + ISqlObjectFactory factory, + bool on) + { + return on + ? new SqlStatement(factory.SqlCommandText.CreateIdentityInsert( + template: "set identity_insert \"Dashboards_Deleted\" on;")) + : new SqlStatement(factory.SqlCommandText.CreateIdentityInsert( + template: "set identity_insert \"Dashboards_Deleted\" off;")); + } + + public static SqlStatement IdentityInsertDashboards_History( + ISqlObjectFactory factory, + bool on) + { + return on + ? new SqlStatement(factory.SqlCommandText.CreateIdentityInsert( + template: "set identity_insert \"Dashboards_History\" on;")) + : new SqlStatement(factory.SqlCommandText.CreateIdentityInsert( + template: "set identity_insert \"Dashboards_History\" off;")); + } + public static SqlInsert InsertIssues( string dataTableName = null, bool selectIdentity = false, @@ -8768,6 +9015,32 @@ public static SqlUpdate UpdatePermissions( }; } + public static SqlUpdate UpdateDashboards( + string dataTableName = null, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + SqlWhereCollection where = null, + SqlParamCollection param = null, + bool addUpdatorParam = true, + bool addUpdatedTimeParam = true, + string _if = null, + bool _using = true) + { + return new SqlUpdate + { + DataTableName = dataTableName, + TableType = tableType, + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + SqlWhereCollection = where, + SqlParamCollection = param, + AddUpdatorParam = addUpdatorParam, + AddUpdatedTimeParam = addUpdatedTimeParam, + If = _if, + Using = _using + }; + } + public static SqlUpdate UpdateIssues( string dataTableName = null, Sqls.TableTypes tableType = Sqls.TableTypes.Normal, @@ -9490,6 +9763,34 @@ public static SqlUpdateOrInsert UpdateOrInsertPermissions( }; } + public static SqlUpdateOrInsert UpdateOrInsertDashboards( + string dataTableName = null, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + bool selectIdentity = false, + SqlWhereCollection where = null, + SqlParamCollection param = null, + bool addUpdatorParam = true, + bool addUpdatedTimeParam = true, + string _if = null, + bool _using = true) + { + return new SqlUpdateOrInsert + { + DataTableName = dataTableName, + TableType = tableType, + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + SelectIdentity = selectIdentity, + SqlWhereCollection = where, + SqlParamCollection = param, + AddUpdatorParam = addUpdatorParam, + AddUpdatedTimeParam = addUpdatedTimeParam, + If = _if, + Using = _using + }; + } + public static SqlUpdateOrInsert UpdateOrInsertIssues( string dataTableName = null, Sqls.TableTypes tableType = Sqls.TableTypes.Normal, @@ -10080,6 +10381,28 @@ public static SqlDelete DeletePermissions( }; } + public static SqlDelete DeleteDashboards( + ISqlObjectFactory factory, + string dataTableName = null, + SqlWhereCollection where = null, + SqlParamCollection param = null, + string _if = null, + bool _using = true) + { + return new SqlDelete() + { + DataTableName = dataTableName, + CommandText = DeleteDashboardsStatement(factory: factory), + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + SqlWhereCollection = where, + SqlParamCollection = param, + If = _if, + Using = _using + }; + } + public static SqlDelete DeleteIssues( ISqlObjectFactory factory, string dataTableName = null, @@ -10606,6 +10929,26 @@ public static SqlPhysicalDelete PhysicalDeletePermissions( }; } + public static SqlPhysicalDelete PhysicalDeleteDashboards( + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + SqlWhereCollection where = null, + SqlParamCollection param = null, + string _if = null, + bool _using = true) + { + return new SqlPhysicalDelete() + { + TableType = tableType, + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + SqlWhereCollection = where, + SqlParamCollection = param, + If = _if, + Using = _using + }; + } + public static SqlPhysicalDelete PhysicalDeleteIssues( Sqls.TableTypes tableType = Sqls.TableTypes.Normal, SqlWhereCollection where = null, @@ -11126,6 +11469,26 @@ public static SqlRestore RestorePermissions( }; } + public static SqlRestore RestoreDashboards( + ISqlObjectFactory factory, + SqlWhereCollection where = null, + SqlParamCollection param = null, + string _if = null, + bool _using = true) + { + return new SqlRestore() + { + CommandText = RestoreDashboardsStatement(factory: factory), + TableBracket = "\"Dashboards\"", + HistoryTableBracket = "\"Dashboards_history\"", + DeletedTableBracket = "\"Dashboards_deleted\"", + SqlWhereCollection = where, + SqlParamCollection = param, + If = _if, + Using = _using + }; + } + public static SqlRestore RestoreIssues( ISqlObjectFactory factory, SqlWhereCollection where = null, @@ -11726,6 +12089,7 @@ public static SqlStatement TenantsCopyToStatement(SqlWhereCollection where, Sqls column.HtmlTitleRecord(function: Sqls.Functions.SingleColumn); param.HtmlTitleRecord(); column.TopStyle(function: Sqls.Functions.SingleColumn); param.TopStyle(); column.TopScript(function: Sqls.Functions.SingleColumn); param.TopScript(); + column.TopDashboards(function: Sqls.Functions.SingleColumn); param.TopDashboards(); column.Comments(function: Sqls.Functions.SingleColumn); param.Comments(); column.Creator(function: Sqls.Functions.SingleColumn); param.Creator(); column.Updator(function: Sqls.Functions.SingleColumn); param.Updator(); @@ -11818,6 +12182,28 @@ public static SqlStatement PermissionsCopyToStatement(SqlWhereCollection where, addUpdatorParam: false); } + public static SqlStatement DashboardsCopyToStatement(SqlWhereCollection where, Sqls.TableTypes tableType, List columnNames) + { + var column = new DashboardsColumnCollection(); + var param = new DashboardsParamCollection(); + column.SiteId(function: Sqls.Functions.SingleColumn); param.SiteId(); + column.UpdatedTime(function: Sqls.Functions.SingleColumn); param.UpdatedTime(); + column.DashboardId(function: Sqls.Functions.SingleColumn); param.DashboardId(); + column.Ver(function: Sqls.Functions.SingleColumn); param.Ver(); + column.Title(function: Sqls.Functions.SingleColumn); param.Title(); + column.Body(function: Sqls.Functions.SingleColumn); param.Body(); + column.Locked(function: Sqls.Functions.SingleColumn); param.Locked(); + column.Comments(function: Sqls.Functions.SingleColumn); param.Comments(); + column.Creator(function: Sqls.Functions.SingleColumn); param.Creator(); + column.Updator(function: Sqls.Functions.SingleColumn); param.Updator(); + column.CreatedTime(function: Sqls.Functions.SingleColumn); param.CreatedTime(); + return InsertDashboards( + tableType: tableType, + param: param, + select: SelectDashboards(column: column, where: where), + addUpdatorParam: false); + } + public static SqlStatement IssuesCopyToStatement(SqlWhereCollection where, Sqls.TableTypes tableType, List columnNames) { var column = new IssuesColumnCollection(); @@ -12001,6 +12387,18 @@ public static IEnumerable Aggregations( join: join, where: where)), param: param); + case "Dashboards": + return DashboardsAggregations( + context: context, + aggregations: ss.Aggregations, + tableType: tableType, + where: DashboardsWhere() + .DashboardId_In(sub: SelectDashboards( + tableType: tableType, + column: DashboardsColumn().DashboardId(), + join: join, + where: where)), + param: param); case "Issues": return IssuesAggregations( context: context, @@ -13681,6 +14079,77 @@ public static IEnumerable PermissionsAggregations( return statementCollection; } + public static IEnumerable DashboardsAggregations( + Context context, + IEnumerable aggregations, + Sqls.TableTypes tableType, + SqlWhereCollection where, + SqlParamCollection param) + { + var statementCollection = new List() + { + SelectDashboards( + dataTableName: "Count", + tableType: tableType, + column: DashboardsColumn().DashboardsCount(), + where: where, + param: param) + }; + if (tableType != Sqls.TableTypes.Normal) + { + return statementCollection; + } + aggregations + .Select((o, i) => new { Aggregation = o, Index = i }) + .ForEach(data => + { + var groupBy = DashboardsGroupBy(); + var column = DashboardsColumn(); + switch (data.Aggregation.GroupBy) + { + case "\"NotGroupBy\"": + break; + default: + groupBy.DashboardsGroupBy(columnName: data.Aggregation.GroupBy); + column.DashboardsColumn(columnName: data.Aggregation.GroupBy); + break; + } + switch (data.Aggregation.Type) + { + case Aggregation.Types.Count: + column.DashboardsCount(); break; + case Aggregation.Types.Total: + switch (data.Aggregation.Target) + { + default: + column.DashboardsColumn( + columnName: data.Aggregation.Target, + function: Sqls.Functions.Sum); + break; + } + break; + case Aggregation.Types.Average: + switch (data.Aggregation.Target) + { + default: + column.DashboardsColumn( + columnName: data.Aggregation.Target, + function: Sqls.Functions.Avg); + break; + } + break; + default: break; + } + var statement = SelectDashboards( + dataTableName: "Aggregation" + data.Index, + column: column, + where: where, + groupBy: groupBy); + statementCollection.Add(statement); + }); + return statementCollection; + } + public static IEnumerable IssuesAggregations( Context context, IEnumerable aggregations, @@ -14928,6 +15397,7 @@ insert into ""Tenants_deleted"" ""HtmlTitleRecord"", ""TopStyle"", ""TopScript"", + ""TopDashboards"", ""Comments"", ""Creator"", ""Updator"", @@ -14953,6 +15423,7 @@ insert into ""Tenants_deleted"" ""Tenants"".""HtmlTitleRecord"", ""Tenants"".""TopStyle"", ""Tenants"".""TopScript"", + ""Tenants"".""TopDashboards"", ""Tenants"".""Comments"", ""Tenants"".""Creator"", ""Tenants"".""Updator"", @@ -15115,6 +15586,46 @@ insert into ""Permissions_deleted"" delete from ""Permissions"" {{0}}".Params(DeleteParams(tableName: "Permissions")); } + public static string DeleteDashboardsStatement(ISqlObjectFactory factory) + { + return $@" + update ""Dashboards"" + set + ""Updator"" = {Parameters.Parameter.SqlParameterPrefix}U, + ""UpdatedTime"" = {factory.Sqls.CurrentDateTime} {{0}}; + insert into ""Dashboards_deleted"" + ( + ""SiteId"", + ""UpdatedTime"", + ""DashboardId"", + ""Ver"", + ""Title"", + ""Body"", + ""Locked"", + ""Comments"", + ""Creator"", + ""Updator"", + ""CreatedTime"" + {{1}} + ) + ( + select + ""Dashboards"".""SiteId"", + ""Dashboards"".""UpdatedTime"", + ""Dashboards"".""DashboardId"", + ""Dashboards"".""Ver"", + ""Dashboards"".""Title"", + ""Dashboards"".""Body"", + ""Dashboards"".""Locked"", + ""Dashboards"".""Comments"", + ""Dashboards"".""Creator"", + ""Dashboards"".""Updator"", + ""Dashboards"".""CreatedTime"" + {{2}} + from ""Dashboards"" {{0}}); + delete from ""Dashboards"" {{0}}".Params(DeleteParams(tableName: "Dashboards")); + } + public static string DeleteIssuesStatement(ISqlObjectFactory factory) { return $@" @@ -16305,6 +16816,7 @@ insert into ""Tenants"" ""HtmlTitleRecord"", ""TopStyle"", ""TopScript"", + ""TopDashboards"", ""Comments"", ""Creator"", ""Updator"", @@ -16330,6 +16842,7 @@ insert into ""Tenants"" ""Tenants_deleted"".""HtmlTitleRecord"", ""Tenants_deleted"".""TopStyle"", ""Tenants_deleted"".""TopScript"", + ""Tenants_deleted"".""TopDashboards"", ""Tenants_deleted"".""Comments"", ""Tenants_deleted"".""Creator"", ""Tenants_deleted"".""Updator"", @@ -16498,6 +17011,46 @@ insert into ""Permissions"" delete from ""Permissions_deleted"" {{0}}".Params(DeleteParams(tableName: "Permissions")); } + public static string RestoreDashboardsStatement(ISqlObjectFactory factory) + { + return $@" + update ""Dashboards_deleted"" + set + ""Updator"" = {Parameters.Parameter.SqlParameterPrefix}U, + ""UpdatedTime"" = {factory.Sqls.CurrentDateTime} {{0}}; + insert into ""Dashboards"" + ( + ""SiteId"", + ""UpdatedTime"", + ""DashboardId"", + ""Ver"", + ""Title"", + ""Body"", + ""Locked"", + ""Comments"", + ""Creator"", + ""Updator"", + ""CreatedTime"" + {{2}} + ) + ( + select + ""Dashboards_deleted"".""SiteId"", + ""Dashboards_deleted"".""UpdatedTime"", + ""Dashboards_deleted"".""DashboardId"", + ""Dashboards_deleted"".""Ver"", + ""Dashboards_deleted"".""Title"", + ""Dashboards_deleted"".""Body"", + ""Dashboards_deleted"".""Locked"", + ""Dashboards_deleted"".""Comments"", + ""Dashboards_deleted"".""Creator"", + ""Dashboards_deleted"".""Updator"", + ""Dashboards_deleted"".""CreatedTime"" + {{1}} + from ""Dashboards_deleted"" {{0}}); + delete from ""Dashboards_deleted"" {{0}}".Params(DeleteParams(tableName: "Dashboards")); + } + public static string RestoreIssuesStatement(ISqlObjectFactory factory) { return $@" @@ -88621,6 +89174,8 @@ public static TenantsColumnCollection TenantsColumn( return self.TopStyle(_as: _as, function: function); case "TopScript": return self.TopScript(_as: _as, function: function); + case "TopDashboards": + return self.TopDashboards(_as: _as, function: function); case "Comments": return self.Comments(_as: _as, function: function); case "Creator": @@ -89282,6 +89837,46 @@ public static SqlColumnCollection Tenants_TopScript( : self; } + public static TenantsColumnCollection TopDashboards( + this TenantsColumnCollection self, + string tableName = "Tenants", + string columnName = "TopDashboards", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"TopDashboards\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Tenants_TopDashboards( + this SqlColumnCollection self, + string tableName = "Tenants", + string columnName = "TopDashboards", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"TopDashboards\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + public static TenantsColumnCollection Comments( this TenantsColumnCollection self, string tableName = "Tenants", @@ -90421,6 +91016,64 @@ public static SqlWhereCollection Tenants_TopScript( : self; } + public static TenantsWhereCollection TopDashboards( + this TenantsWhereCollection self, + object value = null, + string tableName = "Tenants", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"TopDashboards\"" }, + tableName: tableName, + name: "TopDashboards", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Tenants_TopDashboards( + this SqlWhereCollection self, + object value = null, + string tableName = "Tenants", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"TopDashboards\"" }, + tableName: tableName, + name: "TopDashboards", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + public static TenantsWhereCollection Comments( this TenantsWhereCollection self, object value = null, @@ -91209,6 +91862,7 @@ public static TenantsGroupByCollection TenantsGroupBy( case "HtmlTitleRecord": return self.HtmlTitleRecord(); case "TopStyle": return self.TopStyle(); case "TopScript": return self.TopScript(); + case "TopDashboards": return self.TopDashboards(); case "Comments": return self.Comments(); case "Creator": return self.Creator(); case "Updator": return self.Updator(); @@ -91418,6 +92072,18 @@ public static SqlGroupByCollection Tenants_TopScript( return self.Add(columnBracket: "\"TopScript\"", tableName: tableName); } + public static TenantsGroupByCollection TopDashboards( + this TenantsGroupByCollection self, string tableName = "Tenants") + { + return self.Add(columnBracket: "\"TopDashboards\"", tableName: tableName); + } + + public static SqlGroupByCollection Tenants_TopDashboards( + this SqlGroupByCollection self, string tableName = "Tenants") + { + return self.Add(columnBracket: "\"TopDashboards\"", tableName: tableName); + } + public static TenantsGroupByCollection Comments( this TenantsGroupByCollection self, string tableName = "Tenants") { @@ -91794,6 +92460,23 @@ public static TenantsOrderByCollection TopScript( return self; } + public static TenantsOrderByCollection TopDashboards( + this TenantsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Tenants", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"TopDashboards\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + public static TenantsOrderByCollection Comments( this TenantsOrderByCollection self, SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, @@ -92151,6 +92834,23 @@ public static SqlOrderByCollection Tenants_TopScript( return self; } + public static SqlOrderByCollection Tenants_TopDashboards( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Tenants", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"TopDashboards\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + public static SqlOrderByCollection Tenants_Comments( this SqlOrderByCollection self, SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, @@ -92790,6 +93490,40 @@ public static SqlParamCollection Tenants_TopScript( : self; } + public static TenantsParamCollection TopDashboards( + this TenantsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"TopDashboards\"", + name: "TopDashboards", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Tenants_TopDashboards( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"TopDashboards\"", + name: "TopDashboards", + value: value, + sub: sub, + raw: raw) + : self; + } + public static TenantsParamCollection Comments( this TenantsParamCollection self, object value = null, @@ -106645,16 +107379,16 @@ public static SqlParamCollection Permissions_UpdatedTime( : self; } - public static IssuesColumnCollection IssuesColumn() + public static DashboardsColumnCollection DashboardsColumn() { - return new IssuesColumnCollection(); + return new DashboardsColumnCollection(); } - public class IssuesColumnCollection : SqlColumnCollection + public class DashboardsColumnCollection : SqlColumnCollection { - public new IssuesColumnCollection Add( + public new DashboardsColumnCollection Add( string columnBracket = null, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = null, string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -106673,29 +107407,29 @@ public class IssuesColumnCollection : SqlColumnCollection } } - public static IssuesJoinCollection IssuesJoin() + public static DashboardsJoinCollection DashboardsJoin() { - return new IssuesJoinCollection(); + return new DashboardsJoinCollection(); } - public class IssuesJoinCollection : SqlJoinCollection + public class DashboardsJoinCollection : SqlJoinCollection { - public IssuesJoinCollection Add(params SqlJoin[] sqlJoinCollection) + public DashboardsJoinCollection Add(params SqlJoin[] sqlJoinCollection) { sqlJoinCollection.ForEach(sqlJoin => base.Add(sqlJoin)); return this; } } - public static IssuesWhereCollection IssuesWhere() + public static DashboardsWhereCollection DashboardsWhere() { - return new IssuesWhereCollection(); + return new DashboardsWhereCollection(); } - public class IssuesWhereCollection : SqlWhereCollection + public class DashboardsWhereCollection : SqlWhereCollection { - public IssuesWhereCollection Add( - string tableName = "Issues", + public DashboardsWhereCollection Add( + string tableName = "Dashboards", string[] columnBrackets = null, string name = null, object value = null, @@ -106727,15 +107461,15 @@ public IssuesWhereCollection Add( } } - public static IssuesGroupByCollection IssuesGroupBy() + public static DashboardsGroupByCollection DashboardsGroupBy() { - return new IssuesGroupByCollection(); + return new DashboardsGroupByCollection(); } - public class IssuesGroupByCollection : SqlGroupByCollection + public class DashboardsGroupByCollection : SqlGroupByCollection { - public new IssuesGroupByCollection Add( - string columnBracket, string tableName = "Issues") + public new DashboardsGroupByCollection Add( + string columnBracket, string tableName = "Dashboards") { Add(new SqlGroupBy( columnBracket: columnBracket, @@ -106744,16 +107478,16 @@ public class IssuesGroupByCollection : SqlGroupByCollection } } - public static IssuesHavingCollection IssuesHaving() + public static DashboardsHavingCollection DashboardsHaving() { - return new IssuesHavingCollection(); + return new DashboardsHavingCollection(); } - public class IssuesHavingCollection : SqlHavingCollection + public class DashboardsHavingCollection : SqlHavingCollection { - public IssuesHavingCollection Add( + public DashboardsHavingCollection Add( string columnBracket, - string tableName = "Issues", + string tableName = "Dashboards", object value = null, string _operator = "=", Sqls.Functions function = Sqls.Functions.None) @@ -106768,17 +107502,17 @@ public IssuesHavingCollection Add( } } - public static IssuesOrderByCollection IssuesOrderBy() + public static DashboardsOrderByCollection DashboardsOrderBy() { - return new IssuesOrderByCollection(); + return new DashboardsOrderByCollection(); } - public class IssuesOrderByCollection : SqlOrderByCollection + public class DashboardsOrderByCollection : SqlOrderByCollection { - public IssuesOrderByCollection Add( + public DashboardsOrderByCollection Add( string columnBracket, SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, - string tableName = "Issues", + string tableName = "Dashboards", Sqls.Functions function = Sqls.Functions.None) { Add(new SqlOrderBy( @@ -106790,14 +107524,14 @@ public IssuesOrderByCollection Add( } } - public static IssuesParamCollection IssuesParam() + public static DashboardsParamCollection DashboardsParam() { - return new IssuesParamCollection(); + return new DashboardsParamCollection(); } - public class IssuesParamCollection : SqlParamCollection + public class DashboardsParamCollection : SqlParamCollection { - public new IssuesParamCollection Add( + public new DashboardsParamCollection Add( string columnBracket = null, string name = null, object value = null, @@ -106816,9 +107550,9 @@ public class IssuesParamCollection : SqlParamCollection } } - public static string Issues_Title_WhereLike( + public static string Dashboards_Title_WhereLike( ISqlObjectFactory factory, - string tableName = "Issues", + string tableName = "Dashboards", string name = "SearchText", bool forward = false, bool escape = false, @@ -106838,9 +107572,9 @@ public static string Issues_Title_WhereLike( + ")"; } - public static string Issues_Body_WhereLike( + public static string Dashboards_Body_WhereLike( ISqlObjectFactory factory, - string tableName = "Issues", + string tableName = "Dashboards", string name = "SearchText", bool forward = false, bool escape = false, @@ -106860,8 +107594,8 @@ public static string Issues_Body_WhereLike( + ")"; } - public static IssuesColumnCollection IssuesColumn( - this IssuesColumnCollection self, + public static DashboardsColumnCollection DashboardsColumn( + this DashboardsColumnCollection self, string columnName, string _as = null, Sqls.Functions function = Sqls.Functions.None) @@ -106872,8 +107606,8 @@ public static IssuesColumnCollection IssuesColumn( return self.SiteId(_as: _as, function: function); case "UpdatedTime": return self.UpdatedTime(_as: _as, function: function); - case "IssueId": - return self.IssueId(_as: _as, function: function); + case "DashboardId": + return self.DashboardId(_as: _as, function: function); case "Ver": return self.Ver(_as: _as, function: function); case "Title": @@ -106882,26 +107616,8 @@ public static IssuesColumnCollection IssuesColumn( return self.Body(_as: _as, function: function); case "TitleBody": return self.TitleBody(_as: _as, function: function); - case "StartTime": - return self.StartTime(_as: _as, function: function); - case "CompletionTime": - return self.CompletionTime(_as: _as, function: function); - case "WorkValue": - return self.WorkValue(_as: _as, function: function); - case "ProgressRate": - return self.ProgressRate(_as: _as, function: function); - case "RemainingWorkValue": - return self.RemainingWorkValue(_as: _as, function: function); - case "Status": - return self.Status(_as: _as, function: function); - case "Manager": - return self.Manager(_as: _as, function: function); - case "Owner": - return self.Owner(_as: _as, function: function); case "Locked": return self.Locked(_as: _as, function: function); - case "SiteTitle": - return self.SiteTitle(_as: _as, function: function); case "Comments": return self.Comments(_as: _as, function: function); case "Creator": @@ -106921,9 +107637,9 @@ public static IssuesColumnCollection IssuesColumn( } } - public static IssuesColumnCollection SiteId( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection SiteId( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "SiteId", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -106941,9 +107657,9 @@ public static IssuesColumnCollection SiteId( : self; } - public static SqlColumnCollection Issues_SiteId( + public static SqlColumnCollection Dashboards_SiteId( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "SiteId", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -106961,9 +107677,9 @@ public static SqlColumnCollection Issues_SiteId( : self; } - public static IssuesColumnCollection UpdatedTime( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection UpdatedTime( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "UpdatedTime", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -106981,9 +107697,9 @@ public static IssuesColumnCollection UpdatedTime( : self; } - public static SqlColumnCollection Issues_UpdatedTime( + public static SqlColumnCollection Dashboards_UpdatedTime( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "UpdatedTime", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107001,10 +107717,10 @@ public static SqlColumnCollection Issues_UpdatedTime( : self; } - public static IssuesColumnCollection IssueId( - this IssuesColumnCollection self, - string tableName = "Issues", - string columnName = "IssueId", + public static DashboardsColumnCollection DashboardId( + this DashboardsColumnCollection self, + string tableName = "Dashboards", + string columnName = "DashboardId", string _as = null, Sqls.Functions function = Sqls.Functions.None, SqlStatement sub = null, @@ -107012,7 +107728,7 @@ public static IssuesColumnCollection IssueId( { return _using ? self.Add( - columnBracket: "\"IssueId\"", + columnBracket: "\"DashboardId\"", tableName: tableName, columnName: columnName, _as: _as, @@ -107021,10 +107737,10 @@ public static IssuesColumnCollection IssueId( : self; } - public static SqlColumnCollection Issues_IssueId( + public static SqlColumnCollection Dashboards_DashboardId( this SqlColumnCollection self, - string tableName = "Issues", - string columnName = "IssueId", + string tableName = "Dashboards", + string columnName = "DashboardId", string _as = null, Sqls.Functions function = Sqls.Functions.None, SqlStatement sub = null, @@ -107032,7 +107748,7 @@ public static SqlColumnCollection Issues_IssueId( { return _using ? self.Add( - columnBracket: "\"IssueId\"", + columnBracket: "\"DashboardId\"", tableName: tableName, columnName: columnName, _as: _as, @@ -107041,9 +107757,9 @@ public static SqlColumnCollection Issues_IssueId( : self; } - public static IssuesColumnCollection Ver( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection Ver( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "Ver", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107061,9 +107777,9 @@ public static IssuesColumnCollection Ver( : self; } - public static SqlColumnCollection Issues_Ver( + public static SqlColumnCollection Dashboards_Ver( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "Ver", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107081,9 +107797,9 @@ public static SqlColumnCollection Issues_Ver( : self; } - public static IssuesColumnCollection Title( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection Title( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "Title", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107101,9 +107817,9 @@ public static IssuesColumnCollection Title( : self; } - public static SqlColumnCollection Issues_Title( + public static SqlColumnCollection Dashboards_Title( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "Title", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107121,9 +107837,9 @@ public static SqlColumnCollection Issues_Title( : self; } - public static IssuesColumnCollection Body( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection Body( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "Body", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107141,9 +107857,9 @@ public static IssuesColumnCollection Body( : self; } - public static SqlColumnCollection Issues_Body( + public static SqlColumnCollection Dashboards_Body( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "Body", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107161,169 +107877,9 @@ public static SqlColumnCollection Issues_Body( : self; } - public static IssuesColumnCollection StartTime( - this IssuesColumnCollection self, - string tableName = "Issues", - string columnName = "StartTime", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"StartTime\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static SqlColumnCollection Issues_StartTime( - this SqlColumnCollection self, - string tableName = "Issues", - string columnName = "StartTime", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"StartTime\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static IssuesColumnCollection Status( - this IssuesColumnCollection self, - string tableName = "Issues", - string columnName = "Status", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"Status\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static SqlColumnCollection Issues_Status( - this SqlColumnCollection self, - string tableName = "Issues", - string columnName = "Status", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"Status\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static IssuesColumnCollection Manager( - this IssuesColumnCollection self, - string tableName = "Issues", - string columnName = "Manager", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"Manager\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static SqlColumnCollection Issues_Manager( - this SqlColumnCollection self, - string tableName = "Issues", - string columnName = "Manager", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"Manager\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static IssuesColumnCollection Owner( - this IssuesColumnCollection self, - string tableName = "Issues", - string columnName = "Owner", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"Owner\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static SqlColumnCollection Issues_Owner( - this SqlColumnCollection self, - string tableName = "Issues", - string columnName = "Owner", - string _as = null, - Sqls.Functions function = Sqls.Functions.None, - SqlStatement sub = null, - bool _using = true) - { - return _using - ? self.Add( - columnBracket: "\"Owner\"", - tableName: tableName, - columnName: columnName, - _as: _as, - function: function, - sub: sub) - : self; - } - - public static IssuesColumnCollection Locked( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection Locked( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "Locked", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107341,9 +107897,9 @@ public static IssuesColumnCollection Locked( : self; } - public static SqlColumnCollection Issues_Locked( + public static SqlColumnCollection Dashboards_Locked( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "Locked", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107361,9 +107917,9 @@ public static SqlColumnCollection Issues_Locked( : self; } - public static IssuesColumnCollection Comments( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection Comments( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "Comments", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107381,9 +107937,9 @@ public static IssuesColumnCollection Comments( : self; } - public static SqlColumnCollection Issues_Comments( + public static SqlColumnCollection Dashboards_Comments( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "Comments", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107401,9 +107957,9 @@ public static SqlColumnCollection Issues_Comments( : self; } - public static IssuesColumnCollection Creator( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection Creator( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "Creator", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107421,9 +107977,9 @@ public static IssuesColumnCollection Creator( : self; } - public static SqlColumnCollection Issues_Creator( + public static SqlColumnCollection Dashboards_Creator( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "Creator", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107441,9 +107997,9 @@ public static SqlColumnCollection Issues_Creator( : self; } - public static IssuesColumnCollection Updator( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection Updator( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "Updator", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107461,9 +108017,9 @@ public static IssuesColumnCollection Updator( : self; } - public static SqlColumnCollection Issues_Updator( + public static SqlColumnCollection Dashboards_Updator( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "Updator", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107481,9 +108037,9 @@ public static SqlColumnCollection Issues_Updator( : self; } - public static IssuesColumnCollection CreatedTime( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection CreatedTime( + this DashboardsColumnCollection self, + string tableName = "Dashboards", string columnName = "CreatedTime", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107501,9 +108057,9 @@ public static IssuesColumnCollection CreatedTime( : self; } - public static SqlColumnCollection Issues_CreatedTime( + public static SqlColumnCollection Dashboards_CreatedTime( this SqlColumnCollection self, - string tableName = "Issues", + string tableName = "Dashboards", string columnName = "CreatedTime", string _as = null, Sqls.Functions function = Sqls.Functions.None, @@ -107521,9 +108077,3089 @@ public static SqlColumnCollection Issues_CreatedTime( : self; } - public static IssuesColumnCollection TitleBody( - this IssuesColumnCollection self, - string tableName = "Issues", + public static DashboardsColumnCollection TitleBody( + this DashboardsColumnCollection self, + string tableName = "Dashboards", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + bool _using = true) + { + if (_using) + { + (function != Sqls.Functions.None || function == Sqls.Functions.SingleColumn + ? new List { "TitleBody" } + : new List { "Title", "Body" }) + .Select((o, i) => new { ColumnName = o, Index = i }) + .ForEach(data => + self.Add( + columnBracket: "\"" + data.ColumnName + "\"", + tableName: tableName, + columnName: data.ColumnName, + _as: _as?.Contains(",") == true + ? _as.Split_1st() + "," + data.ColumnName + : _as, + function: function)); + } + return self; + } + + public static SqlColumnCollection Dashboards_TitleBody( + this SqlColumnCollection self, + string tableName = "Dashboards", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + bool _using = true) + { + if (_using) + { + (function != Sqls.Functions.None || function == Sqls.Functions.SingleColumn + ? new List { "TitleBody" } + : new List { "Title", "Body" }) + .Select((o, i) => new { ColumnName = o, Index = i }) + .ForEach(data => + self.Add( + columnBracket: "\"" + data.ColumnName + "\"", + tableName: tableName, + columnName: data.ColumnName, + _as: _as?.Contains(",") == true + ? _as.Split_1st() + "," + data.ColumnName + : _as, + function: function)); + } + return self; + } + + public static DashboardsColumnCollection DashboardsCount( + this DashboardsColumnCollection self, + string _as = "DashboardsCount") + { + return self.Add( + columnBracket: "*", + tableName: null, + _as: _as, + function: Sqls.Functions.Count); + } + + public static DashboardsWhereCollection SiteId( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"SiteId\"" }, + tableName: tableName, + name: "SiteId", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_SiteId( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"SiteId\"" }, + tableName: tableName, + name: "SiteId", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection UpdatedTime( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"UpdatedTime\"" }, + tableName: tableName, + name: "UpdatedTime", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_UpdatedTime( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"UpdatedTime\"" }, + tableName: tableName, + name: "UpdatedTime", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection DashboardId( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"DashboardId\"" }, + tableName: tableName, + name: "DashboardId", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_DashboardId( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"DashboardId\"" }, + tableName: tableName, + name: "DashboardId", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection Ver( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Ver\"" }, + tableName: tableName, + name: "Ver", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_Ver( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Ver\"" }, + tableName: tableName, + name: "Ver", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection Title( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Title\"" }, + tableName: tableName, + name: "Title", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_Title( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Title\"" }, + tableName: tableName, + name: "Title", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection Body( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Body\"" }, + tableName: tableName, + name: "Body", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_Body( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Body\"" }, + tableName: tableName, + name: "Body", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection Locked( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Locked\"" }, + tableName: tableName, + name: "Locked", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_Locked( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Locked\"" }, + tableName: tableName, + name: "Locked", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection Comments( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Comments\"" }, + tableName: tableName, + name: "Comments", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_Comments( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Comments\"" }, + tableName: tableName, + name: "Comments", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection Creator( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Creator\"" }, + tableName: tableName, + name: "Creator", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_Creator( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Creator\"" }, + tableName: tableName, + name: "Creator", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection Updator( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Updator\"" }, + tableName: tableName, + name: "Updator", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_Updator( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Updator\"" }, + tableName: tableName, + name: "Updator", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection CreatedTime( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"CreatedTime\"" }, + tableName: tableName, + name: "CreatedTime", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_CreatedTime( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"CreatedTime\"" }, + tableName: tableName, + name: "CreatedTime", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection TitleBody( + this DashboardsWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"TitleBody\"" }, + tableName: tableName, + name: "TitleBody", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static SqlWhereCollection Dashboards_TitleBody( + this SqlWhereCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"TitleBody\"" }, + tableName: tableName, + name: "TitleBody", + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + sub: sub, + subPrefix: subPrefix, + raw: raw) + : self; + } + + public static DashboardsWhereCollection SiteId_In( + this DashboardsWhereCollection self, + IEnumerable value = null, + string tableName = "Dashboards", + SqlStatement sub = null, + bool negative = false, + bool _using = true) + { + if (!_using) + { + return self; + } + if (sub != null) + { + return self.Add( + columnBrackets: new string[] { "\"SiteId\"" }, + tableName: tableName, + name: "SiteId", + _operator: !negative ? " in " : " not in ", + sub: sub); + } + else if (value != null && value.Any()) + { + return self.Add( + columnBrackets: new string[] { "\"SiteId\"" }, + tableName: tableName, + name: "SiteId", + _operator: !negative ? " in " : " not in ", + raw: "({0})".Params(value.Join())); + } + else + { + return !negative + ? self.Add(raw: "1=0") + : self; + } + } + + public static DashboardsWhereCollection DashboardId_In( + this DashboardsWhereCollection self, + IEnumerable value = null, + string tableName = "Dashboards", + SqlStatement sub = null, + bool negative = false, + bool _using = true) + { + if (!_using) + { + return self; + } + if (sub != null) + { + return self.Add( + columnBrackets: new string[] { "\"DashboardId\"" }, + tableName: tableName, + name: "DashboardId", + _operator: !negative ? " in " : " not in ", + sub: sub); + } + else if (value != null && value.Any()) + { + return self.Add( + columnBrackets: new string[] { "\"DashboardId\"" }, + tableName: tableName, + name: "DashboardId", + _operator: !negative ? " in " : " not in ", + raw: "({0})".Params(value.Join())); + } + else + { + return !negative + ? self.Add(raw: "1=0") + : self; + } + } + + public static DashboardsWhereCollection Ver_In( + this DashboardsWhereCollection self, + IEnumerable value = null, + string tableName = "Dashboards", + SqlStatement sub = null, + bool negative = false, + bool _using = true) + { + if (!_using) + { + return self; + } + if (sub != null) + { + return self.Add( + columnBrackets: new string[] { "\"Ver\"" }, + tableName: tableName, + name: "Ver", + _operator: !negative ? " in " : " not in ", + sub: sub); + } + else if (value != null && value.Any()) + { + return self.Add( + columnBrackets: new string[] { "\"Ver\"" }, + tableName: tableName, + name: "Ver", + _operator: !negative ? " in " : " not in ", + raw: "({0})".Params(value.Join())); + } + else + { + return !negative + ? self.Add(raw: "1=0") + : self; + } + } + + public static DashboardsWhereCollection Creator_In( + this DashboardsWhereCollection self, + IEnumerable value = null, + string tableName = "Dashboards", + SqlStatement sub = null, + bool negative = false, + bool _using = true) + { + if (!_using) + { + return self; + } + if (sub != null) + { + return self.Add( + columnBrackets: new string[] { "\"Creator\"" }, + tableName: tableName, + name: "Creator", + _operator: !negative ? " in " : " not in ", + sub: sub); + } + else if (value != null && value.Any()) + { + return self.Add( + columnBrackets: new string[] { "\"Creator\"" }, + tableName: tableName, + name: "Creator", + _operator: !negative ? " in " : " not in ", + raw: "({0})".Params(value.Join())); + } + else + { + return !negative + ? self.Add(raw: "1=0") + : self; + } + } + + public static DashboardsWhereCollection Updator_In( + this DashboardsWhereCollection self, + IEnumerable value = null, + string tableName = "Dashboards", + SqlStatement sub = null, + bool negative = false, + bool _using = true) + { + if (!_using) + { + return self; + } + if (sub != null) + { + return self.Add( + columnBrackets: new string[] { "\"Updator\"" }, + tableName: tableName, + name: "Updator", + _operator: !negative ? " in " : " not in ", + sub: sub); + } + else if (value != null && value.Any()) + { + return self.Add( + columnBrackets: new string[] { "\"Updator\"" }, + tableName: tableName, + name: "Updator", + _operator: !negative ? " in " : " not in ", + raw: "({0})".Params(value.Join())); + } + else + { + return !negative + ? self.Add(raw: "1=0") + : self; + } + } + + public static DashboardsWhereCollection SiteId_Between( + this DashboardsWhereCollection self, + long begin, + long end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"SiteId\"" }, + tableName: tableName, + name: "SiteId", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static SqlWhereCollection Dashboards_SiteId_Between( + this SqlWhereCollection self, + long begin, + long end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"SiteId\"" }, + tableName: tableName, + name: "SiteId", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static DashboardsWhereCollection DashboardId_Between( + this DashboardsWhereCollection self, + long begin, + long end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"DashboardId\"" }, + tableName: tableName, + name: "DashboardId", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static SqlWhereCollection Dashboards_DashboardId_Between( + this SqlWhereCollection self, + long begin, + long end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"DashboardId\"" }, + tableName: tableName, + name: "DashboardId", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static DashboardsWhereCollection Ver_Between( + this DashboardsWhereCollection self, + int begin, + int end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Ver\"" }, + tableName: tableName, + name: "Ver", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static SqlWhereCollection Dashboards_Ver_Between( + this SqlWhereCollection self, + int begin, + int end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Ver\"" }, + tableName: tableName, + name: "Ver", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static DashboardsWhereCollection Creator_Between( + this DashboardsWhereCollection self, + int begin, + int end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Creator\"" }, + tableName: tableName, + name: "Creator", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static SqlWhereCollection Dashboards_Creator_Between( + this SqlWhereCollection self, + int begin, + int end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Creator\"" }, + tableName: tableName, + name: "Creator", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static DashboardsWhereCollection Updator_Between( + this DashboardsWhereCollection self, + int begin, + int end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Updator\"" }, + tableName: tableName, + name: "Updator", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static SqlWhereCollection Dashboards_Updator_Between( + this SqlWhereCollection self, + int begin, + int end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"Updator\"" }, + tableName: tableName, + name: "Updator", + _operator: " between ", + raw: "{0} and {1} ".Params(begin, end)) + : self; + } + + public static DashboardsWhereCollection UpdatedTime_Between( + this DashboardsWhereCollection self, + DateTime begin, + DateTime end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"UpdatedTime\"" }, + tableName: tableName, + name: "UpdatedTime", + _operator: " between ", + raw: "'{0}' and '{1}' ".Params(begin, end)) + : self; + } + + public static SqlWhereCollection Dashboards_UpdatedTime_Between( + this SqlWhereCollection self, + DateTime begin, + DateTime end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"UpdatedTime\"" }, + tableName: tableName, + name: "UpdatedTime", + _operator: " between ", + raw: "'{0}' and '{1}' ".Params(begin, end)) + : self; + } + + public static DashboardsWhereCollection CreatedTime_Between( + this DashboardsWhereCollection self, + DateTime begin, + DateTime end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"CreatedTime\"" }, + tableName: tableName, + name: "CreatedTime", + _operator: " between ", + raw: "'{0}' and '{1}' ".Params(begin, end)) + : self; + } + + public static SqlWhereCollection Dashboards_CreatedTime_Between( + this SqlWhereCollection self, + DateTime begin, + DateTime end, + string tableName = "Dashboards", + bool _using = true) + { + return _using + ? self.Add( + columnBrackets: new string[] { "\"CreatedTime\"" }, + tableName: tableName, + name: "CreatedTime", + _operator: " between ", + raw: "'{0}' and '{1}' ".Params(begin, end)) + : self; + } + + public static DashboardsWhereCollection Sub( + this DashboardsWhereCollection self, + SqlStatement sub, + object value = null, + string _operator = "=", + bool _using = true) + { + return _using + ? self.Add( + null, null, null, value, _operator, sub: sub) + : self; + } + + public static DashboardsGroupByCollection DashboardsGroupBy( + this DashboardsGroupByCollection self, string columnName, bool _using = true) + { + if (_using) + { + switch (columnName) + { + case "SiteId": return self.SiteId(); + case "UpdatedTime": return self.UpdatedTime(); + case "DashboardId": return self.DashboardId(); + case "Ver": return self.Ver(); + case "Title": return self.Title(); + case "Body": return self.Body(); + case "TitleBody": return self.TitleBody(); + case "Locked": return self.Locked(); + case "Comments": return self.Comments(); + case "Creator": return self.Creator(); + case "Updator": return self.Updator(); + case "CreatedTime": return self.CreatedTime(); + default: + return Def.ExtendedColumnTypes.ContainsKey(columnName ?? string.Empty) + ? self.Add(columnBracket: $"\"{columnName}\"") + : self; + } + } + else + { + return self; + } + } + + public static DashboardsGroupByCollection SiteId( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"SiteId\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_SiteId( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"SiteId\"", tableName: tableName); + } + + public static DashboardsGroupByCollection UpdatedTime( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"UpdatedTime\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_UpdatedTime( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"UpdatedTime\"", tableName: tableName); + } + + public static DashboardsGroupByCollection DashboardId( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"DashboardId\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_DashboardId( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"DashboardId\"", tableName: tableName); + } + + public static DashboardsGroupByCollection Ver( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Ver\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_Ver( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Ver\"", tableName: tableName); + } + + public static DashboardsGroupByCollection Title( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Title\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_Title( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Title\"", tableName: tableName); + } + + public static DashboardsGroupByCollection Body( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Body\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_Body( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Body\"", tableName: tableName); + } + + public static DashboardsGroupByCollection TitleBody( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"TitleBody\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_TitleBody( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"TitleBody\"", tableName: tableName); + } + + public static DashboardsGroupByCollection Locked( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Locked\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_Locked( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Locked\"", tableName: tableName); + } + + public static DashboardsGroupByCollection Comments( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Comments\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_Comments( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Comments\"", tableName: tableName); + } + + public static DashboardsGroupByCollection Creator( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Creator\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_Creator( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Creator\"", tableName: tableName); + } + + public static DashboardsGroupByCollection Updator( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Updator\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_Updator( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"Updator\"", tableName: tableName); + } + + public static DashboardsGroupByCollection CreatedTime( + this DashboardsGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"CreatedTime\"", tableName: tableName); + } + + public static SqlGroupByCollection Dashboards_CreatedTime( + this SqlGroupByCollection self, string tableName = "Dashboards") + { + return self.Add(columnBracket: "\"CreatedTime\"", tableName: tableName); + } + + public static DashboardsHavingCollection DashboardsCount( + this DashboardsHavingCollection self, + object value = null, + string tableName = "Dashboards", + string _operator = null) + { + return self.Add( + columnBracket: "*", + value: value, + tableName: tableName, + _operator: _operator, + function: Sqls.Functions.Count); + } + + public static DashboardsHavingCollection CreatedTime( + this DashboardsHavingCollection self, + string tableName = "Dashboards", + object value = null, + string _operator = "=", + Sqls.Functions function = Sqls.Functions.None) + { + return self.Add( + columnBracket: "CreatedTime", + tableName: tableName, + value: value, + _operator: _operator, + function: function); + } + + public static DashboardsOrderByCollection SiteId( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"SiteId\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection UpdatedTime( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"UpdatedTime\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection DashboardId( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"DashboardId\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection Ver( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Ver\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection Title( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Title\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection Body( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Body\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection TitleBody( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Title\"", "\"Body\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection Locked( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Locked\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection Comments( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Comments\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection Creator( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Creator\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection Updator( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Updator\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection CreatedTime( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"CreatedTime\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_SiteId( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"SiteId\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_UpdatedTime( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"UpdatedTime\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_DashboardId( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"DashboardId\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_Ver( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Ver\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_Title( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Title\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_Body( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Body\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_TitleBody( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Title\"", "\"Body\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_Locked( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Locked\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_Comments( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Comments\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_Creator( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Creator\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_Updator( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"Updator\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static SqlOrderByCollection Dashboards_CreatedTime( + this SqlOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Dashboards", + string isNullValue = null, + Sqls.Functions function = Sqls.Functions.None) + { + new List { "\"CreatedTime\"" }.ForEach(columnBracket => + self.Add( + columnBracket: columnBracket, + orderType: orderType, + tableName: tableName, + isNullValue: isNullValue, + function: function)); + return self; + } + + public static DashboardsOrderByCollection DashboardsCount( + this DashboardsOrderByCollection self, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc) + { + return self.Add( + columnBracket: "*", + orderType: orderType, + function: Sqls.Functions.Count); + } + + public static DashboardsParamCollection ItemId(this DashboardsParamCollection self, long itemId) + { + if (itemId == 0) + { + return self.DashboardId(raw: Def.Sql.Identity); + } + else + { + return self.DashboardId(value: itemId); + } + } + + public static DashboardsParamCollection SiteId( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"SiteId\"", + name: "SiteId", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_SiteId( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"SiteId\"", + name: "SiteId", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection UpdatedTime( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"UpdatedTime\"", + name: "UpdatedTime", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_UpdatedTime( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"UpdatedTime\"", + name: "UpdatedTime", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection DashboardId( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"DashboardId\"", + name: "DashboardId", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_DashboardId( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"DashboardId\"", + name: "DashboardId", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection Ver( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Ver\"", + name: "Ver", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_Ver( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Ver\"", + name: "Ver", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection Title( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Title\"", + name: "Title", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_Title( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Title\"", + name: "Title", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection Body( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Body\"", + name: "Body", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_Body( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Body\"", + name: "Body", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection Locked( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Locked\"", + name: "Locked", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_Locked( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Locked\"", + name: "Locked", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection Comments( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Comments\"", + name: "Comments", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_Comments( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Comments\"", + name: "Comments", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection Creator( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Creator\"", + name: "Creator", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_Creator( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Creator\"", + name: "Creator", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection Updator( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Updator\"", + name: "Updator", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_Updator( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Updator\"", + name: "Updator", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static DashboardsParamCollection CreatedTime( + this DashboardsParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"CreatedTime\"", + name: "CreatedTime", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static SqlParamCollection Dashboards_CreatedTime( + this SqlParamCollection self, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"CreatedTime\"", + name: "CreatedTime", + value: value, + sub: sub, + raw: raw) + : self; + } + + public static IssuesColumnCollection IssuesColumn() + { + return new IssuesColumnCollection(); + } + + public class IssuesColumnCollection : SqlColumnCollection + { + public new IssuesColumnCollection Add( + string columnBracket = null, + string tableName = "Issues", + string columnName = null, + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool subPrefix = true) + { + base.Add( + columnBracket: columnBracket, + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub, + subPrefix: subPrefix); + return this; + } + } + + public static IssuesJoinCollection IssuesJoin() + { + return new IssuesJoinCollection(); + } + + public class IssuesJoinCollection : SqlJoinCollection + { + public IssuesJoinCollection Add(params SqlJoin[] sqlJoinCollection) + { + sqlJoinCollection.ForEach(sqlJoin => base.Add(sqlJoin)); + return this; + } + } + + public static IssuesWhereCollection IssuesWhere() + { + return new IssuesWhereCollection(); + } + + public class IssuesWhereCollection : SqlWhereCollection + { + public IssuesWhereCollection Add( + string tableName = "Issues", + string[] columnBrackets = null, + string name = null, + object value = null, + string _operator = "=", + string multiColumnOperator = " or ", + string multiParamOperator = " and ", + SqlStatement subLeft = null, + SqlStatement sub = null, + bool subPrefix = true, + string raw = null, + bool _using = true) + { + if (_using) + { + Add(new SqlWhere( + columnBrackets: columnBrackets, + tableName: tableName, + name: name, + value: value, + _operator: _operator, + multiColumnOperator: multiColumnOperator, + multiParamOperator: multiParamOperator, + subLeft: subLeft, + sub: sub, + subPrefix: subPrefix, + raw: raw)); + } + return this; + } + } + + public static IssuesGroupByCollection IssuesGroupBy() + { + return new IssuesGroupByCollection(); + } + + public class IssuesGroupByCollection : SqlGroupByCollection + { + public new IssuesGroupByCollection Add( + string columnBracket, string tableName = "Issues") + { + Add(new SqlGroupBy( + columnBracket: columnBracket, + tableName: tableName)); + return this; + } + } + + public static IssuesHavingCollection IssuesHaving() + { + return new IssuesHavingCollection(); + } + + public class IssuesHavingCollection : SqlHavingCollection + { + public IssuesHavingCollection Add( + string columnBracket, + string tableName = "Issues", + object value = null, + string _operator = "=", + Sqls.Functions function = Sqls.Functions.None) + { + Add(new SqlHaving( + columnBracket: columnBracket, + tableName: tableName, + value: value, + _operator: _operator, + function: function)); + return this; + } + } + + public static IssuesOrderByCollection IssuesOrderBy() + { + return new IssuesOrderByCollection(); + } + + public class IssuesOrderByCollection : SqlOrderByCollection + { + public IssuesOrderByCollection Add( + string columnBracket, + SqlOrderBy.Types orderType = SqlOrderBy.Types.asc, + string tableName = "Issues", + Sqls.Functions function = Sqls.Functions.None) + { + Add(new SqlOrderBy( + columnBracket: columnBracket, + tableName: tableName, + orderType: orderType, + function: function)); + return this; + } + } + + public static IssuesParamCollection IssuesParam() + { + return new IssuesParamCollection(); + } + + public class IssuesParamCollection : SqlParamCollection + { + public new IssuesParamCollection Add( + string columnBracket = null, + string name = null, + object value = null, + SqlStatement sub = null, + string raw = null, + bool _using = true) + { + Add(new SqlParam( + columnBracket: columnBracket, + name: name, + value: value, + sub: sub, + raw: raw, + _using: _using)); + return this; + } + } + + public static string Issues_Title_WhereLike( + ISqlObjectFactory factory, + string tableName = "Issues", + string name = "SearchText", + bool forward = false, + bool escape = false, + bool negative = false) + { + return "(\"" + tableName + "\".\"Title\"" + + (negative + ? factory.Sqls.NotLike + : factory.Sqls.Like) + + (forward + ? string.Empty + : factory.Sqls.WhereLikeTemplateForward) + + $"@{name}{factory.Sqls.WhereLikeTemplate}" + + (escape + ? factory.Sqls.Escape + : string.Empty) + + ")"; + } + + public static string Issues_Body_WhereLike( + ISqlObjectFactory factory, + string tableName = "Issues", + string name = "SearchText", + bool forward = false, + bool escape = false, + bool negative = false) + { + return "(\"" + tableName + "\".\"Body\"" + + (negative + ? factory.Sqls.NotLike + : factory.Sqls.Like) + + (forward + ? string.Empty + : factory.Sqls.WhereLikeTemplateForward) + + $"@{name}{factory.Sqls.WhereLikeTemplate}" + + (escape + ? factory.Sqls.Escape + : string.Empty) + + ")"; + } + + public static IssuesColumnCollection IssuesColumn( + this IssuesColumnCollection self, + string columnName, + string _as = null, + Sqls.Functions function = Sqls.Functions.None) + { + switch (columnName) + { + case "SiteId": + return self.SiteId(_as: _as, function: function); + case "UpdatedTime": + return self.UpdatedTime(_as: _as, function: function); + case "IssueId": + return self.IssueId(_as: _as, function: function); + case "Ver": + return self.Ver(_as: _as, function: function); + case "Title": + return self.Title(_as: _as, function: function); + case "Body": + return self.Body(_as: _as, function: function); + case "TitleBody": + return self.TitleBody(_as: _as, function: function); + case "StartTime": + return self.StartTime(_as: _as, function: function); + case "CompletionTime": + return self.CompletionTime(_as: _as, function: function); + case "WorkValue": + return self.WorkValue(_as: _as, function: function); + case "ProgressRate": + return self.ProgressRate(_as: _as, function: function); + case "RemainingWorkValue": + return self.RemainingWorkValue(_as: _as, function: function); + case "Status": + return self.Status(_as: _as, function: function); + case "Manager": + return self.Manager(_as: _as, function: function); + case "Owner": + return self.Owner(_as: _as, function: function); + case "Locked": + return self.Locked(_as: _as, function: function); + case "SiteTitle": + return self.SiteTitle(_as: _as, function: function); + case "Comments": + return self.Comments(_as: _as, function: function); + case "Creator": + return self.Creator(_as: _as, function: function); + case "Updator": + return self.Updator(_as: _as, function: function); + case "CreatedTime": + return self.CreatedTime(_as: _as, function: function); + default: + return Def.ExtendedColumnTypes.ContainsKey(columnName ?? string.Empty) + ? self.Add( + columnBracket: $"\"{columnName}\"", + columnName: columnName, + _as: _as, + function: function) + : self; + } + } + + public static IssuesColumnCollection SiteId( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "SiteId", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"SiteId\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_SiteId( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "SiteId", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"SiteId\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection UpdatedTime( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "UpdatedTime", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"UpdatedTime\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_UpdatedTime( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "UpdatedTime", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"UpdatedTime\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection IssueId( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "IssueId", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"IssueId\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_IssueId( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "IssueId", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"IssueId\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Ver( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Ver", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Ver\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Ver( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Ver", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Ver\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Title( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Title", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Title\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Title( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Title", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Title\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Body( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Body", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Body\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Body( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Body", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Body\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection StartTime( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "StartTime", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"StartTime\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_StartTime( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "StartTime", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"StartTime\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Status( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Status", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Status\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Status( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Status", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Status\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Manager( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Manager", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Manager\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Manager( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Manager", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Manager\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Owner( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Owner", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Owner\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Owner( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Owner", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Owner\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Locked( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Locked", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Locked\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Locked( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Locked", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Locked\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Comments( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Comments", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Comments\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Comments( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Comments", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Comments\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Creator( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Creator", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Creator\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Creator( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Creator", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Creator\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection Updator( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "Updator", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Updator\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_Updator( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "Updator", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"Updator\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection CreatedTime( + this IssuesColumnCollection self, + string tableName = "Issues", + string columnName = "CreatedTime", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"CreatedTime\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static SqlColumnCollection Issues_CreatedTime( + this SqlColumnCollection self, + string tableName = "Issues", + string columnName = "CreatedTime", + string _as = null, + Sqls.Functions function = Sqls.Functions.None, + SqlStatement sub = null, + bool _using = true) + { + return _using + ? self.Add( + columnBracket: "\"CreatedTime\"", + tableName: tableName, + columnName: columnName, + _as: _as, + function: function, + sub: sub) + : self; + } + + public static IssuesColumnCollection TitleBody( + this IssuesColumnCollection self, + string tableName = "Issues", string _as = null, Sqls.Functions function = Sqls.Functions.None, bool _using = true) @@ -121471,99 +125107,485 @@ public static SysLogsParamCollection SysLogsParamDefault( return param; } - public static TenantsColumnCollection TenantsDefaultColumns() + public static TenantsColumnCollection TenantsDefaultColumns() + { + var targets = Def.ColumnDefinitionCollection + .Where(columnDefinition => columnDefinition.TableName == "Tenants") + .Where(columnDefinition => !columnDefinition.LowSchemaVersion()) + .Select(columnDefinition => columnDefinition.ColumnName) + .ToList(); + var column = TenantsColumn() + .TenantId(_using: targets.Contains("TenantId")) + .Ver(_using: targets.Contains("Ver")) + .TenantName(_using: targets.Contains("TenantName")) + .Title(_using: targets.Contains("Title")) + .Body(_using: targets.Contains("Body")) + .ContractSettings(_using: targets.Contains("ContractSettings")) + .ContractDeadline(_using: targets.Contains("ContractDeadline")) + .DisableAllUsersPermission(_using: targets.Contains("DisableAllUsersPermission")) + .DisableApi(_using: targets.Contains("DisableApi")) + .DisableStartGuide(_using: targets.Contains("DisableStartGuide")) + .LogoType(_using: targets.Contains("LogoType")) + .HtmlTitleTop(_using: targets.Contains("HtmlTitleTop")) + .HtmlTitleSite(_using: targets.Contains("HtmlTitleSite")) + .HtmlTitleRecord(_using: targets.Contains("HtmlTitleRecord")) + .TopStyle(_using: targets.Contains("TopStyle")) + .TopScript(_using: targets.Contains("TopScript")) + .TopDashboards(_using: targets.Contains("TopDashboards")) + .Comments(_using: targets.Contains("Comments")) + .Creator(_using: targets.Contains("Creator")) + .Updator(_using: targets.Contains("Updator")) + .CreatedTime(_using: targets.Contains("CreatedTime")) + .UpdatedTime(_using: targets.Contains("UpdatedTime")); + Def.ColumnDefinitionCollection + .Where(columnDefinition => columnDefinition.TableName == "Tenants") + .Where(columnDefinition => !columnDefinition.ExtendedColumnType.IsNullOrEmpty()) + .ForEach(columnDefinition => + column.TenantsColumn(columnDefinition.ColumnName)); + return column; + } + + public static TenantsJoinCollection TenantsJoinDefault() + { + var join = TenantsJoin(); + return join; + } + + public static TenantsWhereCollection TenantsWhereDefault( + Context context, TenantModel tenantModel) + { + return TenantsWhere() + .TenantId(tenantModel.TenantId); + } + + public static TenantsParamCollection TenantsParamDefault( + Context context, + SiteSettings ss, + TenantModel tenantModel, + bool setDefault = false, + bool otherInitValue = false) + { + var param = TenantsParam() + .Ver(tenantModel.Ver, _using: tenantModel.Ver_Updated(context) || setDefault || (otherInitValue && !tenantModel.Ver.InitialValue(context))) + .TenantName(tenantModel.TenantName.MaxLength(1024), _using: tenantModel.TenantName_Updated(context) || setDefault || (otherInitValue && !tenantModel.TenantName.InitialValue(context))) + .Title(tenantModel.Title.Value.MaxLength(1024), _using: tenantModel.Title_Updated(context) || (otherInitValue && !tenantModel.Title.InitialValue(context))) + .Body(tenantModel.Body, _using: tenantModel.Body_Updated(context) || (otherInitValue && !tenantModel.Body.InitialValue(context))) + .ContractSettings(tenantModel.ContractSettings?.RecordingJson(), _using: tenantModel.ContractSettings_Updated(context) || (otherInitValue && !tenantModel.ContractSettings.InitialValue(context))) + .ContractDeadline(tenantModel.ContractDeadline, _using: tenantModel.ContractDeadline_Updated(context) || (otherInitValue && !tenantModel.ContractDeadline.InitialValue(context))) + .DisableAllUsersPermission(tenantModel.DisableAllUsersPermission, _using: tenantModel.DisableAllUsersPermission_Updated(context) || (otherInitValue && !tenantModel.DisableAllUsersPermission.InitialValue(context))) + .DisableApi(tenantModel.DisableApi, _using: tenantModel.DisableApi_Updated(context) || (otherInitValue && !tenantModel.DisableApi.InitialValue(context))) + .DisableStartGuide(tenantModel.DisableStartGuide, _using: tenantModel.DisableStartGuide_Updated(context) || (otherInitValue && !tenantModel.DisableStartGuide.InitialValue(context))) + .LogoType(tenantModel.LogoType.ToInt(), _using: tenantModel.LogoType_Updated(context) || setDefault || (otherInitValue && !tenantModel.LogoType.InitialValue(context))) + .HtmlTitleTop(tenantModel.HtmlTitleTop.MaxLength(1024), _using: tenantModel.HtmlTitleTop_Updated(context) || setDefault || (otherInitValue && !tenantModel.HtmlTitleTop.InitialValue(context))) + .HtmlTitleSite(tenantModel.HtmlTitleSite.MaxLength(1024), _using: tenantModel.HtmlTitleSite_Updated(context) || setDefault || (otherInitValue && !tenantModel.HtmlTitleSite.InitialValue(context))) + .HtmlTitleRecord(tenantModel.HtmlTitleRecord.MaxLength(1024), _using: tenantModel.HtmlTitleRecord_Updated(context) || setDefault || (otherInitValue && !tenantModel.HtmlTitleRecord.InitialValue(context))) + .TopStyle(tenantModel.TopStyle, _using: tenantModel.TopStyle_Updated(context) || (otherInitValue && !tenantModel.TopStyle.InitialValue(context))) + .TopScript(tenantModel.TopScript, _using: tenantModel.TopScript_Updated(context) || (otherInitValue && !tenantModel.TopScript.InitialValue(context))) + .TopDashboards(tenantModel.TopDashboards, _using: tenantModel.TopDashboards_Updated(context) || (otherInitValue && !tenantModel.TopDashboards.InitialValue(context))) + .Comments(tenantModel.Comments.ToJson(), _using: tenantModel.Comments_Updated(context) || (otherInitValue && !tenantModel.Comments.InitialValue(context))); + tenantModel.ClassHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Class") + .Where(o => tenantModel.Class_Updated(columnName: o.Key) + || (otherInitValue && !tenantModel.GetClass(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value.MaxLength(1024))); + tenantModel.NumHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Num") + .Where(o => tenantModel.Num_Updated( + columnName: o.Key, + column: ss?.GetColumn( + context: context, + columnName: o.Key), + paramDefault: true) + || (otherInitValue && !tenantModel.GetNum(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + { + if (o.Value?.Value != null) + { + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value.Value); + } + else + { + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + raw: "null"); + } + }); + tenantModel.DateHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Date") + .Where(o => tenantModel.Date_Updated(columnName: o.Key) + || (otherInitValue && !tenantModel.GetDate(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value)); + tenantModel.DescriptionHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Description") + .Where(o => tenantModel.Description_Updated(columnName: o.Key) + || (otherInitValue && !tenantModel.GetDescription(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value ?? string.Empty)); + tenantModel.CheckHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Check") + .Where(o => tenantModel.Check_Updated(columnName: o.Key) + || (otherInitValue && !tenantModel.GetCheck(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value)); + tenantModel.AttachmentsHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Attachments") + .Where(o => tenantModel.Attachments_Updated(columnName: o.Key) + || (otherInitValue && !tenantModel.GetAttachments(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value?.RecordingJson() ?? string.Empty)); + return param; + } + + public static UsersColumnCollection UsersDefaultColumns() + { + var targets = Def.ColumnDefinitionCollection + .Where(columnDefinition => columnDefinition.TableName == "Users") + .Where(columnDefinition => !columnDefinition.LowSchemaVersion()) + .Select(columnDefinition => columnDefinition.ColumnName) + .ToList(); + var column = UsersColumn() + .TenantId(_using: targets.Contains("TenantId")) + .UserId(_using: targets.Contains("UserId")) + .Ver(_using: targets.Contains("Ver")) + .LoginId(_using: targets.Contains("LoginId")) + .GlobalId(_using: targets.Contains("GlobalId")) + .Name(_using: targets.Contains("Name")) + .UserCode(_using: targets.Contains("UserCode")) + .Password(_using: targets.Contains("Password")) + .LastName(_using: targets.Contains("LastName")) + .FirstName(_using: targets.Contains("FirstName")) + .Birthday(_using: targets.Contains("Birthday")) + .Gender(_using: targets.Contains("Gender")) + .Language(_using: targets.Contains("Language")) + .TimeZone(_using: targets.Contains("TimeZone")) + .TimeZoneInfo(_using: targets.Contains("TimeZoneInfo")) + .DeptCode(_using: targets.Contains("DeptCode")) + .DeptId(_using: targets.Contains("DeptId")) + .Dept(_using: targets.Contains("Dept")) + .Theme(_using: targets.Contains("Theme")) + .FirstAndLastNameOrder(_using: targets.Contains("FirstAndLastNameOrder")) + .Body(_using: targets.Contains("Body")) + .LastLoginTime(_using: targets.Contains("LastLoginTime")) + .PasswordExpirationTime(_using: targets.Contains("PasswordExpirationTime")) + .PasswordChangeTime(_using: targets.Contains("PasswordChangeTime")) + .NumberOfLogins(_using: targets.Contains("NumberOfLogins")) + .NumberOfDenial(_using: targets.Contains("NumberOfDenial")) + .TenantManager(_using: targets.Contains("TenantManager")) + .ServiceManager(_using: targets.Contains("ServiceManager")) + .AllowCreationAtTopSite(_using: targets.Contains("AllowCreationAtTopSite")) + .AllowGroupAdministration(_using: targets.Contains("AllowGroupAdministration")) + .AllowGroupCreation(_using: targets.Contains("AllowGroupCreation")) + .AllowApi(_using: targets.Contains("AllowApi")) + .EnableSecondaryAuthentication(_using: targets.Contains("EnableSecondaryAuthentication")) + .DisableSecondaryAuthentication(_using: targets.Contains("DisableSecondaryAuthentication")) + .Disabled(_using: targets.Contains("Disabled")) + .Lockout(_using: targets.Contains("Lockout")) + .LockoutCounter(_using: targets.Contains("LockoutCounter")) + .Developer(_using: targets.Contains("Developer")) + .UserSettings(_using: targets.Contains("UserSettings")) + .ApiKey(_using: targets.Contains("ApiKey")) + .PasswordHistries(_using: targets.Contains("PasswordHistries")) + .SecondaryAuthenticationCode(_using: targets.Contains("SecondaryAuthenticationCode")) + .SecondaryAuthenticationCodeExpirationTime(_using: targets.Contains("SecondaryAuthenticationCodeExpirationTime")) + .LdapSearchRoot(_using: targets.Contains("LdapSearchRoot")) + .SynchronizedTime(_using: targets.Contains("SynchronizedTime")) + .Comments(_using: targets.Contains("Comments")) + .Creator(_using: targets.Contains("Creator")) + .Updator(_using: targets.Contains("Updator")) + .CreatedTime(_using: targets.Contains("CreatedTime")) + .UpdatedTime(_using: targets.Contains("UpdatedTime")); + Def.ColumnDefinitionCollection + .Where(columnDefinition => columnDefinition.TableName == "Users") + .Where(columnDefinition => !columnDefinition.ExtendedColumnType.IsNullOrEmpty()) + .ForEach(columnDefinition => + column.UsersColumn(columnDefinition.ColumnName)); + return column; + } + + public static UsersJoinCollection UsersJoinDefault() + { + var join = UsersJoin(); + join.Add(new SqlJoin( + tableBracket: "\"Depts\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Users\".\"DeptId\"=\"Depts\".\"DeptId\"")); + return join; + } + + public static UsersWhereCollection UsersWhereDefault( + Context context, UserModel userModel) + { + return UsersWhere() + .TenantId(userModel.TenantId) + .UserId(userModel.UserId); + } + + public static UsersParamCollection UsersParamDefault( + Context context, + SiteSettings ss, + UserModel userModel, + bool setDefault = false, + bool otherInitValue = false) + { + var param = UsersParam() + .TenantId(userModel.TenantId) + .Ver(userModel.Ver, _using: userModel.Ver_Updated(context) || setDefault || (otherInitValue && !userModel.Ver.InitialValue(context))) + .LoginId(userModel.LoginId.MaxLength(256), _using: userModel.LoginId_Updated(context) || setDefault || (otherInitValue && !userModel.LoginId.InitialValue(context))) + .GlobalId(userModel.GlobalId.MaxLength(36), _using: userModel.GlobalId_Updated(context) || (otherInitValue && !userModel.GlobalId.InitialValue(context))) + .Name(userModel.Name.MaxLength(128), _using: userModel.Name_Updated(context) || (otherInitValue && !userModel.Name.InitialValue(context))) + .UserCode(userModel.UserCode.MaxLength(32), _using: userModel.UserCode_Updated(context) || (otherInitValue && !userModel.UserCode.InitialValue(context))) + .Password(userModel.Password.MaxLength(128), _using: userModel.Password_Updated(context) || (otherInitValue && !userModel.Password.InitialValue(context))) + .LastName(userModel.LastName.MaxLength(32), _using: userModel.LastName_Updated(context) || (otherInitValue && !userModel.LastName.InitialValue(context))) + .FirstName(userModel.FirstName.MaxLength(32), _using: userModel.FirstName_Updated(context) || (otherInitValue && !userModel.FirstName.InitialValue(context))) + .Birthday(userModel.Birthday.Value, _using: userModel.Birthday_Updated(context) || (otherInitValue && !userModel.Birthday.InitialValue(context))) + .Gender(userModel.Gender.MaxLength(2), _using: userModel.Gender_Updated(context) || (otherInitValue && !userModel.Gender.InitialValue(context))) + .Language(userModel.Language.MaxLength(32), _using: userModel.Language_Updated(context) || setDefault || (otherInitValue && !userModel.Language.InitialValue(context))) + .TimeZone(userModel.TimeZone.MaxLength(32), _using: userModel.TimeZone_Updated(context) || (otherInitValue && !userModel.TimeZone.InitialValue(context))) + .DeptId(userModel.DeptId, _using: userModel.DeptId_Updated(context) || setDefault || (otherInitValue && !userModel.DeptId.InitialValue(context))) + .Theme(userModel.Theme.MaxLength(32), _using: userModel.Theme_Updated(context) || (otherInitValue && !userModel.Theme.InitialValue(context))) + .FirstAndLastNameOrder(userModel.FirstAndLastNameOrder.ToInt(), _using: userModel.FirstAndLastNameOrder_Updated(context) || setDefault || (otherInitValue && !userModel.FirstAndLastNameOrder.InitialValue(context))) + .Body(userModel.Body, _using: userModel.Body_Updated(context) || (otherInitValue && !userModel.Body.InitialValue(context))) + .LastLoginTime(userModel.LastLoginTime.Value, _using: userModel.LastLoginTime_Updated(context) || (otherInitValue && !userModel.LastLoginTime.InitialValue(context))) + .PasswordExpirationTime(userModel.PasswordExpirationTime.Value, _using: userModel.PasswordExpirationTime_Updated(context) || (otherInitValue && !userModel.PasswordExpirationTime.InitialValue(context))) + .PasswordChangeTime(userModel.PasswordChangeTime.Value, _using: userModel.PasswordChangeTime_Updated(context) || (otherInitValue && !userModel.PasswordChangeTime.InitialValue(context))) + .NumberOfLogins(userModel.NumberOfLogins, _using: userModel.NumberOfLogins_Updated(context) || (otherInitValue && !userModel.NumberOfLogins.InitialValue(context))) + .NumberOfDenial(userModel.NumberOfDenial, _using: userModel.NumberOfDenial_Updated(context) || (otherInitValue && !userModel.NumberOfDenial.InitialValue(context))) + .TenantManager(userModel.TenantManager, _using: userModel.TenantManager_Updated(context) || setDefault || (otherInitValue && !userModel.TenantManager.InitialValue(context))) + .ServiceManager(userModel.ServiceManager, _using: userModel.ServiceManager_Updated(context) || setDefault || (otherInitValue && !userModel.ServiceManager.InitialValue(context))) + .AllowCreationAtTopSite(userModel.AllowCreationAtTopSite, _using: userModel.AllowCreationAtTopSite_Updated(context) || setDefault || (otherInitValue && !userModel.AllowCreationAtTopSite.InitialValue(context))) + .AllowGroupAdministration(userModel.AllowGroupAdministration, _using: userModel.AllowGroupAdministration_Updated(context) || setDefault || (otherInitValue && !userModel.AllowGroupAdministration.InitialValue(context))) + .AllowGroupCreation(userModel.AllowGroupCreation, _using: userModel.AllowGroupCreation_Updated(context) || setDefault || (otherInitValue && !userModel.AllowGroupCreation.InitialValue(context))) + .AllowApi(userModel.AllowApi, _using: userModel.AllowApi_Updated(context) || setDefault || (otherInitValue && !userModel.AllowApi.InitialValue(context))) + .EnableSecondaryAuthentication(userModel.EnableSecondaryAuthentication, _using: userModel.EnableSecondaryAuthentication_Updated(context) || setDefault || (otherInitValue && !userModel.EnableSecondaryAuthentication.InitialValue(context))) + .DisableSecondaryAuthentication(userModel.DisableSecondaryAuthentication, _using: userModel.DisableSecondaryAuthentication_Updated(context) || setDefault || (otherInitValue && !userModel.DisableSecondaryAuthentication.InitialValue(context))) + .Disabled(userModel.Disabled, _using: userModel.Disabled_Updated(context) || setDefault || (otherInitValue && !userModel.Disabled.InitialValue(context))) + .Lockout(userModel.Lockout, _using: userModel.Lockout_Updated(context) || setDefault || (otherInitValue && !userModel.Lockout.InitialValue(context))) + .LockoutCounter(userModel.LockoutCounter, _using: userModel.LockoutCounter_Updated(context) || setDefault || (otherInitValue && !userModel.LockoutCounter.InitialValue(context))) + .Developer(userModel.Developer, _using: userModel.Developer_Updated(context) || setDefault || (otherInitValue && !userModel.Developer.InitialValue(context))) + .UserSettings(userModel.UserSettings.RecordingJson(), _using: userModel.UserSettings_Updated(context) || (otherInitValue && !userModel.UserSettings.InitialValue(context))) + .ApiKey(userModel.ApiKey.MaxLength(128), _using: userModel.ApiKey_Updated(context) || (otherInitValue && !userModel.ApiKey.InitialValue(context))) + .PasswordHistries(userModel.PasswordHistries.ToJson(), _using: userModel.PasswordHistries_Updated(context) || (otherInitValue && !userModel.PasswordHistries.InitialValue(context))) + .SecondaryAuthenticationCode(userModel.SecondaryAuthenticationCode.MaxLength(128), _using: userModel.SecondaryAuthenticationCode_Updated(context) || (otherInitValue && !userModel.SecondaryAuthenticationCode.InitialValue(context))) + .SecondaryAuthenticationCodeExpirationTime(userModel.SecondaryAuthenticationCodeExpirationTime.Value, _using: userModel.SecondaryAuthenticationCodeExpirationTime_Updated(context) || (otherInitValue && !userModel.SecondaryAuthenticationCodeExpirationTime.InitialValue(context))) + .LdapSearchRoot(userModel.LdapSearchRoot.MaxLength(2048), _using: userModel.LdapSearchRoot_Updated(context) || (otherInitValue && !userModel.LdapSearchRoot.InitialValue(context))) + .SynchronizedTime(userModel.SynchronizedTime, _using: userModel.SynchronizedTime_Updated(context) || (otherInitValue && !userModel.SynchronizedTime.InitialValue(context))) + .Comments(userModel.Comments.ToJson(), _using: userModel.Comments_Updated(context) || (otherInitValue && !userModel.Comments.InitialValue(context))); + userModel.ClassHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Class") + .Where(o => userModel.Class_Updated(columnName: o.Key) + || (otherInitValue && !userModel.GetClass(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value.MaxLength(1024))); + userModel.NumHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Num") + .Where(o => userModel.Num_Updated( + columnName: o.Key, + column: ss?.GetColumn( + context: context, + columnName: o.Key), + paramDefault: true) + || (otherInitValue && !userModel.GetNum(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + { + if (o.Value?.Value != null) + { + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value.Value); + } + else + { + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + raw: "null"); + } + }); + userModel.DateHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Date") + .Where(o => userModel.Date_Updated(columnName: o.Key) + || (otherInitValue && !userModel.GetDate(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value)); + userModel.DescriptionHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Description") + .Where(o => userModel.Description_Updated(columnName: o.Key) + || (otherInitValue && !userModel.GetDescription(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value ?? string.Empty)); + userModel.CheckHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Check") + .Where(o => userModel.Check_Updated(columnName: o.Key) + || (otherInitValue && !userModel.GetCheck(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value)); + userModel.AttachmentsHash + .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Attachments") + .Where(o => userModel.Attachments_Updated(columnName: o.Key) + || (otherInitValue && !userModel.GetAttachments(columnName: o.Key) + .InitialValue(context: context))) + .ForEach(o => + param.Add( + columnBracket: $"\"{o.Key}\"", + name: o.Key, + value: o.Value?.RecordingJson() ?? string.Empty)); + if (setDefault) + { + ss?.Columns + ?.Where(column => column.DefaultNotNull) + .Where(column => !column.Required) + .Where(column => !param.Any(p => p.Name == column.ColumnName)) + .ForEach(column => + { + var value = column.DefaultNotNullValue(); + if (value != null) + { + param.Add( + columnBracket: $"\"{column.ColumnName}\"", + name: column.ColumnName, + value: value, + sub: null, + raw: null); + } + }); + } + return param; + } + + public static PermissionsColumnCollection PermissionsDefaultColumns() { var targets = Def.ColumnDefinitionCollection - .Where(columnDefinition => columnDefinition.TableName == "Tenants") + .Where(columnDefinition => columnDefinition.TableName == "Permissions") .Where(columnDefinition => !columnDefinition.LowSchemaVersion()) .Select(columnDefinition => columnDefinition.ColumnName) .ToList(); - var column = TenantsColumn() - .TenantId(_using: targets.Contains("TenantId")) + var column = PermissionsColumn() + .ReferenceId(_using: targets.Contains("ReferenceId")) + .DeptId(_using: targets.Contains("DeptId")) + .GroupId(_using: targets.Contains("GroupId")) + .UserId(_using: targets.Contains("UserId")) .Ver(_using: targets.Contains("Ver")) - .TenantName(_using: targets.Contains("TenantName")) - .Title(_using: targets.Contains("Title")) - .Body(_using: targets.Contains("Body")) - .ContractSettings(_using: targets.Contains("ContractSettings")) - .ContractDeadline(_using: targets.Contains("ContractDeadline")) - .DisableAllUsersPermission(_using: targets.Contains("DisableAllUsersPermission")) - .DisableApi(_using: targets.Contains("DisableApi")) - .DisableStartGuide(_using: targets.Contains("DisableStartGuide")) - .LogoType(_using: targets.Contains("LogoType")) - .HtmlTitleTop(_using: targets.Contains("HtmlTitleTop")) - .HtmlTitleSite(_using: targets.Contains("HtmlTitleSite")) - .HtmlTitleRecord(_using: targets.Contains("HtmlTitleRecord")) - .TopStyle(_using: targets.Contains("TopStyle")) - .TopScript(_using: targets.Contains("TopScript")) + .DeptName(_using: targets.Contains("DeptName")) + .GroupName(_using: targets.Contains("GroupName")) + .Name(_using: targets.Contains("Name")) + .PermissionType(_using: targets.Contains("PermissionType")) .Comments(_using: targets.Contains("Comments")) .Creator(_using: targets.Contains("Creator")) .Updator(_using: targets.Contains("Updator")) .CreatedTime(_using: targets.Contains("CreatedTime")) .UpdatedTime(_using: targets.Contains("UpdatedTime")); Def.ColumnDefinitionCollection - .Where(columnDefinition => columnDefinition.TableName == "Tenants") + .Where(columnDefinition => columnDefinition.TableName == "Permissions") .Where(columnDefinition => !columnDefinition.ExtendedColumnType.IsNullOrEmpty()) .ForEach(columnDefinition => - column.TenantsColumn(columnDefinition.ColumnName)); + column.PermissionsColumn(columnDefinition.ColumnName)); return column; } - public static TenantsJoinCollection TenantsJoinDefault() + public static PermissionsJoinCollection PermissionsJoinDefault() { - var join = TenantsJoin(); + var join = PermissionsJoin(); + join.Add(new SqlJoin( + tableBracket: "\"Depts\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Permissions\".\"DeptId\"=\"Depts\".\"DeptId\"")); + join.Add(new SqlJoin( + tableBracket: "\"Groups\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Permissions\".\"GroupId\"=\"Groups\".\"GroupId\"")); + join.Add(new SqlJoin( + tableBracket: "\"Users\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Permissions\".\"UserId\"=\"Users\".\"UserId\"")); return join; } - public static TenantsWhereCollection TenantsWhereDefault( - Context context, TenantModel tenantModel) + public static PermissionsWhereCollection PermissionsWhereDefault( + Context context, PermissionModel permissionModel) { - return TenantsWhere() - .TenantId(tenantModel.TenantId); + return PermissionsWhere() + .ReferenceId(permissionModel.ReferenceId); } - public static TenantsParamCollection TenantsParamDefault( + public static PermissionsParamCollection PermissionsParamDefault( Context context, SiteSettings ss, - TenantModel tenantModel, + PermissionModel permissionModel, bool setDefault = false, bool otherInitValue = false) { - var param = TenantsParam() - .Ver(tenantModel.Ver, _using: tenantModel.Ver_Updated(context) || setDefault || (otherInitValue && !tenantModel.Ver.InitialValue(context))) - .TenantName(tenantModel.TenantName.MaxLength(1024), _using: tenantModel.TenantName_Updated(context) || setDefault || (otherInitValue && !tenantModel.TenantName.InitialValue(context))) - .Title(tenantModel.Title.Value.MaxLength(1024), _using: tenantModel.Title_Updated(context) || (otherInitValue && !tenantModel.Title.InitialValue(context))) - .Body(tenantModel.Body, _using: tenantModel.Body_Updated(context) || (otherInitValue && !tenantModel.Body.InitialValue(context))) - .ContractSettings(tenantModel.ContractSettings?.RecordingJson(), _using: tenantModel.ContractSettings_Updated(context) || (otherInitValue && !tenantModel.ContractSettings.InitialValue(context))) - .ContractDeadline(tenantModel.ContractDeadline, _using: tenantModel.ContractDeadline_Updated(context) || (otherInitValue && !tenantModel.ContractDeadline.InitialValue(context))) - .DisableAllUsersPermission(tenantModel.DisableAllUsersPermission, _using: tenantModel.DisableAllUsersPermission_Updated(context) || (otherInitValue && !tenantModel.DisableAllUsersPermission.InitialValue(context))) - .DisableApi(tenantModel.DisableApi, _using: tenantModel.DisableApi_Updated(context) || (otherInitValue && !tenantModel.DisableApi.InitialValue(context))) - .DisableStartGuide(tenantModel.DisableStartGuide, _using: tenantModel.DisableStartGuide_Updated(context) || (otherInitValue && !tenantModel.DisableStartGuide.InitialValue(context))) - .LogoType(tenantModel.LogoType.ToInt(), _using: tenantModel.LogoType_Updated(context) || setDefault || (otherInitValue && !tenantModel.LogoType.InitialValue(context))) - .HtmlTitleTop(tenantModel.HtmlTitleTop.MaxLength(1024), _using: tenantModel.HtmlTitleTop_Updated(context) || setDefault || (otherInitValue && !tenantModel.HtmlTitleTop.InitialValue(context))) - .HtmlTitleSite(tenantModel.HtmlTitleSite.MaxLength(1024), _using: tenantModel.HtmlTitleSite_Updated(context) || setDefault || (otherInitValue && !tenantModel.HtmlTitleSite.InitialValue(context))) - .HtmlTitleRecord(tenantModel.HtmlTitleRecord.MaxLength(1024), _using: tenantModel.HtmlTitleRecord_Updated(context) || setDefault || (otherInitValue && !tenantModel.HtmlTitleRecord.InitialValue(context))) - .TopStyle(tenantModel.TopStyle, _using: tenantModel.TopStyle_Updated(context) || (otherInitValue && !tenantModel.TopStyle.InitialValue(context))) - .TopScript(tenantModel.TopScript, _using: tenantModel.TopScript_Updated(context) || (otherInitValue && !tenantModel.TopScript.InitialValue(context))) - .Comments(tenantModel.Comments.ToJson(), _using: tenantModel.Comments_Updated(context) || (otherInitValue && !tenantModel.Comments.InitialValue(context))); - tenantModel.ClassHash + var param = PermissionsParam() + .ReferenceId(permissionModel.ReferenceId, _using: permissionModel.ReferenceId_Updated(context) || setDefault || (otherInitValue && !permissionModel.ReferenceId.InitialValue(context))) + .DeptId(permissionModel.DeptId, _using: permissionModel.DeptId_Updated(context) || setDefault || (otherInitValue && !permissionModel.DeptId.InitialValue(context))) + .GroupId(permissionModel.GroupId, _using: permissionModel.GroupId_Updated(context) || setDefault || (otherInitValue && !permissionModel.GroupId.InitialValue(context))) + .UserId(permissionModel.UserId, _using: permissionModel.UserId_Updated(context) || setDefault || (otherInitValue && !permissionModel.UserId.InitialValue(context))) + .Ver(permissionModel.Ver, _using: permissionModel.Ver_Updated(context) || setDefault || (otherInitValue && !permissionModel.Ver.InitialValue(context))) + .PermissionType(permissionModel.PermissionType.ToLong(), _using: permissionModel.PermissionType_Updated(context) || setDefault || (otherInitValue && !permissionModel.PermissionType.InitialValue(context))) + .Comments(permissionModel.Comments.ToJson(), _using: permissionModel.Comments_Updated(context) || (otherInitValue && !permissionModel.Comments.InitialValue(context))); + permissionModel.ClassHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Class") - .Where(o => tenantModel.Class_Updated(columnName: o.Key) - || (otherInitValue && !tenantModel.GetClass(columnName: o.Key) + .Where(o => permissionModel.Class_Updated(columnName: o.Key) + || (otherInitValue && !permissionModel.GetClass(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value.MaxLength(1024))); - tenantModel.NumHash + permissionModel.NumHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Num") - .Where(o => tenantModel.Num_Updated( + .Where(o => permissionModel.Num_Updated( columnName: o.Key, column: ss?.GetColumn( context: context, columnName: o.Key), paramDefault: true) - || (otherInitValue && !tenantModel.GetNum(columnName: o.Key) + || (otherInitValue && !permissionModel.GetNum(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => { @@ -121582,40 +125604,40 @@ public static TenantsParamCollection TenantsParamDefault( raw: "null"); } }); - tenantModel.DateHash + permissionModel.DateHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Date") - .Where(o => tenantModel.Date_Updated(columnName: o.Key) - || (otherInitValue && !tenantModel.GetDate(columnName: o.Key) + .Where(o => permissionModel.Date_Updated(columnName: o.Key) + || (otherInitValue && !permissionModel.GetDate(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value)); - tenantModel.DescriptionHash + permissionModel.DescriptionHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Description") - .Where(o => tenantModel.Description_Updated(columnName: o.Key) - || (otherInitValue && !tenantModel.GetDescription(columnName: o.Key) + .Where(o => permissionModel.Description_Updated(columnName: o.Key) + || (otherInitValue && !permissionModel.GetDescription(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value ?? string.Empty)); - tenantModel.CheckHash + permissionModel.CheckHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Check") - .Where(o => tenantModel.Check_Updated(columnName: o.Key) - || (otherInitValue && !tenantModel.GetCheck(columnName: o.Key) + .Where(o => permissionModel.Check_Updated(columnName: o.Key) + || (otherInitValue && !permissionModel.GetCheck(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value)); - tenantModel.AttachmentsHash + permissionModel.AttachmentsHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Attachments") - .Where(o => tenantModel.Attachments_Updated(columnName: o.Key) - || (otherInitValue && !tenantModel.GetAttachments(columnName: o.Key) + .Where(o => permissionModel.Attachments_Updated(columnName: o.Key) + || (otherInitValue && !permissionModel.GetAttachments(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( @@ -121625,159 +125647,100 @@ public static TenantsParamCollection TenantsParamDefault( return param; } - public static UsersColumnCollection UsersDefaultColumns() + public static DashboardsColumnCollection DashboardsDefaultColumns() { var targets = Def.ColumnDefinitionCollection - .Where(columnDefinition => columnDefinition.TableName == "Users") + .Where(columnDefinition => columnDefinition.TableName == "Dashboards") .Where(columnDefinition => !columnDefinition.LowSchemaVersion()) .Select(columnDefinition => columnDefinition.ColumnName) .ToList(); - var column = UsersColumn() - .TenantId(_using: targets.Contains("TenantId")) - .UserId(_using: targets.Contains("UserId")) + var column = DashboardsColumn() + .SiteId(_using: targets.Contains("SiteId")) + .UpdatedTime(_using: targets.Contains("UpdatedTime")) + .DashboardId(_using: targets.Contains("DashboardId")) .Ver(_using: targets.Contains("Ver")) - .LoginId(_using: targets.Contains("LoginId")) - .GlobalId(_using: targets.Contains("GlobalId")) - .Name(_using: targets.Contains("Name")) - .UserCode(_using: targets.Contains("UserCode")) - .Password(_using: targets.Contains("Password")) - .LastName(_using: targets.Contains("LastName")) - .FirstName(_using: targets.Contains("FirstName")) - .Birthday(_using: targets.Contains("Birthday")) - .Gender(_using: targets.Contains("Gender")) - .Language(_using: targets.Contains("Language")) - .TimeZone(_using: targets.Contains("TimeZone")) - .TimeZoneInfo(_using: targets.Contains("TimeZoneInfo")) - .DeptCode(_using: targets.Contains("DeptCode")) - .DeptId(_using: targets.Contains("DeptId")) - .Dept(_using: targets.Contains("Dept")) - .Theme(_using: targets.Contains("Theme")) - .FirstAndLastNameOrder(_using: targets.Contains("FirstAndLastNameOrder")) + .Title(_using: targets.Contains("Title")) .Body(_using: targets.Contains("Body")) - .LastLoginTime(_using: targets.Contains("LastLoginTime")) - .PasswordExpirationTime(_using: targets.Contains("PasswordExpirationTime")) - .PasswordChangeTime(_using: targets.Contains("PasswordChangeTime")) - .NumberOfLogins(_using: targets.Contains("NumberOfLogins")) - .NumberOfDenial(_using: targets.Contains("NumberOfDenial")) - .TenantManager(_using: targets.Contains("TenantManager")) - .ServiceManager(_using: targets.Contains("ServiceManager")) - .AllowCreationAtTopSite(_using: targets.Contains("AllowCreationAtTopSite")) - .AllowGroupAdministration(_using: targets.Contains("AllowGroupAdministration")) - .AllowGroupCreation(_using: targets.Contains("AllowGroupCreation")) - .AllowApi(_using: targets.Contains("AllowApi")) - .EnableSecondaryAuthentication(_using: targets.Contains("EnableSecondaryAuthentication")) - .DisableSecondaryAuthentication(_using: targets.Contains("DisableSecondaryAuthentication")) - .Disabled(_using: targets.Contains("Disabled")) - .Lockout(_using: targets.Contains("Lockout")) - .LockoutCounter(_using: targets.Contains("LockoutCounter")) - .Developer(_using: targets.Contains("Developer")) - .UserSettings(_using: targets.Contains("UserSettings")) - .ApiKey(_using: targets.Contains("ApiKey")) - .PasswordHistries(_using: targets.Contains("PasswordHistries")) - .SecondaryAuthenticationCode(_using: targets.Contains("SecondaryAuthenticationCode")) - .SecondaryAuthenticationCodeExpirationTime(_using: targets.Contains("SecondaryAuthenticationCodeExpirationTime")) - .LdapSearchRoot(_using: targets.Contains("LdapSearchRoot")) - .SynchronizedTime(_using: targets.Contains("SynchronizedTime")) + .TitleBody(_using: targets.Contains("TitleBody")) + .Locked(_using: targets.Contains("Locked")) .Comments(_using: targets.Contains("Comments")) .Creator(_using: targets.Contains("Creator")) .Updator(_using: targets.Contains("Updator")) - .CreatedTime(_using: targets.Contains("CreatedTime")) - .UpdatedTime(_using: targets.Contains("UpdatedTime")); + .CreatedTime(_using: targets.Contains("CreatedTime")); Def.ColumnDefinitionCollection - .Where(columnDefinition => columnDefinition.TableName == "Users") + .Where(columnDefinition => columnDefinition.TableName == "Dashboards") .Where(columnDefinition => !columnDefinition.ExtendedColumnType.IsNullOrEmpty()) .ForEach(columnDefinition => - column.UsersColumn(columnDefinition.ColumnName)); + column.DashboardsColumn(columnDefinition.ColumnName)); return column; } - public static UsersJoinCollection UsersJoinDefault() + public static DashboardsColumnCollection DashboardsEditorColumns(SiteSettings ss) { - var join = UsersJoin(); - join.Add(new SqlJoin( - tableBracket: "\"Depts\"", - joinType: SqlJoin.JoinTypes.LeftOuter, - joinExpression: "\"Users\".\"DeptId\"=\"Depts\".\"DeptId\"")); + if (ss != null) + { + var ret = DashboardsColumn() + .SiteId() + .DashboardId() + .Comments(); + ss.SelectColumns()? + .ForEach(column => ret.DashboardsColumn(column.ColumnName)); + return ret; + } + else + { + return DashboardsDefaultColumns(); + } + } + + public static DashboardsJoinCollection DashboardsJoinDefault() + { + var join = DashboardsJoin(); return join; } - public static UsersWhereCollection UsersWhereDefault( - Context context, UserModel userModel) + public static DashboardsWhereCollection DashboardsWhereDefault( + Context context, DashboardModel dashboardModel) { - return UsersWhere() - .TenantId(userModel.TenantId) - .UserId(userModel.UserId); + return DashboardsWhere() + .SiteId(dashboardModel.SiteId) + .DashboardId(dashboardModel.DashboardId); } - public static UsersParamCollection UsersParamDefault( + public static DashboardsParamCollection DashboardsParamDefault( Context context, SiteSettings ss, - UserModel userModel, + DashboardModel dashboardModel, bool setDefault = false, bool otherInitValue = false) { - var param = UsersParam() - .TenantId(userModel.TenantId) - .Ver(userModel.Ver, _using: userModel.Ver_Updated(context) || setDefault || (otherInitValue && !userModel.Ver.InitialValue(context))) - .LoginId(userModel.LoginId.MaxLength(256), _using: userModel.LoginId_Updated(context) || setDefault || (otherInitValue && !userModel.LoginId.InitialValue(context))) - .GlobalId(userModel.GlobalId.MaxLength(36), _using: userModel.GlobalId_Updated(context) || (otherInitValue && !userModel.GlobalId.InitialValue(context))) - .Name(userModel.Name.MaxLength(128), _using: userModel.Name_Updated(context) || (otherInitValue && !userModel.Name.InitialValue(context))) - .UserCode(userModel.UserCode.MaxLength(32), _using: userModel.UserCode_Updated(context) || (otherInitValue && !userModel.UserCode.InitialValue(context))) - .Password(userModel.Password.MaxLength(128), _using: userModel.Password_Updated(context) || (otherInitValue && !userModel.Password.InitialValue(context))) - .LastName(userModel.LastName.MaxLength(32), _using: userModel.LastName_Updated(context) || (otherInitValue && !userModel.LastName.InitialValue(context))) - .FirstName(userModel.FirstName.MaxLength(32), _using: userModel.FirstName_Updated(context) || (otherInitValue && !userModel.FirstName.InitialValue(context))) - .Birthday(userModel.Birthday.Value, _using: userModel.Birthday_Updated(context) || (otherInitValue && !userModel.Birthday.InitialValue(context))) - .Gender(userModel.Gender.MaxLength(2), _using: userModel.Gender_Updated(context) || (otherInitValue && !userModel.Gender.InitialValue(context))) - .Language(userModel.Language.MaxLength(32), _using: userModel.Language_Updated(context) || setDefault || (otherInitValue && !userModel.Language.InitialValue(context))) - .TimeZone(userModel.TimeZone.MaxLength(32), _using: userModel.TimeZone_Updated(context) || (otherInitValue && !userModel.TimeZone.InitialValue(context))) - .DeptId(userModel.DeptId, _using: userModel.DeptId_Updated(context) || setDefault || (otherInitValue && !userModel.DeptId.InitialValue(context))) - .Theme(userModel.Theme.MaxLength(32), _using: userModel.Theme_Updated(context) || (otherInitValue && !userModel.Theme.InitialValue(context))) - .FirstAndLastNameOrder(userModel.FirstAndLastNameOrder.ToInt(), _using: userModel.FirstAndLastNameOrder_Updated(context) || setDefault || (otherInitValue && !userModel.FirstAndLastNameOrder.InitialValue(context))) - .Body(userModel.Body, _using: userModel.Body_Updated(context) || (otherInitValue && !userModel.Body.InitialValue(context))) - .LastLoginTime(userModel.LastLoginTime.Value, _using: userModel.LastLoginTime_Updated(context) || (otherInitValue && !userModel.LastLoginTime.InitialValue(context))) - .PasswordExpirationTime(userModel.PasswordExpirationTime.Value, _using: userModel.PasswordExpirationTime_Updated(context) || (otherInitValue && !userModel.PasswordExpirationTime.InitialValue(context))) - .PasswordChangeTime(userModel.PasswordChangeTime.Value, _using: userModel.PasswordChangeTime_Updated(context) || (otherInitValue && !userModel.PasswordChangeTime.InitialValue(context))) - .NumberOfLogins(userModel.NumberOfLogins, _using: userModel.NumberOfLogins_Updated(context) || (otherInitValue && !userModel.NumberOfLogins.InitialValue(context))) - .NumberOfDenial(userModel.NumberOfDenial, _using: userModel.NumberOfDenial_Updated(context) || (otherInitValue && !userModel.NumberOfDenial.InitialValue(context))) - .TenantManager(userModel.TenantManager, _using: userModel.TenantManager_Updated(context) || setDefault || (otherInitValue && !userModel.TenantManager.InitialValue(context))) - .ServiceManager(userModel.ServiceManager, _using: userModel.ServiceManager_Updated(context) || setDefault || (otherInitValue && !userModel.ServiceManager.InitialValue(context))) - .AllowCreationAtTopSite(userModel.AllowCreationAtTopSite, _using: userModel.AllowCreationAtTopSite_Updated(context) || setDefault || (otherInitValue && !userModel.AllowCreationAtTopSite.InitialValue(context))) - .AllowGroupAdministration(userModel.AllowGroupAdministration, _using: userModel.AllowGroupAdministration_Updated(context) || setDefault || (otherInitValue && !userModel.AllowGroupAdministration.InitialValue(context))) - .AllowGroupCreation(userModel.AllowGroupCreation, _using: userModel.AllowGroupCreation_Updated(context) || setDefault || (otherInitValue && !userModel.AllowGroupCreation.InitialValue(context))) - .AllowApi(userModel.AllowApi, _using: userModel.AllowApi_Updated(context) || setDefault || (otherInitValue && !userModel.AllowApi.InitialValue(context))) - .EnableSecondaryAuthentication(userModel.EnableSecondaryAuthentication, _using: userModel.EnableSecondaryAuthentication_Updated(context) || setDefault || (otherInitValue && !userModel.EnableSecondaryAuthentication.InitialValue(context))) - .DisableSecondaryAuthentication(userModel.DisableSecondaryAuthentication, _using: userModel.DisableSecondaryAuthentication_Updated(context) || setDefault || (otherInitValue && !userModel.DisableSecondaryAuthentication.InitialValue(context))) - .Disabled(userModel.Disabled, _using: userModel.Disabled_Updated(context) || setDefault || (otherInitValue && !userModel.Disabled.InitialValue(context))) - .Lockout(userModel.Lockout, _using: userModel.Lockout_Updated(context) || setDefault || (otherInitValue && !userModel.Lockout.InitialValue(context))) - .LockoutCounter(userModel.LockoutCounter, _using: userModel.LockoutCounter_Updated(context) || setDefault || (otherInitValue && !userModel.LockoutCounter.InitialValue(context))) - .Developer(userModel.Developer, _using: userModel.Developer_Updated(context) || setDefault || (otherInitValue && !userModel.Developer.InitialValue(context))) - .UserSettings(userModel.UserSettings.RecordingJson(), _using: userModel.UserSettings_Updated(context) || (otherInitValue && !userModel.UserSettings.InitialValue(context))) - .ApiKey(userModel.ApiKey.MaxLength(128), _using: userModel.ApiKey_Updated(context) || (otherInitValue && !userModel.ApiKey.InitialValue(context))) - .PasswordHistries(userModel.PasswordHistries.ToJson(), _using: userModel.PasswordHistries_Updated(context) || (otherInitValue && !userModel.PasswordHistries.InitialValue(context))) - .SecondaryAuthenticationCode(userModel.SecondaryAuthenticationCode.MaxLength(128), _using: userModel.SecondaryAuthenticationCode_Updated(context) || (otherInitValue && !userModel.SecondaryAuthenticationCode.InitialValue(context))) - .SecondaryAuthenticationCodeExpirationTime(userModel.SecondaryAuthenticationCodeExpirationTime.Value, _using: userModel.SecondaryAuthenticationCodeExpirationTime_Updated(context) || (otherInitValue && !userModel.SecondaryAuthenticationCodeExpirationTime.InitialValue(context))) - .LdapSearchRoot(userModel.LdapSearchRoot.MaxLength(2048), _using: userModel.LdapSearchRoot_Updated(context) || (otherInitValue && !userModel.LdapSearchRoot.InitialValue(context))) - .SynchronizedTime(userModel.SynchronizedTime, _using: userModel.SynchronizedTime_Updated(context) || (otherInitValue && !userModel.SynchronizedTime.InitialValue(context))) - .Comments(userModel.Comments.ToJson(), _using: userModel.Comments_Updated(context) || (otherInitValue && !userModel.Comments.InitialValue(context))); - userModel.ClassHash + var param = DashboardsParam() + .ItemId(dashboardModel.DashboardId) + .SiteId(dashboardModel.SiteId, _using: dashboardModel.SiteId_Updated(context) || setDefault || (otherInitValue && !dashboardModel.SiteId.InitialValue(context))) + .Ver(dashboardModel.Ver, _using: dashboardModel.Ver_Updated(context) || setDefault || (otherInitValue && !dashboardModel.Ver.InitialValue(context))) + .Title(dashboardModel.Title.Value.MaxLength(1024), _using: dashboardModel.Title_Updated(context) || setDefault || (otherInitValue && !dashboardModel.Title.InitialValue(context))) + .Body(dashboardModel.Body, _using: dashboardModel.Body_Updated(context) || (otherInitValue && !dashboardModel.Body.InitialValue(context))) + .Locked(dashboardModel.Locked, _using: dashboardModel.Locked_Updated(context) || (otherInitValue && !dashboardModel.Locked.InitialValue(context))) + .Comments(dashboardModel.Comments.ToJson(), _using: dashboardModel.Comments_Updated(context) || (otherInitValue && !dashboardModel.Comments.InitialValue(context))); + dashboardModel.ClassHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Class") - .Where(o => userModel.Class_Updated(columnName: o.Key) - || (otherInitValue && !userModel.GetClass(columnName: o.Key) + .Where(o => dashboardModel.Class_Updated(columnName: o.Key) + || (otherInitValue && !dashboardModel.GetClass(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value.MaxLength(1024))); - userModel.NumHash + dashboardModel.NumHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Num") - .Where(o => userModel.Num_Updated( + .Where(o => dashboardModel.Num_Updated( columnName: o.Key, column: ss?.GetColumn( context: context, columnName: o.Key), paramDefault: true) - || (otherInitValue && !userModel.GetNum(columnName: o.Key) + || (otherInitValue && !dashboardModel.GetNum(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => { @@ -121796,40 +125759,40 @@ public static UsersParamCollection UsersParamDefault( raw: "null"); } }); - userModel.DateHash + dashboardModel.DateHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Date") - .Where(o => userModel.Date_Updated(columnName: o.Key) - || (otherInitValue && !userModel.GetDate(columnName: o.Key) + .Where(o => dashboardModel.Date_Updated(columnName: o.Key) + || (otherInitValue && !dashboardModel.GetDate(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value)); - userModel.DescriptionHash + dashboardModel.DescriptionHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Description") - .Where(o => userModel.Description_Updated(columnName: o.Key) - || (otherInitValue && !userModel.GetDescription(columnName: o.Key) + .Where(o => dashboardModel.Description_Updated(columnName: o.Key) + || (otherInitValue && !dashboardModel.GetDescription(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value ?? string.Empty)); - userModel.CheckHash + dashboardModel.CheckHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Check") - .Where(o => userModel.Check_Updated(columnName: o.Key) - || (otherInitValue && !userModel.GetCheck(columnName: o.Key) + .Where(o => dashboardModel.Check_Updated(columnName: o.Key) + || (otherInitValue && !dashboardModel.GetCheck(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( columnBracket: $"\"{o.Key}\"", name: o.Key, value: o.Value)); - userModel.AttachmentsHash + dashboardModel.AttachmentsHash .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Attachments") - .Where(o => userModel.Attachments_Updated(columnName: o.Key) - || (otherInitValue && !userModel.GetAttachments(columnName: o.Key) + .Where(o => dashboardModel.Attachments_Updated(columnName: o.Key) + || (otherInitValue && !dashboardModel.GetAttachments(columnName: o.Key) .InitialValue(context: context))) .ForEach(o => param.Add( @@ -121859,156 +125822,6 @@ public static UsersParamCollection UsersParamDefault( return param; } - public static PermissionsColumnCollection PermissionsDefaultColumns() - { - var targets = Def.ColumnDefinitionCollection - .Where(columnDefinition => columnDefinition.TableName == "Permissions") - .Where(columnDefinition => !columnDefinition.LowSchemaVersion()) - .Select(columnDefinition => columnDefinition.ColumnName) - .ToList(); - var column = PermissionsColumn() - .ReferenceId(_using: targets.Contains("ReferenceId")) - .DeptId(_using: targets.Contains("DeptId")) - .GroupId(_using: targets.Contains("GroupId")) - .UserId(_using: targets.Contains("UserId")) - .Ver(_using: targets.Contains("Ver")) - .DeptName(_using: targets.Contains("DeptName")) - .GroupName(_using: targets.Contains("GroupName")) - .Name(_using: targets.Contains("Name")) - .PermissionType(_using: targets.Contains("PermissionType")) - .Comments(_using: targets.Contains("Comments")) - .Creator(_using: targets.Contains("Creator")) - .Updator(_using: targets.Contains("Updator")) - .CreatedTime(_using: targets.Contains("CreatedTime")) - .UpdatedTime(_using: targets.Contains("UpdatedTime")); - Def.ColumnDefinitionCollection - .Where(columnDefinition => columnDefinition.TableName == "Permissions") - .Where(columnDefinition => !columnDefinition.ExtendedColumnType.IsNullOrEmpty()) - .ForEach(columnDefinition => - column.PermissionsColumn(columnDefinition.ColumnName)); - return column; - } - - public static PermissionsJoinCollection PermissionsJoinDefault() - { - var join = PermissionsJoin(); - join.Add(new SqlJoin( - tableBracket: "\"Depts\"", - joinType: SqlJoin.JoinTypes.LeftOuter, - joinExpression: "\"Permissions\".\"DeptId\"=\"Depts\".\"DeptId\"")); - join.Add(new SqlJoin( - tableBracket: "\"Groups\"", - joinType: SqlJoin.JoinTypes.LeftOuter, - joinExpression: "\"Permissions\".\"GroupId\"=\"Groups\".\"GroupId\"")); - join.Add(new SqlJoin( - tableBracket: "\"Users\"", - joinType: SqlJoin.JoinTypes.LeftOuter, - joinExpression: "\"Permissions\".\"UserId\"=\"Users\".\"UserId\"")); - return join; - } - - public static PermissionsWhereCollection PermissionsWhereDefault( - Context context, PermissionModel permissionModel) - { - return PermissionsWhere() - .ReferenceId(permissionModel.ReferenceId); - } - - public static PermissionsParamCollection PermissionsParamDefault( - Context context, - SiteSettings ss, - PermissionModel permissionModel, - bool setDefault = false, - bool otherInitValue = false) - { - var param = PermissionsParam() - .ReferenceId(permissionModel.ReferenceId, _using: permissionModel.ReferenceId_Updated(context) || setDefault || (otherInitValue && !permissionModel.ReferenceId.InitialValue(context))) - .DeptId(permissionModel.DeptId, _using: permissionModel.DeptId_Updated(context) || setDefault || (otherInitValue && !permissionModel.DeptId.InitialValue(context))) - .GroupId(permissionModel.GroupId, _using: permissionModel.GroupId_Updated(context) || setDefault || (otherInitValue && !permissionModel.GroupId.InitialValue(context))) - .UserId(permissionModel.UserId, _using: permissionModel.UserId_Updated(context) || setDefault || (otherInitValue && !permissionModel.UserId.InitialValue(context))) - .Ver(permissionModel.Ver, _using: permissionModel.Ver_Updated(context) || setDefault || (otherInitValue && !permissionModel.Ver.InitialValue(context))) - .PermissionType(permissionModel.PermissionType.ToLong(), _using: permissionModel.PermissionType_Updated(context) || setDefault || (otherInitValue && !permissionModel.PermissionType.InitialValue(context))) - .Comments(permissionModel.Comments.ToJson(), _using: permissionModel.Comments_Updated(context) || (otherInitValue && !permissionModel.Comments.InitialValue(context))); - permissionModel.ClassHash - .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Class") - .Where(o => permissionModel.Class_Updated(columnName: o.Key) - || (otherInitValue && !permissionModel.GetClass(columnName: o.Key) - .InitialValue(context: context))) - .ForEach(o => - param.Add( - columnBracket: $"\"{o.Key}\"", - name: o.Key, - value: o.Value.MaxLength(1024))); - permissionModel.NumHash - .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Num") - .Where(o => permissionModel.Num_Updated( - columnName: o.Key, - column: ss?.GetColumn( - context: context, - columnName: o.Key), - paramDefault: true) - || (otherInitValue && !permissionModel.GetNum(columnName: o.Key) - .InitialValue(context: context))) - .ForEach(o => - { - if (o.Value?.Value != null) - { - param.Add( - columnBracket: $"\"{o.Key}\"", - name: o.Key, - value: o.Value.Value); - } - else - { - param.Add( - columnBracket: $"\"{o.Key}\"", - name: o.Key, - raw: "null"); - } - }); - permissionModel.DateHash - .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Date") - .Where(o => permissionModel.Date_Updated(columnName: o.Key) - || (otherInitValue && !permissionModel.GetDate(columnName: o.Key) - .InitialValue(context: context))) - .ForEach(o => - param.Add( - columnBracket: $"\"{o.Key}\"", - name: o.Key, - value: o.Value)); - permissionModel.DescriptionHash - .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Description") - .Where(o => permissionModel.Description_Updated(columnName: o.Key) - || (otherInitValue && !permissionModel.GetDescription(columnName: o.Key) - .InitialValue(context: context))) - .ForEach(o => - param.Add( - columnBracket: $"\"{o.Key}\"", - name: o.Key, - value: o.Value ?? string.Empty)); - permissionModel.CheckHash - .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Check") - .Where(o => permissionModel.Check_Updated(columnName: o.Key) - || (otherInitValue && !permissionModel.GetCheck(columnName: o.Key) - .InitialValue(context: context))) - .ForEach(o => - param.Add( - columnBracket: $"\"{o.Key}\"", - name: o.Key, - value: o.Value)); - permissionModel.AttachmentsHash - .Where(o => Def.ExtendedColumnTypes.Get(o.Key) == "Attachments") - .Where(o => permissionModel.Attachments_Updated(columnName: o.Key) - || (otherInitValue && !permissionModel.GetAttachments(columnName: o.Key) - .InitialValue(context: context))) - .ForEach(o => - param.Add( - columnBracket: $"\"{o.Key}\"", - name: o.Key, - value: o.Value?.RecordingJson() ?? string.Empty)); - return param; - } - public static IssuesColumnCollection IssuesDefaultColumns() { var targets = Def.ColumnDefinitionCollection @@ -122557,6 +126370,16 @@ public static WikisParamCollection WikisParamDefault( return param; } + public static DashboardsColumnCollection DashboardsTitleColumn(Context context, SiteSettings ss) + { + var column = DashboardsColumn(); + ss.GetTitleColumns(context: context) + .Select(o => o.ColumnName) + .ForEach(columnName => + column.DashboardsColumn(columnName: columnName)); + return column; + } + public static IssuesColumnCollection IssuesTitleColumn(Context context, SiteSettings ss) { var column = IssuesColumn(); diff --git a/Implem.Pleasanter/Libraries/DataSources/Saml.cs b/Implem.Pleasanter/Libraries/DataSources/Saml.cs index 6262d2d37..6a2d060ed 100644 --- a/Implem.Pleasanter/Libraries/DataSources/Saml.cs +++ b/Implem.Pleasanter/Libraries/DataSources/Saml.cs @@ -37,7 +37,7 @@ public static SamlAttributes MapAttributes(IEnumerable claims, string nam { attributes.Add("MailAddress", nameId); } - else if (attributeMailAddress.EndsWith("|{NameId}")) + else if (attributeMailAddress?.EndsWith("|{NameId}") == true) { var attributeName = attributeMailAddress.Split_1st('|'); var claimMailAddress = claims.FirstOrDefault(claim => claim.Type == attributeName); @@ -667,7 +667,9 @@ public static (string redirectResultUrl, string html) SamlLogin(Context context, return (Responses.Locations.UserLockout(context: context), null); } var redirectResultUrl = Strings.CoalesceEmpty( - user.GetReturnUrl(returnUrl: returnUrl), + user.GetReturnUrl( + context: context, + returnUrl: returnUrl), Responses.Locations.Top(context: context)); user.Allow( context: context, diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlBreadcrumb.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlBreadcrumb.cs index de741fccf..17d1df85b 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlBreadcrumb.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlBreadcrumb.cs @@ -35,26 +35,9 @@ public static HtmlBuilder Breadcrumb( controller: context.Controller, display: Displays.Depts(context: context)); case "tenants": - return Permissions.CanManageTenant(context: context) - ? Breadcrumb( - hb: hb, - context: context, - ss: ss, - controller: context.Controller, - display: Displays.Tenants(context: context), - action: "Edit") - : (context.UserSettings?.EnableManageTenant == true) - ? BreadcrumbWithoutAdmins( - hb: hb, - context: context, - ss: ss, - controller: context.Controller, - display: Displays.Tenants(context: context), - action: "Edit") - : Breadcrumb( - hb: hb, - context: context, - ss: ss); + return hb.TenantsBreadcrumb( + context: context, + ss: ss); case "groups": return Permissions.CanManageTenant(context: context) ? Breadcrumb( @@ -135,6 +118,33 @@ public static HtmlBuilder Breadcrumb( } } + public static HtmlBuilder TenantsBreadcrumb( + this HtmlBuilder hb, + Context context, + SiteSettings ss) + { + return Permissions.CanManageTenant(context: context) + ? Breadcrumb( + hb: hb, + context: context, + ss: ss, + controller: context.Controller, + display: Displays.Tenants(context: context), + action: "Edit") + : (context.UserSettings?.EnableManageTenant == true) + ? BreadcrumbWithoutAdmins( + hb: hb, + context: context, + ss: ss, + controller: context.Controller, + display: Displays.Tenants(context: context), + action: "Edit") + : Breadcrumb( + hb: hb, + context: context, + ss: ss); + } + private static HtmlBuilder Breadcrumb( HtmlBuilder hb, Context context, diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlCommands.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlCommands.cs index 6c149c12c..c5cf73e0f 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlCommands.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlCommands.cs @@ -264,6 +264,22 @@ public static HtmlBuilder MainCommands( } break; case "items": + if (ss.ReferenceType == "Dashboards" + && context.Action == "index") + { + hb + .Button( + controlId: "UpdateDashboardPartLayouts", + text: Displays.SaveLayout(context: context), + controlCss: "button-icon", + accessKey: "s", + icon: "ui-icon-disk", + onClick: "$p.updateDashboardPartLayouts();", + action: "Update", + method: "put", + _using: context.CanUpdate(ss: ss)); + break; + } hb.Common( context: context, ss: ss, diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlGrids.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlGrids.cs index 9c68cbad5..5b834b673 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlGrids.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlGrids.cs @@ -265,6 +265,7 @@ public static HtmlBuilder Tr( var sites = new Dictionary(); var sysLogs = new Dictionary(); var users = new Dictionary(); + var dashboards = new Dictionary(); var issues = new Dictionary(); var results = new Dictionary(); switch (ss.ReferenceType) @@ -469,6 +470,28 @@ public static HtmlBuilder Tr( column: column, userModel: userModel); break; + case "Dashboards": + var dashboardModel = dashboards.Get(key); + if (dashboardModel == null) + { + dashboardModel = new DashboardModel( + context: context, + ss: column.SiteSettings, + dataRow: dataRow, + formData: editRow + ? formDataSet?.FirstOrDefault(o => + o.Id == dataRow.Long("DashboardId"))?.Data + : null, + tableAlias: column.TableAlias); + dashboards.Add(key, dashboardModel); + ss.ClearColumnAccessControlCaches(baseModel: dashboardModel); + } + hb.TdValue( + context: context, + ss: column.SiteSettings, + column: column, + dashboardModel: dashboardModel); + break; case "Issues": var issueModel = issues.Get(key); if (issueModel == null) diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlNavigationMenu.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlNavigationMenu.cs index 5a563fde5..43989c8cc 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlNavigationMenu.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlNavigationMenu.cs @@ -363,7 +363,8 @@ private static bool Using( ? canCreateGroups : context.CanCreate(ss: ss, site: true) && ss.ReferenceType != "Wikis" - && context.Action != "trashbox"; + && context.Action != "trashbox" + && ss.ReferenceType != "Dashboards"; case "ViewModeMenu": return Def.ViewModeDefinitionCollection .Any(o => o.ReferenceType == referenceType); @@ -568,6 +569,8 @@ private static string SiteSettingsDisplayName(Context context, SiteSettings ss) return Displays.ManageTable(context: context); case "Wikis": return Displays.ManageWiki(context: context); + case "Dashboards": + return Displays.ManageDashboard(context: context); default: return null; } diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlRecordInfo.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlRecordInfo.cs index 9875c6abd..14d6deec5 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlRecordInfo.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlRecordInfo.cs @@ -30,6 +30,30 @@ public static HtmlBuilder RecordInfo( time: baseModel.UpdatedTime); } + public static HtmlBuilder UpdatedInfo( + this HtmlBuilder hb, + Context context, + Time updatedTime) + { + return hb + .Text(text: Displays.Update(context: context)) + .ElapsedTime( + context: context, + value: updatedTime.DisplayValue); + } + + public static HtmlBuilder CreatedInfo( + this HtmlBuilder hb, + Context context, + Time createdTime) + { + return hb + .Text(text: Displays.Create(context: context)) + .ElapsedTime( + context: context, + value: createdTime.DisplayValue); + } + private static HtmlBuilder RecordedTime( this HtmlBuilder hb, Context context, diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlScripts.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlScripts.cs index 029a88763..f43802036 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlScripts.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlScripts.cs @@ -77,6 +77,9 @@ public static HtmlBuilder Scripts( .Script(src: Responses.Locations.Get( context: context, parts: "Scripts/Plugins/moment.min.js")) + .Script(src: Responses.Locations.Get( + context: context, + parts: "Scripts/Plugins/gridstack.js/gridstack-all.min.js")) .Generals(context: context) .Script( src: Responses.Locations.Get( @@ -89,13 +92,20 @@ public static HtmlBuilder Scripts( _using: !extendedScripts.IsNullOrEmpty()) .Script(script: script, _using: !script.IsNullOrEmpty()) .Script( - script: ss.GetScriptBody(context: context, peredicate: o => o.All == true), + script: ss.GetScriptBody( + context: context, + peredicate: o => + o.All == true + && o.Disabled != true), _using: context.ContractSettings.Script != false && ss.Scripts?.Any() == true) .Script( script: userScript, _using: context.ContractSettings.Script != false && !userScript.IsNullOrEmpty()) + .Script(script: "$p.initDashboard();", + _using: ss.ReferenceType == "Dashboards" + && context.Action == "index") .OnEditorLoad(context: context); } else diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlStyles.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlStyles.cs index 469fb89bf..d9a578d3c 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlStyles.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlStyles.cs @@ -121,6 +121,16 @@ public static HtmlBuilder LinkedStyles( context: context, parts: "Styles/Plugins/jquery.multiselect.filter.css"), rel: "stylesheet") + .Link( + href: Responses.Locations.Get( + context: context, + parts: "Scripts/Plugins/gridstack.js/gridstack.min.css"), + rel: "stylesheet") + .Link( + href: Responses.Locations.Get( + context: context, + parts: "Styles/Plugins/material-symbols-0.8.0/material-symbols/index.css"), + rel: "stylesheet") .Link( href: context.VirtualPathToAbsolute($"~/content/styles.min.css?v={Environments.BundlesVersions.Get("styles.css")}"), rel: "stylesheet") diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlTemplates.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlTemplates.cs index 8cd314e09..185c89db1 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlTemplates.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlTemplates.cs @@ -307,20 +307,38 @@ public static HtmlBuilder Warnings( private static HtmlBuilder SwitchUserInfo( this HtmlBuilder hb, Context context) { - return context.SwitchUser - ? hb.Div(id: "SwitchUserInfo", action: () => hb + if (context.SwitchTenant) + { + return hb.Div(id: "SwitchUserInfo", action: () => hb .A( - href: "javascript:void(0);", + href: "#", attributes: new HtmlAttributes() - .OnClick("$p.ajax('{0}','post',null,$('#SwitchUserInfo a'));".Params( + .OnClick("location.href='{0}'; ".Params( Locations.Get( context, "Users", - "ReturnOriginalUser"))) - .DataConfirm("ConfirmSwitchUser"), + "ReturnOriginalTenant"))) + .DataConfirm("ConfirmSwitchTenant"), action: () => hb - .Text(text: Displays.SwitchUserInfo(context: context)))) - : hb; + .Text(text: Displays.SwitchTenantInfo(context: context)))); + } + else + { + return context.SwitchUser + ? hb.Div(id: "SwitchUserInfo", action: () => hb + .A( + href: "javascript:void(0);", + attributes: new HtmlAttributes() + .OnClick("$p.ajax('{0}','post',null,$('#SwitchUserInfo a'));".Params( + Locations.Get( + context, + "Users", + "ReturnOriginalUser"))) + .DataConfirm("ConfirmSwitchUser"), + action: () => hb + .Text(text: Displays.SwitchUserInfo(context: context)))) + : hb; + } } private static HtmlBuilder ExcessLicenseWarning(this HtmlBuilder hb, Context context) diff --git a/Implem.Pleasanter/Libraries/Initializers/ItemsInitializer.cs b/Implem.Pleasanter/Libraries/Initializers/ItemsInitializer.cs index 9cf6a16c2..8410c2cd8 100644 --- a/Implem.Pleasanter/Libraries/Initializers/ItemsInitializer.cs +++ b/Implem.Pleasanter/Libraries/Initializers/ItemsInitializer.cs @@ -101,6 +101,152 @@ public static void Initialize(Context context) }); } }); + Repository.ExecuteNonQuery( + context: context, + statements: Rds.PhysicalDeleteDashboards( + where: Rds.ItemsWhere().Add(raw: sqlExists.Params( + "\"Dashboards_deleted\"", + "\"Dashboards_deleted\".\"DashboardId\"", + "\"Dashboards\".\"DashboardId\"")))); + Repository.ExecuteNonQuery( + context: context, + statements: Rds.DeleteDashboards( + factory: context, + where: Rds.ItemsWhere().Add(raw: sqlExists.Params( + "\"Items_deleted\"", + "\"Items_deleted\".\"ReferenceId\"", + "\"Dashboards\".\"DashboardId\"")))); + Repository.ExecuteTable( + context: context, + statements: Rds.SelectDashboards( + tableType: Sqls.TableTypes.Normal, + column: Rds.DashboardsColumn() + .SiteId() + .DashboardId() + .Ver() + .Sites_TenantId(), + join: Rds.DashboardsJoinDefault() + .Add( + tableName: "\"Items\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Items\".\"ReferenceId\"=\"Dashboards\".\"DashboardId\"") + .Add( + tableName: "\"Sites\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Sites\".\"SiteId\"=\"Dashboards\".\"SiteId\""), + where: Rds.ItemsWhere() + .ReferenceId( + tableName: "Items", + _operator: " is null"))) + .AsEnumerable() + .ForEach(dataRow => + { + var siteId = dataRow.Long("SiteId"); + var ss = new SiteModel().Get( + context: new Context(tenantId: dataRow.Int("TenantId")), + where: Rds.SitesWhere().SiteId(siteId))? + .DashboardsSiteSettings( + context: new Context(tenantId: dataRow.Int("TenantId")), + referenceId: dataRow.Long("DashboardId")); + var dashboardModel = new DashboardModel( + context: new Context(tenantId: dataRow.Int("TenantId")), + ss: ss) + .Get( + context: new Context(tenantId: dataRow.Int("TenantId")), + ss: ss, + tableType: Sqls.TableTypes.Normal, + where: Rds.DashboardsWhere() + .SiteId(dataRow.Long("SiteId")) + .DashboardId(dataRow.Long("DashboardId")) + .Ver(dataRow.Int("Ver"))); + if (ss != null && + dashboardModel.AccessStatus == Databases.AccessStatuses.Selected) + { + var fullText = dashboardModel.FullText( + context: new Context(tenantId: dataRow.Int("TenantId")), + ss: ss); + Repository.ExecuteNonQuery( + context: new Context(tenantId: dataRow.Int("TenantId")), + connectionString: Parameters.Rds.OwnerConnectionString, + statements: new SqlStatement[] + { + Rds.IdentityInsertItems( + factory: context, + on: true), + Rds.InsertItems( + param: Rds.ItemsParam() + .ReferenceId(dashboardModel.DashboardId) + .ReferenceType("Dashboards") + .SiteId(dashboardModel.SiteId) + .Title(dashboardModel.Title.MessageDisplay(context: context)) + .FullText(fullText, _using: fullText != null) + .SearchIndexCreatedTime(DateTime.Now)), + Rds.IdentityInsertItems( + factory: context, + on: false) + }); + } + }); + Repository.ExecuteTable( + context: context, + statements: Rds.SelectDashboards( + tableType: Sqls.TableTypes.Deleted, + column: Rds.DashboardsColumn() + .SiteId() + .DashboardId() + .Ver(), + join: Rds.DashboardsJoinDefault() + .Add( + tableName: "\"Items_deleted\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Items_deleted\".\"ReferenceId\"=\"Dashboards\".\"DashboardId\"") + .Add( + tableName: "\"Sites\"", + joinType: SqlJoin.JoinTypes.LeftOuter, + joinExpression: "\"Sites\".\"SiteId\"=\"Dashboards\".\"SiteId\""), + where: Rds.ItemsWhere() + .ReferenceId( + tableName: "Items_deleted", + _operator: " is null"))) + .AsEnumerable() + .ForEach(dataRow => + { + var siteId = dataRow.Long("SiteId"); + var ss = new SiteModel().Get( + context: new Context(tenantId: dataRow.Int("TenantId")), + where: Rds.SitesWhere().SiteId(siteId))? + .DashboardsSiteSettings( + context: new Context(tenantId: dataRow.Int("TenantId")), + referenceId: dataRow.Long("DashboardId")); + var dashboardModel = new DashboardModel( + context: new Context(tenantId: dataRow.Int("TenantId")), + ss: ss) + .Get( + context: new Context(tenantId: dataRow.Int("TenantId")), + ss: ss, + tableType: Sqls.TableTypes.Deleted, + where: Rds.DashboardsWhere() + .SiteId(dataRow.Long("SiteId")) + .DashboardId(dataRow.Long("DashboardId")) + .Ver(dataRow.Int("Ver"))); + if (ss != null && + dashboardModel.AccessStatus == Databases.AccessStatuses.Selected) + { + Repository.ExecuteNonQuery( + context: new Context(tenantId: dataRow.Int("TenantId")), + statements: new SqlStatement[] + { + Rds.InsertItems( + tableType: Sqls.TableTypes.Deleted, + param: Rds.ItemsParam() + .ReferenceId(dashboardModel.DashboardId) + .Ver(dashboardModel.Ver) + .ReferenceType("Dashboards") + .SiteId(dashboardModel.SiteId) + .Title(dashboardModel.Title.MessageDisplay(context: context))) + }); + } + }); Repository.ExecuteNonQuery( context: context, statements: Rds.PhysicalDeleteIssues( diff --git a/Implem.Pleasanter/Libraries/Models/DropDowns.cs b/Implem.Pleasanter/Libraries/Models/DropDowns.cs index 71fe21a69..c939d68ce 100644 --- a/Implem.Pleasanter/Libraries/Models/DropDowns.cs +++ b/Implem.Pleasanter/Libraries/Models/DropDowns.cs @@ -24,6 +24,7 @@ public static string SearchDropDown( var filter = controlId.StartsWith("ViewFilters__") || controlId.StartsWith("ProcessViewFilters__") || controlId.StartsWith("StatusControlViewFilters__") + || controlId.StartsWith("DashboardViewFilters__") || controlId.StartsWith("ViewFiltersOnGridHeader__"); var searchText = context.Forms.Data("DropDownSearchText"); string parentClass = context.Forms.Data("DropDownSearchParentClass"); @@ -269,6 +270,7 @@ public static string SelectSearchDropDown( var filter = controlId.StartsWith("ViewFilters__") || controlId.StartsWith("ProcessViewFilters__") || controlId.StartsWith("StatusControlViewFilters__") + || controlId.StartsWith("DashboardViewFilters__") || controlId.StartsWith("ViewFiltersOnGridHeader__"); var multiple = context.Forms.Bool("DropDownSearchMultiple"); var selected = multiple diff --git a/Implem.Pleasanter/Libraries/Models/GridData.cs b/Implem.Pleasanter/Libraries/Models/GridData.cs index 5d6f31d87..a8a91f96f 100644 --- a/Implem.Pleasanter/Libraries/Models/GridData.cs +++ b/Implem.Pleasanter/Libraries/Models/GridData.cs @@ -158,6 +158,7 @@ public List> KeyValues( var sysLogs = new Dictionary(); var tenants = new Dictionary(); var users = new Dictionary(); + var dashboards = new Dictionary(); var issues = new Dictionary(); var results = new Dictionary(); var wikis = new Dictionary(); @@ -451,6 +452,7 @@ public System.Text.StringBuilder Csv( var sysLogs = new Dictionary(); var tenants = new Dictionary(); var users = new Dictionary(); + var dashboards = new Dictionary(); var issues = new Dictionary(); var results = new Dictionary(); var wikis = new Dictionary(); diff --git a/Implem.Pleasanter/Libraries/Requests/Context.cs b/Implem.Pleasanter/Libraries/Requests/Context.cs index 9e53a4376..709216f21 100644 --- a/Implem.Pleasanter/Libraries/Requests/Context.cs +++ b/Implem.Pleasanter/Libraries/Requests/Context.cs @@ -43,6 +43,7 @@ public class Context : ISqlObjectFactory public bool InvalidJsonData { get; set; } public bool Authenticated { get; set; } public bool SwitchUser { get; set; } + public bool SwitchTenant { get; set; } public string SessionGuid { get; set; } = Strings.NewGuid(); public Dictionary SessionData { get; set; } = new Dictionary(); public Dictionary UserSessionData { get; set; } = new Dictionary(); @@ -70,6 +71,7 @@ public class Context : ISqlObjectFactory public string Page { get; set; } public string Server { get; set; } public int TenantId { get; set; } + public int TargetTenantId { get; set; } public long SiteId { get; set; } public long Id { get; set; } public Dictionary PermissionHash { get; set; } @@ -213,6 +215,7 @@ public void Set( if (sessionStatus) SetSessionGuid(); if (item) SetItemProperties(); if (user) SetUserProperties(sessionStatus, setData); + if (item) SetSwitchTenant(sessionStatus, setData); SetTenantProperties(); if (request) SetPublish(); if (request && setPermissions) SetPermissions(); @@ -343,6 +346,7 @@ public void SetItemProperties() { RecordTitle = dataRow.String("Title"); } + TargetTenantId = dataRow.Int("TenantId"); }); Page = Controller + "/" + SiteId @@ -364,6 +368,12 @@ public void SetItemProperties() } } + private void SetSwitchTenant(bool sessionStatus, bool setData) + { + Extension.SwichTenant(context: this); + if (this.SwitchTenant) SetUserProperties(sessionStatus: false, setData: false); + } + private void SetUserProperties(bool sessionStatus, bool setData) { if (HasRoute) @@ -384,6 +394,9 @@ private void SetUserProperties(bool sessionStatus, bool setData) loginId: AspNetCoreHttpContext.Current?.User?.Identity.Name) ? SessionData.Get("SwitchLoginId") : null, + SessionData.Get("SwitchTenantId") != null + ? SessionData.Get("SwitchLoginId") + : null, LoginId); SetUser(userModel: GetUser(where: Rds.UsersWhere().LoginId( value: Sqls.EscapeValue(loginId), @@ -426,10 +439,19 @@ private UserModel GetUser(Rds.UsersWhereCollection where) .Lockout(false)); } - private void SetUser(UserModel userModel) + public void SetUserProperties(UserModel userModel, bool noHttpContext = false) + { + SetUser( + userModel: userModel, + noHttpContext: noHttpContext); + SetPermissions(); + } + + private void SetUser(UserModel userModel, bool noHttpContext = false) { if (userModel.AccessStatus == Databases.AccessStatuses.Selected) { + LoginId = userModel.LoginId; SwitchUser = SessionData.Get("SwitchLoginId") != null; Authenticated = true; TenantId = userModel.TenantId; @@ -439,7 +461,9 @@ private void SetUser(UserModel userModel) User = SiteInfo.User(context: this, userId: UserId); Language = userModel.Language; Theme = Strings.CoalesceEmpty(userModel.Theme, Parameters.User.Theme, "sunny"); - UserHostAddress = GetUserHostAddress(); + UserHostAddress = noHttpContext + ? string.Empty + : GetUserHostAddress(); Developer = userModel.Developer; TimeZoneInfo = userModel.TimeZoneInfo; UserSettings = userModel.UserSettings; diff --git a/Implem.Pleasanter/Libraries/Responses/Displays.cs b/Implem.Pleasanter/Libraries/Responses/Displays.cs index d26e5ee5e..d7edf3c7d 100644 --- a/Implem.Pleasanter/Libraries/Responses/Displays.cs +++ b/Implem.Pleasanter/Libraries/Responses/Displays.cs @@ -2509,6 +2509,56 @@ public static string Daily( data: data); } + public static string DashboardCustom( + Context context, + params string[] data) + { + return Get( + context: context, + id: "DashboardCustom", + data: data); + } + + public static string DashboardCustomHtml( + Context context, + params string[] data) + { + return Get( + context: context, + id: "DashboardCustomHtml", + data: data); + } + + public static string DashboardGuide( + Context context, + params string[] data) + { + return Get( + context: context, + id: "DashboardGuide", + data: data); + } + + public static string DashboardParts( + Context context, + params string[] data) + { + return Get( + context: context, + id: "DashboardParts", + data: data); + } + + public static string Dashboards( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards", + data: data); + } + public static string Database( Context context, params string[] data) @@ -3019,6 +3069,16 @@ public static string DisableStartGuide( data: data); } + public static string DisplayCount( + Context context, + params string[] data) + { + return Get( + context: context, + id: "DisplayCount", + data: data); + } + public static string Displayed( Context context, params string[] data) @@ -3039,6 +3099,16 @@ public static string DisplayName( data: data); } + public static string DisplayTitle( + Context context, + params string[] data) + { + return Get( + context: context, + id: "DisplayTitle", + data: data); + } + public static string DropDownList( Context context, params string[] data) @@ -4139,6 +4209,16 @@ public static string HasNotPermission( data: data); } + public static string Height( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Height", + data: data); + } + public static string HelpMenu( Context context, params string[] data) @@ -4219,6 +4299,16 @@ public static string HistoryOnGrid( data: data); } + public static string Horizontal( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Horizontal", + data: data); + } + public static string HorizontalAxis( Context context, params string[] data) @@ -4779,6 +4869,16 @@ public static string InvalidSsoCode( data: data); } + public static string InvalidTimeLineSites( + Context context, + params string[] data) + { + return Get( + context: context, + id: "InvalidTimeLineSites", + data: data); + } + public static string InvitationMailBody( Context context, params string[] data) @@ -5589,6 +5689,16 @@ public static string Manage( data: data); } + public static string ManageDashboard( + Context context, + params string[] data) + { + return Get( + context: context, + id: "ManageDashboard", + data: data); + } + public static string ManageFolder( Context context, params string[] data) @@ -6909,6 +7019,16 @@ public static string PartialMatch( data: data); } + public static string PartsType( + Context context, + params string[] data) + { + return Get( + context: context, + id: "PartsType", + data: data); + } + public static string Password( Context context, params string[] data) @@ -7249,6 +7369,26 @@ public static string Quarter( data: data); } + public static string QuickAccess( + Context context, + params string[] data) + { + return Get( + context: context, + id: "QuickAccess", + data: data); + } + + public static string QuickAccessLayout( + Context context, + params string[] data) + { + return Get( + context: context, + id: "QuickAccessLayout", + data: data); + } + public static string RadioButton( Context context, params string[] data) @@ -7349,6 +7489,16 @@ public static string RecordAccessControl( data: data); } + public static string RecordBody( + Context context, + params string[] data) + { + return Get( + context: context, + id: "RecordBody", + data: data); + } + public static string RecordControl( Context context, params string[] data) @@ -7359,6 +7509,16 @@ public static string RecordControl( data: data); } + public static string RecordTitle( + Context context, + params string[] data) + { + return Get( + context: context, + id: "RecordTitle", + data: data); + } + public static string ReCreate( Context context, params string[] data) @@ -7609,6 +7769,16 @@ public static string ResetPassword( data: data); } + public static string ResetTimeLineView( + Context context, + params string[] data) + { + return Get( + context: context, + id: "ResetTimeLineView", + data: data); + } + public static string ResetType( Context context, params string[] data) @@ -7749,6 +7919,16 @@ public static string Save( data: data); } + public static string SaveLayout( + Context context, + params string[] data) + { + return Get( + context: context, + id: "SaveLayout", + data: data); + } + public static string SaveViewNone( Context context, params string[] data) @@ -8839,6 +9019,56 @@ public static string Thursday( data: data); } + public static string TimeLine( + Context context, + params string[] data) + { + return Get( + context: context, + id: "TimeLine", + data: data); + } + + public static string TimeLineDetailed( + Context context, + params string[] data) + { + return Get( + context: context, + id: "TimeLineDetailed", + data: data); + } + + public static string TimeLineDisplayType( + Context context, + params string[] data) + { + return Get( + context: context, + id: "TimeLineDisplayType", + data: data); + } + + public static string TimeLineSimple( + Context context, + params string[] data) + { + return Get( + context: context, + id: "TimeLineSimple", + data: data); + } + + public static string TimeLineStandard( + Context context, + params string[] data) + { + return Get( + context: context, + id: "TimeLineStandard", + data: data); + } + public static string TimeOut( Context context, params string[] data) @@ -9629,6 +9859,16 @@ public static string Version( data: data); } + public static string Vertical( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Vertical", + data: data); + } + public static string VerUp( Context context, params string[] data) @@ -9749,6 +9989,16 @@ public static string Wide( data: data); } + public static string Width( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Width", + data: data); + } + public static string WorkValue( Context context, params string[] data) @@ -10169,6 +10419,26 @@ public static string Binaries_Title( data: data); } + public static string Dashboards_DashboardId( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_DashboardId", + data: data); + } + + public static string Dashboards_Locked( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Locked", + data: data); + } + public static string Demos_DemoId( Context context, params string[] data) @@ -12479,6 +12749,16 @@ public static string Tenants_Title( data: data); } + public static string Tenants_TopDashboards( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Tenants_TopDashboards", + data: data); + } + public static string Tenants_TopScript( Context context, params string[] data) @@ -13239,6 +13519,126 @@ public static string Binaries_VerUp( data: data); } + public static string Dashboards_Body( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Body", + data: data); + } + + public static string Dashboards_SiteId( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_SiteId", + data: data); + } + + public static string Dashboards_Title( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Title", + data: data); + } + + public static string Dashboards_TitleBody( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_TitleBody", + data: data); + } + + public static string Dashboards_UpdatedTime( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_UpdatedTime", + data: data); + } + + public static string Dashboards_Comments( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Comments", + data: data); + } + + public static string Dashboards_CreatedTime( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_CreatedTime", + data: data); + } + + public static string Dashboards_Creator( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Creator", + data: data); + } + + public static string Dashboards_Timestamp( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Timestamp", + data: data); + } + + public static string Dashboards_Updator( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Updator", + data: data); + } + + public static string Dashboards_Ver( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_Ver", + data: data); + } + + public static string Dashboards_VerUp( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Dashboards_VerUp", + data: data); + } + public static string Demos_Comments( Context context, params string[] data) diff --git a/Implem.Pleasanter/Libraries/Responses/Locations.cs b/Implem.Pleasanter/Libraries/Responses/Locations.cs index 1185fe2b5..752df91c7 100644 --- a/Implem.Pleasanter/Libraries/Responses/Locations.cs +++ b/Implem.Pleasanter/Libraries/Responses/Locations.cs @@ -2,6 +2,9 @@ using Implem.Libraries.Utilities; using Implem.Pleasanter.Libraries.Requests; using Implem.Pleasanter.Libraries.Security; +using Implem.Pleasanter.Libraries.Server; +using Implem.Pleasanter.Libraries.Settings; +using Implem.Pleasanter.Models; using System.Linq; namespace Implem.Pleasanter.Libraries.Responses { @@ -9,11 +12,36 @@ public static class Locations { public static string Top(Context context) { + var topUrl = DashboardUrl(context: context) + ?? Parameters.Locations.TopUrl; return (Permissions.PrivilegedUsers(context.LoginId) && Parameters.Locations.LoginAfterUrlExcludePrivilegedUsers) - || Parameters.Locations.TopUrl.IsNullOrEmpty() + || topUrl.IsNullOrEmpty() ? Get(context: context) - : Get(context: context, Parameters.Locations.TopUrl); + : Get( + context: context, + parts: topUrl); + } + + public static string DashboardUrl(Context context) + { + var tenantModel = new TenantModel( + context: context, + ss: SiteSettingsUtilities.TenantsSiteSettings(context: context), + tenantId: context.TenantId); + var dashboards = tenantModel.TopDashboards + ?.Deserialize() + ?? System.Array.Empty(); + var dashboardId = dashboards + .FirstOrDefault(id => Permissions + .CanRead( + context: context, + siteId: id)); + return dashboardId != 0 + ? ItemIndex( + context: context, + id: dashboardId) + : null; } public static string BaseUrl(Context context) @@ -198,7 +226,7 @@ public static string ItemPdfAbsoluteUri(Context context, long id) context: context, id: id); return Parameters.Service.AbsoluteUri != null - ? Parameters.Service.AbsoluteUri + itemPdf + ? Parameters.Service.AbsoluteUri + "/items/" + id : context.AbsoluteUri?.Replace(context.AbsolutePath, itemPdf) ?? itemPdf; } diff --git a/Implem.Pleasanter/Libraries/Responses/ResponseSpecials.cs b/Implem.Pleasanter/Libraries/Responses/ResponseSpecials.cs index e6e24849a..ed98d82e6 100644 --- a/Implem.Pleasanter/Libraries/Responses/ResponseSpecials.cs +++ b/Implem.Pleasanter/Libraries/Responses/ResponseSpecials.cs @@ -532,6 +532,30 @@ public PermissionsResponseCollection ValAndFormData(string selector, string valu } } + public class DashboardsResponseCollection : ResponseCollection + { + public DashboardModel DashboardModel; + + public DashboardsResponseCollection( + Context context, + DashboardModel dashboardModel) : base(context: context) + { + DashboardModel = dashboardModel; + } + + public DashboardsResponseCollection Val(string selector, string value) + { + base.Val(selector, value); + return this; + } + + public DashboardsResponseCollection ValAndFormData(string selector, string value) + { + base.ValAndFormData(selector, value); + return this; + } + } + public class IssuesResponseCollection : ResponseCollection { public IssueModel IssueModel; @@ -10858,6 +10882,402 @@ public static PermissionsResponseCollection Timestamp_FormData( return res.ValAndFormData("#Permissions_Timestamp", value); } + public static DashboardsResponseCollection UpdatedTime( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_UpdatedTime", + res.DashboardModel.UpdatedTime.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "UpdatedTime"))); + } + + public static DashboardsResponseCollection UpdatedTime( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_UpdatedTime", value); + } + + public static DashboardsResponseCollection UpdatedTime_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_UpdatedTime", + res.DashboardModel.UpdatedTime.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "UpdatedTime"))); + } + + public static DashboardsResponseCollection UpdatedTime_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_UpdatedTime", value); + } + + public static DashboardsResponseCollection DashboardId( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_DashboardId", + res.DashboardModel.DashboardId.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "DashboardId"))); + } + + public static DashboardsResponseCollection DashboardId( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_DashboardId", value); + } + + public static DashboardsResponseCollection DashboardId_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_DashboardId", + res.DashboardModel.DashboardId.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "DashboardId"))); + } + + public static DashboardsResponseCollection DashboardId_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_DashboardId", value); + } + + public static DashboardsResponseCollection Ver( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_Ver", + res.DashboardModel.Ver.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Ver"))); + } + + public static DashboardsResponseCollection Ver( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_Ver", value); + } + + public static DashboardsResponseCollection Ver_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_Ver", + res.DashboardModel.Ver.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Ver"))); + } + + public static DashboardsResponseCollection Ver_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_Ver", value); + } + + public static DashboardsResponseCollection Title( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_Title", + res.DashboardModel.Title.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Title"))); + } + + public static DashboardsResponseCollection Title( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_Title", value); + } + + public static DashboardsResponseCollection Title_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_Title", + res.DashboardModel.Title.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Title"))); + } + + public static DashboardsResponseCollection Title_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_Title", value); + } + + public static DashboardsResponseCollection Body( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_Body", + res.DashboardModel.Body.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Body"))); + } + + public static DashboardsResponseCollection Body( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_Body", value); + } + + public static DashboardsResponseCollection Body_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_Body", + res.DashboardModel.Body.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Body"))); + } + + public static DashboardsResponseCollection Body_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_Body", value); + } + + public static DashboardsResponseCollection Locked( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_Locked", + res.DashboardModel.Locked.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Locked"))); + } + + public static DashboardsResponseCollection Locked( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_Locked", value); + } + + public static DashboardsResponseCollection Locked_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_Locked", + res.DashboardModel.Locked.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Locked"))); + } + + public static DashboardsResponseCollection Locked_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_Locked", value); + } + + public static DashboardsResponseCollection Comments( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_Comments", + res.DashboardModel.Comments.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Comments"))); + } + + public static DashboardsResponseCollection Comments( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_Comments", value); + } + + public static DashboardsResponseCollection Comments_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_Comments", + res.DashboardModel.Comments.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Comments"))); + } + + public static DashboardsResponseCollection Comments_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_Comments", value); + } + + public static DashboardsResponseCollection CreatedTime( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_CreatedTime", + res.DashboardModel.CreatedTime.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "CreatedTime"))); + } + + public static DashboardsResponseCollection CreatedTime( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_CreatedTime", value); + } + + public static DashboardsResponseCollection CreatedTime_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_CreatedTime", + res.DashboardModel.CreatedTime.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "CreatedTime"))); + } + + public static DashboardsResponseCollection CreatedTime_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_CreatedTime", value); + } + + public static DashboardsResponseCollection Timestamp( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.Val( + "#Dashboards_Timestamp", + res.DashboardModel.Timestamp.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Timestamp"))); + } + + public static DashboardsResponseCollection Timestamp( + this DashboardsResponseCollection res, Context context, string value) + { + return res.Val("#Dashboards_Timestamp", value); + } + + public static DashboardsResponseCollection Timestamp_FormData( + this DashboardsResponseCollection res, + Context context, + SiteSettings ss, + Column column = null) + { + return res.ValAndFormData( + "#Dashboards_Timestamp", + res.DashboardModel.Timestamp.ToResponse( + context: context, + ss: ss, + column: column ?? ss.GetColumn( + context: context, + columnName: "Timestamp"))); + } + + public static DashboardsResponseCollection Timestamp_FormData( + this DashboardsResponseCollection res, Context context, string value) + { + return res.ValAndFormData("#Dashboards_Timestamp", value); + } + public static IssuesResponseCollection UpdatedTime( this IssuesResponseCollection res, Context context, diff --git a/Implem.Pleasanter/Libraries/Search/Indexes.cs b/Implem.Pleasanter/Libraries/Search/Indexes.cs index 2d1192128..0e27a5a18 100644 --- a/Implem.Pleasanter/Libraries/Search/Indexes.cs +++ b/Implem.Pleasanter/Libraries/Search/Indexes.cs @@ -40,6 +40,19 @@ public static void Create(Context context, SiteSettings ss, long id, bool force ss: ss, backgroundTask: true)); break; + case "Dashboards": + var dashboardModel = new DashboardModel( + context: context, + ss: ss, + dashboardId: id); + CreateFullText( + context: context, + id: id, + fullText: dashboardModel.FullText( + context: context, + ss: ss, + backgroundTask: true)); + break; case "Issues": var issueModel = new IssueModel( context: context, diff --git a/Implem.Pleasanter/Libraries/Security/Authentications.cs b/Implem.Pleasanter/Libraries/Security/Authentications.cs index 4dceaa574..3fbe5497f 100644 --- a/Implem.Pleasanter/Libraries/Security/Authentications.cs +++ b/Implem.Pleasanter/Libraries/Security/Authentications.cs @@ -15,7 +15,7 @@ public enum AuthenticationCodeCharacterTypes NumberAndLetter } - public static string SignIn(Context context, string returnUrl) + public static string SignIn(Context context, string returnUrl, bool noHttpContext = false) { return new UserModel( context: context, @@ -23,7 +23,8 @@ public static string SignIn(Context context, string returnUrl) formData: context.Forms) .Authenticate( context: context, - returnUrl: returnUrl); + returnUrl: returnUrl, + noHttpContext: noHttpContext); } public static bool Try(Context context, string loginId, string password) diff --git a/Implem.Pleasanter/Libraries/Security/Permissions.cs b/Implem.Pleasanter/Libraries/Security/Permissions.cs index 862459d7d..0451aaa4d 100644 --- a/Implem.Pleasanter/Libraries/Security/Permissions.cs +++ b/Implem.Pleasanter/Libraries/Security/Permissions.cs @@ -245,7 +245,12 @@ public static SqlWhereCollection SiteUserWhere( bool _using = true) { return _using - ? where.Add(raw: context.Sqls.SiteUserWhere.Params(siteId)) + ? where + .Add(or: new SqlWhereCollection() + .Add( + raw: context.Sqls.SiteUserWhere.Params(siteId)) + .Add( + raw: context.Sqls.SitePermissionsWhere.Params(siteId))) : where; } @@ -466,7 +471,7 @@ public static bool CanRead( case "publishes": return context.Publish; default: - if (ss.IsSiteEditor(context: context)) + if (ss.IsSiteEditor(context: context) || ss.IsDashboardEditor(context: context)) { return context.CanManageSite(ss: ss); } @@ -499,7 +504,7 @@ public static bool CanCreate(this Context context, SiteSettings ss, bool site = case "versions": return false; default: - if (ss.IsSiteEditor(context: context)) + if (ss.IsSiteEditor(context: context) || ss.IsDashboardEditor(context: context)) { return context.CanManageSite(ss: ss); } @@ -535,7 +540,7 @@ public static bool CanUpdate( case "registrations": return CanManageRegistrations(context: context, any: true); default: - if (ss.IsSiteEditor(context: context)) + if (ss.IsSiteEditor(context: context) || ss.IsDashboardEditor(context: context)) { return context.CanManageSite(ss: ss); } @@ -575,7 +580,7 @@ public static bool CanDelete(this Context context, SiteSettings ss, bool site = case "registrations": return PrivilegedUsers(loginId: context.LoginId); default: - if (ss.IsSiteEditor(context: context)) + if (ss.IsSiteEditor(context: context) || ss.IsDashboardEditor(context: context)) { return context.CanManageSite(ss: ss); } @@ -606,7 +611,7 @@ public static bool CanSendMail(this Context context, SiteSettings ss, bool site return CanManageTenant(context: context) || context.UserId == context.Id; default: - if (ss.IsSiteEditor(context: context)) + if (ss.IsSiteEditor(context: context) || ss.IsDashboardEditor(context: context)) { return context.CanManageSite(ss: ss); } diff --git a/Implem.Pleasanter/Libraries/Settings/Column.cs b/Implem.Pleasanter/Libraries/Settings/Column.cs index 0df9ee647..ce6506b41 100644 --- a/Implem.Pleasanter/Libraries/Settings/Column.cs +++ b/Implem.Pleasanter/Libraries/Settings/Column.cs @@ -2128,6 +2128,72 @@ private void SelectColumns( break; } break; + case "Dashboards": + switch (columnName) + { + case "SiteId": + sql.Dashboards_SiteId(tableName: path, _as: _as); + break; + case "UpdatedTime": + sql.Dashboards_UpdatedTime(tableName: path, _as: _as); + break; + case "DashboardId": + sql.Dashboards_DashboardId(tableName: path, _as: _as); + break; + case "Ver": + sql.Dashboards_Ver(tableName: path, _as: _as); + break; + case "Body": + sql.Dashboards_Body(tableName: path, _as: _as); + break; + case "Locked": + sql.Dashboards_Locked(tableName: path, _as: _as); + break; + case "Comments": + sql.Dashboards_Comments(tableName: path, _as: _as); + break; + case "Creator": + sql.Dashboards_Creator(tableName: path, _as: _as); + break; + case "Updator": + sql.Dashboards_Updator(tableName: path, _as: _as); + break; + case "CreatedTime": + sql.Dashboards_CreatedTime(tableName: path, _as: _as); + break; + case "TitleBody": + sql.Dashboards_Body(tableName: path, _as: Joined + ? path + ",Body" + : "Body"); + goto case "Title"; + case "Title": + sql + .Dashboards_Title(tableName: path, _as: _as) + .ItemTitle( + tableName: path, + _as: Joined + ? path + ",ItemTitle" + : "ItemTitle"); + break; + default: + switch (Def.ExtendedColumnTypes.Get(columnName ?? string.Empty)) + { + case "Class": + case "Num": + case "Date": + case "Description": + case "Check": + case "Attachments": + sql.Add( + columnBracket: $"\"{columnName}\"", + tableName: path, + columnName: columnName, + _as: _as); + break; + } + break; + } + break; case "Issues": switch (columnName) { diff --git a/Implem.Pleasanter/Libraries/Settings/DashboardPart.cs b/Implem.Pleasanter/Libraries/Settings/DashboardPart.cs new file mode 100644 index 000000000..1fdeb4f1e --- /dev/null +++ b/Implem.Pleasanter/Libraries/Settings/DashboardPart.cs @@ -0,0 +1,472 @@ +using Implem.Libraries.Utilities; +using Implem.Pleasanter.Interfaces; +using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Responses; +using Implem.Pleasanter.Libraries.Security; +using Implem.Pleasanter.Libraries.Server; +using Implem.Pleasanter.Models; +using System.Collections.Generic; +using System.Linq; + +namespace Implem.Pleasanter.Libraries.Settings +{ + public class QuickAccessSite + { + public string Id { get; set; } + public string Icon { get; set; } + public string Css { get; set; } + } + public class QuickAccessSiteModel + { + public SiteModel Model { get; set; } + public string Icon { get; set; } + public string Css { get; set; } + } + + public class DashboardPart : ISettingListItem + { + public int Id { get; set; } + public string Title { get; set; } + public bool? ShowTitle { get; set; } + public DashboardPartType Type { get; set; } + public int X { get; set; } + public int Y { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public string QuickAccessSites { get; set; } + public List QuickAccessSitesData { get; set; } + public QuickAccessLayout? QuickAccessLayout { get; set; } + public string TimeLineSites { get; set; } + public List TimeLineSitesData { get; set; } + public View View { get; set; } + public string TimeLineTitle { get; set; } + public string TimeLineBody { get; set; } + public int TimeLineItemCount { get; set; } + public string Content { get; set; } + public string HtmlContent { get; set; } + public TimeLineDisplayType? TimeLineDisplayType { get; set; } + public long SiteId { get; set; } + public string ExtendedCss { get; set; } + public List Depts { get; set; } + public List Groups { get; set; } + public List Users { get; set; } + private static readonly int initialWidth = 2; + private static readonly int initialHeight = 10; + + public DashboardPart() + { + TimeLineDisplayType = Settings.TimeLineDisplayType.Standard; + } + + public DashboardPart GetRecordingData(Context context) + { + var dashboardPart = new DashboardPart(); + dashboardPart.Id = Id; + dashboardPart.Title = Title; + if (ShowTitle == true) dashboardPart.ShowTitle = true; + dashboardPart.Type = Type; + dashboardPart.X = X; + dashboardPart.Y = Y; + dashboardPart.Width = Width; + dashboardPart.Height = Height; + dashboardPart.ExtendedCss = ExtendedCss; + if (Depts?.Any() == true) + { + dashboardPart.Depts = Depts; + } + if (Groups?.Any() == true) + { + dashboardPart.Groups = Groups; + } + if (Users?.Any() == true) + { + dashboardPart.Users = Users; + } + dashboardPart.TimeLineDisplayType = null; + switch (Type) + { + case DashboardPartType.QuickAccess: + dashboardPart.QuickAccessSites = QuickAccessSites; + if (QuickAccessLayout != Settings.QuickAccessLayout.Horizontal) + { + dashboardPart.QuickAccessLayout = QuickAccessLayout; + } + break; + case DashboardPartType.TimeLine: + dashboardPart.TimeLineSites = TimeLineSites; + dashboardPart.TimeLineTitle = TimeLineTitle; + dashboardPart.TimeLineBody = TimeLineBody; + dashboardPart.TimeLineItemCount = TimeLineItemCount; + dashboardPart.SiteId = SiteId; + var ss = SiteSettingsUtilities.Get( + context: context, + siteId: SiteId); + if (ss != null) + { + View = View.GetRecordingData( + context: context, + ss: ss); + } + dashboardPart.View = View; + dashboardPart.TimeLineDisplayType = (TimeLineDisplayType != Settings.TimeLineDisplayType.Standard) + ? TimeLineDisplayType + : null; + break; + case DashboardPartType.Custom: + dashboardPart.Content = Content; + break; + case DashboardPartType.CustomHtml: + dashboardPart.HtmlContent = HtmlContent; + break; + } + return dashboardPart; + } + + public static DashboardPart Create( + Context context, + int id, + string title, + bool showTitle, + DashboardPartType type, + string quickAccessSites, + QuickAccessLayout quickAccessLayout, + string timeLineSites, + string timeLineTitle, + string timeLineBody, + int timeLineItemCount, + string content, + string htmlContent, + TimeLineDisplayType timeLineDisplayType, + string extendedCss, + List permissions) + { + var dashboardPart = new DashboardPart() { Id = id }; + return dashboardPart.Update( + context: context, + title: title, + showTitle: showTitle, + type: type, + x: 0, + y: 0, + width: initialWidth, + height: initialHeight, + quickAccessSites: quickAccessSites, + quickAccessLayout: quickAccessLayout, + timeLineSites: timeLineSites, + timeLineTitle: timeLineTitle, + timeLineBody: timeLineBody, + timeLineItemCount: timeLineItemCount, + content: content, + htmlContent: htmlContent, + timeLineDisplayType: timeLineDisplayType, + extendedCss: extendedCss, + permissions: permissions); + } + + public DashboardPart Update( + Context context, + string title, + bool showTitle, + DashboardPartType type, + int x, + int y, + int width, + int height, + string quickAccessSites, + QuickAccessLayout quickAccessLayout, + string timeLineSites, + string timeLineTitle, + string timeLineBody, + int timeLineItemCount, + string content, + string htmlContent, + TimeLineDisplayType timeLineDisplayType, + string extendedCss, + List permissions) + { + Title = title; + ShowTitle = showTitle; + Type = type; + X = x; + Y = y; + Width = width; + Height = height; + QuickAccessSites = quickAccessSites; + QuickAccessLayout = quickAccessLayout; + TimeLineSites = timeLineSites; + TimeLineTitle = timeLineTitle; + TimeLineBody = timeLineBody; + TimeLineItemCount = timeLineItemCount; + Content = content; + HtmlContent = htmlContent; + TimeLineDisplayType = timeLineDisplayType; + ExtendedCss = extendedCss; + SetSitesData(); + SetPermissions(permissions); + SetBaseSiteData(context: context); + return this; + } + + public void SetSitesData() + { + SetQuickAccessSitesData(); + SetTimeLineSitesData(); + } + + private void SetBaseSiteData(Context context) + { + var currentSs = GetBaseSiteSettings( + context: context, + timeLineSites: TimeLineSitesData); + SiteId = currentSs?.SiteId ?? 0; + View = SiteModel.GetDashboardPartView( + context: context, + ss: currentSs, + view: View); + } + + private void SetQuickAccessSitesData() + { + if(QuickAccessSites == null) + { + QuickAccessSitesData = new List(); + return; + } + QuickAccessSitesData = QuickAccessSites.Deserialize>() + ?? QuickAccessSites + ?.Split(new[] { ",", "\n", "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.Trim()) + .Where(o => !o.IsNullOrEmpty()) + .Select(o => new QuickAccessSite() + { + Id = o, + Icon = null, + Css = null + }) + .ToList(); + } + + private void SetTimeLineSitesData() + { + if(TimeLineSites == null) + { + TimeLineSitesData = new List(); + return; + } + TimeLineSitesData = TimeLineSites + .Split(",") + .Select(o => o.Trim()) + .Where(o => !o.IsNullOrEmpty()) + .ToList(); + } + + private static SiteSettings GetBaseSiteSettings(Context context, List timeLineSites) + { + return GetDashboardPartTables(context: context, sites: timeLineSites) + .Select(id => SiteSettingsUtilities.Get(context: context, siteId: id)) + .FirstOrDefault(ss => ss != null); + } + + public static SiteSettings GetBaseSiteSettings(Context context, string timeLineSitesString) + { + if (timeLineSitesString.IsNullOrEmpty()) + { + return null; + } + var timeLineSites = timeLineSitesString + .Split(",") + .Select(o => o.Trim()) + .Where(o => !o.IsNullOrEmpty()) + .ToList(); + return GetDashboardPartTables(context: context, sites: timeLineSites) + .Select(id => SiteSettingsUtilities.Get(context: context, siteId: id)) + .FirstOrDefault(ss => ss != null); + } + + private static IList GetDashboardPartSites(Context context, IEnumerable sites) + { + return sites?.SelectMany(site => + long.TryParse(site, out var siteId) + ? new[] { siteId } + : SiteInfo.Sites(context: context).Values + .Where(row => row.String("SiteName") == site + || row.String("SiteGroupName") == site) + .Select(row => row.Long("SiteId"))) + .ToList() ?? new List(); + } + + public static IList<(long Id, string Icon, string Css)> GetQuickAccessSites(Context context, IEnumerable sites) + { + return sites?.SelectMany(site => + long.TryParse(site.Id, out var siteId) + ? new[] { (siteId, site.Icon, site.Css) } + : SiteInfo.Sites(context: context).Values + .Where(row => row.String("SiteName") == site.Id + || row.String("SiteGroupName") == site.Id) + .Select(row => (row.Long("SiteId"), site.Icon, site.Css))) + .ToList() + ?? new List<(long, string, string)>(); + } + + public static IEnumerable GetDashboardPartTables(Context context, List sites) + { + var keyValues = GetDashboardPartSites(context: context, sites: sites) + .Where(id => SiteInfo.Sites(context: context).ContainsKey(id)) + .Select(id => new KeyValuePair(id, SiteInfo.Sites(context: context)[id])); + return EnumerateDashboardPartTables(sites: keyValues) + .Distinct(); + } + + private static IEnumerable EnumerateDashboardPartTables(IEnumerable> sites) + { + foreach (var site in sites) + { + var refType = site.Value.String("ReferenceType"); + if (refType == "Results" || refType == "Issues") + { + yield return site.Key; + } + } + } + + private void SetPermissions(List permissions) + { + Depts?.Clear(); + Groups?.Clear(); + Users?.Clear(); + foreach (var permission in permissions) + { + switch (permission.Name) + { + case "Dept": + if (Depts == null) + { + Depts = new List(); + } + if (!Depts.Contains(permission.Id)) + { + Depts.Add(permission.Id); + } + break; + case "Group": + if (Groups == null) + { + Groups = new List(); + } + if (!Groups.Contains(permission.Id)) + { + Groups.Add(permission.Id); + } + break; + case "User": + if (Users == null) + { + Users = new List(); + } + if (!Users.Contains(permission.Id)) + { + Users.Add(permission.Id); + } + break; + } + } + } + + public List GetPermissions(SiteSettings ss) + { + var permissions = new List(); + Depts?.ForEach(deptId => permissions.Add(new Permission( + ss: ss, + name: "Dept", + id: deptId))); + Groups?.ForEach(groupId => permissions.Add(new Permission( + ss: ss, + name: "Group", + id: groupId))); + Users?.ForEach(userId => permissions.Add(new Permission( + ss: ss, + name: "User", + id: userId))); + return permissions; + } + + public bool Accessable(Context context, SiteSettings ss) + { + if (!context.CanRead(ss: ss)) + { + return false; + } + if (context.HasPrivilege) + { + return true; + } + if (Depts?.Any() != true + && Groups?.Any() != true + && Users?.Any() != true) + { + return true; + } + if (Depts?.Contains(context.DeptId) == true) + { + return true; + } + if (Groups?.Any(groupId => context.Groups.Contains(groupId)) == true) + { + return true; + } + if (Users?.Contains(context.UserId) == true) + { + return true; + } + return false; + } + + public string PartTypeString(Context context) + { + switch (Type) + { + case DashboardPartType.QuickAccess: + return Displays.QuickAccess(context: context); + + case DashboardPartType.TimeLine: + return Displays.TimeLine(context: context); + + case DashboardPartType.Custom: + return Displays.DashboardCustom(context: context); + + case DashboardPartType.CustomHtml: + return Displays.DashboardCustomHtml(context: context); + default: + return Displays.QuickAccess(context: context); + } + } + + public void SetQuickAccessSites() + { + if (QuickAccessSitesData == null) + { + QuickAccessSites = string.Empty; + } + else if (QuickAccessSitesData.Any(o => o.Icon != null || o.Css != null)) + { + QuickAccessSites = QuickAccessSitesData.ToJson(formatting: Newtonsoft.Json.Formatting.Indented); + } + else + { + QuickAccessSites = QuickAccessSitesData.Select(o => o.Id).Join("\n"); + } + } + + public void SetTimeLineSites() + { + if (TimeLineSitesData == null) + { + TimeLineSites = string.Empty; + } + else + { + TimeLineSites = TimeLineSitesData.Join(","); + } + } + } +} diff --git a/Implem.Pleasanter/Libraries/Settings/DashboardPartLayout.cs b/Implem.Pleasanter/Libraries/Settings/DashboardPartLayout.cs new file mode 100644 index 000000000..2a99cb639 --- /dev/null +++ b/Implem.Pleasanter/Libraries/Settings/DashboardPartLayout.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace Implem.Pleasanter.Libraries.Settings +{ + public class DashboardPartLayout + { + [JsonProperty(PropertyName = "id")] + public int Id { get; set; } = 0; + + [JsonProperty(PropertyName = "x")] + public int X { get; set; } = 0; + + [JsonProperty(PropertyName = "y")] + public int Y { get; set; } = 0; + + [JsonProperty(PropertyName = "w")] + public int W { get; set; } = 1; + + [JsonProperty(PropertyName = "h")] + public int H { get; set; } = 1; + + [JsonProperty(PropertyName = "content")] + public string Content { get; set; } = string.Empty; + } +} diff --git a/Implem.Pleasanter/Libraries/Settings/DashboardPartQuickAccessLayout.cs b/Implem.Pleasanter/Libraries/Settings/DashboardPartQuickAccessLayout.cs new file mode 100644 index 000000000..f7d1cfbad --- /dev/null +++ b/Implem.Pleasanter/Libraries/Settings/DashboardPartQuickAccessLayout.cs @@ -0,0 +1,8 @@ +namespace Implem.Pleasanter.Libraries.Settings +{ + public enum QuickAccessLayout + { + Horizontal = 0, + Vertical = 1 + } +} diff --git a/Implem.Pleasanter/Libraries/Settings/DashboardPartType.cs b/Implem.Pleasanter/Libraries/Settings/DashboardPartType.cs new file mode 100644 index 000000000..97f6495d3 --- /dev/null +++ b/Implem.Pleasanter/Libraries/Settings/DashboardPartType.cs @@ -0,0 +1,10 @@ +namespace Implem.Pleasanter.Libraries.Settings +{ + public enum DashboardPartType + { + QuickAccess = 0, + TimeLine = 1, + Custom = 2, + CustomHtml = 3 + } +} diff --git a/Implem.Pleasanter/Libraries/Settings/DashboardTimeLineItem.cs b/Implem.Pleasanter/Libraries/Settings/DashboardTimeLineItem.cs new file mode 100644 index 000000000..20e52a12c --- /dev/null +++ b/Implem.Pleasanter/Libraries/Settings/DashboardTimeLineItem.cs @@ -0,0 +1,18 @@ +using Implem.Pleasanter.Libraries.DataTypes; +using System.Security.Permissions; + +namespace Implem.Pleasanter.Libraries.Settings +{ + public class DashboardTimeLineItem + { + public long Id { get; set; } + public long SiteId { get; set; } + public SiteTitle SiteTitle { get; set; } + public string Title { get; set; } + public string Body { get; set; } + public Time CreatedTime { get; set; } + public Time UpdatedTime { get; set; } + public User Creator { get; set; } + public User Updator { get; set; } + } +} diff --git a/Implem.Pleasanter/Libraries/Settings/Reminder.cs b/Implem.Pleasanter/Libraries/Settings/Reminder.cs index 2b540ab30..cf24304f9 100644 --- a/Implem.Pleasanter/Libraries/Settings/Reminder.cs +++ b/Implem.Pleasanter/Libraries/Settings/Reminder.cs @@ -679,318 +679,12 @@ private string ReplacedLine(Context context, SiteSettings ss, DataRow dataRow, s case "Issues": var issueModel = new IssueModel( context: context, ss: ss, dataRow: dataRow); - ss.IncludedColumns(line).ForEach(column => - { - switch (column.ColumnName) - { - case "Title": - line = line.Replace("[Title]", dataRow.String("ItemTitle")); - break; - case "SiteId": - line = line.Replace( - "[SiteId]", - issueModel.SiteId.ToExport( - context: context, - column: column)); - break; - case "UpdatedTime": - line = line.Replace( - "[UpdatedTime]", - issueModel.UpdatedTime.ToExport( - context: context, - column: column)); - break; - case "IssueId": - line = line.Replace( - "[IssueId]", - issueModel.IssueId.ToExport( - context: context, - column: column)); - break; - case "Ver": - line = line.Replace( - "[Ver]", - issueModel.Ver.ToExport( - context: context, - column: column)); - break; - case "Body": - line = line.Replace( - "[Body]", - issueModel.Body.ToExport( - context: context, - column: column)); - break; - case "StartTime": - line = line.Replace( - "[StartTime]", - issueModel.StartTime.ToExport( - context: context, - column: column)); - break; - case "CompletionTime": - line = line.Replace( - "[CompletionTime]", - issueModel.CompletionTime.ToExport( - context: context, - column: column)); - break; - case "WorkValue": - line = line.Replace( - "[WorkValue]", - issueModel.WorkValue.ToExport( - context: context, - column: column)); - break; - case "ProgressRate": - line = line.Replace( - "[ProgressRate]", - issueModel.ProgressRate.ToExport( - context: context, - column: column)); - break; - case "Status": - line = line.Replace( - "[Status]", - issueModel.Status.ToExport( - context: context, - column: column)); - break; - case "Manager": - line = line.Replace( - "[Manager]", - issueModel.Manager.ToExport( - context: context, - column: column)); - break; - case "Owner": - line = line.Replace( - "[Owner]", - issueModel.Owner.ToExport( - context: context, - column: column)); - break; - case "Locked": - line = line.Replace( - "[Locked]", - issueModel.Locked.ToExport( - context: context, - column: column)); - break; - case "Comments": - line = line.Replace( - "[Comments]", - issueModel.Comments.ToExport( - context: context, - column: column)); - break; - case "Creator": - line = line.Replace( - "[Creator]", - issueModel.Creator.ToExport( - context: context, - column: column)); - break; - case "Updator": - line = line.Replace( - "[Updator]", - issueModel.Updator.ToExport( - context: context, - column: column)); - break; - case "CreatedTime": - line = line.Replace( - "[CreatedTime]", - issueModel.CreatedTime.ToExport( - context: context, - column: column)); - break; - default: - switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) - { - case "Class": - line = line.Replace( - $"[{column.Name}]", - issueModel.GetClass(column: column).ToExport( - context: context, - column: column)); - break; - case "Num": - line = line.Replace( - $"[{column.Name}]", - issueModel.GetNum(column: column).ToExport( - context: context, - column: column)); - break; - case "Date": - line = line.Replace( - $"[{column.Name}]", - issueModel.GetDate(column: column).ToExport( - context: context, - column: column)); - break; - case "Description": - line = line.Replace( - $"[{column.Name}]", - issueModel.GetDescription(column: column).ToExport( - context: context, - column: column)); - break; - case "Check": - line = line.Replace( - $"[{column.Name}]", - issueModel.GetCheck(column: column).ToExport( - context: context, - column: column)); - break; - } - break; - } - }); + line = issueModel.ReplaceLineByIssueModel(context, ss, line, dataRow.String("ItemTitle")); break; case "Results": var resultModel = new ResultModel( context: context, ss: ss, dataRow: dataRow); - ss.IncludedColumns(line).ForEach(column => - { - switch (column.ColumnName) - { - case "Title": - line = line.Replace("[Title]", dataRow.String("ItemTitle")); - break; - case "SiteId": - line = line.Replace( - "[SiteId]", - resultModel.SiteId.ToExport( - context: context, - column: column)); - break; - case "UpdatedTime": - line = line.Replace( - "[UpdatedTime]", - resultModel.UpdatedTime.ToExport( - context: context, - column: column)); - break; - case "ResultId": - line = line.Replace( - "[ResultId]", - resultModel.ResultId.ToExport( - context: context, - column: column)); - break; - case "Ver": - line = line.Replace( - "[Ver]", - resultModel.Ver.ToExport( - context: context, - column: column)); - break; - case "Body": - line = line.Replace( - "[Body]", - resultModel.Body.ToExport( - context: context, - column: column)); - break; - case "Status": - line = line.Replace( - "[Status]", - resultModel.Status.ToExport( - context: context, - column: column)); - break; - case "Manager": - line = line.Replace( - "[Manager]", - resultModel.Manager.ToExport( - context: context, - column: column)); - break; - case "Owner": - line = line.Replace( - "[Owner]", - resultModel.Owner.ToExport( - context: context, - column: column)); - break; - case "Locked": - line = line.Replace( - "[Locked]", - resultModel.Locked.ToExport( - context: context, - column: column)); - break; - case "Comments": - line = line.Replace( - "[Comments]", - resultModel.Comments.ToExport( - context: context, - column: column)); - break; - case "Creator": - line = line.Replace( - "[Creator]", - resultModel.Creator.ToExport( - context: context, - column: column)); - break; - case "Updator": - line = line.Replace( - "[Updator]", - resultModel.Updator.ToExport( - context: context, - column: column)); - break; - case "CreatedTime": - line = line.Replace( - "[CreatedTime]", - resultModel.CreatedTime.ToExport( - context: context, - column: column)); - break; - default: - switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) - { - case "Class": - line = line.Replace( - $"[{column.Name}]", - resultModel.GetClass(column: column).ToExport( - context: context, - column: column)); - break; - case "Num": - line = line.Replace( - $"[{column.Name}]", - resultModel.GetNum(column: column).ToExport( - context: context, - column: column)); - break; - case "Date": - line = line.Replace( - $"[{column.Name}]", - resultModel.GetDate(column: column).ToExport( - context: context, - column: column)); - break; - case "Description": - line = line.Replace( - $"[{column.Name}]", - resultModel.GetDescription(column: column).ToExport( - context: context, - column: column)); - break; - case "Check": - line = line.Replace( - $"[{column.Name}]", - resultModel.GetCheck(column: column).ToExport( - context: context, - column: column)); - break; - } - break; - } - }); + line = resultModel.ReplaceLineByResultModel(context, ss, line, dataRow.String("ItemTitle")); break; } return line; diff --git a/Implem.Pleasanter/Libraries/Settings/Script.cs b/Implem.Pleasanter/Libraries/Settings/Script.cs index a69650db8..e62923a5a 100644 --- a/Implem.Pleasanter/Libraries/Settings/Script.cs +++ b/Implem.Pleasanter/Libraries/Settings/Script.cs @@ -16,6 +16,7 @@ public class Script : ISettingListItem public bool? TimeSeries; public bool? Kamban; public bool? ImageLib; + public bool? Disabled; public string Body; public Script() @@ -36,6 +37,7 @@ public Script( bool timeSeries, bool kamban, bool imageLib, + bool disabled, string body) { Id = id; @@ -51,6 +53,7 @@ public Script( TimeSeries = timeSeries; Kamban = kamban; ImageLib = imageLib; + Disabled = disabled; Body = body; } @@ -67,6 +70,7 @@ public void Update( bool timeSeries, bool kamban, bool imageLib, + bool disabled, string body) { Title = title; @@ -81,6 +85,7 @@ public void Update( TimeSeries = timeSeries; Kamban = kamban; ImageLib = imageLib; + Disabled = disabled; Body = body; } @@ -106,6 +111,7 @@ public Script GetRecordingData() if (Kamban == true) script.Kamban = true; if (ImageLib == true) script.ImageLib = true; } + if (Disabled == true) script.Disabled = true; script.Body = Body; return script; } diff --git a/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs b/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs index ad559586e..b41514af1 100644 --- a/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs +++ b/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs @@ -191,6 +191,7 @@ public enum TextAlignTypes : int public SettingList ServerScripts; public SettingList BulkUpdateColumns; public SettingList RelatingColumns; + public SettingList DashboardParts; public string ExtendedHeader; public Versions.AutoVerUpTypes? AutoVerUpType; public bool? AllowEditingComments; @@ -343,6 +344,7 @@ public void Init(Context context) if (ServerScripts == null) ServerScripts = new SettingList(); if (BulkUpdateColumns == null) BulkUpdateColumns = new SettingList(); if (RelatingColumns == null) RelatingColumns = new SettingList(); + if (DashboardParts == null) DashboardParts = new SettingList(); AutoVerUpType = AutoVerUpType ?? Versions.AutoVerUpTypes.Default; AllowEditingComments = AllowEditingComments ?? false; AllowCopy = AllowCopy ?? Parameters.General.AllowCopy; @@ -635,6 +637,21 @@ public bool IsSiteEditor(Context context) } } + public bool IsDashboardEditor(Context context) + { + if (ReferenceType != "Dashboards") + { + return false; + } + switch (context.Action) + { + case "index": + return false; + default: + return true; + } + } + public string RecordingJson(Context context) { return RecordingData(context: context).ToJson(); @@ -1080,6 +1097,14 @@ public SiteSettings RecordingData(Context context) } ss.RelatingColumns.Add(relatingColumn.GetRecordingData()); }); + DashboardParts?.ForEach(dashboards => + { + if(ss.DashboardParts == null) + { + ss.DashboardParts = new SettingList(); + } + ss.DashboardParts.Add(dashboards.GetRecordingData(context: context)); + }); if (!ExtendedHeader.IsNullOrEmpty()) { ss.ExtendedHeader = ExtendedHeader; @@ -1627,7 +1652,10 @@ public SiteSettings RecordingData(Context context) private void UpdateColumnDefinitionHash() { - ColumnDefinitionHash = GetColumnDefinitionHash(ReferenceType); + ColumnDefinitionHash = GetColumnDefinitionHash( + ReferenceType == "Dashboards" + ? "Issues" + : ReferenceType); } private static Dictionary GetColumnDefinitionHash( @@ -2722,10 +2750,12 @@ public Dictionary ViewFilterOptions( return hash; } - public Dictionary ViewSorterOptions(Context context) + public Dictionary ViewSorterOptions( + Context context, + bool currentTableOnly = false) { var hash = new Dictionary(); - JoinOptions().ForEach(join => + JoinOptions(currentTableOnly: currentTableOnly).ForEach(join => { var siteId = ColumnUtilities.GetSiteIdByTableAlias(join.Key, SiteId); var ss = JoinedSsHash.Get(siteId); @@ -5023,7 +5053,8 @@ public string GetStyleBody(Context context, Func peredicate) { return !IsSiteEditor(context: context) ? Styles? - .Where(style => peredicate(style)) + .Where(style =>style.Disabled != true + && peredicate(style)) .Select(o => o.Body).Join("\n") : null; } @@ -5078,7 +5109,8 @@ public string GetScriptBody(Context context, Func peredicate) { return !IsSiteEditor(context: context) ? Scripts? - .Where(script => peredicate(script)) + .Where(script => script.Disabled != true + && peredicate(script)) .Select(o => o.Body).Join("\n") : null; } diff --git a/Implem.Pleasanter/Libraries/Settings/SiteSettingsUtilities.cs b/Implem.Pleasanter/Libraries/Settings/SiteSettingsUtilities.cs index ff364cda0..c903dba70 100644 --- a/Implem.Pleasanter/Libraries/Settings/SiteSettingsUtilities.cs +++ b/Implem.Pleasanter/Libraries/Settings/SiteSettingsUtilities.cs @@ -62,6 +62,7 @@ public static SiteSettings Get(Context context, string referenceType, long siteI switch (referenceType) { case "Sites": return SitesSiteSettings(context: context, siteId: siteId); + case "Dashboards": return DashboardsSiteSettings(context: context, siteId: siteId); case "Issues": return IssuesSiteSettings(context: context, siteId: siteId); case "Results": return ResultsSiteSettings(context: context, siteId: siteId); case "Wikis": return WikisSiteSettings(context: context, siteId: siteId); @@ -86,6 +87,13 @@ public static SiteSettings Get( setSiteIntegration: setSiteIntegration, setAllChoices: setAllChoices, tableType: tableType); + case "Dashboards": return DashboardsSiteSettings( + context: context, + siteModel: siteModel, + referenceId: referenceId, + setSiteIntegration: setSiteIntegration, + setAllChoices: setAllChoices, + tableType: tableType); case "Issues": return IssuesSiteSettings( context: context, siteModel: siteModel, @@ -443,6 +451,57 @@ public static SiteSettings SitesSiteSettings( return ss; } + public static SiteSettings DashboardsSiteSettings( + this SiteModel siteModel, + Context context, + long referenceId, + bool setSiteIntegration = false, + bool setAllChoices = false, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal) + { + var ss = siteModel.SiteSettings ?? new SiteSettings(); + ss.LockedTableTime = siteModel.LockedTime; + ss.LockedTableUser = siteModel.LockedUser; + ss.TableType = tableType; + ss.SiteId = siteModel.SiteId; + ss.ReferenceId = referenceId; + ss.Title = siteModel.Title.Value; + ss.Body = siteModel.Body; + ss.GridGuide = siteModel.GridGuide; + ss.EditorGuide = siteModel.EditorGuide; + ss.CalendarGuide = siteModel.CalendarGuide; + ss.CrosstabGuide = siteModel.CrosstabGuide; + ss.GanttGuide = siteModel.GanttGuide; + ss.BurnDownGuide = siteModel.BurnDownGuide; + ss.TimeSeriesGuide = siteModel.TimeSeriesGuide; + ss.KambanGuide = siteModel.KambanGuide; + ss.ImageLibGuide = siteModel.ImageLibGuide; + ss.ReferenceType = "Dashboards"; + ss.ParentId = siteModel.ParentId; + ss.InheritPermission = siteModel.InheritPermission; + ss.Publish = siteModel.Publish; + ss.AccessStatus = siteModel.AccessStatus; + ss.ApiCount = siteModel.ApiCount; + ss.ApiCountDate = siteModel.ApiCountDate; + ss.Init(context: context); + ss.SetLinkedSiteSettings(context: context); + ss.SetPermissions(context: context, referenceId: referenceId); + if (setSiteIntegration) ss.SetSiteIntegration(context: context); + ss.SetChoiceHash(context: context, all: setAllChoices); + return ss; + } + + public static SiteSettings DashboardsSiteSettings( + Context context, long siteId, bool setAllChoices = false) + { + var ss = new SiteSettings(); + ss.ReferenceType = "Dashboards"; + ss.SiteId = siteId; + ss.Init(context: context); + ss.SetChoiceHash(context: context, all: setAllChoices); + return ss; + } + public static SiteSettings IssuesSiteSettings( this SiteModel siteModel, Context context, diff --git a/Implem.Pleasanter/Libraries/Settings/Style.cs b/Implem.Pleasanter/Libraries/Settings/Style.cs index 1a108d7b8..033474142 100644 --- a/Implem.Pleasanter/Libraries/Settings/Style.cs +++ b/Implem.Pleasanter/Libraries/Settings/Style.cs @@ -16,6 +16,7 @@ public class Style : ISettingListItem public bool? TimeSeries; public bool? Kamban; public bool? ImageLib; + public bool? Disabled; public string Body; public Style() @@ -36,6 +37,7 @@ public Style( bool timeSeries, bool kamban, bool imageLib, + bool disabled, string body) { Id = id; @@ -51,6 +53,7 @@ public Style( TimeSeries = timeSeries; Kamban = kamban; ImageLib = imageLib; + Disabled = disabled; Body = body; } @@ -67,6 +70,7 @@ public void Update( bool timeSeries, bool kamban, bool imageLib, + bool disabled, string body) { Title = title; @@ -81,6 +85,7 @@ public void Update( TimeSeries = timeSeries; Kamban = kamban; ImageLib = imageLib; + Disabled = disabled; Body = body; } @@ -106,6 +111,7 @@ public Style GetRecordingData() if (Kamban == true) style.Kamban = true; if (ImageLib == true) style.ImageLib = true; } + if (Disabled == true) style.Disabled = true; style.Body = Body; return style; } diff --git a/Implem.Pleasanter/Libraries/Settings/TimeLineDisplayType.cs b/Implem.Pleasanter/Libraries/Settings/TimeLineDisplayType.cs new file mode 100644 index 000000000..c705c35c6 --- /dev/null +++ b/Implem.Pleasanter/Libraries/Settings/TimeLineDisplayType.cs @@ -0,0 +1,9 @@ +namespace Implem.Pleasanter.Libraries.Settings +{ + public enum TimeLineDisplayType + { + Simple = 0, + Standard = 1, + Detailed = 2 + } +} diff --git a/Implem.Pleasanter/Libraries/Settings/View.cs b/Implem.Pleasanter/Libraries/Settings/View.cs index 3b760f615..381314030 100644 --- a/Implem.Pleasanter/Libraries/Settings/View.cs +++ b/Implem.Pleasanter/Libraries/Settings/View.cs @@ -11,7 +11,6 @@ using System; using System.Collections.Generic; using System.Data; -using System.Diagnostics; using System.Linq; using System.Runtime.Serialization; namespace Implem.Pleasanter.Libraries.Settings @@ -598,7 +597,8 @@ public void SetByForm( case "ViewSorters": SetSorters( context: context, - ss: ss); + ss: ss, + prefix: prefix); break; case "ViewFilters_UpdateCommand": UpdateCommand = (CommandDisplayTypes)Int( @@ -1071,10 +1071,10 @@ private void AddColumnSorterHash( } } - private void SetSorters(Context context, SiteSettings ss) + private void SetSorters(Context context, SiteSettings ss, string prefix = "") { ColumnSorterHash = new Dictionary(); - context.Forms.List("ViewSorters").ForEach(data => + context.Forms.List($"{prefix}ViewSorters").ForEach(data => { var columnName = data.Split_1st('&'); var type = OrderByType(data.Split_2nd('&')); diff --git a/Implem.Pleasanter/Libraries/SitePackages/PackageSiteModel.cs b/Implem.Pleasanter/Libraries/SitePackages/PackageSiteModel.cs index 3c41fd0a9..1dbc42006 100644 --- a/Implem.Pleasanter/Libraries/SitePackages/PackageSiteModel.cs +++ b/Implem.Pleasanter/Libraries/SitePackages/PackageSiteModel.cs @@ -2,8 +2,10 @@ using Implem.Libraries.Utilities; using Implem.Pleasanter.Libraries.DataTypes; using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Responses; using Implem.Pleasanter.Libraries.Settings; using Implem.Pleasanter.Models; +using Microsoft.AspNetCore.Http.Connections; using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -178,6 +180,26 @@ internal SiteSettings GetSavedSiteSettings( column.ColumnName = ReplaceJoinColumn( header: header, source: column.ColumnName))); + ss.DashboardParts?.ForEach(dashboardPart => + { + dashboardPart.SetSitesData(); + dashboardPart.SiteId = header.GetConvertedId(dashboardPart.SiteId); + foreach (var quickAccessSite in dashboardPart.QuickAccessSitesData) + { + if (long.TryParse(quickAccessSite.Id, out long siteId)) + { + quickAccessSite.Id = header.GetConvertedId(siteId).ToString(); + } + } + dashboardPart.SetQuickAccessSites(); + dashboardPart.TimeLineSitesData = dashboardPart.TimeLineSitesData + ?.Select(s => + long.TryParse(s, out long siteId) + ? header.GetConvertedId(siteId).ToString() + : s) + .ToList(); + dashboardPart.SetTimeLineSites(); + }); ss.Views?.ForEach(view => { if (view.GridColumns?.Any() == true) diff --git a/Implem.Pleasanter/Libraries/SitePackages/SitePackage.cs b/Implem.Pleasanter/Libraries/SitePackages/SitePackage.cs index 04035882b..5e15e3933 100644 --- a/Implem.Pleasanter/Libraries/SitePackages/SitePackage.cs +++ b/Implem.Pleasanter/Libraries/SitePackages/SitePackage.cs @@ -162,7 +162,7 @@ private void Construct( } if (includeSitePermission || includeRecordPermission) { - var packagePermissionModel = new PackagePermissionModel( + var packagePermissionModel = GetPackagePermissionModel( context: context, siteModel: siteModel, view: view, @@ -174,6 +174,29 @@ private void Construct( } } + private static PackagePermissionModel GetPackagePermissionModel( + Context context, + SiteModel siteModel, + View view, + bool includeSitePermission, + bool includeRecordPermission) + { + switch (siteModel.ReferenceType) + { + case "Dashboards": + includeRecordPermission = false; + break; + default: + break; + } + return new PackagePermissionModel( + context: context, + siteModel: siteModel, + view: view, + includeSitePermission: includeSitePermission, + includeRecordPermission: includeRecordPermission); + } + public class Header { public string AssemblyVersion; diff --git a/Implem.Pleasanter/Libraries/SitePackages/Utilities.cs b/Implem.Pleasanter/Libraries/SitePackages/Utilities.cs index 54fc11aaa..5a6c179fa 100644 --- a/Implem.Pleasanter/Libraries/SitePackages/Utilities.cs +++ b/Implem.Pleasanter/Libraries/SitePackages/Utilities.cs @@ -330,6 +330,10 @@ public static string ImportSitePackage( var packagePermissionModel = sitePackage.Permissions .Where(e => e.SiteId == conv.SiteId) .FirstOrDefault(); + if (packagePermissionModel == null) + { + continue; + } foreach (var permissionShortModel in packagePermissionModel.Permissions) { if (includeSitePermission == false) diff --git a/Implem.Pleasanter/Models/Dashboards/DashboardApiModel.cs b/Implem.Pleasanter/Models/Dashboards/DashboardApiModel.cs new file mode 100644 index 000000000..5a4535ad5 --- /dev/null +++ b/Implem.Pleasanter/Models/Dashboards/DashboardApiModel.cs @@ -0,0 +1,46 @@ +using Implem.Pleasanter.Models.Shared; +using System; +using System.Collections.Generic; +namespace Implem.Pleasanter.Models +{ + [Serializable] + public class DashboardApiModel : _BaseApiModel + { + public long? SiteId { get; set; } + public DateTime? UpdatedTime { get; set; } + public long? DashboardId { get; set; } + public int? Ver { get; set; } + public string Title { get; set; } + public string Body { get; set; } + public bool? Locked { get; set; } + public string Comments { get; set; } + public int? Creator { get; set; } + public int? Updator { get; set; } + public DateTime? CreatedTime { get; set; } + public string ItemTitle { get; set; } + public int? ProcessId { get; set; } + + public DashboardApiModel() + { + } + + public override object ObjectValue(string columnName) + { + switch (columnName) + { + case "SiteId": return SiteId; + case "UpdatedTime": return UpdatedTime; + case "DashboardId": return DashboardId; + case "Ver": return Ver; + case "Title": return Title; + case "Body": return Body; + case "Locked": return Locked; + case "Comments": return Comments; + case "Creator": return Creator; + case "Updator": return Updator; + case "CreatedTime": return CreatedTime; + default: return base.ObjectValue(columnName: columnName); + } + } + } +} diff --git a/Implem.Pleasanter/Models/Dashboards/DashboardCollection.cs b/Implem.Pleasanter/Models/Dashboards/DashboardCollection.cs new file mode 100644 index 000000000..33e6babb0 --- /dev/null +++ b/Implem.Pleasanter/Models/Dashboards/DashboardCollection.cs @@ -0,0 +1,144 @@ +using Implem.DefinitionAccessor; +using Implem.Libraries.Classes; +using Implem.Libraries.DataSources.SqlServer; +using Implem.Libraries.Utilities; +using Implem.Pleasanter.Libraries.DataSources; +using Implem.Pleasanter.Libraries.DataTypes; +using Implem.Pleasanter.Libraries.Html; +using Implem.Pleasanter.Libraries.HtmlParts; +using Implem.Pleasanter.Libraries.Models; +using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Responses; +using Implem.Pleasanter.Libraries.Security; +using Implem.Pleasanter.Libraries.Server; +using Implem.Pleasanter.Libraries.Settings; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +namespace Implem.Pleasanter.Models +{ + [Serializable] + public class DashboardCollection : List + { + [NonSerialized] + public Databases.AccessStatuses AccessStatus = Databases.AccessStatuses.Initialized; + public int TotalCount; + public DashboardCollection( + Context context, + SiteSettings ss, + SqlColumnCollection column = null, + SqlJoinCollection join = null, + SqlWhereCollection where = null, + SqlOrderByCollection orderBy = null, + SqlParamCollection param = null, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + bool distinct = false, + int top = 0, + int offset = 0, + int pageSize = 0, + bool get = true, + List formDataSet = null) + { + if (get) + { + Set( + context: context, + ss: ss, + dataRows: Get( + context: context, + ss: ss, + column: column, + join: join, + where: where, + orderBy: orderBy, + param: param, + tableType: tableType, + distinct: distinct, + top: top, + offset: offset, + pageSize: pageSize), + formDataSet: formDataSet); + } + } + public DashboardCollection( + Context context, + SiteSettings ss, + EnumerableRowCollection dataRows, + List formDataSet = null) + { + Set( + context: context, + ss: ss, + dataRows: dataRows, + formDataSet: formDataSet); + } + private DashboardCollection Set( + Context context, + SiteSettings ss, + EnumerableRowCollection dataRows, + List formDataSet = null) + { + if (dataRows.Any()) + { + foreach (DataRow dataRow in dataRows) + { + Add(new DashboardModel( + context: context, + ss: ss, + dataRow: dataRow, + formData: formDataSet?.FirstOrDefault(o => + o.Id == dataRow.Long("DashboardId"))?.Data)); + } + AccessStatus = Databases.AccessStatuses.Selected; + } + else + { + AccessStatus = Databases.AccessStatuses.NotFound; + } + return this; + } + + private EnumerableRowCollection Get( + Context context, + SiteSettings ss, + SqlColumnCollection column = null, + SqlJoinCollection join = null, + SqlWhereCollection where = null, + SqlOrderByCollection orderBy = null, + SqlParamCollection param = null, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + bool distinct = false, + int top = 0, + int offset = 0, + int pageSize = 0) + { + var statements = new List + { + Rds.SelectDashboards( + dataTableName: "Main", + column: column ?? Rds.DashboardsDefaultColumns(), + join: join ?? Rds.DashboardsJoinDefault(), + where: where, + orderBy: orderBy, + param: param, + tableType: tableType, + distinct: distinct, + top: top, + offset: offset, + pageSize: pageSize), + Rds.SelectCount( + tableName: "Dashboards", + tableType: tableType, + join: join ?? Rds.DashboardsJoinDefault(), + where: where) + }; + var dataSet = Repository.ExecuteDataSet( + context: context, + transactional: false, + statements: statements.ToArray()); + TotalCount = Rds.Count(dataSet); + return dataSet.Tables["Main"].AsEnumerable(); + } + } +} diff --git a/Implem.Pleasanter/Models/Dashboards/DashboardModel.cs b/Implem.Pleasanter/Models/Dashboards/DashboardModel.cs new file mode 100644 index 000000000..59af7a08a --- /dev/null +++ b/Implem.Pleasanter/Models/Dashboards/DashboardModel.cs @@ -0,0 +1,2355 @@ +using Implem.DefinitionAccessor; +using Implem.Libraries.Classes; +using Implem.Libraries.DataSources.SqlServer; +using Implem.Libraries.Utilities; +using Implem.Pleasanter.Libraries.DataSources; +using Implem.Pleasanter.Libraries.DataTypes; +using Implem.Pleasanter.Libraries.Extensions; +using Implem.Pleasanter.Libraries.General; +using Implem.Pleasanter.Libraries.Html; +using Implem.Pleasanter.Libraries.HtmlParts; +using Implem.Pleasanter.Libraries.Models; +using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Responses; +using Implem.Pleasanter.Libraries.Security; +using Implem.Pleasanter.Libraries.Server; +using Implem.Pleasanter.Libraries.ServerScripts; +using Implem.Pleasanter.Libraries.Settings; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using static Implem.Pleasanter.Libraries.ServerScripts.ServerScriptModel; +namespace Implem.Pleasanter.Models +{ + [Serializable] + public class DashboardModel : BaseItemModel + { + public long DashboardId = 0; + public bool Locked = false; + + public TitleBody TitleBody + { + get + { + return new TitleBody(DashboardId, Ver, VerType == Versions.VerTypes.History, Title.Value, Title.DisplayValue, Body); + } + } + + public long SavedDashboardId = 0; + public bool SavedLocked = false; + + public bool Locked_Updated(Context context, bool copy = false, Column column = null) + { + if (copy && column?.CopyByDefault == true) + { + return column.GetDefaultInput(context: context).ToBool() != Locked; + } + return Locked != SavedLocked + && (column == null + || column.DefaultInput.IsNullOrEmpty() + || column.GetDefaultInput(context: context).ToBool() != Locked); + } + + public string PropertyValue(Context context, Column column) + { + switch (column?.ColumnName) + { + case "SiteId": return SiteId.ToString(); + case "UpdatedTime": return UpdatedTime.Value.ToString(); + case "DashboardId": return DashboardId.ToString(); + case "Ver": return Ver.ToString(); + case "Title": return Title.Value; + case "Body": return Body; + case "TitleBody": return TitleBody.ToString(); + case "Locked": return Locked.ToString(); + case "Comments": return Comments.ToJson(); + case "Creator": return Creator.Id.ToString(); + case "Updator": return Updator.Id.ToString(); + case "CreatedTime": return CreatedTime.Value.ToString(); + case "VerUp": return VerUp.ToString(); + case "Timestamp": return Timestamp; + default: return GetValue( + context: context, + column: column); + } + } + + public string SavedPropertyValue(Context context, Column column) + { + switch (column?.ColumnName) + { + case "SiteId": return SavedSiteId.ToString(); + case "UpdatedTime": return SavedUpdatedTime.ToString(); + case "DashboardId": return SavedDashboardId.ToString(); + case "Ver": return SavedVer.ToString(); + case "Title": return SavedTitle; + case "Body": return SavedBody; + case "Locked": return SavedLocked.ToString(); + case "Comments": return SavedComments; + case "Creator": return SavedCreator.ToString(); + case "Updator": return SavedUpdator.ToString(); + case "CreatedTime": return SavedCreatedTime.ToString(); + default: return GetSavedValue( + context: context, + column: column); + } + } + + public Dictionary PropertyValues(Context context, List columns) + { + var hash = new Dictionary(); + columns? + .Where(column => column != null) + .ForEach(column => + { + switch (column.ColumnName) + { + case "SiteId": + hash.Add("SiteId", SiteId.ToString()); + break; + case "UpdatedTime": + hash.Add("UpdatedTime", UpdatedTime.Value.ToString()); + break; + case "DashboardId": + hash.Add("DashboardId", DashboardId.ToString()); + break; + case "Ver": + hash.Add("Ver", Ver.ToString()); + break; + case "Title": + hash.Add("Title", Title.Value); + break; + case "Body": + hash.Add("Body", Body); + break; + case "TitleBody": + hash.Add("TitleBody", TitleBody.ToString()); + break; + case "Locked": + hash.Add("Locked", Locked.ToString()); + break; + case "Comments": + hash.Add("Comments", Comments.ToJson()); + break; + case "Creator": + hash.Add("Creator", Creator.Id.ToString()); + break; + case "Updator": + hash.Add("Updator", Updator.Id.ToString()); + break; + case "CreatedTime": + hash.Add("CreatedTime", CreatedTime.Value.ToString()); + break; + case "VerUp": + hash.Add("VerUp", VerUp.ToString()); + break; + case "Timestamp": + hash.Add("Timestamp", Timestamp); + break; + default: + hash.Add(column.ColumnName, GetValue( + context: context, + column: column)); + break; + } + }); + return hash; + } + + public bool PropertyUpdated(Context context, string name) + { + switch (name) + { + case "SiteId": return SiteId_Updated(context: context); + case "Ver": return Ver_Updated(context: context); + case "Title": return Title_Updated(context: context); + case "Body": return Body_Updated(context: context); + case "Locked": return Locked_Updated(context: context); + case "Comments": return Comments_Updated(context: context); + case "Creator": return Creator_Updated(context: context); + case "Updator": return Updator_Updated(context: context); + default: + switch (Def.ExtendedColumnTypes.Get(name ?? string.Empty)) + { + case "Class": return Class_Updated(name); + case "Num": return Num_Updated(name); + case "Date": return Date_Updated(name); + case "Description": return Description_Updated(name); + case "Check": return Check_Updated(name); + case "Attachments": return Attachments_Updated(name); + } + break; + } + return false; + } + + public List SwitchTargets; + + public DashboardModel() + { + } + + public DashboardModel( + Context context, + SiteSettings ss, + Dictionary formData = null, + DashboardApiModel dashboardApiModel = null, + MethodTypes methodType = MethodTypes.NotSet) + { + OnConstructing(context: context); + SiteId = ss.SiteId; + if (formData != null) + { + SetByForm( + context: context, + ss: ss, + formData: formData); + } + if (dashboardApiModel != null) + { + SetByApi(context: context, ss: ss, data: dashboardApiModel); + } + MethodType = methodType; + OnConstructed(context: context); + } + + public DashboardModel( + Context context, + SiteSettings ss, + long dashboardId, + bool setCopyDefault = false, + Dictionary formData = null, + DashboardApiModel dashboardApiModel = null, + SqlColumnCollection column = null, + bool clearSessions = false, + List switchTargets = null, + MethodTypes methodType = MethodTypes.NotSet) + { + OnConstructing(context: context); + DashboardId = dashboardId; + SiteId = ss.SiteId; + if (context.QueryStrings.ContainsKey("ver")) + { + Get( + context: context, + tableType: Sqls.TableTypes.NormalAndHistory, + column: column, + where: Rds.DashboardsWhereDefault( + context: context, + dashboardModel: this) + .Dashboards_Ver(context.QueryStrings.Int("ver")), ss: ss); + } + else + { + Get( + context: context, + ss: ss, + column: column); + } + if (clearSessions) ClearSessions(context: context); + if (formData != null) + { + SetByForm( + context: context, + ss: ss, + formData: formData); + } + if (dashboardApiModel != null) + { + SetByApi(context: context, ss: ss, data: dashboardApiModel); + } + if (SavedLocked) + { + ss.SetLockedRecord( + context: context, + time: UpdatedTime, + user: Updator); + } + SwitchTargets = switchTargets; + MethodType = methodType; + OnConstructed(context: context); + } + + public DashboardModel( + Context context, + SiteSettings ss, + DataRow dataRow, + Dictionary formData = null, + string tableAlias = null) + { + OnConstructing(context: context); + if (dataRow != null) + { + Set( + context: context, + ss: ss, + dataRow: dataRow, + tableAlias: tableAlias); + } + if (formData != null) + { + SetByForm( + context: context, + ss: ss, + formData: formData); + } + OnConstructed(context: context); + } + + private void OnConstructing(Context context) + { + } + + private void OnConstructed(Context context) + { + } + + public void ClearSessions(Context context) + { + } + + public DashboardModel Get( + Context context, + SiteSettings ss, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + SqlColumnCollection column = null, + SqlJoinCollection join = null, + SqlWhereCollection where = null, + SqlOrderByCollection orderBy = null, + SqlParamCollection param = null, + bool distinct = false, + int top = 0) + { + where = where ?? Rds.DashboardsWhereDefault( + context: context, + dashboardModel: this); + column = (column ?? Rds.DashboardsEditorColumns(ss)); + join = join ?? Rds.DashboardsJoinDefault(); + Set(context, ss, Repository.ExecuteTable( + context: context, + statements: Rds.SelectDashboards( + tableType: tableType, + column: column, + join: join, + where: where, + orderBy: orderBy, + param: param, + distinct: distinct, + top: top))); + return this; + } + + public DashboardApiModel GetByApi(Context context, SiteSettings ss) + { + var data = new DashboardApiModel() + { + ApiVersion = context.ApiVersion + }; + ss.ReadableColumns(context: context, noJoined: true).ForEach(column => + { + switch (column.ColumnName) + { + case "SiteId": data.SiteId = SiteId; break; + case "UpdatedTime": data.UpdatedTime = UpdatedTime.Value.ToLocal(context: context); break; + case "DashboardId": data.DashboardId = DashboardId; break; + case "Ver": data.Ver = Ver; break; + case "Title": data.Title = Title.Value; break; + case "Body": data.Body = Body; break; + case "Locked": data.Locked = Locked; break; + case "Creator": data.Creator = Creator.Id; break; + case "Updator": data.Updator = Updator.Id; break; + case "CreatedTime": data.CreatedTime = CreatedTime.Value.ToLocal(context: context); break; + case "Comments": data.Comments = Comments.ToLocal(context: context).ToJson(); break; + default: + data.Value( + context: context, + column: column, + value: GetValue( + context: context, + column: column, + toLocal: true)); + break; + } + }); + data.ItemTitle = Title.DisplayValue; + return data; + } + + public string ToValue(Context context, SiteSettings ss, Column column, List mine) + { + if (!ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine)) + { + return string.Empty; + } + return PropertyValue( + context: context, + column: column); + } + + public string ToDisplay(Context context, SiteSettings ss, Column column, List mine) + { + if (!ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine)) + { + return string.Empty; + } + switch (column.Name) + { + case "DashboardId": + return DashboardId.ToDisplay( + context: context, + ss: ss, + column: column); + case "Title": + return Title.ToDisplay( + context: context, + ss: ss, + column: column); + case "Body": + return Body.ToDisplay( + context: context, + ss: ss, + column: column); + case "Locked": + return Locked.ToDisplay( + context: context, + ss: ss, + column: column); + case "Timestamp": + return Timestamp.ToDisplay( + context: context, + ss: ss, + column: column); + case "TitleBody": + return TitleBody.ToDisplay( + context: context, + ss: ss, + column: column); + case "Ver": + return Ver.ToDisplay( + context: context, + ss: ss, + column: column); + case "Comments": + return Comments.ToDisplay( + context: context, + ss: ss, + column: column); + case "Creator": + return Creator.ToDisplay( + context: context, + ss: ss, + column: column); + case "Updator": + return Updator.ToDisplay( + context: context, + ss: ss, + column: column); + case "CreatedTime": + return CreatedTime.ToDisplay( + context: context, + ss: ss, + column: column); + case "UpdatedTime": + return UpdatedTime.ToDisplay( + context: context, + ss: ss, + column: column); + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return GetClass(columnName: column.Name).ToDisplay( + context: context, + ss: ss, + column: column); + case "Num": + return GetNum(columnName: column.Name).ToDisplay( + context: context, + ss: ss, + column: column); + case "Date": + return GetDate(columnName: column.Name).ToDisplay( + context: context, + ss: ss, + column: column); + case "Description": + return GetDescription(columnName: column.Name).ToDisplay( + context: context, + ss: ss, + column: column); + case "Check": + return GetCheck(columnName: column.Name).ToDisplay( + context: context, + ss: ss, + column: column); + case "Attachments": + return GetAttachments(columnName: column.Name).ToDisplay( + context: context, + ss: ss, + column: column); + default: + return string.Empty; + } + } + } + + public object ToApiDisplayValue(Context context, SiteSettings ss, Column column, List mine) + { + if (!ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine)) + { + return string.Empty; + } + switch (column.Name) + { + case "SiteId": + return SiteId.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "UpdatedTime": + return UpdatedTime.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "DashboardId": + return DashboardId.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Ver": + return Ver.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Title": + return Title.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Body": + return Body.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "TitleBody": + return TitleBody.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Locked": + return Locked.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Comments": + return Comments.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Creator": + return Creator.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Updator": + return Updator.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "CreatedTime": + return CreatedTime.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "VerUp": + return VerUp.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Timestamp": + return Timestamp.ToApiDisplayValue( + context: context, + ss: ss, + column: column); + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return GetClass(columnName: column.Name).ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Num": + return GetNum(columnName: column.Name).ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Date": + return GetDate(columnName: column.Name).ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Description": + return GetDescription(columnName: column.Name).ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Check": + return GetCheck(columnName: column.Name).ToApiDisplayValue( + context: context, + ss: ss, + column: column); + case "Attachments": + return GetAttachments(columnName: column.Name).ToApiDisplayValue( + context: context, + ss: ss, + column: column); + default: + return string.Empty; + } + } + } + + public object ToApiValue(Context context, SiteSettings ss, Column column, List mine) + { + if (!ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine)) + { + return string.Empty; + } + switch (column.Name) + { + case "SiteId": + return SiteId.ToApiValue( + context: context, + ss: ss, + column: column); + case "UpdatedTime": + return UpdatedTime.ToApiValue( + context: context, + ss: ss, + column: column); + case "DashboardId": + return DashboardId.ToApiValue( + context: context, + ss: ss, + column: column); + case "Ver": + return Ver.ToApiValue( + context: context, + ss: ss, + column: column); + case "Title": + return Title.ToApiValue( + context: context, + ss: ss, + column: column); + case "Body": + return Body.ToApiValue( + context: context, + ss: ss, + column: column); + case "TitleBody": + return TitleBody.ToApiValue( + context: context, + ss: ss, + column: column); + case "Locked": + return Locked.ToApiValue( + context: context, + ss: ss, + column: column); + case "Comments": + return Comments.ToApiValue( + context: context, + ss: ss, + column: column); + case "Creator": + return Creator.ToApiValue( + context: context, + ss: ss, + column: column); + case "Updator": + return Updator.ToApiValue( + context: context, + ss: ss, + column: column); + case "CreatedTime": + return CreatedTime.ToApiValue( + context: context, + ss: ss, + column: column); + case "VerUp": + return VerUp.ToApiValue( + context: context, + ss: ss, + column: column); + case "Timestamp": + return Timestamp.ToApiValue( + context: context, + ss: ss, + column: column); + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return GetClass(columnName: column.Name).ToApiValue( + context: context, + ss: ss, + column: column); + case "Num": + return GetNum(columnName: column.Name).ToApiValue( + context: context, + ss: ss, + column: column); + case "Date": + return GetDate(columnName: column.Name).ToApiValue( + context: context, + ss: ss, + column: column); + case "Description": + return GetDescription(columnName: column.Name).ToApiValue( + context: context, + ss: ss, + column: column); + case "Check": + return GetCheck(columnName: column.Name).ToApiValue( + context: context, + ss: ss, + column: column); + case "Attachments": + return GetAttachments(columnName: column.Name).ToApiValue( + context: context, + ss: ss, + column: column); + default: + return string.Empty; + } + } + } + + public string FullText( + Context context, + SiteSettings ss, + bool backgroundTask = false, + bool onCreating = false) + { + if (!Parameters.Search.CreateIndexes && !backgroundTask) return null; + if (AccessStatus == Databases.AccessStatuses.NotFound) return null; + var fullText = new System.Text.StringBuilder(); + if (ss.FullTextIncludeBreadcrumb == true) + { + SiteInfo.TenantCaches + .Get(context.TenantId)? + .SiteMenu.Breadcrumb( + context: context, + siteId: SiteId) + .FullText( + context: context, + fullText: fullText); + } + if (ss.FullTextIncludeSiteId == true) + { + fullText.Append($" {ss.SiteId}"); + } + if (ss.FullTextIncludeSiteTitle == true) + { + fullText.Append($" {ss.Title}"); + } + ss.GetEditorColumnNames( + context: context, + columnOnly: true) + .Select(columnName => ss.GetColumn( + context: context, + columnName: columnName)) + .ForEach(column => + { + switch (column.ColumnName) + { + case "DashboardId": + DashboardId.FullText( + context: context, + column: column, + fullText: fullText); + break; + case "Title": + Title.FullText( + context: context, + column: column, + fullText: fullText); + break; + case "Body": + Body.FullText( + context: context, + column: column, + fullText: fullText); + break; + case "Comments": + Comments.FullText( + context: context, + column: column, + fullText: fullText); + break; + default: + BaseFullText( + context: context, + column: column, + fullText: fullText); + break; + } + }); + Creator.FullText( + context, + column: ss.GetColumn( + context: context, + columnName: "Creator"), + fullText); + Updator.FullText( + context, + column: ss.GetColumn( + context: context, + columnName: "Updator"), + fullText); + CreatedTime.FullText( + context, + column: ss.GetColumn( + context: context, + columnName: "CreatedTime"), + fullText); + UpdatedTime.FullText( + context, + column: ss.GetColumn( + context: context, + columnName: "UpdatedTime"), + fullText); + if (!onCreating) + { + FullTextExtensions.OutgoingMailsFullText( + context: context, + ss: ss, + fullText: fullText, + referenceType: "Dashboards", + referenceId: DashboardId); + } + return fullText + .ToString() + .Replace(" ", " ") + .Replace("\r", " ") + .Replace("\n", " ") + .Split(' ') + .Select(o => o.Trim()) + .Where(o => o != string.Empty) + .Distinct() + .Join(" "); + } + + public ErrorData Create( + Context context, + SiteSettings ss, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + SqlParamCollection param = null, + List processes = null, + long copyFrom = 0, + bool extendedSqls = true, + bool synchronizeSummary = true, + bool forceSynchronizeSourceSummary = false, + bool notice = false, + string noticeType = "Created", + bool otherInitValue = false, + bool get = true) + { + var statements = new List(); + if (extendedSqls) + { + statements.OnCreatingExtendedSqls( + context: context, + siteId: SiteId); + } + statements.AddRange(CreateStatements( + context: context, + ss: ss, + tableType: tableType, + param: param, + otherInitValue: otherInitValue)); + var response = Repository.ExecuteScalar_response( + context: context, + transactional: true, + selectIdentity: true, + statements: statements.ToArray()); + DashboardId = (response.Id ?? DashboardId).ToLong(); + if (context.ContractSettings.Notice != false && notice) + { + SetTitle( + context: context, + ss: ss); + Notice( + context: context, + ss: ss, + notifications: GetNotifications( + context: context, + ss: ss, + notice: notice), + type: noticeType); + processes? + .Where(process => process.MatchConditions) + .ForEach(process => + process?.Notifications?.ForEach(notification => + notification.Send( + context: context, + ss: ss, + title: ReplacedDisplayValues( + context: context, + ss: ss, + value: notification.Subject), + body: ReplacedDisplayValues( + context: context, + ss: ss, + value: notification.Body), + values: ss.IncludedColumns(notification.Address) + .ToDictionary( + column => column, + column => PropertyValue( + context: context, + column: column))))); + } + if (get) Get(context: context, ss: ss); + var fullText = FullText(context, ss: ss, onCreating: true); + statements = new List(); + statements.Add(Rds.UpdateItems( + param: Rds.ItemsParam() + .Title(Title.DisplayValue) + .FullText(fullText, _using: fullText != null) + .SearchIndexCreatedTime(DateTime.Now, _using: fullText != null), + where: Rds.ItemsWhere().ReferenceId(DashboardId))); + statements.Add(BinaryUtilities.UpdateReferenceId( + context: context, + ss: ss, + referenceId: DashboardId, + values: fullText)); + if (extendedSqls) + { + statements.OnCreatedExtendedSqls( + context: context, + siteId: SiteId, + id: DashboardId); + } + Repository.ExecuteNonQuery( + context: context, + transactional: true, + statements: statements.ToArray()); + if (get && Rds.ExtendedSqls( + context: context, + siteId: SiteId, + id: DashboardId) + ?.Any(o => o.OnCreated) == true) + { + Get( + context: context, + ss: ss); + } + return new ErrorData(type: Error.Types.None); + } + + public List CreateStatements( + Context context, + SiteSettings ss, + string dataTableName = null, + Sqls.TableTypes tableType = Sqls.TableTypes.Normal, + SqlParamCollection param = null, + bool otherInitValue = false) + { + var statements = new List(); + statements.AddRange(new List + { + Rds.InsertItems( + dataTableName: dataTableName, + selectIdentity: true, + param: Rds.ItemsParam() + .ReferenceType("Dashboards") + .SiteId(SiteId) + .Title(Title.DisplayValue)), + Rds.InsertDashboards( + dataTableName: dataTableName, + tableType: tableType, + param: param ?? Rds.DashboardsParamDefault( + context: context, + ss: ss, + dashboardModel: this, + setDefault: true, + otherInitValue: otherInitValue)), + }); + return statements; + } + + public ErrorData Update( + Context context, + SiteSettings ss, + List processes = null, + bool extendedSqls = true, + bool synchronizeSummary = true, + bool forceSynchronizeSourceSummary = false, + bool notice = false, + string previousTitle = null, + SqlParamCollection param = null, + List additionalStatements = null, + bool otherInitValue = false, + bool setBySession = true, + bool get = true, + bool checkConflict = true) + { + var notifications = GetNotifications( + context: context, + ss: ss, + notice: notice, + before: true); + if (setBySession) + { + SetBySession(context: context); + } + var statements = new List(); + if (extendedSqls) + { + statements.OnUpdatingExtendedSqls( + context: context, + siteId: SiteId, + id: DashboardId, + timestamp: Timestamp.ToDateTime()); + } + var verUp = Versions.VerUp( + context: context, + ss: ss, + verUp: VerUp); + statements.AddRange(UpdateStatements( + context: context, + ss: ss, + param: param, + otherInitValue: otherInitValue, + additionalStatements: additionalStatements, + checkConflict: checkConflict, + verUp: verUp)); + var response = Repository.ExecuteScalar_response( + context: context, + transactional: true, + statements: statements.ToArray()); + if (response.Event == "Conflicted") + { + return new ErrorData( + type: Error.Types.UpdateConflicts, + id: DashboardId); + } + if (context.ContractSettings.Notice != false && notice) + { + Notice( + context: context, + ss: ss, + notifications: NotificationUtilities.MeetConditions( + ss: ss, + before: notifications, + after: GetNotifications( + context: context, + ss: ss, + notice: notice)), + type: "Updated"); + processes? + .Where(process => process.MatchConditions) + .ForEach(process => + process?.Notifications?.ForEach(notification => + notification.Send( + context: context, + ss: ss, + title: ReplacedDisplayValues( + context: context, + ss: ss, + value: notification.Subject), + body: ReplacedDisplayValues( + context: context, + ss: ss, + value: notification.Body), + values: ss.IncludedColumns(notification.Address) + .ToDictionary( + column => column, + column => PropertyValue( + context: context, + column: column))))); + } + if (get) + { + Get(context: context, ss: ss); + } + UpdateRelatedRecords( + context: context, + ss: ss, + extendedSqls: extendedSqls, + previousTitle: previousTitle, + get: get, + addUpdatedTimeParam: true, + addUpdatorParam: true, + updateItems: true); + return new ErrorData(type: Error.Types.None); + } + + public List UpdateStatements( + Context context, + SiteSettings ss, + string dataTableName = null, + SqlParamCollection param = null, + bool otherInitValue = false, + List additionalStatements = null, + bool checkConflict = true, + bool verUp = false) + { + var timestamp = Timestamp.ToDateTime(); + var statements = new List(); + var where = Rds.DashboardsWhereDefault( + context: context, + dashboardModel: this) + .UpdatedTime(timestamp, _using: timestamp.InRange() && checkConflict); + if (verUp) + { + statements.Add(Rds.DashboardsCopyToStatement( + where: where, + tableType: Sqls.TableTypes.History, + ColumnNames())); + Ver++; + } + statements.AddRange(UpdateStatements( + context: context, + ss: ss, + dataTableName: dataTableName, + where: where, + param: param, + otherInitValue: otherInitValue)); + if (ss.PermissionForUpdating?.Any() == true) + { + statements.AddRange(PermissionUtilities.UpdateStatements( + context: context, + ss: ss, + referenceId: DashboardId, + columns: ss.Columns + .Where(o => o.Type != Column.Types.Normal) + .ToDictionary( + o => $"{o.ColumnName},{o.Type}", + o => (o.MultipleSelections == true + ? PropertyValue( + context: context, + column: o)?.Deserialize>() + : PropertyValue( + context: context, + column: o)?.ToInt().ToSingleList()) ?? new List()), + permissions: ss.PermissionForUpdating)); + } + else if (RecordPermissions != null) + { + statements.UpdatePermissions( + context: context, + ss: ss, + referenceId: DashboardId, + permissions: RecordPermissions); + } + if (additionalStatements?.Any() == true) + { + statements.AddRange(additionalStatements); + } + return statements; + } + + private List UpdateStatements( + Context context, + SiteSettings ss, + string dataTableName = null, + SqlWhereCollection where = null, + SqlParamCollection param = null, + bool otherInitValue = false) + { + return new List + { + Rds.UpdateDashboards( + dataTableName: dataTableName, + where: where, + param: param ?? Rds.DashboardsParamDefault( + context: context, + ss: ss, + dashboardModel: this, + otherInitValue: otherInitValue)), + new SqlStatement(Def.Sql.IfConflicted.Params(DashboardId)) + { + DataTableName = dataTableName, + IfConflicted = true, + Id = DashboardId + } + }; + } + + public void UpdateRelatedRecords( + Context context, + SiteSettings ss, + bool extendedSqls = false, + bool get = false, + string previousTitle = null, + bool addUpdatedTimeParam = true, + bool addUpdatorParam = true, + bool updateItems = true) + { + Repository.ExecuteNonQuery( + context: context, + transactional: true, + statements: UpdateRelatedRecordsStatements( + context: context, + ss: ss, + extendedSqls: extendedSqls, + addUpdatedTimeParam: addUpdatedTimeParam, + addUpdatorParam: addUpdatorParam, + updateItems: updateItems) + .ToArray()); + var titleUpdated = Title_Updated(context: context); + if (get && Rds.ExtendedSqls( + context: context, + siteId: SiteId, + id: DashboardId) + ?.Any(o => o.OnUpdated) == true) + { + Get( + context: context, + ss: ss); + } + if (previousTitle != null + && previousTitle != Title.DisplayValue + && ss.Sources?.Any() == true) + { + ItemUtilities.UpdateSourceTitles( + context: context, + ss: ss, + siteIdList: new List() { ss.SiteId }, + idList: DashboardId.ToSingleList()); + } + } + + public List UpdateRelatedRecordsStatements( + Context context, + SiteSettings ss, + bool extendedSqls = false, + bool addUpdatedTimeParam = true, + bool addUpdatorParam = true, + bool updateItems = true) + { + var fullText = FullText(context, ss: ss); + var statements = new List(); + statements.Add(Rds.UpdateItems( + where: Rds.ItemsWhere().ReferenceId(DashboardId), + param: Rds.ItemsParam() + .SiteId(SiteId) + .Title(Title.DisplayValue) + .FullText(fullText, _using: fullText != null) + .SearchIndexCreatedTime(DateTime.Now, _using: fullText != null), + addUpdatedTimeParam: addUpdatedTimeParam, + addUpdatorParam: addUpdatorParam, + _using: updateItems)); + if (extendedSqls) + { + statements.OnUpdatedExtendedSqls( + context: context, + siteId: SiteId, + id: DashboardId); + } + return statements; + } + + public ErrorData UpdateOrCreate( + Context context, + SiteSettings ss, + string dataTableName = null, + SqlWhereCollection where = null, + SqlParamCollection param = null) + { + SetBySession(context: context); + var statements = new List + { + Rds.InsertItems( + dataTableName: dataTableName, + selectIdentity: true, + param: Rds.ItemsParam() + .ReferenceType("Dashboards") + .SiteId(SiteId) + .Title(Title.DisplayValue)), + Rds.UpdateOrInsertDashboards( + where: where ?? Rds.DashboardsWhereDefault( + context: context, + dashboardModel: this), + param: param ?? Rds.DashboardsParamDefault( + context: context, + ss: ss, + dashboardModel: this, + setDefault: true)) + }; + var response = Repository.ExecuteScalar_response( + context: context, + transactional: true, + selectIdentity: true, + statements: statements.ToArray()); + DashboardId = (response.Id ?? DashboardId).ToLong(); + Get(context: context, ss: ss); + return new ErrorData(type: Error.Types.None); + } + + public ErrorData Delete(Context context, SiteSettings ss, bool notice = false) + { + var notifications = context.ContractSettings.Notice != false && notice + ? GetNotifications( + context: context, + ss: ss, + notice: notice) + : null; + var statements = new List(); + var where = Rds.DashboardsWhere().SiteId(SiteId).DashboardId(DashboardId); + statements.OnDeletingExtendedSqls( + context: context, + siteId: SiteId, + id: DashboardId); + statements.AddRange(new List + { + Rds.DeleteItems( + factory: context, + where: Rds.ItemsWhere().ReferenceId(DashboardId)), + Rds.DeleteBinaries( + factory: context, + where: Rds.BinariesWhere() + .TenantId(context.TenantId) + .ReferenceId(DashboardId) + .BinaryType( + value: "Images", + _operator: "<>", + _using: ss.DeleteImageWhenDeleting == false)), + Rds.DeleteDashboards( + factory: context, + where: where) + }); + statements.OnDeletedExtendedSqls( + context: context, + siteId: SiteId, + id: DashboardId); + Repository.ExecuteNonQuery( + context: context, + transactional: true, + statements: statements.ToArray()); + if (context.ContractSettings.Notice != false && notice) + { + Notice( + context: context, + ss: ss, + notifications: notifications, + type: "Deleted"); + } + return new ErrorData(type: Error.Types.None); + } + + public ErrorData Restore(Context context, SiteSettings ss,long dashboardId) + { + DashboardId = dashboardId; + Repository.ExecuteNonQuery( + context: context, + connectionString: Parameters.Rds.OwnerConnectionString, + transactional: true, + statements: new SqlStatement[] + { + Rds.RestoreItems( + factory: context, + where: Rds.ItemsWhere().ReferenceId(DashboardId)), + Rds.RestoreDashboards( + factory: context, + where: Rds.DashboardsWhere().DashboardId(DashboardId)) + }); + return new ErrorData(type: Error.Types.None); + } + + public ErrorData PhysicalDelete( + Context context, SiteSettings ss,Sqls.TableTypes tableType = Sqls.TableTypes.Normal) + { + Repository.ExecuteNonQuery( + context: context, + transactional: true, + statements: Rds.PhysicalDeleteDashboards( + tableType: tableType, + param: Rds.DashboardsParam().SiteId(SiteId).DashboardId(DashboardId))); + return new ErrorData(type: Error.Types.None); + } + + public void SetByForm( + Context context, + SiteSettings ss, + Dictionary formData) + { + formData.ForEach(data => + { + var key = data.Key; + var value = data.Value ?? string.Empty; + switch (key) + { + case "Dashboards_Title": Title = new Title(DashboardId, value); break; + case "Dashboards_Body": Body = value.ToString(); break; + case "Dashboards_Locked": Locked = value.ToBool(); break; + case "Dashboards_Timestamp": Timestamp = value.ToString(); break; + case "Comments": Comments.Prepend( + context: context, + ss: ss, + body: value); break; + case "VerUp": VerUp = value.ToBool(); break; + default: + if (key.RegexExists("Comment[0-9]+")) + { + Comments.Update( + context: context, + ss: ss, + commentId: key.Substring("Comment".Length).ToInt(), + body: value); + } + else + { + var column = ss.GetColumn( + context: context, + columnName: key.Split_2nd('_')); + switch (Def.ExtendedColumnTypes.Get(column?.ColumnName ?? string.Empty)) + { + case "Class": + SetClass( + columnName: column.ColumnName, + value: value); + break; + case "Num": + SetNum( + columnName: column.ColumnName, + value: new Num( + context: context, + column: column, + value: value)); + break; + case "Date": + SetDate( + columnName: column.ColumnName, + value: value.ToDateTime().ToUniversal(context: context)); + break; + case "Description": + SetDescription( + columnName: column.ColumnName, + value: value); + break; + case "Check": + SetCheck( + columnName: column.ColumnName, + value: value.ToBool()); + break; + case "Attachments": + SetAttachments( + columnName: column.ColumnName, + value: value.Deserialize()); + break; + } + } + break; + } + }); + if (context.QueryStrings.ContainsKey("ver")) + { + Ver = context.QueryStrings.Int("ver"); + } + SetByFormula(context: context, ss: ss); + SetChoiceHash(context: context, ss: ss); + if (context.Action == "deletecomment") + { + DeleteCommentId = formData.Get("ControlId")? + .Split(',') + ._2nd() + .ToInt() ?? 0; + Comments.RemoveAll(o => o.CommentId == DeleteCommentId); + } + } + + public DashboardModel CopyAndInit( + Context context, + SiteSettings ss) + { + return new DashboardModel( + context: context, + ss: ss, + methodType: MethodTypes.New); + } + + public void SetByModel(DashboardModel dashboardModel) + { + SiteId = dashboardModel.SiteId; + UpdatedTime = dashboardModel.UpdatedTime; + Title = dashboardModel.Title; + Body = dashboardModel.Body; + Locked = dashboardModel.Locked; + Comments = dashboardModel.Comments; + Creator = dashboardModel.Creator; + Updator = dashboardModel.Updator; + CreatedTime = dashboardModel.CreatedTime; + VerUp = dashboardModel.VerUp; + Comments = dashboardModel.Comments; + ClassHash = dashboardModel.ClassHash; + NumHash = dashboardModel.NumHash; + DateHash = dashboardModel.DateHash; + DescriptionHash = dashboardModel.DescriptionHash; + CheckHash = dashboardModel.CheckHash; + AttachmentsHash = dashboardModel.AttachmentsHash; + } + + public void SetByApi(Context context, SiteSettings ss, DashboardApiModel data) + { + if (data.Title != null) Title = new Title(data.DashboardId.ToLong(), data.Title); + if (data.Body != null) Body = data.Body.ToString().ToString(); + if (data.Locked != null) Locked = data.Locked.ToBool().ToBool(); + if (data.Comments != null) Comments.Prepend(context: context, ss: ss, body: data.Comments); + if (data.VerUp != null) VerUp = data.VerUp.ToBool(); + data.ClassHash?.ForEach(o => SetClass( + columnName: o.Key, + value: o.Value)); + data.NumHash?.ForEach(o => SetNum( + columnName: o.Key, + value: new Num( + context: context, + column: ss.GetColumn( + context: context, + columnName: o.Key), + value: o.Value.ToString()))); + data.DateHash?.ForEach(o => SetDate( + columnName: o.Key, + value: o.Value.ToDateTime().ToUniversal(context: context))); + data.DescriptionHash?.ForEach(o => SetDescription( + columnName: o.Key, + value: o.Value)); + data.CheckHash?.ForEach(o => SetCheck( + columnName: o.Key, + value: o.Value)); + data.AttachmentsHash?.ForEach(o => + { + string columnName = o.Key; + Attachments newAttachments = o.Value; + Attachments oldAttachments; + if (columnName == "Attachments#Uploading") + { + var kvp = AttachmentsHash + .FirstOrDefault(x => x.Value + .Any(att => att.Guid == newAttachments.FirstOrDefault()?.Guid?.Split_1st())); + columnName = kvp.Key; + oldAttachments = kvp.Value; + var column = ss.GetColumn( + context: context, + columnName: columnName); + if (column.OverwriteSameFileName == true) + { + var oldAtt = oldAttachments + .FirstOrDefault(att => att.Guid == newAttachments.FirstOrDefault()?.Guid?.Split_1st()); + if (oldAtt != null) + { + oldAtt.Deleted = true; + oldAtt.Overwritten = true; + } + } + newAttachments.ForEach(att => att.Guid = att.Guid.Split_2nd()); + } + else + { + oldAttachments = AttachmentsHash.Get(columnName); + } + if (oldAttachments != null) + { + var column = ss.GetColumn( + context: context, + columnName: columnName); + var newGuidSet = new HashSet(newAttachments.Select(x => x.Guid).Distinct()); + var newNameSet = new HashSet(newAttachments.Select(x => x.Name).Distinct()); + newAttachments.ForEach(newAttachment => + { + newAttachment.AttachmentAction( + context: context, + column: column, + oldAttachments: oldAttachments); + }); + if (column.OverwriteSameFileName == true) + { + newAttachments.AddRange(oldAttachments. + Where((oldvalue) => + !newGuidSet.Contains(oldvalue.Guid) && + !newNameSet.Contains(oldvalue.Name))); + } + else + { + newAttachments.AddRange(oldAttachments. + Where((oldvalue) => !newGuidSet.Contains(oldvalue.Guid))); + } + } + SetAttachments(columnName: columnName, value: newAttachments); + }); + SetByFormula(context: context, ss: ss); + SetChoiceHash(context: context, ss: ss); + } + + public void UpdateFormulaColumns( + Context context, SiteSettings ss, IEnumerable selected = null) + { + SetByFormula(context: context, ss: ss); + var param = Rds.DashboardsParam(); + ss.Formulas? + .Where(o => selected == null || selected.Contains(o.Id)) + .ForEach(formulaSet => + { + switch (formulaSet.Target) + { + default: + if (Def.ExtendedColumnTypes.ContainsKey(formulaSet.Target ?? string.Empty)) + { + param.Add( + columnBracket: $"\"{formulaSet.Target}\"", + name: formulaSet.Target, + value: GetNum(formulaSet.Target).Value); + } + break; + } + }); + Repository.ExecuteNonQuery( + context: context, + statements: Rds.UpdateDashboards( + param: param, + where: Rds.DashboardsWhereDefault( + context: context, + dashboardModel: this), + addUpdatedTimeParam: false, + addUpdatorParam: false)); + } + + public void SetByFormula(Context context, SiteSettings ss) + { + SetByBeforeFormulaServerScript( + context: context, + ss: ss); + ss.Formulas?.ForEach(formulaSet => + { + var columnName = formulaSet.Target; + var formula = formulaSet.Formula; + var view = ss.Views?.Get(formulaSet.Condition); + if (view != null && !Matched(context: context, ss: ss, view: view)) + { + if (formulaSet.OutOfCondition != null) + { + formula = formulaSet.OutOfCondition; + } + else + { + return; + } + } + var data = new Dictionary + { + }; + data.AddRange(NumHash.ToDictionary( + o => o.Key, + o => o.Value?.Value?.ToDecimal() ?? 0)); + var value = formula?.GetResult( + data: data, + column: ss.GetColumn( + context: context, + columnName: columnName)) ?? 0; + switch (columnName) + { + default: + SetNum( + columnName: columnName, + value: new Num(value)); + break; + } + if (ss.OutputFormulaLogs == true) + { + context.LogBuilder?.AppendLine($"formulaSet: {formulaSet.GetRecordingData().ToJson()}"); + context.LogBuilder?.AppendLine($"formulaSource: {data.ToJson()}"); + context.LogBuilder?.AppendLine($"formulaResult: {{\"{columnName}\":{value}}}"); + } + }); + SetByAfterFormulaServerScript( + context: context, + ss: ss); + } + + public void SetTitle(Context context, SiteSettings ss) + { + if (Title?.ItemTitle != true) + { + Title = new Title( + context: context, + ss: ss, + id: DashboardId, + ver: Ver, + isHistory: VerType == Versions.VerTypes.History, + data: PropertyValues( + context: context, + columns: ss.GetTitleColumns(context: context))); + } + } + + private bool Matched(Context context, SiteSettings ss, View view) + { + if (view.ColumnFilterHash != null) + { + foreach (var filter in view.ColumnFilterHash) + { + var match = true; + var column = ss.GetColumn(context: context, columnName: filter.Key); + switch (filter.Key) + { + case "UpdatedTime": + match = UpdatedTime?.Value.Matched( + context: context, + column: column, + condition: filter.Value) == true; + break; + case "DashboardId": + match = DashboardId.Matched( + column: column, + condition: filter.Value); + break; + case "Ver": + match = Ver.Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "Title": + match = Title.Value.Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "Body": + match = Body.Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "Locked": + match = Locked.Matched( + column: column, + condition: filter.Value); + break; + case "Creator": + match = Creator.Id.Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "Updator": + match = Updator.Id.Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "CreatedTime": + match = CreatedTime?.Value.Matched( + context: context, + column: column, + condition: filter.Value) == true; + break; + default: + switch (Def.ExtendedColumnTypes.Get(filter.Key ?? string.Empty)) + { + case "Class": + match = GetClass(column: column).Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "Num": + match = GetNum(column: column).Matched( + column: column, + condition: filter.Value); + break; + case "Date": + match = GetDate(column: column).Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "Description": + match = GetDescription(column: column).Matched( + context: context, + column: column, + condition: filter.Value); + break; + case "Check": + match = GetCheck(column: column).Matched( + column: column, + condition: filter.Value); + break; + } + break; + } + if (!match) return false; + } + } + return true; + } + + public string ReplacedDisplayValues( + Context context, + SiteSettings ss, + string value) + { + ss.IncludedColumns(value: value).ForEach(column => + value = value.Replace( + $"[{column.ColumnName}]", + ToDisplay( + context: context, + ss: ss, + column: column, + mine: Mine(context: context)))); + value = ReplacedContextValues(context, value); + return value; + } + + private string ReplacedContextValues(Context context, string value) + { + var url = Locations.ItemEditAbsoluteUri( + context: context, + id: DashboardId); + var mailAddress = MailAddressUtilities.Get( + context: context, + userId: context.UserId); + value = value + .Replace("{Url}", url) + .Replace("{LoginId}", context.User.LoginId) + .Replace("{UserName}", context.User.Name) + .Replace("{MailAddress}", mailAddress); + return value; + } + + public List GetNotifications( + Context context, + SiteSettings ss, + bool notice, + bool before = false, + Sqls.TableTypes tableTypes = Sqls.TableTypes.Normal) + { + if (context.ContractSettings.Notice == false || !notice) + { + return null; + } + var notifications = NotificationUtilities.Get( + context: context, + ss: ss); + if (notifications?.Any() == true) + { + var dataSet = Repository.ExecuteDataSet( + context: context, + statements: notifications.Select(notification => + { + var where = ss.Views?.Get(before + ? notification.BeforeCondition + : notification.AfterCondition) + ?.Where( + context: context, + ss: ss, + where: Rds.DashboardsWhere().DashboardId(DashboardId)) + ?? Rds.DashboardsWhere().DashboardId(DashboardId); + return Rds.SelectDashboards( + dataTableName: notification.Index.ToString(), + tableType: tableTypes, + column: Rds.DashboardsColumn().DashboardId(), + join: ss.Join( + context: context, + join: where), + where: where); + }).ToArray()); + return notifications + .Where(notification => + dataSet.Tables[notification.Index.ToString()].Rows.Count == 1) + .ToList(); + } + else + { + return null; + } + } + + public void Notice( + Context context, + SiteSettings ss, + List notifications, + string type) + { + notifications?.ForEach(notification => + { + if (notification.HasRelatedUsers()) + { + var users = new List(); + Repository.ExecuteTable( + context: context, + statements: Rds.SelectDashboards( + tableType: Sqls.TableTypes.All, + distinct: true, + column: Rds.DashboardsColumn() + .Creator() + .Updator(), + where: Rds.DashboardsWhere().DashboardId(DashboardId))) + .AsEnumerable() + .ForEach(dataRow => + { + users.Add(dataRow.Int("Creator")); + users.Add(dataRow.Int("Updator")); + }); + notification.ReplaceRelatedUsers( + context: context, + users: users); + } + var values = ss.IncludedColumns(notification.Address) + .ToDictionary( + column => column, + column => PropertyValue( + context: context, + column: column)); + switch (type) + { + case "Created": + case "Copied": + if ((type == "Created" && notification.AfterCreate != false) + || (type == "Copied" && notification.AfterCopy != false)) + { + notification.Send( + context: context, + ss: ss, + title: notification.Subject.IsNullOrEmpty() + ? Displays.Created( + context: context, + data: Title.DisplayValue).ToString() + : ReplacedDisplayValues( + context: context, + ss: ss, + value: notification.Subject.Replace( + "[NotificationTrigger]", + Displays.CreatedWord(context: context))), + body: NoticeBody( + context: context, + ss: ss, + notification: notification), + values: values); + } + break; + case "Updated": + if (notification.AfterUpdate != false + && notification.MonitorChangesColumns.Any(columnName => PropertyUpdated( + context: context, + name: columnName))) + { + var body = NoticeBody( + context: context, + ss: ss, + notification: notification, + update: true); + notification.Send( + context: context, + ss: ss, + title: notification.Subject.IsNullOrEmpty() + ? Displays.Updated( + context: context, + data: Title.DisplayValue).ToString() + : ReplacedDisplayValues( + context: context, + ss: ss, + value: notification.Subject.Replace( + "[NotificationTrigger]", + Displays.UpdatedWord(context: context))), + body: body, + values: values); + } + break; + case "Deleted": + if (notification.AfterDelete != false) + { + notification.Send( + context: context, + ss: ss, + title: notification.Subject.IsNullOrEmpty() + ? Displays.Deleted( + context: context, + data: Title.DisplayValue).ToString() + : ReplacedDisplayValues( + context: context, + ss: ss, + value: notification.Subject.Replace( + "[NotificationTrigger]", + Displays.DeletedWord(context: context))), + body: NoticeBody( + context: context, + ss: ss, + notification: notification), + values: values); + } + break; + } + }); + } + + private string NoticeBody( + Context context, + SiteSettings ss, + Notification notification, + bool update = false) + { + var body = new System.Text.StringBuilder(); + notification.GetFormat( + context: context, + ss: ss) + .Split('\n') + .Select(line => new + { + Line = line.Trim(), + Format = line.Trim().Deserialize() + }) + .ForEach(data => + { + var column = ss.IncludedColumns(data.Format?.Name)?.FirstOrDefault(); + if (column == null) + { + body.Append(ReplacedContextValues( + context: context, + value: data.Line)); + body.Append("\n"); + } + else + { + switch (column.Name) + { + case "Title": + body.Append(Title.ToNotice( + context: context, + saved: SavedTitle, + column: column, + notificationColumnFormat: data.Format, + updated: Title_Updated(context: context), + update: update)); + break; + case "Body": + body.Append(Body.ToNotice( + context: context, + saved: SavedBody, + column: column, + notificationColumnFormat: data.Format, + updated: Body_Updated(context: context), + update: update)); + break; + case "Locked": + body.Append(Locked.ToNotice( + context: context, + saved: SavedLocked, + column: column, + notificationColumnFormat: data.Format, + updated: Locked_Updated(context: context), + update: update)); + break; + case "Comments": + body.Append(Comments.ToNotice( + context: context, + saved: SavedComments, + column: column, + notificationColumnFormat: data.Format, + updated: Comments_Updated(context: context), + update: update)); + break; + case "Creator": + body.Append(Creator.ToNotice( + context: context, + saved: SavedCreator, + column: column, + notificationColumnFormat: data.Format, + updated: Creator_Updated(context: context), + update: update)); + break; + case "Updator": + body.Append(Updator.ToNotice( + context: context, + saved: SavedUpdator, + column: column, + notificationColumnFormat: data.Format, + updated: Updator_Updated(context: context), + update: update)); + break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + body.Append(GetClass(columnName: column.Name).ToNotice( + context: context, + saved: GetSavedClass(columnName: column.Name), + column: column, + notificationColumnFormat: data.Format, + updated: Class_Updated(columnName: column.Name), + update: update)); + break; + case "Num": + body.Append(GetNum(columnName: column.Name).ToNotice( + context: context, + saved: GetSavedNum(columnName: column.Name), + column: column, + notificationColumnFormat: data.Format, + updated: Num_Updated(columnName: column.Name), + update: update)); + break; + case "Date": + body.Append(GetDate(columnName: column.Name).ToNotice( + context: context, + saved: GetSavedDate(columnName: column.Name), + column: column, + notificationColumnFormat: data.Format, + updated: Date_Updated(columnName: column.Name), + update: update)); + break; + case "Description": + body.Append(GetDescription(columnName: column.Name).ToNotice( + context: context, + saved: GetSavedDescription(columnName: column.Name), + column: column, + notificationColumnFormat: data.Format, + updated: Description_Updated(columnName: column.Name), + update: update)); + break; + case "Check": + body.Append(GetCheck(columnName: column.Name).ToNotice( + context: context, + saved: GetSavedCheck(columnName: column.Name), + column: column, + notificationColumnFormat: data.Format, + updated: Check_Updated(columnName: column.Name), + update: update)); + break; + case "Attachments": + body.Append(GetAttachments(columnName: column.Name).ToNotice( + context: context, + saved: GetSavedAttachments(columnName: column.Name), + column: column, + notificationColumnFormat: data.Format, + updated: Attachments_Updated(columnName: column.Name), + update: update)); + break; + } + break; + } + } + }); + return body.ToString(); + } + + private void SetBySession(Context context) + { + } + + private void Set(Context context, SiteSettings ss, DataTable dataTable) + { + switch (dataTable.Rows.Count) + { + case 1: Set(context, ss, dataTable.Rows[0]); break; + case 0: AccessStatus = Databases.AccessStatuses.NotFound; break; + default: AccessStatus = Databases.AccessStatuses.Overlap; break; + } + SetChoiceHash(context: context, ss: ss); + } + + public void SetChoiceHash(Context context, SiteSettings ss) + { + if (!ss.SetAllChoices) + { + ss.GetUseSearchLinks(context: context).ForEach(link => + { + var column = ss.GetColumn( + context: context, + columnName: link.ColumnName); + var value = PropertyValue( + context: context, + column: column); + if (!value.IsNullOrEmpty() + && column?.ChoiceHash?.Any(o => o.Value.Value == value) != true) + { + ss.SetChoiceHash( + context: context, + columnName: column.ColumnName, + selectedValues: value.ToSingleList()); + } + }); + } + SetTitle(context: context, ss: ss); + } + + private void Set(Context context, SiteSettings ss, DataRow dataRow, string tableAlias = null) + { + AccessStatus = Databases.AccessStatuses.Selected; + foreach (DataColumn dataColumn in dataRow.Table.Columns) + { + var column = new ColumnNameInfo(dataColumn.ColumnName); + if (column.TableAlias == tableAlias) + { + switch (column.Name) + { + case "SiteId": + if (dataRow[column.ColumnName] != DBNull.Value) + { + SiteId = dataRow[column.ColumnName].ToLong(); + SavedSiteId = SiteId; + } + break; + case "UpdatedTime": + if (dataRow[column.ColumnName] != DBNull.Value) + { + UpdatedTime = new Time(context, dataRow, column.ColumnName); Timestamp = dataRow.Field(column.ColumnName).ToString("yyyy/M/d H:m:s.fff"); + SavedUpdatedTime = UpdatedTime.Value; + } + break; + case "DashboardId": + if (dataRow[column.ColumnName] != DBNull.Value) + { + DashboardId = dataRow[column.ColumnName].ToLong(); + SavedDashboardId = DashboardId; + } + break; + case "Ver": + Ver = dataRow[column.ColumnName].ToInt(); + SavedVer = Ver; + break; + case "Title": + Title = new Title(context: context, ss: ss, dataRow: dataRow, column: column); + SavedTitle = Title.Value; + break; + case "Body": + Body = dataRow[column.ColumnName].ToString(); + SavedBody = Body; + break; + case "Locked": + Locked = dataRow[column.ColumnName].ToBool(); + SavedLocked = Locked; + break; + case "Comments": + Comments = dataRow[column.ColumnName].ToString().Deserialize() ?? new Comments(); + SavedComments = Comments.ToJson(); + break; + case "Creator": + Creator = SiteInfo.User(context: context, userId: dataRow.Int(column.ColumnName)); + SavedCreator = Creator.Id; + break; + case "Updator": + Updator = SiteInfo.User(context: context, userId: dataRow.Int(column.ColumnName)); + SavedUpdator = Updator.Id; + break; + case "CreatedTime": + CreatedTime = new Time(context, dataRow, column.ColumnName); + SavedCreatedTime = CreatedTime.Value; + break; + case "IsHistory": + VerType = dataRow.Bool(column.ColumnName) + ? Versions.VerTypes.History + : Versions.VerTypes.Latest; break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + SetClass( + columnName: column.Name, + value: dataRow[column.ColumnName].ToString()); + SetSavedClass( + columnName: column.Name, + value: GetClass(columnName: column.Name)); + break; + case "Num": + SetNum( + columnName: column.Name, + value: new Num( + dataRow: dataRow, + name: column.ColumnName)); + SetSavedNum( + columnName: column.Name, + value: GetNum(columnName: column.Name).Value); + break; + case "Date": + SetDate( + columnName: column.Name, + value: dataRow[column.ColumnName].ToDateTime()); + SetSavedDate( + columnName: column.Name, + value: GetDate(columnName: column.Name)); + break; + case "Description": + SetDescription( + columnName: column.Name, + value: dataRow[column.ColumnName].ToString()); + SetSavedDescription( + columnName: column.Name, + value: GetDescription(columnName: column.Name)); + break; + case "Check": + SetCheck( + columnName: column.Name, + value: dataRow[column.ColumnName].ToBool()); + SetSavedCheck( + columnName: column.Name, + value: GetCheck(columnName: column.Name)); + break; + case "Attachments": + SetAttachments( + columnName: column.Name, + value: dataRow[column.ColumnName].ToString() + .Deserialize() ?? new Attachments()); + SetSavedAttachments( + columnName: column.Name, + value: GetAttachments(columnName: column.Name).ToJson()); + break; + } + break; + } + } + } + } + + public bool Updated(Context context) + { + return Updated() + || SiteId_Updated(context: context) + || Ver_Updated(context: context) + || Title_Updated(context: context) + || Body_Updated(context: context) + || Locked_Updated(context: context) + || Comments_Updated(context: context) + || Creator_Updated(context: context) + || Updator_Updated(context: context); + } + + public override List Mine(Context context) + { + if (MineCache == null) + { + var mine = new List(); + var userId = context.UserId; + if (SavedCreator == userId) mine.Add("Creator"); + if (SavedUpdator == userId) mine.Add("Updator"); + MineCache = mine; + } + return MineCache; + } + + public string IdSuffix() + { + return $"_{SiteId}_{(DashboardId == 0 ? -1 : DashboardId)}"; + } + } +} diff --git a/Implem.Pleasanter/Models/Dashboards/DashboardUtilities.cs b/Implem.Pleasanter/Models/Dashboards/DashboardUtilities.cs new file mode 100644 index 000000000..662239358 --- /dev/null +++ b/Implem.Pleasanter/Models/Dashboards/DashboardUtilities.cs @@ -0,0 +1,1968 @@ +using Implem.DefinitionAccessor; +using Implem.Libraries.Classes; +using Implem.Libraries.DataSources.Interfaces; +using Implem.Libraries.DataSources.SqlServer; +using Implem.Libraries.Utilities; +using Implem.Pleasanter.Libraries.DataSources; +using Implem.Pleasanter.Libraries.DataTypes; +using Implem.Pleasanter.Libraries.Extensions; +using Implem.Pleasanter.Libraries.General; +using Implem.Pleasanter.Libraries.Html; +using Implem.Pleasanter.Libraries.HtmlParts; +using Implem.Pleasanter.Libraries.Models; +using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Resources; +using Implem.Pleasanter.Libraries.Responses; +using Implem.Pleasanter.Libraries.Security; +using Implem.Pleasanter.Libraries.Server; +using Implem.Pleasanter.Libraries.Settings; +using Implem.Pleasanter.Libraries.Web; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Web; +using static Implem.Pleasanter.Libraries.ServerScripts.ServerScriptModel; +namespace Implem.Pleasanter.Models +{ + public static class DashboardUtilities + { + /// + /// Fixed: + /// + public static string Index(Context context, SiteSettings ss) + { + var hb = new HtmlBuilder(); + var view = Views.GetBySession( + context: context, + ss: ss); + var gridData = GetGridData( + context: context, + ss: ss, + view: view); + var viewMode = ViewModes.GetSessionData( + context: context, + siteId: ss.SiteId); + var serverScriptModelRow = ss.GetServerScriptModelRow( + context: context, + view: view, + gridData: gridData); + return hb.ViewModeTemplate( + context: context, + ss: ss, + view: view, + viewMode: viewMode, + serverScriptModelRow: serverScriptModelRow, + viewModeBody: () => hb.Div(css: "grid-stack")); + } + + /// + /// Fixed: + /// + private static string ViewModeTemplate( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + View view, + string viewMode, + ServerScriptModelRow serverScriptModelRow, + Action viewModeBody) + { + var invalid = DashboardValidators.OnEntry( + context: context, + ss: ss); + switch (invalid.Type) + { + case Error.Types.None: break; + default: + return HtmlTemplates.Error( + context: context, + errorData: invalid); + } + var dashboardPartLayouts = ss.DashboardParts + .Where(dashboardPart => dashboardPart + .Accessable( + context: context, + ss: ss)) + .Select(dashboardPart => + { + dashboardPart.SetSitesData(); + switch (dashboardPart.Type) + { + case DashboardPartType.QuickAccess: + return QuickAccessLayout( + context: context, + dashboardPart: dashboardPart); + case DashboardPartType.TimeLine: + return TimeLineLayout( + context: context, + ss: ss, + dashboardPart: dashboardPart); + case DashboardPartType.Custom: + return CustomLayouyt( + context: context, + dashboardPart: dashboardPart); + case DashboardPartType.CustomHtml: + return CustomHtmlLayouyt( + context: context, + dashboardPart: dashboardPart); + default: + return new DashboardPartLayout(); + }; + }).ToJson(); + var siteModel = new SiteModel( + context: context, + siteId: ss.SiteId); + return hb.Template( + context: context, + ss: ss, + view: view, + siteId: ss.SiteId, + parentId: ss.ParentId, + referenceType: "Dashboards", + script: JavaScripts.ViewMode(viewMode), + userScript: ss.ViewModeScripts(context: context), + userStyle: ss.ViewModeStyles(context: context), + serverScriptModelRow: serverScriptModelRow, + action: () => hb + .Form( + attributes: new HtmlAttributes() + .Id("MainForm") + .Class("main-form") + .Action(Locations.Action( + context: context, + controller: context.Controller, + id: ss.SiteId)), + action: () => hb + .Div(id: "ViewModeContainer", action: () => viewModeBody()) + .MainCommands( + context: context, + ss: ss, + view: view, + verType: Versions.VerTypes.Latest, + backButton: !context.Publish, + serverScriptModelRow: serverScriptModelRow) + .Div(css: "margin-bottom") + .Hidden( + controlId: "BaseUrl", + value: Locations.BaseUrl(context: context)) + .Hidden( + controlId: "DashboardPartLayouts", + value: dashboardPartLayouts) + .Hidden( + controlId: "Sites_Timestamp", + css: "control-hidden always-send", + value: siteModel.Timestamp)) + .Div(attributes: new HtmlAttributes() + .Id("ExportSitePackageDialog") + .Class("dialog") + .Title(Displays.ExportSitePackage(context: context)))) + .ToString(); + } + + public static string IndexJson(Context context, SiteSettings ss) + { + var view = Views.GetBySession( + context: context, + ss: ss); + var gridData = GetGridData( + context: context, + ss: ss, + view: view); + var serverScriptModelRow = ss.GetServerScriptModelRow( + context: context, + view: view, + gridData: gridData); + var body = new HtmlBuilder().Grid( + context: context, + ss: ss, + gridData: gridData, + view: view, + serverScriptModelRow: serverScriptModelRow); + return new ResponseCollection(context: context) + .ViewMode( + context: context, + ss: ss, + view: view, + invoke: "setGrid", + editOnGrid: context.Forms.Bool("EditOnGrid"), + serverScriptModelRow: serverScriptModelRow, + body: body) + .Events("on_grid_load") + .ToJson(); + } + + private static GridData GetGridData( + Context context, SiteSettings ss, View view, int offset = 0) + { + return new GridData( + context: context, + ss: ss, + view: view, + offset: offset, + pageSize: ss.GridPageSize.ToInt()); + } + + private static HtmlBuilder Grid( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + GridData gridData, + View view, + string action = "GridRows", + ServerScriptModelRow serverScriptModelRow = null) + { + var columns = ss.GetGridColumns( + context: context, + view: view, + checkPermission: true); + return hb + .Table( + attributes: new HtmlAttributes() + .Id("Grid") + .Class(ss.GridCss(context: context)) + .DataValue("back", _using: ss?.IntegratedSites?.Any() == true) + .DataAction(action) + .DataMethod("post"), + action: () => hb + .GridRows( + context: context, + ss: ss, + gridData: gridData, + columns: columns, + view: view, + serverScriptModelRow: serverScriptModelRow, + action: action)) + .GridHeaderMenus( + context: context, + ss: ss, + view: view, + columns: columns) + .Hidden( + controlId: "GridOffset", + value: ss.GridNextOffset( + 0, + gridData.DataRows.Count(), + gridData.TotalCount) + .ToString()) + .Hidden( + controlId: "GridRowIds", + value: gridData.DataRows.Select(g => g.Long("DashboardId")).ToJson()) + .Hidden( + controlId: "GridColumns", + value: columns.Select(o => o.ColumnName).ToJson()) + .Button( + controlId: "ViewSorters_Reset", + controlCss: "hidden", + action: action, + method: "post"); + } + + public static string GridRows( + Context context, + SiteSettings ss, + int offset = 0, + bool windowScrollTop = false, + bool clearCheck = false, + string action = "GridRows", + Message message = null) + { + var view = Views.GetBySession(context: context, ss: ss); + var gridData = GetGridData( + context: context, + ss: ss, + view: view, + offset: offset); + var columns = ss.GetGridColumns( + context: context, + view: view, + checkPermission: true); + return new ResponseCollection(context: context) + .WindowScrollTop(_using: windowScrollTop) + .Remove(".grid tr", _using: offset == 0) + .ClearFormData("GridOffset") + .ClearFormData("GridCheckAll", _using: clearCheck) + .ClearFormData("GridUnCheckedItems", _using: clearCheck) + .ClearFormData("GridCheckedItems", _using: clearCheck) + .CloseDialog(_using: offset == 0) + .ReplaceAll("#CopyDirectUrlToClipboard", new HtmlBuilder() + .CopyDirectUrlToClipboard( + context: context, + view: view)) + .ReplaceAll( + "#Aggregations", + new HtmlBuilder().Aggregations( + context: context, + ss: ss, + view: view), + _using: offset == 0) + .ReplaceAll( + "#ViewFilters", + new HtmlBuilder() + .ViewFilters( + context: context, + ss: ss, + view: view), + _using: context.Forms.ControlId().StartsWith("ViewFiltersOnGridHeader__")) + .Append("#Grid", new HtmlBuilder().GridRows( + context: context, + ss: ss, + gridData: gridData, + columns: columns, + view: view, + offset: offset, + clearCheck: clearCheck, + action: action)) + .Val("#GridOffset", ss.GridNextOffset( + offset, + gridData.DataRows.Count(), + gridData.TotalCount)) + .Val("#GridRowIds", gridData.DataRows.Select(g => g.Long("DashboardId")).ToJson()) + .Val("#GridColumns", columns.Select(o => o.ColumnName).ToJson()) + .Paging("#Grid") + .Message(message) + .Messages(context.Messages) + .ToJson(); + } + + private static HtmlBuilder GridRows( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + GridData gridData, + List columns, + View view, + int offset = 0, + bool clearCheck = false, + string action = "GridRows", + ServerScriptModelRow serverScriptModelRow = null) + { + var checkRow = ss.CheckRow( + context: context, + gridColumns: view.GridColumns); + var checkAll = clearCheck + ? false + : context.Forms.Bool("GridCheckAll"); + return hb + .THead( + _using: offset == 0, + action: () => hb + .GridHeader( + context: context, + ss: ss, + columns: columns, + view: view, + checkRow: checkRow, + checkAll: checkAll, + action: action, + serverScriptModelRow: serverScriptModelRow)) + .TBody(action: () => hb + .GridRows( + context: context, + ss: ss, + view: view, + dataRows: gridData.DataRows, + columns: columns, + checkRow: checkRow)); + } + + private static SqlWhereCollection SelectedWhere( + Context context, + SiteSettings ss) + { + var selector = new RecordSelector(context: context); + return !selector.Nothing + ? Rds.DashboardsWhere().DashboardId_In( + value: selector.Selected.Select(o => o.ToLong()), + negative: selector.All) + : null; + } + + private static SqlWhereCollection SelectedWhereByApi( + SiteSettings ss, + RecordSelector recordSelector) + { + return !recordSelector.Nothing + ? Rds.DashboardsWhere().DashboardId_In( + value: recordSelector.Selected?.Select(o => o.ToLong()) ?? new List(), + negative: recordSelector.All) + : null; + } + + public static string ReloadRow(Context context, SiteSettings ss, long dashboardId) + { + var view = Views.GetBySession( + context: context, + ss: ss); + var dataRow = new GridData( + context: context, + ss: ss, + view: view, + tableType: Sqls.TableTypes.Normal, + where: Rds.DashboardsWhere().DashboardId(dashboardId)) + .DataRows + .FirstOrDefault(); + var res = ItemUtilities.ClearItemDataResponse( + context: context, + ss: ss, + id: dashboardId); + return dataRow == null + ? res + .Remove($"[data-id=\"{dashboardId}\"][data-latest]") + .Message( + message: Messages.NotFound(context: context), + target: "row_" + dashboardId) + .Messages(context.Messages) + .ToJson() + : res + .ReplaceAll( + $"[data-id=\"{dataRow.Long("DashboardId")}\"][data-latest]", + new HtmlBuilder().Tr( + context: context, + ss: ss, + view: view, + dataRow: dataRow, + columns: ss.GetGridColumns( + context: context, + view: view, + checkPermission: true), + recordSelector: null, + editRow: true, + checkRow: false, + idColumn: "DashboardId")) + .Messages(context.Messages) + .ToJson(); + } + + public static string TrashBox(Context context, SiteSettings ss) + { + var hb = new HtmlBuilder(); + var view = Views.GetBySession(context: context, ss: ss); + var gridData = GetGridData(context: context, ss: ss, view: view); + var viewMode = ViewModes.GetSessionData( + context: context, + siteId: ss.SiteId); + var serverScriptModelRow = ss.GetServerScriptModelRow( + context: context, + view: view, + gridData: gridData); + return hb.ViewModeTemplate( + context: context, + ss: ss, + view: view, + viewMode: viewMode, + serverScriptModelRow: serverScriptModelRow, + viewModeBody: () => hb + .TrashBoxCommands(context: context, ss: ss) + .Grid( + context: context, + ss: ss, + gridData: gridData, + view: view, + action: "TrashBoxGridRows", + serverScriptModelRow: serverScriptModelRow)); + } + + public static string TrashBoxJson(Context context, SiteSettings ss) + { + var view = Views.GetBySession( + context: context, + ss: ss); + var gridData = GetGridData( + context: context, + ss: ss, + view: view); + var body = new HtmlBuilder() + .TrashBoxCommands(context: context, ss: ss) + .Grid( + context: context, + ss: ss, + gridData: gridData, + view: view, + action: "TrashBoxGridRows"); + return new ResponseCollection(context: context) + .ViewMode( + context: context, + ss: ss, + view: view, + invoke: "setGrid", + body: body) + .ToJson(); + } + + public static HtmlBuilder TdValue( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + Column column, + DashboardModel dashboardModel, + int? tabIndex = null, + ServerScriptModelColumn serverScriptModelColumn = null) + { + if (serverScriptModelColumn?.Hide == true) + { + return hb.Td(); + } + if (serverScriptModelColumn?.RawText.IsNullOrEmpty() == false) + { + return hb.Td( + context: context, + column: column, + action: () => hb.Raw(serverScriptModelColumn?.RawText), + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + } + else if (!column.GridDesign.IsNullOrEmpty()) + { + return hb.TdCustomValue( + context: context, + ss: ss, + gridDesign: column.GridDesign, + css: column.CellCss(serverScriptModelColumn?.ExtendedCellCss), + dashboardModel: dashboardModel); + } + else + { + var mine = dashboardModel.Mine(context: context); + switch (column.Name) + { + case "SiteId": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.SiteId, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "UpdatedTime": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.UpdatedTime, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "DashboardId": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.DashboardId, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Ver": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.Ver, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Title": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.Title, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Body": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.Body, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "TitleBody": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.TitleBody, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Locked": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.Locked, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Comments": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.Comments, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Creator": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.Creator, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Updator": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.Updator, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "CreatedTime": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.CreatedTime, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.GetClass(columnName: column.Name), + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Num": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.GetNum(columnName: column.Name), + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Date": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.GetDate(columnName: column.Name), + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Description": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.GetDescription(columnName: column.Name), + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Check": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.GetCheck(columnName: column.Name), + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + case "Attachments": + return ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: mine) + ? hb.Td( + context: context, + column: column, + value: dashboardModel.GetAttachments(columnName: column.Name), + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn) + : hb.Td( + context: context, + column: column, + value: string.Empty, + tabIndex: tabIndex, + serverScriptModelColumn: serverScriptModelColumn); + default: + return hb; + } + } + } + } + + private static HtmlBuilder TdCustomValue( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + string gridDesign, + string css, + DashboardModel dashboardModel) + { + ss.IncludedColumns(gridDesign).ForEach(column => + { + var value = string.Empty; + switch (column.Name) + { + case "SiteId": value = dashboardModel.SiteId.GridText( + context: context, + column: column); break; + case "UpdatedTime": value = dashboardModel.UpdatedTime.GridText( + context: context, + column: column); break; + case "DashboardId": value = dashboardModel.DashboardId.GridText( + context: context, + column: column); break; + case "Ver": value = dashboardModel.Ver.GridText( + context: context, + column: column); break; + case "Title": value = dashboardModel.Title.GridText( + context: context, + column: column); break; + case "Body": value = dashboardModel.Body.GridText( + context: context, + column: column); break; + case "TitleBody": value = dashboardModel.TitleBody.GridText( + context: context, + column: column); break; + case "Locked": value = dashboardModel.Locked.GridText( + context: context, + column: column); break; + case "Comments": value = dashboardModel.Comments.GridText( + context: context, + column: column); break; + case "Creator": value = dashboardModel.Creator.GridText( + context: context, + column: column); break; + case "Updator": value = dashboardModel.Updator.GridText( + context: context, + column: column); break; + case "CreatedTime": value = dashboardModel.CreatedTime.GridText( + context: context, + column: column); break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + value = dashboardModel.GetClass(columnName: column.Name).GridText( + context: context, + column: column); + break; + case "Num": + value = dashboardModel.GetNum(columnName: column.Name)?.Value?.GridText( + context: context, + column: column) ?? string.Empty; + break; + case "Date": + value = dashboardModel.GetDate(columnName: column.Name).GridText( + context: context, + column: column); + break; + case "Description": + value = dashboardModel.GetDescription(columnName: column.Name).GridText( + context: context, + column: column); + break; + case "Check": + value = dashboardModel.GetCheck(columnName: column.Name).GridText( + context: context, + column: column); + break; + case "Attachments": + value = dashboardModel.GetAttachments(columnName: column.Name).GridText( + context: context, + column: column); + break; + } + break; + } + gridDesign = gridDesign.Replace("[" + column.ColumnName + "]", value); + }); + return hb.Td( + css: css, + action: () => hb + .Div( + css: "markup", + action: () => hb + .Text(text: gridDesign))); + } + + private static List GetSwitchTargets(Context context, SiteSettings ss, long dashboardId, long siteId) + { + var view = Views.GetBySession( + context: context, + ss: ss, + setSession: false); + var where = view.Where(context: context, ss: ss); + var param = view.Param( + context: context, + ss: ss); + var orderBy = view.OrderBy( + context: context, + ss: ss) + .Dashboards_UpdatedTime(SqlOrderBy.Types.desc); + var join = ss.Join( + context: context, + join: new IJoin[] + { + where, + orderBy + }); + var switchTargets = new List(); + if (Parameters.General.SwitchTargetsLimit > 0) + { + if (Repository.ExecuteScalar_int( + context: context, + statements: Rds.SelectDashboards( + column: Rds.DashboardsColumn().DashboardsCount(), + join: join, + where: where, + param: param)) <= Parameters.General.SwitchTargetsLimit) + { + switchTargets = Repository.ExecuteTable( + context: context, + statements: Rds.SelectDashboards( + column: Rds.DashboardsColumn().DashboardId(), + join: join, + where: where, + param: param, + orderBy: orderBy)) + .AsEnumerable() + .Select(o => o["DashboardId"].ToLong()) + .ToList(); + } + } + if (!switchTargets.Contains(dashboardId)) + { + switchTargets.Add(dashboardId); + } + return switchTargets; + } + + private static HtmlBuilder ReferenceType( + this HtmlBuilder hb, + Context context, + string referenceType, + BaseModel.MethodTypes methodType) + { + return methodType == BaseModel.MethodTypes.New + ? hb.Select( + attributes: new HtmlAttributes() + .Id("Sites_ReferenceType") + .Class("control-dropdown"), + action: () => hb + .OptionCollection( + context: context, + optionCollection: new Dictionary + { + { + "Sites", + new ControlData(ReferenceTypeDisplayName( + context: context, + referenceType: "Sites")) + }, + { + "Dashboards", + new ControlData(ReferenceTypeDisplayName( + context: context, + referenceType: "Dashboards")) + }, + { + "Issues", + new ControlData(ReferenceTypeDisplayName( + context: context, + referenceType: "Issues")) + } +, + { + "Results", + new ControlData(ReferenceTypeDisplayName( + context: context, + referenceType: "Results")) + } +, + { + "Wikis", + new ControlData(ReferenceTypeDisplayName( + context: context, + referenceType: "Wikis")) + } + }, + selectedValue: referenceType)) + : hb.Span(css: "control-text", action: () => hb + .Text(text: ReferenceTypeDisplayName( + context: context, + referenceType: referenceType))); + } + + private static string ReferenceTypeDisplayName(Context context, string referenceType) + { + switch (referenceType) + { + case "Sites": return Displays.Folder(context: context); + case "Dashboards": return Displays.Get(context: context, id: "Dashboards"); + case "Issues": return Displays.Get(context: context, id: "Issues"); + case "Results": return Displays.Get(context: context, id: "Results"); + case "Wikis": return Displays.Get(context: context, id: "Wikis"); + default: return null; + } + } + + private static Message CreatedMessage( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + Process process) + { + if (process == null) + { + return Messages.Created( + context: context, + data: dashboardModel.Title.Value); + } + else + { + var message = process.GetSuccessMessage(context: context); + message.Text = dashboardModel.ReplacedDisplayValues( + context: context, + ss: ss, + value: message.Text); + return message; + } + } + + private static Message UpdatedMessage( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + List processes) + { + var process = processes?.FirstOrDefault(o => !o.SuccessMessage.IsNullOrEmpty() + && o.MatchConditions); + if (process == null) + { + return Messages.Updated( + context: context, + data: dashboardModel.Title.MessageDisplay(context: context)); + } + else + { + var message = process.GetSuccessMessage(context: context); + message.Text = dashboardModel.ReplacedDisplayValues( + context: context, + ss: ss, + value: message.Text); + return message; + } + } + + public static string Copy(Context context, SiteModel siteModel) + { + var ss = siteModel.SiteSettings; + if (siteModel.ParentId == 0 + && Permissions.SiteTopPermission(context: context) != (Permissions.Types)Parameters.Permissions.Manager) + { + return Error.Types.HasNotPermission.MessageJson(context: context); + } + siteModel.Title.Value += Parameters.General.CharToAddWhenCopying; + if (!context.Forms.Bool("CopyWithComments")) + { + siteModel.Comments.Clear(); + } + if (!context.Forms.Bool("CopyWithNotifications") + || Parameters.Notification.CopyWithNotifications == ParameterAccessor.Parts.Types.OptionTypes.Disabled) + { + ss.Notifications.Clear(); + } + if (!context.Forms.Bool("CopyWithReminders") + || Parameters.Reminder.CopyWithReminders == ParameterAccessor.Parts.Types.OptionTypes.Disabled) + { + ss.Reminders.Clear(); + } + var beforeSiteId = siteModel.SiteId; + var beforeInheritPermission = siteModel.InheritPermission; + var errorData = siteModel.Create(context: context, otherInitValue: true); + if (siteModel.SiteSettings.Exports?.Any() == true) + { + Repository.ExecuteNonQuery( + context: context, + statements: Rds.UpdateSites( + where: Rds.SitesWhere() + .TenantId(context.TenantId) + .SiteId(siteModel.SiteId), + param: Rds.SitesParam() + .SiteSettings(siteModel.SiteSettings.RecordingJson( + context: context)))); + } + if (beforeSiteId == beforeInheritPermission) + { + var dataTable = Repository.ExecuteTable( + context: context, + statements: Rds.SelectPermissions( + column: Rds.PermissionsColumn() + .ReferenceId() + .DeptId() + .GroupId() + .UserId() + .PermissionType(), + where: Rds.PermissionsWhere() + .ReferenceId(beforeSiteId))); + var statements = new List(); + dataTable + .AsEnumerable() + .ForEach(dataRow => + statements.Add(Rds.InsertPermissions( + param: Rds.PermissionsParam() + .ReferenceId(siteModel.SiteId) + .DeptId(dataRow.Long("DeptId")) + .GroupId(dataRow.Long("GroupId")) + .UserId(dataRow.Long("UserId")) + .PermissionType(dataRow.Long("PermissionType"))))); + statements.Add( + Rds.UpdateSites( + where: Rds.SitesWhere() + .TenantId(context.TenantId) + .SiteId(siteModel.SiteId), + param: Rds.SitesParam() + .InheritPermission(siteModel.SiteId))); + Repository.ExecuteNonQuery( + context: context, + transactional: true, + statements: statements.ToArray()); + } + SessionUtilities.Set( + context: context, + message: Messages.Copied(context: context)); + var res = new ResponseCollection(context: context) + .SetMemory("formChanged", false) + .Href(Locations.ItemEdit( + context: context, + id: siteModel.SiteId)); + return res.ToJson(); + } + + public static string PhysicalBulkDelete(Context context, SiteSettings ss) + { + if (!Parameters.Deleted.PhysicalDelete) + { + return Error.Types.InvalidRequest.MessageJson(context: context); + } + if (context.CanManageSite(ss: ss)) + { + var selector = new RecordSelector(context: context); + var count = 0; + if (selector.All) + { + count = PhysicalBulkDelete( + context: context, + ss: ss, + selected: selector.Selected, + negative: true); + } + else + { + if (selector.Selected.Any()) + { + count = PhysicalBulkDelete( + context: context, + ss: ss, + selected: selector.Selected); + } + else + { + return Messages.ResponseSelectTargets(context: context).ToJson(); + } + } + return GridRows( + context: context, + ss: ss, + clearCheck: true, + message: Messages.PhysicalBulkDeletedFromRecycleBin( + context: context, + data: count.ToString())); + } + else + { + return Messages.ResponseHasNotPermission(context: context).ToJson(); + } + } + + private static int PhysicalBulkDelete( + Context context, + SiteSettings ss, + List selected, + bool negative = false, + Sqls.TableTypes tableType = Sqls.TableTypes.Deleted) + { + var tableName = string.Empty; + switch (tableType) + { + case Sqls.TableTypes.History: + tableName = "_History"; + break; + case Sqls.TableTypes.Deleted: + tableName = "_Deleted"; + break; + default: + break; + } + var where = Rds.SitesWhere() + .TenantId( + value: context.TenantId, + tableName: "Sites" + tableName) + .ParentId( + value: ss.SiteId, + tableName: "Sites" + tableName) + .SiteId_In( + value: selected, + tableName: "Sites" + tableName, + negative: negative, + _using: selected.Any()); + var sub = Rds.SelectSites( + tableType: tableType, + _as: "Sites" + tableName, + column: Rds.SitesColumn() + .SiteId(tableName: "Sites" + tableName), + where: where); + return Repository.ExecuteScalar_response( + context: context, + transactional: true, + statements: new SqlStatement[] + { + Rds.PhysicalDeleteItems( + tableType: tableType, + where: Rds.ItemsWhere() + .ReferenceId_In(sub: + Rds.SelectWikis( + tableType: tableType, + column: Rds.WikisColumn().WikiId(), + where: Rds.WikisWhere().SiteId_In(sub: sub))) + .ReferenceType("Wikis")), + Rds.PhysicalDeleteWikis( + tableType: tableType, + where: Rds.WikisWhere().SiteId_In(sub: sub)), + Rds.PhysicalDeleteItems( + tableType: tableType, + where: Rds.ItemsWhere().ReferenceId_In(sub: sub)), + Rds.PhysicalDeleteBinaries( + tableType: tableType, + where: Rds.ItemsWhere().ReferenceId_In(sub: sub)), + Rds.PhysicalDeleteSites( + tableType: tableType, + where: where), + Rds.RowCount() + }).Count.ToInt(); + } + + /// + /// Fixed: + /// + public static string ReplaceLineByDashboardModel( + this DashboardModel dashboardModel, + Context context, + SiteSettings ss, + string line, + string itemTitle) + { + ss.IncludedColumns(line).ForEach(column => + { + switch (column.ColumnName) + { + case "Title": + line = line.Replace("[Title]", itemTitle); + break; + case "SiteId": + line = line.Replace( + "[SiteId]", + dashboardModel.SiteId.ToExport( + context: context, + column: column)); + break; + case "UpdatedTime": + line = line.Replace( + "[UpdatedTime]", + dashboardModel.UpdatedTime.ToExport( + context: context, + column: column)); + break; + case "DashboardId": + line = line.Replace( + "[DashboardId]", + dashboardModel.DashboardId.ToExport( + context: context, + column: column)); + break; + case "Ver": + line = line.Replace( + "[Ver]", + dashboardModel.Ver.ToExport( + context: context, + column: column)); + break; + case "Body": + line = line.Replace( + "[Body]", + dashboardModel.Body.ToExport( + context: context, + column: column)); + break; + case "Locked": + line = line.Replace( + "[Locked]", + dashboardModel.Locked.ToExport( + context: context, + column: column)); + break; + case "Comments": + line = line.Replace( + "[Comments]", + dashboardModel.Comments.ToExport( + context: context, + column: column)); + break; + case "Creator": + line = line.Replace( + "[Creator]", + dashboardModel.Creator.ToExport( + context: context, + column: column)); + break; + case "Updator": + line = line.Replace( + "[Updator]", + dashboardModel.Updator.ToExport( + context: context, + column: column)); + break; + case "CreatedTime": + line = line.Replace( + "[CreatedTime]", + dashboardModel.CreatedTime.ToExport( + context: context, + column: column)); + break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + line = line.Replace( + $"[{column.Name}]", + dashboardModel.GetClass(column: column).ToExport( + context: context, + column: column)); + break; + case "Num": + line = line.Replace( + $"[{column.Name}]", + dashboardModel.GetNum(column: column).ToExport( + context: context, + column: column)); + break; + case "Date": + line = line.Replace( + $"[{column.Name}]", + dashboardModel.GetDate(column: column).ToExport( + context: context, + column: column)); + break; + case "Description": + line = line.Replace( + $"[{column.Name}]", + dashboardModel.GetDescription(column: column).ToExport( + context: context, + column: column)); + break; + case "Check": + line = line.Replace( + $"[{column.Name}]", + dashboardModel.GetCheck(column: column).ToExport( + context: context, + column: column)); + break; + } + break; + } + }); + return line; + } + + /// + /// Fixed: + /// + private static DashboardPartLayout CustomHtmlLayouyt(Context context, DashboardPart dashboardPart) + { + var content = new HtmlBuilder() + .CustomHtml(context: context, dashboardPart: dashboardPart).ToString(); + return new DashboardPartLayout() + { + Id = dashboardPart.Id, + X = dashboardPart.X, + Y = dashboardPart.Y, + W = dashboardPart.Width, + H = dashboardPart.Height, + Content = content + }; + } + + /// + /// Fixed: + /// + private static DashboardPartLayout CustomLayouyt(Context context, DashboardPart dashboardPart) + { + var content = new HtmlBuilder() + .Custom(context: context, dashboardPart: dashboardPart).ToString(); + return new DashboardPartLayout() + { + Id = dashboardPart.Id, + X = dashboardPart.X, + Y = dashboardPart.Y, + W = dashboardPart.Width, + H = dashboardPart.Height, + Content = content + }; + } + + /// + /// Fixed: + /// + private static HtmlBuilder Custom(this HtmlBuilder hb, Context context, DashboardPart dashboardPart) + { + return hb.Div( + id: $"DashboardPart_{dashboardPart.Id}", + css: dashboardPart.ExtendedCss, + attributes: new HtmlAttributes().DataId(dashboardPart.Id.ToString()), + action: () => + { + if (dashboardPart.ShowTitle == true) + { + hb.Div( + css: "dashboard-part-title", + action: () => hb.Text(dashboardPart.Title)); + } + hb + .Div( + css: "dashboard-custom-body markup", + action: () => hb.Text(text: dashboardPart.Content)); + }); + } + + /// + /// Fixed: + /// + private static HtmlBuilder CustomHtml(this HtmlBuilder hb, Context context, DashboardPart dashboardPart) + { + return hb.Div( + id: $"DashboardPart_{dashboardPart.Id}", + css: dashboardPart.ExtendedCss, + attributes: new HtmlAttributes() + .DataId(dashboardPart.Id.ToString()), + action: () => + { + if (dashboardPart.ShowTitle == true) + { + hb.Div( + css: "dashboard-part-title", + action: () => hb.Text(dashboardPart.Title)); + } + hb + .Div( + css: "dashboard-custom-html-body", + action: () => hb.Raw(text: dashboardPart.HtmlContent)); + }); + } + + /// + /// Fixed: + /// + private static DashboardPartLayout QuickAccessLayout(Context context, DashboardPart dashboardPart) + { + var content = new HtmlBuilder() + .QuickAccessMenu( + context: context, + dashboardPart) + .ToString(); + return new DashboardPartLayout() + { + Id = dashboardPart.Id, + X = dashboardPart.X, + Y = dashboardPart.Y, + W = dashboardPart.Width, + H = dashboardPart.Height, + Content = content + }; + } + + /// + /// Fixed: + /// + private static HtmlBuilder QuickAccessMenu(this HtmlBuilder hb, Context context, DashboardPart dashboardPart) + { + var sites = DashboardPart.GetQuickAccessSites( + context: context, + dashboardPart.QuickAccessSitesData); + return hb.Div( + id: $"DashboardPart_{dashboardPart.Id}", + css: dashboardPart.ExtendedCss, + attributes: new HtmlAttributes().DataId(dashboardPart.Id.ToString()), + action: () => + { + if (dashboardPart.ShowTitle == true) + { + hb.Div( + css: "dashboard-part-title", + action: () => hb.Text(dashboardPart.Title)); + } + hb + .Nav(css: "dashboard-part-nav", + action: () => hb + .Ul( + css: dashboardPart.QuickAccessLayout == Libraries.Settings.QuickAccessLayout.Vertical + ? "dashboard-part-nav-menu-vertical" : "dashboard-part-nav-menu", + action: () => QuickAccessSites(context: context, sites: sites) + .ForEach(quickAccess => + { + if (quickAccess.Model.SiteId == 0) + { + quickAccess.Model.Title = new Title() { DisplayValue = Displays.Top(context: context) }; + quickAccess.Model.ReferenceType = "Sites"; + } + var itemTypeCss = string.Empty; + var iconName = string.Empty; + switch (quickAccess.Model.ReferenceType) + { + case "Sites": + itemTypeCss = " dashboard-part-nav-folder " + quickAccess.Css; + iconName = Strings.CoalesceEmpty(quickAccess.Icon, "folder"); + break; + case "Dashboards": + itemTypeCss = " dashboard-part-nav-dashboard " + quickAccess.Css; + iconName = Strings.CoalesceEmpty(quickAccess.Icon, "dashboard"); + break; + case "Wikis": + itemTypeCss = " dashboard-part-nav-wiki " + quickAccess.Css; + iconName = Strings.CoalesceEmpty(quickAccess.Icon, "text_snippet"); + break; + default: + itemTypeCss = " dashboard-part-nav-table " + quickAccess.Css; + iconName = Strings.CoalesceEmpty(quickAccess.Icon, "table"); + break; + } + hb.Li(css: "dashboard-part-nav-item" + itemTypeCss.TrimEnd(), + action: () => hb + .Span(css: "material-symbols-outlined", + action: () => hb.Text(iconName)) + .A( + css: "dashboard-part-nav-link", + text: quickAccess.Model.Title.DisplayValue, + href: quickAccess.Model.ReferenceType == "Wikis" + ? Locations.ItemEdit( + context: context, + id: Repository.ExecuteScalar_long( + context: context, + statements: Rds.SelectWikis( + column: Rds.WikisColumn().WikiId(), + where: Rds.WikisWhere().SiteId(quickAccess.Model.SiteId)))) + : Locations.ItemIndex( + context: context, + id: quickAccess.Model.SiteId))); + }))); + }); + } + + /// + /// Fixed: + /// + private static IEnumerable QuickAccessSites( + Context context, + IEnumerable<(long Id, string Icon, string Css)> sites) + { + var siteModels = new SiteCollection( + context: context, + column: Rds.SitesColumn() + .SiteId() + .Title() + .ReferenceType() + .SiteSettings(), + where: Rds.SitesWhere() + .TenantId(context.TenantId) + .SiteId_In(sites.Select(o => o.Id)) + .Add( + raw: Def.Sql.HasPermission, + _using: !context.HasPrivilege)); + return sites + .Select(o => o.Id == 0 + ? new QuickAccessSiteModel() + { + Model = new SiteModel(context: context, siteId: 0), + Icon = o.Icon, + Css = o.Css + } + : new QuickAccessSiteModel() + { + Model = siteModels.FirstOrDefault(model => model.SiteId == o.Id), + Icon = o.Icon, + Css = o.Css + }) + .Where(model => model.Model != null); + } + + /// + /// Fixed: + /// + private static DashboardPartLayout TimeLineLayout( + Context context, + SiteSettings ss, + DashboardPart dashboardPart) + { + var timeLineItems = GetTimeLineRecords( + context: context, + dashboardPart: dashboardPart); + var hb = new HtmlBuilder(); + var timeLine = hb + .Div( + id: $"DashboardPart_{dashboardPart.Id}", + attributes: new HtmlAttributes().DataId(dashboardPart.Id.ToString()), + css: "dashboard-timeline-container " + dashboardPart.ExtendedCss, + action: () => + { + if (dashboardPart.ShowTitle == true) + { + hb.Div( + css: "dashboard-part-title", + action: () => hb.Text(dashboardPart.Title)); + } + foreach (var item in timeLineItems) + { + hb.TimeLineItem( + context: context, + item: item, + dashboardPart.TimeLineDisplayType + ?? TimeLineDisplayType.Standard); + } + }).ToString(); + return new DashboardPartLayout() + { + Id = dashboardPart.Id, + X = dashboardPart.X, + Y = dashboardPart.Y, + W = dashboardPart.Width, + H = dashboardPart.Height, + Content = timeLine + }; + } + + /// + /// Fixed: + /// + private static void TimeLineItem(this HtmlBuilder hb, Context context, DashboardTimeLineItem item, TimeLineDisplayType displayType) + { + hb.Div( + css: "dashboard-timeline-item", + attributes: new HtmlAttributes() + .Add( + "data-url", + Locations.Edit( + context: context, + "items", + item.Id)), + action: () => + { + hb + .Div( + css: "dashboard-timeline-header" + + (displayType == TimeLineDisplayType.Simple + ? " dashboard-timeline-header-closed" + : ""), + action: () => + { + hb + .A( + text: item.SiteTitle.Title(context: context), + href: Locations.ItemIndex( + context: context, + id: item.SiteId)) + .Div(css: "dashboard-timeline-record-time", + action: () => + { + if (item.UpdatedTime.Value > item.CreatedTime.Value) + { + hb.UpdatedInfo( + context: context, + item.UpdatedTime); + } + else + { + hb.CreatedInfo( + context: context, + item.CreatedTime); + } + }); + }) + .Div( + css: "dashboard-timeline-titlebody", + action: () => hb + .Div( + css: "dashboard-timeline-title", + action: () => hb.Text(item.Title)) + .Div( + css: "dashboard-timeline-body markup" + + (displayType != TimeLineDisplayType.Detailed + ? " dashboard-timeline-body-closed" + : ""), + action: () => hb.Text(text: item.Body))); + }); + } + + /// + /// Fixed: + /// + private static IEnumerable GetTimeLineRecords(Context context, DashboardPart dashboardPart) + { + var ss = SiteSettingsUtilities.Get( + context: context, + siteId: dashboardPart.SiteId); + ss.IntegratedSites = dashboardPart.TimeLineSitesData; + ss.SetSiteIntegration(context: context); + var where = dashboardPart.View.Where( + context: context, + ss: ss); + var orderBy = dashboardPart.View.OrderBy( + context: context, + ss: ss); + if (ss.ReferenceType == "Issues") + { + return GetTimeLineIssues( + context: context, + ss: ss, + where: where, + orderBy: orderBy, + titleTemplate: dashboardPart.TimeLineTitle, + bodyTemplate: dashboardPart.TimeLineBody, + top: dashboardPart.TimeLineItemCount); + } + else if (ss.ReferenceType == "Results") + { + return GetTimeLineResults( + context: context, + ss: ss, + where: where, + orderBy: orderBy, + titleTemplate: dashboardPart.TimeLineTitle, + bodyTemplate: dashboardPart.TimeLineBody, + top: dashboardPart.TimeLineItemCount); + } + else + { + return Enumerable.Empty(); + } + } + + /// + /// Fixed: + /// + private static IEnumerable GetTimeLineResults( + Context context, + SiteSettings ss, + SqlWhereCollection where, + SqlOrderByCollection orderBy, + string titleTemplate, + string bodyTemplate, + int top) + { + var results = new ResultCollection( + context: context, + ss: ss, + top: top, + where: where, + orderBy: orderBy, + join: ss.Join( + context: context, + join: new IJoin[] + { + where, + orderBy + } + )); + var title = ss.LabelTextToColumnName(titleTemplate); + var body = ss.LabelTextToColumnName(bodyTemplate); + var ssHash = ss.AllowedIntegratedSites?.ToDictionary( + siteId => siteId, + siteId => ss.JoinedSsHash?.Get(siteId) + ?? SiteSettingsUtilities.Get( + context: context, + siteId: siteId)) + ?? new Dictionary(); + return results + .Select(model => + { + var currentSs = ssHash.Get(model.SiteId); + var replacedTitle = currentSs != null + ? model.ReplaceLineByResultModel( + context: context, + ss: currentSs, + line: title, + itemTitle: model.Title.DisplayValue) + : title; + var replacedBody = currentSs != null + ? model.ReplaceLineByResultModel( + context: context, + ss: currentSs, + line: body, + itemTitle: model.Title.DisplayValue) + : body; + return new DashboardTimeLineItem + { + Id = model.ResultId, + SiteId = model.SiteId, + SiteTitle = model.SiteTitle, + Title = replacedTitle, + Body = replacedBody, + CreatedTime = model.CreatedTime, + UpdatedTime = model.UpdatedTime, + Creator = model.Creator, + Updator = model.Updator + }; + }); + } + + /// + /// Fixed: + /// + private static IEnumerable GetTimeLineIssues( + Context context, + SiteSettings ss, + SqlWhereCollection where, + SqlOrderByCollection orderBy, + string titleTemplate, + string bodyTemplate, + int top) + { + var issues = new IssueCollection( + context: context, + ss: ss, + top: top, + where: where, + orderBy: orderBy, + join: ss.Join( + context: context, + join: new IJoin[] + { + where, + orderBy + } + )); + var title = ss.LabelTextToColumnName(titleTemplate); + var body = ss.LabelTextToColumnName(bodyTemplate); + var ssHash = ss.AllowedIntegratedSites?.ToDictionary( + siteId => siteId, + siteId => SiteSettingsUtilities.Get( + context: context, + siteId: siteId)) + ?? new Dictionary(); + return issues + .Select(model => + { + var currentSs = ssHash.TryGetValue(model.SiteId, out var _Ss) + ? _Ss + : null; + var replacedTitle = currentSs != null + ? model.ReplaceLineByIssueModel( + context: context, + ss: currentSs, + line: title, + itemTitle: model.Title.DisplayValue, + checkColumnAccessControl: true) + : title; + var replacedBody = currentSs != null + ? model.ReplaceLineByIssueModel( + context: context, + ss: currentSs, + line: body, + itemTitle: model.Title.DisplayValue, + checkColumnAccessControl: true) + : body; + return new DashboardTimeLineItem + { + Id = model.IssueId, + SiteId = model.SiteId, + SiteTitle = model.SiteTitle, + Title = replacedTitle, + Body = replacedBody, + CreatedTime = model.CreatedTime, + UpdatedTime = model.UpdatedTime, + Creator = model.Creator, + Updator = model.Updator + }; + }); + } + } +} diff --git a/Implem.Pleasanter/Models/Dashboards/DashboardValidators.cs b/Implem.Pleasanter/Models/Dashboards/DashboardValidators.cs new file mode 100644 index 000000000..97f80a6a6 --- /dev/null +++ b/Implem.Pleasanter/Models/Dashboards/DashboardValidators.cs @@ -0,0 +1,928 @@ +using Implem.DefinitionAccessor; +using Implem.Libraries.Utilities; +using Implem.Pleasanter.Libraries.DataTypes; +using Implem.Pleasanter.Libraries.General; +using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Security; +using Implem.Pleasanter.Libraries.Settings; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +namespace Implem.Pleasanter.Models +{ + public static class DashboardValidators + { + public static ErrorData OnEntry( + Context context, + SiteSettings ss, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (!api && ss.GetNoDisplayIfReadOnly(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + return context.HasPermission(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnGet( + Context context, + SiteSettings ss, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + return context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnEditing( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (ss.GetNoDisplayIfReadOnly(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + switch (dashboardModel.MethodType) + { + case BaseModel.MethodTypes.Edit: + return + context.CanRead(ss: ss) + && dashboardModel.AccessStatus != Databases.AccessStatuses.NotFound + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + case BaseModel.MethodTypes.New: + return context.CanCreate(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + default: + return new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + } + + public static ErrorData OnCreating( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + bool copy = false, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (ss.LockedTable()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedTable, + data: new string[] + { + ss.LockedTableUser.Name, + ss.LockedTableTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (!context.CanCreate(ss: ss) || dashboardModel.ReadOnly) + { + return !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + foreach (var column in ss.Columns + .Where(o => !o.CanCreate( + context: context, + ss: ss, + mine: dashboardModel.Mine(context: context))) + .Where(o => !ss.FormulaTarget(o.ColumnName)) + .Where(o => !o.Linking)) + { + switch (column.ColumnName) + { + case "Title": + if (dashboardModel.Title_Updated( + context: context, + column: column, + copy: copy)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Body": + if (dashboardModel.Body_Updated( + context: context, + column: column, + copy: copy)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Locked": + if (dashboardModel.Locked_Updated( + context: context, + column: column, + copy: copy)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Comments": + if (dashboardModel.Comments_Updated(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + if (dashboardModel.Class_Updated( + columnName: column.Name, + copy: copy, + context: context, + column: column)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Num": + if (dashboardModel.Num_Updated( + columnName: column.Name, + copy: copy, + context: context, + column: column)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Date": + if (dashboardModel.Date_Updated( + columnName: column.Name, + copy: copy, + context: context, + column: column)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Description": + if (dashboardModel.Description_Updated( + columnName: column.Name, + copy: copy, + context: context, + column: column)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Check": + if (dashboardModel.Check_Updated( + columnName: column.Name, + copy: copy, + context: context, + column: column)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Attachments": + if (dashboardModel.Attachments_Updated( + columnName: column.Name, + copy: copy, + context: context, + column: column)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + } + break; + } + } + return new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnUpdating( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (ss.LockedTable()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedTable, + data: new string[] + { + ss.LockedTableUser.Name, + ss.LockedTableTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (ss.LockedRecord()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedRecord, + data: new string[] + { + dashboardModel.DashboardId.ToString(), + ss.LockedRecordUser.Name, + ss.LockedRecordTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (!context.CanUpdate(ss: ss) || dashboardModel.ReadOnly) + { + return !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + foreach (var column in ss.Columns + .Where(o => !o.CanUpdate( + context: context, + ss: ss, + mine: dashboardModel.Mine(context: context))) + .Where(o => !ss.FormulaTarget(o.ColumnName))) + { + switch (column.ColumnName) + { + case "Title": + if (dashboardModel.Title_Updated(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Body": + if (dashboardModel.Body_Updated(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Locked": + if (dashboardModel.Locked_Updated(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Comments": + if (dashboardModel.Comments_Updated(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + if (dashboardModel.Class_Updated( + columnName: column.Name, + context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Num": + if (dashboardModel.Num_Updated( + columnName: column.Name, + context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Date": + if (dashboardModel.Date_Updated( + columnName: column.Name, + context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Description": + if (dashboardModel.Description_Updated( + columnName: column.Name, + context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Check": + if (dashboardModel.Check_Updated( + columnName: column.Name, + context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + case "Attachments": + if (dashboardModel.Attachments_Updated( + columnName: column.Name, + context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; + } + break; + } + } + return new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnDeleting( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (ss.LockedTable()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedTable, + data: new string[] + { + ss.LockedTableUser.Name, + ss.LockedTableTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (ss.LockedRecord()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedRecord, + data: new string[] + { + dashboardModel.DashboardId.ToString(), + ss.LockedRecordUser.Name, + ss.LockedRecordTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + return context.CanDelete(ss: ss) && !dashboardModel.ReadOnly + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnRestoring( + Context context, + SiteSettings ss, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (ss.LockedTable()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedTable, + data: new string[] + { + ss.LockedTableUser.Name, + ss.LockedTableTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + return Permissions.CanManageTenant(context: context) + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnImporting( + Context context, + SiteSettings ss, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (ss.LockedTable()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedTable, + data: new string[] + { + ss.LockedTableUser.Name, + ss.LockedTableTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + return context.CanImport(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnExporting( + Context context, + SiteSettings ss, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + return context.CanExport(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnDeleteHistory( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + bool api = false, + bool serverScript = false) + { + if (!Parameters.History.PhysicalDelete + || ss.AllowPhysicalDeleteHistories == false) + { + return new ErrorData( + context: context, + type: Error.Types.InvalidRequest, + api: api, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (!context.CanManageSite(ss: ss) || dashboardModel.ReadOnly) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (ss.LockedRecord()) + { + return new ErrorData( + context: context, + type: Error.Types.LockedRecord, + data: new string[] + { + dashboardModel.DashboardId.ToString(), + ss.LockedRecordUser.Name, + ss.LockedRecordTime.DisplayValue.ToString(context.CultureInfo()) + }, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + return new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + + public static ErrorData OnUnlockRecord( + Context context, + SiteSettings ss, + DashboardModel dashboardModel, + bool api = false, + bool serverScript = false) + { + if (api) + { + var apiErrorData = Validators.ValidateApi( + context: context, + serverScript: serverScript); + if (apiErrorData.Type != Error.Types.None) + { + return apiErrorData; + } + } + if (!ss.LockedRecord()) + { + return new ErrorData( + context: context, + type: Error.Types.NotLockedRecord, + api: api, + sysLogsStatus: 400, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (!context.CanUpdate( + ss: ss, + checkLocked: false) + || dashboardModel.ReadOnly) + { + return !context.CanRead(ss: ss) + ? new ErrorData( + context: context, + type: Error.Types.NotFound, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()) + : new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + if (!context.HasPrivilege && ss.LockedRecordUser.Id != context.UserId) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotPermission, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + return new ErrorData( + context: context, + type: Error.Types.None, + api: api, + sysLogsStatus: 200, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + } +} diff --git a/Implem.Pleasanter/Models/Issues/IssueUtilities.cs b/Implem.Pleasanter/Models/Issues/IssueUtilities.cs index 341af748a..44006d930 100644 --- a/Implem.Pleasanter/Models/Issues/IssueUtilities.cs +++ b/Implem.Pleasanter/Models/Issues/IssueUtilities.cs @@ -1579,7 +1579,8 @@ private static HtmlBuilder Editor( context: context, ss: ss, issueModel: issueModel, - serverScriptModelRow: serverScriptModelRow)) + serverScriptModelRow: serverScriptModelRow) +) .Hidden( controlId: "BaseUrl", value: Locations.BaseUrl(context: context)) @@ -9059,5 +9060,173 @@ private static ErrorData ExistsLockedRecord( issueModel.UpdatedTime.DisplayValue.ToString(context.CultureInfo()) }); } + + public static string ReplaceLineByIssueModel( + this IssueModel issueModel, + Context context, + SiteSettings ss, + string line, + string itemTitle, + bool checkColumnAccessControl = false) + { + foreach (var column in ss.IncludedColumns(line)) + { + var allowed = checkColumnAccessControl == false + || ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: issueModel.Mine(context: context)); + if (!allowed) + { + line = line.Replace($"[{column.Name}]", string.Empty); + continue; + } + switch (column.ColumnName) + { + case "Title": + line = line.Replace("[Title]", itemTitle); + break; + case "SiteId": + line = line.Replace( + "[SiteId]", issueModel.SiteId.ToExport( + context: context, + column: column)); + break; + case "UpdatedTime": + line = line.Replace( + "[UpdatedTime]", issueModel.UpdatedTime.ToExport( + context: context, + column: column)); + break; + case "IssueId": + line = line.Replace( + "[IssueId]", issueModel.IssueId.ToExport( + context: context, + column: column)); + break; + case "Ver": + line = line.Replace( + "[Ver]", issueModel.Ver.ToExport( + context: context, + column: column)); + break; + case "Body": + line = line.Replace( + "[Body]", issueModel.Body.ToExport( + context: context, + column: column)); + break; + case "StartTime": + line = line.Replace( + "[StartTime]", issueModel.StartTime.ToExport( + context: context, + column: column)); + break; + case "CompletionTime": + line = line.Replace( + "[CompletionTime]", issueModel.CompletionTime.ToExport( + context: context, + column: column)); + break; + case "WorkValue": + line = line.Replace( + "[WorkValue]", issueModel.WorkValue.ToExport( + context: context, + column: column)); + break; + case "ProgressRate": + line = line.Replace( + "[ProgressRate]", issueModel.ProgressRate.ToExport( + context: context, + column: column)); + break; + case "Status": + line = line.Replace( + "[Status]", issueModel.Status.ToExport( + context: context, + column: column)); + break; + case "Manager": + line = line.Replace( + "[Manager]", issueModel.Manager.ToExport( + context: context, + column: column)); + break; + case "Owner": + line = line.Replace( + "[Owner]", issueModel.Owner.ToExport( + context: context, + column: column)); + break; + case "Locked": + line = line.Replace( + "[Locked]", issueModel.Locked.ToExport( + context: context, + column: column)); + break; + case "Comments": + line = line.Replace( + "[Comments]", issueModel.Comments.ToExport( + context: context, + column: column)); + break; + case "Creator": + line = line.Replace( + "[Creator]", issueModel.Creator.ToExport( + context: context, + column: column)); + break; + case "Updator": + line = line.Replace( + "[Updator]", issueModel.Updator.ToExport( + context: context, + column: column)); + break; + case "CreatedTime": + line = line.Replace( + "[CreatedTime]", issueModel.CreatedTime.ToExport( + context: context, + column: column)); + break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + line = line.Replace( + $"[{column.Name}]", issueModel.GetClass(column: column).ToExport( + context: context, + column: column)); + break; + case "Num": + line = line.Replace( + $"[{column.Name}]", issueModel.GetNum(column: column).ToExport( + context: context, + column: column)); + break; + case "Date": + line = line.Replace( + $"[{column.Name}]", issueModel.GetDate(column: column).ToExport( + context: context, + column: column)); + break; + case "Description": + line = line.Replace( + $"[{column.Name}]", issueModel.GetDescription(column: column).ToExport( + context: context, + column: column)); + break; + case "Check": + line = line.Replace( + $"[{column.Name}]", issueModel.GetCheck(column: column).ToExport( + context: context, + column: column)); + break; + } + break; + } + } + return line; + } } } diff --git a/Implem.Pleasanter/Models/Items/ItemModel.cs b/Implem.Pleasanter/Models/Items/ItemModel.cs index 6204b6550..67308d3c3 100644 --- a/Implem.Pleasanter/Models/Items/ItemModel.cs +++ b/Implem.Pleasanter/Models/Items/ItemModel.cs @@ -236,6 +236,10 @@ public string Index(Context context) { case "Sites": return SiteUtilities.SiteMenu(context: context, siteModel: Site); + case "Dashboards": + return DashboardUtilities.Index( + context: context, + ss: Site.SiteSettings); case "Issues": return IssueUtilities.Index( context: context, @@ -331,6 +335,10 @@ public string TrashBox(Context context) return SiteUtilities.TrashBox( context: context, ss: Site.SiteSettings); + case "Dashboards": + return DashboardUtilities.TrashBox( + context: context, + ss: Site.SiteSettings); case "Issues": return IssueUtilities.TrashBox( context: context, @@ -382,6 +390,10 @@ public string TrashBoxJson(Context context) return SiteUtilities.TrashBoxJson( context: context, ss: Site.SiteSettings); + case "Dashboards": + return DashboardUtilities.TrashBoxJson( + context: context, + ss: Site.SiteSettings); case "Issues": return IssueUtilities.TrashBoxJson( context: context, @@ -2743,6 +2755,7 @@ public string OpenImportSitePackageDialog(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": return Libraries.SitePackages.Utilities.OpenImportSitePackageDialog( context: context, ss: Site.SiteSettings); @@ -2766,6 +2779,7 @@ public string ImportSitePackage(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": default: throw new NotImplementedException(); } @@ -2787,6 +2801,7 @@ public string OpenExportSitePackageDialog(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": return Libraries.SitePackages.Utilities.OpenExportSitePackageDialog( context: context, ss: Site.SiteSettings, @@ -2811,6 +2826,7 @@ public ResponseFile ExportSitePackage(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": return Libraries.SitePackages.Utilities.ExportSitePackage( context: context, ss: Site.SiteSettings); @@ -2837,6 +2853,7 @@ public ContentResultInheritance CopySitePackageByApi(Context context) case "Issues": case "Results": case "Wikis": + case "Dashboards": var response = Libraries.SitePackages.Utilities.ImportSitePackage( context: context, ss: Site.SiteSettings, diff --git a/Implem.Pleasanter/Models/Items/ItemUtilities.cs b/Implem.Pleasanter/Models/Items/ItemUtilities.cs index 33ba60e2d..b95d115e6 100644 --- a/Implem.Pleasanter/Models/Items/ItemUtilities.cs +++ b/Implem.Pleasanter/Models/Items/ItemUtilities.cs @@ -51,6 +51,7 @@ public static SqlJoinCollection ItemJoin( switch (tableName) { case "Sites": + case "Dashboards": case "Issues": case "Results": case "Wikis": diff --git a/Implem.Pleasanter/Models/Results/ResultUtilities.cs b/Implem.Pleasanter/Models/Results/ResultUtilities.cs index 908a2b1be..654c8d826 100644 --- a/Implem.Pleasanter/Models/Results/ResultUtilities.cs +++ b/Implem.Pleasanter/Models/Results/ResultUtilities.cs @@ -1474,7 +1474,8 @@ private static HtmlBuilder Editor( context: context, ss: ss, resultModel: resultModel, - serverScriptModelRow: serverScriptModelRow)) + serverScriptModelRow: serverScriptModelRow) +) .Hidden( controlId: "BaseUrl", value: Locations.BaseUrl(context: context)) @@ -8293,5 +8294,149 @@ private static ErrorData ExistsLockedRecord( resultModel.UpdatedTime.DisplayValue.ToString(context.CultureInfo()) }); } + + public static string ReplaceLineByResultModel( + this ResultModel resultModel, + Context context, + SiteSettings ss, + string line, + string itemTitle, + bool checkColumnAccessControl = false) + { + foreach (var column in ss.IncludedColumns(line)) + { + var allowed = checkColumnAccessControl == false + || ss.ReadColumnAccessControls.Allowed( + context: context, + ss: ss, + column: column, + mine: resultModel.Mine(context: context)); + if (!allowed) + { + line = line.Replace($"[{column.Name}]", string.Empty); + continue; + } + switch (column.ColumnName) + { + case "Title": + line = line.Replace("[Title]", itemTitle); + break; + case "SiteId": + line = line.Replace( + "[SiteId]", resultModel.SiteId.ToExport( + context: context, + column: column)); + break; + case "UpdatedTime": + line = line.Replace( + "[UpdatedTime]", resultModel.UpdatedTime.ToExport( + context: context, + column: column)); + break; + case "ResultId": + line = line.Replace( + "[ResultId]", resultModel.ResultId.ToExport( + context: context, + column: column)); + break; + case "Ver": + line = line.Replace( + "[Ver]", resultModel.Ver.ToExport( + context: context, + column: column)); + break; + case "Body": + line = line.Replace( + "[Body]", resultModel.Body.ToExport( + context: context, + column: column)); + break; + case "Status": + line = line.Replace( + "[Status]", resultModel.Status.ToExport( + context: context, + column: column)); + break; + case "Manager": + line = line.Replace( + "[Manager]", resultModel.Manager.ToExport( + context: context, + column: column)); + break; + case "Owner": + line = line.Replace( + "[Owner]", resultModel.Owner.ToExport( + context: context, + column: column)); + break; + case "Locked": + line = line.Replace( + "[Locked]", resultModel.Locked.ToExport( + context: context, + column: column)); + break; + case "Comments": + line = line.Replace( + "[Comments]", resultModel.Comments.ToExport( + context: context, + column: column)); + break; + case "Creator": + line = line.Replace( + "[Creator]", resultModel.Creator.ToExport( + context: context, + column: column)); + break; + case "Updator": + line = line.Replace( + "[Updator]", resultModel.Updator.ToExport( + context: context, + column: column)); + break; + case "CreatedTime": + line = line.Replace( + "[CreatedTime]", resultModel.CreatedTime.ToExport( + context: context, + column: column)); + break; + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + line = line.Replace( + $"[{column.Name}]", resultModel.GetClass(column: column).ToExport( + context: context, + column: column)); + break; + case "Num": + line = line.Replace( + $"[{column.Name}]", resultModel.GetNum(column: column).ToExport( + context: context, + column: column)); + break; + case "Date": + line = line.Replace( + $"[{column.Name}]", resultModel.GetDate(column: column).ToExport( + context: context, + column: column)); + break; + case "Description": + line = line.Replace( + $"[{column.Name}]", resultModel.GetDescription(column: column).ToExport( + context: context, + column: column)); + break; + case "Check": + line = line.Replace( + $"[{column.Name}]", resultModel.GetCheck(column: column).ToExport( + context: context, + column: column)); + break; + } + break; + } + } + return line; + } } } diff --git a/Implem.Pleasanter/Models/Sites/SiteModel.cs b/Implem.Pleasanter/Models/Sites/SiteModel.cs index 056dede26..1dd617277 100644 --- a/Implem.Pleasanter/Models/Sites/SiteModel.cs +++ b/Implem.Pleasanter/Models/Sites/SiteModel.cs @@ -1402,6 +1402,11 @@ public ErrorData Delete(Context context, SiteSettings ss) Rds.DeleteItems( factory: context, where: Rds.ItemsWhere().SiteId_In(siteIds)), + Rds.DeleteDashboards( + factory: context, + where: Rds.DashboardsWhere().SiteId_In(siteMenu + .Where(o => o.ReferenceType == "Dashboards") + .Select(o => o.SiteId))), Rds.DeleteIssues( factory: context, where: Rds.IssuesWhere().SiteId_In(siteMenu @@ -2066,7 +2071,7 @@ public SiteApiModel GetByApi(Context context) data.ReferenceType = ReferenceType; data.ParentId = ParentId; data.InheritPermission = InheritPermission; - if(context.CanManagePermission(ss: SiteSettings)) + if (context.CanManagePermission(ss: SiteSettings)) { data.Permissions = PermissionUtilities.CurrentCollection( context: context, @@ -3030,6 +3035,74 @@ private void SetSiteSettings(Context context, ResponseCollection res) context: context, res: res); break; + case "MoveUpDashboardParts": + case "MoveDownDashboardParts": + SetDashboardPartsOrder( + context: context, + res: res, + controlId: controlId); + break; + case "NewDashboardPart": + case "EditDashboardPart": + OpenDashboardPartDialog( + context: context, + res: res, + controlId: controlId); + break; + case "AddDashboardPart": + AddDashboardPart( + context: context, + res: res, + controlId: controlId); + break; + case "UpdateDashboardPart": + UpdateDashboardPart( + context: context, + res: res); + break; + case "CopyDashboardParts": + CopyDashboardPart( + context: context, + res: res); + break; + case "DeleteDashboardParts": + DeleteDashboardPart( + context: context, + res: res); + break; + case "AddDashboardPartViewFilter": + var ss = SiteSettingsUtilities.Get( + context: context, + siteId: context.Forms.Long("DashboardPartBaseSiteId")); + AddViewFilter( + context: context, + res: res, + prefix: "DashboardPart", + ss: ss); + break; + case "EditTimeLineSites": + OpenDashboardPartTimeLineSitesDialog( + context: context, + res: res); + break; + case "UpdateDashboardPartTimeLineSites": + UpdateDashboardPartTimeLineSites( + context: context, + res: res); + break; + case "ClearDashboardView": + ClearDashboardView( + context: context, + res: res); + break; + case "UpdateDashboardPartLayouts": + UpdatedashboardPartLayouts(context: context); + break; + case "SearchDashboardPartAccessControl": + SearchDashboardPartAccessControl( + context: context, + res: res); + break; default: if (controlId.Contains("_NumericRange")) { @@ -3094,7 +3167,7 @@ private void OpenGridColumnDialog(Context context, ResponseCollection res) { res.Message(Messages.InvalidRequest(context: context)); } - else if(column.Joined) + else if (column.Joined) { res.Message(Messages.CanNotPerformed(context: context)); } @@ -3392,7 +3465,7 @@ private void OpenEditorColumnDialog( column: column, titleColumns: titleColumns)); } - else if(section != null) + else if (section != null) { res.Html("#EditorColumnDialog", SiteUtilities.SectionDialog( context: context, @@ -3616,10 +3689,10 @@ private void OpenTabDialog(Context context, ResponseCollection res, string contr .Forms .List("TabsAll") .Select((val, key) => new - { - Key = key, - Val = val - }), + { + Key = key, + Val = val + }), v => v.Id, l => l.Val.ToInt(), (v, l) => new { Tabs = v, OrderNo = l.Key }) .OrderBy(v => v.OrderNo) @@ -3680,7 +3753,7 @@ private void UpdateTab(Context context, ResponseCollection res) { var selected = context.Forms.Int("TabId"); var tab = SiteSettings.Tabs?.Get(selected); - if(selected == 0) + if (selected == 0) { SiteSettings.GeneralTabLabelText = context.Forms.Data("LabelText"); res @@ -3728,7 +3801,7 @@ private void DeleteTabs(Context context, ResponseCollection res) { res.Message(Messages.CanNotDelete( context: context, - Displays.General(context:context))).ToJson(); + Displays.General(context: context))).ToJson(); } else { @@ -5300,10 +5373,12 @@ private void OpenViewDialog(Context context, ResponseCollection res, View view) private void AddViewFilter( Context context, ResponseCollection res, - string prefix = "") + string prefix = "", + SiteSettings ss = null) { - SiteSettings.SetChoiceHash(context: context); - var column = SiteSettings.GetColumn( + ss = ss ?? SiteSettings; + ss.SetChoiceHash(context: context); + var column = ss.GetColumn( context: context, columnName: context.Forms.Data($"{prefix}ViewFilterSelector")); if (column != null) @@ -5313,7 +5388,7 @@ private void AddViewFilter( $"#{prefix}ViewFiltersTab .items", new HtmlBuilder().ViewFilter( context: context, - ss: SiteSettings, + ss: ss, column: column, prefix: prefix)) .Remove($"#{prefix}ViewFilterSelector option:selected"); @@ -6531,6 +6606,7 @@ private void AddStyle(Context context, ResponseCollection res, string controlId) timeSeries: context.Forms.Bool("StyleTimeSeries"), kamban: context.Forms.Bool("StyleKamban"), imageLib: context.Forms.Bool("StyleImageLib"), + disabled: context.Forms.Bool("StyleDisabled"), body: context.Forms.Data("StyleBody"))); res .ReplaceAll("#EditStyle", new HtmlBuilder() @@ -6560,6 +6636,7 @@ private void UpdateStyle(Context context, ResponseCollection res, string control timeSeries: context.Forms.Bool("StyleTimeSeries"), kamban: context.Forms.Bool("StyleKamban"), imageLib: context.Forms.Bool("StyleImageLib"), + disabled: context.Forms.Bool("StyleDisabled"), body: context.Forms.Data("StyleBody")); res .Html("#EditStyle", new HtmlBuilder() @@ -6695,6 +6772,7 @@ private void AddScript(Context context, ResponseCollection res, string controlId timeSeries: context.Forms.Bool("ScriptTimeSeries"), kamban: context.Forms.Bool("ScriptKamban"), imageLib: context.Forms.Bool("ScriptImageLib"), + disabled: context.Forms.Bool("ScriptDisabled"), body: context.Forms.Data("ScriptBody"))); res .ReplaceAll("#EditScript", new HtmlBuilder() @@ -6724,6 +6802,7 @@ private void UpdateScript(Context context, ResponseCollection res, string contro timeSeries: context.Forms.Bool("ScriptTimeSeries"), kamban: context.Forms.Bool("ScriptKamban"), imageLib: context.Forms.Bool("ScriptImageLib"), + disabled: context.Forms.Bool("ScriptDisabled"), body: context.Forms.Data("ScriptBody")); res .Html("#EditScript", new HtmlBuilder() @@ -7370,6 +7449,372 @@ private void DeleteRelatingColumns(Context context, ResponseCollection res) } } + /// + /// Fixed: + /// + private void SetDashboardPartsOrder(Context context, ResponseCollection res, string controlId) + { + var selected = context.Forms.IntList("EditDashboardPart"); + if (selected?.Any() != true) + { + res.Message(Messages.SelectTargets(context: context)).ToJson(); + } + else + { + SiteSettings.DashboardParts.MoveUpOrDown( + ColumnUtilities.ChangeCommand(controlId), selected); + res.Html("#EditDashboardPart", new HtmlBuilder() + .EditDashboardPart( + context: context, + ss: SiteSettings)); + } + } + + /// + /// Fixed: + /// + private void OpenDashboardPartDialog(Context context, ResponseCollection res, DashboardPart dashboardPart) + { + res.Html("#DashboardPartDialog", SiteUtilities.DashboardPartDialog( + context: context, + ss: SiteSettings, + controlId: context.Forms.ControlId(), + dashboardPart: dashboardPart)); + } + + /// + /// Fixed: + /// + private void OpenDashboardPartTimeLineSitesDialog(Context context, ResponseCollection res) + { + res.Html("#DashboardPartTimeLineSitesDialog", SiteUtilities.DashboardPartTimeLineSitesDialog( + context: context, + ss: SiteSettings, + dashboardPartId: context.Forms.Int("DashboardPartId"), + dashboardTimeLineSites: context.Forms.Data("DashboardPartTimeLineSites"))); + } + + /// + /// Fixed: + /// + private void OpenDashboardPartDialog(Context context, ResponseCollection res, string controlId) + { + if (controlId == "NewDashboardPart") + { + var dashboardPart = new DashboardPart(); + OpenDashboardPartDialog( + context: context, + res: res, + dashboardPart: dashboardPart); + } + else + { + var dashboardPart = SiteSettings.DashboardParts?.Get(context.Forms.Int("DashboardPartId")); + if (dashboardPart == null) + { + OpenDialogError( + res: res, + message: Messages.SelectOne(context: context)); + } + else + { + SiteSettingsUtilities.Get( + context: context, siteModel: this, referenceId: SiteId); + OpenDashboardPartDialog( + context: context, + res: res, + dashboardPart: dashboardPart); + } + } + } + + /// + /// Fixed: + /// + private void AddDashboardPart(Context context, ResponseCollection res, string controlId) + { + var dashboardPart = DashboardPart.Create( + context: context, + id: SiteSettings.DashboardParts.MaxOrDefault(o => o.Id) + 1, + title: context.Forms.Data("DashboardPartTitle"), + showTitle: context.Forms.Bool("DashboardPartShowTitle"), + type: context.Forms.Data("DashboardPartType").ToEnum(), + quickAccessSites: context.Forms.Data("DashboardPartQuickAccessSites"), + quickAccessLayout: context.Forms.Data("DashboardPartQuickAccessLayout").ToEnum(), + timeLineSites: context.Forms.Data("DashboardPartTimeLineSites"), + timeLineTitle: context.Forms.Data("DashboardPartTimeLineTitle"), + timeLineBody: context.Forms.Data("DashboardPartTimeLineBody"), + timeLineItemCount: context.Forms.Int("DashboardPartTimeLineItemCount"), + content: context.Forms.Data("DashboardPartContent"), + htmlContent: context.Forms.Data("DashboardPartHtmlContent"), + timeLineDisplayType: context.Forms.Data("DashboardPartTimeLineDisplayType").ToEnum(), + extendedCss: context.Forms.Data("DashboardPartExtendedCss"), + permissions: DashboardPartPermissions(context: context)); + SiteSettings.DashboardParts.Add(dashboardPart); + res + .ReplaceAll("#EditDashboardPart", new HtmlBuilder() + .EditDashboardPart( + context: context, + ss: SiteSettings)) + .CloseDialog(); + } + + /// + /// Fixed: + /// + public static View GetDashboardPartView(Context context, SiteSettings ss, View view) + { + view = view ?? new View(); + if (ss == null) + { + return view; + } + view.SetByForm( + context: context, + ss: ss, + prefix: "DashboardPart"); + return view; + } + + /// + /// Fixed: + /// + private void UpdateDashboardPart(Context context, ResponseCollection res) + { + var dashboardPart = SiteSettings.DashboardParts? + .FirstOrDefault(o => o.Id == context.Forms.Int("DashboardPartId")); + if (dashboardPart == null) + { + return; + } + dashboardPart.Update( + context: context, + title: context.Forms.Data("DashboardPartTitle"), + showTitle: context.Forms.Bool("DashboardPartShowTitle"), + type: context.Forms.Data("DashboardPartType").ToEnum(), + x: dashboardPart.X, + y: dashboardPart.Y, + width: dashboardPart.Width, + height: dashboardPart.Height, + quickAccessSites: context.Forms.Data("DashboardPartQuickAccessSites"), + quickAccessLayout: context.Forms.Data("DashboardPartQuickAccessLayout").ToEnum(), + timeLineSites: context.Forms.Data("DashboardPartTimeLineSites"), + timeLineTitle: context.Forms.Data("DashboardPartTimeLineTitle"), + timeLineBody: context.Forms.Data("DashboardPartTimeLineBody"), + timeLineItemCount: context.Forms.Int("DashboardPartTimeLineItemCount"), + content: context.Forms.Data("DashboardPartContent"), + htmlContent: context.Forms.Data("DashboardPartHtmlContent"), + timeLineDisplayType: context.Forms.Data("DashboardPartTimeLineDisplayType").ToEnum(), + extendedCss: context.Forms.Data("DashboardPartExtendedCss"), + permissions: DashboardPartPermissions(context: context)); + res + .Html("#EditDashboardPart", new HtmlBuilder() + .EditDashboardPart( + context: context, + ss: SiteSettings)) + .CloseDialog(); + } + + /// + /// Fixed: + /// + private List DashboardPartPermissions(Context context) + { + return context.Forms.List("CurrentDashboardPartAccessControlAll") + .Select(data => new Permission( + name: data.Split_1st(), + id: data.Split_2nd().ToInt(), + type: Permissions.Types.NotSet)) + .ToList(); + } + + /// + /// Fixed: + /// + public string SearchDashboardPartAccessControl(Context context, ResponseCollection res) + { + var process = SiteSettings.Processes.Get(context.Forms.Int("ProcessId")) + ?? new Process(); + var currentPermissions = process.GetPermissions(ss: SiteSettings); + var sourcePermissions = PermissionUtilities.SourceCollection( + context: context, + ss: SiteSettings, + searchText: context.Forms.Data("SearchDashboardPartAccessControl"), + currentPermissions: currentPermissions, + allUsers: false); + return res + .Html("#SourceDashboardPartAccessControl", PermissionUtilities.PermissionListItem( + context: context, + ss: SiteSettings, + permissions: sourcePermissions.Page(0), + selectedValueTextCollection: context.Forms.Data("SourceDashboardPartAccessControl") + .Deserialize>()? + .Where(o => o != string.Empty), + withType: false)) + .Val("#SourceDashboardPartAccessControlOffset", Parameters.Permissions.PageSize) + .ToJson(); + } + + /// + /// Fixed: + /// + private void UpdatedashboardPartLayouts(Context context) + { + var layouts = context.Forms.Data("DashboardPartLayouts") + .Deserialize(); + foreach (var dashboardPart in SiteSettings.DashboardParts) + { + var layout = layouts.FirstOrDefault(o => o.Id == dashboardPart.Id); + if (layout != null) + { + dashboardPart.X = layout.X; + dashboardPart.Y = layout.Y; + dashboardPart.Width = layout.W; + dashboardPart.Height = layout.H; + } + } + } + + /// + /// Fixed: + /// + private void CopyDashboardPart(Context context, ResponseCollection res) + { + var selected = context.Forms.IntList("EditDashboardPart"); + if (selected?.Any() != true) + { + res.Message(Messages.SelectTargets(context: context)).ToJson(); + } + else + { + SiteSettings.DashboardParts.Copy(selected); + res.ReplaceAll("#EditDashboardPart", new HtmlBuilder() + .EditDashboardPart( + context: context, + ss: SiteSettings)); + } + } + + /// + /// Fixed: + /// + private void DeleteDashboardPart(Context context, ResponseCollection res) + { + var selected = context.Forms.IntList("EditDashboardPart"); + if (selected?.Any() != true) + { + res.Message(Messages.SelectTargets(context: context)).ToJson(); + } + else + { + SiteSettings.DashboardParts.Delete(selected); + res.ReplaceAll("#EditDashboardPart", new HtmlBuilder() + .EditDashboardPart( + context: context, + ss: SiteSettings)); + } + } + + /// + /// Fixed: + /// + private void UpdateDashboardPartTimeLineSites(Context context, ResponseCollection res) + { + var savedTimeLineSites = context.Forms.Data("SavedDashboardPartTimeLineSites"); + var timeLineSites = context.Forms.Data("DashboardPartTimeLineSitesEdit"); + var savedSs = DashboardPart.GetBaseSiteSettings( + context: context, + timeLineSitesString: savedTimeLineSites); + var currentSs = DashboardPart.GetBaseSiteSettings( + context: context, + timeLineSitesString: timeLineSites); + if (currentSs == null || currentSs.SiteId == 0) + { + res.Message( + message: new Message( + id: "InvalidTimeLineSites", + text: Displays.InvalidTimeLineSites(context: context), + css: "alert-error"), + target: "#DashboardPartTimeLineSitesMessage"); + } + else if (savedSs == null || savedSs?.SiteId == 0 || savedSs?.SiteId == currentSs?.SiteId) + { + res + .Set( + target: "#DashboardPartTimeLineSites", + value: timeLineSites) + .Set( + target: "#DashboardPartBaseSiteId", + value: currentSs.SiteId) + .Add( + method: "SetValue", + target: "#DashboardPartTimeLineSitesValue", + value: timeLineSites) + .CloseDialog( + target: "#DashboardPartTimeLineSitesDialog"); + if (savedSs == null || savedSs?.SiteId == 0) + { + ClearDashboardView(context: context, res: res); + } + } + else + { + res + .Invoke( + methodName: "confirmTimeLineSites", + args: new + { + timeLineSites, + baseSiteId = currentSs.SiteId + }.ToJson()); + } + } + + /// + /// Fixed: + /// + private void ClearDashboardView(Context context, ResponseCollection res) + { + var currentSs = DashboardPart.GetBaseSiteSettings( + context: context, + context.Forms.Data("DashboardPartTimeLineSitesEdit")); + if (currentSs == null) + { + res.Message( + new Message( + "InvalidTimeLineSites", + Displays.InvalidTimeLineSites(context: context), + "alert-error")); + return; + } + var dashboardPart = SiteSettings.DashboardParts? + .FirstOrDefault(o => o.Id == context.Forms.Int("DashboardPartId")); + if (dashboardPart != null) + { + dashboardPart.View = new View(); + } + res + .Html( + "#DashboardPartViewFiltersTabContainer", + new HtmlBuilder() + .ViewFiltersTab( + context: context, + ss: currentSs, + view: new View(), + prefix: "DashboardPart", + currentTableOnly: true)) + .Html( + "#DashboardPartViewSortersTabContainer", + new HtmlBuilder() + .ViewSortersTab( + context: context, + ss: currentSs, + view: new View(), + prefix: "DashboardPart", + usekeepSorterState: false, + currentTableOnly: true)); + } + /// /// Fixed: /// diff --git a/Implem.Pleasanter/Models/Sites/SiteUtilities.cs b/Implem.Pleasanter/Models/Sites/SiteUtilities.cs index 6f7007615..4856cdb93 100644 --- a/Implem.Pleasanter/Models/Sites/SiteUtilities.cs +++ b/Implem.Pleasanter/Models/Sites/SiteUtilities.cs @@ -971,6 +971,12 @@ private static HtmlBuilder ReferenceType( context: context, referenceType: "Sites")) }, + { + "Dashboards", + new ControlData(ReferenceTypeDisplayName( + context: context, + referenceType: "Dashboards")) + }, { "Issues", new ControlData(ReferenceTypeDisplayName( @@ -1004,6 +1010,7 @@ private static string ReferenceTypeDisplayName(Context context, string reference switch (referenceType) { case "Sites": return Displays.Folder(context: context); + case "Dashboards": return Displays.Get(context: context, id: "Dashboards"); case "Issues": return Displays.Get(context: context, id: "Issues"); case "Results": return Displays.Get(context: context, id: "Results"); case "Wikis": return Displays.Get(context: context, id: "Wikis"); @@ -2366,6 +2373,15 @@ public static string Templates(Context context, long parentId, long inheritPermi private static HtmlBuilder TemplateTabsContainer( this HtmlBuilder hb, Context context, SiteSettings ss) { + var templates = Def.TemplateDefinitionCollection + .Where(o => o.Language == context.Language) + .ToList(); + if (!templates.Any()) + { + templates = Def.TemplateDefinitionCollection + .Where(o => o.Language == "en") + .ToList(); + } return hb .Div( id: "TemplateTabsContainer", @@ -2377,269 +2393,215 @@ private static HtmlBuilder TemplateTabsContainer( .A( href: "#FieldSetStandard", text: Displays.Standard(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Standard > 0)) + _using: templates.Any(o => o.Standard > 0)) .Li( action: () => hb .A( href: "#FieldSetProject", text: Displays.Project(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Project > 0)) + _using: templates.Any(o => o.Project > 0)) .Li( action: () => hb .A( href: "#FieldSetBusinessImprovement", text: Displays.BusinessImprovement(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.BusinessImprovement > 0)) + _using: templates.Any(o => o.BusinessImprovement > 0)) .Li( action: () => hb .A( href: "#FieldSetSales", text: Displays.Sales(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Sales > 0)) + _using: templates.Any(o => o.Sales > 0)) .Li( action: () => hb .A( href: "#FieldSetCustomer", text: Displays.Customer(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Customer > 0)) + _using: templates.Any(o => o.Customer > 0)) .Li( action: () => hb .A( href: "#FieldSetStore", text: Displays.Store(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Store > 0)) + _using: templates.Any(o => o.Store > 0)) .Li( action: () => hb .A( href: "#FieldSetResearchAndDevelopment", text: Displays.ResearchAndDevelopment(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.ResearchAndDevelopment > 0)) + _using: templates.Any(o => o.ResearchAndDevelopment > 0)) .Li( action: () => hb .A( href: "#FieldSetMarketing", text: Displays.Marketing(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Marketing > 0)) + _using: templates.Any(o => o.Marketing > 0)) .Li( action: () => hb .A( href: "#FieldSetManufacture", text: Displays.Manufacture(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Manufacture > 0)) + _using: templates.Any(o => o.Manufacture > 0)) .Li( action: () => hb .A( href: "#FieldSetInformationSystem", text: Displays.InformationSystem(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.InformationSystem > 0)) + _using: templates.Any(o => o.InformationSystem > 0)) .Li( action: () => hb .A( href: "#FieldSetCorporatePlanning", text: Displays.CorporatePlanning(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.CorporatePlanning > 0)) + _using: templates.Any(o => o.CorporatePlanning > 0)) .Li( action: () => hb .A( href: "#FieldSetHumanResourcesAndGeneralAffairs", text: Displays.HumanResourcesAndGeneralAffairs(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.HumanResourcesAndGeneralAffairs > 0)) + _using: templates.Any(o => o.HumanResourcesAndGeneralAffairs > 0)) .Li( action: () => hb .A( href: "#FieldSetEducation", text: Displays.Education(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Education > 0)) + _using: templates.Any(o => o.Education > 0)) .Li( action: () => hb .A( href: "#FieldSetPurchase", text: Displays.Purchase(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Purchase > 0)) + _using: templates.Any(o => o.Purchase > 0)) .Li( action: () => hb .A( href: "#FieldSetLogistics", text: Displays.Logistics(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Logistics > 0)) + _using: templates.Any(o => o.Logistics > 0)) .Li( action: () => hb .A( href: "#FieldSetLegalAffairs", text: Displays.LegalAffairs(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.LegalAffairs > 0)) + _using: templates.Any(o => o.LegalAffairs > 0)) .Li( action: () => hb .A( href: "#FieldSetProductList", text: Displays.ProductList(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.ProductList > 0)) + _using: templates.Any(o => o.ProductList > 0)) .Li( action: () => hb .A( href: "#FieldSetClassification", text: Displays.Classification(context: context)), - _using: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) - .Any(o => o.Classification > 0))) + _using: templates.Any(o => o.Classification > 0))) .TemplateTab( context: context, name: "Standard", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Standard > 0) .OrderBy(o => o.Standard)) .TemplateTab( context: context, name: "Project", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Project > 0) .OrderBy(o => o.Project)) .TemplateTab( context: context, name: "BusinessImprovement", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.BusinessImprovement > 0) .OrderBy(o => o.BusinessImprovement)) .TemplateTab( context: context, name: "Sales", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Sales > 0) .OrderBy(o => o.Sales)) .TemplateTab( context: context, name: "Customer", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Customer > 0) .OrderBy(o => o.Customer)) .TemplateTab( context: context, name: "Store", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Store > 0) .OrderBy(o => o.Store)) .TemplateTab( context: context, name: "ResearchAndDevelopment", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.ResearchAndDevelopment > 0) .OrderBy(o => o.ResearchAndDevelopment)) .TemplateTab( context: context, name: "Marketing", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Marketing > 0) .OrderBy(o => o.Marketing)) .TemplateTab( context: context, name: "Manufacture", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Manufacture > 0) .OrderBy(o => o.Manufacture)) .TemplateTab( context: context, name: "InformationSystem", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.InformationSystem > 0) .OrderBy(o => o.InformationSystem)) .TemplateTab( context: context, name: "CorporatePlanning", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.CorporatePlanning > 0) .OrderBy(o => o.CorporatePlanning)) .TemplateTab( context: context, name: "HumanResourcesAndGeneralAffairs", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.HumanResourcesAndGeneralAffairs > 0) .OrderBy(o => o.HumanResourcesAndGeneralAffairs)) .TemplateTab( context: context, name: "Education", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Education > 0) .OrderBy(o => o.Education)) .TemplateTab( context: context, name: "Purchase", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Purchase > 0) .OrderBy(o => o.Purchase)) .TemplateTab( context: context, name: "Logistics", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Logistics > 0) .OrderBy(o => o.Logistics)) .TemplateTab( context: context, name: "LegalAffairs", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.LegalAffairs > 0) .OrderBy(o => o.LegalAffairs)) .TemplateTab( context: context, name: "ProductList", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.ProductList > 0) .OrderBy(o => o.ProductList)) .TemplateTab( context: context, name: "Classification", - templates: Def.TemplateDefinitionCollection - .Where(o => o.Language == context.Language) + templates: templates .Where(o => o.Classification > 0) .OrderBy(o => o.Classification))); } @@ -3227,6 +3189,26 @@ private static HtmlBuilder EditorTabs(this HtmlBuilder hb, Context context, Site text: Displays.Scripts(context: context)), _using: context.ContractSettings.Script != false); break; + case "Dashboards": + hb + .Li( + action: () => hb + .A( + href: "#DashboardPartSettingsEditor", + text: Displays.DashboardParts(context: context)) + .Li( + action: () => hb + .A( + href: "#StylesSettingsEditor", + text: Displays.Styles(context: context)), + _using: context.ContractSettings.Style != false) + .Li( + action: () => hb + .A( + href: "#ScriptsSettingsEditor", + text: Displays.Scripts(context: context)), + _using: context.ContractSettings.Script != false)); + break; case "Wikis": hb .Li( @@ -3854,7 +3836,9 @@ private static HtmlBuilder SiteMenuStyle( { switch (referenceType) { - case "Wikis": return hb; + case "Wikis": + case "Dashboards": + return hb; default: return hb.StackStyles(); } } @@ -4083,6 +4067,7 @@ public static string PreviewTemplate( switch (ss.ReferenceType) { case "Sites": + case "Dashboards": html = PreviewTemplate( context: context, ss: ss, @@ -4133,9 +4118,12 @@ public static string PreviewTemplate(Context context, SiteSettings ss, string ti .FieldSet( id: name + "Editor", action: () => hb - .Div(css: "nav-site sites", action: () => hb + .Div(css: "nav-site" + + (ss.ReferenceType != "Dashboards" + ? " sites" + : " dashboards"), action: () => hb .Span(css: "title", action: () => hb.Text(title)) - .Div(css: "heading")))) + .Div(css: "heading", _using: ss.ReferenceType != "Dashboards")))) .ToString(); } @@ -4411,6 +4399,16 @@ private static HtmlBuilder Editor( .Class("dialog") .Title(Displays.Script(context: context)), _using: context.ContractSettings.Script != false) + .Div( + attributes: new HtmlAttributes() + .Id("DashboardPartDialog") + .Class("dialog") + .Title(Displays.Dashboards(context: context))) + .Div( + attributes: new HtmlAttributes() + .Id("DashboardPartTimeLineSitesDialog") + .Class("dialog") + .Title(Displays.SiteId(context: context))) .Div( attributes: new HtmlAttributes() .Id("ServerScriptDialog") @@ -4559,6 +4557,12 @@ private static HtmlBuilder FieldSetGeneral( .StylesSettingsEditor(context: context, ss: siteModel.SiteSettings) .ScriptsSettingsEditor(context: context, ss: siteModel.SiteSettings); break; + case "Dashboards": + hb + .DashboardPartSettingsEditor(context: context, ss: siteModel.SiteSettings) + .StylesSettingsEditor(context: context, ss: siteModel.SiteSettings) + .ScriptsSettingsEditor(context: context, ss: siteModel.SiteSettings); + break; case "Wikis": hb .NotificationsSettingsEditor(context: context, ss: siteModel.SiteSettings) @@ -4632,7 +4636,9 @@ public static HtmlBuilder GuideEditor( fieldCss: "field-wide", labelText: ss.ReferenceType == "Sites" ? Displays.MenuGuide(context: context) - : Displays.Sites_GridGuide(context: context), + : (ss.ReferenceType == "Dashboards" + ? Displays.DashboardGuide(context: context) + : Displays.Sites_GridGuide(context: context)), text: siteModel.GridGuide, mobile: context.Mobile, _using: siteModel.ReferenceType != "Wikis") @@ -4644,7 +4650,8 @@ public static HtmlBuilder GuideEditor( labelText: Displays.Sites_EditorGuide(context: context), text: siteModel.EditorGuide, mobile: context.Mobile, - _using: ss.ReferenceType != "Sites") + _using: ss.ReferenceType != "Sites" + && ss.ReferenceType != "Dashboards") .FieldMarkDown( context: context, ss: ss, @@ -4654,7 +4661,8 @@ public static HtmlBuilder GuideEditor( text: siteModel.CalendarGuide, mobile: context.Mobile, _using: ss.ReferenceType != "Sites" - && ss.ReferenceType != "Wikis") + && ss.ReferenceType != "Wikis" + && ss.ReferenceType != "Dashboards") .FieldMarkDown( context: context, ss: ss, @@ -4664,7 +4672,8 @@ public static HtmlBuilder GuideEditor( text: siteModel.CrosstabGuide, mobile: context.Mobile, _using: ss.ReferenceType != "Sites" - && ss.ReferenceType != "Wikis") + && ss.ReferenceType != "Wikis" + && ss.ReferenceType != "Dashboards") .FieldMarkDown( context: context, ss: ss, @@ -4692,7 +4701,8 @@ public static HtmlBuilder GuideEditor( text: siteModel.TimeSeriesGuide, mobile: context.Mobile, _using: ss.ReferenceType != "Sites" - && ss.ReferenceType != "Wikis") + && ss.ReferenceType != "Wikis" + && ss.ReferenceType != "Dashboards") .FieldMarkDown( context: context, ss: ss, @@ -4702,7 +4712,8 @@ public static HtmlBuilder GuideEditor( text: siteModel.KambanGuide, mobile: context.Mobile, _using: ss.ReferenceType != "Sites" - && ss.ReferenceType != "Wikis") + && ss.ReferenceType != "Wikis" + && ss.ReferenceType != "Dashboards") .FieldMarkDown( context: context, ss: ss, @@ -4712,7 +4723,8 @@ public static HtmlBuilder GuideEditor( text: siteModel.ImageLibGuide, mobile: context.Mobile, _using: ss.ReferenceType != "Sites" - && ss.ReferenceType != "Wikis"))); + && ss.ReferenceType != "Wikis" + && ss.ReferenceType != "Dashboards"))); } /// @@ -4797,7 +4809,7 @@ private static HtmlBuilder GridSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditBulkUpdateColumns', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -7509,7 +7521,7 @@ private static HtmlBuilder SummariesSettingsEditor( controlCss: "button-icon", text: Displays.Copy(context: context), onClick: "$p.setAndSend('#EditSummary', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -7960,7 +7972,7 @@ private static HtmlBuilder FormulasSettingsEditor( controlCss: "button-icon", text: Displays.Copy(context: context), onClick: "$p.setAndSend('#EditFormula', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -8198,7 +8210,7 @@ private static HtmlBuilder ProcessesSettingsEditor( controlCss: "button-icon", text: Displays.Copy(context: context), onClick: "$p.setAndSend('#EditProcess', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -9056,7 +9068,7 @@ private static HtmlBuilder ProcessDataChangesTab( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditProcessDataChange', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -9665,7 +9677,7 @@ private static HtmlBuilder StatusControlsSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditStatusControl', $(this));", - icon: "ui-icon-gear", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -10111,7 +10123,7 @@ private static HtmlBuilder ViewsSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.send($(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "put") .Button( @@ -10469,7 +10481,7 @@ private static HtmlBuilder ViewGridTab( /// /// Fixed: /// - private static HtmlBuilder ViewFiltersTab( + public static HtmlBuilder ViewFiltersTab( this HtmlBuilder hb, Context context, SiteSettings ss, @@ -10828,18 +10840,25 @@ public static HtmlBuilder ViewFilter( /// /// Fixed: /// - private static HtmlBuilder ViewSortersTab( - this HtmlBuilder hb, Context context, SiteSettings ss, View view) + public static HtmlBuilder ViewSortersTab( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + View view, + string prefix = "", + bool usekeepSorterState = true, + bool currentTableOnly = false) { - return hb.FieldSet(id: "ViewSortersTab", action: () => hb + return hb.FieldSet(id: $"{prefix}ViewSortersTab", action: () => hb .FieldCheckBox( controlId: "KeepSorterState", fieldCss: "field-auto-thin", labelText: Displays.KeepSorterState(context: context), _checked: view.KeepSorterState == true, - labelPositionIsRight: true) + labelPositionIsRight: true, + _using: usekeepSorterState) .FieldSet( - id: "ViewFiltersSorterConditionSettingsEditor", + id: $"{prefix}ViewFiltersSorterConditionSettingsEditor", css: "both" + (view.KeepSorterState == true ? " hidden" : string.Empty), @@ -10849,7 +10868,7 @@ private static HtmlBuilder ViewSortersTab( legendText: Displays.SortCondition(context: context), action: () => hb .FieldBasket( - controlId: "ViewSorters", + controlId: $"{prefix}ViewSorters", fieldCss: "field-wide", controlCss: "control-basket cf", listItemCollection: view.ColumnSorterHash?.ToDictionary( @@ -10861,13 +10880,15 @@ private static HtmlBuilder ViewSortersTab( .Text(text: Displays.Sorters(context: context))) .FieldDropDown( context: context, - controlId: "ViewSorterSelector", + controlId: $"{prefix}ViewSorterSelector", fieldCss: "field-auto-thin", controlCss: " always-send", - optionCollection: ss.ViewSorterOptions(context: context)) + optionCollection: ss.ViewSorterOptions( + context: context, + currentTableOnly: currentTableOnly)) .FieldDropDown( context: context, - controlId: "ViewSorterOrderTypes", + controlId: $"{prefix}ViewSorterOrderTypes", fieldCss: "field-auto-thin", controlCss: " always-send", optionCollection: new Dictionary @@ -10876,8 +10897,9 @@ private static HtmlBuilder ViewSortersTab( { "desc", Displays.OrderDesc(context: context) } }) .Button( - controlId: "AddViewSorter", - controlCss: "button-icon", + controlId: $"Add{prefix}ViewSorter", + controlCss: " add-view-sorter button-icon", + attributes: new Dictionary() { { "data-prefix", prefix } }, text: Displays.Add(context: context), icon: "ui-icon-plus")))); } @@ -11411,7 +11433,7 @@ private static HtmlBuilder NotificationsSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditNotification', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -11906,7 +11928,7 @@ private static HtmlBuilder RemindersSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditReminder', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "delete") .Button( @@ -12371,7 +12393,7 @@ private static HtmlBuilder ExportsSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditExport', $(this));", - icon: "ui-icon-gear", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "put") .Button( @@ -13206,7 +13228,7 @@ private static HtmlBuilder StylesSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditStyle', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -13271,27 +13293,41 @@ private static HtmlBuilder EditStyleHeader( .Th(action: () => hb .Text(text: Displays.Title(context: context))) .Th(action: () => hb - .Text(text: Displays.All(context: context))) - .Th(action: () => hb - .Text(text: Displays.New(context: context))) - .Th(action: () => hb - .Text(text: Displays.Edit(context: context))) - .Th(action: () => hb - .Text(text: Displays.Index(context: context))) - .Th(action: () => hb - .Text(text: Displays.Calendar(context: context))) - .Th(action: () => hb - .Text(text: Displays.Crosstab(context: context))) - .Th(action: () => hb - .Text(text: Displays.Gantt(context: context))) - .Th(action: () => hb - .Text(text: Displays.BurnDown(context: context))) - .Th(action: () => hb - .Text(text: Displays.TimeSeries(context: context))) - .Th(action: () => hb - .Text(text: Displays.Kamban(context: context))) - .Th(action: () => hb - .Text(text: Displays.ImageLib(context: context))))); + .Text(text: Displays.Disabled(context: context))) + .EditDestinationStyleHeader( + context: context, + _using: ss.ReferenceType != "Dashboards"))); + } + + /// + /// Fixed: + /// + private static HtmlBuilder EditDestinationStyleHeader(this HtmlBuilder hb, Context context, bool _using) + { + if (!_using) return hb; + return hb + .Th(action: () => hb + .Text(text: Displays.All(context: context))) + .Th(action: () => hb + .Text(text: Displays.New(context: context))) + .Th(action: () => hb + .Text(text: Displays.Edit(context: context))) + .Th(action: () => hb + .Text(text: Displays.Index(context: context))) + .Th(action: () => hb + .Text(text: Displays.Calendar(context: context))) + .Th(action: () => hb + .Text(text: Displays.Crosstab(context: context))) + .Th(action: () => hb + .Text(text: Displays.Gantt(context: context))) + .Th(action: () => hb + .Text(text: Displays.BurnDown(context: context))) + .Th(action: () => hb + .Text(text: Displays.TimeSeries(context: context))) + .Th(action: () => hb + .Text(text: Displays.Kamban(context: context))) + .Th(action: () => hb + .Text(text: Displays.ImageLib(context: context))); } /// @@ -13319,47 +13355,63 @@ public static HtmlBuilder EditStyleBody( .Td(action: () => hb .Span( css: "ui-icon ui-icon-circle-check", - _using: style.All == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.New == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.Edit == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.Index == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.Calendar == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.Crosstab == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.Gantt == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.BurnDown == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.TimeSeries == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.Kamban == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: style.ImageLib == true))))); + _using: style.Disabled == true)) + .EditDestinationStyleBody( + style: style, + _using: ss.ReferenceType != "Dashboards")))); + } + + /// + /// Fixed: + /// + private static HtmlBuilder EditDestinationStyleBody(this HtmlBuilder hb, Style style, bool _using) + { + if (!_using) return hb; + return hb + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.All == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.New == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.Edit == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.Index == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.Calendar == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.Crosstab == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.Gantt == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.BurnDown == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.TimeSeries == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.Kamban == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: style.ImageLib == true)); } /// @@ -13405,6 +13457,12 @@ public static HtmlBuilder StyleDialog( controlCss: " always-send", labelText: Displays.Style(context: context), text: style.Body) + .FieldCheckBox( + fieldId: "StyleDisabled", + controlId: "StyleDisabled", + controlCss: " always-send", + labelText: Displays.Disabled(context: context), + _checked: style.Disabled == true) .FieldSet( css: enclosedCss, legendText: Displays.OutputDestination(context: context), @@ -13474,7 +13532,13 @@ public static HtmlBuilder StyleDialog( fieldCss: outputDestinationCss, controlCss: " always-send", labelText: Displays.ImageLib(context: context), - _checked: style.ImageLib == true)) + _checked: style.ImageLib == true), + _using: ss.ReferenceType != "Dashboards") + .Hidden( + controlId: "StyleAll", + css: " always-send", + value: "1", + _using: ss.ReferenceType == "Dashboards") .P(css: "message-dialog") .Div(css: "command-center", action: () => hb .Button( @@ -13540,7 +13604,7 @@ private static HtmlBuilder ScriptsSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditScript', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -13560,7 +13624,8 @@ private static HtmlBuilder ScriptsSettingsEditor( /// /// Fixed: /// - public static HtmlBuilder EditScript(this HtmlBuilder hb, Context context, SiteSettings ss) + public static HtmlBuilder EditScript( + this HtmlBuilder hb, Context context, SiteSettings ss) { var selected = context.Forms.Data("EditScript").Deserialize>(); return hb.Table( @@ -13599,27 +13664,41 @@ private static HtmlBuilder EditScriptHeader( .Th(action: () => hb .Text(text: Displays.Title(context: context))) .Th(action: () => hb - .Text(text: Displays.All(context: context))) - .Th(action: () => hb - .Text(text: Displays.New(context: context))) - .Th(action: () => hb - .Text(text: Displays.Edit(context: context))) - .Th(action: () => hb - .Text(text: Displays.Index(context: context))) - .Th(action: () => hb - .Text(text: Displays.Calendar(context: context))) - .Th(action: () => hb - .Text(text: Displays.Crosstab(context: context))) - .Th(action: () => hb - .Text(text: Displays.Gantt(context: context))) - .Th(action: () => hb - .Text(text: Displays.BurnDown(context: context))) - .Th(action: () => hb - .Text(text: Displays.TimeSeries(context: context))) - .Th(action: () => hb - .Text(text: Displays.Kamban(context: context))) - .Th(action: () => hb - .Text(text: Displays.ImageLib(context: context))))); + .Text(text: Displays.Disabled(context: context))) + .EditDestinationScriptHeader( + context:context, + _using: ss.ReferenceType != "Dashboards"))); + } + + /// + /// Fixed: + /// + private static HtmlBuilder EditDestinationScriptHeader(this HtmlBuilder hb, Context context, bool _using) + { + if (!_using) return hb; + return hb + .Th(action: () => hb + .Text(text: Displays.All(context: context))) + .Th(action: () => hb + .Text(text: Displays.New(context: context))) + .Th(action: () => hb + .Text(text: Displays.Edit(context: context))) + .Th(action: () => hb + .Text(text: Displays.Index(context: context))) + .Th(action: () => hb + .Text(text: Displays.Calendar(context: context))) + .Th(action: () => hb + .Text(text: Displays.Crosstab(context: context))) + .Th(action: () => hb + .Text(text: Displays.Gantt(context: context))) + .Th(action: () => hb + .Text(text: Displays.BurnDown(context: context))) + .Th(action: () => hb + .Text(text: Displays.TimeSeries(context: context))) + .Th(action: () => hb + .Text(text: Displays.Kamban(context: context))) + .Th(action: () => hb + .Text(text: Displays.ImageLib(context: context))); } /// @@ -13647,47 +13726,63 @@ public static HtmlBuilder EditScriptBody( .Td(action: () => hb .Span( css: "ui-icon ui-icon-circle-check", - _using: script.All == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.New == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.Edit == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.Index == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.Calendar == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.Crosstab == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.Gantt == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.BurnDown == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.TimeSeries == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.Kamban == true)) - .Td(action: () => hb - .Span( - css: "ui-icon ui-icon-circle-check", - _using: script.ImageLib == true))))); + _using: script.Disabled == true)) + .EditDestinationScriptBody( + script: script, + _using: ss.ReferenceType != "Dashboards")))); + } + + /// + /// Fixed: + /// + private static HtmlBuilder EditDestinationScriptBody(this HtmlBuilder hb, Script script, bool _using) + { + if (!_using) return hb; + return hb + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.All == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.New == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Edit == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Index == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Calendar == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Crosstab == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Gantt == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.BurnDown == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.TimeSeries == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Kamban == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.ImageLib == true)); } /// @@ -13733,6 +13828,12 @@ public static HtmlBuilder ScriptDialog( controlCss: " always-send", labelText: Displays.Script(context: context), text: script.Body) + .FieldCheckBox( + fieldId: "ScriptDisabled", + controlId: "ScriptDisabled", + controlCss: " always-send", + labelText: Displays.Disabled(context: context), + _checked: script.Disabled == true) .FieldSet( css: enclosedCss, legendText: Displays.OutputDestination(context: context), @@ -13802,7 +13903,13 @@ public static HtmlBuilder ScriptDialog( fieldCss: outputDestinationCss, controlCss: " always-send", labelText: Displays.ImageLib(context: context), - _checked: script.ImageLib == true)) + _checked: script.ImageLib == true), + _using: ss.ReferenceType != "Dashboards") + .Hidden( + controlId: "ScriptAll", + css: " always-send", + value: "1", + _using: ss.ReferenceType == "Dashboards") .P(css: "message-dialog") .Div(css: "command-center", action: () => hb .Button( @@ -13869,7 +13976,7 @@ private static HtmlBuilder ServerScriptsSettingsEditor( text: Displays.Copy(context: context), controlCss: "button-icon", onClick: "$p.setAndSend('#EditServerScript', $(this));", - icon: "ui-icon-trash", + icon: "ui-icon-copy", action: "SetSiteSettings", method: "post") .Button( @@ -14426,6 +14533,640 @@ private static HtmlBuilder EditRelatingColumnsBody( .Select(o => GetClassLabelText(ss, o)).Join(", ")))))); } + /// + /// Fixed: + /// + private static HtmlBuilder DashboardPartSettingsEditor( + this HtmlBuilder hb, Context context, SiteSettings ss) + { + if (context.ContractSettings.Script == false) return hb; + return hb.FieldSet(id: "DashboardPartSettingsEditor", action: () => hb + .Div(css: "command-left", action: () => hb + .Button( + controlId: "MoveUpDashboardParts", + controlCss: "button-icon", + text: Displays.MoveUp(context: context), + onClick: "$p.setAndSend('#EditDashboardPart', $(this));", + icon: "ui-icon-circle-triangle-n", + action: "SetSiteSettings", + method: "post") + .Button( + controlId: "MoveDownDashboardParts", + controlCss: "button-icon", + text: Displays.MoveDown(context: context), + onClick: "$p.setAndSend('#EditDashboardPart', $(this));", + icon: "ui-icon-circle-triangle-s", + action: "SetSiteSettings", + method: "post") + .Button( + controlId: "NewDashboardPart", + text: Displays.New(context: context), + controlCss: "button-icon", + onClick: "$p.openDashboardPartDialog($(this));", + icon: "ui-icon-gear", + action: "SetSiteSettings", + method: "put") + .Button( + controlId: "CopyDashboardParts", + text: Displays.Copy(context: context), + controlCss: "button-icon", + onClick: "$p.setAndSend('#EditDashboardPart', $(this));", + icon: "ui-icon-trash", + action: "SetSiteSettings", + method: "post") + .Button( + controlId: "DeleteDashboardParts", + text: Displays.Delete(context: context), + controlCss: "button-icon", + onClick: "$p.setAndSend('#EditDashboardPart', $(this));", + icon: "ui-icon-trash", + action: "SetSiteSettings", + method: "delete", + confirm: Displays.ConfirmDelete(context: context))) + .EditDashboardPart( + context: context, + ss: ss)); + } + + /// + /// Fixed: + /// + public static HtmlBuilder EditDashboardPart( + this HtmlBuilder hb, Context context, SiteSettings ss) + { + var selected = context.Forms.Data("EditDashboardPart").Deserialize>(); + return hb.Table( + id: "EditDashboardPart", + css: "grid", + attributes: new HtmlAttributes() + .DataName("DashboardPartId") + .DataFunc("openDashboardPartDialog") + .DataAction("SetSiteSettings") + .DataMethod("post"), + action: () => hb + .EditDashboardPartHeader( + context: context, + ss: ss, + selected: selected) + .EditDashboardPartBody( + context: context, + ss: ss, + selected: selected)); + } + + /// + /// Fixed: + /// + private static HtmlBuilder EditDashboardPartHeader( + this HtmlBuilder hb, Context context, SiteSettings ss, IEnumerable selected) + { + return hb.THead(action: () => hb + .Tr(css: "ui-widget-header", action: () => hb + .Th(action: () => hb + .CheckBox( + controlCss: "select-all", + _checked: ss.Scripts?.All(o => + selected?.Contains(o.Id) == true) == true)) + .Th(action: () => hb + .Text(text: Displays.Id(context: context))) + .Th(action: () => hb + .Text(text: Displays.Title(context: context))) + .Th(action: () => hb + .Text(text: Displays.PartsType(context: context))) + .Th(action: () => hb + .Text(text: "X")) + .Th(action: () => hb + .Text(text: "Y")) + .Th(action: () => hb + .Text(text: Displays.Width(context: context))) + .Th(action: () => hb + .Text(text: Displays.Height(context: context))))); + } + + /// + /// Fixed: + /// + public static HtmlBuilder EditDashboardPartBody( + this HtmlBuilder hb, Context context, SiteSettings ss, IEnumerable selected) + { + return hb.TBody(action: () => ss + .DashboardParts?.ForEach(dashboardPart => hb + .Tr( + css: "grid-row", + attributes: new HtmlAttributes() + .DataId(dashboardPart.Id.ToString()), + action: () => hb + .Td(action: () => hb + .CheckBox( + controlCss: "select", + _checked: selected? + .Contains(dashboardPart.Id) == true)) + .Td(action: () => hb + .Text(text: dashboardPart.Id.ToString())) + .Td(action: () => hb + .Text(text: dashboardPart.Title)) + .Td(action: () => hb + .Text(text: dashboardPart.PartTypeString(context: context))) + .Td(action: () => hb + .Text(text: dashboardPart.X.ToString())) + .Td(action: () => hb + .Text(text: dashboardPart.Y.ToString())) + .Td(action: () => hb + .Text(text: dashboardPart.Width.ToString())) + .Td(action: () => hb + .Text(text: dashboardPart.Height.ToString()))))); + } + + /// + /// Fixed: + /// + public static HtmlBuilder DashboardPartTimeLineSitesDialog( + Context context, + SiteSettings ss, + int dashboardPartId, + string dashboardTimeLineSites) + { + var hb = new HtmlBuilder(); + return hb.Form( + attributes: new HtmlAttributes() + .Id("DashboardPartTimeLineSitesEditForm") + .Action(Locations.ItemAction( + context: context, + id: ss.SiteId)), + action: () => hb + .FieldTextBox( + controlId: "DashboardPartTimeLineSitesEdit", + fieldCss: "field-wide", + controlCss: " always-send", + labelText: Displays.SiteId(context: context), + text: dashboardTimeLineSites, + validateRequired: true) + .Hidden( + controlId: "DashboardPartId", + alwaysSend: true, + value: dashboardPartId.ToString()) + .Hidden( + controlId: "SavedDashboardPartTimeLineSites", + alwaysSend: true, + value: dashboardTimeLineSites) + .Hidden( + controlId: "ClearDashboardView", + action: "SetSiteSettings", + method: "post") + .P( + id: "DashboardPartTimeLineSitesMessage", + css: "message-dialog") + .Div(css: "command-center", action: () => hb + .Button( + controlId: "UpdateDashboardPartTimeLineSites", + text: Displays.OK(context: context), + controlCss: "button-icon validate", + icon: "ui-icon-pencil", + onClick: "$p.updateDashboardPartTimeLineSites($(this));", + action: "SetSiteSettings", + method: "post"))); + } + + /// + /// Fixed: + /// + public static HtmlBuilder DashboardPartDialog( + Context context, + SiteSettings ss, + string controlId, + DashboardPart dashboardPart) + { + var filterVisible = dashboardPart.Type == DashboardPartType.TimeLine; + var hb = new HtmlBuilder(); + return hb.Form( + attributes: new HtmlAttributes() + .Id("DashboardPartForm") + .Action(Locations.ItemAction( + context: context, + id: ss.SiteId)), + action: () => hb + .Div( + id: "ViewTabsContainer", + css: "tab-container", + action: () => hb.Ul( + id: "ViewTabs", + action: () => hb + .Li( + id: "DashboardPartGeneralTabControl", + action: () => hb + .A( + href: "#DashboardPartGeneralTabContainer", + text: Displays.General(context: context))) + .Li( + id: "DashboardPartViewFiltersTabControl", + css: filterVisible ? "" : "hidden", + action: () => hb + .A( + href: "#DashboardPartViewFiltersTabContainer", + text: Displays.Filters(context: context))) + .Li( + id: "DashboardPartViewSortersTabControl", + css: filterVisible ? "" : "hidden", + action: () => hb + .A( + href: "#DashboardPartViewSortersTabContainer", + text: Displays.Sorters(context: context))) + .Li(action: () => hb + .A( + href: "#DashboardPartAccessControlsTab", + text: Displays.AccessControls(context: context)))) + .DashboardPartGeneralTab( + context: context, + ss: ss, + dashboardPart: dashboardPart, + controlId: controlId) + .DashboardPartViewFiltersTab( + context: context, + dashboardPart: dashboardPart) + .DashboardPartViewSortersTab( + context: context, + dashboardPart: dashboardPart) + .DashboardPartAccessControlsTab( + context: context, + ss: ss, + dashboardPart: dashboardPart)) + .P(css: "message-dialog") + .Div(css: "command-center", action: () => hb + .Button( + controlId: "AddDashboardPart", + text: Displays.Add(context: context), + controlCss: "button-icon validate", + icon: "ui-icon-disk", + onClick: "$p.setDashboardPart($(this));", + action: "SetSiteSettings", + method: "post", + _using: controlId == "NewDashboardPart") + .Button( + controlId: "UpdateDashboardPart", + text: Displays.Change(context: context), + controlCss: "button-icon validate", + onClick: "$p.setDashboardPart($(this));", + icon: "ui-icon-disk", + action: "SetSiteSettings", + method: "post", + _using: controlId == "EditDashboardPart") + .Button( + text: Displays.Cancel(context: context), + controlCss: "button-icon", + onClick: "$p.closeDialog($(this));", + icon: "ui-icon-cancel"))); + } + + /// + /// Fixed: + /// + private static HtmlBuilder DashboardPartGeneralTab( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + string controlId, + DashboardPart dashboardPart) + { + string hiddenCss(bool hide) => hide ? " hidden" : ""; + return hb + .FieldSet(id: $"DashboardPartGeneralTabContainer", action: () => hb + .FieldText( + controlId: "DashboardPartId", + controlCss: " always-send", + labelText: Displays.Id(context: context), + text: dashboardPart.Id.ToString(), + _using: controlId == "EditDashboardPart") + .FieldTextBox( + controlId: "DashboardPartTitle", + fieldCss: "field-wide", + controlCss: " always-send", + labelText: Displays.Title(context: context), + text: dashboardPart.Title, + validateRequired: true) + .FieldCheckBox( + controlId: "DashboardPartShowTitle", + fieldCss: "field-wide", + controlContainerCss: "m-l50", + controlCss: " always-send", + labelText: Displays.DisplayTitle(context: context), + _checked: dashboardPart.ShowTitle ?? false) + .FieldDropDown( + context: context, + controlId: "DashboardPartType", + controlCss: " always-send", + labelText: Displays.PartsType(context: context), + optionCollection: new Dictionary + { + { + DashboardPartType.QuickAccess.ToInt().ToString(), + Displays.QuickAccess(context: context) + }, + { + DashboardPartType.TimeLine.ToInt().ToString(), + Displays.TimeLine(context: context) + }, + { + DashboardPartType.Custom.ToInt().ToString(), + Displays.DashboardCustom(context: context) + }, + { + DashboardPartType.CustomHtml.ToInt().ToString(), + Displays.DashboardCustomHtml(context: context) + }, + }, + selectedValue: dashboardPart.Type.ToInt().ToString(), + insertBlank: false) + .FieldTextBox( + controlId: "DashboardPartQuickAccessSites", + fieldId: "DashboardPartQuickAccessSitesField", + textType: HtmlTypes.TextTypes.MultiLine, + fieldCss: "field-wide" + + hiddenCss(dashboardPart.Type != DashboardPartType.QuickAccess), + controlCss: " always-send", + labelText: Displays.SiteId(context: context), + text: dashboardPart.QuickAccessSites) + .FieldDropDown( + context: context, + controlId: "DashboardPartQuickAccessLayout", + fieldId: "DashboardPartQuickAccessLayoutField", + controlCss: " always-send", + fieldCss: hiddenCss(dashboardPart.Type != DashboardPartType.QuickAccess), + labelText: Displays.QuickAccessLayout(context: context), + optionCollection: new Dictionary + { + { + QuickAccessLayout.Horizontal.ToInt().ToString(), + Displays.Horizontal(context: context) + }, + { + QuickAccessLayout.Vertical.ToInt().ToString(), + Displays.Vertical(context: context) + } + }, + selectedValue: dashboardPart.QuickAccessLayout.ToInt().ToString(), + insertBlank: false) + .Div( + id: "DashboardPartTimeLineSitesField", + css: "both" + hiddenCss(dashboardPart.Type != DashboardPartType.TimeLine), + action: () => + { + var timeLineSites = dashboardPart.TimeLineSites; + var baseSiteId = DashboardPart.GetBaseSiteSettings( + context: context, + timeLineSitesString: timeLineSites) + ?.SiteId; + hb + .FieldText( + controlId: "DashboardPartTimeLineSitesValue", + labelText: Displays.SiteId(context: context), + text: timeLineSites) + .Hidden( + controlId: "DashboardPartTimeLineSites", + alwaysSend: true, + value: timeLineSites) + .Hidden( + controlId: "DashboardPartBaseSiteId", + alwaysSend: true, + value: baseSiteId == null + ? null + : baseSiteId.ToString()) + .Button( + controlId: "EditTimeLineSites", + text: Displays.Edit(context: context), + controlCss: "button-icon", + onClick: "$p.openDashboardPartTimeLineSitesDialog($(this));", + icon: "ui-icon-pencil", + action: "SetSiteSettings", + method: "post"); + }) + .FieldTextBox( + controlId: "DashboardPartTimeLineTitle", + fieldId: "DashboardPartTimeLineTitleField", + fieldCss: "field-wide" + hiddenCss(dashboardPart.Type != DashboardPartType.TimeLine), + controlCss: " always-send", + labelText: Displays.RecordTitle(context: context), + text: dashboardPart.TimeLineTitle.IsNullOrEmpty() + ? $"[Title]" + : SiteSettingsUtilities.Get(context: context, dashboardPart.SiteId)? + .ColumnNameToLabelText(dashboardPart.TimeLineTitle)) + .FieldTextBox( + textType: HtmlTypes.TextTypes.MultiLine, + controlId: "DashboardPartTimeLineBody", + fieldId: "DashboardPartTimeLineBodyField", + fieldCss: "field-wide" + hiddenCss(dashboardPart.Type != DashboardPartType.TimeLine), + controlCss: " always-send", + labelText: Displays.RecordBody(context: context), + text: dashboardPart.TimeLineBody.IsNullOrEmpty() + ? $"[Body]" + : SiteSettingsUtilities.Get(context: context, dashboardPart.SiteId)? + .ColumnNameToLabelText(dashboardPart.TimeLineBody)) + .FieldDropDown( + context: context, + controlId: "DashboardPartTimeLineDisplayType", + fieldId: "DashboardPartTimeLineDisplayTypeField", + controlCss: " always-send", + fieldCss: hiddenCss(dashboardPart.Type != DashboardPartType.TimeLine), + labelText: Displays.TimeLineDisplayType(context: context), + optionCollection: new Dictionary + { + { + TimeLineDisplayType.Simple.ToInt().ToString(), + Displays.TimeLineSimple(context: context) + }, + { + TimeLineDisplayType.Standard.ToInt().ToString(), + Displays.TimeLineStandard(context: context) + }, + { + TimeLineDisplayType.Detailed.ToInt().ToString(), + Displays.TimeLineDetailed(context: context) + } + }, + selectedValue: dashboardPart.TimeLineDisplayType.ToInt().ToString(), + insertBlank: false) + .FieldSpinner( + controlId: "DashboardPartTimeLineItemCount", + fieldId: "DashboardPartTimeLineItemCountField", + fieldCss: "field-auto" + hiddenCss(dashboardPart.Type != DashboardPartType.TimeLine), + controlCss: " always-send", + labelText: Displays.DisplayCount(context: context), + value: dashboardPart.TimeLineItemCount == 0 + ? Parameters.Dashboard.TimeLineItemCount + : dashboardPart.TimeLineItemCount, + min: Parameters.Dashboard.TimeLineItemCountMin, + max: Parameters.Dashboard.TimeLineItemCountMax, + step: 1) + .FieldMarkDown( + context: context, + ss: ss, + controlId: "DashboardPartContent", + fieldId: "DashboardPartContentField", + fieldCss: "field-wide" + + hiddenCss(dashboardPart.Type != DashboardPartType.Custom), + controlCss: " always-send", + labelText: Displays.Body(context: context), + text: dashboardPart.Content, + mobile: context.Mobile) + .Field( + fieldId: "DashboardPartHtmlContentField", + fieldCss: "field-wide" + + hiddenCss(dashboardPart.Type != DashboardPartType.CustomHtml), + labelText: Displays.Body(context: context), + controlAction: () => hb + .TextArea( + css: "control-textarea always-send", + name: "DashboardPartHtmlContent", + id: "DashboardPartHtmlContent", + text: dashboardPart.HtmlContent)) + .FieldTextBox( + controlId: "DashboardPartExtendedCss", + controlCss: " always-send", + labelText: "CSS", + text: dashboardPart.ExtendedCss)); + } + + /// + /// Fixed: + /// + public static HtmlBuilder DashboardPartViewFiltersTab( + this HtmlBuilder hb, + Context context, + DashboardPart dashboardPart, + bool clearView = false, + bool _using = true) + { + if (_using == false) return hb; + var view = clearView + ? new View() + : (dashboardPart.View ?? new View()); + var currentSs = SiteSettingsUtilities.Get( + context: context, + dashboardPart.SiteId); + if (currentSs == null) + { + return hb.FieldSet(id: "DashboardPartViewFiltersTabContainer"); + } + return hb.FieldSet(id: "DashboardPartViewFiltersTabContainer", + action: () => hb.ViewFiltersTab( + context: context, + ss: currentSs, + view: view, + prefix: "DashboardPart", + currentTableOnly: true)); + } + + /// + /// Fixed: + /// + public static HtmlBuilder DashboardPartViewSortersTab( + this HtmlBuilder hb, + Context context, + DashboardPart dashboardPart, + bool clearView = false, + bool _using = true) + { + if (_using == false) return hb; + var view = clearView + ? new View() + : (dashboardPart.View ?? new View()); + var ss = SiteSettingsUtilities.Get( + context: context, + dashboardPart.SiteId); + if (ss == null) + { + return hb.FieldSet(id: "DashboardPartViewSortersTabContainer"); + } + return hb.FieldSet(id: "DashboardPartViewSortersTabContainer", + action: () => hb.ViewSortersTab( + context: context, + ss: ss, + view: view, + prefix: "DashboardPart", + usekeepSorterState: false, + currentTableOnly: true)); + } + + /// + /// Fixed: + /// + private static HtmlBuilder DashboardPartAccessControlsTab( + this HtmlBuilder hb, + Context context, + SiteSettings ss, + DashboardPart dashboardPart) + { + var currentPermissions = dashboardPart.GetPermissions(ss: ss); + var sourcePermissions = PermissionUtilities.SourceCollection( + context: context, + ss: ss, + searchText: context.Forms.Data("SearchDashboardPartAccessControlElements"), + currentPermissions: currentPermissions, + allUsers: false); + var offset = context.Forms.Int("SourceDashboardPartAccessControlOffset"); + return hb.FieldSet(id: "DashboardPartAccessControlsTab", action: () => hb + .Div(id: "DashboardPartAccessControlEditor", action: () => hb + .FieldSelectable( + controlId: "CurrentDashboardPartAccessControl", + fieldCss: "field-vertical both", + controlContainerCss: "container-selectable", + controlCss: " always-send send-all", + labelText: Displays.Permissions(context: context), + listItemCollection: currentPermissions.ToDictionary( + o => o.Key(), o => o.ControlData( + context: context, + ss: ss, + withType: false)), + commandOptionPositionIsTop: true, + commandOptionAction: () => hb + .Div(css: "command-left", action: () => hb + .Button( + controlCss: "button-icon", + text: Displays.DeletePermission(context: context), + onClick: "$p.deleteDashboardPartAccessControl();", + icon: "ui-icon-circle-triangle-e"))) + .FieldSelectable( + controlId: "SourceDashboardPartAccessControl", + fieldCss: "field-vertical", + controlContainerCss: "container-selectable", + controlWrapperCss: " h300", + labelText: Displays.OptionList(context: context), + listItemCollection: sourcePermissions + .Page(offset) + .ListItemCollection( + context: context, + ss: ss, + withType: false), + commandOptionPositionIsTop: true, + action: "Permissions", + method: "post", + commandOptionAction: () => hb + .Div(css: "command-left", action: () => hb + .Button( + controlCss: "button-icon", + text: Displays.AddPermission(context: context), + onClick: "$p.addDashboardPartAccessControl();", + icon: "ui-icon-circle-triangle-w") + .TextBox( + controlId: "SearchDashboardPartAccessControl", + controlCss: " auto-postback w100", + placeholder: Displays.Search(context: context), + action: "SetSiteSettings", + method: "post") + .Button( + text: Displays.Search(context: context), + controlCss: "button-icon", + onClick: "$p.send($('#SearchDashboardPartAccessControl'));", + icon: "ui-icon-search"))) + .Hidden( + controlId: "SourceDashboardPartAccessControlOffset", + css: "always-send", + value: Paging.NextOffset( + offset: offset, + totalCount: sourcePermissions.Count(), + pageSize: Parameters.Permissions.PageSize) + .ToString()))); + } + /// /// Fixed: /// diff --git a/Implem.Pleasanter/Models/Tenants/TenantApiModel.cs b/Implem.Pleasanter/Models/Tenants/TenantApiModel.cs index 96612b416..f7f78d4f9 100644 --- a/Implem.Pleasanter/Models/Tenants/TenantApiModel.cs +++ b/Implem.Pleasanter/Models/Tenants/TenantApiModel.cs @@ -22,6 +22,7 @@ public class TenantApiModel : _BaseApiModel public string HtmlTitleRecord { get; set; } public string TopStyle { get; set; } public string TopScript { get; set; } + public string TopDashboards { get; set; } public string Comments { get; set; } public int? Creator { get; set; } public int? Updator { get; set; } @@ -52,6 +53,7 @@ public override object ObjectValue(string columnName) case "HtmlTitleRecord": return HtmlTitleRecord; case "TopStyle": return TopStyle; case "TopScript": return TopScript; + case "TopDashboards": return TopDashboards; case "Comments": return Comments; case "Creator": return Creator; case "Updator": return Updator; diff --git a/Implem.Pleasanter/Models/Tenants/TenantModel.cs b/Implem.Pleasanter/Models/Tenants/TenantModel.cs index a0dcd1830..8b0dd95f3 100644 --- a/Implem.Pleasanter/Models/Tenants/TenantModel.cs +++ b/Implem.Pleasanter/Models/Tenants/TenantModel.cs @@ -41,6 +41,7 @@ public class TenantModel : BaseModel public string HtmlTitleRecord = "[ProductName]"; public string TopStyle = string.Empty; public string TopScript = string.Empty; + public string TopDashboards = string.Empty; public int SavedTenantId = 0; public string SavedTenantName = string.Empty; public string SavedTitle = string.Empty; @@ -56,6 +57,7 @@ public class TenantModel : BaseModel public string SavedHtmlTitleRecord = "[ProductName]"; public string SavedTopStyle = string.Empty; public string SavedTopScript = string.Empty; + public string SavedTopDashboards = string.Empty; public bool TenantId_Updated(Context context, bool copy = false, Column column = null) { @@ -225,6 +227,18 @@ public bool TopScript_Updated(Context context, bool copy = false, Column column || column.GetDefaultInput(context: context).ToString() != TopScript); } + public bool TopDashboards_Updated(Context context, bool copy = false, Column column = null) + { + if (copy && column?.CopyByDefault == true) + { + return column.GetDefaultInput(context: context).ToString() != TopDashboards; + } + return TopDashboards != SavedTopDashboards && TopDashboards != null + && (column == null + || column.DefaultInput.IsNullOrEmpty() + || column.GetDefaultInput(context: context).ToString() != TopDashboards); + } + public bool ContractDeadline_Updated(Context context, bool copy = false, Column column = null) { if (copy && column?.CopyByDefault == true) @@ -411,6 +425,7 @@ public TenantApiModel GetByApi(Context context, SiteSettings ss) case "HtmlTitleRecord": data.HtmlTitleRecord = HtmlTitleRecord; break; case "TopStyle": data.TopStyle = TopStyle; break; case "TopScript": data.TopScript = TopScript; break; + case "TopDashboards": data.TopDashboards = TopDashboards; break; case "Creator": data.Creator = Creator.Id; break; case "Updator": data.Updator = Updator.Id; break; case "CreatedTime": data.CreatedTime = CreatedTime.Value.ToLocal(context: context); break; @@ -502,6 +517,11 @@ public string ToDisplay(Context context, SiteSettings ss, Column column, List SetClass( @@ -1169,6 +1192,10 @@ private void Set(Context context, SiteSettings ss, DataRow dataRow, string table TopScript = dataRow[column.ColumnName].ToString(); SavedTopScript = TopScript; break; + case "TopDashboards": + TopDashboards = dataRow[column.ColumnName].ToString(); + SavedTopDashboards = TopDashboards; + break; case "Comments": Comments = dataRow[column.ColumnName].ToString().Deserialize() ?? new Comments(); SavedComments = Comments.ToJson(); @@ -1273,6 +1300,7 @@ public bool Updated(Context context) || HtmlTitleRecord_Updated(context: context) || TopStyle_Updated(context: context) || TopScript_Updated(context: context) + || TopDashboards_Updated(context: context) || Comments_Updated(context: context) || Creator_Updated(context: context) || Updator_Updated(context: context); diff --git a/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs b/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs index ba879517b..deceaa044 100644 --- a/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs +++ b/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs @@ -603,6 +603,16 @@ private static HtmlBuilder FieldSetGeneralColumns( [TenantModel.LogoTypes.ImageAndTitle.ToInt().ToString()] = Displays.ImageAndText(context) } , selectedValue: tenantModel.LogoType.ToInt().ToString()) + .FieldDropDown( + context: context, + controlId: "Tenants_TopDashboards", + controlCss: " always-send", + labelText: Displays.Dashboards(context: context), + optionCollection: GetDashboardSelectOptions(context: context), + selectedValue: tenantModel.TopDashboards + ?.Deserialize() + ?.FirstOrDefault() + ?.ToString()) .FieldSet( id: "PermissionsField", css: " enclosed", @@ -1062,6 +1072,12 @@ public static ResponseCollection FieldResponse( value: tenantModel.TopScript.ToResponse(context: context, ss: ss, column: column), options: column.ResponseValOptions(serverScriptModelColumn: serverScriptModelColumn)); break; + case "TopDashboards": + res.Val( + target: "#Tenants_TopDashboards" + idSuffix, + value: tenantModel.TopDashboards.ToResponse(context: context, ss: ss, column: column), + options: column.ResponseValOptions(serverScriptModelColumn: serverScriptModelColumn)); + break; default: switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) { @@ -1317,6 +1333,9 @@ private static ResponseCollection ResponseByUpdate( .Val("#VerUp", verUp) .Val("#Ver", tenantModel.Ver) .Disabled("#VerUp", verUp) + .ReplaceAll("#Breadcrumb", new HtmlBuilder().TenantsBreadcrumb( + context: context, + ss:ss)) .Html("#HeaderTitle", HttpUtility.HtmlEncode(tenantModel.Title.Value)) .Html("#RecordInfo", new HtmlBuilder().RecordInfo( context: context, @@ -1512,6 +1531,32 @@ public static string History(Context context, SiteSettings ss, int tenantId) .ToJson(); } + /// + /// Fixed: + /// + public static Dictionary GetDashboardSelectOptions(Context context) + { + var dashboards = new SiteCollection( + context: context, + column: Rds.SitesColumn() + .SiteId() + .Title(), + where: Rds.SitesWhere() + .TenantId(context.TenantId) + .ReferenceType("Dashboards") + .Add( + raw: Def.Sql.HasPermission, + _using: !context.HasPrivilege)); + var options = new Dictionary() + { + {"",""} + }; + options.AddRange(dashboards.ToDictionary( + o => o.SiteId.ToString(), + o => $"[{o.SiteId}] {o.Title.DisplayValue}")); + return options; + } + /// /// Fixed: /// diff --git a/Implem.Pleasanter/Models/Tenants/TenantValidators.cs b/Implem.Pleasanter/Models/Tenants/TenantValidators.cs index de51b3b5e..8a64c5ab5 100644 --- a/Implem.Pleasanter/Models/Tenants/TenantValidators.cs +++ b/Implem.Pleasanter/Models/Tenants/TenantValidators.cs @@ -389,6 +389,21 @@ public static ErrorData OnCreating( sysLogsDescription: Debugs.GetSysLogsDescription()); } break; + case "TopDashboards": + if (tenantModel.TopDashboards_Updated( + context: context, + column: column, + copy: copy)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; case "ContractDeadline": if (tenantModel.ContractDeadline_Updated( context: context, @@ -725,6 +740,18 @@ public static ErrorData OnUpdating( sysLogsDescription: Debugs.GetSysLogsDescription()); } break; + case "TopDashboards": + if (tenantModel.TopDashboards_Updated(context: context)) + { + return new ErrorData( + context: context, + type: Error.Types.HasNotChangeColumnPermission, + data: column.LabelText, + api: api, + sysLogsStatus: 403, + sysLogsDescription: Debugs.GetSysLogsDescription()); + } + break; case "Comments": if (tenantModel.Comments_Updated(context: context)) { diff --git a/Implem.Pleasanter/Models/Users/UserModel.cs b/Implem.Pleasanter/Models/Users/UserModel.cs index 79f5a6a15..4f83d5b43 100644 --- a/Implem.Pleasanter/Models/Users/UserModel.cs +++ b/Implem.Pleasanter/Models/Users/UserModel.cs @@ -3788,7 +3788,7 @@ public bool Self(Context context) /// /// Fixed: /// - public string Authenticate(Context context, string returnUrl) + public string Authenticate(Context context, string returnUrl, bool noHttpContext = false) { if (Parameters.Security.RevealUserDisabled && DisabledUser(context: context)) { @@ -3828,8 +3828,9 @@ public string Authenticate(Context context, string returnUrl) ? OpenChangePasswordAtLoginDialog(context: context) : Allow( context: context, - returnUrl: GetReturnUrl(returnUrl: returnUrl), - createPersistentCookie: context.Forms.Bool("Users_RememberMe")); + returnUrl: returnUrl, + createPersistentCookie: context.Forms.Bool("Users_RememberMe"), + noHttpContext: noHttpContext); } else if (PasswordExpired()) { @@ -3839,8 +3840,9 @@ public string Authenticate(Context context, string returnUrl) { return Allow( context: context, - returnUrl: GetReturnUrl(returnUrl: returnUrl), - createPersistentCookie: context.Forms.Bool("Users_RememberMe")); + returnUrl: returnUrl, + createPersistentCookie: context.Forms.Bool("Users_RememberMe"), + noHttpContext: noHttpContext); } } else @@ -4319,8 +4321,15 @@ public string Allow( Context context, string returnUrl, bool atLogin = false, - bool createPersistentCookie = false) + bool createPersistentCookie = false, + bool noHttpContext = false) { + context.SetUserProperties( + userModel: this, + noHttpContext: noHttpContext); + var loginAfterUrl = GetReturnUrl( + context: context, + returnUrl: returnUrl); IncrementsNumberOfLogins(context: context); SetFormsAuthentication( context: context, @@ -4332,9 +4341,9 @@ public string Allow( .Message( message: Messages.LoginIn(context: context), target: "#LoginMessage") - .Href(returnUrl.IsNullOrEmpty() + .Href(loginAfterUrl.IsNullOrEmpty() ? Locations.Top(context: context) - : returnUrl).ToJson(); + : loginAfterUrl).ToJson(); } /// @@ -4875,13 +4884,20 @@ private void InitializeTimeZone() /// /// Fixed: /// - public string GetReturnUrl(string returnUrl) + public string GetReturnUrl(Context context, string returnUrl) { - return Permissions.PrivilegedUsers(LoginId) && Parameters.Locations.LoginAfterUrlExcludePrivilegedUsers - ? returnUrl - : returnUrl.IsNullOrEmpty() || returnUrl == "/" + if (Permissions.PrivilegedUsers(LoginId) && Parameters.Locations.LoginAfterUrlExcludePrivilegedUsers) + { + return returnUrl; + } + if (returnUrl.IsNullOrEmpty() || returnUrl == "/") + { + var dashboardUrl = Locations.DashboardUrl(context: context); + return dashboardUrl.IsNullOrEmpty() ? Parameters.Locations.LoginAfterUrl - : returnUrl; + : dashboardUrl; + } + return returnUrl; } /// diff --git a/Implem.Pleasanter/Models/Users/UserUtilities.cs b/Implem.Pleasanter/Models/Users/UserUtilities.cs index 758cc1c1c..62119cc57 100644 --- a/Implem.Pleasanter/Models/Users/UserUtilities.cs +++ b/Implem.Pleasanter/Models/Users/UserUtilities.cs @@ -3533,7 +3533,7 @@ public static string ChangePasswordAtLogin(Context context) ? error.MessageJson(context: context) : userModel.Allow( context: context, - returnUrl: userModel.GetReturnUrl(returnUrl: context.Forms.Data("ReturnUrl")), + returnUrl: context.Forms.Data("ReturnUrl"), atLogin: true); } diff --git a/Implem.Pleasanter/bundleconfig.json b/Implem.Pleasanter/bundleconfig.json index f188f9ca8..82be4f03f 100644 --- a/Implem.Pleasanter/bundleconfig.json +++ b/Implem.Pleasanter/bundleconfig.json @@ -44,6 +44,7 @@ "wwwroot/scripts/confirmevents.js", "wwwroot/scripts/controloptionevents.js", "wwwroot/scripts/crosstab.js", + "wwwroot/scripts/dashboard.js", "wwwroot/scripts/dialog.js", "wwwroot/scripts/dialogevents.js", "wwwroot/scripts/display.js", diff --git a/Implem.Pleasanter/libman.json b/Implem.Pleasanter/libman.json new file mode 100644 index 000000000..05631f911 --- /dev/null +++ b/Implem.Pleasanter/libman.json @@ -0,0 +1,14 @@ +{ + "version": "1.0", + "defaultProvider": "cdnjs", + "libraries": [ + { + "library": "gridstack.js@8.3.0", + "destination": "wwwroot/scripts/plugins/gridstack.js/", + "files": [ + "gridstack-all.min.js", + "gridstack.min.css" + ] + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/content/responsive.css b/Implem.Pleasanter/wwwroot/content/responsive.css index 974879cdc..18b46e9cb 100644 --- a/Implem.Pleasanter/wwwroot/content/responsive.css +++ b/Implem.Pleasanter/wwwroot/content/responsive.css @@ -160,7 +160,9 @@ #Guide { font-size: 2.6vw; } -.alert-success { height: auto; font-size: 2.6vw; } +.alert-success, +.alert-warning, +.alert-error { height: auto; font-size: 2.6vw; } #MainCommandsContainer { height:auto; padding: 2vw 0; font-size: 2.6vw; z-index: 200; } #Footer { z-index: 102; } @@ -178,7 +180,7 @@ border-radius: 4px; border:1px solid #111; border-radius: 4px; } - +.message { bottom: 140px; } } @@ -527,6 +529,9 @@ overflow: hidden; .h350 { height: auto;} #EditInDialogBody { padding-bottom: 15%; } + +.links { + overflow: auto; } @media screen and (max-width: 980px) and (min-width: 0px) { diff --git a/Implem.Pleasanter/wwwroot/content/responsive.min.css b/Implem.Pleasanter/wwwroot/content/responsive.min.css index 8e98d6334..7376014e9 100644 --- a/Implem.Pleasanter/wwwroot/content/responsive.min.css +++ b/Implem.Pleasanter/wwwroot/content/responsive.min.css @@ -1 +1 @@ -@media screen and (max-width:980px) and (min-width:0){#LoginFieldSet{width:100%;padding:10px;font-size:4vw}#LoginFieldSet input,#LoginFieldSet select{font-size:5vw;padding:10px}#LoginFieldSet input[type=checkbox]{transform:scale(2);margin:20px 0 0 10px}#LoginFieldSet button{font-size:4vw}#LoginFieldSet .container-normal{margin-left:0}#LoginFieldSet .field-wide,#LoginFieldSet .field-normal{width:100%;margin:10px 0;float:left}#LoginFieldSet .field-normal .control-checkbox+label{width:auto;margin:0 0 0 30px}#Logins .field-label{width:auto;padding:4px}#LoginMessage{width:100%}#Demo{width:100%;padding:10px;font-size:4vw}#DemoFields .field-label{width:auto;padding:4px}#DemoFields input{font-size:5vw;padding:10px}#DemoFields button{font-size:4vw;float:right;margin-top:10px}#DemoFields .container-normal{margin-left:0}#DemoFields .field-normal{width:100%;margin:10px 0;float:left}@media screen and (max-width:600px) and (min-width:0){#LoginFieldSet .field-wide{min-height:10vw !important}}#StartGuide{display:none}.container-normal>#ApiKey{word-break:break-all}div[role="dialog"]{width:100% !important;z-index:999}#EnterPriseBanner,#SupportBanner,#CasesBanner{display:none}#EditorTabsContainer>fieldset{display:contents}#EditorTabsContainer>fieldset>fieldset{display:contents}#TenantImage{width:100%}#Search{width:auto;height:auto}#Breadcrumb{display:none}#CopyToClipboards{display:none}#ViewSelectorField{position:relative;margin-bottom:5px;font-size:2.8vw}#HeaderTitleContainer{margin-bottom:3%}#ViewFilters{font-size:2.6vw;padding-bottom:2%}#Aggregations{font-size:2.6vw}#ViewFilters_Reset{float:none}#ViewFilters.reduced,#Aggregations.reduced{border-bottom:1px solid #aaa;margin-bottom:2%;padding:2%}#Aggregations .label{height:auto}#ViewFilters>.field-auto-thin{height:6vw;padding:0;margin:2% 0 0 0;line-height:1;width:49%;display:flex;justify-content:start;align-items:center}#ViewFilters>.field-auto-thin>.field-control{width:100%}#ViewFilters>.field-auto-thin>.field-label{width:30%;text-align:left}#ViewFilters>.field-auto-thin>.field-label+.field-control{width:70%}.ui-multiselect{width:98%!important;height:6vw}.field-auto-thin input[type="checkbox"],.field-auto-thin input[type="radio"]{height:2.6vw;width:2.6vw;margin-right:1vw}.control-checkbox{margin:0}.control-checkbox+label{margin:0}.field-auto-thin>.field-label{padding:0}#RecordInfo div{clear:both;margin-right:0}#RecordInfo div p{font-size:2.6vw}#Application{padding-bottom:15%}#MainForm{display:flex;flex-direction:column}#RecordInfo{margin-bottom:2%}#RecordSwitchers{font-size:2.6vw;width:100%}.ui-button,#RecordSwitchers .current{height:auto;padding:2%!important;line-height:1;margin-right:2%}#EditorComments{width:100%;order:3;font-size:2.6vw}#EditorTabsContainer{width:100%}.fieldset.ui-tabs-panel.ui-widget-content{font-size:2.6vw}.ui-tabs .ui-tabs-panel{padding:1%}.field-wide,.field-markdown{width:100%;min-height:5vw;float:none;padding:0 0 3% 0;clear:both}.field-normal{width:100%;height:auto;padding:0}.field-normal.right-align{text-align:left}.field-markdown>.field-label,.field-normal>.field-label,.field-wide>.field-label{width:100%;clear:both;margin-left:0;padding:1%;font-weight:bold;text-align:left;text-align-last:left}.field-normal>.field-label label,.field-wide>.field-label label{font-weight:bold}.field-normal .container-normal,.field-control .container-normal{margin-left:0}.control-dropdown{height:auto}.ui-spinner a.ui-spinner-button{height:50%}.field-normal .control-text{width:100%;height:auto;padding:1%;line-height:1}.control-textbox{height:auto}.ui-widget.ui-widget-content{background:#fff;font-size:2.6vw}#Guide{font-size:2.6vw}.alert-success{height:auto;font-size:2.6vw}#MainCommandsContainer{height:auto;padding:2vw 0;font-size:2.6vw;z-index:200}#Footer{z-index:102}.ui-tabs .ui-tabs-nav{padding:1%;font-size:2.6vw}.ui-tabs .ui-tabs-nav li{margin-bottom:1%;padding-bottom:0;border:1px solid #111;border-radius:4px}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:1%;padding-bottom:0;border:1px solid #111;border-radius:4px}}@media screen and (max-width:980px) and (min-width:0){body{min-width:320px!important}#Header{height:auto;position:relative}#Header #Logo{padding-bottom:2%}#CorpLogo{float:none;width:30%}#MainContainer{min-height:100vh}#Header a#navtgl{position:absolute;display:block;padding:1.6vw 1.4vw;border:.4vw solid #d19405;border-radius:1vw;top:1.4vw;right:4vw;height:8vw;width:8vw;z-index:101;background:#fece2f}#Header a#navtgl::before{content:'';display:block;height:1.3vw;border-top:.4vw solid #333;border-bottom:.4vw solid #333}#Header a#navtgl::after{content:'';display:block;height:1.4vw;border-bottom:.4vw solid #333}* #Navigations{box-sizing:border-box}#Navigations{width:100%;max-height:0;overflow:hidden;margin:0;padding:0 5%;border:none;position:relative;top:0;right:0;border-radius:0;z-index:100;font-size:3.2vw;line-height:7vw;transition:.5s}#Navigations.open{max-height:none;height:auto;overflow:visible;margin-top:2%;margin-bottom:5%;padding:5%;transition:.5s}#NavigationMenu>li.sub-menu>div.hover{background:none}#Header .ui-widget-header{background:#f3f3f3;color:#111}.ui-widget-header{background:#817865;color:#fff}#NavigationMenu{float:none;margin-right:0;margin-bottom:3%}#SearchField{float:none;margin:0;color:#000}#NavigationMenu>li{width:100%;height:auto;display:block;float:none;position:relative;color:#333}#NavigationMenu>li>div{height:auto;text-align:left;line-height:7vw;color:#333;font-weight:bold}#NavigationMenu>li>div:hover{background:none}#NavigationMenu>li>div>a{height:auto;display:block;color:#333;text-decoration:none;font-weight:bold}#NavigationMenu .menu{width:100%;border-top:none !important;position:relative;top:0;right:0;border-radius:0;z-index:3}.pc-dn{display:block!important}#NavigationMenu .menu>li>a.ui-state-active{font-weight:normal;text-decoration:none}.ui-widget-content{color:#333}.ui-menu .ui-menu-item{border-top:1px solid #d19405}#NewMenuContainer{border:1px solid #d19405;background:#fff}}@media screen and (max-width:980px) and (min-width:0){#SiteMenu .nav-site{width:20vw;height:20vw;text-align:center;background-color:#fff;border:solid 2px #c0c0c0;border-radius:.5vw;float:none;margin:6%}#SiteMenu .sortable{display:flex;justify-content:flex-start;align-items:flex-start;flex-wrap:wrap}#SiteMenu .nav-site.sites{width:20vw!important;height:20vw!important;background:#fff;border:solid 2px #ffa500;border-radius:5px}#SiteMenu .nav-site .heading{width:8vw;height:3vw;top:-3vw;background-color:#f8da4c;border:solid 2px #ffa500}#SiteMenu .nav-site.sites.to-parent{height:auto!important;box-shadow:none;margin-top:3%;margin-bottom:0}#SiteMenu .nav-site.sites.to-parent span.title{position:relative;top:0;text-align:left;width:100%;margin-left:0}#SiteMenu .nav-site.sites.to-parent .heading{display:none}#SiteMenu .nav-site a{padding:0;overflow:inherit}#SiteMenu .nav-site .site-image-thumbnail{position:relative;top:inherit;left:inherit;max-width:inherit;border-radius:unset;width:90%;z-index:1;margin:0 auto;display:block}#SiteMenu .nav-site span.title::before{content:'';display:block;height:0}#SiteMenu .nav-site span.title{margin-left:0;font-size:14px}#SiteMenu .nav-site.has-image a{padding:1vw 0 0}#SiteMenu .nav-site .conditions{position:absolute;top:-2.4vw;right:-2.4vw;z-index:2}#SiteMenu .nav-site .conditions .elapsed-time{display:none}#SiteMenu .nav-site .conditions .count{display:none}#SiteMenu .nav-site .conditions .overdue{height:6vw;min-width:6vw;line-height:6vw;font-size:2.6vw;border-radius:3vw;font-weight:bold;padding:0}#SiteMenu .nav-site[data-type="Wikis"]{border-radius:2px;position:relative;width:20vw;border:2px solid #ccc}#SiteMenu .nav-site[data-type="Wikis"] a::before,#SiteMenu .nav-site[data-type="Wikis"] a::after{content:'';display:block;position:absolute;height:20%;width:80%;left:10%;border-top:2px solid #ccc;border-bottom:2px solid #ccc}#SiteMenu .nav-site[data-type="Wikis"] a::before{top:20%}#SiteMenu .nav-site[data-type="Wikis"] a::after{top:60%}#SiteMenu .nav-site[data-type="Wikis"] a img{margin-top:15%}#SiteMenu .nav-site.sites.to-parent{height:auto!important;border:none;background:none;text-align:left}#SiteMenu .nav-site.to-parent .ui-icon{display:none}#SiteMenu .nav-site.to-parent a{position:relative;display:inline-block;padding:0 0 0 16px;color:#000;vertical-align:middle;text-decoration:none;font-size:15px}#SiteMenu .nav-site.to-parent a::before,#SiteMenu .nav-site.to-parent a::after{position:absolute;top:0;bottom:0;left:0;margin:auto;content:"";vertical-align:middle}#SiteMenu .nav-site.to-parent a::before{left:5px;width:7px;height:3px;background:#7a0}#SiteMenu .nav-site.to-parent a::after{left:2px;width:6px;height:6px;border-bottom:3px solid #7a0;border-left:3px solid #7a0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#SiteMenu .nav-site span.title{margin-left:0;font-size:2.6vw;top:22vw;position:absolute;display:block;text-align:center;width:140%;margin-left:-20%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#SiteMenu .nav-site .stacking1{width:20vw;height:20vw;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:1px;left:1px;border-radius:5px}#SiteMenu .nav-site .stacking2{width:20vw;height:20vw;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:4px;left:4px;border-radius:5px}#SiteMenu .nav-sites .to-parent a img{display:none}#SiteMenu .nav-site.to-parent.has-image a{padding:0 0 0 15px}}@media screen and (max-width:980px) and (min-width:0){#FieldSetStandard{display:flex;flex-direction:column}.legend{order:2}#StandardTemplatesViewer{order:3}.template-selectable{order:1;float:none}.template-viewer-container{float:none;margin:0}.template-viewer{margin:0}.template-selectable{width:100%}.template-tab-container{min-height:10px}.field-vertical{width:100%;float:none;padding:0 0 20px 0}.container-selectable .wrapper{min-height:auto}.h350{height:auto}#EditInDialogBody{padding-bottom:15%}}@media screen and (max-width:980px) and (min-width:0){#FieldSetHistories{overflow:auto;width:100%}#ViewModeContainer{overflow:auto;width:100%;padding-top:1%}#CrosstabBody{overflow:auto;width:100%}#GanttBody{overflow:auto;width:100%;padding-top:5%}.grid{font-size:2.8vw;width:98%}.grid>thead th{min-width:10vw;white-space:nowrap}.grid>tbody td{min-width:10vw;white-space:nowrap}.grid>thead th:nth-child(1),.grid>tbody td:nth-child(1){min-width:1vw}.grid>tbody td p{white-space:nowrap}#Calendar{font-size:2.6vw}#Calendar button{margin-bottom:2%}#CalendarBody #Grid thead{background:#fff}#CalendarMonth{display:block}#Calendar .field-auto-thin{display:flex;align-items:center;width:33%;margin:0;padding:0;margin-bottom:2%!important}#Calendar .field-auto-thin p{margin-right:1%}#Calendar .field-auto-thin select{max-width:none}#CalendarTimePeriod,#CalendarFromTo,#CalendarMonth{height:auto}#CalendarMonth{margin-bottom:2%}.w100{width:auto}#CrosstabBody{margin-top:3%}#CrosstabBody #Grid{table-layout:auto}#CrosstabBody .grid>thead>tr>th,#CrosstabBody .grid>tbody>tr>th{white-space:nowrap}#CrosstabBody .grid>thead th{min-width:10vw;white-space:nowrap}#CrosstabBody .grid>tbody td{min-width:10vw;white-space:nowrap}#Crosstab{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}#Crosstab .field-auto-thin{display:flex;align-items:center;width:48%;margin:0;padding:0;font-size:2.6vw}#Crosstab .field-auto-thin#CrosstabTimePeriodField{width:48%}#Crosstab .field-auto-thin p{width:100%;margin-right:2%;white-space:nowrap}#Crosstab .field-auto-thin select{max-width:none}#Crosstab #CrosstabMonth{width:48%;margin-top:2%;margin-right:0;font-size:2.6vw}#Crosstab button{font-size:2.6vw;margin-top:1%}.svg-crosstab{display:block}#ViewModeContainer .both{display:flex;align-items:center;flex-wrap:wrap}#ViewModeContainer .both .field-auto-thin{display:flex;align-items:center;width:48%;margin:0;padding:0;font-size:2.6vw;height:auto;padding-top:2%}#ViewModeContainer .both .field-auto-thin .field-auto-thin{width:30%}#ViewModeContainer .both .field-auto-thin:nth-child(3){width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-auto-thin{width:48%;display:block}#ViewModeContainer .field-auto-thin p{margin-right:2%;white-space:nowrap;text-align:left}#GanttAxis{width:1500px;position:relative;left:0;bottom:0}#Gantt{width:1500px}#BurnDown{width:1500px}#TimeSeriesBody{padding-top:5%;margin-left:-5%;width:1500px}#TimeSeries{width:1500px}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3){width:48%}#ViewModeContainer #Kamban.both .field-auto-thin .field-control{width:100%}#KambanBody{margin-top:3%}#KambanBody #Grid{table-layout:auto}#KambanBody .grid>thead>tr>th,#KambanBody .grid>tbody>tr>th{white-space:nowrap}#KambanBody .grid>thead th{min-width:10vw;white-space:nowrap}#KambanBody .grid>tbody td{min-width:10vw;white-space:nowrap}}@media screen and (min-width:981px){.grid>thead>tr:first-child>th:first-child{width:20px}#CrosstabBody .grid>thead>tr:first-child>th:first-child,#KambanBody .grid>thead>tr:first-child>th:first-child{width:auto}.grid>thead>tr:first-child>th:not(:first-child){white-space:nowrap}#CrosstabBody .grid>thead>tr:first-child>th:not(:first-child),#KambanBody .grid>thead>tr:first-child>th:not(:first-child){white-space:inherit}.grid>tbody>tr td:not(:first-child){white-space:nowrap;min-width:40px}#CrosstabBody .grid>tbody>tr td:not(:first-child),#KambanBody .grid>tbody>tr td:not(:first-child){white-space:inherit;min-width:auto}} \ No newline at end of file +@media screen and (max-width:980px) and (min-width:0){#LoginFieldSet{width:100%;padding:10px;font-size:4vw}#LoginFieldSet input,#LoginFieldSet select{font-size:5vw;padding:10px}#LoginFieldSet input[type=checkbox]{transform:scale(2);margin:20px 0 0 10px}#LoginFieldSet button{font-size:4vw}#LoginFieldSet .container-normal{margin-left:0}#LoginFieldSet .field-wide,#LoginFieldSet .field-normal{width:100%;margin:10px 0;float:left}#LoginFieldSet .field-normal .control-checkbox+label{width:auto;margin:0 0 0 30px}#Logins .field-label{width:auto;padding:4px}#LoginMessage{width:100%}#Demo{width:100%;padding:10px;font-size:4vw}#DemoFields .field-label{width:auto;padding:4px}#DemoFields input{font-size:5vw;padding:10px}#DemoFields button{font-size:4vw;float:right;margin-top:10px}#DemoFields .container-normal{margin-left:0}#DemoFields .field-normal{width:100%;margin:10px 0;float:left}@media screen and (max-width:600px) and (min-width:0){#LoginFieldSet .field-wide{min-height:10vw !important}}#StartGuide{display:none}.container-normal>#ApiKey{word-break:break-all}div[role="dialog"]{width:100% !important;z-index:999}#EnterPriseBanner,#SupportBanner,#CasesBanner{display:none}#EditorTabsContainer>fieldset{display:contents}#EditorTabsContainer>fieldset>fieldset{display:contents}#TenantImage{width:100%}#Search{width:auto;height:auto}#Breadcrumb{display:none}#CopyToClipboards{display:none}#ViewSelectorField{position:relative;margin-bottom:5px;font-size:2.8vw}#HeaderTitleContainer{margin-bottom:3%}#ViewFilters{font-size:2.6vw;padding-bottom:2%}#Aggregations{font-size:2.6vw}#ViewFilters_Reset{float:none}#ViewFilters.reduced,#Aggregations.reduced{border-bottom:1px solid #aaa;margin-bottom:2%;padding:2%}#Aggregations .label{height:auto}#ViewFilters>.field-auto-thin{height:6vw;padding:0;margin:2% 0 0 0;line-height:1;width:49%;display:flex;justify-content:start;align-items:center}#ViewFilters>.field-auto-thin>.field-control{width:100%}#ViewFilters>.field-auto-thin>.field-label{width:30%;text-align:left}#ViewFilters>.field-auto-thin>.field-label+.field-control{width:70%}.ui-multiselect{width:98%!important;height:6vw}.field-auto-thin input[type="checkbox"],.field-auto-thin input[type="radio"]{height:2.6vw;width:2.6vw;margin-right:1vw}.control-checkbox{margin:0}.control-checkbox+label{margin:0}.field-auto-thin>.field-label{padding:0}#RecordInfo div{clear:both;margin-right:0}#RecordInfo div p{font-size:2.6vw}#Application{padding-bottom:15%}#MainForm{display:flex;flex-direction:column}#RecordInfo{margin-bottom:2%}#RecordSwitchers{font-size:2.6vw;width:100%}.ui-button,#RecordSwitchers .current{height:auto;padding:2%!important;line-height:1;margin-right:2%}#EditorComments{width:100%;order:3;font-size:2.6vw}#EditorTabsContainer{width:100%}.fieldset.ui-tabs-panel.ui-widget-content{font-size:2.6vw}.ui-tabs .ui-tabs-panel{padding:1%}.field-wide,.field-markdown{width:100%;min-height:5vw;float:none;padding:0 0 3% 0;clear:both}.field-normal{width:100%;height:auto;padding:0}.field-normal.right-align{text-align:left}.field-markdown>.field-label,.field-normal>.field-label,.field-wide>.field-label{width:100%;clear:both;margin-left:0;padding:1%;font-weight:bold;text-align:left;text-align-last:left}.field-normal>.field-label label,.field-wide>.field-label label{font-weight:bold}.field-normal .container-normal,.field-control .container-normal{margin-left:0}.control-dropdown{height:auto}.ui-spinner a.ui-spinner-button{height:50%}.field-normal .control-text{width:100%;height:auto;padding:1%;line-height:1}.control-textbox{height:auto}.ui-widget.ui-widget-content{background:#fff;font-size:2.6vw}#Guide{font-size:2.6vw}.alert-success,.alert-warning,.alert-error{height:auto;font-size:2.6vw}#MainCommandsContainer{height:auto;padding:2vw 0;font-size:2.6vw;z-index:200}#Footer{z-index:102}.ui-tabs .ui-tabs-nav{padding:1%;font-size:2.6vw}.ui-tabs .ui-tabs-nav li{margin-bottom:1%;padding-bottom:0;border:1px solid #111;border-radius:4px}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:1%;padding-bottom:0;border:1px solid #111;border-radius:4px}.message{bottom:140px}}@media screen and (max-width:980px) and (min-width:0){body{min-width:320px!important}#Header{height:auto;position:relative}#Header #Logo{padding-bottom:2%}#CorpLogo{float:none;width:30%}#MainContainer{min-height:100vh}#Header a#navtgl{position:absolute;display:block;padding:1.6vw 1.4vw;border:.4vw solid #d19405;border-radius:1vw;top:1.4vw;right:4vw;height:8vw;width:8vw;z-index:101;background:#fece2f}#Header a#navtgl::before{content:'';display:block;height:1.3vw;border-top:.4vw solid #333;border-bottom:.4vw solid #333}#Header a#navtgl::after{content:'';display:block;height:1.4vw;border-bottom:.4vw solid #333}* #Navigations{box-sizing:border-box}#Navigations{width:100%;max-height:0;overflow:hidden;margin:0;padding:0 5%;border:none;position:relative;top:0;right:0;border-radius:0;z-index:100;font-size:3.2vw;line-height:7vw;transition:.5s}#Navigations.open{max-height:none;height:auto;overflow:visible;margin-top:2%;margin-bottom:5%;padding:5%;transition:.5s}#NavigationMenu>li.sub-menu>div.hover{background:none}#Header .ui-widget-header{background:#f3f3f3;color:#111}.ui-widget-header{background:#817865;color:#fff}#NavigationMenu{float:none;margin-right:0;margin-bottom:3%}#SearchField{float:none;margin:0;color:#000}#NavigationMenu>li{width:100%;height:auto;display:block;float:none;position:relative;color:#333}#NavigationMenu>li>div{height:auto;text-align:left;line-height:7vw;color:#333;font-weight:bold}#NavigationMenu>li>div:hover{background:none}#NavigationMenu>li>div>a{height:auto;display:block;color:#333;text-decoration:none;font-weight:bold}#NavigationMenu .menu{width:100%;border-top:none !important;position:relative;top:0;right:0;border-radius:0;z-index:3}.pc-dn{display:block!important}#NavigationMenu .menu>li>a.ui-state-active{font-weight:normal;text-decoration:none}.ui-widget-content{color:#333}.ui-menu .ui-menu-item{border-top:1px solid #d19405}#NewMenuContainer{border:1px solid #d19405;background:#fff}}@media screen and (max-width:980px) and (min-width:0){#SiteMenu .nav-site{width:20vw;height:20vw;text-align:center;background-color:#fff;border:solid 2px #c0c0c0;border-radius:.5vw;float:none;margin:6%}#SiteMenu .sortable{display:flex;justify-content:flex-start;align-items:flex-start;flex-wrap:wrap}#SiteMenu .nav-site.sites{width:20vw!important;height:20vw!important;background:#fff;border:solid 2px #ffa500;border-radius:5px}#SiteMenu .nav-site .heading{width:8vw;height:3vw;top:-3vw;background-color:#f8da4c;border:solid 2px #ffa500}#SiteMenu .nav-site.sites.to-parent{height:auto!important;box-shadow:none;margin-top:3%;margin-bottom:0}#SiteMenu .nav-site.sites.to-parent span.title{position:relative;top:0;text-align:left;width:100%;margin-left:0}#SiteMenu .nav-site.sites.to-parent .heading{display:none}#SiteMenu .nav-site a{padding:0;overflow:inherit}#SiteMenu .nav-site .site-image-thumbnail{position:relative;top:inherit;left:inherit;max-width:inherit;border-radius:unset;width:90%;z-index:1;margin:0 auto;display:block}#SiteMenu .nav-site span.title::before{content:'';display:block;height:0}#SiteMenu .nav-site span.title{margin-left:0;font-size:14px}#SiteMenu .nav-site.has-image a{padding:1vw 0 0}#SiteMenu .nav-site .conditions{position:absolute;top:-2.4vw;right:-2.4vw;z-index:2}#SiteMenu .nav-site .conditions .elapsed-time{display:none}#SiteMenu .nav-site .conditions .count{display:none}#SiteMenu .nav-site .conditions .overdue{height:6vw;min-width:6vw;line-height:6vw;font-size:2.6vw;border-radius:3vw;font-weight:bold;padding:0}#SiteMenu .nav-site[data-type="Wikis"]{border-radius:2px;position:relative;width:20vw;border:2px solid #ccc}#SiteMenu .nav-site[data-type="Wikis"] a::before,#SiteMenu .nav-site[data-type="Wikis"] a::after{content:'';display:block;position:absolute;height:20%;width:80%;left:10%;border-top:2px solid #ccc;border-bottom:2px solid #ccc}#SiteMenu .nav-site[data-type="Wikis"] a::before{top:20%}#SiteMenu .nav-site[data-type="Wikis"] a::after{top:60%}#SiteMenu .nav-site[data-type="Wikis"] a img{margin-top:15%}#SiteMenu .nav-site.sites.to-parent{height:auto!important;border:none;background:none;text-align:left}#SiteMenu .nav-site.to-parent .ui-icon{display:none}#SiteMenu .nav-site.to-parent a{position:relative;display:inline-block;padding:0 0 0 16px;color:#000;vertical-align:middle;text-decoration:none;font-size:15px}#SiteMenu .nav-site.to-parent a::before,#SiteMenu .nav-site.to-parent a::after{position:absolute;top:0;bottom:0;left:0;margin:auto;content:"";vertical-align:middle}#SiteMenu .nav-site.to-parent a::before{left:5px;width:7px;height:3px;background:#7a0}#SiteMenu .nav-site.to-parent a::after{left:2px;width:6px;height:6px;border-bottom:3px solid #7a0;border-left:3px solid #7a0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#SiteMenu .nav-site span.title{margin-left:0;font-size:2.6vw;top:22vw;position:absolute;display:block;text-align:center;width:140%;margin-left:-20%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#SiteMenu .nav-site .stacking1{width:20vw;height:20vw;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:1px;left:1px;border-radius:5px}#SiteMenu .nav-site .stacking2{width:20vw;height:20vw;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:4px;left:4px;border-radius:5px}#SiteMenu .nav-sites .to-parent a img{display:none}#SiteMenu .nav-site.to-parent.has-image a{padding:0 0 0 15px}}@media screen and (max-width:980px) and (min-width:0){#FieldSetStandard{display:flex;flex-direction:column}.legend{order:2}#StandardTemplatesViewer{order:3}.template-selectable{order:1;float:none}.template-viewer-container{float:none;margin:0}.template-viewer{margin:0}.template-selectable{width:100%}.template-tab-container{min-height:10px}.field-vertical{width:100%;float:none;padding:0 0 20px 0}.container-selectable .wrapper{min-height:auto}.h350{height:auto}#EditInDialogBody{padding-bottom:15%}.links{overflow:auto}@media screen and (max-width:980px) and (min-width:0){#FieldSetHistories{overflow:auto;width:100%}#ViewModeContainer{overflow:auto;width:100%;padding-top:1%}#CrosstabBody{overflow:auto;width:100%}#GanttBody{overflow:auto;width:100%;padding-top:5%}.grid{font-size:2.8vw;width:98%}.grid>thead th{min-width:10vw;white-space:nowrap}.grid>tbody td{min-width:10vw;white-space:nowrap}.grid>thead th:nth-child(1),.grid>tbody td:nth-child(1){min-width:1vw}.grid>tbody td p{white-space:nowrap}#Calendar{font-size:2.6vw}#Calendar button{margin-bottom:2%}#CalendarBody #Grid thead{background:#fff}#CalendarMonth{display:block}#Calendar .field-auto-thin{display:flex;align-items:center;width:33%;margin:0;padding:0;margin-bottom:2%!important}#Calendar .field-auto-thin p{margin-right:1%}#Calendar .field-auto-thin select{max-width:none}#CalendarTimePeriod,#CalendarFromTo,#CalendarMonth{height:auto}#CalendarMonth{margin-bottom:2%}.w100{width:auto}#CrosstabBody{margin-top:3%}#CrosstabBody #Grid{table-layout:auto}#CrosstabBody .grid>thead>tr>th,#CrosstabBody .grid>tbody>tr>th{white-space:nowrap}#CrosstabBody .grid>thead th{min-width:10vw;white-space:nowrap}#CrosstabBody .grid>tbody td{min-width:10vw;white-space:nowrap}#Crosstab{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}#Crosstab .field-auto-thin{display:flex;align-items:center;width:48%;margin:0;padding:0;font-size:2.6vw}#Crosstab .field-auto-thin#CrosstabTimePeriodField{width:48%}#Crosstab .field-auto-thin p{width:100%;margin-right:2%;white-space:nowrap}#Crosstab .field-auto-thin select{max-width:none}#Crosstab #CrosstabMonth{width:48%;margin-top:2%;margin-right:0;font-size:2.6vw}#Crosstab button{font-size:2.6vw;margin-top:1%}.svg-crosstab{display:block}#ViewModeContainer .both{display:flex;align-items:center;flex-wrap:wrap}#ViewModeContainer .both .field-auto-thin{display:flex;align-items:center;width:48%;margin:0;padding:0;font-size:2.6vw;height:auto;padding-top:2%}#ViewModeContainer .both .field-auto-thin .field-auto-thin{width:30%}#ViewModeContainer .both .field-auto-thin:nth-child(3){width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-auto-thin{width:48%;display:block}#ViewModeContainer .field-auto-thin p{margin-right:2%;white-space:nowrap;text-align:left}#GanttAxis{width:1500px;position:relative;left:0;bottom:0}#Gantt{width:1500px}#BurnDown{width:1500px}#TimeSeriesBody{padding-top:5%;margin-left:-5%;width:1500px}#TimeSeries{width:1500px}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3){width:48%}#ViewModeContainer #Kamban.both .field-auto-thin .field-control{width:100%}#KambanBody{margin-top:3%}#KambanBody #Grid{table-layout:auto}#KambanBody .grid>thead>tr>th,#KambanBody .grid>tbody>tr>th{white-space:nowrap}#KambanBody .grid>thead th{min-width:10vw;white-space:nowrap}#KambanBody .grid>tbody td{min-width:10vw;white-space:nowrap}}@media screen and (min-width:981px){.grid>thead>tr:first-child>th:first-child{width:20px}#CrosstabBody .grid>thead>tr:first-child>th:first-child,#KambanBody .grid>thead>tr:first-child>th:first-child{width:auto}.grid>thead>tr:first-child>th:not(:first-child){white-space:nowrap}#CrosstabBody .grid>thead>tr:first-child>th:not(:first-child),#KambanBody .grid>thead>tr:first-child>th:not(:first-child){white-space:inherit}.grid>tbody>tr td:not(:first-child){white-space:nowrap;min-width:40px}#CrosstabBody .grid>tbody>tr td:not(:first-child),#KambanBody .grid>tbody>tr td:not(:first-child){white-space:inherit;min-width:auto}} \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/content/styles.css b/Implem.Pleasanter/wwwroot/content/styles.css index 5bfb85a4a..2df12c3b3 100644 --- a/Implem.Pleasanter/wwwroot/content/styles.css +++ b/Implem.Pleasanter/wwwroot/content/styles.css @@ -1,79 +1,84 @@ @charset "utf-8"; -*{ +* { box-sizing: border-box; } -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video{ - margin:0; - padding:0; - border:0; - font-style:normal; - font-weight:normal; - vertical-align:baseline; +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-style: normal; + font-weight: normal; + vertical-align: baseline; } -article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section{ - display:block; +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } -input, textarea{ - margin:0; - padding:0; +input, textarea { + margin: 0; + padding: 0; } - -ol, ul{ - list-style:none; + +ol, ul { + list-style: none; } - -table{ - border-collapse:collapse; - border-spacing:0; + +table { + border-collapse: collapse; + border-spacing: 0; } - -caption, th{ - text-align:left; + +caption, th { + text-align: left; } -a:focus{ - outline:none; +a:focus { + outline: none; } .cf:before, -.cf:after{ - content:" "; - display:table; +.cf:after { + content: " "; + display: table; } -.cf:after{ - clear:both; +.cf:after { + clear: both; } -.cf{ - *zoom:1; +.cf { + *zoom: 1; } -.both{ - clear:both; +.both { + clear: both; } -img{ +img { max-width: 100%; height: auto; width /***/: auto; } ::-webkit-input-placeholder { - color: silver; } + color: silver; +} :-moz-placeholder { - color: silver; opacity: 1; } + color: silver; + opacity: 1; +} ::-moz-placeholder { - color: silver; opacity: 1; } + color: silver; + opacity: 1; +} :-ms-input-placeholder { - color: silver; + color: silver; } input[type="number"]::-webkit-outer-spin-button, @@ -83,1105 +88,1099 @@ input[type="number"]::-webkit-inner-spin-button { } input[type="number"] { - -moz-appearance:textfield; -} - -html{ - -} - -body{ - min-width:1200px; - font-size:0.75em; - font-family:Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; - clear:both; -} - -h1{ - clear:both; -} - -h2{ - clear:both; -} - -h3{ - clear:both; -} - -legend{ - cursor:pointer; -} - -legend > *{ - display:block; - float:left; -} - -label{ - position:relative; - cursor:pointer; - z-index:2; -} - -input{ - background-color:white; - position:relative; - z-index:2; -} - -select{ - position:relative; - z-index:2; -} - -table{ - width:100%; - border:0px; - border-collapse:collapse; - clear:both; -} - -td{ - padding:3px; - vertical-align:top; - color:black; -} - -td.right-align > p{ - float:right; -} - -pre{ - line-height:1.5em; - font-family:Terminal,Hiragino Kaku Gothic Pro; - word-wrap:break-word; - word-break:break-all; - white-space:pre-wrap; -} - -#Logo{ - padding:3px 0px; -} - -#CorpLogo{ - display:block; - float:left; - margin:3px 0px 0px 0px; -} - -#ProductLogo{ - display:block; - float:left; - padding:0px 0px 0px 5px; - font-size:26px; - font-weight:bold; - color:dimgray; - text-decoration:none; + -moz-appearance: textfield; } -#PortalLink{ - position:relative; - top:-38px; - right:40px; - float:right; +html { } -#LoginFieldSet{ - width:500px; - margin:150px auto 20px auto; - padding:50px; - background-color:whitesmoke; - border-radius:10px; -} - -#LoginCommands{ - text-align:right; - clear:both; -} - -#Demo{ - width:500px; - margin:0px auto; -} - -#DemoFields{ - padding:20px 10px 10px 10px; -} - -#SearchPermissionElements{ - margin-left:15px; -} - -#Breadcrumb{ - float:left; - margin:0px 0px 5px 0px; -} - -#Breadcrumb .item{ - display:block; - float:left; - padding:3px 5px; -} - -#Breadcrumb .item.trashbox{ - display:block; - float:left; - color:white; - background-color:red; - border-radius:3px; -} - -#Breadcrumb .separator{ - margin:0px 0px 0px 8px; -} - -#Guide > div{ - width:100%; - display:block; - float:left; - margin:0px 0px 5px 0px; - padding:5px 10px; - background:lightgoldenrodyellow; - border:solid 1px silver; - position:relative; - clear:both; - border-radius:5px; -} - -#CopyToClipboards > .display-control{ - float:left; - cursor:pointer; -} - -#Header{ - width:100%; - float:left; - padding:0px 6px; - border:none; - position:relative; - clear:both; -} - -#Navigations{ - height:30px; - margin:0px 0px 5px 0px; - padding:0px 5px 0px 15px; - border:none; - top:0px; - right:5px; - border-radius:20px 5px 5px 20px; - float:right; -} - -#NavigationMenu{ - float:left; - margin-right:5px; -} - -#NavigationMenu > li{ - width:158px; - height:30px; - display:block; - float:left; - position:relative; -} - -#NavigationMenu > li > div{ - height:30px; - text-align:center; - line-height:30px; - cursor:pointer; -} - -#NavigationMenu > li > div:hover{ - -} - -#NavigationMenu > li.sub-menu > div.hover{ - -} - -#NavigationMenu > li > div > a{ - height:30px; - display:block; - text-decoration:none; -} - -#NavigationMenu > li > div:hover > a{ - -} - -#NavigationMenu .menu{ - width:158px; - display:none; - border-top:none !important; - position:absolute; - top:30px; - right:0px; - border-radius:0px 0px 5px 5px; - z-index:3; -} - -#NavigationMenu .menu > li > a{ - display:block; - text-decoration:none; -} - -#NavigationMenu .menu > li > a.ui-state-active{ - font-weight:normal; - text-decoration:none; +body { + min-width: 1200px; + font-size: 0.75em; + font-family: Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; + clear: both; } -#TemplateDialog > div{ - padding:0px 15px; - overflow:hidden; +h1 { + clear: both; } -#SearchField{ - float:left; - margin:3px 0px; - color:black; +h2 { + clear: both; } -#Search{ - height:24px; +h3 { + clear: both; } -#SwitchUserInfo{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - color:white; - background-color:blue; - border-radius:7px; +legend { + cursor: pointer; } -#SwitchUserInfo > a{ - width:100%; - display:block; - float:left; - color:white; - text-decoration:none; -} + legend > * { + display: block; + float: left; + } -#ExcessLicenseWarning{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - color:white; - background:red; - border-radius:7px; +label { + position: relative; + cursor: pointer; + z-index: 2; } -#PublishWarning{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - background:red; - border-radius:7px; +input { + background-color: white; + position: relative; + z-index: 2; } -#PublishWarning > a{ - width:100%; - display:block; - float:left; - color:white; - text-decoration:none; +select { + position: relative; + z-index: 2; } -#LockedWarning{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - background:red; - border-radius:7px; -} - -#LockedWarning > div{ - width:100%; - display:block; - float:left; - color:white; - text-decoration:none; +table { + width: 100%; + border: 0px; + border-collapse: collapse; + clear: both; } -#Application{ - width:100%; - float:left; - margin:10px 0px 0px 0px; - padding:0px 10px 120px 10px; - position:relative; - clear:both; +td { + padding: 3px; + vertical-align: top; + color: black; } -#Application > .site-image-icon{ - display:block; - float:left; - margin:0px 10px 0px 0px; -} + td.right-align > p { + float: right; + } -#StartGuide{ - width:100%; - display:block; - float:left; - margin:0px 0px 10px 0px; - padding:50px 0px 0px 0px; - background-color:whitesmoke; - position:relative; - border-radius:10px; +pre { + line-height: 1.5em; + font-family: Terminal,Hiragino Kaku Gothic Pro; + word-wrap: break-word; + word-break: break-all; + white-space: pre-wrap; } -#StartGuide > #StartGuideContents{ - width:900px; - margin:0px auto; +#Logo { + padding: 3px 0px; } -#StartGuide > #StartGuideContents > a{ - width:150px; - display:block; - float:left; - margin:0px 37px; - padding:5px; - text-align:center; - border-radius:5px; +#CorpLogo { + display: block; + float: left; + margin: 3px 0px 0px 0px; } -#StartGuide > #StartGuideContents > a:hover{ - background-color:white; +#ProductLogo { + display: block; + float: left; + padding: 0px 0px 0px 5px; + font-size: 26px; + font-weight: bold; + color: dimgray; + text-decoration: none; } -#StartGuide > #StartGuideContents > a > *{ - display:block; - text-align:center; - clear:both; +#PortalLink { + position: relative; + top: -38px; + right: 40px; + float: right; } -#StartGuide > #StartGuideContents > a > img{ - width:50px; - margin:5px 50px; +#LoginFieldSet { + width: 500px; + margin: 150px auto 20px auto; + padding: 50px; + background-color: whitesmoke; + border-radius: 10px; } -#StartGuide > #DisableStartGuideField{ - display:block; - float:left; - margin:50px 0px 0px 20px; - clear:both; +#LoginCommands { + text-align: right; + clear: both; } -#StartGuide > .ui-icon{ - position:absolute; - top:10px; - right:10px; - cursor:pointer; +#Demo { + width: 500px; + margin: 0px auto; } -#SiteImageIconContainer{ - float:left; +#DemoFields { + padding: 20px 10px 10px 10px; } -#SiteImageIconContainer > *{ - margin:0px 5px 0px 0px; +#SearchPermissionElements { + margin-left: 15px; } -#HeaderTitleContainer{ - float:left; - margin:0px 0px 10px 0px; +#Breadcrumb { + float: left; + margin: 0px 0px 5px 0px; } -#HeaderTitle{ - font-size:20px; - font-weight:bold; - color:chocolate; -} + #Breadcrumb .item { + display: block; + float: left; + padding: 3px 5px; + } -#Notes > *{ - width:100%; - float:left; - margin:0px 10px 5px 0px; -} + #Breadcrumb .item.trashbox { + display: block; + float: left; + color: white; + background-color: red; + border-radius: 3px; + } -#Notes > .history{ - width:100%; - display:block; - float:left; - padding:5px 10px; - color:white; - background-color:blue; - border-radius:7px; -} + #Breadcrumb .separator { + margin: 0px 0px 0px 8px; + } -#Notes > .readonly{ - width:100%; - display:block; - float:left; - padding:5px 10px; - color:white; - background-color:orange; - border-radius:7px; +#Guide > div { + width: 100%; + display: block; + float: left; + margin: 0px 0px 5px 0px; + padding: 5px 10px; + background: lightgoldenrodyellow; + border: solid 1px silver; + position: relative; + clear: both; + border-radius: 5px; } -#ViewSelectorField{ - position:absolute; - top:-10px; - right:0px; +#CopyToClipboards > .display-control { + float: left; + cursor: pointer; } -#ViewFilters{ - width:100%; - float:left; - margin:0px 0px 5px 0px; - padding:5px 5px 2px 5px; - border:solid 1px silver; - border-radius:5px; +#Header { + width: 100%; + float: left; + padding: 0px 6px; + border: none; + position: relative; + clear: both; } -#ViewFilters.reduced{ - width:auto; - padding:0px; - border:none; +#Navigations { + height: 30px; + margin: 0px 0px 5px 0px; + padding: 0px 5px 0px 15px; + border: none; + top: 0px; + right: 5px; + border-radius: 20px 5px 5px 20px; + float: right; +} + +#NavigationMenu { + float: left; + margin-right: 5px; +} + + #NavigationMenu > li { + width: 158px; + height: 30px; + display: block; + float: left; + position: relative; + } + + #NavigationMenu > li > div { + height: 30px; + text-align: center; + line-height: 30px; + cursor: pointer; + } + + #NavigationMenu > li > div:hover { + } + + #NavigationMenu > li.sub-menu > div.hover { + } + + #NavigationMenu > li > div > a { + height: 30px; + display: block; + text-decoration: none; + } + + #NavigationMenu > li > div:hover > a { + } + + #NavigationMenu .menu { + width: 158px; + display: none; + border-top: none !important; + position: absolute; + top: 30px; + right: 0px; + border-radius: 0px 0px 5px 5px; + z-index: 3; + } + + #NavigationMenu .menu > li > a { + display: block; + text-decoration: none; + } + + #NavigationMenu .menu > li > a.ui-state-active { + font-weight: normal; + text-decoration: none; + } + +#TemplateDialog > div { + padding: 0px 15px; + overflow: hidden; +} + +#SearchField { + float: left; + margin: 3px 0px; + color: black; +} + +#Search { + height: 24px; +} + +#SwitchUserInfo { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + color: white; + background-color: blue; + border-radius: 7px; +} + + #SwitchUserInfo > a { + width: 100%; + display: block; + float: left; + color: white; + text-decoration: none; + } + +#ExcessLicenseWarning { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + color: white; + background: red; + border-radius: 7px; +} + +#PublishWarning { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + background: red; + border-radius: 7px; +} + + #PublishWarning > a { + width: 100%; + display: block; + float: left; + color: white; + text-decoration: none; + } + +#LockedWarning { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + background: red; + border-radius: 7px; +} + + #LockedWarning > div { + width: 100%; + display: block; + float: left; + color: white; + text-decoration: none; + } + +#Application { + width: 100%; + float: left; + margin: 10px 0px 0px 0px; + padding: 0px 10px 120px 10px; + position: relative; + clear: both; } -#ViewFilters > .field-auto-thin{ - height:32px; - float:left; - padding:0px; -} + #Application > .site-image-icon { + display: block; + float: left; + margin: 0px 10px 0px 0px; + } + +#StartGuide { + width: 100%; + display: block; + float: left; + margin: 0px 0px 10px 0px; + padding: 50px 0px 0px 0px; + background-color: whitesmoke; + position: relative; + border-radius: 10px; +} + + #StartGuide > #StartGuideContents { + width: 900px; + margin: 0px auto; + } + + #StartGuide > #StartGuideContents > a { + width: 150px; + display: block; + float: left; + margin: 0px 37px; + padding: 5px; + text-align: center; + border-radius: 5px; + } + + #StartGuide > #StartGuideContents > a:hover { + background-color: white; + } + + #StartGuide > #StartGuideContents > a > * { + display: block; + text-align: center; + clear: both; + } + + #StartGuide > #StartGuideContents > a > img { + width: 50px; + margin: 5px 50px; + } + + #StartGuide > #DisableStartGuideField { + display: block; + float: left; + margin: 50px 0px 0px 20px; + clear: both; + } + + #StartGuide > .ui-icon { + position: absolute; + top: 10px; + right: 10px; + cursor: pointer; + } + +#SiteImageIconContainer { + float: left; +} + + #SiteImageIconContainer > * { + margin: 0px 5px 0px 0px; + } + +#HeaderTitleContainer { + float: left; + margin: 0px 0px 10px 0px; +} + +#HeaderTitle { + font-size: 20px; + font-weight: bold; + color: chocolate; +} + +#Notes > * { + width: 100%; + float: left; + margin: 0px 10px 5px 0px; +} + +#Notes > .history { + width: 100%; + display: block; + float: left; + padding: 5px 10px; + color: white; + background-color: blue; + border-radius: 7px; +} + +#Notes > .readonly { + width: 100%; + display: block; + float: left; + padding: 5px 10px; + color: white; + background-color: orange; + border-radius: 7px; +} + +#ViewSelectorField { + position: absolute; + top: -10px; + right: 0px; +} + +#ViewFilters { + width: 100%; + float: left; + margin: 0px 0px 5px 0px; + padding: 5px 5px 2px 5px; + border: solid 1px silver; + border-radius: 5px; +} + + #ViewFilters.reduced { + width: auto; + padding: 0px; + border: none; + } + + #ViewFilters > .field-auto-thin { + height: 32px; + float: left; + padding: 0px; + } -#ViewFilters_Reset{ - display:block; - float:left; - margin:0px 20px 0px 0px; +#ViewFilters_Reset { + display: block; + float: left; + margin: 0px 20px 0px 0px; } -#ViewFilters > .display-control{ - float:left; - margin:0px 5px 0px 0px; - padding:5px 10px 5px 0px; - font-weight:bold; - cursor:pointer; +#ViewFilters > .display-control { + float: left; + margin: 0px 5px 0px 0px; + padding: 5px 10px 5px 0px; + font-weight: bold; + cursor: pointer; } #ViewFilters .ui-icon.ui-icon-info { transform: scale(1, -1); } -#FilterButton{ - display:block; - float:left; +#FilterButton { + display: block; + float: left; } -#Aggregations{ - width:100%; - float:left; - margin:0px 0px 5px 0px; - padding:3px 5px 5px 5px; - border:solid 1px silver; - border-radius:5px; +#Aggregations { + width: 100%; + float: left; + margin: 0px 0px 5px 0px; + padding: 3px 5px 5px 5px; + border: solid 1px silver; + border-radius: 5px; } -#Aggregations.reduced{ - width:auto; - padding:0px; - border:none; -} + #Aggregations.reduced { + width: auto; + padding: 0px; + border: none; + } -#Aggregations .label{ - height:26px; - display:block; - float:left; - margin:2px 5px 0px 0px; - padding:5px 10px; - background:gainsboro; - border-radius:5px; -} + #Aggregations .label { + height: 26px; + display: block; + float: left; + margin: 2px 5px 0px 0px; + padding: 5px 10px; + background: gainsboro; + border-radius: 5px; + } -#Aggregations .label.overdue{ - font-weight:bold; - color:white; - background-color:red; - cursor:pointer; -} + #Aggregations .label.overdue { + font-weight: bold; + color: white; + background-color: red; + cursor: pointer; + } -#Aggregations .data{ - height:26px; - display:block; - float:left; - margin:2px 5px 0px 0px; - padding:5px; -} + #Aggregations .data { + height: 26px; + display: block; + float: left; + margin: 2px 5px 0px 0px; + padding: 5px; + } -#Aggregations .data.overdue{ - color:red; - cursor:pointer; -} + #Aggregations .data.overdue { + color: red; + cursor: pointer; + } -#Aggregations em{ - display:block; - float:left; - margin-right:5px; - font-weight:bold; -} + #Aggregations em { + display: block; + float: left; + margin-right: 5px; + font-weight: bold; + } -#Aggregations > .display-control{ - float:left; - margin:0px 5px 0px 0px; - padding:5px 10px 5px 0px; - font-weight:bold; - cursor:pointer; -} + #Aggregations > .display-control { + float: left; + margin: 0px 5px 0px 0px; + padding: 5px 10px 5px 0px; + font-weight: bold; + cursor: pointer; + } -#SitePackagesSelectable span.include-data{ - margin:0px 0px 0px 10px; - color:red; +#SitePackagesSelectable span.include-data { + margin: 0px 0px 0px 10px; + color: red; } - -#CalendarDate{ - margin-right:10px; + +#CalendarDate { + margin-right: 10px; } - -#CalendarBody table{ - table-layout:fixed; + +#CalendarBody table { + table-layout: fixed; } - -#CalendarBody thead th{ - padding:5px; - text-align:center; - border:solid 1px silver; + +#CalendarBody thead th { + padding: 5px; + text-align: center; + border: solid 1px silver; +} + +th.calendar-header { + text-align: center; + background-color: white; } -th.calendar-header{ - text-align:center; - background-color:white; +#CalendarBody .saturday { + background-color: lightblue; } -#CalendarBody .saturday{ - background-color:lightblue; +#CalendarBody .sunday { + background-color: pink; } -#CalendarBody .sunday{ - background-color:pink; +#CalendarBody td { + padding: 0px; + border: solid 1px silver; } -#CalendarBody td{ - padding:0px; - border:solid 1px silver; -} + #CalendarBody td > div { + min-height: 50px; + padding: 5px; + } -#CalendarBody td > div{ - min-height:50px; - padding:5px; -} + #CalendarBody td.hover { + background-color: whitesmoke; + } -#CalendarBody td.hover{ - background-color:whitesmoke; +#CalendarBody .other-month { + background-color: gainsboro; } -#CalendarBody .other-month{ - background-color:gainsboro; +#CalendarBody .today { + border: solid 2px blue; + z-index: 20; } -#CalendarBody .today{ - border:solid 2px blue; - z-index:20; +#CalendarBody .item { + height: 25px; + margin: 5px 0px 0px 0px; + background-color: lightgoldenrodyellow; + border: solid 1px silver; + border-radius: 3px; } -#CalendarBody .item{ - height:25px; - margin:5px 0px 0px 0px; - background-color:lightgoldenrodyellow; - border:solid 1px silver; - border-radius:3px; -} + #CalendarBody .item.hover { + background-color: white; + border: solid 1px orange; + } -#CalendarBody .item.hover{ - background-color:white; - border:solid 1px orange; -} + #CalendarBody .item.changed { + font-weight: bold; + background-color: yellow; + border: solid 1px orange; + } -#CalendarBody .item.changed{ - font-weight:bold; - background-color:yellow; - border:solid 1px orange; -} + #CalendarBody .item .connection { + width: 14px; + height: 25px; + background-color: lightgoldenrodyellow; + border-top: solid 1px silver; + border-bottom: solid 1px silver; + position: relative; + top: -1px; + left: -14px; + } -#CalendarBody .item .connection{ - width:14px; - height:25px; - background-color:lightgoldenrodyellow; - border-top:solid 1px silver; - border-bottom:solid 1px silver; - position:relative; - top:-1px; - left:-14px; -} + #CalendarBody .item .connection.hover { + background-color: white; + border-top: solid 1px orange; + border-bottom: solid 1px orange; + } -#CalendarBody .item .connection.hover{ - background-color:white; - border-top:solid 1px orange; - border-bottom:solid 1px orange; -} + #CalendarBody .item .connection.changed { + font-weight: bold; + background-color: yellow; + border-top: solid 1px orange; + border-bottom: solid 1px orange; + } -#CalendarBody .item .connection.changed{ - font-weight:bold; - background-color:yellow; - border-top:solid 1px orange; - border-bottom:solid 1px orange; -} + #CalendarBody .item .title { + padding: 5px 0px; + position: absolute; + overflow: hidden; + white-space: nowrap; + z-index: 30; + } -#CalendarBody .item .title{ - padding:5px 0px; - position:absolute; - overflow:hidden; - white-space:nowrap; - z-index:30; -} + #CalendarBody .item .title.sub { + display: none; + } -#CalendarBody .item .title.sub{ - display:none; -} + #CalendarBody .item .title > span:not(.ui-icon) { + margin-right: 3px; + } -#CalendarBody .item .title > span:not(.ui-icon){ - margin-right: 3px; +#CalendarBody .dragging { + height: 25px; + padding: 5px; + background-color: lightgoldenrodyellow; + border-radius: 3px; + z-index: 50; } -#CalendarBody .dragging{ - height:25px; - padding:5px; - background-color:lightgoldenrodyellow; - border-radius:3px; - z-index:50; +#CalendarBody .dummy { + height: 25px; + margin: 5px 0px 0px 0px; } -#CalendarBody .dummy{ - height:25px; - margin:5px 0px 0px 0px; +#Crosstab .crosstab-row { + border-bottom: dotted 1px silver; } -#Crosstab .crosstab-row{ - border-bottom:dotted 1px silver; +#Crosstab .saturday { + background-color: #eeeeee; } -#Crosstab .saturday{ - background-color:#eeeeee; +#Crosstab .sunday { + background-color: #ffeeee; } -#Crosstab .sunday{ - background-color:#ffeeee; +#CrosstabMonth { + margin-right: 10px; } -#CrosstabMonth{ - margin-right:10px; +#Gantt { + width: 100%; + background-color: whitesmoke; + border-radius: 20px; } -#Gantt{ - width:100%; - background-color:whitesmoke; - border-radius:20px; -} + #Gantt .saturday { + fill: #eeeeee; + } -#Gantt .saturday{ - fill:#eeeeee; -} + #Gantt .sunday { + fill: #ffeeee; + } -#Gantt .sunday{ - fill:#ffeeee; -} + #Gantt .date { + stroke: white; + } -#Gantt .date{ - stroke:white; -} + #Gantt .now { + stroke: red; + } -#Gantt .now{ - stroke:red; -} + #Gantt .planned rect { + cursor: pointer; + fill: gainsboro; + } -#Gantt .planned rect{ - cursor:pointer; - fill:gainsboro; -} + #Gantt .planned rect.summary { + cursor: auto; + } -#Gantt .planned rect.summary{ - cursor:auto; -} + #Gantt .earned rect { + cursor: pointer; + fill: darkseagreen; + } -#Gantt .earned rect{ - cursor:pointer; - fill:darkseagreen; -} + #Gantt .earned rect.summary { + cursor: auto; + } -#Gantt .earned rect.summary{ - cursor:auto; -} + #Gantt rect.delay { + fill: #ffccd5; + } -#Gantt rect.delay{ - fill:#ffccd5; -} + #Gantt rect.delay.summary { + } -#Gantt rect.delay.summary{ + #Gantt rect.completed { + fill: lightsteelblue; + } -} + #Gantt .title text { + cursor: pointer; + } -#Gantt rect.completed{ - fill:lightsteelblue; -} + #Gantt .title text.delay { + fill: red; + } -#Gantt .title text{ - cursor:pointer; -} + #Gantt .title text.summary { + font-size: 1.2em; + font-weight: bold; + cursor: auto; + } -#Gantt .title text.delay{ - fill:red; +#GanttStartDate { + margin-right: 10px; } -#Gantt .title text.summary{ - font-size:1.2em; - font-weight:bold; - cursor:auto; +#GanttAxis { + width: calc(100% + 20px); + height: 50px; + margin-left: -10px; + margin-top: -25px; + background-color: rgba(255,255,255,0.5); + position: sticky; + left: 0px; + bottom: 75px; } -#GanttStartDate{ - margin-right:10px; -} + #GanttAxis text { + } -#GanttAxis{ - width:calc(100% + 20px); - height:50px; - margin-left:-10px; - margin-top:-25px; - background-color:rgba(255,255,255,0.5); - position:sticky; - left:0px; - bottom:75px; -} + #GanttAxis .saturday { + fill: gainsboro; + } -#GanttAxis text{ + #GanttAxis .sunday { + fill: #ffdddd; + } -} + #GanttAxis .weekday { + fill: whitesmoke; + } -#GanttAxis .saturday{ - fill:gainsboro; -} + #GanttAxis .date { + stroke: white; + } -#GanttAxis .sunday{ - fill:#ffdddd; +#BurnDown { + width: 100%; + height: 350px; + background-color: whitesmoke; + border-radius: 20px; } -#GanttAxis .weekday{ - fill:whitesmoke; -} + #BurnDown .now { + stroke: red; + } -#GanttAxis .date{ - stroke:white; -} + #BurnDown .total { + fill: none; + stroke: green; + } -#BurnDown{ - width:100%; - height:350px; - background-color:whitesmoke; - border-radius:20px; -} + #BurnDown .planned { + fill: none; + stroke: gray; + } -#BurnDown .now{ - stroke:red; -} + #BurnDown .earned { + fill: none; + stroke: orange; + } -#BurnDown .total{ - fill:none; - stroke:green; -} + #BurnDown .total circle { + fill: green; + } -#BurnDown .planned{ - fill:none; - stroke:gray; -} + #BurnDown .planned circle { + fill: gray; + } -#BurnDown .earned{ - fill:none; - stroke:orange; -} + #BurnDown .earned circle { + fill: orange; + } -#BurnDown .total circle{ - fill:green; +#BurnDownDetails > tbody > tr:hover { + background-color: whitesmoke; + cursor: pointer; } -#BurnDown .planned circle{ - fill:gray; +#BurnDownDetails > tbody > tr > td { + padding: 6px; } -#BurnDown .earned circle{ - fill:orange; -} + #BurnDownDetails > tbody > tr > td.warning { + font-weight: bold; + color: red; + } -#BurnDownDetails > tbody > tr:hover{ - background-color:whitesmoke; - cursor:pointer; -} + #BurnDownDetails > tbody > tr > td.difference { + font-size: 1.3em; + font-weight: bold; + color: blue; + background-color: lightcyan; + } -#BurnDownDetails > tbody > tr > td{ - padding:6px; -} + #BurnDownDetails > tbody > tr > td.difference.warning { + color: red; + background-color: #ffccd5; + } -#BurnDownDetails > tbody > tr > td.warning{ - font-weight:bold; - color:red; +#BurnDownDetails .user-info { + margin: 5px; + padding: 8px; + font-weight: bold; + background-color: palegoldenrod; } -#BurnDownDetails > tbody > tr > td.difference{ - font-size:1.3em; - font-weight:bold; - color:blue; - background-color:lightcyan; +#BurnDownDetails .items { + padding: 5px 0px 5px 20px; } -#BurnDownDetails > tbody > tr > td.difference.warning{ - color:red; - background-color:#ffccd5; -} + #BurnDownDetails .items a { + color: black; + text-decoration: none; + } -#BurnDownDetails .user-info{ - margin:5px; - padding:8px; - font-weight:bold; - background-color:palegoldenrod; -} + #BurnDownDetails .items a:hover { + color: blue; + text-decoration: underline; + } -#BurnDownDetails .items{ - padding:5px 0px 5px 20px; +#TimeSeries { + width: 100%; + height: 450px; + background-color: whitesmoke; + border-radius: 20px; } -#BurnDownDetails .items a{ - color:black; - text-decoration:none; -} + #TimeSeries .surface { + stroke: white; + } -#BurnDownDetails .items a:hover{ - color:blue; - text-decoration:underline; -} + #TimeSeries .index { + fill: black; + } -#TimeSeries{ - width:100%; - height:450px; - background-color:whitesmoke; - border-radius:20px; +#KambanBody .kamban-row { + border-bottom: dotted 1px silver; } -#TimeSeries .surface{ - stroke:white; +#KambanBody .kamban-container > div { + min-height: 30px; } -#TimeSeries .index{ - fill:black; +#KambanBody .kamban-container.hover { + background-color: whitesmoke; } -#KambanBody .kamban-row{ - border-bottom:dotted 1px silver; +#KambanBody .kamban-container .kamban-item:last-child { + margin: 3px 3px 30px 3px; } -#KambanBody .kamban-container > div{ - min-height:30px; +#KambanBody .kamban-item { + margin: 3px; + padding: 4px 16px 4px 5px; + background-color: lightgoldenrodyellow; + border: solid 1px silver; + position: relative; + cursor: pointer; + border-radius: 5px; } -#KambanBody .kamban-container.hover{ - background-color:whitesmoke; -} + #KambanBody .kamban-item:hover { + background-color: white; + border: solid 1px orange; + } -#KambanBody .kamban-container .kamban-item:last-child{ - margin:3px 3px 30px 3px; -} + #KambanBody .kamban-item.changed { + font-weight: bold; + background-color: yellow; + border: solid 1px orange; + } -#KambanBody .kamban-item{ - margin:3px; - padding:4px 16px 4px 5px; - background-color:lightgoldenrodyellow; - border:solid 1px silver; - position:relative; - cursor:pointer; - border-radius:5px; -} + #KambanBody .kamban-item .ui-icon { + position: absolute; + top: 0px; + right: 0px; + } -#KambanBody .kamban-item:hover{ - background-color:white; - border:solid 1px orange; -} + #KambanBody .kamban-item > span { + margin-right: 3px; + } -#KambanBody .kamban-item.changed{ - font-weight:bold; - background-color:yellow; - border:solid 1px orange; +#ImageLib .item { + width: 250px; + height: 250px; + float: left; + margin: 10px 10px 0px 0px; + padding: 10px; + border: solid 1px silver; + position: relative; + overflow: hidden; } -#KambanBody .kamban-item .ui-icon{ - position:absolute; - top:0px; - right:0px; -} - -#KambanBody .kamban-item > span{ - margin-right: 3px; -} - -#ImageLib .item{ - width:250px; - height:250px; - float:left; - margin:10px 10px 0px 0px; - padding:10px; - border:solid 1px silver; - position:relative; - overflow:hidden; -} - -#ImageLib .item .image{ - width:100%; - float:left; - margin:5px 0px 0px 0px; -} + #ImageLib .item .image { + width: 100%; + float: left; + margin: 5px 0px 0px 0px; + } -#ImageLib .item .delete-image{ - float:left; - position:absolute; - right:5px; - bottom:5px; -} - -#RecordHeader{ - width:100%; - float:left; - margin:0px 0px 5px 0px; -} - -#RecordInfo{ - float:left; - padding:6px 0px 0px 0px; -} - -#RecordInfo div{ - float:left; - margin-right:50px; -} + #ImageLib .item .delete-image { + float: left; + position: absolute; + right: 5px; + bottom: 5px; + } -#RecordInfo div p{ - float:left; - margin-right:5px; +#RecordHeader { + width: 100%; + float: left; + margin: 0px 0px 5px 0px; } -#RecordInfo div p .elapsed-time{ - float:left; - padding:0px 5px; - font-weight:bold; - background-color:#eee; - border-radius:2px; +#RecordInfo { + float: left; + padding: 6px 0px 0px 0px; } -#RecordSwitchers{ - float:right; -} + #RecordInfo div { + float: left; + margin-right: 50px; + } -#RecordSwitchers > *{ - float:left; -} + #RecordInfo div p { + float: left; + margin-right: 5px; + } -#RecordSwitchers .current{ - height:26px; - display:block; - float:left; - margin:0px 1px 0px 0px; - padding:5px; - border-radius:5px; -} + #RecordInfo div p .elapsed-time { + float: left; + padding: 0px 5px; + font-weight: bold; + background-color: #eee; + border-radius: 2px; + } -#TemplateTabsContainer{ - width:100%; - float:left; +#RecordSwitchers { + float: right; } -#Editor{ - width:100%; - float:left; - clear:both; + #RecordSwitchers > * { + float: left; + } + + #RecordSwitchers .current { + height: 26px; + display: block; + float: left; + margin: 0px 1px 0px 0px; + padding: 5px; + border-radius: 5px; + } + +#TemplateTabsContainer { + width: 100%; + float: left; +} + +#Editor { + width: 100%; + float: left; + clear: both; } -#EditorTabsContainer{ - width:73%; - float:left; - margin:0px 0px 20px 0px; +#EditorTabsContainer { + width: 73%; + float: left; + margin: 0px 0px 20px 0px; } -#EditorTabsContainer.max{ - width:100%; -} + #EditorTabsContainer.max { + width: 100%; + } -#MailEditorTabsContainer{ - width:100%; - float:left; - margin:0px 0px 20px 0px; - border:none; +#MailEditorTabsContainer { + width: 100%; + float: left; + margin: 0px 0px 20px 0px; + border: none; } -#EditorComments{ - width:27%; - float:right; - margin:0px 0px 15px 0px; - padding:0px 0px 0px 5px; +#EditorComments { + width: 27%; + float: right; + margin: 0px 0px 15px 0px; + padding: 0px 0px 0px 5px; } -#EditorComments .title-header{ - margin:3px 10px 8px 0px; -} + #EditorComments .title-header { + margin: 3px 10px 8px 0px; + } -#CommentField{ - margin:0px 0px 5px 0px; +#CommentField { + margin: 0px 0px 5px 0px; } -#OutgoingMailsForm{ - width:73%; - float:left; +#OutgoingMailsForm { + width: 73%; + float: left; } -#OutgoingMailsForm > .item{ - width:100%; - float:left; - position:relative; - border-radius:10px; -} + #OutgoingMailsForm > .item { + width: 100%; + float: left; + position: relative; + border-radius: 10px; + } -#OutgoingMailsForm .content{ - width:100%; - float:left; - margin:5px 0px 20px 0px; - padding:10px 0px 0px 0px; - border:solid 1px silver; - border-top:none; - border-radius:0px 0px 10px 10px / 0px 0px 10px 10px; -} + #OutgoingMailsForm .content { + width: 100%; + float: left; + margin: 5px 0px 20px 0px; + padding: 10px 0px 0px 0px; + border: solid 1px silver; + border-top: none; + border-radius: 0px 0px 10px 10px / 0px 0px 10px 10px; + } -#DropDownSearchDialogForm{ - width:100%; - padding:0px 20px; +#DropDownSearchDialogForm { + width: 100%; + padding: 0px 20px; } -#ProcessTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; +#ProcessTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -#StatusControlTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; +#StatusControlTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -#StatusControlColumnHash .column-control-types{ - margin:0px 0px 0px 10px; +#StatusControlColumnHash .column-control-types { + margin: 0px 0px 0px 10px; } #ViewTabsContainer { @@ -1189,2035 +1188,2356 @@ th.calendar-header{ clear: both; } -#ExportTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; -} - -#EditorDetailTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; -} - -#ColumnAccessControlTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; -} - -#SearchResults{ - width:80%; - float:left; - margin:0px 100px; -} - -#SearchResults .count{ - float:left; - margin:0px 0px 10px 0px; -} - -#SearchResults .count .label{ - height:26px; - display:block; - float:left; - margin:0px 5px 5px 0px; - padding:5px 10px; - background:gainsboro; - border-radius:5px; -} - -#SearchResults .count .data{ - height:26px; - display:block; - float:left; - margin:0px 5px 5px 0px; - padding:5px; -} - -#SearchResults .result{ - width:100%; - float:left; - padding:15px; - border:solid 1px white; - clear:both; -} - -#SearchResults .result > ul{ - display:block; - float:left; - clear:both; -} - -#SearchResults .result > h3{ - display:block; - float:left; - margin:5px 0px; - clear:both; -} - -#SearchResults .result > h3 > a{ - font-size:1.3em; - font-weight:bold; -} - -#SearchResults .result > p{ - display:block; - float:left; - clear:both; -} - -#SearchResults .result:hover{ - border:solid 1px orange; - cursor:pointer; -} - -#MainCommandsContainer{ - width:100%; - height:47px; - padding:7px 0px 0px 0px; - background-color:rgba(0,0,0,0.65); - position:fixed; - left:0px; - bottom:30px; - z-index:100; -} - -#MainCommands{ - text-align:center; -} - -#MainCommands > button{ - display:inline; - float:none; - margin:2px 4px; -} - -#ApiEditorCommands{ - padding:0px 5px 200px 140px; -} - -#ApiEditorCommands > *{ - margin-right:10px; -} - -#BottomMargin{ - height:100px; - clear:both; -} - -#Video{ - width:640px; - height:480px; - display:block; - float:left; - margin:0px 16px; -} - -#Canvas{ - display:none; -} - -#Footer{ - width:100%; - height:30px; - display:block; - padding:5px 10px; - text-align:right; - background-color:black; - position:fixed; - left:0px; - bottom:0px; - z-index:100; -} - -#Footer a{ - color:white; - text-decoration:none; -} - -#Versions{ - width:500px; - margin:150px auto 20px auto; - padding:50px; - background-color:whitesmoke; - border-radius:10px; -} - -#Versions span{ - margin:10px; - line-height:30px; -} - -.template{ - width:100%; - display:block; - float:left; -} - -.template-selectable{ - width:340px; - display:block; - float:left; -} - -.template-viewer-container{ - width:100%; - display:block; - float:right; - margin:0px 0px 0px -340px; -} - -.template-viewer{ - margin:0px 0px 0px 340px; -} - -.template-viewer .description{ - margin:10px 0px 8px 0px; - padding:5px; - background-color:#fefedd; - border:solid 1px silver; - border-radius:5px; -} - -.template-viewer .samples-displayed{ - margin:0px 0px 8px 0px; - padding:5px; - color:red; - background-color:pink; - border:solid 1px red; - border-radius:5px; -} - -.template-tab-container{ - min-height:600px; -} - -.main-form{ - clear:both; -} - -.nav-sites{ - margin:0px -10px; - clear:both; -} - -.nav-site{ - width:220px; - height:70px; - float:left; - margin:10px; - position:relative; - top:0px; - left:0px; - border-radius:5px; -} - -.nav-site.sites{ - -} - -.nav-site .heading{ - width:50px; - height:9px; - position:absolute; - top:-10px; - left:5px; - border-radius:3px 3px 0px 0px / 3px 3px 0px 0px; -} - -.nav-site .stacking1{ - width:220px; - height:70px; - border-bottom:solid 1px silver; - border-right:solid 1px silver; - position:absolute; - top:1px; - left:1px; - border-radius:5px; -} - -.nav-site .stacking2{ - width:220px; - height:70px; - border-bottom:solid 1px silver; - border-right:solid 1px silver; - position:absolute; - top:4px; - left:4px; - border-radius:5px; -} - -.nav-site a{ - width:100%; - height:100%; - display:block; - padding:10px 3px 3px 10px; - overflow:hidden; - word-wrap:break-word; - text-decoration:none; -} - -.nav-site a:hover{ - -} - -.nav-site.has-image a{ - padding:10px 3px 3px 65px; -} - -.nav-site span.title{ - margin-left:5px; -} - -.nav-site.to-parent{ - height:36px; - background-color:white; -} - -.nav-site.to-parent a{ - padding:9px 3px 3px 30px; -} - -.nav-site.to-parent.has-image a{ - padding:9px 3px 3px 35px; -} - -.nav-site.to-parent .ui-icon{ - position:absolute; - top:9px; - left:9px; -} - -.nav-site .site-image-thumbnail{ - position:absolute; - top:8px; - left:8px; - border-radius:8px; -} - -.nav-site .site-image-icon{ - position:absolute; - top:4px; - left:8px; - border-radius:8px; -} - -.nav-site .conditions{ - font-size:0.75em; - color:black; - position:absolute; - right:1px; - bottom:1px; -} - -.nav-site .conditions span{ - display:block; - float:left; - margin:2px 2px 2px 0px; - padding:2px 5px; - background-color:#eee; - border-radius:2px; -} - -.nav-site .conditions span.overdue{ - color:white; - background-color:red; -} - -.nav-site .conditions span.elapsed-time.old{ - color:silver; -} - -.error-page{ - padding:30px 50px; - border-top:dotted 1px gray; -} - -.error-page-title{ - margin:0px 0px 20px 0px; - padding:10px 0px; - font-weight:bold; - color:red; - border-bottom:dotted 1px red; -} - -.error-page-body{ - -} - -.error-page-message{ - margin:15px 0px 0px 0px; - padding:5px 20px; - font-weight:bold; - color:white; - background-color:gray; -} - -.error-page-action{ - margin:5px 0px 0px 0px; - padding:5px 10px; - color:silver; - background-color:gainsboro; -} - -.error-page-action em{ - margin:10px; - color:black; -} - -.error-page-stacktrace{ - margin:5px 0px 0px 0px; - padding:5px 20px; - background-color:whitesmoke; -} - -.fieldset{ - -} - -.fieldset.enclosed{ - margin:0px 0px 10px 0px; - padding:10px; - border:solid 1px silver; - clear:both; -} - -.fieldset.enclosed-half{ - width:380px; - float:left; - margin:0px 0px 10px 0px; - padding:10px; - border:solid 1px silver; -} - -.fieldset.enclosed-thin{ - margin:0px 0px 10px 0px; - padding:5px 5px 5px 10px; - border:solid 1px silver; - clear:both; -} - -.fieldset.enclosed-thin [class*="field-auto"]{ - height:35px; -} - -.fieldset.enclosed-auto{ - float:left; - margin:0px 0px 10px 10px; - padding:5px 5px 5px 10px; - border:solid 1px silver; -} - -.fieldset[class^="enclosed"] > legend{ - margin:0px 0px 0px 10px; - font-weight:bold; -} - -.command-field{ - padding:10px 5px 5px 136px; - text-align:center; - clear:both; -} - -.command-field > button{ - display:block; - float:left; - margin:2px 4px; +#ExportTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -.command-center{ - padding:5px 5px 5px 5px; - text-align:center; - clear:both; +#EditorDetailTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -.command-center > button{ - display:inline; - float:none; - margin:2px 4px; +#ColumnAccessControlTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -.command-left{ - float:left; - padding:5px 5px 5px 5px; - clear:both; +#SearchResults { + width: 80%; + float: left; + margin: 0px 100px; +} + + #SearchResults .count { + float: left; + margin: 0px 0px 10px 0px; + } + + #SearchResults .count .label { + height: 26px; + display: block; + float: left; + margin: 0px 5px 5px 0px; + padding: 5px 10px; + background: gainsboro; + border-radius: 5px; + } + + #SearchResults .count .data { + height: 26px; + display: block; + float: left; + margin: 0px 5px 5px 0px; + padding: 5px; + } + + #SearchResults .result { + width: 100%; + float: left; + padding: 15px; + border: solid 1px white; + clear: both; + } + + #SearchResults .result > ul { + display: block; + float: left; + clear: both; + } + + #SearchResults .result > h3 { + display: block; + float: left; + margin: 5px 0px; + clear: both; + } + + #SearchResults .result > h3 > a { + font-size: 1.3em; + font-weight: bold; + } + + #SearchResults .result > p { + display: block; + float: left; + clear: both; + } + + #SearchResults .result:hover { + border: solid 1px orange; + cursor: pointer; + } + +#MainCommandsContainer { + width: 100%; + height: 47px; + padding: 7px 0px 0px 0px; + background-color: rgba(0,0,0,0.65); + position: fixed; + left: 0px; + bottom: 30px; + z-index: 100; +} + +#MainCommands { + text-align: center; +} + + #MainCommands > button { + display: inline; + float: none; + margin: 2px 4px; + } + +#ApiEditorCommands { + padding: 0px 5px 200px 140px; +} + + #ApiEditorCommands > * { + margin-right: 10px; + } + +#BottomMargin { + height: 100px; + clear: both; } -.command-left > *{ - display:block; - float:left; +#Video { + width: 640px; + height: 480px; + display: block; + float: left; + margin: 0px 16px; } -.command-left > button{ - margin:2px 4px; +#Canvas { + display: none; } -.command-left > .ui-icon{ - margin:7px 3px 0px 15px; +#Footer { + width: 100%; + height: 30px; + display: block; + padding: 5px 10px; + text-align: right; + background-color: black; + position: fixed; + left: 0px; + bottom: 0px; + z-index: 100; } -.command-right{ - padding:5px 5px 5px 5px; - text-align:right; - clear:both; -} + #Footer a { + color: white; + text-decoration: none; + } -.command-right > button{ - display:inline; - float:none; - margin:2px 4px; +#Versions { + width: 500px; + margin: 150px auto 20px auto; + padding: 50px; + background-color: whitesmoke; + border-radius: 10px; } -.field-normal{ - width:340px; - height:45px; - float:left; - padding:0px 20px 10px 0px; -} + #Versions span { + margin: 10px; + line-height: 30px; + } -.field-normal > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; +.template { + width: 100%; + display: block; + float: left; } -.field-normal > .field-control{ - width:100%; - float:right; +.template-selectable { + width: 340px; + display: block; + float: left; } -:not(td) > div.field-normal .container-normal{ - width:auto; - margin-left:120px; +.template-viewer-container { + width: 100%; + display: block; + float: right; + margin: 0px 0px 0px -340px; } -td > .field-normal,td > .field-wide{ - width:100%; - padding:0px; +.template-viewer { + margin: 0px 0px 0px 340px; } -.field-normal > .buttons{ - padding:3px 10px; -} + .template-viewer .description { + margin: 10px 0px 8px 0px; + padding: 5px; + background-color: #fefedd; + border: solid 1px silver; + border-radius: 5px; + } -.field-normal .control-text{ - height:30px; -} + .template-viewer .samples-displayed { + margin: 0px 0px 8px 0px; + padding: 5px; + color: red; + background-color: pink; + border: solid 1px red; + border-radius: 5px; + } -.field-wide{ - width:100%; - min-height:45px; - float:left; - padding:0px 10px 10px 0px; - clear:both; +.template-tab-container { + min-height: 600px; } -.field-wide > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; +.main-form { + clear: both; } -.field-wide > .field-control{ - width:100%; - float:right; +.nav-sites { + margin: 0px -10px; + clear: both; } -:not(td) > div.field-wide .container-normal{ - margin-left:120px; +.nav-site { + width: 220px; + height: 70px; + float: left; + margin: 10px; + position: relative; + top: 0px; + left: 0px; + border-radius: 5px; +} + + .nav-site.sites { + } + + .nav-site .heading { + width: 50px; + height: 9px; + position: absolute; + top: -10px; + left: 5px; + border-radius: 3px 3px 0px 0px / 3px 3px 0px 0px; + } + + .nav-site.dashboards { + box-shadow: 4px 4px 2px rgba(0, 0, 0, 0.2); + } + + .nav-site .stacking1 { + width: 220px; + height: 70px; + border-bottom: solid 1px silver; + border-right: solid 1px silver; + position: absolute; + top: 1px; + left: 1px; + border-radius: 5px; + } + + .nav-site .stacking2 { + width: 220px; + height: 70px; + border-bottom: solid 1px silver; + border-right: solid 1px silver; + position: absolute; + top: 4px; + left: 4px; + border-radius: 5px; + } + + .nav-site a { + width: 100%; + height: 100%; + display: block; + padding: 10px 3px 3px 10px; + overflow: hidden; + word-wrap: break-word; + text-decoration: none; + } + + .nav-site a:hover { + } + + .nav-site.has-image a { + padding: 10px 3px 3px 65px; + } + + .nav-site span.title { + margin-left: 5px; + } + + .nav-site.to-parent { + height: 36px; + background-color: white; + } + + .nav-site.to-parent a { + padding: 9px 3px 3px 30px; + } + + .nav-site.to-parent.has-image a { + padding: 9px 3px 3px 35px; + } + + .nav-site.to-parent .ui-icon { + position: absolute; + top: 9px; + left: 9px; + } + + .nav-site .site-image-thumbnail { + position: absolute; + top: 8px; + left: 8px; + border-radius: 8px; + } + + .nav-site .site-image-icon { + position: absolute; + top: 4px; + left: 8px; + border-radius: 8px; + } + + .nav-site .conditions { + font-size: 0.75em; + color: black; + position: absolute; + right: 1px; + bottom: 1px; + } + + .nav-site .conditions span { + display: block; + float: left; + margin: 2px 2px 2px 0px; + padding: 2px 5px; + background-color: #eee; + border-radius: 2px; + } + + .nav-site .conditions span.overdue { + color: white; + background-color: red; + } + + .nav-site .conditions span.elapsed-time.old { + color: silver; + } + +.error-page { + padding: 30px 50px; + border-top: dotted 1px gray; +} + +.error-page-title { + margin: 0px 0px 20px 0px; + padding: 10px 0px; + font-weight: bold; + color: red; + border-bottom: dotted 1px red; +} + +.error-page-body { +} + +.error-page-message { + margin: 15px 0px 0px 0px; + padding: 5px 20px; + font-weight: bold; + color: white; + background-color: gray; +} + +.error-page-action { + margin: 5px 0px 0px 0px; + padding: 5px 10px; + color: silver; + background-color: gainsboro; +} + + .error-page-action em { + margin: 10px; + color: black; + } + +.error-page-stacktrace { + margin: 5px 0px 0px 0px; + padding: 5px 20px; + background-color: whitesmoke; +} + +.fieldset { +} + + .fieldset.enclosed { + margin: 0px 0px 10px 0px; + padding: 10px; + border: solid 1px silver; + clear: both; + } + + .fieldset.enclosed-half { + width: 380px; + float: left; + margin: 0px 0px 10px 0px; + padding: 10px; + border: solid 1px silver; + } + + .fieldset.enclosed-thin { + margin: 0px 0px 10px 0px; + padding: 5px 5px 5px 10px; + border: solid 1px silver; + clear: both; + } + + .fieldset.enclosed-thin [class*="field-auto"] { + height: 35px; + } + + .fieldset.enclosed-auto { + float: left; + margin: 0px 0px 10px 10px; + padding: 5px 5px 5px 10px; + border: solid 1px silver; + } + + .fieldset[class^="enclosed"] > legend { + margin: 0px 0px 0px 10px; + font-weight: bold; + } + +.command-field { + padding: 10px 5px 5px 136px; + text-align: center; + clear: both; } -.field-markdown{ - width:100%; - min-height:45px; - float:left; - padding:0px 10px 10px 0px; - clear:both; -} + .command-field > button { + display: block; + float: left; + margin: 2px 4px; + } -.field-markdown > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; +.command-center { + padding: 5px 5px 5px 5px; + text-align: center; + clear: both; } -.field-markdown > .field-control{ - width:100%; - float:right; -} + .command-center > button { + display: inline; + float: none; + margin: 2px 4px; + } -:not(td) > div.field-markdown .container-normal{ - margin-left:120px; +.command-left { + float: left; + padding: 5px 5px 5px 5px; + clear: both; } -.field-textarea{ - width:100%; - min-height:45px; - float:left; - padding:0px 10px 10px 0px; - clear:both; -} + .command-left > * { + display: block; + float: left; + } -.field-textarea > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; -} + .command-left > button { + margin: 2px 4px; + } -.field-textarea > .field-control{ - width:100%; - float:right; -} + .command-left > .ui-icon { + margin: 7px 3px 0px 15px; + } -:not(td) > div.field-textarea .container-normal{ - margin-left:120px; +.command-right { + padding: 5px 5px 5px 5px; + text-align: right; + clear: both; } -.field-auto{ - width:auto; - height:45px; - float:left; - margin-right:35px; - padding:0px 10px 10px 0px; -} + .command-right > button { + display: inline; + float: none; + margin: 2px 4px; + } -.field-auto > .field-label{ - width:120px; - float:left; - padding:7px 7px 7px 0px; - text-align:right; +.field-normal { + width: 340px; + height: 45px; + float: left; + padding: 0px 20px 10px 0px; } -.field-auto > .field-label > label{ + .field-normal > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -} + .field-normal > .field-control { + width: 100%; + float: right; + } -.field-auto > .field-control{ - width:auto; - float:left; +:not(td) > div.field-normal .container-normal { + width: auto; + margin-left: 120px; } -.field-auto-thin{ - width:auto; - height:45px; - float:left; - margin:0px 5px; - padding:0px 10px 10px 0px; +td > .field-normal, td > .field-wide { + width: 100%; + padding: 0px; } -.field-auto-thin > .field-label{ - float:left; - padding:7px 7px 7px 0px; - text-align:right; +.field-normal > .buttons { + padding: 3px 10px; } -.field-auto-thin > .field-label > label{ - +.field-normal .control-text { + height: 30px; } -.field-auto-thin > .field-control{ - width:auto; - float:left; +.field-wide { + width: 100%; + min-height: 45px; + float: left; + padding: 0px 10px 10px 0px; + clear: both; } -.field-auto-thin select{ - max-width:120px; -} + .field-wide > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -.field-vertical{ - width:330px; - height:100%; - float:left; - padding:0px 20px 20px 0px; -} + .field-wide > .field-control { + width: 100%; + float: right; + } -.field-vertical > .field-label{ - width:100%; - float:left; - margin-right:-120px; - padding:5px 10px; - text-align:center; +:not(td) > div.field-wide .container-normal { + margin-left: 120px; } -.field-vertical > .field-control{ - width:100%; - float:left; - clear:both; +.field-markdown { + width: 100%; + min-height: 45px; + float: left; + padding: 0px 10px 10px 0px; + clear: both; } -.field-label{ - overflow:hidden; -} + .field-markdown > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -label.required:after{ - margin-left:3px; - color:red; - content:'*'; -} + .field-markdown > .field-control { + width: 100%; + float: right; + } -.field-control .unit{ - display:block; - float:left; - padding:5px 0px 0px 5px; +:not(td) > div.field-markdown .container-normal { + margin-left: 120px; } -.field-section{ - width:100%; - display:block; - float:left; - margin:15px; - padding:2px 5px; - font-weight:bold; - border-bottom:solid 1px silver; - clear:both; +.field-textarea { + width: 100%; + min-height: 45px; + float: left; + padding: 0px 10px 10px 0px; + clear: both; } -.container-normal{ - position:relative; -} + .field-textarea > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -.container-left{ - width:340px; - float:left; - margin-right:-340px; - padding:0px 0px 15px 0px; - position:relative; + .field-textarea > .field-control { + width: 100%; + float: right; + } + +:not(td) > div.field-textarea .container-normal { + margin-left: 120px; +} + +.field-auto { + width: auto; + height: 45px; + float: left; + margin-right: 35px; + padding: 0px 10px 10px 0px; +} + + .field-auto > .field-label { + width: 120px; + float: left; + padding: 7px 7px 7px 0px; + text-align: right; + } + + .field-auto > .field-label > label { + } + + .field-auto > .field-control { + width: auto; + float: left; + } + +.field-auto-thin { + width: auto; + height: 45px; + float: left; + margin: 0px 5px; + padding: 0px 10px 10px 0px; +} + + .field-auto-thin > .field-label { + float: left; + padding: 7px 7px 7px 0px; + text-align: right; + } + + .field-auto-thin > .field-label > label { + } + + .field-auto-thin > .field-control { + width: auto; + float: left; + } + + .field-auto-thin select { + max-width: 120px; + } + +.field-vertical { + width: 330px; + height: 100%; + float: left; + padding: 0px 20px 20px 0px; +} + + .field-vertical > .field-label { + width: 100%; + float: left; + margin-right: -120px; + padding: 5px 10px; + text-align: center; + } + + .field-vertical > .field-control { + width: 100%; + float: left; + clear: both; + } + +.field-label { + overflow: hidden; +} + +label.required:after { + margin-left: 3px; + color: red; + content: '*'; +} + +.field-control .unit { + display: block; + float: left; + padding: 5px 0px 0px 5px; +} + +.field-section { + width: 100%; + display: block; + float: left; + margin: 15px; + padding: 2px 5px; + font-weight: bold; + border-bottom: solid 1px silver; + clear: both; } -.container-right{ - width:100%; - float:right; - position:relative; +.container-normal { + position: relative; } -.container-right > *{ - display:block; - margin-left:340px; +.container-left { + width: 340px; + float: left; + margin-right: -340px; + padding: 0px 0px 15px 0px; + position: relative; +} + +.container-right { + width: 100%; + float: right; + position: relative; } - -.control-text{ - width:100%; - min-height:30px; - display:block; - padding:6px 4px 2px 4px; - color:black; - background:whitesmoke; - border:solid 1px silver; - overflow:hidden; - border-radius:5px; + + .container-right > * { + display: block; + margin-left: 340px; + } + +.control-text { + width: 100%; + min-height: 30px; + display: block; + padding: 6px 4px 2px 4px; + color: black; + background: whitesmoke; + border: solid 1px silver; + overflow: hidden; + border-radius: 5px; } -.control-textbox{ - width:100%; - height:30px; - padding:4px; - border:solid 1px silver; - border-radius:5px; +.control-textbox { + width: 100%; + height: 30px; + padding: 4px; + border: solid 1px silver; + border-radius: 5px; } -.control-textbox.with-unit{ - width:70%; - display:block; - float:left; -} + .control-textbox.with-unit { + width: 70%; + display: block; + float: left; + } -.control-textbox.anchor{ - width:100%; - height:30px; - padding:4px; - border:solid 1px silver; - border-radius:5px; - z-index:0; -} + .control-textbox.anchor { + width: 100%; + height: 30px; + padding: 4px; + border: solid 1px silver; + border-radius: 5px; + z-index: 0; + } -.control-textarea{ - width:100%; - height:100px; - padding:4px 4px 4px 6px; - border:solid 1px silver; - border-radius:5px; +.control-textarea { + width: 100%; + height: 100px; + padding: 4px 4px 4px 6px; + border: solid 1px silver; + border-radius: 5px; } -.container-radio>label.error{ - top:0px; +.container-radio > label.error { + top: 0px; } -.control-attachments+label.error{ - height:22px; - position:absolute; - top:50px; +.control-attachments + label.error { + height: 22px; + position: absolute; + top: 50px; } -.control-attachments-upload{ - width:100%; - display:block; - float:left; - padding:25px 0px; - text-align:center; - border:dotted 2px #d19405; - border-radius:3px; +.control-attachments-upload { + width: 100%; + display: block; + float: left; + padding: 25px 0px; + text-align: center; + border: dotted 2px #d19405; + border-radius: 3px; } -.control-attachments-items{ - width:100%; - display:block; - float:left; +.control-attachments-items { + width: 100%; + display: block; + float: left; } -.control-attachments-item{ - width:100%; - display:block; - float:left; - margin:5px 0px 0px 0px; - padding:5px 10px; - text-align:left; - border:solid 1px #d19405; - border-radius:5px; -} +.control-attachments-item { + width: 100%; + display: block; + float: left; + margin: 5px 0px 0px 0px; + padding: 5px 10px; + text-align: left; + border: solid 1px #d19405; + border-radius: 5px; +} + +.progress-bar { + width: 100%; + height: 30px; + display: block; + float: left; + margin: 5px 0px 0px 0px; + vertical-align: top; + border: solid 1px #d19405; + overflow: hidden; + border-radius: 5px; +} + + .progress-bar > div { + width: 0; + height: 100%; + line-height: 22px; + color: white; + background-color: #fece2f; + border-radius: 3px; + } + +.already-attachments { + background-color: #fece2f; +} + +.preparation-delete { + background-color: whitesmoke; + border: solid 1px silver; +} + + .preparation-delete > a { + color: silver; + } + +.show-file { + display: block; + float: left; + margin: 0px; +} + +.file-name { + display: block; + float: left; +} + +.delete-file { + display: block; + float: right; + margin: 2px -5px 0px 0px; +} + +.field-control .control-markup { + width: 100%; + min-height: 100px; + float: left; + padding: 4px 25px 4px 6px; + color: black; + background: whitesmoke; + border: solid 1px silver; + border-radius: 5px; +} + +.md { + width: 100%; + float: left; + line-height: 1.5em; + font-family: Terminal,Hiragino Kaku Gothic Pro; + word-wrap: break-word; + word-break: break-all; +} + + .md > * { + float: left; + clear: both; + } + + .md h1 { + margin: 10px 0px 10px 0px; + font-weight: bold; + } + + .md h1:not(:first-child) { + margin: 20px 0px 10px 0px; + } + + .md h2 { + margin: 5px 0px 8px 0px; + font-weight: bold; + } + + .md h2:not(:first-child) { + margin: 20px 0px 8px 0px; + } + + .md h3 { + margin: 3px 0px 6px 0px; + font-weight: bold; + } + + .md h3:not(:first-child) { + margin: 10px 0px 6px 0px; + } + + .md h4 { + margin: 3px 0px 4px 0px; + font-weight: bold; + } + + .md h4:not(:first-child) { + margin: 10px 0px 4px 0px; + } + + .md h5 { + margin: 3px 0px 2px 0px; + font-weight: bold; + } + + .md h5:not(:first-child) { + margin: 10px 0px 2px 0px; + } -.progress-bar{ - width:100%; - height:30px; - display:block; - float:left; - margin:5px 0px 0px 0px; - vertical-align:top; - border:solid 1px #d19405; - overflow:hidden; - border-radius:5px; + .md h6 { + margin: 3px 0px 2px 0px; + font-weight: bold; + } + + .md h6:not(:first-child) { + margin: 10px 0px 2px 0px; + } + + .md hr { + float: none; + clear: both; + } + + .md ol { + margin: 0px 10px 10px 32px; + list-style-type: decimal; + } + + .md p { + margin: 0px 0px 10px 0px; + clear: both; + } + + .md table { + width: auto; + margin: 0px 0px 10px 0px; + background-color: white; + } + + .md td { + padding: 5px 10px; + border: solid 1px silver; + } + + .md th { + padding: 5px 10px; + font-weight: bold; + border: solid 1px silver; + } + + .md tbody tr:nth-child(odd) { + background-color: whitesmoke; + } + + .md ul { + margin: 0px 10px 10px 32px; + list-style-type: disc; + } + +.control-markdown { + width: 100%; + display: none; + padding: 4px 4px 4px 6px; + border: solid 1px silver; + border-radius: 5px; +} + +.control-dropdown { + width: 100%; + height: 30px; + padding: 4px; + border: solid 1px silver; + border-radius: 5px; +} + +.control-spinner { + width: auto; + height: 22px; + display: block; + float: left; + padding: 1px; + color: black; +} + +.control-checkbox { + display: block; + float: left; + margin: 8px 0px; +} + + .control-checkbox ~ label { + display: block; + float: left; + margin: 7px 5px 0px 6px; + } + + .control-checkbox + .ui-icon.ui-icon-info { + display: block; + float: left; + margin: 7px -7px 0px 0px; + } + +.field-normal .control-checkbox + label { + width: 175px; +} + +_::-webkit-full-page-media, _:future, :root .field-normal .control-checkbox + label { + width: 172px; } -.progress-bar > div{ - width:0; - height:100%; - line-height:22px; - color:white; - background-color:#fece2f; - border-radius:3px; +.container-radio { + padding: 7px 0px; } -.already-attachments{ - background-color:#fece2f; -} + .container-radio > label { + display: block; + float: left; + margin: 0px 5px 0px 0px; + white-space: nowrap; + } -.preparation-delete{ - background-color:whitesmoke; - border:solid 1px silver; +.control-radio { + display: block; + float: left; + margin: 3px; } -.preparation-delete > a{ - color:silver; +.radio-clear-both .container-radio > label { + clear: both; } -.show-file{ - display:block; - float:left; - margin:0px; +.control-slider { + width: 30px; + float: left; + margin: 8px 0px 0px 12px; +} + +.control-slider-ui { + width: 140px; + float: left; + margin: 11px 0px 0px 5px; +} + +.container-selectable .wrapper { + width: 100%; + min-height: 300px; + display: block; + float: left; + background-color: whitesmoke; + border: solid 1px silver; + overflow: auto; + border-radius: 5px; +} + +.control-selectable { + width: 100%; + display: block; + float: left; + padding: 5px 10px 5px 5px; + list-style-type: none; + touch-action: pan-y; +} + + .control-selectable li { + width: 100%; + min-height: 24px; + margin: 3px; + padding: 2px 5px; + border-radius: 5px; + } + + .control-selectable .ui-selecting { + } + + .control-selectable .ui-selected { + } + +.control-basket { + margin-left: 120px; + padding: 5px 5px 0px 5px; + background-color: whitesmoke; + border: solid 1px silver; + border-radius: 5px; +} + + .control-basket > li { + display: block; + float: left; + margin: 0px 5px 5px 0px; + padding: 3px 5px; + border-radius: 5px; + } + + .control-basket > li > span { + display: block; + float: left; + z-index: 2; + } + +.comment { + width: 100%; + display: block; + float: left; + margin: 0px 0px 5px 0px; + padding: 5px 10px 10px 20px; + background: lightgoldenrodyellow; + border: solid 1px silver; + position: relative; + clear: both; } -.file-name{ - display:block; - float:left; -} + .comment > * { + display: block; + float: left; + } -.delete-file{ - display:block; - float:right; - margin:2px -5px 0px 0px; -} + .comment > .time { + float: left; + margin: 0px 0px 8px -10px; + margin-right: 10px; + } -.field-control .control-markup{ - width:100%; - min-height:100px; - float:left; - padding:4px 25px 4px 6px; - color:black; - background:whitesmoke; - border:solid 1px silver; - border-radius:5px; -} + .comment > .body { + width: 100%; + clear: both; + } -.md{ - width:100%; - float:left; - line-height:1.5em; - font-family:Terminal,Hiragino Kaku Gothic Pro; - word-wrap:break-word; - word-break:break-all; -} + .comment > .button.edit { + position: absolute; + top: 3px; + right: 20px; + cursor: pointer; + } -.md > *{ - float:left; - clear:both; -} + .comment > .button.delete { + position: absolute; + top: 3px; + right: 5px; + cursor: pointer; + } -.md h1{ - margin:10px 0px 10px 0px; - font-weight:bold; -} + .comment > .control-markup { + width: 100%; + } -.md h1:not(:first-child){ - margin:20px 0px 10px 0px; -} + .comment > .control-markdown { + width: 100%; + display: none; + } -.md h2{ - margin:5px 0px 8px 0px; - font-weight:bold; +.user { + float: left; } -.md h2:not(:first-child){ - margin:20px 0px 8px 0px; -} + .user > span { + display: block; + float: left; + font-weight: bold; + } -.md h3{ - margin:3px 0px 6px 0px; - font-weight:bold; +.dept { + float: left; } -.md h3:not(:first-child){ - margin:10px 0px 6px 0px; -} + .dept > span { + display: block; + float: left; + font-weight: bold; + } -.md h4{ - margin:3px 0px 4px 0px; - font-weight:bold; +.both { + clear: both; } -.md h4:not(:first-child){ - margin:10px 0px 4px 0px; +.hidden { + display: none; } -.md h5{ - margin:3px 0px 2px 0px; - font-weight:bold; +.right { + float: right; } -.md h5:not(:first-child){ - margin:10px 0px 2px 0px; +.right-align { + text-align: right; + text-align-last: right; } -.md h6{ - margin:3px 0px 2px 0px; - font-weight:bold; +.tooltip { + display: none; + position: absolute; } - -.md h6:not(:first-child){ - margin:10px 0px 2px 0px; + +.no-border { + border: none; } - -.md hr{ - float:none; - clear:both; + +.grid { + margin: 0px 0px 10px 0px; } -.md ol{ - margin:0px 10px 10px 32px; - list-style-type:decimal; -} + .grid.fixed { + table-layout: fixed; + } + + .grid > thead > tr > caption { + margin: 0px 0px 5px 0px; + } + + .grid > thead > tr > th { + padding: 6px; + vertical-align: middle; + border-top: solid 1px transparent; + border-bottom: solid 1px transparent; + border-left: solid 1px transparent; + border-right: solid 1px white; + word-wrap: break-word; + } -.md p{ - margin:0px 0px 10px 0px; - clear:both; -} + .grid > thead > tr > th > div { + width: 100%; + float: left; + text-align: center; + z-index: 2; + } -.md table{ - width:auto; - margin:0px 0px 10px 0px; - background-color:white; -} + .grid > thead > tr > th span { + display: block; + float: left; + } -.md td{ - padding:5px 10px; - border:solid 1px silver; -} + .grid > thead > tr:first-child > th:first-child { + border-radius: 10px 0px 0px 0px / 10px 0px 0px 0px; + } -.md th{ - padding:5px 10px; - font-weight:bold; - border:solid 1px silver; -} + .grid > thead > tr:first-child > th:last-child { + border-right: solid 1px transparent; + border-radius: 0px 10px 0px 0px / 0px 10px 0px 0px; + } -.md tbody tr:nth-child(odd){ - background-color:whitesmoke; -} + .grid > thead > tr > th.sortable:hover { + cursor: pointer; + } -.md ul{ - margin:0px 10px 10px 32px; - list-style-type:disc; -} + .grid > tbody > tr > td { + max-width: 300px; + border-left: dotted 1px silver; + border-right: dotted 1px silver; + word-wrap: break-word; + } -.control-markdown{ - width:100%; - display:none; - padding:4px 4px 4px 6px; - border:solid 1px silver; - border-radius:5px; -} + .grid > tbody > tr.message-row > td { + padding: 0px; + text-align: center; + } -.control-dropdown{ - width:100%; - height:30px; - padding:4px; - border:solid 1px silver; - border-radius:5px; -} + .grid > tbody > tr [class*="status-"] { + padding: 0px 5px; + font-weight: bold; + border: solid 1px silver; + border-radius: 3px; + } -.control-spinner{ - width:auto; - height:22px; - display:block; - float:left; - padding:1px; - color:black; -} + .grid > tbody > tr > th { + padding: 6px; + vertical-align: middle; + font-weight: normal; + background-color: gainsboro; + border-top: solid 1px white; + border-bottom: solid 1px white; + border-left: solid 1px transparent; + border-right: solid 1px transparent; + word-wrap: break-word; + } -.control-checkbox{ - display:block; - float:left; - margin:8px 0px; +.grid-row { + background-color: white; + border-bottom: solid 1px silver; } -.control-checkbox ~ label{ - display:block; - float:left; - margin:7px 5px 0px 6px; -} + .grid-row td { + overflow: hidden; + } -.control-checkbox + .ui-icon.ui-icon-info{ - display:block; - float:left; - margin:7px -7px 0px 0px; + .grid-row .comment { + min-width: 200px; + max-height: 100px; + margin: 0px 0px 3px 0px; + padding: 3px 6px 3px 15px; + background: lightgoldenrodyellow; + border: solid 1px white; + clear: both; + overflow: hidden; + } + + .grid-row .comment.one-third { + max-height: 306px; + } + + .grid-row .comment.half { + max-height: 151px; + } + +.grid:not(.not-link) .grid-row:hover { + background-color: whitesmoke; + cursor: pointer; +} + +.grid-row:hover .comment { + background-color: lightyellow; +} + +.grid-row:hover .grid-title-body { +} + +.grid-row p { + float: left; +} + + .grid-row p.body { + clear: both; + } + +.grid-row[data-history] { + background-color: lightgray; +} + +.grid-title-body { + min-width: 200px; + max-height: 306px; + margin: 0px 0px 3px 0px; + padding: 3px 6px; + background: inherit; + border: solid 1px transparent; + clear: both; + overflow: hidden; } -.field-normal .control-checkbox + label{ - width:175px; -} + .grid-title-body > .body { + width: 100%; + } -_::-webkit-full-page-media, _:future, :root .field-normal .control-checkbox + label{ - width: 172px; -} + .grid-title-body > .title + .body { + padding: 8px 0px 0px 10px; + } -.container-radio{ - padding:7px 0px; +.links { + padding: 0px 10px; } -.container-radio > label{ - display:block; - float:left; - margin:0px 5px 0px 0px; - white-space:nowrap; +.link-creations button { + display: block; + float: left; + margin: 0px 10px 0px 0px; } -.control-radio{ - display:block; - float:left; - margin:3px; +.text { + width: 250px; + display: block; + float: left; + border: solid 1px silver; } -.radio-clear-both .container-radio > label{ - clear:both; +.datepicker { + display: block; + float: left; + border: solid 1px silver; } -.control-slider{ - width:30px; - float:left; - margin:8px 0px 0px 12px; +.dropdown { + display: block; + float: left; + border: solid 1px silver; } -.control-slider-ui{ - width:140px; - float:left; - margin:11px 0px 0px 5px; +[class*="limit-"] { + margin-left: 10px; + padding: 0px 5px; } -.container-selectable .wrapper{ - width:100%; - min-height:300px; - display:block; - float:left; - background-color:whitesmoke; - border:solid 1px silver; - overflow:auto; - border-radius:5px; +.limit-normal { } -.control-selectable{ - width:100%; - display:block; - float:left; - padding:5px 10px 5px 5px; - list-style-type:none; - touch-action:pan-y; +.limit-warning1 { + color: red; } -.control-selectable li{ - width:100%; - min-height:24px; - margin:3px; - padding:2px 5px; - border-radius:5px; +.limit-warning2 { + color: red; + background-color: #ffccd5; } -.control-selectable .ui-selecting{ - +.limit-warning3 { + color: white; + background-color: red; } -.control-selectable .ui-selected{ - +.message { + width: 100%; + text-align: center; + position: fixed; + left: 0px; + bottom: 78px; + z-index: 100; } -.control-basket{ - margin-left:120px; - padding:5px 5px 0px 5px; - background-color:whitesmoke; - border:solid 1px silver; - border-radius:5px; -} + .message .body { + margin-bottom: 4px; + position: relative; + border-radius: 20px; + } -.control-basket > li{ - display:block; - float:left; - margin:0px 5px 5px 0px; - padding:3px 5px; - border-radius:5px; -} + .message .close { + background-color: white; + position: absolute; + top: 11px; + right: 8px; + cursor: pointer; + border-radius: 10px; + } -.control-basket > li > span{ - display:block; - float:left; - z-index:2; +.message-dialog { + width: 100%; + display: block; + float: left; + margin: 0px auto; + text-align: center; } -.comment{ - width:100%; - display:block; - float:left; - margin:0px 0px 5px 0px; - padding:5px 10px 10px 20px; - background:lightgoldenrodyellow; - border:solid 1px silver; - position:relative; - clear:both; +.message-form-bottom { + width: 600px; + margin: 0px auto; + text-align: center; } -.comment > *{ - display:block; - float:left; +.alert-error { + min-height: 32px; + display: block; + padding: 5px; + color: white; + background-color: rgba(255,0,0,0.9); + border: solid 1px red; } -.comment > .time{ - float:left; - margin:0px 0px 8px -10px; - margin-right:10px; +.alert-success { + min-height: 32px; + display: block; + padding: 5px; + color: white; + background-color: rgba(0,128,0,0.9); + border: solid 1px green; } -.comment > .body{ - width:100%; - clear:both; +.alert-warning { + min-height: 32px; + display: block; + padding: 5px; + color: black; + background-color: yellow; + border: solid 1px yellow; } -.comment > .button.edit{ - position:absolute; - top:3px; - right:20px; - cursor:pointer; +.alert-information { + min-height: 32px; + display: block; + padding: 5px; + color: white; + background-color: blue; + border: solid 1px blue; } -.comment > .button.delete{ - position:absolute; - top:3px; - right:5px; - cursor:pointer; +label.error { + width: 100%; + display: block; + float: left; + padding: 0px 5px; + color: red; + background-color: white; + border-top: none; + top: -5px; + left: 0px; + border-radius: 0px 0px 5px 5px / 0px 0px 5px 5px; + z-index: 2; } -.comment > .control-markup{ - width:100%; +.ui-spinner > label.error { + margin-top: 3px; } -.comment > .control-markdown{ - width:100%; - display:none; +.error { + border: solid 1px red; } -.user{ - float:left; -} + .error + .ui-widget.ui-state-default.ui-multiselect { + border: solid 1px red; + } -.user > span{ - display:block; - float:left; - font-weight:bold; +.with-unit + label.error { + width: 70%; + position: absolute; + top: 25px; } -.dept{ - float:left; +.button-edit-markdown { + position: absolute; + top: 5px; + right: 5px; + cursor: pointer; + z-index: 1; } -.dept > span{ - display:block; - float:left; - font-weight:bold; +.comment > .button-edit-markdown { + top: 6px; + right: 20px; } -.both{ - clear:both; +.button-delete-address { + cursor: pointer; } -.hidden{ - display:none; +.button-right-justified { + float: right; } -.right{ - float:right; +.status-new { + background: white; } -.right-align{ - text-align:right; - text-align-last:right; +.status-preparation { + color: white; + background: darkorange; } -.tooltip{ - display:none; - position:absolute; +.status-inprogress { + color: white; + background: green; } -.no-border{ - border:none; +.status-review { + background: yellow; } -.grid{ - margin:0px 0px 10px 0px; +.status-closed { + color: white; + background: blue; } -.grid.fixed{ - table-layout:fixed; +.status-rejected { + color: white; + background: gray; } -.grid > thead > tr > caption{ - margin:0px 0px 5px 0px; +.always-hidden { + display: none; } -.grid > thead > tr > th{ - padding:6px; - vertical-align:middle; - border-top:solid 1px transparent; - border-bottom:solid 1px transparent; - border-left:solid 1px transparent; - border-right:solid 1px white; - word-wrap:break-word; +h3.title-header { + height: 40px; + padding: 10px 20px; + text-align: center; + background-color: gainsboro; + border: solid 1px darkgray; + border-radius: 10px 10px 0px 0px / 10px 10px 0px 0px; } -.grid > thead > tr > th > div{ - width:100%; - float:left; - text-align:center; - z-index:2; +.outgoing-mail .dialog { + padding: 0px !important; } -.grid > thead > tr > th span{ - display:block; - float:left; +.outgoing-mail .ui-dialog-titlebar { + display: none; } -.grid > thead > tr:first-child > th:first-child{ - border-radius:10px 0px 0px 0px / 10px 0px 0px 0px; +.svg-work-value { + width: 50px; + height: 40px; } -.grid > thead > tr:first-child > th:last-child{ - border-right:solid 1px transparent; - border-radius:0px 10px 0px 0px / 0px 10px 0px 0px; -} + .svg-work-value text { + } -.grid > thead > tr > th.sortable:hover{ - cursor:pointer; -} + .svg-work-value rect:nth-of-type(1) { + fill: gainsboro; + } -.grid > tbody > tr > td{ - max-width:300px; - border-left:dotted 1px silver; - border-right:dotted 1px silver; - word-wrap:break-word; -} + .svg-work-value rect:nth-of-type(2) { + fill: darkseagreen; + } -.grid > tbody > tr.message-row > td{ - padding:0px; - text-align:center; +.svg-progress-rate { + width: 50px; + height: 40px; } -.grid > tbody > tr [class*="status-"]{ - padding:0px 5px; - font-weight:bold; - border:solid 1px silver; - border-radius:3px; -} + .svg-progress-rate text { + } -.grid > tbody > tr > th{ - padding:6px; - vertical-align:middle; - font-weight:normal; - background-color:gainsboro; - border-top:solid 1px white; - border-bottom:solid 1px white; - border-left:solid 1px transparent; - border-right:solid 1px transparent; - word-wrap:break-word; -} + .svg-progress-rate.warning text { + fill: red; + } -.grid-row{ - background-color:white; - border-bottom:solid 1px silver; -} + .svg-progress-rate rect:nth-of-type(1) { + fill: gainsboro; + } -.grid-row td{ - overflow:hidden; -} + .svg-progress-rate rect:nth-of-type(2) { + fill: gray; + } -.grid-row .comment{ - min-width:200px; - max-height:100px; - margin:0px 0px 3px 0px; - padding:3px 6px 3px 15px; - background:lightgoldenrodyellow; - border:solid 1px white; - clear:both; - overflow:hidden; -} + .svg-progress-rate rect:nth-of-type(3) { + fill: darkseagreen; + } -.grid-row .comment.one-third{ - max-height:306px; -} + .svg-progress-rate.warning rect:nth-of-type(3) { + fill: #ffccd5; + } -.grid-row .comment.half{ - max-height:151px; +.svg-kamban-aggregation-view { + width: 100%; + height: 20px; } -.grid:not(.not-link) .grid-row:hover{ - background-color:whitesmoke; - cursor:pointer; -} + .svg-kamban-aggregation-view rect { + height: 20px; + fill: darkseagreen; + } -.grid-row:hover .comment{ - background-color:lightyellow; +.svg-crosstab { + width: 100%; + height: 20px; } -.grid-row:hover .grid-title-body{ + .svg-crosstab rect { + height: 20px; + fill: darkseagreen; + } +.axis { + fill: none; + stroke: gray; + shape-rendering: crispEdges; } -.grid-row p{ - float:left; +.h2 { + margin: 0px 0px 5px 0px; + padding: 0px; } -.grid-row p.body{ - clear:both; +.h3 { + margin: 0px 0px 5px 10px; + padding: 0px; } -.grid-row[data-history]{ - background-color:lightgray; +.h4 { + margin: 0px 0px 5px 20px; + padding: 0px; } -.grid-title-body{ - min-width:200px; - max-height:306px; - margin:0px 0px 3px 0px; - padding:3px 6px; - background:inherit; - border:solid 1px transparent; - clear:both; - overflow:hidden; +.h5 { + margin: 0px 0px 5px 30px; + padding: 0px; } -.grid-title-body > .body{ - width:100%; +.h6 { + margin: 0px 0px 5px 40px; + padding: 0px; } -.grid-title-body > .title + .body{ - padding:8px 0px 0px 10px; +.h2 > h2 { + padding: 5px 0px; + font-weight: bold; + border-bottom: solid 1px silver; } -.links{ - padding:0px 10px; +.h3 > h3 { + font-weight: bold; } -.link-creations button{ - display:block; - float:left; - margin:0px 10px 0px 0px; +.h4 > h4 { + font-weight: bold; } -.text{ - width:250px; - display:block; - float:left; - border:solid 1px silver; +.h5 > h5 { + font-weight: bold; } -.datepicker{ - display:block; - float:left; - border:solid 1px silver; +.h6 > h6 { + font-weight: bold; } -.dropdown{ - display:block; - float:left; - border:solid 1px silver; +.w50 { + width: 50px; } -[class*="limit-"]{ - margin-left:10px; - padding:0px 5px; +.w100 { + width: 100px; } -.limit-normal{ - +.w150 { + width: 150px; } -.limit-warning1{ - color:red; +.w200 { + width: 200px; } -.limit-warning2{ - color:red; - background-color:#ffccd5; +.w250 { + width: 250px; } -.limit-warning3{ - color:white; - background-color:red; +.w300 { + width: 300px; } -.message{ - width:100%; - text-align:center; - position:fixed; - left:0px; - bottom:78px; - z-index:100; +.w350 { + width: 350px; } -.message .body{ - margin-bottom:4px; - position:relative; - border-radius:20px; +.w400 { + width: 400px; } -.message .close{ - background-color:white; - position:absolute; - top:11px; - right:8px; - cursor:pointer; - border-radius:10px; +.w450 { + width: 450px; } -.message-dialog{ - width:100%; - display:block; - float:left; - margin:0px auto; - text-align:center; +.w500 { + width: 500px; } -.message-form-bottom{ - width:600px; - margin:0px auto; - text-align:center; +.w550 { + width: 550px; } -.alert-error{ - min-height:32px; - display:block; - padding:5px; - color:white; - background-color:rgba(255,0,0,0.9); - border:solid 1px red; +.w600 { + width: 600px; } -.alert-success{ - min-height:32px; - display:block; - padding:5px; - color:white; - background-color:rgba(0,128,0,0.9); - border:solid 1px green; +.h100 { + height: 100px; } -.alert-warning{ - min-height:32px; - display:block; - padding:5px; - color:black; - background-color:yellow; - border:solid 1px yellow; +.h150 { + height: 150px; } -.alert-information{ - min-height:32px; - display:block; - padding:5px; - color:white; - background-color:blue; - border:solid 1px blue; +.h200 { + height: 200px; } -label.error{ - width:100%; - display:block; - float:left; - padding:0px 5px; - color:red; - background-color:white; - border-top:none; - top:-5px; - left:0px; - border-radius:0px 0px 5px 5px / 0px 0px 5px 5px; - z-index:2; +.h250 { + height: 250px; } -.ui-spinner>label.error{ - margin-top:3px; +.h300 { + height: 300px; } -.error{ - border:solid 1px red; +.h350 { + height: 350px; } -.error+.ui-widget.ui-state-default.ui-multiselect{ - border:solid 1px red; +.h400 { + height: 400px; } -.with-unit+label.error{ - width:70%; - position:absolute; - top:25px; +.h450 { + height: 450px; } -.button-edit-markdown{ - position:absolute; - top:5px; - right:5px; - cursor:pointer; - z-index:1; +.h500 { + height: 500px; } -.comment > .button-edit-markdown{ - top:6px; - right:20px; +.h550 { + height: 550px; } -.button-delete-address{ - cursor:pointer; +.h600 { + height: 600px; } -.button-right-justified{ - float:right; +.m-l10 { + margin-left: 10px; } -.status-new{ - background:white; +.m-l20 { + margin-left: 20px; } -.status-preparation{ - color:white; - background:darkorange; +.m-l30 { + margin-left: 30px; } -.status-inprogress{ - color:white; - background:green; +.m-l40 { + margin-left: 40px; } -.status-review{ - background:yellow; +.m-l50 { + margin-left: 50px; } -.status-closed{ - color:white; - background:blue; +.paragraph { + padding: 3px 3px 3px 10px; } -.status-rejected{ - color:white; - background:gray; +.dialog { + display: none; + padding: 15px 0px 10px 0px !important; } -.always-hidden{ - display:none; -} + .dialog .fieldset { + margin: 0px 10px 10px 10px; + } -h3.title-header{ - height:40px; - padding:10px 20px; - text-align:center; - background-color:gainsboro; - border:solid 1px darkgray; - border-radius:10px 10px 0px 0px / 10px 10px 0px 0px; +.link span { + margin-right: 5px; } -.outgoing-mail .dialog{ - padding:0px !important; -} + .link span.bold { + font-weight: bold; + cursor: pointer; + } -.outgoing-mail .ui-dialog-titlebar{ - display:none; +.histories-form { + padding: 20px; } -.svg-work-value{ - width:50px; - height:40px; +.ui-widget input, .ui-widget select, .ui-widget button { + font-family: Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; } -.svg-work-value text{ - +.ui-widget textarea { + line-height: 1.5em; + font-family: Terminal,Hiragino Kaku Gothic Pro; } -.svg-work-value rect:nth-of-type(1){ - fill:gainsboro; +.ui-widget { + font-size: 1em; } -.svg-work-value rect:nth-of-type(2){ - fill:darkseagreen; +.ui-button { + padding: 4px 4px 4px 2px !important; } -.svg-progress-rate{ - width:50px; - height:40px; +.ui-dialog { + overflow: visible !important; } -.svg-progress-rate text{ - +.ui-icon.a { + float: left; + margin: 6px 0px 0px 0px; } -.svg-progress-rate.warning text{ - fill:red; +.ui-spinner { + display: block; + float: left; + background: white; + max-height: 46px; } -.svg-progress-rate rect:nth-of-type(1){ - fill:gainsboro; +.ui-widget.ui-state-default.ui-multiselect { + height: 30px; + background: white; + border: solid 1px silver; + overflow: hidden; + border-radius: 5px; } -.svg-progress-rate rect:nth-of-type(2){ - fill:gray; +.ui-multiselect-checkboxes { + min-height: 300px; } -.svg-progress-rate rect:nth-of-type(3){ - fill:darkseagreen; -} + .ui-multiselect-checkboxes input { + margin: 0px 5px; + } -.svg-progress-rate.warning rect:nth-of-type(3){ - fill:#ffccd5; +.ui-corner-all.ui-state-hover { + border-radius: 2px; } -.svg-kamban-aggregation-view{ - width:100%; - height:20px; +div.field-control .ui-multiselect.ui-state-disabled { + background-color: whitesmoke; + opacity: 1; } -.svg-kamban-aggregation-view rect{ - height:20px; - fill:darkseagreen; +.height-auto { + max-height: none !important; } -.svg-crosstab{ - width:100%; - height:20px; +.focus-inform { + background-color: white !important; + border: solid 1px orange !important; } -.svg-crosstab rect{ - height:20px; - fill:darkseagreen; +.menu-negative { + border-left: solid 1px white; + border-right: solid 1px white; + position: absolute; + z-index: 10; } -.axis{ - fill:none; - stroke:gray; - shape-rendering:crispEdges; -} + .menu-negative > li { + width: 100%; + display: block; + float: left; + border-top: dotted 1px white; + cursor: pointer; + clear: both; + } -.h2{ - margin:0px 0px 5px 0px; - padding:0px; +.sortable { } -.h3{ - margin:0px 0px 5px 10px; - padding:0px; +.menu-sort { + border-left: solid 1px white; + border-right: solid 1px white; + position: absolute; + border-radius: 0px 0px 10px 10px / 0px 0px 10px 10px; + z-index: 10; } -.h4{ - margin:0px 0px 5px 20px; - padding:0px; -} + .menu-sort > li { + width: 100%; + display: block; + float: left; + border-top: dotted 1px white; + cursor: pointer; + clear: both; + } -.h5{ - margin:0px 0px 5px 30px; - padding:0px; -} + .menu-sort > li.ui-menu-divider { + height: initial; + font-size: initial; + } -.h6{ - margin:0px 0px 5px 40px; - padding:0px; -} + .menu-sort > li:hover { + } -.h2 > h2{ - padding:5px 0px; - font-weight:bold; - border-bottom:solid 1px silver; -} + .menu-sort > li > * { + } -.h3 > h3{ - font-weight:bold; -} + .menu-sort > li.grid-header-filter .ui-icon { + position: initial; + } -.h4 > h4{ - font-weight:bold; -} + .menu-sort > li:not(.grid-header-filter) div.field-control > * { + border: solid 1px silver; + } -.h5 > h5{ - font-weight:bold; +.current-time { + position: absolute; + top: 9px; + right: -17px; + cursor: pointer; + z-index: 10; } -.h6 > h6{ - font-weight:bold; +.current-user { + position: absolute; + top: 9px; + right: -17px; + cursor: pointer; + z-index: 10; } -.w50{ - width:50px; +.current-dept { + position: absolute; + top: 9px; + right: -17px; + cursor: pointer; + z-index: 10; } -.w100{ - width:100px; +input:focus { + background-color: #ffffcc; } -.w150{ - width:150px; +select:focus:not(.has-css) { + background-color: #ffffcc; } -.w200{ - width:200px; +textarea:focus { + background-color: #ffffcc; } -.w250{ - width:250px; +.ssoLoginMessage { + margin: 10px; + padding: 6px; + border-top: solid 1px silver; } -.w300{ - width:300px; +#EnterPriseBanner { + width: 238px; + position: fixed; + right: 8px; + bottom: 280px; + z-index: 3; } -.w350{ - width:350px; +#SupportBanner { + width: 238px; + position: fixed; + right: 8px; + bottom: 180px; + z-index: 3; } -.w400{ - width:400px; +#CasesBanner { + width: 238px; + position: fixed; + right: 8px; + bottom: 80px; + z-index: 3; } -.w450{ - width:450px; +.annonymous .close-announcement { + display: none; } -.w500{ - width:500px; +.grid-stack { + background-color: white; + margin: 10px; } -.w550{ - width:550px; +.grid-stack-item-content { + background-color: whitesmoke; } -.w600{ - width:600px; +.dashboard-timeline-container { + display: flex; + flex-direction: column; + gap: 4px; } -.h100{ - height:100px; +.dashboard-timeline-item { + background-color: white; + margin: 4px; + padding: 8px; + transition: background-color 0.3s; + cursor: pointer; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + border-radius: 4px; } -.h150{ - height:150px; -} + .dashboard-timeline-item:hover { + background-color: #ebebeb; + } -.h200{ - height:200px; +.dashboard-timeline-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 4px; } -.h250{ - height:250px; -} + .dashboard-timeline-header a { + color: #007bff; + font-weight: bold; + min-width: 40px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } -.h300{ - height:300px; +.dashboard-timeline-header-closed { + overflow: hidden; + max-height: 0; + margin-bottom: 0; } -.h350{ - height:350px; +.dashboard-timeline-item:hover .dashboard-timeline-header-closed { + max-height: 200px; + margin-bottom: 4px; + overflow: auto; + transition: max-height 0.5s linear 1.0s; } -.h400{ - height:400px; +.dashboard-timeline-record-time { + font-size: 0.8em; + color: #777; + margin-left: 3px; + font-weight: bold; + display: flex; + white-space: nowrap; } -.h450{ - height:450px; -} + .dashboard-timeline-record-time time { + margin-left: 4px; + } -.h500{ - height:500px; -} + .dashboard-timeline-record-time .elapsed-time { + margin-left: 4px; + font-weight: bold; + background-color: #eee; + } -.h550{ - height:550px; +.dashboard-timeline-title { + font-size: 1.2em; + font-weight: bold; + color: #333333; } -.h600{ - height:600px; +.dashboard-timeline-body { + margin-top: 8px; + line-height: 1.5; + color: #555; } -.m-l10{ - margin-left:10px; +.dashboard-timeline-body-closed { + margin-top: 0; + overflow: hidden; + max-height: 0px; } -.m-l20{ - margin-left:20px; +.dashboard-timeline-item:hover .dashboard-timeline-body-closed { + margin-top: 8px; + max-height: 300px; + overflow: auto; + transition: max-height 0.5s linear 1.0s, margin-top 0s; + transition-delay: 1.0s } -.m-l30{ - margin-left:30px; +.grid-stack-item-content { + background-color: #f2f2f2; + padding: 16px; + border-radius: 5px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; } -.m-l40{ - margin-left:40px; +.dashboard-part-title { + font-size: 1.2em; + color: #333333; + font-weight: bold; + margin-bottom: 10px; } -.m-l50{ - margin-left:50px; +.dashboard-part-nav { + margin-top: 10px; } -.paragraph{ - padding:3px 3px 3px 10px; +.dashboard-part-nav-menu { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-wrap: wrap; +} + + .dashboard-part-nav-menu > .dashboard-part-nav-item { + max-width: 200px; + min-width: 120px; + margin-left: 10px; + white-space: nowrap; + overflow: hidden; + padding: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + } + +.dashboard-part-nav-menu-vartical { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; } -.dialog{ - display:none; - padding:15px 0px 10px 0px !important; +.dashboard-part-nav-item { + color: #333; + margin-bottom: 8px; + padding: 4px; + display: flex; + border-radius: 4px; + background-color: white; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } -.dialog .fieldset{ - margin:0px 10px 10px 10px; -} + .dashboard-part-nav-item:hover { + background-color: #dddddd; + } -.link span{ - margin-right:5px; +.dashboard-part-nav-link { + padding: 4px; + text-decoration: none; + color: inherit; + width: 100%; } -.link span.bold{ - font-weight:bold; - cursor:pointer; +.gs-20 > .grid-stack-item { + width: 5%; + min-width: 5%; } -.histories-form{ - padding:20px; -} + .gs-20 > .grid-stack-item[gs-w="1"] { + width: 5%; + min-width: 5%; + } -.ui-widget input, .ui-widget select, .ui-widget button{ - font-family:Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; -} + .gs-20 > .grid-stack-item[gs-x="1"] { + left: 5%; + } -.ui-widget textarea{ - line-height:1.5em; - font-family:Terminal,Hiragino Kaku Gothic Pro; -} + .gs-20 > .grid-stack-item[gs-w="2"] { + width: 10%; + } -.ui-widget{ - font-size:1em; -} + .gs-20 > .grid-stack-item[gs-x="2"] { + left: 10%; + } -.ui-button{ - padding:4px 4px 4px 2px !important; -} + .gs-20 > .grid-stack-item[gs-w="3"] { + width: 15%; + } -.ui-dialog{ - overflow:visible !important; -} + .gs-20 > .grid-stack-item[gs-x="3"] { + left: 15%; + } -.ui-icon.a{ - float:left; - margin:6px 0px 0px 0px; -} + .gs-20 > .grid-stack-item[gs-w="4"] { + width: 20%; + } -.ui-spinner{ - display:block; - float:left; - background:white; - max-height:46px; -} + .gs-20 > .grid-stack-item[gs-x="4"] { + left: 20%; + } -.ui-widget.ui-state-default.ui-multiselect{ - height:30px; - background:white; - border:solid 1px silver; - overflow:hidden; - border-radius:5px; -} + .gs-20 > .grid-stack-item[gs-w="5"] { + width: 25%; + } -.ui-multiselect-checkboxes{ - min-height:300px; -} + .gs-20 > .grid-stack-item[gs-x="5"] { + left: 25%; + } -.ui-multiselect-checkboxes input{ - margin:0px 5px; -} + .gs-20 > .grid-stack-item[gs-w="6"] { + width: 30%; + } -.ui-corner-all.ui-state-hover{ - border-radius:2px; -} + .gs-20 > .grid-stack-item[gs-x="6"] { + left: 30%; + } -div.field-control .ui-multiselect.ui-state-disabled{ - background-color:whitesmoke; - opacity:1; -} + .gs-20 > .grid-stack-item[gs-w="7"] { + width: 35%; + } -.height-auto{ - max-height:none !important; -} + .gs-20 > .grid-stack-item[gs-x="7"] { + left: 35%; + } -.focus-inform{ - background-color:white !important; - border:solid 1px orange !important; -} + .gs-20 > .grid-stack-item[gs-w="8"] { + width: 40%; + } -.menu-negative{ - border-left:solid 1px white; - border-right:solid 1px white; - position:absolute; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="8"] { + left: 40%; + } -.menu-negative > li{ - width:100%; - display:block; - float:left; - border-top:dotted 1px white; - cursor:pointer; - clear:both; -} + .gs-20 > .grid-stack-item[gs-w="9"] { + width: 45%; + } -.sortable{ + .gs-20 > .grid-stack-item[gs-x="9"] { + left: 45%; + } -} + .gs-20 > .grid-stack-item[gs-w="10"] { + width: 50%; + } -.menu-sort{ - border-left:solid 1px white; - border-right:solid 1px white; - position:absolute; - border-radius:0px 0px 10px 10px / 0px 0px 10px 10px; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="10"] { + left: 50%; + } -.menu-sort > li{ - width:100%; - display:block; - float:left; - border-top:dotted 1px white; - cursor:pointer; - clear:both; -} + .gs-20 > .grid-stack-item[gs-w="11"] { + width: 55%; + } -.menu-sort > li.ui-menu-divider{ - height:initial; - font-size:initial; -} + .gs-20 > .grid-stack-item[gs-x="11"] { + left: 55%; + } -.menu-sort > li:hover{ + .gs-20 > .grid-stack-item[gs-w="12"] { + width: 60%; + } -} + .gs-20 > .grid-stack-item[gs-x="12"] { + left: 60%; + } -.menu-sort > li > *{ + .gs-20 > .grid-stack-item[gs-w="13"] { + width: 65%; + } + + .gs-20 > .grid-stack-item[gs-x="13"] { + left: 65%; + } -} + .gs-20 > .grid-stack-item[gs-w="14"] { + width: 70%; + } -.menu-sort > li.grid-header-filter .ui-icon{ - position:initial; -} + .gs-20 > .grid-stack-item[gs-x="14"] { + left: 70%; + } -.menu-sort > li:not(.grid-header-filter) div.field-control > *{ - border:solid 1px silver; -} + .gs-20 > .grid-stack-item[gs-w="15"] { + width: 75%; + } -.current-time{ - position:absolute; - top:9px; - right:-17px; - cursor:pointer; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="15"] { + left: 75%; + } -.current-user{ - position:absolute; - top:9px; - right:-17px; - cursor:pointer; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-w="16"] { + width: 80%; + } -.current-dept{ - position:absolute; - top:9px; - right:-17px; - cursor:pointer; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="16"] { + left: 80%; + } -input:focus{ - background-color:#ffffcc; -} - -select:focus:not(.has-css){ - background-color:#ffffcc; -} + .gs-20 > .grid-stack-item[gs-w="17"] { + width: 85%; + } -textarea:focus{ - background-color:#ffffcc; -} + .gs-20 > .grid-stack-item[gs-x="17"] { + left: 85%; + } -.ssoLoginMessage{ - margin:10px; - padding:6px; - border-top:solid 1px silver; -} + .gs-20 > .grid-stack-item[gs-w="18"] { + width: 90%; + } -#EnterPriseBanner{ - width:238px; - position:fixed; - right:8px; - bottom:280px; - z-index:3; -} + .gs-20 > .grid-stack-item[gs-x="18"] { + left: 90%; + } -#SupportBanner { - width:238px; - position:fixed; - right:8px; - bottom:180px; - z-index:3; -} + .gs-20 > .grid-stack-item[gs-w="19"] { + width: 95%; + } -#CasesBanner{ - width:238px; - position:fixed; - right:8px; - bottom:80px; - z-index:3; -} + .gs-20 > .grid-stack-item[gs-x="19"] { + left: 95%; + } -.annonymous .close-announcement{ - display:none; -} + .gs-20 > .grid-stack-item[gs-w="20"] { + width: 100%; + } diff --git a/Implem.Pleasanter/wwwroot/content/styles.min.css b/Implem.Pleasanter/wwwroot/content/styles.min.css index f58fc1876..d403f2a70 100644 --- a/Implem.Pleasanter/wwwroot/content/styles.min.css +++ b/Implem.Pleasanter/wwwroot/content/styles.min.css @@ -1 +1 @@ -@charset "utf-8";*{box-sizing:border-box}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-style:normal;font-weight:normal;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}input,textarea{margin:0;padding:0}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th{text-align:left}a:focus{outline:none}.cf:before,.cf:after{content:" ";display:table}.cf:after{clear:both}.cf{*zoom:1}.both{clear:both}img{max-width:100%;height:auto;width:auto}::-webkit-input-placeholder{color:#c0c0c0}:-moz-placeholder{color:#c0c0c0;opacity:1}::-moz-placeholder{color:#c0c0c0;opacity:1}:-ms-input-placeholder{color:#c0c0c0}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type="number"]{-moz-appearance:textfield}body{min-width:1200px;font-size:.75em;font-family:Hiragino Kaku Gothic Pro,"Meiryo UI",sans-serif;clear:both}h1{clear:both}h2{clear:both}h3{clear:both}legend{cursor:pointer}legend>*{display:block;float:left}label{position:relative;cursor:pointer;z-index:2}input{background-color:#fff;position:relative;z-index:2}select{position:relative;z-index:2}table{width:100%;border:0;border-collapse:collapse;clear:both}td{padding:3px;vertical-align:top;color:#000}td.right-align>p{float:right}pre{line-height:1.5em;font-family:Terminal,Hiragino Kaku Gothic Pro;word-wrap:break-word;word-break:break-all;white-space:pre-wrap}#Logo{padding:3px 0}#CorpLogo{display:block;float:left;margin:3px 0 0 0}#ProductLogo{display:block;float:left;padding:0 0 0 5px;font-size:26px;font-weight:bold;color:#696969;text-decoration:none}#PortalLink{position:relative;top:-38px;right:40px;float:right}#LoginFieldSet{width:500px;margin:150px auto 20px auto;padding:50px;background-color:#f5f5f5;border-radius:10px}#LoginCommands{text-align:right;clear:both}#Demo{width:500px;margin:0 auto}#DemoFields{padding:20px 10px 10px 10px}#SearchPermissionElements{margin-left:15px}#Breadcrumb{float:left;margin:0 0 5px 0}#Breadcrumb .item{display:block;float:left;padding:3px 5px}#Breadcrumb .item.trashbox{display:block;float:left;color:#fff;background-color:#f00;border-radius:3px}#Breadcrumb .separator{margin:0 0 0 8px}#Guide>div{width:100%;display:block;float:left;margin:0 0 5px 0;padding:5px 10px;background:#fafad2;border:solid 1px #c0c0c0;position:relative;clear:both;border-radius:5px}#CopyToClipboards>.display-control{float:left;cursor:pointer}#Header{width:100%;float:left;padding:0 6px;border:none;position:relative;clear:both}#Navigations{height:30px;margin:0 0 5px 0;padding:0 5px 0 15px;border:none;top:0;right:5px;border-radius:20px 5px 5px 20px;float:right}#NavigationMenu{float:left;margin-right:5px}#NavigationMenu>li{width:158px;height:30px;display:block;float:left;position:relative}#NavigationMenu>li>div{height:30px;text-align:center;line-height:30px;cursor:pointer}#NavigationMenu>li>div>a{height:30px;display:block;text-decoration:none}#NavigationMenu .menu{width:158px;display:none;border-top:none !important;position:absolute;top:30px;right:0;border-radius:0 0 5px 5px;z-index:3}#NavigationMenu .menu>li>a{display:block;text-decoration:none}#NavigationMenu .menu>li>a.ui-state-active{font-weight:normal;text-decoration:none}#TemplateDialog>div{padding:0 15px;overflow:hidden}#SearchField{float:left;margin:3px 0;color:#000}#Search{height:24px}#SwitchUserInfo{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#SwitchUserInfo>a{width:100%;display:block;float:left;color:#fff;text-decoration:none}#ExcessLicenseWarning{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background:#f00;border-radius:7px}#PublishWarning{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#PublishWarning>a{width:100%;display:block;float:left;color:#fff;text-decoration:none}#LockedWarning{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#LockedWarning>div{width:100%;display:block;float:left;color:#fff;text-decoration:none}#Application{width:100%;float:left;margin:10px 0 0 0;padding:0 10px 120px 10px;position:relative;clear:both}#Application>.site-image-icon{display:block;float:left;margin:0 10px 0 0}#StartGuide{width:100%;display:block;float:left;margin:0 0 10px 0;padding:50px 0 0 0;background-color:#f5f5f5;position:relative;border-radius:10px}#StartGuide>#StartGuideContents{width:900px;margin:0 auto}#StartGuide>#StartGuideContents>a{width:150px;display:block;float:left;margin:0 37px;padding:5px;text-align:center;border-radius:5px}#StartGuide>#StartGuideContents>a:hover{background-color:#fff}#StartGuide>#StartGuideContents>a>*{display:block;text-align:center;clear:both}#StartGuide>#StartGuideContents>a>img{width:50px;margin:5px 50px}#StartGuide>#DisableStartGuideField{display:block;float:left;margin:50px 0 0 20px;clear:both}#StartGuide>.ui-icon{position:absolute;top:10px;right:10px;cursor:pointer}#SiteImageIconContainer{float:left}#SiteImageIconContainer>*{margin:0 5px 0 0}#HeaderTitleContainer{float:left;margin:0 0 10px 0}#HeaderTitle{font-size:20px;font-weight:bold;color:#d2691e}#Notes>*{width:100%;float:left;margin:0 10px 5px 0}#Notes>.history{width:100%;display:block;float:left;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#Notes>.readonly{width:100%;display:block;float:left;padding:5px 10px;color:#fff;background-color:#ffa500;border-radius:7px}#ViewSelectorField{position:absolute;top:-10px;right:0}#ViewFilters{width:100%;float:left;margin:0 0 5px 0;padding:5px 5px 2px 5px;border:solid 1px #c0c0c0;border-radius:5px}#ViewFilters.reduced{width:auto;padding:0;border:none}#ViewFilters>.field-auto-thin{height:32px;float:left;padding:0}#ViewFilters_Reset{display:block;float:left;margin:0 20px 0 0}#ViewFilters>.display-control{float:left;margin:0 5px 0 0;padding:5px 10px 5px 0;font-weight:bold;cursor:pointer}#ViewFilters .ui-icon.ui-icon-info{transform:scale(1,-1)}#FilterButton{display:block;float:left}#Aggregations{width:100%;float:left;margin:0 0 5px 0;padding:3px 5px 5px 5px;border:solid 1px #c0c0c0;border-radius:5px}#Aggregations.reduced{width:auto;padding:0;border:none}#Aggregations .label{height:26px;display:block;float:left;margin:2px 5px 0 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#Aggregations .label.overdue{font-weight:bold;color:#fff;background-color:#f00;cursor:pointer}#Aggregations .data{height:26px;display:block;float:left;margin:2px 5px 0 0;padding:5px}#Aggregations .data.overdue{color:#f00;cursor:pointer}#Aggregations em{display:block;float:left;margin-right:5px;font-weight:bold}#Aggregations>.display-control{float:left;margin:0 5px 0 0;padding:5px 10px 5px 0;font-weight:bold;cursor:pointer}#SitePackagesSelectable span.include-data{margin:0 0 0 10px;color:#f00}#CalendarDate{margin-right:10px}#CalendarBody table{table-layout:fixed}#CalendarBody thead th{padding:5px;text-align:center;border:solid 1px #c0c0c0}th.calendar-header{text-align:center;background-color:#fff}#CalendarBody .saturday{background-color:#add8e6}#CalendarBody .sunday{background-color:#ffc0cb}#CalendarBody td{padding:0;border:solid 1px #c0c0c0}#CalendarBody td>div{min-height:50px;padding:5px}#CalendarBody td.hover{background-color:#f5f5f5}#CalendarBody .other-month{background-color:#dcdcdc}#CalendarBody .today{border:solid 2px #00f;z-index:20}#CalendarBody .item{height:25px;margin:5px 0 0 0;background-color:#fafad2;border:solid 1px #c0c0c0;border-radius:3px}#CalendarBody .item.hover{background-color:#fff;border:solid 1px #ffa500}#CalendarBody .item.changed{font-weight:bold;background-color:#ff0;border:solid 1px #ffa500}#CalendarBody .item .connection{width:14px;height:25px;background-color:#fafad2;border-top:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;position:relative;top:-1px;left:-14px}#CalendarBody .item .connection.hover{background-color:#fff;border-top:solid 1px #ffa500;border-bottom:solid 1px #ffa500}#CalendarBody .item .connection.changed{font-weight:bold;background-color:#ff0;border-top:solid 1px #ffa500;border-bottom:solid 1px #ffa500}#CalendarBody .item .title{padding:5px 0;position:absolute;overflow:hidden;white-space:nowrap;z-index:30}#CalendarBody .item .title.sub{display:none}#CalendarBody .item .title>span:not(.ui-icon){margin-right:3px}#CalendarBody .dragging{height:25px;padding:5px;background-color:#fafad2;border-radius:3px;z-index:50}#CalendarBody .dummy{height:25px;margin:5px 0 0 0}#Crosstab .crosstab-row{border-bottom:dotted 1px #c0c0c0}#Crosstab .saturday{background-color:#eee}#Crosstab .sunday{background-color:#fee}#CrosstabMonth{margin-right:10px}#Gantt{width:100%;background-color:#f5f5f5;border-radius:20px}#Gantt .saturday{fill:#eee}#Gantt .sunday{fill:#fee}#Gantt .date{stroke:white}#Gantt .now{stroke:red}#Gantt .planned rect{cursor:pointer;fill:gainsboro}#Gantt .planned rect.summary{cursor:auto}#Gantt .earned rect{cursor:pointer;fill:darkseagreen}#Gantt .earned rect.summary{cursor:auto}#Gantt rect.delay{fill:#ffccd5}#Gantt rect.completed{fill:lightsteelblue}#Gantt .title text{cursor:pointer}#Gantt .title text.delay{fill:red}#Gantt .title text.summary{font-size:1.2em;font-weight:bold;cursor:auto}#GanttStartDate{margin-right:10px}#GanttAxis{width:calc(100% + 20px);height:50px;margin-left:-10px;margin-top:-25px;background-color:rgba(255,255,255,.5);position:sticky;left:0;bottom:75px}#GanttAxis .saturday{fill:gainsboro}#GanttAxis .sunday{fill:#fdd}#GanttAxis .weekday{fill:whitesmoke}#GanttAxis .date{stroke:white}#BurnDown{width:100%;height:350px;background-color:#f5f5f5;border-radius:20px}#BurnDown .now{stroke:red}#BurnDown .total{fill:none;stroke:green}#BurnDown .planned{fill:none;stroke:gray}#BurnDown .earned{fill:none;stroke:orange}#BurnDown .total circle{fill:green}#BurnDown .planned circle{fill:gray}#BurnDown .earned circle{fill:orange}#BurnDownDetails>tbody>tr:hover{background-color:#f5f5f5;cursor:pointer}#BurnDownDetails>tbody>tr>td{padding:6px}#BurnDownDetails>tbody>tr>td.warning{font-weight:bold;color:#f00}#BurnDownDetails>tbody>tr>td.difference{font-size:1.3em;font-weight:bold;color:#00f;background-color:#e0ffff}#BurnDownDetails>tbody>tr>td.difference.warning{color:#f00;background-color:#ffccd5}#BurnDownDetails .user-info{margin:5px;padding:8px;font-weight:bold;background-color:#eee8aa}#BurnDownDetails .items{padding:5px 0 5px 20px}#BurnDownDetails .items a{color:#000;text-decoration:none}#BurnDownDetails .items a:hover{color:#00f;text-decoration:underline}#TimeSeries{width:100%;height:450px;background-color:#f5f5f5;border-radius:20px}#TimeSeries .surface{stroke:white}#TimeSeries .index{fill:black}#KambanBody .kamban-row{border-bottom:dotted 1px #c0c0c0}#KambanBody .kamban-container>div{min-height:30px}#KambanBody .kamban-container.hover{background-color:#f5f5f5}#KambanBody .kamban-container .kamban-item:last-child{margin:3px 3px 30px 3px}#KambanBody .kamban-item{margin:3px;padding:4px 16px 4px 5px;background-color:#fafad2;border:solid 1px #c0c0c0;position:relative;cursor:pointer;border-radius:5px}#KambanBody .kamban-item:hover{background-color:#fff;border:solid 1px #ffa500}#KambanBody .kamban-item.changed{font-weight:bold;background-color:#ff0;border:solid 1px #ffa500}#KambanBody .kamban-item .ui-icon{position:absolute;top:0;right:0}#KambanBody .kamban-item>span{margin-right:3px}#ImageLib .item{width:250px;height:250px;float:left;margin:10px 10px 0 0;padding:10px;border:solid 1px #c0c0c0;position:relative;overflow:hidden}#ImageLib .item .image{width:100%;float:left;margin:5px 0 0 0}#ImageLib .item .delete-image{float:left;position:absolute;right:5px;bottom:5px}#RecordHeader{width:100%;float:left;margin:0 0 5px 0}#RecordInfo{float:left;padding:6px 0 0 0}#RecordInfo div{float:left;margin-right:50px}#RecordInfo div p{float:left;margin-right:5px}#RecordInfo div p .elapsed-time{float:left;padding:0 5px;font-weight:bold;background-color:#eee;border-radius:2px}#RecordSwitchers{float:right}#RecordSwitchers>*{float:left}#RecordSwitchers .current{height:26px;display:block;float:left;margin:0 1px 0 0;padding:5px;border-radius:5px}#TemplateTabsContainer{width:100%;float:left}#Editor{width:100%;float:left;clear:both}#EditorTabsContainer{width:73%;float:left;margin:0 0 20px 0}#EditorTabsContainer.max{width:100%}#MailEditorTabsContainer{width:100%;float:left;margin:0 0 20px 0;border:none}#EditorComments{width:27%;float:right;margin:0 0 15px 0;padding:0 0 0 5px}#EditorComments .title-header{margin:3px 10px 8px 0}#CommentField{margin:0 0 5px 0}#OutgoingMailsForm{width:73%;float:left}#OutgoingMailsForm>.item{width:100%;float:left;position:relative;border-radius:10px}#OutgoingMailsForm .content{width:100%;float:left;margin:5px 0 20px 0;padding:10px 0 0 0;border:solid 1px #c0c0c0;border-top:none;border-radius:0 0 10px 10px/0 0 10px 10px}#DropDownSearchDialogForm{width:100%;padding:0 20px}#ProcessTabsContainer{margin:0 20px 10px 20px;clear:both}#StatusControlTabsContainer{margin:0 20px 10px 20px;clear:both}#StatusControlColumnHash .column-control-types{margin:0 0 0 10px}#ViewTabsContainer{margin:0 20px 10px 20px;clear:both}#ExportTabsContainer{margin:0 20px 10px 20px;clear:both}#EditorDetailTabsContainer{margin:0 20px 10px 20px;clear:both}#ColumnAccessControlTabsContainer{margin:0 20px 10px 20px;clear:both}#SearchResults{width:80%;float:left;margin:0 100px}#SearchResults .count{float:left;margin:0 0 10px 0}#SearchResults .count .label{height:26px;display:block;float:left;margin:0 5px 5px 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#SearchResults .count .data{height:26px;display:block;float:left;margin:0 5px 5px 0;padding:5px}#SearchResults .result{width:100%;float:left;padding:15px;border:solid 1px #fff;clear:both}#SearchResults .result>ul{display:block;float:left;clear:both}#SearchResults .result>h3{display:block;float:left;margin:5px 0;clear:both}#SearchResults .result>h3>a{font-size:1.3em;font-weight:bold}#SearchResults .result>p{display:block;float:left;clear:both}#SearchResults .result:hover{border:solid 1px #ffa500;cursor:pointer}#MainCommandsContainer{width:100%;height:47px;padding:7px 0 0 0;background-color:rgba(0,0,0,.65);position:fixed;left:0;bottom:30px;z-index:100}#MainCommands{text-align:center}#MainCommands>button{display:inline;float:none;margin:2px 4px}#ApiEditorCommands{padding:0 5px 200px 140px}#ApiEditorCommands>*{margin-right:10px}#BottomMargin{height:100px;clear:both}#Video{width:640px;height:480px;display:block;float:left;margin:0 16px}#Canvas{display:none}#Footer{width:100%;height:30px;display:block;padding:5px 10px;text-align:right;background-color:#000;position:fixed;left:0;bottom:0;z-index:100}#Footer a{color:#fff;text-decoration:none}#Versions{width:500px;margin:150px auto 20px auto;padding:50px;background-color:#f5f5f5;border-radius:10px}#Versions span{margin:10px;line-height:30px}.template{width:100%;display:block;float:left}.template-selectable{width:340px;display:block;float:left}.template-viewer-container{width:100%;display:block;float:right;margin:0 0 0 -340px}.template-viewer{margin:0 0 0 340px}.template-viewer .description{margin:10px 0 8px 0;padding:5px;background-color:#fefedd;border:solid 1px #c0c0c0;border-radius:5px}.template-viewer .samples-displayed{margin:0 0 8px 0;padding:5px;color:#f00;background-color:#ffc0cb;border:solid 1px #f00;border-radius:5px}.template-tab-container{min-height:600px}.main-form{clear:both}.nav-sites{margin:0 -10px;clear:both}.nav-site{width:220px;height:70px;float:left;margin:10px;position:relative;top:0;left:0;border-radius:5px}.nav-site .heading{width:50px;height:9px;position:absolute;top:-10px;left:5px;border-radius:3px 3px 0 0/3px 3px 0 0}.nav-site .stacking1{width:220px;height:70px;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:1px;left:1px;border-radius:5px}.nav-site .stacking2{width:220px;height:70px;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:4px;left:4px;border-radius:5px}.nav-site a{width:100%;height:100%;display:block;padding:10px 3px 3px 10px;overflow:hidden;word-wrap:break-word;text-decoration:none}.nav-site.has-image a{padding:10px 3px 3px 65px}.nav-site span.title{margin-left:5px}.nav-site.to-parent{height:36px;background-color:#fff}.nav-site.to-parent a{padding:9px 3px 3px 30px}.nav-site.to-parent.has-image a{padding:9px 3px 3px 35px}.nav-site.to-parent .ui-icon{position:absolute;top:9px;left:9px}.nav-site .site-image-thumbnail{position:absolute;top:8px;left:8px;border-radius:8px}.nav-site .site-image-icon{position:absolute;top:4px;left:8px;border-radius:8px}.nav-site .conditions{font-size:.75em;color:#000;position:absolute;right:1px;bottom:1px}.nav-site .conditions span{display:block;float:left;margin:2px 2px 2px 0;padding:2px 5px;background-color:#eee;border-radius:2px}.nav-site .conditions span.overdue{color:#fff;background-color:#f00}.nav-site .conditions span.elapsed-time.old{color:#c0c0c0}.error-page{padding:30px 50px;border-top:dotted 1px #808080}.error-page-title{margin:0 0 20px 0;padding:10px 0;font-weight:bold;color:#f00;border-bottom:dotted 1px #f00}.error-page-message{margin:15px 0 0 0;padding:5px 20px;font-weight:bold;color:#fff;background-color:#808080}.error-page-action{margin:5px 0 0 0;padding:5px 10px;color:#c0c0c0;background-color:#dcdcdc}.error-page-action em{margin:10px;color:#000}.error-page-stacktrace{margin:5px 0 0 0;padding:5px 20px;background-color:#f5f5f5}.fieldset.enclosed{margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0;clear:both}.fieldset.enclosed-half{width:380px;float:left;margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0}.fieldset.enclosed-thin{margin:0 0 10px 0;padding:5px 5px 5px 10px;border:solid 1px #c0c0c0;clear:both}.fieldset.enclosed-thin [class*="field-auto"]{height:35px}.fieldset.enclosed-auto{float:left;margin:0 0 10px 10px;padding:5px 5px 5px 10px;border:solid 1px #c0c0c0}.fieldset[class^="enclosed"]>legend{margin:0 0 0 10px;font-weight:bold}.command-field{padding:10px 5px 5px 136px;text-align:center;clear:both}.command-field>button{display:block;float:left;margin:2px 4px}.command-center{padding:5px 5px 5px 5px;text-align:center;clear:both}.command-center>button{display:inline;float:none;margin:2px 4px}.command-left{float:left;padding:5px 5px 5px 5px;clear:both}.command-left>*{display:block;float:left}.command-left>button{margin:2px 4px}.command-left>.ui-icon{margin:7px 3px 0 15px}.command-right{padding:5px 5px 5px 5px;text-align:right;clear:both}.command-right>button{display:inline;float:none;margin:2px 4px}.field-normal{width:340px;height:45px;float:left;padding:0 20px 10px 0}.field-normal>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-normal>.field-control{width:100%;float:right}:not(td)>div.field-normal .container-normal{width:auto;margin-left:120px}td>.field-normal,td>.field-wide{width:100%;padding:0}.field-normal>.buttons{padding:3px 10px}.field-normal .control-text{height:30px}.field-wide{width:100%;min-height:45px;float:left;padding:0 10px 10px 0;clear:both}.field-wide>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-wide>.field-control{width:100%;float:right}:not(td)>div.field-wide .container-normal{margin-left:120px}.field-markdown{width:100%;min-height:45px;float:left;padding:0 10px 10px 0;clear:both}.field-markdown>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-markdown>.field-control{width:100%;float:right}:not(td)>div.field-markdown .container-normal{margin-left:120px}.field-textarea{width:100%;min-height:45px;float:left;padding:0 10px 10px 0;clear:both}.field-textarea>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-textarea>.field-control{width:100%;float:right}:not(td)>div.field-textarea .container-normal{margin-left:120px}.field-auto{width:auto;height:45px;float:left;margin-right:35px;padding:0 10px 10px 0}.field-auto>.field-label{width:120px;float:left;padding:7px 7px 7px 0;text-align:right}.field-auto>.field-control{width:auto;float:left}.field-auto-thin{width:auto;height:45px;float:left;margin:0 5px;padding:0 10px 10px 0}.field-auto-thin>.field-label{float:left;padding:7px 7px 7px 0;text-align:right}.field-auto-thin>.field-control{width:auto;float:left}.field-auto-thin select{max-width:120px}.field-vertical{width:330px;height:100%;float:left;padding:0 20px 20px 0}.field-vertical>.field-label{width:100%;float:left;margin-right:-120px;padding:5px 10px;text-align:center}.field-vertical>.field-control{width:100%;float:left;clear:both}.field-label{overflow:hidden}label.required:after{margin-left:3px;color:#f00;content:'*'}.field-control .unit{display:block;float:left;padding:5px 0 0 5px}.field-section{width:100%;display:block;float:left;margin:15px;padding:2px 5px;font-weight:bold;border-bottom:solid 1px #c0c0c0;clear:both}.container-normal{position:relative}.container-left{width:340px;float:left;margin-right:-340px;padding:0 0 15px 0;position:relative}.container-right{width:100%;float:right;position:relative}.container-right>*{display:block;margin-left:340px}.control-text{width:100%;min-height:30px;display:block;padding:6px 4px 2px 4px;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;overflow:hidden;border-radius:5px}.control-textbox{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.control-textbox.with-unit{width:70%;display:block;float:left}.control-textbox.anchor{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px;z-index:0}.control-textarea{width:100%;height:100px;padding:4px 4px 4px 6px;border:solid 1px #c0c0c0;border-radius:5px}.container-radio>label.error{top:0}.control-attachments+label.error{height:22px;position:absolute;top:50px}.control-attachments-upload{width:100%;display:block;float:left;padding:25px 0;text-align:center;border:dotted 2px #d19405;border-radius:3px}.control-attachments-items{width:100%;display:block;float:left}.control-attachments-item{width:100%;display:block;float:left;margin:5px 0 0 0;padding:5px 10px;text-align:left;border:solid 1px #d19405;border-radius:5px}.progress-bar{width:100%;height:30px;display:block;float:left;margin:5px 0 0 0;vertical-align:top;border:solid 1px #d19405;overflow:hidden;border-radius:5px}.progress-bar>div{width:0;height:100%;line-height:22px;color:#fff;background-color:#fece2f;border-radius:3px}.already-attachments{background-color:#fece2f}.preparation-delete{background-color:#f5f5f5;border:solid 1px #c0c0c0}.preparation-delete>a{color:#c0c0c0}.show-file{display:block;float:left;margin:0}.file-name{display:block;float:left}.delete-file{display:block;float:right;margin:2px -5px 0 0}.field-control .control-markup{width:100%;min-height:100px;float:left;padding:4px 25px 4px 6px;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.md{width:100%;float:left;line-height:1.5em;font-family:Terminal,Hiragino Kaku Gothic Pro;word-wrap:break-word;word-break:break-all}.md>*{float:left;clear:both}.md h1{margin:10px 0 10px 0;font-weight:bold}.md h1:not(:first-child){margin:20px 0 10px 0}.md h2{margin:5px 0 8px 0;font-weight:bold}.md h2:not(:first-child){margin:20px 0 8px 0}.md h3{margin:3px 0 6px 0;font-weight:bold}.md h3:not(:first-child){margin:10px 0 6px 0}.md h4{margin:3px 0 4px 0;font-weight:bold}.md h4:not(:first-child){margin:10px 0 4px 0}.md h5{margin:3px 0 2px 0;font-weight:bold}.md h5:not(:first-child){margin:10px 0 2px 0}.md h6{margin:3px 0 2px 0;font-weight:bold}.md h6:not(:first-child){margin:10px 0 2px 0}.md hr{float:none;clear:both}.md ol{margin:0 10px 10px 32px;list-style-type:decimal}.md p{margin:0 0 10px 0;clear:both}.md table{width:auto;margin:0 0 10px 0;background-color:#fff}.md td{padding:5px 10px;border:solid 1px #c0c0c0}.md th{padding:5px 10px;font-weight:bold;border:solid 1px #c0c0c0}.md tbody tr:nth-child(odd){background-color:#f5f5f5}.md ul{margin:0 10px 10px 32px;list-style-type:disc}.control-markdown{width:100%;display:none;padding:4px 4px 4px 6px;border:solid 1px #c0c0c0;border-radius:5px}.control-dropdown{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.control-spinner{width:auto;height:22px;display:block;float:left;padding:1px;color:#000}.control-checkbox{display:block;float:left;margin:8px 0}.control-checkbox~label{display:block;float:left;margin:7px 5px 0 6px}.control-checkbox+.ui-icon.ui-icon-info{display:block;float:left;margin:7px -7px 0 0}.field-normal .control-checkbox+label{width:175px}_::-webkit-full-page-media,_:future,:root .field-normal .control-checkbox+label{width:172px}.container-radio{padding:7px 0}.container-radio>label{display:block;float:left;margin:0 5px 0 0;white-space:nowrap}.control-radio{display:block;float:left;margin:3px}.radio-clear-both .container-radio>label{clear:both}.control-slider{width:30px;float:left;margin:8px 0 0 12px}.control-slider-ui{width:140px;float:left;margin:11px 0 0 5px}.container-selectable .wrapper{width:100%;min-height:300px;display:block;float:left;background-color:#f5f5f5;border:solid 1px #c0c0c0;overflow:auto;border-radius:5px}.control-selectable{width:100%;display:block;float:left;padding:5px 10px 5px 5px;list-style-type:none;touch-action:pan-y}.control-selectable li{width:100%;min-height:24px;margin:3px;padding:2px 5px;border-radius:5px}.control-basket{margin-left:120px;padding:5px 5px 0 5px;background-color:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.control-basket>li{display:block;float:left;margin:0 5px 5px 0;padding:3px 5px;border-radius:5px}.control-basket>li>span{display:block;float:left;z-index:2}.comment{width:100%;display:block;float:left;margin:0 0 5px 0;padding:5px 10px 10px 20px;background:#fafad2;border:solid 1px #c0c0c0;position:relative;clear:both}.comment>*{display:block;float:left}.comment>.time{float:left;margin:0 0 8px -10px;margin-right:10px}.comment>.body{width:100%;clear:both}.comment>.button.edit{position:absolute;top:3px;right:20px;cursor:pointer}.comment>.button.delete{position:absolute;top:3px;right:5px;cursor:pointer}.comment>.control-markup{width:100%}.comment>.control-markdown{width:100%;display:none}.user{float:left}.user>span{display:block;float:left;font-weight:bold}.dept{float:left}.dept>span{display:block;float:left;font-weight:bold}.both{clear:both}.hidden{display:none}.right{float:right}.right-align{text-align:right;text-align-last:right}.tooltip{display:none;position:absolute}.no-border{border:none}.grid{margin:0 0 10px 0}.grid.fixed{table-layout:fixed}.grid>thead>tr>caption{margin:0 0 5px 0}.grid>thead>tr>th{padding:6px;vertical-align:middle;border-top:solid 1px transparent;border-bottom:solid 1px transparent;border-left:solid 1px transparent;border-right:solid 1px #fff;word-wrap:break-word}.grid>thead>tr>th>div{width:100%;float:left;text-align:center;z-index:2}.grid>thead>tr>th span{display:block;float:left}.grid>thead>tr:first-child>th:first-child{border-radius:10px 0 0 0/10px 0 0 0}.grid>thead>tr:first-child>th:last-child{border-right:solid 1px transparent;border-radius:0 10px 0 0/0 10px 0 0}.grid>thead>tr>th.sortable:hover{cursor:pointer}.grid>tbody>tr>td{max-width:300px;border-left:dotted 1px #c0c0c0;border-right:dotted 1px #c0c0c0;word-wrap:break-word}.grid>tbody>tr.message-row>td{padding:0;text-align:center}.grid>tbody>tr [class*="status-"]{padding:0 5px;font-weight:bold;border:solid 1px #c0c0c0;border-radius:3px}.grid>tbody>tr>th{padding:6px;vertical-align:middle;font-weight:normal;background-color:#dcdcdc;border-top:solid 1px #fff;border-bottom:solid 1px #fff;border-left:solid 1px transparent;border-right:solid 1px transparent;word-wrap:break-word}.grid-row{background-color:#fff;border-bottom:solid 1px #c0c0c0}.grid-row td{overflow:hidden}.grid-row .comment{min-width:200px;max-height:100px;margin:0 0 3px 0;padding:3px 6px 3px 15px;background:#fafad2;border:solid 1px #fff;clear:both;overflow:hidden}.grid-row .comment.one-third{max-height:306px}.grid-row .comment.half{max-height:151px}.grid:not(.not-link) .grid-row:hover{background-color:#f5f5f5;cursor:pointer}.grid-row:hover .comment{background-color:#ffffe0}.grid-row p{float:left}.grid-row p.body{clear:both}.grid-row[data-history]{background-color:#d3d3d3}.grid-title-body{min-width:200px;max-height:306px;margin:0 0 3px 0;padding:3px 6px;background:inherit;border:solid 1px transparent;clear:both;overflow:hidden}.grid-title-body>.body{width:100%}.grid-title-body>.title+.body{padding:8px 0 0 10px}.links{padding:0 10px}.link-creations button{display:block;float:left;margin:0 10px 0 0}.text{width:250px;display:block;float:left;border:solid 1px #c0c0c0}.datepicker{display:block;float:left;border:solid 1px #c0c0c0}.dropdown{display:block;float:left;border:solid 1px #c0c0c0}[class*="limit-"]{margin-left:10px;padding:0 5px}.limit-warning1{color:#f00}.limit-warning2{color:#f00;background-color:#ffccd5}.limit-warning3{color:#fff;background-color:#f00}.message{width:100%;text-align:center;position:fixed;left:0;bottom:78px;z-index:100}.message .body{margin-bottom:4px;position:relative;border-radius:20px}.message .close{background-color:#fff;position:absolute;top:11px;right:8px;cursor:pointer;border-radius:10px}.message-dialog{width:100%;display:block;float:left;margin:0 auto;text-align:center}.message-form-bottom{width:600px;margin:0 auto;text-align:center}.alert-error{min-height:32px;display:block;padding:5px;color:#fff;background-color:rgba(255,0,0,.9);border:solid 1px #f00}.alert-success{min-height:32px;display:block;padding:5px;color:#fff;background-color:rgba(0,128,0,.9);border:solid 1px #008000}.alert-warning{min-height:32px;display:block;padding:5px;color:#000;background-color:#ff0;border:solid 1px #ff0}.alert-information{min-height:32px;display:block;padding:5px;color:#fff;background-color:#00f;border:solid 1px #00f}label.error{width:100%;display:block;float:left;padding:0 5px;color:#f00;background-color:#fff;border-top:none;top:-5px;left:0;border-radius:0 0 5px 5px/0 0 5px 5px;z-index:2}.ui-spinner>label.error{margin-top:3px}.error{border:solid 1px #f00}.error+.ui-widget.ui-state-default.ui-multiselect{border:solid 1px #f00}.with-unit+label.error{width:70%;position:absolute;top:25px}.button-edit-markdown{position:absolute;top:5px;right:5px;cursor:pointer;z-index:1}.comment>.button-edit-markdown{top:6px;right:20px}.button-delete-address{cursor:pointer}.button-right-justified{float:right}.status-new{background:#fff}.status-preparation{color:#fff;background:#ff8c00}.status-inprogress{color:#fff;background:#008000}.status-review{background:#ff0}.status-closed{color:#fff;background:#00f}.status-rejected{color:#fff;background:#808080}.always-hidden{display:none}h3.title-header{height:40px;padding:10px 20px;text-align:center;background-color:#dcdcdc;border:solid 1px #a9a9a9;border-radius:10px 10px 0 0/10px 10px 0 0}.outgoing-mail .dialog{padding:0 !important}.outgoing-mail .ui-dialog-titlebar{display:none}.svg-work-value{width:50px;height:40px}.svg-work-value rect:nth-of-type(1){fill:gainsboro}.svg-work-value rect:nth-of-type(2){fill:darkseagreen}.svg-progress-rate{width:50px;height:40px}.svg-progress-rate.warning text{fill:red}.svg-progress-rate rect:nth-of-type(1){fill:gainsboro}.svg-progress-rate rect:nth-of-type(2){fill:gray}.svg-progress-rate rect:nth-of-type(3){fill:darkseagreen}.svg-progress-rate.warning rect:nth-of-type(3){fill:#ffccd5}.svg-kamban-aggregation-view{width:100%;height:20px}.svg-kamban-aggregation-view rect{height:20px;fill:darkseagreen}.svg-crosstab{width:100%;height:20px}.svg-crosstab rect{height:20px;fill:darkseagreen}.axis{fill:none;stroke:gray;shape-rendering:crispEdges}.h2{margin:0 0 5px 0;padding:0}.h3{margin:0 0 5px 10px;padding:0}.h4{margin:0 0 5px 20px;padding:0}.h5{margin:0 0 5px 30px;padding:0}.h6{margin:0 0 5px 40px;padding:0}.h2>h2{padding:5px 0;font-weight:bold;border-bottom:solid 1px #c0c0c0}.h3>h3{font-weight:bold}.h4>h4{font-weight:bold}.h5>h5{font-weight:bold}.h6>h6{font-weight:bold}.w50{width:50px}.w100{width:100px}.w150{width:150px}.w200{width:200px}.w250{width:250px}.w300{width:300px}.w350{width:350px}.w400{width:400px}.w450{width:450px}.w500{width:500px}.w550{width:550px}.w600{width:600px}.h100{height:100px}.h150{height:150px}.h200{height:200px}.h250{height:250px}.h300{height:300px}.h350{height:350px}.h400{height:400px}.h450{height:450px}.h500{height:500px}.h550{height:550px}.h600{height:600px}.m-l10{margin-left:10px}.m-l20{margin-left:20px}.m-l30{margin-left:30px}.m-l40{margin-left:40px}.m-l50{margin-left:50px}.paragraph{padding:3px 3px 3px 10px}.dialog{display:none;padding:15px 0 10px 0 !important}.dialog .fieldset{margin:0 10px 10px 10px}.link span{margin-right:5px}.link span.bold{font-weight:bold;cursor:pointer}.histories-form{padding:20px}.ui-widget input,.ui-widget select,.ui-widget button{font-family:Hiragino Kaku Gothic Pro,"Meiryo UI",sans-serif}.ui-widget textarea{line-height:1.5em;font-family:Terminal,Hiragino Kaku Gothic Pro}.ui-widget{font-size:1em}.ui-button{padding:4px 4px 4px 2px !important}.ui-dialog{overflow:visible !important}.ui-icon.a{float:left;margin:6px 0 0 0}.ui-spinner{display:block;float:left;background:#fff;max-height:46px}.ui-widget.ui-state-default.ui-multiselect{height:30px;background:#fff;border:solid 1px #c0c0c0;overflow:hidden;border-radius:5px}.ui-multiselect-checkboxes{min-height:300px}.ui-multiselect-checkboxes input{margin:0 5px}.ui-corner-all.ui-state-hover{border-radius:2px}div.field-control .ui-multiselect.ui-state-disabled{background-color:#f5f5f5;opacity:1}.height-auto{max-height:none !important}.focus-inform{background-color:#fff !important;border:solid 1px #ffa500 !important}.menu-negative{border-left:solid 1px #fff;border-right:solid 1px #fff;position:absolute;z-index:10}.menu-negative>li{width:100%;display:block;float:left;border-top:dotted 1px #fff;cursor:pointer;clear:both}.menu-sort{border-left:solid 1px #fff;border-right:solid 1px #fff;position:absolute;border-radius:0 0 10px 10px/0 0 10px 10px;z-index:10}.menu-sort>li{width:100%;display:block;float:left;border-top:dotted 1px #fff;cursor:pointer;clear:both}.menu-sort>li.ui-menu-divider{height:initial;font-size:initial}.menu-sort>li.grid-header-filter .ui-icon{position:initial}.menu-sort>li:not(.grid-header-filter) div.field-control>*{border:solid 1px #c0c0c0}.current-time{position:absolute;top:9px;right:-17px;cursor:pointer;z-index:10}.current-user{position:absolute;top:9px;right:-17px;cursor:pointer;z-index:10}.current-dept{position:absolute;top:9px;right:-17px;cursor:pointer;z-index:10}input:focus{background-color:#ffc}select:focus:not(.has-css){background-color:#ffc}textarea:focus{background-color:#ffc}.ssoLoginMessage{margin:10px;padding:6px;border-top:solid 1px #c0c0c0}#EnterPriseBanner{width:238px;position:fixed;right:8px;bottom:280px;z-index:3}#SupportBanner{width:238px;position:fixed;right:8px;bottom:180px;z-index:3}#CasesBanner{width:238px;position:fixed;right:8px;bottom:80px;z-index:3}.annonymous .close-announcement{display:none} \ No newline at end of file +@charset "utf-8";*{box-sizing:border-box}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-style:normal;font-weight:normal;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}input,textarea{margin:0;padding:0}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th{text-align:left}a:focus{outline:none}.cf:before,.cf:after{content:" ";display:table}.cf:after{clear:both}.cf{*zoom:1}.both{clear:both}img{max-width:100%;height:auto;width:auto}::-webkit-input-placeholder{color:#c0c0c0}:-moz-placeholder{color:#c0c0c0;opacity:1}::-moz-placeholder{color:#c0c0c0;opacity:1}:-ms-input-placeholder{color:#c0c0c0}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type="number"]{-moz-appearance:textfield}body{min-width:1200px;font-size:.75em;font-family:Hiragino Kaku Gothic Pro,"Meiryo UI",sans-serif;clear:both}h1{clear:both}h2{clear:both}h3{clear:both}legend{cursor:pointer}legend>*{display:block;float:left}label{position:relative;cursor:pointer;z-index:2}input{background-color:#fff;position:relative;z-index:2}select{position:relative;z-index:2}table{width:100%;border:0;border-collapse:collapse;clear:both}td{padding:3px;vertical-align:top;color:#000}td.right-align>p{float:right}pre{line-height:1.5em;font-family:Terminal,Hiragino Kaku Gothic Pro;word-wrap:break-word;word-break:break-all;white-space:pre-wrap}#Logo{padding:3px 0}#CorpLogo{display:block;float:left;margin:3px 0 0 0}#ProductLogo{display:block;float:left;padding:0 0 0 5px;font-size:26px;font-weight:bold;color:#696969;text-decoration:none}#PortalLink{position:relative;top:-38px;right:40px;float:right}#LoginFieldSet{width:500px;margin:150px auto 20px auto;padding:50px;background-color:#f5f5f5;border-radius:10px}#LoginCommands{text-align:right;clear:both}#Demo{width:500px;margin:0 auto}#DemoFields{padding:20px 10px 10px 10px}#SearchPermissionElements{margin-left:15px}#Breadcrumb{float:left;margin:0 0 5px 0}#Breadcrumb .item{display:block;float:left;padding:3px 5px}#Breadcrumb .item.trashbox{display:block;float:left;color:#fff;background-color:#f00;border-radius:3px}#Breadcrumb .separator{margin:0 0 0 8px}#Guide>div{width:100%;display:block;float:left;margin:0 0 5px 0;padding:5px 10px;background:#fafad2;border:solid 1px #c0c0c0;position:relative;clear:both;border-radius:5px}#CopyToClipboards>.display-control{float:left;cursor:pointer}#Header{width:100%;float:left;padding:0 6px;border:none;position:relative;clear:both}#Navigations{height:30px;margin:0 0 5px 0;padding:0 5px 0 15px;border:none;top:0;right:5px;border-radius:20px 5px 5px 20px;float:right}#NavigationMenu{float:left;margin-right:5px}#NavigationMenu>li{width:158px;height:30px;display:block;float:left;position:relative}#NavigationMenu>li>div{height:30px;text-align:center;line-height:30px;cursor:pointer}#NavigationMenu>li>div>a{height:30px;display:block;text-decoration:none}#NavigationMenu .menu{width:158px;display:none;border-top:none !important;position:absolute;top:30px;right:0;border-radius:0 0 5px 5px;z-index:3}#NavigationMenu .menu>li>a{display:block;text-decoration:none}#NavigationMenu .menu>li>a.ui-state-active{font-weight:normal;text-decoration:none}#TemplateDialog>div{padding:0 15px;overflow:hidden}#SearchField{float:left;margin:3px 0;color:#000}#Search{height:24px}#SwitchUserInfo{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#SwitchUserInfo>a{width:100%;display:block;float:left;color:#fff;text-decoration:none}#ExcessLicenseWarning{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background:#f00;border-radius:7px}#PublishWarning{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#PublishWarning>a{width:100%;display:block;float:left;color:#fff;text-decoration:none}#LockedWarning{width:100%;display:block;float:left;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#LockedWarning>div{width:100%;display:block;float:left;color:#fff;text-decoration:none}#Application{width:100%;float:left;margin:10px 0 0 0;padding:0 10px 120px 10px;position:relative;clear:both}#Application>.site-image-icon{display:block;float:left;margin:0 10px 0 0}#StartGuide{width:100%;display:block;float:left;margin:0 0 10px 0;padding:50px 0 0 0;background-color:#f5f5f5;position:relative;border-radius:10px}#StartGuide>#StartGuideContents{width:900px;margin:0 auto}#StartGuide>#StartGuideContents>a{width:150px;display:block;float:left;margin:0 37px;padding:5px;text-align:center;border-radius:5px}#StartGuide>#StartGuideContents>a:hover{background-color:#fff}#StartGuide>#StartGuideContents>a>*{display:block;text-align:center;clear:both}#StartGuide>#StartGuideContents>a>img{width:50px;margin:5px 50px}#StartGuide>#DisableStartGuideField{display:block;float:left;margin:50px 0 0 20px;clear:both}#StartGuide>.ui-icon{position:absolute;top:10px;right:10px;cursor:pointer}#SiteImageIconContainer{float:left}#SiteImageIconContainer>*{margin:0 5px 0 0}#HeaderTitleContainer{float:left;margin:0 0 10px 0}#HeaderTitle{font-size:20px;font-weight:bold;color:#d2691e}#Notes>*{width:100%;float:left;margin:0 10px 5px 0}#Notes>.history{width:100%;display:block;float:left;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#Notes>.readonly{width:100%;display:block;float:left;padding:5px 10px;color:#fff;background-color:#ffa500;border-radius:7px}#ViewSelectorField{position:absolute;top:-10px;right:0}#ViewFilters{width:100%;float:left;margin:0 0 5px 0;padding:5px 5px 2px 5px;border:solid 1px #c0c0c0;border-radius:5px}#ViewFilters.reduced{width:auto;padding:0;border:none}#ViewFilters>.field-auto-thin{height:32px;float:left;padding:0}#ViewFilters_Reset{display:block;float:left;margin:0 20px 0 0}#ViewFilters>.display-control{float:left;margin:0 5px 0 0;padding:5px 10px 5px 0;font-weight:bold;cursor:pointer}#ViewFilters .ui-icon.ui-icon-info{transform:scale(1,-1)}#FilterButton{display:block;float:left}#Aggregations{width:100%;float:left;margin:0 0 5px 0;padding:3px 5px 5px 5px;border:solid 1px #c0c0c0;border-radius:5px}#Aggregations.reduced{width:auto;padding:0;border:none}#Aggregations .label{height:26px;display:block;float:left;margin:2px 5px 0 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#Aggregations .label.overdue{font-weight:bold;color:#fff;background-color:#f00;cursor:pointer}#Aggregations .data{height:26px;display:block;float:left;margin:2px 5px 0 0;padding:5px}#Aggregations .data.overdue{color:#f00;cursor:pointer}#Aggregations em{display:block;float:left;margin-right:5px;font-weight:bold}#Aggregations>.display-control{float:left;margin:0 5px 0 0;padding:5px 10px 5px 0;font-weight:bold;cursor:pointer}#SitePackagesSelectable span.include-data{margin:0 0 0 10px;color:#f00}#CalendarDate{margin-right:10px}#CalendarBody table{table-layout:fixed}#CalendarBody thead th{padding:5px;text-align:center;border:solid 1px #c0c0c0}th.calendar-header{text-align:center;background-color:#fff}#CalendarBody .saturday{background-color:#add8e6}#CalendarBody .sunday{background-color:#ffc0cb}#CalendarBody td{padding:0;border:solid 1px #c0c0c0}#CalendarBody td>div{min-height:50px;padding:5px}#CalendarBody td.hover{background-color:#f5f5f5}#CalendarBody .other-month{background-color:#dcdcdc}#CalendarBody .today{border:solid 2px #00f;z-index:20}#CalendarBody .item{height:25px;margin:5px 0 0 0;background-color:#fafad2;border:solid 1px #c0c0c0;border-radius:3px}#CalendarBody .item.hover{background-color:#fff;border:solid 1px #ffa500}#CalendarBody .item.changed{font-weight:bold;background-color:#ff0;border:solid 1px #ffa500}#CalendarBody .item .connection{width:14px;height:25px;background-color:#fafad2;border-top:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;position:relative;top:-1px;left:-14px}#CalendarBody .item .connection.hover{background-color:#fff;border-top:solid 1px #ffa500;border-bottom:solid 1px #ffa500}#CalendarBody .item .connection.changed{font-weight:bold;background-color:#ff0;border-top:solid 1px #ffa500;border-bottom:solid 1px #ffa500}#CalendarBody .item .title{padding:5px 0;position:absolute;overflow:hidden;white-space:nowrap;z-index:30}#CalendarBody .item .title.sub{display:none}#CalendarBody .item .title>span:not(.ui-icon){margin-right:3px}#CalendarBody .dragging{height:25px;padding:5px;background-color:#fafad2;border-radius:3px;z-index:50}#CalendarBody .dummy{height:25px;margin:5px 0 0 0}#Crosstab .crosstab-row{border-bottom:dotted 1px #c0c0c0}#Crosstab .saturday{background-color:#eee}#Crosstab .sunday{background-color:#fee}#CrosstabMonth{margin-right:10px}#Gantt{width:100%;background-color:#f5f5f5;border-radius:20px}#Gantt .saturday{fill:#eee}#Gantt .sunday{fill:#fee}#Gantt .date{stroke:white}#Gantt .now{stroke:red}#Gantt .planned rect{cursor:pointer;fill:gainsboro}#Gantt .planned rect.summary{cursor:auto}#Gantt .earned rect{cursor:pointer;fill:darkseagreen}#Gantt .earned rect.summary{cursor:auto}#Gantt rect.delay{fill:#ffccd5}#Gantt rect.completed{fill:lightsteelblue}#Gantt .title text{cursor:pointer}#Gantt .title text.delay{fill:red}#Gantt .title text.summary{font-size:1.2em;font-weight:bold;cursor:auto}#GanttStartDate{margin-right:10px}#GanttAxis{width:calc(100% + 20px);height:50px;margin-left:-10px;margin-top:-25px;background-color:rgba(255,255,255,.5);position:sticky;left:0;bottom:75px}#GanttAxis .saturday{fill:gainsboro}#GanttAxis .sunday{fill:#fdd}#GanttAxis .weekday{fill:whitesmoke}#GanttAxis .date{stroke:white}#BurnDown{width:100%;height:350px;background-color:#f5f5f5;border-radius:20px}#BurnDown .now{stroke:red}#BurnDown .total{fill:none;stroke:green}#BurnDown .planned{fill:none;stroke:gray}#BurnDown .earned{fill:none;stroke:orange}#BurnDown .total circle{fill:green}#BurnDown .planned circle{fill:gray}#BurnDown .earned circle{fill:orange}#BurnDownDetails>tbody>tr:hover{background-color:#f5f5f5;cursor:pointer}#BurnDownDetails>tbody>tr>td{padding:6px}#BurnDownDetails>tbody>tr>td.warning{font-weight:bold;color:#f00}#BurnDownDetails>tbody>tr>td.difference{font-size:1.3em;font-weight:bold;color:#00f;background-color:#e0ffff}#BurnDownDetails>tbody>tr>td.difference.warning{color:#f00;background-color:#ffccd5}#BurnDownDetails .user-info{margin:5px;padding:8px;font-weight:bold;background-color:#eee8aa}#BurnDownDetails .items{padding:5px 0 5px 20px}#BurnDownDetails .items a{color:#000;text-decoration:none}#BurnDownDetails .items a:hover{color:#00f;text-decoration:underline}#TimeSeries{width:100%;height:450px;background-color:#f5f5f5;border-radius:20px}#TimeSeries .surface{stroke:white}#TimeSeries .index{fill:black}#KambanBody .kamban-row{border-bottom:dotted 1px #c0c0c0}#KambanBody .kamban-container>div{min-height:30px}#KambanBody .kamban-container.hover{background-color:#f5f5f5}#KambanBody .kamban-container .kamban-item:last-child{margin:3px 3px 30px 3px}#KambanBody .kamban-item{margin:3px;padding:4px 16px 4px 5px;background-color:#fafad2;border:solid 1px #c0c0c0;position:relative;cursor:pointer;border-radius:5px}#KambanBody .kamban-item:hover{background-color:#fff;border:solid 1px #ffa500}#KambanBody .kamban-item.changed{font-weight:bold;background-color:#ff0;border:solid 1px #ffa500}#KambanBody .kamban-item .ui-icon{position:absolute;top:0;right:0}#KambanBody .kamban-item>span{margin-right:3px}#ImageLib .item{width:250px;height:250px;float:left;margin:10px 10px 0 0;padding:10px;border:solid 1px #c0c0c0;position:relative;overflow:hidden}#ImageLib .item .image{width:100%;float:left;margin:5px 0 0 0}#ImageLib .item .delete-image{float:left;position:absolute;right:5px;bottom:5px}#RecordHeader{width:100%;float:left;margin:0 0 5px 0}#RecordInfo{float:left;padding:6px 0 0 0}#RecordInfo div{float:left;margin-right:50px}#RecordInfo div p{float:left;margin-right:5px}#RecordInfo div p .elapsed-time{float:left;padding:0 5px;font-weight:bold;background-color:#eee;border-radius:2px}#RecordSwitchers{float:right}#RecordSwitchers>*{float:left}#RecordSwitchers .current{height:26px;display:block;float:left;margin:0 1px 0 0;padding:5px;border-radius:5px}#TemplateTabsContainer{width:100%;float:left}#Editor{width:100%;float:left;clear:both}#EditorTabsContainer{width:73%;float:left;margin:0 0 20px 0}#EditorTabsContainer.max{width:100%}#MailEditorTabsContainer{width:100%;float:left;margin:0 0 20px 0;border:none}#EditorComments{width:27%;float:right;margin:0 0 15px 0;padding:0 0 0 5px}#EditorComments .title-header{margin:3px 10px 8px 0}#CommentField{margin:0 0 5px 0}#OutgoingMailsForm{width:73%;float:left}#OutgoingMailsForm>.item{width:100%;float:left;position:relative;border-radius:10px}#OutgoingMailsForm .content{width:100%;float:left;margin:5px 0 20px 0;padding:10px 0 0 0;border:solid 1px #c0c0c0;border-top:none;border-radius:0 0 10px 10px/0 0 10px 10px}#DropDownSearchDialogForm{width:100%;padding:0 20px}#ProcessTabsContainer{margin:0 20px 10px 20px;clear:both}#StatusControlTabsContainer{margin:0 20px 10px 20px;clear:both}#StatusControlColumnHash .column-control-types{margin:0 0 0 10px}#ViewTabsContainer{margin:0 20px 10px 20px;clear:both}#ExportTabsContainer{margin:0 20px 10px 20px;clear:both}#EditorDetailTabsContainer{margin:0 20px 10px 20px;clear:both}#ColumnAccessControlTabsContainer{margin:0 20px 10px 20px;clear:both}#SearchResults{width:80%;float:left;margin:0 100px}#SearchResults .count{float:left;margin:0 0 10px 0}#SearchResults .count .label{height:26px;display:block;float:left;margin:0 5px 5px 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#SearchResults .count .data{height:26px;display:block;float:left;margin:0 5px 5px 0;padding:5px}#SearchResults .result{width:100%;float:left;padding:15px;border:solid 1px #fff;clear:both}#SearchResults .result>ul{display:block;float:left;clear:both}#SearchResults .result>h3{display:block;float:left;margin:5px 0;clear:both}#SearchResults .result>h3>a{font-size:1.3em;font-weight:bold}#SearchResults .result>p{display:block;float:left;clear:both}#SearchResults .result:hover{border:solid 1px #ffa500;cursor:pointer}#MainCommandsContainer{width:100%;height:47px;padding:7px 0 0 0;background-color:rgba(0,0,0,.65);position:fixed;left:0;bottom:30px;z-index:100}#MainCommands{text-align:center}#MainCommands>button{display:inline;float:none;margin:2px 4px}#ApiEditorCommands{padding:0 5px 200px 140px}#ApiEditorCommands>*{margin-right:10px}#BottomMargin{height:100px;clear:both}#Video{width:640px;height:480px;display:block;float:left;margin:0 16px}#Canvas{display:none}#Footer{width:100%;height:30px;display:block;padding:5px 10px;text-align:right;background-color:#000;position:fixed;left:0;bottom:0;z-index:100}#Footer a{color:#fff;text-decoration:none}#Versions{width:500px;margin:150px auto 20px auto;padding:50px;background-color:#f5f5f5;border-radius:10px}#Versions span{margin:10px;line-height:30px}.template{width:100%;display:block;float:left}.template-selectable{width:340px;display:block;float:left}.template-viewer-container{width:100%;display:block;float:right;margin:0 0 0 -340px}.template-viewer{margin:0 0 0 340px}.template-viewer .description{margin:10px 0 8px 0;padding:5px;background-color:#fefedd;border:solid 1px #c0c0c0;border-radius:5px}.template-viewer .samples-displayed{margin:0 0 8px 0;padding:5px;color:#f00;background-color:#ffc0cb;border:solid 1px #f00;border-radius:5px}.template-tab-container{min-height:600px}.main-form{clear:both}.nav-sites{margin:0 -10px;clear:both}.nav-site{width:220px;height:70px;float:left;margin:10px;position:relative;top:0;left:0;border-radius:5px}.nav-site .heading{width:50px;height:9px;position:absolute;top:-10px;left:5px;border-radius:3px 3px 0 0/3px 3px 0 0}.nav-site.dashboards{box-shadow:4px 4px 2px rgba(0,0,0,.2)}.nav-site .stacking1{width:220px;height:70px;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:1px;left:1px;border-radius:5px}.nav-site .stacking2{width:220px;height:70px;border-bottom:solid 1px #c0c0c0;border-right:solid 1px #c0c0c0;position:absolute;top:4px;left:4px;border-radius:5px}.nav-site a{width:100%;height:100%;display:block;padding:10px 3px 3px 10px;overflow:hidden;word-wrap:break-word;text-decoration:none}.nav-site.has-image a{padding:10px 3px 3px 65px}.nav-site span.title{margin-left:5px}.nav-site.to-parent{height:36px;background-color:#fff}.nav-site.to-parent a{padding:9px 3px 3px 30px}.nav-site.to-parent.has-image a{padding:9px 3px 3px 35px}.nav-site.to-parent .ui-icon{position:absolute;top:9px;left:9px}.nav-site .site-image-thumbnail{position:absolute;top:8px;left:8px;border-radius:8px}.nav-site .site-image-icon{position:absolute;top:4px;left:8px;border-radius:8px}.nav-site .conditions{font-size:.75em;color:#000;position:absolute;right:1px;bottom:1px}.nav-site .conditions span{display:block;float:left;margin:2px 2px 2px 0;padding:2px 5px;background-color:#eee;border-radius:2px}.nav-site .conditions span.overdue{color:#fff;background-color:#f00}.nav-site .conditions span.elapsed-time.old{color:#c0c0c0}.error-page{padding:30px 50px;border-top:dotted 1px #808080}.error-page-title{margin:0 0 20px 0;padding:10px 0;font-weight:bold;color:#f00;border-bottom:dotted 1px #f00}.error-page-message{margin:15px 0 0 0;padding:5px 20px;font-weight:bold;color:#fff;background-color:#808080}.error-page-action{margin:5px 0 0 0;padding:5px 10px;color:#c0c0c0;background-color:#dcdcdc}.error-page-action em{margin:10px;color:#000}.error-page-stacktrace{margin:5px 0 0 0;padding:5px 20px;background-color:#f5f5f5}.fieldset.enclosed{margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0;clear:both}.fieldset.enclosed-half{width:380px;float:left;margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0}.fieldset.enclosed-thin{margin:0 0 10px 0;padding:5px 5px 5px 10px;border:solid 1px #c0c0c0;clear:both}.fieldset.enclosed-thin [class*="field-auto"]{height:35px}.fieldset.enclosed-auto{float:left;margin:0 0 10px 10px;padding:5px 5px 5px 10px;border:solid 1px #c0c0c0}.fieldset[class^="enclosed"]>legend{margin:0 0 0 10px;font-weight:bold}.command-field{padding:10px 5px 5px 136px;text-align:center;clear:both}.command-field>button{display:block;float:left;margin:2px 4px}.command-center{padding:5px 5px 5px 5px;text-align:center;clear:both}.command-center>button{display:inline;float:none;margin:2px 4px}.command-left{float:left;padding:5px 5px 5px 5px;clear:both}.command-left>*{display:block;float:left}.command-left>button{margin:2px 4px}.command-left>.ui-icon{margin:7px 3px 0 15px}.command-right{padding:5px 5px 5px 5px;text-align:right;clear:both}.command-right>button{display:inline;float:none;margin:2px 4px}.field-normal{width:340px;height:45px;float:left;padding:0 20px 10px 0}.field-normal>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-normal>.field-control{width:100%;float:right}:not(td)>div.field-normal .container-normal{width:auto;margin-left:120px}td>.field-normal,td>.field-wide{width:100%;padding:0}.field-normal>.buttons{padding:3px 10px}.field-normal .control-text{height:30px}.field-wide{width:100%;min-height:45px;float:left;padding:0 10px 10px 0;clear:both}.field-wide>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-wide>.field-control{width:100%;float:right}:not(td)>div.field-wide .container-normal{margin-left:120px}.field-markdown{width:100%;min-height:45px;float:left;padding:0 10px 10px 0;clear:both}.field-markdown>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-markdown>.field-control{width:100%;float:right}:not(td)>div.field-markdown .container-normal{margin-left:120px}.field-textarea{width:100%;min-height:45px;float:left;padding:0 10px 10px 0;clear:both}.field-textarea>.field-label{width:120px;float:left;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-textarea>.field-control{width:100%;float:right}:not(td)>div.field-textarea .container-normal{margin-left:120px}.field-auto{width:auto;height:45px;float:left;margin-right:35px;padding:0 10px 10px 0}.field-auto>.field-label{width:120px;float:left;padding:7px 7px 7px 0;text-align:right}.field-auto>.field-control{width:auto;float:left}.field-auto-thin{width:auto;height:45px;float:left;margin:0 5px;padding:0 10px 10px 0}.field-auto-thin>.field-label{float:left;padding:7px 7px 7px 0;text-align:right}.field-auto-thin>.field-control{width:auto;float:left}.field-auto-thin select{max-width:120px}.field-vertical{width:330px;height:100%;float:left;padding:0 20px 20px 0}.field-vertical>.field-label{width:100%;float:left;margin-right:-120px;padding:5px 10px;text-align:center}.field-vertical>.field-control{width:100%;float:left;clear:both}.field-label{overflow:hidden}label.required:after{margin-left:3px;color:#f00;content:'*'}.field-control .unit{display:block;float:left;padding:5px 0 0 5px}.field-section{width:100%;display:block;float:left;margin:15px;padding:2px 5px;font-weight:bold;border-bottom:solid 1px #c0c0c0;clear:both}.container-normal{position:relative}.container-left{width:340px;float:left;margin-right:-340px;padding:0 0 15px 0;position:relative}.container-right{width:100%;float:right;position:relative}.container-right>*{display:block;margin-left:340px}.control-text{width:100%;min-height:30px;display:block;padding:6px 4px 2px 4px;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;overflow:hidden;border-radius:5px}.control-textbox{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.control-textbox.with-unit{width:70%;display:block;float:left}.control-textbox.anchor{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px;z-index:0}.control-textarea{width:100%;height:100px;padding:4px 4px 4px 6px;border:solid 1px #c0c0c0;border-radius:5px}.container-radio>label.error{top:0}.control-attachments+label.error{height:22px;position:absolute;top:50px}.control-attachments-upload{width:100%;display:block;float:left;padding:25px 0;text-align:center;border:dotted 2px #d19405;border-radius:3px}.control-attachments-items{width:100%;display:block;float:left}.control-attachments-item{width:100%;display:block;float:left;margin:5px 0 0 0;padding:5px 10px;text-align:left;border:solid 1px #d19405;border-radius:5px}.progress-bar{width:100%;height:30px;display:block;float:left;margin:5px 0 0 0;vertical-align:top;border:solid 1px #d19405;overflow:hidden;border-radius:5px}.progress-bar>div{width:0;height:100%;line-height:22px;color:#fff;background-color:#fece2f;border-radius:3px}.already-attachments{background-color:#fece2f}.preparation-delete{background-color:#f5f5f5;border:solid 1px #c0c0c0}.preparation-delete>a{color:#c0c0c0}.show-file{display:block;float:left;margin:0}.file-name{display:block;float:left}.delete-file{display:block;float:right;margin:2px -5px 0 0}.field-control .control-markup{width:100%;min-height:100px;float:left;padding:4px 25px 4px 6px;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.md{width:100%;float:left;line-height:1.5em;font-family:Terminal,Hiragino Kaku Gothic Pro;word-wrap:break-word;word-break:break-all}.md>*{float:left;clear:both}.md h1{margin:10px 0 10px 0;font-weight:bold}.md h1:not(:first-child){margin:20px 0 10px 0}.md h2{margin:5px 0 8px 0;font-weight:bold}.md h2:not(:first-child){margin:20px 0 8px 0}.md h3{margin:3px 0 6px 0;font-weight:bold}.md h3:not(:first-child){margin:10px 0 6px 0}.md h4{margin:3px 0 4px 0;font-weight:bold}.md h4:not(:first-child){margin:10px 0 4px 0}.md h5{margin:3px 0 2px 0;font-weight:bold}.md h5:not(:first-child){margin:10px 0 2px 0}.md h6{margin:3px 0 2px 0;font-weight:bold}.md h6:not(:first-child){margin:10px 0 2px 0}.md hr{float:none;clear:both}.md ol{margin:0 10px 10px 32px;list-style-type:decimal}.md p{margin:0 0 10px 0;clear:both}.md table{width:auto;margin:0 0 10px 0;background-color:#fff}.md td{padding:5px 10px;border:solid 1px #c0c0c0}.md th{padding:5px 10px;font-weight:bold;border:solid 1px #c0c0c0}.md tbody tr:nth-child(odd){background-color:#f5f5f5}.md ul{margin:0 10px 10px 32px;list-style-type:disc}.control-markdown{width:100%;display:none;padding:4px 4px 4px 6px;border:solid 1px #c0c0c0;border-radius:5px}.control-dropdown{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.control-spinner{width:auto;height:22px;display:block;float:left;padding:1px;color:#000}.control-checkbox{display:block;float:left;margin:8px 0}.control-checkbox~label{display:block;float:left;margin:7px 5px 0 6px}.control-checkbox+.ui-icon.ui-icon-info{display:block;float:left;margin:7px -7px 0 0}.field-normal .control-checkbox+label{width:175px}_::-webkit-full-page-media,_:future,:root .field-normal .control-checkbox+label{width:172px}.container-radio{padding:7px 0}.container-radio>label{display:block;float:left;margin:0 5px 0 0;white-space:nowrap}.control-radio{display:block;float:left;margin:3px}.radio-clear-both .container-radio>label{clear:both}.control-slider{width:30px;float:left;margin:8px 0 0 12px}.control-slider-ui{width:140px;float:left;margin:11px 0 0 5px}.container-selectable .wrapper{width:100%;min-height:300px;display:block;float:left;background-color:#f5f5f5;border:solid 1px #c0c0c0;overflow:auto;border-radius:5px}.control-selectable{width:100%;display:block;float:left;padding:5px 10px 5px 5px;list-style-type:none;touch-action:pan-y}.control-selectable li{width:100%;min-height:24px;margin:3px;padding:2px 5px;border-radius:5px}.control-basket{margin-left:120px;padding:5px 5px 0 5px;background-color:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.control-basket>li{display:block;float:left;margin:0 5px 5px 0;padding:3px 5px;border-radius:5px}.control-basket>li>span{display:block;float:left;z-index:2}.comment{width:100%;display:block;float:left;margin:0 0 5px 0;padding:5px 10px 10px 20px;background:#fafad2;border:solid 1px #c0c0c0;position:relative;clear:both}.comment>*{display:block;float:left}.comment>.time{float:left;margin:0 0 8px -10px;margin-right:10px}.comment>.body{width:100%;clear:both}.comment>.button.edit{position:absolute;top:3px;right:20px;cursor:pointer}.comment>.button.delete{position:absolute;top:3px;right:5px;cursor:pointer}.comment>.control-markup{width:100%}.comment>.control-markdown{width:100%;display:none}.user{float:left}.user>span{display:block;float:left;font-weight:bold}.dept{float:left}.dept>span{display:block;float:left;font-weight:bold}.both{clear:both}.hidden{display:none}.right{float:right}.right-align{text-align:right;text-align-last:right}.tooltip{display:none;position:absolute}.no-border{border:none}.grid{margin:0 0 10px 0}.grid.fixed{table-layout:fixed}.grid>thead>tr>caption{margin:0 0 5px 0}.grid>thead>tr>th{padding:6px;vertical-align:middle;border-top:solid 1px transparent;border-bottom:solid 1px transparent;border-left:solid 1px transparent;border-right:solid 1px #fff;word-wrap:break-word}.grid>thead>tr>th>div{width:100%;float:left;text-align:center;z-index:2}.grid>thead>tr>th span{display:block;float:left}.grid>thead>tr:first-child>th:first-child{border-radius:10px 0 0 0/10px 0 0 0}.grid>thead>tr:first-child>th:last-child{border-right:solid 1px transparent;border-radius:0 10px 0 0/0 10px 0 0}.grid>thead>tr>th.sortable:hover{cursor:pointer}.grid>tbody>tr>td{max-width:300px;border-left:dotted 1px #c0c0c0;border-right:dotted 1px #c0c0c0;word-wrap:break-word}.grid>tbody>tr.message-row>td{padding:0;text-align:center}.grid>tbody>tr [class*="status-"]{padding:0 5px;font-weight:bold;border:solid 1px #c0c0c0;border-radius:3px}.grid>tbody>tr>th{padding:6px;vertical-align:middle;font-weight:normal;background-color:#dcdcdc;border-top:solid 1px #fff;border-bottom:solid 1px #fff;border-left:solid 1px transparent;border-right:solid 1px transparent;word-wrap:break-word}.grid-row{background-color:#fff;border-bottom:solid 1px #c0c0c0}.grid-row td{overflow:hidden}.grid-row .comment{min-width:200px;max-height:100px;margin:0 0 3px 0;padding:3px 6px 3px 15px;background:#fafad2;border:solid 1px #fff;clear:both;overflow:hidden}.grid-row .comment.one-third{max-height:306px}.grid-row .comment.half{max-height:151px}.grid:not(.not-link) .grid-row:hover{background-color:#f5f5f5;cursor:pointer}.grid-row:hover .comment{background-color:#ffffe0}.grid-row p{float:left}.grid-row p.body{clear:both}.grid-row[data-history]{background-color:#d3d3d3}.grid-title-body{min-width:200px;max-height:306px;margin:0 0 3px 0;padding:3px 6px;background:inherit;border:solid 1px transparent;clear:both;overflow:hidden}.grid-title-body>.body{width:100%}.grid-title-body>.title+.body{padding:8px 0 0 10px}.links{padding:0 10px}.link-creations button{display:block;float:left;margin:0 10px 0 0}.text{width:250px;display:block;float:left;border:solid 1px #c0c0c0}.datepicker{display:block;float:left;border:solid 1px #c0c0c0}.dropdown{display:block;float:left;border:solid 1px #c0c0c0}[class*="limit-"]{margin-left:10px;padding:0 5px}.limit-warning1{color:#f00}.limit-warning2{color:#f00;background-color:#ffccd5}.limit-warning3{color:#fff;background-color:#f00}.message{width:100%;text-align:center;position:fixed;left:0;bottom:78px;z-index:100}.message .body{margin-bottom:4px;position:relative;border-radius:20px}.message .close{background-color:#fff;position:absolute;top:11px;right:8px;cursor:pointer;border-radius:10px}.message-dialog{width:100%;display:block;float:left;margin:0 auto;text-align:center}.message-form-bottom{width:600px;margin:0 auto;text-align:center}.alert-error{min-height:32px;display:block;padding:5px;color:#fff;background-color:rgba(255,0,0,.9);border:solid 1px #f00}.alert-success{min-height:32px;display:block;padding:5px;color:#fff;background-color:rgba(0,128,0,.9);border:solid 1px #008000}.alert-warning{min-height:32px;display:block;padding:5px;color:#000;background-color:#ff0;border:solid 1px #ff0}.alert-information{min-height:32px;display:block;padding:5px;color:#fff;background-color:#00f;border:solid 1px #00f}label.error{width:100%;display:block;float:left;padding:0 5px;color:#f00;background-color:#fff;border-top:none;top:-5px;left:0;border-radius:0 0 5px 5px/0 0 5px 5px;z-index:2}.ui-spinner>label.error{margin-top:3px}.error{border:solid 1px #f00}.error+.ui-widget.ui-state-default.ui-multiselect{border:solid 1px #f00}.with-unit+label.error{width:70%;position:absolute;top:25px}.button-edit-markdown{position:absolute;top:5px;right:5px;cursor:pointer;z-index:1}.comment>.button-edit-markdown{top:6px;right:20px}.button-delete-address{cursor:pointer}.button-right-justified{float:right}.status-new{background:#fff}.status-preparation{color:#fff;background:#ff8c00}.status-inprogress{color:#fff;background:#008000}.status-review{background:#ff0}.status-closed{color:#fff;background:#00f}.status-rejected{color:#fff;background:#808080}.always-hidden{display:none}h3.title-header{height:40px;padding:10px 20px;text-align:center;background-color:#dcdcdc;border:solid 1px #a9a9a9;border-radius:10px 10px 0 0/10px 10px 0 0}.outgoing-mail .dialog{padding:0 !important}.outgoing-mail .ui-dialog-titlebar{display:none}.svg-work-value{width:50px;height:40px}.svg-work-value rect:nth-of-type(1){fill:gainsboro}.svg-work-value rect:nth-of-type(2){fill:darkseagreen}.svg-progress-rate{width:50px;height:40px}.svg-progress-rate.warning text{fill:red}.svg-progress-rate rect:nth-of-type(1){fill:gainsboro}.svg-progress-rate rect:nth-of-type(2){fill:gray}.svg-progress-rate rect:nth-of-type(3){fill:darkseagreen}.svg-progress-rate.warning rect:nth-of-type(3){fill:#ffccd5}.svg-kamban-aggregation-view{width:100%;height:20px}.svg-kamban-aggregation-view rect{height:20px;fill:darkseagreen}.svg-crosstab{width:100%;height:20px}.svg-crosstab rect{height:20px;fill:darkseagreen}.axis{fill:none;stroke:gray;shape-rendering:crispEdges}.h2{margin:0 0 5px 0;padding:0}.h3{margin:0 0 5px 10px;padding:0}.h4{margin:0 0 5px 20px;padding:0}.h5{margin:0 0 5px 30px;padding:0}.h6{margin:0 0 5px 40px;padding:0}.h2>h2{padding:5px 0;font-weight:bold;border-bottom:solid 1px #c0c0c0}.h3>h3{font-weight:bold}.h4>h4{font-weight:bold}.h5>h5{font-weight:bold}.h6>h6{font-weight:bold}.w50{width:50px}.w100{width:100px}.w150{width:150px}.w200{width:200px}.w250{width:250px}.w300{width:300px}.w350{width:350px}.w400{width:400px}.w450{width:450px}.w500{width:500px}.w550{width:550px}.w600{width:600px}.h100{height:100px}.h150{height:150px}.h200{height:200px}.h250{height:250px}.h300{height:300px}.h350{height:350px}.h400{height:400px}.h450{height:450px}.h500{height:500px}.h550{height:550px}.h600{height:600px}.m-l10{margin-left:10px}.m-l20{margin-left:20px}.m-l30{margin-left:30px}.m-l40{margin-left:40px}.m-l50{margin-left:50px}.paragraph{padding:3px 3px 3px 10px}.dialog{display:none;padding:15px 0 10px 0 !important}.dialog .fieldset{margin:0 10px 10px 10px}.link span{margin-right:5px}.link span.bold{font-weight:bold;cursor:pointer}.histories-form{padding:20px}.ui-widget input,.ui-widget select,.ui-widget button{font-family:Hiragino Kaku Gothic Pro,"Meiryo UI",sans-serif}.ui-widget textarea{line-height:1.5em;font-family:Terminal,Hiragino Kaku Gothic Pro}.ui-widget{font-size:1em}.ui-button{padding:4px 4px 4px 2px !important}.ui-dialog{overflow:visible !important}.ui-icon.a{float:left;margin:6px 0 0 0}.ui-spinner{display:block;float:left;background:#fff;max-height:46px}.ui-widget.ui-state-default.ui-multiselect{height:30px;background:#fff;border:solid 1px #c0c0c0;overflow:hidden;border-radius:5px}.ui-multiselect-checkboxes{min-height:300px}.ui-multiselect-checkboxes input{margin:0 5px}.ui-corner-all.ui-state-hover{border-radius:2px}div.field-control .ui-multiselect.ui-state-disabled{background-color:#f5f5f5;opacity:1}.height-auto{max-height:none !important}.focus-inform{background-color:#fff !important;border:solid 1px #ffa500 !important}.menu-negative{border-left:solid 1px #fff;border-right:solid 1px #fff;position:absolute;z-index:10}.menu-negative>li{width:100%;display:block;float:left;border-top:dotted 1px #fff;cursor:pointer;clear:both}.menu-sort{border-left:solid 1px #fff;border-right:solid 1px #fff;position:absolute;border-radius:0 0 10px 10px/0 0 10px 10px;z-index:10}.menu-sort>li{width:100%;display:block;float:left;border-top:dotted 1px #fff;cursor:pointer;clear:both}.menu-sort>li.ui-menu-divider{height:initial;font-size:initial}.menu-sort>li.grid-header-filter .ui-icon{position:initial}.menu-sort>li:not(.grid-header-filter) div.field-control>*{border:solid 1px #c0c0c0}.current-time{position:absolute;top:9px;right:-17px;cursor:pointer;z-index:10}.current-user{position:absolute;top:9px;right:-17px;cursor:pointer;z-index:10}.current-dept{position:absolute;top:9px;right:-17px;cursor:pointer;z-index:10}input:focus{background-color:#ffc}select:focus:not(.has-css){background-color:#ffc}textarea:focus{background-color:#ffc}.ssoLoginMessage{margin:10px;padding:6px;border-top:solid 1px #c0c0c0}#EnterPriseBanner{width:238px;position:fixed;right:8px;bottom:280px;z-index:3}#SupportBanner{width:238px;position:fixed;right:8px;bottom:180px;z-index:3}#CasesBanner{width:238px;position:fixed;right:8px;bottom:80px;z-index:3}.annonymous .close-announcement{display:none}.grid-stack{background-color:#fff;margin:10px}.grid-stack-item-content{background-color:#f5f5f5}.dashboard-timeline-container{display:flex;flex-direction:column;gap:4px}.dashboard-timeline-item{background-color:#fff;margin:4px;padding:8px;transition:background-color .3s;cursor:pointer;box-shadow:0 2px 4px rgba(0,0,0,.2);border-radius:4px}.dashboard-timeline-item:hover{background-color:#ebebeb}.dashboard-timeline-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.dashboard-timeline-header a{color:#007bff;font-weight:bold;min-width:40px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dashboard-timeline-header-closed{overflow:hidden;max-height:0;margin-bottom:0}.dashboard-timeline-item:hover .dashboard-timeline-header-closed{max-height:200px;margin-bottom:4px;overflow:auto;transition:max-height .5s linear 1s}.dashboard-timeline-record-time{font-size:.8em;color:#777;margin-left:3px;font-weight:bold;display:flex;white-space:nowrap}.dashboard-timeline-record-time time{margin-left:4px}.dashboard-timeline-record-time .elapsed-time{margin-left:4px;font-weight:bold;background-color:#eee}.dashboard-timeline-title{font-size:1.2em;font-weight:bold;color:#333}.dashboard-timeline-body{margin-top:8px;line-height:1.5;color:#555}.dashboard-timeline-body-closed{margin-top:0;overflow:hidden;max-height:0}.dashboard-timeline-item:hover .dashboard-timeline-body-closed{margin-top:8px;max-height:300px;overflow:auto;transition:max-height .5s linear 1s,margin-top 0s;transition-delay:1s}.grid-stack-item-content{background-color:#f2f2f2;padding:16px;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1);display:flex;flex-direction:column}.dashboard-part-title{font-size:1.2em;color:#333;font-weight:bold;margin-bottom:10px}.dashboard-part-nav{margin-top:10px}.dashboard-part-nav-menu{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap}.dashboard-part-nav-menu>.dashboard-part-nav-item{max-width:200px;min-width:120px;margin-left:10px;white-space:nowrap;overflow:hidden;padding:4px;box-shadow:0 2px 4px rgba(0,0,0,.2)}.dashboard-part-nav-menu-vartical{list-style:none;padding:0;margin:0;display:flex;flex-direction:column}.dashboard-part-nav-item{color:#333;margin-bottom:8px;padding:4px;display:flex;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.2)}.dashboard-part-nav-item:hover{background-color:#ddd}.dashboard-part-nav-link{padding:4px;text-decoration:none;color:inherit;width:100%}.gs-20>.grid-stack-item{width:5%;min-width:5%}.gs-20>.grid-stack-item[gs-w="1"]{width:5%;min-width:5%}.gs-20>.grid-stack-item[gs-x="1"]{left:5%}.gs-20>.grid-stack-item[gs-w="2"]{width:10%}.gs-20>.grid-stack-item[gs-x="2"]{left:10%}.gs-20>.grid-stack-item[gs-w="3"]{width:15%}.gs-20>.grid-stack-item[gs-x="3"]{left:15%}.gs-20>.grid-stack-item[gs-w="4"]{width:20%}.gs-20>.grid-stack-item[gs-x="4"]{left:20%}.gs-20>.grid-stack-item[gs-w="5"]{width:25%}.gs-20>.grid-stack-item[gs-x="5"]{left:25%}.gs-20>.grid-stack-item[gs-w="6"]{width:30%}.gs-20>.grid-stack-item[gs-x="6"]{left:30%}.gs-20>.grid-stack-item[gs-w="7"]{width:35%}.gs-20>.grid-stack-item[gs-x="7"]{left:35%}.gs-20>.grid-stack-item[gs-w="8"]{width:40%}.gs-20>.grid-stack-item[gs-x="8"]{left:40%}.gs-20>.grid-stack-item[gs-w="9"]{width:45%}.gs-20>.grid-stack-item[gs-x="9"]{left:45%}.gs-20>.grid-stack-item[gs-w="10"]{width:50%}.gs-20>.grid-stack-item[gs-x="10"]{left:50%}.gs-20>.grid-stack-item[gs-w="11"]{width:55%}.gs-20>.grid-stack-item[gs-x="11"]{left:55%}.gs-20>.grid-stack-item[gs-w="12"]{width:60%}.gs-20>.grid-stack-item[gs-x="12"]{left:60%}.gs-20>.grid-stack-item[gs-w="13"]{width:65%}.gs-20>.grid-stack-item[gs-x="13"]{left:65%}.gs-20>.grid-stack-item[gs-w="14"]{width:70%}.gs-20>.grid-stack-item[gs-x="14"]{left:70%}.gs-20>.grid-stack-item[gs-w="15"]{width:75%}.gs-20>.grid-stack-item[gs-x="15"]{left:75%}.gs-20>.grid-stack-item[gs-w="16"]{width:80%}.gs-20>.grid-stack-item[gs-x="16"]{left:80%}.gs-20>.grid-stack-item[gs-w="17"]{width:85%}.gs-20>.grid-stack-item[gs-x="17"]{left:85%}.gs-20>.grid-stack-item[gs-w="18"]{width:90%}.gs-20>.grid-stack-item[gs-x="18"]{left:90%}.gs-20>.grid-stack-item[gs-w="19"]{width:95%}.gs-20>.grid-stack-item[gs-x="19"]{left:95%}.gs-20>.grid-stack-item[gs-w="20"]{width:100%} \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/scripts/_init.js b/Implem.Pleasanter/wwwroot/scripts/_init.js index 249bd69cd..43f75a57f 100644 --- a/Implem.Pleasanter/wwwroot/scripts/_init.js +++ b/Implem.Pleasanter/wwwroot/scripts/_init.js @@ -2,4 +2,4 @@ data: {}, events: {}, ex: {} -}; \ No newline at end of file +}; diff --git a/Implem.Pleasanter/wwwroot/scripts/dashboard.js b/Implem.Pleasanter/wwwroot/scripts/dashboard.js new file mode 100644 index 000000000..8249f19f4 --- /dev/null +++ b/Implem.Pleasanter/wwwroot/scripts/dashboard.js @@ -0,0 +1,32 @@ +$p.initDashboard = function () { + const isMobile = navigator.userAgent.includes('Mobile'); + let layout = $('#DashboardPartLayouts').val(); + $p.gridstackInstance = GridStack.init({ + column: 20, + cellHeight: 16, + oneColumnSize: 980, + draggable: { cancel: ".no-drag" }, + disableDrag: isMobile, + }); + $p.gridstackInstance.load(JSON.parse(layout)); +}; + +$p.updateDashboardPartLayouts = function () { + let layouts = $p.gridstackInstance.save(); + layouts.forEach(item => item.content = ""); + $p.set($('#DashboardPartLayouts'), JSON.stringify(layouts)) + $p.send($("#UpdateDashboardPartLayouts")); +}; + +$(document).on('click', '.dashboard-timeline-item', function() { + $p.transition($(this).attr('data-url')); +}); + +$p.addDashboardPartAccessControl = function () { + $('#SourceDashboardPartAccessControl li.ui-selected').appendTo('#CurrentDashboardPartAccessControl'); + $p.setData($('#CurrentDashboardPartAccessControl')); +} + +$p.deleteDashboardPartAccessControl = function () { + $('#CurrentDashboardPartAccessControl li.ui-selected').appendTo('#SourceDashboardPartAccessControl'); +} \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/scripts/display.js b/Implem.Pleasanter/wwwroot/scripts/display.js index 0958fcae2..d10374d35 100644 --- a/Implem.Pleasanter/wwwroot/scripts/display.js +++ b/Implem.Pleasanter/wwwroot/scripts/display.js @@ -220,6 +220,13 @@ ResetOrder_ko: '순서 재설정', ResetOrder_es: 'Restablecer orden', ResetOrder_vn: 'Cài lại thứ tự', + ResetTimeLineView: 'Resetting "Filters" and "Sorters" because the reference site has been changed.', + ResetTimeLineView_zh: '由于参考网站已更改,正在重置“过滤器”和“排序器”。', + ResetTimeLineView_ja: '基準となるサイトが変更されるため、「フィルタ」および「ソータ」をリセットします。', + ResetTimeLineView_de: 'Zurücksetzen von "Filtern" und "Sortierern", da sich die Referenzseite geändert hat.', + ResetTimeLineView_ko: '기준 사이트가 변경되었기 때문에 "필터"와 "소터"를 재설정합니다.', + ResetTimeLineView_es: 'Restableciendo "Filtros" y "Ordenadores" porque el sitio de referencia ha cambiado.', + ResetTimeLineView_vn: 'Đặt lại "Bộ lọc" và "Bộ sắp xếp" vì trang tham chiếu đã được thay đổi.', ThisMonth: 'This month', ThisMonth_zh: '本月', ThisMonth_ja: '今月', diff --git a/Implem.Pleasanter/wwwroot/scripts/multiselect.js b/Implem.Pleasanter/wwwroot/scripts/multiselect.js index fc35de390..62b918955 100644 --- a/Implem.Pleasanter/wwwroot/scripts/multiselect.js +++ b/Implem.Pleasanter/wwwroot/scripts/multiselect.js @@ -22,7 +22,10 @@ $p.selectMultiSelect = function ($control, json) { $control.find('option').each(function (index, element) { var $element = $(element); $element.prop('selected', false); - if (JSON.parse(json).indexOf($element.val()) > -1) { + var selected = json + ? json + : '[]'; + if (JSON.parse(selected).indexOf($element.val()) > -1) { $element.prop('selected', true); } }); diff --git a/Implem.Pleasanter/wwwroot/scripts/plugins/gridstack.js/gridstack-all.min.js b/Implem.Pleasanter/wwwroot/scripts/plugins/gridstack.js/gridstack-all.min.js new file mode 100644 index 000000000..3c900148f --- /dev/null +++ b/Implem.Pleasanter/wwwroot/scripts/plugins/gridstack.js/gridstack-all.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.GridStack=t():e.GridStack=t()}(self,()=>(()=>{"use strict";var s={d:(e,t)=>{for(var i in t)s.o(t,i)&&!s.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},e={};s.d(e,{GridStack:()=>R});class v{static getElements(t,i=document){if("string"!=typeof t)return[t];{const s="getElementById"in i?i:void 0;if(s&&!isNaN(+t[0])){const i=s.getElementById(t);return i?[i]:[]}let e=i.querySelectorAll(t);return e.length||"."===t[0]||"#"===t[0]||((e=i.querySelectorAll("."+t)).length||(e=i.querySelectorAll("#"+t))),Array.from(e)}}static getElement(t,i=document){if("string"!=typeof t)return t;{const s="getElementById"in i?i:void 0;if(!t.length)return null;if(s&&"#"===t[0])return s.getElementById(t.substring(1));if("#"===t[0]||"."===t[0]||"["===t[0])return i.querySelector(t);if(s&&!isNaN(+t[0]))return s.getElementById(t);let e=i.querySelector(t);return e=(e=s&&!e?s.getElementById(t):e)||i.querySelector("."+t)}}static isIntercepted(e,t){return!(e.y>=t.y+t.h||e.y+e.h<=t.y||e.x+e.w<=t.x||e.x>=t.x+t.w)}static isTouching(e,t){return v.isIntercepted(e,{x:t.x-.5,y:t.y-.5,w:t.w+1,h:t.h+1})}static areaIntercept(e,t){var i=(e.x>t.x?e:t).x,s=e.x+e.wt.y?e:t).y,e=e.y+e.hMath.max(t.x+t.w,e),0)||12,-1===t?e.sort((e,t)=>t.x+t.y*i-(e.x+e.y*i)):e.sort((e,t)=>e.x+e.y*i-(t.x+t.y*i))}static createStylesheet(e,t,i){let s=document.createElement("style");i=i?.nonce;return i&&(s.nonce=i),s.setAttribute("type","text/css"),s.setAttribute("gs-style-id",e),s.styleSheet?s.styleSheet.cssText="":s.appendChild(document.createTextNode("")),t?t.insertBefore(s,t.firstChild):(t=document.getElementsByTagName("head")[0]).appendChild(s),s.sheet}static removeStylesheet(e){let t=document.querySelector("STYLE[gs-style-id="+e+"]");t&&t.parentNode&&t.remove()}static addCSSRule(e,t,i){"function"==typeof e.addRule?e.addRule(t,i):"function"==typeof e.insertRule&&e.insertRule(t+`{${i}}`)}static toBool(e){return"boolean"==typeof e?e:"string"==typeof e?!(""===(e=e.toLowerCase())||"no"===e||"false"===e||"0"===e):Boolean(e)}static toNumber(e){return null===e||0===e.length?void 0:Number(e)}static parseHeight(e){let t,i="px";if("string"==typeof e){var s=e.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);if(!s)throw new Error("Invalid height");i=s[2]||"px",t=parseFloat(s[1])}else t=e;return{h:t,unit:i}}static defaults(i,...e){return e.forEach(e=>{for(const t in e){if(!e.hasOwnProperty(t))return;null===i[t]||void 0===i[t]?i[t]=e[t]:"object"==typeof e[t]&&"object"==typeof i[t]&&this.defaults(i[t],e[t])}}),i}static same(e,t){if("object"!=typeof e)return e==t;if(typeof e!=typeof t)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const i in e)if(e[i]!==t[i])return!1;return!0}static copyPos(e,t,i=!1){return void 0!==t.x&&(e.x=t.x),void 0!==t.y&&(e.y=t.y),void 0!==t.w&&(e.w=t.w),void 0!==t.h&&(e.h=t.h),i&&(t.minW&&(e.minW=t.minW),t.minH&&(e.minH=t.minH),t.maxW&&(e.maxW=t.maxW),t.maxH&&(e.maxH=t.maxH)),e}static samePos(e,t){return e&&t&&e.x===t.x&&e.y===t.y&&e.w===t.w&&e.h===t.h}static sanitizeMinMax(e){e.minW||delete e.minW,e.minH||delete e.minH,e.maxW||delete e.maxW,e.maxH||delete e.maxH}static removeInternalAndSame(t,i){if("object"==typeof t&&"object"==typeof i)for(var s in t){let e=t[s];if("_"===s[0]||e===i[s])delete t[s];else if(e&&"object"==typeof e&&void 0!==i[s]){for(var o in e)e[o]!==i[s][o]&&"_"!==o[0]||delete e[o];Object.keys(e).length||delete t[s]}}}static removeInternalForSave(e,t=!0){for(var i in e)"_"!==i[0]&&null!==e[i]&&void 0!==e[i]||delete e[i];delete e.grid,t&&delete e.el,e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,e.locked||delete e.locked,1!==e.w&&e.w!==e.minW||delete e.w,1!==e.h&&e.h!==e.minH||delete e.h}static closestUpByClass(e,t){for(;e;){if(e.classList.contains(t))return e;e=e.parentElement}return null}static throttle(t,i){let s=!1;return(...e)=>{s||(s=!0,setTimeout(()=>{t(...e),s=!1},i))}}static removePositioningStyles(e){let t=e.style;t.position&&t.removeProperty("position"),t.left&&t.removeProperty("left"),t.top&&t.removeProperty("top"),t.width&&t.removeProperty("width"),t.height&&t.removeProperty("height")}static getScrollElement(e){if(!e)return document.scrollingElement||document.documentElement;var t=getComputedStyle(e);return/(auto|scroll)/.test(t.overflow+t.overflowY)?e:this.getScrollElement(e.parentElement)}static updateScrollPosition(s,o,r){var n,l=s.getBoundingClientRect(),h=window.innerHeight||document.documentElement.clientHeight;if(l.top<0||l.bottom>h){let e=l.bottom-h,t=l.top,i=this.getScrollElement(s);null!==i&&(n=i.scrollTop,l.top<0&&r<0?s.offsetHeight>h?i.scrollTop+=r:i.scrollTop+=Math.abs(t)>Math.abs(r)?r:t:0h?i.scrollTop+=r:i.scrollTop+=re===s)&&(i[s]=v.cloneDeep(e[s]));return i}static cloneNode(e){const t=e.cloneNode(!0);return t.removeAttribute("id"),t}static appendTo(e,t){let i;(i="string"==typeof t?v.getElement(t):t)&&i.appendChild(e)}static addElStyles(t,e){if(e instanceof Object)for(const i in e)e.hasOwnProperty(i)&&(Array.isArray(e[i])?e[i].forEach(e=>{t.style[i]=e}):t.style[i]=e[i])}static initEvent(t,e){const i={type:e.type},s={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:e.target||t.target};return t.dataTransfer&&(i.dataTransfer=t.dataTransfer),["altKey","ctrlKey","metaKey","shiftKey"].forEach(e=>i[e]=t[e]),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach(e=>i[e]=t[e]),{...i,...s}}static simulateMouseEvent(e,t,i){const s=document.createEvent("MouseEvents");s.initMouseEvent(t,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,0,e.target),(i||e.target).dispatchEvent(s)}}class n{constructor(e={}){this.addedNodes=[],this.removedNodes=[],this.column=e.column||12,this.maxRow=e.maxRow,this._float=e.float,this.nodes=e.nodes||[],this.onChange=e.onChange}batchUpdate(e=!0,t=!0){return!!this.batchMode!==e&&((this.batchMode=e)?(this._prevFloat=this._float,this._float=!0,this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,t&&this._packNodes(),this._notify())),this}_useEntireRowArea(e,t){return(!this.float||this.batchMode&&!this._prevFloat)&&!this._hasLocked&&(!e._moving||e._skipDown||t.y<=e.y)}_fixCollisions(t,i=t,s,o={}){if(this.sortNodes(-1),!(s=s||this.collide(t,i)))return!1;if(t._moving&&!o.nested&&!this.float&&this.swap(t,s))return!0;let e=i,r=(this._useEntireRowArea(t,i)&&(e={x:0,w:this.column,y:i.y,h:i.h},s=this.collide(t,e,o.skip)),!1),n={nested:!0,pack:!1};for(;s=s||this.collide(t,e,o.skip);){let e;if(s.locked||t._moving&&!t._skipDown&&i.y>t.y&&!this.float&&(!this.collide(s,{...s,y:t.y},t)||!this.collide(s,{...s,y:i.y-s.h},t))?(t._skipDown=t._skipDown||i.y>t.y,e=this.moveNode(t,{...i,y:s.y+s.h,...n}),s.locked&&e?v.copyPos(i,t):!s.locked&&e&&o.pack&&(this._packNodes(),i.y=s.y+s.h,v.copyPos(t,i)),r=r||e):e=this.moveNode(s,{...s,y:i.y+i.h,skip:t,...n}),!e)return r;s=void 0}return r}collide(e,t=e,i){const s=e._id,o=i?._id;return this.nodes.find(e=>e._id!==s&&e._id!==o&&v.isIntercepted(e,t))}collideAll(e,t=e,i){const s=e._id,o=i?._id;return this.nodes.filter(e=>e._id!==s&&e._id!==o&&v.isIntercepted(e,t))}directionCollideCoverage(e,t,i){if(t.rect&&e._rect){let r,n=e._rect,l={...t.rect};return l.y>n.y?(l.h+=l.y-n.y,l.y=n.y):l.h+=n.y-l.y,l.x>n.x?(l.w+=l.x-n.x,l.x=n.x):l.w+=n.x-l.x,i.forEach(s=>{if(!s.locked&&s._rect){let e=s._rect,t=Number.MAX_VALUE,i=Number.MAX_VALUE;n.ye.y+e.h&&(t=(e.y+e.h-l.y)/e.h),n.xe.x+e.w&&(i=(e.x+e.w-l.x)/e.w);var o=Math.min(i,t);.5e._rect={y:e.y*i+s,x:e.x*t+n,w:e.w*t-n-o,h:e.h*i-s-r}),this}swap(i,s){if(!s||s.locked||!i||i.locked)return!1;function e(){var e=s.x,t=s.y;return s.x=i.x,s.y=i.y,i.h!=s.h?(i.x=e,i.y=s.y+s.h):(i.w!=s.w?i.x=s.x+s.w:i.x=e,i.y=t),i._dirty=s._dirty=!0}let t;return i.w!==s.w||i.h!==s.h||i.x!==s.x&&i.y!==s.y||!(t=v.isTouching(i,s))?!1!==t?i.w===s.w&&i.x===s.x&&(t=t||v.isTouching(i,s))?(s.y{let s;e.locked||(e.autoPosition=!0,"list"===o&&t&&(s=i[t-1])),this.addNode(e,!1,s)}),t||delete this._inColumnResize,e||this.batchUpdate(!1),this}set float(e){this._float!==e&&(this._float=e||!1,e||this._packNodes()._notify())}get float(){return this._float||!1}sortNodes(e=1,t=this.column){return this.nodes=v.sort(this.nodes,e,t),this}_packNodes(){return this.batchMode||(this.sortNodes(),this.float?this.nodes.forEach(t=>{if(!t._updating&&void 0!==t._orig&&t.y!==t._orig.y){let e=t.y;for(;e>t._orig.y;)--e,this.collide(t,{x:t.x,y:e,w:t.w,h:t.h})||(t._dirty=!0,t.y=e)}}):this.nodes.forEach((e,t)=>{if(!e.locked)for(;0this.column)&&this.column<12&&!this._inColumnResize&&t._id&&-1===this.findCacheLayout(t,12)){let e={...t};e.autoPosition?(delete e.x,delete e.y):e.x=Math.min(11,e.x),e.w=Math.min(12,e.w),this.cacheOneLayout(e,12)}return t.w>this.column?t.w=this.column:t.w<1&&(t.w=1),this.maxRow&&t.h>this.maxRow?t.h=this.maxRow:t.h<1&&(t.h=1),t.x<0&&(t.x=0),t.y<0&&(t.y=0),t.x+t.w>this.column&&(e?t.w=this.column-t.x:t.x=this.column-t.w),this.maxRow&&t.y+t.h>this.maxRow&&(e?t.h=this.maxRow-t.y:t.y=this.maxRow-t.h),v.samePos(t,i)||(t._dirty=!0),t}getDirtyNodes(e){return e?this.nodes.filter(e=>e._dirty&&!v.samePos(e,e._orig)):this.nodes.filter(e=>e._dirty)}_notify(e){if(this.batchMode||!this.onChange)return this;e=(e||[]).concat(this.getDirtyNodes());return this.onChange(e),this}cleanNodes(){return this.batchMode||this.nodes.forEach(e=>{delete e._dirty,delete e._lastTried}),this}saveInitial(){return this.nodes.forEach(e=>{e._orig=v.copyPos({},e),delete e._dirty}),this._hasLocked=this.nodes.some(e=>e.locked),this}restoreInitial(){return this.nodes.forEach(e=>{v.samePos(e,e._orig)||(v.copyPos(e,e._orig),e._dirty=!0)}),this._notify(),this}findEmptyPosition(i,s=this.nodes,t=this.column,o){let r=!1;for(let e=o?o.y*t+(o.x+o.w):0;!r;++e){var n=e%t,l=Math.floor(e/t);if(!(n+i.w>t)){let t={x:n,y:l,w:i.w,h:i.h};s.find(e=>v.isIntercepted(t,e))||(i.x===n&&i.y===l||(i._dirty=!0),i.x=n,i.y=l,delete i.autoPosition,r=!0)}}return r}addNode(t,e=!1,i){let s;return this.nodes.find(e=>e._id===t._id)||(delete(t=this._inColumnResize?this.nodeBoundFix(t):this.prepareNode(t))._temporaryRemoved,delete t._removeDOM,t.autoPosition&&this.findEmptyPosition(t,this.nodes,this.column,i)&&(delete t.autoPosition,s=!0),this.nodes.push(t),e&&this.addedNodes.push(t),s||this._fixCollisions(t),this.batchMode||this._packNodes()._notify(),t)}removeNode(t,e=!0,i=!1){return this.nodes.find(e=>e._id===t._id)?(i&&this.removedNodes.push(t),e&&(t._removeDOM=!0),this.nodes=this.nodes.filter(e=>e._id!==t._id),this._packNodes()._notify([t])):this}removeAll(e=!0){return delete this._layouts,this.nodes.length?(e&&this.nodes.forEach(e=>e._removeDOM=!0),this.removedNodes=this.nodes,this.nodes=[],this._notify(this.removedNodes)):this}moveNodeCheck(t,e){if(!this.changedPosConstrain(t,e))return!1;if(e.pack=!0,!this.maxRow)return this.moveNode(t,e);let i,s=new n({column:this.column,float:this.float,nodes:this.nodes.map(e=>e._id===t._id?i={...e}:{...e})});if(!i)return!1;var o=s.moveNode(i,e)&&s.getRow()<=this.maxRow;if(!o&&!e.resizing&&e.collide){e=e.collide.el.gridstackNode;if(this.swap(t,e))return this._notify(),!0}return!!o&&(s.nodes.filter(e=>e._dirty).forEach(t=>{let e=this.nodes.find(e=>e._id===t._id);e&&(v.copyPos(e,t),e._dirty=!0)}),this._notify(),!0)}willItFit(e){if(delete e._willFitPos,!this.maxRow)return!0;let t=new n({column:this.column,float:this.float,nodes:this.nodes.map(e=>({...e}))}),i={...e};return this.cleanupNode(i),delete i.el,delete i._id,delete i.content,delete i.grid,t.addNode(i),t.getRow()<=this.maxRow&&(e._willFitPos=v.copyPos({},i),!0)}changedPosConstrain(e,t){return t.w=t.w||e.w,t.h=t.h||e.h,e.x!==t.x||e.y!==t.y||(e.maxW&&(t.w=Math.min(t.w,e.maxW)),e.maxH&&(t.h=Math.min(t.h,e.maxH)),e.minW&&(t.w=Math.max(t.w,e.minW)),e.minH&&(t.h=Math.max(t.h,e.minH)),e.w!==t.w||e.h!==t.h)}moveNode(i,s){if(!i||!s)return!1;let o;void 0===s.pack&&(o=s.pack=!0),"number"!=typeof s.x&&(s.x=i.x),"number"!=typeof s.y&&(s.y=i.y),"number"!=typeof s.w&&(s.w=i.w),"number"!=typeof s.h&&(s.h=i.h);var r,n=i.w!==s.w||i.h!==s.h,l=v.copyPos({},i,!0);if(v.copyPos(l,s),l=this.nodeBoundFix(l,n),v.copyPos(s,l),v.samePos(i,s))return!1;let e=v.copyPos({},i),h=this.collideAll(i,l,s.skip),a=!0;if(h.length){let e=i._moving&&!s.nested,t=e?this.directionCollideCoverage(i,s,h):h[0];e&&t&&i.grid?.opts?.subGridDynamic&&!i.grid._isTemp&&(.8Math.max(e,t.y+t.h),0)}beginUpdate(e){return e._updating||(e._updating=!0,delete e._skipDown,this.batchMode||this.saveInitial()),this}endUpdate(){let e=this.nodes.find(e=>e._updating);return e&&(delete e._updating,delete e._skipDown),this}save(s=!0,o){let e=this._layouts?.length,r=e&&this.column!==e-1?this._layouts[e-1]:null,n=[];return this.sortNodes(),this.nodes.forEach(t=>{let e=r?.find(e=>e._id===t._id),i={...t};e&&(i.x=e.x,i.y=e.y,i.w=e.w),v.removeInternalForSave(i,!s),o&&o(t,i),n.push(i)}),n}layoutsNodesChange(t){return this._layouts&&!this._inColumnResize&&this._layouts.forEach((s,e)=>{if(!s||e===this.column)return this;if(e{if(t._orig){let e=s.find(e=>e._id===t._id);e&&(t.y!==t._orig.y&&(e.y+=t.y-t._orig.y),t.x!==t._orig.x&&(e.x=Math.round(t.x*i)),t.w!==t._orig.w&&(e.w=Math.round(t.w*i)))}})}}),this}columnChanged(o,r,n,e="moveScale"){if(!this.nodes.length||!r||o===r)return this;const l="compact"===e||"list"===e;l&&this.sortNodes(1,o),r{e.x=0,e.w=1,e.y=Math.max(e.y,t),t=e.y+e.h}),h=n,n=[]}else n=l?this.nodes:v.sort(this.nodes,-1,o);if(o{let e=n.find(e=>e._id===t._id);e&&(l||(e.x=t.x,e.y=t.y),e.w=t.w)})),v.forEach(t=>{var e=n.findIndex(e=>e._id===t._id);-1!==e&&(l?n[e].w=t.w:((t.autoPosition||isNaN(t.x)||isNaN(t.y))&&this.findEmptyPosition(t,h),t.autoPosition||(n[e].x=t.x,n[e].y=t.y,n[e].w=t.w,h.push(n[e])),n.splice(e,1)))})}if(l)this.compact(e,!1);else{if(n.length)if("function"==typeof e)e(r,o,h,n);else if(!i){let t=l||"none"===e?1:r/o,i="move"===e||"moveScale"===e,s="scale"===e||"moveScale"===e;n.forEach(e=>{e.x=1===r?0:i?Math.round(e.x*t):Math.min(e.x,r-1),e.w=1===r||1===o?1:s?Math.round(e.w*t)||1:Math.min(e.w,r),h.push(e)}),n=[]}i||(h=v.sort(h,-1,r)),this._inColumnResize=!0,this.nodes=[],h.forEach(e=>{this.addNode(e,!1),delete e._orig})}return this.nodes.forEach(e=>delete e._orig),this.batchUpdate(!1,!l),delete this._inColumnResize,this}cacheLayout(e,t,i=!1){let s=[];return e.forEach((e,t)=>{e._id=e._id??n._idSeq++,s[t]={x:e.x,y:e.y,w:e.w,_id:e._id}}),this._layouts=!i&&this._layouts||[],this._layouts[t]=s,this}cacheOneLayout(e,t){e._id=e._id??n._idSeq++;let i={x:e.x,y:e.y,w:e.w,_id:e._id};e.autoPosition&&(delete i.x,delete i.y,i.autoPosition=!0),this._layouts=this._layouts||[],this._layouts[t]=this._layouts[t]||[];e=this.findCacheLayout(e,t);return-1===e?this._layouts[t].push(i):this._layouts[t][e]=i,this}findCacheLayout(t,e){return this._layouts?.[e]?.findIndex(e=>e._id===t._id)??-1}cleanupNode(e){for(var t in e)"_"===t[0]&&"_id"!==t&&delete e[t];return this}}const a={alwaysShowResizeHandle:"mobile",animate:!(n._idSeq=0),auto:!0,cellHeight:"auto",cellHeightThrottle:100,cellHeightUnit:"px",column:12,draggable:{handle:".grid-stack-item-content",appendTo:"body",scroll:!0},handle:".grid-stack-item-content",itemClass:"grid-stack-item",margin:10,marginUnit:"px",maxRow:0,minRow:0,oneColumnSize:768,placeholderClass:"grid-stack-placeholder",placeholderText:"",removableOptions:{accept:".grid-stack-item"},resizable:{handles:"se"},rtl:"auto"},o={handle:".grid-stack-item-content",appendTo:"body"};class l{}const h="undefined"!=typeof window&&"undefined"!=typeof document&&("ontouchstart"in document||"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch||0{delete i.pointerLeaveTimeout,t(e,"mouseleave")},10))}class _{constructor(e,t,i){this.moving=!1,this.host=e,this.dir=t,this.option=i,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._init()}_init(){const e=document.createElement("div");return e.classList.add("ui-resizable-handle"),e.classList.add(""+_.prefix+this.dir),e.style.zIndex="100",e.style.userSelect="none",this.el=e,this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),h&&(this.el.addEventListener("touchstart",d),this.el.addEventListener("pointerdown",u)),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),h&&(this.el.removeEventListener("touchstart",d),this.el.removeEventListener("pointerdown",u)),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(e){this.mouseDownEvent=e,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),h&&(this.el.addEventListener("touchmove",p),this.el.addEventListener("touchend",g)),e.stopPropagation(),e.preventDefault()}_mouseMove(e){var t=this.mouseDownEvent;this.moving?this._triggerEvent("move",e):2{var e=this.el.parentElement.getBoundingClientRect(),t={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},t=this.temporalRect||t;return{position:{left:t.left-e.left,top:t.top-e.top},size:{width:t.width,height:t.height}}},this.el=e,this.option=t,this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this.enable(),this._setupAutoHide(this.option.autoHide),this._setupHandlers()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){super.enable(),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this._setupAutoHide(!1)}destroy(){this._removeHandlers(),this._setupAutoHide(!1),delete this.el,super.destroy()}updateOption(t){var e=t.handles&&t.handles!==this.option.handles,i=t.autoHide&&t.autoHide!==this.option.autoHide;return Object.keys(t).forEach(e=>this.option[e]=t[e]),e&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(this.option.autoHide),this}_setupAutoHide(e){return e?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),l.overResizeElement===this&&delete l.overResizeElement),this}_mouseOver(e){l.overResizeElement||l.dragElement||(l.overResizeElement=this).el.classList.remove("ui-resizable-autohide")}_mouseOut(e){l.overResizeElement===this&&(delete l.overResizeElement,this.el.classList.add("ui-resizable-autohide"))}_setupHandlers(){let e=this.option.handles||"e,s,se";return"all"===e&&(e="n,e,s,w,se,sw,ne,nw"),this.handlers=e.split(",").map(e=>e.trim()).map(t=>new _(this.el,t,{start:e=>{this._resizeStart(e)},stop:e=>{this._resizeStop(e)},move:e=>{this._resizing(e,t)}})),this}_resizeStart(e){this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=v.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=e,this._setupHelper(),this._applyChange();e=v.initEvent(e,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(e,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",e),this}_resizing(e,t){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(e,t),this._applyChange();t=v.initEvent(e,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(t,this._ui()),this.triggerEvent("resize",t),this}_resizeStop(e){e=v.initEvent(e,{type:"resizestop",target:this.el});return this.option.stop&&this.option.stop(e),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",e),this._cleanHelper(),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){return this.elOriginStyleVal=f._originStyleProp.map(e=>this.el.style[e]),this.parentOriginStylePosition=this.el.parentElement.style.position,window.getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this}_cleanHelper(){return f._originStyleProp.forEach((e,t)=>{this.el.style[e]=this.elOriginStyleVal[t]||null}),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(e,t){const i=this.startEvent,s={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},o=e.clientX-i.clientX,r=e.clientY-i.clientY;-1{var t=this.temporalRect[e];this.el.style[e]=t-i[e]+"px"}),this}_removeHandlers(){return this.handlers.forEach(e=>e.destroy()),delete this.handlers,this}}f._originStyleProp=["width","height","position","left","top","opacity","zIndex"];class b extends y{constructor(e,t={}){super(),this.el=e;var i=(this.option=t).handle.substring(1);this.dragEl=!e.classList.contains(i)&&e.querySelector(t.handle)||e,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this.enable()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){!1!==this.disabled&&(super.enable(),this.dragEl.addEventListener("mousedown",this._mouseDown),h&&(this.dragEl.addEventListener("touchstart",d),this.dragEl.addEventListener("pointerdown",u)),this.el.classList.remove("ui-draggable-disabled"))}disable(e=!1){!0!==this.disabled&&(super.disable(),this.dragEl.removeEventListener("mousedown",this._mouseDown),h&&(this.dragEl.removeEventListener("touchstart",d),this.dragEl.removeEventListener("pointerdown",u)),e||this.el.classList.add("ui-draggable-disabled"))}destroy(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.dragging&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(t){return Object.keys(t).forEach(e=>this.option[e]=t[e]),this}_mouseDown(e){if(!l.mouseHandled)return 0!==e.button||e.target.closest('input,textarea,button,select,option,[contenteditable="true"],.ui-resizable-handle')||this.option.cancel&&e.target.closest(this.option.cancel)||(this.mouseDownEvent=e,delete this.dragging,delete l.dragElement,delete l.dropElement,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),h&&(this.dragEl.addEventListener("touchmove",p),this.dragEl.addEventListener("touchend",g)),e.preventDefault(),document.activeElement&&document.activeElement.blur(),l.mouseHandled=!0),!0}_callDrag(e){this.dragging&&(e=v.initEvent(e,{target:this.el,type:"drag"}),this.option.drag&&this.option.drag(e,this.ui()),this.triggerEvent("drag",e))}_mouseMove(e){let t=this.mouseDownEvent;var i;if(this.dragging)if(this._dragFollow(e),l.pauseDrag){const t=Number.isInteger(l.pauseDrag)?l.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout(()=>this._callDrag(e),t)}else this._callDrag(e);else 3this.el.style[e])),t}_setupHelperStyle(e){this.helper.classList.add("ui-draggable-dragging");const t=this.helper.style;return t.pointerEvents="none",t.width=this.dragOffset.width+"px",t.height=this.dragOffset.height+"px",t.willChange="left, top",t.position="fixed",this._dragFollow(e),t.transition="none",setTimeout(()=>{this.helper&&(t.transition=null)},0),this}_removeHelperStyle(){if(this.helper.classList.remove("ui-draggable-dragging"),!(this.helper?.gridstackNode)?._isAboutToRemove&&this.dragElementOriginStyle){let t=this.helper,e=this.dragElementOriginStyle.transition||null;t.style.transition=this.dragElementOriginStyle.transition="none",b.originStyleProp.forEach(e=>t.style[e]=this.dragElementOriginStyle[e]||null),setTimeout(()=>t.style.transition=e,50)}return delete this.dragElementOriginStyle,this}_dragFollow(e){const t=this.helper.style,i=this.dragOffset;t.left=+(e.clientX+i.offsetLeft)+"px",t.top=+(e.clientY+i.offsetTop)+"px"}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.helper.style.position&&(this.parentOriginStylePosition=this.helperContainment.style.position,window.getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_getDragOffset(e,t,i){let s=0,o=0;if(i){const e=document.createElement("div"),t=(v.addElStyles(e,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),i.appendChild(e),e.getBoundingClientRect());i.removeChild(e),s=t.left,o=t.top}i=t.getBoundingClientRect();return{left:i.left,top:i.top,offsetLeft:-e.clientX+i.left-s,offsetTop:-e.clientY+i.top-o,width:i.width,height:i.height}}ui(){var e=this.el.parentElement.getBoundingClientRect(),t=this.helper.getBoundingClientRect();return{position:{top:t.top-e.top,left:t.left-e.left}}}}b.originStyleProp=["transition","pointerEvents","position","left","top","minWidth","willChange"];class w extends y{constructor(e,t={}){super(),this.el=e,this.option=t,this._mouseEnter=this._mouseEnter.bind(this),this._mouseLeave=this._mouseLeave.bind(this),this.enable(),this._setupAccept()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){!1!==this.disabled&&(super.enable(),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),h&&(this.el.addEventListener("pointerenter",c),this.el.addEventListener("pointerleave",m)))}disable(e=!1){!0!==this.disabled&&(super.disable(),this.el.classList.remove("ui-droppable"),e||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),h&&(this.el.removeEventListener("pointerenter",c),this.el.removeEventListener("pointerleave",m)))}destroy(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),super.destroy()}updateOption(t){return Object.keys(t).forEach(e=>this.option[e]=t[e]),this._setupAccept(),this}_mouseEnter(e){l.dragElement&&this._canDrop(l.dragElement.el)&&(e.preventDefault(),e.stopPropagation(),l.dropElement&&l.dropElement!==this&&l.dropElement._mouseLeave(e),l.dropElement=this,e=v.initEvent(e,{target:this.el,type:"dropover"}),this.option.over&&this.option.over(e,this._ui(l.dragElement)),this.triggerEvent("dropover",e),this.el.classList.add("ui-droppable-over"))}_mouseLeave(i){if(l.dragElement&&l.dropElement===this){i.preventDefault(),i.stopPropagation();var e=v.initEvent(i,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(e,this._ui(l.dragElement)),this.triggerEvent("dropout",e),l.dropElement===this){let e,t=(delete l.dropElement,this.el.parentElement);for(;!e&&t;)e=t.ddElement?.ddDroppable,t=t.parentElement;e&&e._mouseEnter(i)}}}drop(e){e.preventDefault();e=v.initEvent(e,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(e,this._ui(l.dragElement)),this.triggerEvent("drop",e)}_canDrop(e){return e&&(!this.accept||this.accept(e))}_setupAccept(){return this.option.accept&&("string"==typeof this.option.accept?this.accept=e=>e.matches(this.option.accept):this.accept=this.option.accept),this}_ui(e){return{draggable:e.el,...e.ui()}}}class E{static init(e){return e.ddElement||(e.ddElement=new E(e)),e.ddElement}constructor(e){this.el=e}on(e,t){return this.ddDraggable&&-1<["drag","dragstart","dragstop"].indexOf(e)?this.ddDraggable.on(e,t):this.ddDroppable&&-1<["drop","dropover","dropout"].indexOf(e)?this.ddDroppable.on(e,t):this.ddResizable&&-1<["resizestart","resize","resizestop"].indexOf(e)&&this.ddResizable.on(e,t),this}off(e){return this.ddDraggable&&-1<["drag","dragstart","dragstop"].indexOf(e)?this.ddDraggable.off(e):this.ddDroppable&&-1<["drop","dropover","dropout"].indexOf(e)?this.ddDroppable.off(e):this.ddResizable&&-1<["resizestart","resize","resizestop"].indexOf(e)&&this.ddResizable.off(e),this}setupDraggable(e){return this.ddDraggable?this.ddDraggable.updateOption(e):this.ddDraggable=new b(this.el,e),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(e){return this.ddResizable?this.ddResizable.updateOption(e):this.ddResizable=new f(this.el,e),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(e){return this.ddDroppable?this.ddDroppable.updateOption(e):this.ddDroppable=new w(this.el,e),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}}const x=new class{resizable(e,s,o,r){return this._getDDElements(e).forEach(e=>{if("disable"===s||"enable"===s)e.ddResizable&&e.ddResizable[s]();else if("destroy"===s)e.ddResizable&&e.cleanResizable();else if("option"===s)e.setupResizable({[o]:r});else{const o=e.el.gridstackNode.grid;var t=e.el.getAttribute("gs-resize-handles")?e.el.getAttribute("gs-resize-handles"):o.opts.resizable.handles,i=!o.opts.alwaysShowResizeHandle;e.setupResizable({...o.opts.resizable,handles:t,autoHide:i,start:s.start,stop:s.stop,resize:s.resize})}}),this}draggable(e,t,i,s){return this._getDDElements(e).forEach(e=>{if("disable"===t||"enable"===t)e.ddDraggable&&e.ddDraggable[t]();else if("destroy"===t)e.ddDraggable&&e.cleanDraggable();else if("option"===t)e.setupDraggable({[i]:s});else{const i=e.el.gridstackNode.grid;e.setupDraggable({...i.opts.draggable,start:t.start,stop:t.stop,drag:t.drag})}}),this}dragIn(e,t){return this._getDDElements(e).forEach(e=>e.setupDraggable(t)),this}droppable(e,t,i,s){return"function"!=typeof t.accept||t._accept||(t._accept=t.accept,t.accept=e=>t._accept(e)),this._getDDElements(e).forEach(e=>{"disable"===t||"enable"===t?e.ddDroppable&&e.ddDroppable[t]():"destroy"===t?e.ddDroppable&&e.cleanDroppable():"option"===t?e.setupDroppable({[i]:s}):e.setupDroppable(t)}),this}isDroppable(e){return!(!(e&&e.ddElement&&e.ddElement.ddDroppable)||e.ddElement.ddDroppable.disabled)}isDraggable(e){return!(!(e&&e.ddElement&&e.ddElement.ddDraggable)||e.ddElement.ddDraggable.disabled)}isResizable(e){return!(!(e&&e.ddElement&&e.ddElement.ddResizable)||e.ddElement.ddResizable.disabled)}on(e,t,i){return this._getDDElements(e).forEach(e=>e.on(t,e=>{i(e,l.dragElement?l.dragElement.el:e.target,l.dragElement?l.dragElement.helper:null)})),this}off(e,t){return this._getDDElements(e).forEach(e=>e.off(t)),this}_getDDElements(e,t=!0){let i=v.getElements(e);if(!i.length)return[];let s=i.map(e=>e.ddElement||(t?E.init(e):null));return t||s.filter(e=>e),s}};class R{static init(e={},t=".grid-stack"){let i=R.getGridElement(t);return i?(i.gridstack||(i.gridstack=new R(i,v.cloneDeep(e))),i.gridstack):("string"==typeof t?console.error('GridStack.initAll() no grid was found with selector "'+t+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)}static initAll(t={},e=".grid-stack"){let i=[];return R.getGridElements(e).forEach(e=>{e.gridstack||(e.gridstack=new R(e,v.cloneDeep(t))),i.push(e.gridstack)}),0===i.length&&console.error('GridStack.initAll() no grid was found with selector "'+e+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'),i}static addGrid(t,i={}){if(!t)return null;let s=t;if(s.gridstack){const t=s.gridstack;return i&&(t.opts={...t.opts,...i}),void 0!==i.children&&t.load(i.children),t}if(!t.classList.contains("grid-stack")||R.addRemoveCB)if(R.addRemoveCB)s=R.addRemoveCB(t,i,!0,!0);else{let e=document.implementation.createHTMLDocument("");e.body.innerHTML=`
`,s=e.body.children[0],t.appendChild(s)}return R.init(i,s)}static registerEngine(e){R.engineClass=e}get placeholder(){if(!this._placeholder){let e=document.createElement("div");e.className="placeholder-content",this.opts.placeholderText&&(e.innerHTML=this.opts.placeholderText),this._placeholder=document.createElement("div"),this._placeholder.classList.add(this.opts.placeholderClass,a.itemClass,this.opts.itemClass),this.placeholder.appendChild(e)}return this._placeholder}constructor(e,t={}){this._gsEventHandler={},this._extraDragRow=0,t=t||{},(this.el=e).classList.contains("grid-stack")||this.el.classList.add("grid-stack"),t.row&&(t.minRow=t.maxRow=t.row,delete t.row);var i=v.toNumber(e.getAttribute("gs-row"));"auto"===t.column&&delete t.column,void 0!==t.alwaysShowResizeHandle&&(t._alwaysShowResizeHandle=t.alwaysShowResizeHandle);let s={...v.cloneDeep(a),column:v.toNumber(e.getAttribute("gs-column"))||a.column,minRow:i||v.toNumber(e.getAttribute("gs-min-row"))||a.minRow,maxRow:i||v.toNumber(e.getAttribute("gs-max-row"))||a.maxRow,staticGrid:v.toBool(e.getAttribute("gs-static"))||a.staticGrid,draggable:{handle:(t.handleClass?"."+t.handleClass:t.handle||"")||a.draggable.handle},removableOptions:{accept:t.itemClass?"."+t.itemClass:a.removableOptions.accept}},o=(e.getAttribute("gs-animate")&&(s.animate=v.toBool(e.getAttribute("gs-animate"))),this.opts=v.defaults(t,s),t=null,this._initMargin(),1!==this.opts.column&&!this.opts.disableOneColumnMode&&this._widthOrContainer()<=this.opts.oneColumnSize&&(this._prevColumn=this.getColumn(),this.opts.column=1),"auto"===this.opts.rtl&&(this.opts.rtl="rtl"===e.style.direction),this.opts.rtl&&this.el.classList.add("grid-stack-rtl"),v.closestUpByClass(this.el,a.itemClass)?.gridstackNode),r=(o&&((o.subGrid=this).parentGridItem=o,this.el.classList.add("grid-stack-nested"),o.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight="auto"===this.opts.cellHeight,this._isAutoCellHeight||"initial"===this.opts.cellHeight?this.cellHeight(void 0,!1):("number"==typeof this.opts.cellHeight&&this.opts.cellHeightUnit&&this.opts.cellHeightUnit!==a.cellHeightUnit&&(this.opts.cellHeight=this.opts.cellHeight+this.opts.cellHeightUnit,delete this.opts.cellHeightUnit),this.cellHeight(this.opts.cellHeight,!1)),"mobile"===this.opts.alwaysShowResizeHandle&&(this.opts.alwaysShowResizeHandle=h),this._styleSheetClass="gs-id-"+n._idSeq++,this.el.classList.add(this._styleSheetClass),this._setStaticClass(),this.opts.engineClass||R.engineClass||n);this.engine=new r({column:this.getColumn(),float:this.opts.float,maxRow:this.opts.maxRow,onChange:e=>{let t=0;this.engine.nodes.forEach(e=>{t=Math.max(t,e.y+e.h)}),e.forEach(e=>{let t=e.el;t&&(e._removeDOM?(t&&t.remove(),delete e._removeDOM):this._writePosAttr(t,e))}),this._updateStyles(!1,t)}}),this.opts.auto&&(this.batchUpdate(),this.getGridItems().forEach(e=>this._prepareElement(e)),this.batchUpdate(!1)),this.opts.children&&(i=this.opts.children,delete this.opts.children,i.length&&this.load(i)),this.setAnimation(this.opts.animate),this._updateStyles(),this.el.classList.add("gs-"+this.opts.column),this.opts.subGridDynamic&&!l.pauseDrag&&(l.pauseDrag=!0),void 0!==this.opts.draggable?.pause&&(l.pauseDrag=this.opts.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateWindowResizeEvent()}addWidget(t,i){let s,o;if("string"==typeof t){let e=document.implementation.createHTMLDocument("");e.body.innerHTML=t,s=e.body.children[0]}else if(0===arguments.length||1===arguments.length&&(void 0!==t.el||void 0!==t.x||void 0!==t.y||void 0!==t.w||void 0!==t.h||void 0!==t.content))if((o=i=t)?.el)s=o.el;else if(R.addRemoveCB)s=R.addRemoveCB(this.el,i,!0,!1);else{let e=i?.content||"",t=document.implementation.createHTMLDocument("");t.body.innerHTML=`
${e}
`,s=t.body.children[0]}else s=t;if(s){if((o=s.gridstackNode)&&s.parentElement===this.el&&this.engine.nodes.find(e=>e._id===o._id))return s;t=this._readAttr(s);return i=v.cloneDeep(i)||{},v.defaults(i,t),o=this.engine.prepareNode(i),this._writeAttr(s,i),this._insertNotAppend?this.el.prepend(s):this.el.appendChild(s),this.makeWidget(s,i),s}}makeSubGrid(e,s,o,t=!0){let i,r=e.gridstackNode;if((r=r||this.makeWidget(e).gridstackNode).subGrid?.el)return r.subGrid;let n,l=this;for(;l&&!i;)i=l.opts?.subGridOpts,l=l.parentGridItem?.grid;s=v.cloneDeep({...i||{},children:void 0,...s||r.subGridOpts}),"auto"===(r.subGridOpts=s).column&&(n=!0,s.column=Math.max(r.w||1,o?.w||1),s.disableOneColumnMode=!0);let h,a,d=r.el.querySelector(".grid-stack-item-content");if(t){if(this._removeDD(r.el),a={...r,x:0,y:0},v.removeInternalForSave(a),delete a.subGridOpts,r.content&&(a.content=r.content,delete r.content),R.addRemoveCB)h=R.addRemoveCB(this.el,a,!0,!1);else{let e=document.implementation.createHTMLDocument("");e.body.innerHTML='
',(h=e.body.children[0]).appendChild(d),e.body.innerHTML='
',d=e.body.children[0],r.el.appendChild(d)}this._prepareDragDropByNode(r)}if(o){let e=n?s.column:r.w,t=r.h+o.h,i=r.el.style;i.transition="none",this.update(r.el,{w:e,h:t}),setTimeout(()=>i.transition=null)}let p=r.subGrid=R.addGrid(d,s);return o?._moving&&(p._isTemp=!0),n&&(p._autoColumn=!0),t&&p.addWidget(h,a),o&&(o._moving?window.setTimeout(()=>v.simulateMouseEvent(o._event,"mouseenter",p.el),0):p.addWidget(r.el,r)),p}removeAsSubGrid(e){let t=this.parentGridItem?.grid;t&&(t.batchUpdate(),t.removeWidget(this.parentGridItem.el,!0,!0),this.engine.nodes.forEach(e=>{e.x+=this.parentGridItem.x,e.y+=this.parentGridItem.y,t.addWidget(e.el,e)}),t.batchUpdate(!1),this.parentGridItem&&delete this.parentGridItem.subGrid,delete this.parentGridItem,e&&window.setTimeout(()=>v.simulateMouseEvent(e._event,"mouseenter",t.el),0))}save(i=!0,s=!1,o=R.saveCB){let t=this.engine.save(i,o);if(t.forEach(e=>{var t;i&&e.el&&!e.subGrid&&!o?(t=e.el.querySelector(".grid-stack-item-content"),e.content=t?t.innerHTML:void 0,e.content||delete e.content):(i||o||delete e.content,e.subGrid?.el&&(t=e.subGrid.save(i,s,o),e.subGridOpts=s?t:{children:t},delete e.subGrid)),delete e.el}),s){let e=v.cloneDeep(this.opts);e.marginBottom===e.marginTop&&e.marginRight===e.marginLeft&&e.marginTop===e.marginRight&&(e.margin=e.marginTop,delete e.marginTop,delete e.marginRight,delete e.marginBottom,delete e.marginLeft),e.rtl===("rtl"===this.el.style.direction)&&(e.rtl="auto"),this._isAutoCellHeight&&(e.cellHeight="auto"),this._autoColumn&&(e.column="auto",delete e.disableOneColumnMode);const s=e._alwaysShowResizeHandle;return delete e._alwaysShowResizeHandle,void 0!==s?e.alwaysShowResizeHandle=s:delete e.alwaysShowResizeHandle,v.removeInternalAndSame(e,a),e.children=t,e}return t}load(e,s=R.addRemoveCB||!0){let i=R.Utils.sort([...e],-1,this._prevColumn||this.getColumn());this._insertNotAppend=!0,this._prevColumn&&this._prevColumn!==this.opts.column&&i.some(e=>e.x+e.w>this.opts.column)&&(this._ignoreLayoutsNodeChange=!0,this.engine.cacheLayout(i,this._prevColumn,!0));e=R.addRemoveCB;"function"==typeof s&&(R.addRemoveCB=s);let o=[];return this.batchUpdate(),s&&[...this.engine.nodes].forEach(t=>{i.find(e=>t.id===e.id)||(R.addRemoveCB&&R.addRemoveCB(this.el,t,!1,!1),o.push(t),this.removeWidget(t.el,!0,!1))}),i.forEach(t=>{let i=void 0!==t.id?this.engine.nodes.find(e=>e.id===t.id):void 0;if(i){if(this.update(i.el,t),t.subGridOpts?.children){let e=i.el.querySelector(".grid-stack");e&&e.gridstack&&(e.gridstack.load(t.subGridOpts.children),this._insertNotAppend=!0)}}else s&&this.addWidget(t)}),this.engine.removedNodes=o,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this._insertNotAppend,e?R.addRemoveCB=e:delete R.addRemoveCB,this}batchUpdate(e=!0){return this.engine.batchUpdate(e),e||(this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this}getCellHeight(e=!1){if(this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!e||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;let t=this.el.querySelector("."+this.opts.itemClass);if(t)return e=v.toNumber(t.getAttribute("gs-h"))||1,Math.round(t.offsetHeight/e);e=parseInt(this.el.getAttribute("gs-current-row"));return e?Math.round(this.el.getBoundingClientRect().height/e):this.opts.cellHeight}cellHeight(e,t=!0){t&&void 0!==e&&this._isAutoCellHeight!==("auto"===e)&&(this._isAutoCellHeight="auto"===e,this._updateWindowResizeEvent()),void 0===(e="initial"!==e&&"auto"!==e?e:void 0)&&(i=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom,e=this.cellWidth()+i);var i=v.parseHeight(e);return this.opts.cellHeightUnit===i.unit&&this.opts.cellHeight===i.h||(this.opts.cellHeightUnit=i.unit,this.opts.cellHeight=i.h,t&&this._updateStyles(!0)),this}cellWidth(){return this._widthOrContainer()/this.getColumn()}_widthOrContainer(){return this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth}compact(e="compact",t=!0){return this.engine.compact(e,t),this._triggerChangeEvent(),this}column(e,t="moveScale"){if(e<1||this.opts.column===e)return this;let i,s=this.getColumn();return 1===e?this._prevColumn=s:delete this._prevColumn,this.el.classList.remove("gs-"+s),this.el.classList.add("gs-"+e),1===(this.opts.column=this.engine.column=e)&&this.opts.oneColumnModeDomSort&&(i=[],this.getGridItems().forEach(e=>{e.gridstackNode&&i.push(e.gridstackNode)}),i.length||(i=void 0)),this.engine.columnChanged(s,e,i,t),this._isAutoCellHeight&&this.cellHeight(),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter(e=>e.matches("."+this.opts.itemClass)&&!e.matches("."+this.opts.placeholderClass))}destroy(e=!0){if(this.el)return this.offAll(),this._updateWindowResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),e?this.el.parentNode.removeChild(this.el):(this.removeAll(e),this.el.classList.remove(this._styleSheetClass),this.el.removeAttribute("gs-current-row")),this._removeStylesheet(),this.parentGridItem&&delete this.parentGridItem.subGrid,delete this.parentGridItem,delete this.opts,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}float(e){return this.opts.float!==e&&(this.opts.float=this.engine.float=e,this._triggerChangeEvent()),this}getFloat(){return this.engine.float}getCellFromPixel(e,t=!1){var i=this.el.getBoundingClientRect(),t=t?{top:i.top+document.documentElement.scrollTop,left:i.left}:{top:this.el.offsetTop,left:this.el.offsetLeft},s=e.left-t.left,e=e.top-t.top,t=i.width/this.getColumn(),i=i.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(s/t),y:Math.floor(e/i)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow)}isAreaEmpty(e,t,i,s){return this.engine.isAreaEmpty(e,t,i,s)}makeWidget(e,t){e=R.getElement(e),this._prepareElement(e,!0,t),this._updateContainerHeight(),t=e.gridstackNode;return t.subGridOpts&&this.makeSubGrid(e,t.subGridOpts,void 0,!1),this._prevColumn&&1===this.opts.column&&(this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,e}on(e,t){return-1!==e.indexOf(" ")?e.split(" ").forEach(e=>this.on(e,t)):"change"===e||"added"===e||"removed"===e||"enable"===e||"disable"===e?(this._gsEventHandler[e]="enable"===e||"disable"===e?e=>t(e):e=>t(e,e.detail),this.el.addEventListener(e,this._gsEventHandler[e])):"drag"===e||"dragstart"===e||"dragstop"===e||"resizestart"===e||"resize"===e||"resizestop"===e||"dropped"===e?this._gsEventHandler[e]=t:console.log("GridStack.on("+e+') event not supported, but you can still use $(".grid-stack").on(...) while jquery-ui is still used internally.'),this}off(e){return-1!==e.indexOf(" ")?e.split(" ").forEach(e=>this.off(e)):("change"!==e&&"added"!==e&&"removed"!==e&&"enable"!==e&&"disable"!==e||this._gsEventHandler[e]&&this.el.removeEventListener(e,this._gsEventHandler[e]),delete this._gsEventHandler[e]),this}offAll(){return Object.keys(this._gsEventHandler).forEach(e=>this.off(e)),this}removeWidget(e,i=!0,s=!0){return R.getElements(e).forEach(t=>{if(!t.parentElement||t.parentElement===this.el){let e=t.gridstackNode;(e=e||this.engine.nodes.find(e=>t===e.el))&&(R.addRemoveCB&&R.addRemoveCB(this.el,e,!1,!1),delete t.gridstackNode,this._removeDD(t),this.engine.removeNode(e,i,s),i&&t.parentElement&&t.remove())}}),s&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this}removeAll(e=!0){return this.engine.nodes.forEach(e=>{delete e.el.gridstackNode,this._removeDD(e.el)}),this.engine.removeAll(e),this._triggerRemoveEvent(),this}setAnimation(e){return e?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this}setStatic(t,i=!0,s=!0){return!!this.opts.staticGrid!==t&&(t?this.opts.staticGrid=!0:delete this.opts.staticGrid,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach(e=>{this._prepareDragDropByNode(e),e.subGrid&&s&&e.subGrid.setStatic(t,i,s)}),i&&this._setStaticClass()),this}update(e,l){var t,i;return 2{if(n&&n.gridstackNode){let t=n.gridstackNode,i=v.cloneDeep(l);delete i.autoPosition;let s,e=["x","y","w","h"];if(e.some(e=>void 0!==i[e]&&i[e]!==t[e])&&(s={},e.forEach(e=>{s[e]=(void 0!==i[e]?i:t)[e],delete i[e]})),!s&&(i.minW||i.minH||i.maxW||i.maxH)&&(s={}),i.content){let e=n.querySelector(".grid-stack-item-content");e&&e.innerHTML!==i.content&&(e.innerHTML=i.content),delete i.content}let o=!1,r=!1;for(const n in i)"_"!==n[0]&&t[n]!==i[n]&&(t[n]=i[n],o=!0,r=r||!this.opts.staticGrid&&("noResize"===n||"noMove"===n||"locked"===n));v.sanitizeMinMax(t),s&&(this.engine.cleanNodes().beginUpdate(t).moveNode(t,s),this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()),o&&this._writeAttr(n,t),r&&this._prepareDragDropByNode(t)}}),this)}margin(e){if(!("string"==typeof e&&1{delete e._dirty}),this._triggerEvent("added",this.engine.addedNodes),this.engine.addedNodes=[]),this}_triggerRemoveEvent(){return this.engine.batchMode||this.engine.removedNodes?.length&&(this._triggerEvent("removed",this.engine.removedNodes),this.engine.removedNodes=[]),this}_triggerEvent(e,t){t=t?new CustomEvent(e,{bubbles:!1,detail:t}):new Event(e);return this.el.dispatchEvent(t),this}_removeStylesheet(){return this._styles&&(v.removeStylesheet(this._styleSheetClass),delete this._styles),this}_updateStyles(e=!1,t){if(e&&this._removeStylesheet(),t=t||this.getRow(),this._updateContainerHeight(),0===this.opts.cellHeight)return this;let i=this.opts.cellHeight,s=this.opts.cellHeightUnit,o=`.${this._styleSheetClass} > .`+this.opts.itemClass;if(!this._styles){e=this.opts.styleInHead?void 0:this.el.parentNode;if(this._styles=v.createStylesheet(this._styleSheetClass,e,{nonce:this.opts.nonce}),!this._styles)return this;this._styles._max=0,v.addCSSRule(this._styles,o,"height: "+i+s);var e=this.opts.marginTop+this.opts.marginUnit,r=this.opts.marginBottom+this.opts.marginUnit,n=this.opts.marginRight+this.opts.marginUnit,l=this.opts.marginLeft+this.opts.marginUnit,h=o+" > .grid-stack-item-content",a=`.${this._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;v.addCSSRule(this._styles,h,`top: ${e}; right: ${n}; bottom: ${r}; left: ${l};`),v.addCSSRule(this._styles,a,`top: ${e}; right: ${n}; bottom: ${r}; left: ${l};`),v.addCSSRule(this._styles,o+" > .ui-resizable-ne","right: "+n),v.addCSSRule(this._styles,o+" > .ui-resizable-e","right: "+n),v.addCSSRule(this._styles,o+" > .ui-resizable-se",`right: ${n}; bottom: `+r),v.addCSSRule(this._styles,o+" > .ui-resizable-nw","left: "+l),v.addCSSRule(this._styles,o+" > .ui-resizable-w","left: "+l),v.addCSSRule(this._styles,o+" > .ui-resizable-sw",`left: ${l}; bottom: `+r)}if((t=t||this._styles._max)>this._styles._max){var d=e=>i*e+s;for(let e=this._styles._max+1;e<=t;e++)v.addCSSRule(this._styles,o+`[gs-y="${e}"]`,"top: "+d(e)),v.addCSSRule(this._styles,o+`[gs-h="${e+1}"]`,"height: "+d(e+1));this._styles._max=t}return this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;var e=this.getRow()+this._extraDragRow;if(this.el.setAttribute("gs-current-row",String(e)),0===e)return this.el.style.removeProperty("min-height"),this;var t=this.opts.cellHeight,i=this.opts.cellHeightUnit;return t&&(this.el.style.minHeight=e*t+i),this}_prepareElement(e,t=!1,i){e.classList.add(this.opts.itemClass),i=i||this._readAttr(e),(e.gridstackNode=i).el=e,i.grid=this;var s={...i};return i=this.engine.addNode(i,t),v.same(i,s)||this._writeAttr(e,i),this._prepareDragDropByNode(i),this}_writePosAttr(e,t){return void 0!==t.x&&null!==t.x&&e.setAttribute("gs-x",String(t.x)),void 0!==t.y&&null!==t.y&&e.setAttribute("gs-y",String(t.y)),1this.cellHeight(),this.opts.cellHeightThrottle)),this._cellHeightThrottle()):this.cellHeight()),this.engine.nodes.forEach(e=>{e.subGrid&&e.subGrid.onParentResize()}),this}}_updateWindowResizeEvent(e=!1){var t=(this._isAutoCellHeight||!this.opts.disableOneColumnMode)&&!this.parentGridItem;return e||!t||this._windowResizeBind?!e&&t||!this._windowResizeBind||(window.removeEventListener("resize",this._windowResizeBind),delete this._windowResizeBind):(this._windowResizeBind=this.onParentResize.bind(this),window.addEventListener("resize",this._windowResizeBind)),this}static getElement(e=".grid-stack-item"){return v.getElement(e)}static getElements(e=".grid-stack-item"){return v.getElements(e)}static getGridElement(e){return R.getElement(e)}static getGridElements(e){return v.getElements(e)}_initMargin(){let e,t=0,i=[];return 2===(i="string"==typeof this.opts.margin?this.opts.margin.split(" "):i).length?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):4===i.length?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(e=v.parseHeight(this.opts.margin),this.opts.marginUnit=e.unit,t=this.opts.margin=e.h),void 0===this.opts.marginTop?this.opts.marginTop=t:(e=v.parseHeight(this.opts.marginTop),this.opts.marginTop=e.h,delete this.opts.margin),void 0===this.opts.marginBottom?this.opts.marginBottom=t:(e=v.parseHeight(this.opts.marginBottom),this.opts.marginBottom=e.h,delete this.opts.margin),void 0===this.opts.marginRight?this.opts.marginRight=t:(e=v.parseHeight(this.opts.marginRight),this.opts.marginRight=e.h,delete this.opts.margin),void 0===this.opts.marginLeft?this.opts.marginLeft=t:(e=v.parseHeight(this.opts.marginLeft),this.opts.marginLeft=e.h,delete this.opts.margin),this.opts.marginUnit=e.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop),this}static getDD(){return x}static setupDragIn(e,t,i=document){void 0!==t?.pause&&(l.pauseDrag=t.pause),t={...o,...t||{}};let s="string"==typeof e?v.getElements(e,i):e;s.length&&s?.forEach(e=>{x.isDraggable(e)||x.dragIn(e,t)})}movable(e,i){return this.opts.staticGrid||R.getElements(e).forEach(e=>{let t=e.gridstackNode;t&&(i?delete t.noMove:t.noMove=!0,this._prepareDragDropByNode(t))}),this}resizable(e,i){return this.opts.staticGrid||R.getElements(e).forEach(e=>{let t=e.gridstackNode;t&&(i?delete t.noResize:t.noResize=!0,this._prepareDragDropByNode(t))}),this}disable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!1,e),this.enableResize(!1,e),this._triggerEvent("disable"),this}enable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!0,e),this.enableResize(!0,e),this._triggerEvent("enable"),this}enableMove(t,i=!0){return this.opts.staticGrid||(t?delete this.opts.disableDrag:this.opts.disableDrag=!0,this.engine.nodes.forEach(e=>{this._prepareDragDropByNode(e),e.subGrid&&i&&e.subGrid.enableMove(t,i)})),this}enableResize(t,i=!0){return this.opts.staticGrid||(t?delete this.opts.disableResize:this.opts.disableResize=!0,this.engine.nodes.forEach(e=>{this._prepareDragDropByNode(e),e.subGrid&&i&&e.subGrid.enableResize(t,i)})),this}_removeDD(e){return x.draggable(e,"destroy").resizable(e,"destroy"),e.gridstackNode&&delete e.gridstackNode._initDD,delete e.ddElement,this}_setupAcceptWidget(){if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return x.droppable(this.el,"destroy"),this;let l,h,n=(e,t,i)=>{let s=t.gridstackNode;if(s){i=i||t;var o=this.el.getBoundingClientRect(),{top:r,left:n}=i.getBoundingClientRect(),o=(n-=o.left,{position:{top:r-=o.top,left:n}});if(s._temporaryRemoved){if(s.x=Math.max(0,Math.round(n/h)),s.y=Math.max(0,Math.round(r/l)),delete s.autoPosition,this.engine.nodeBoundFix(s),!this.engine.willItFit(s)){if(s.autoPosition=!0,!this.engine.willItFit(s))return void x.off(t,"drag");s._willFitPos&&(v.copyPos(s,s._willFitPos),delete s._willFitPos)}this._onStartMoving(i,e,o,s,h,l)}else this._dragOrResize(i,e,o,s,h,l)}};return x.droppable(this.el,{accept:e=>{var t,i=e.gridstackNode;if(i?.grid===this)return!0;if(!this.opts.acceptWidgets)return!1;let s=!0;return(s="function"==typeof this.opts.acceptWidgets?this.opts.acceptWidgets(e):(t=!0===this.opts.acceptWidgets?".grid-stack-item":this.opts.acceptWidgets,e.matches(t)))&&i&&this.opts.maxRow&&(e={w:i.w,h:i.h,minW:i.minW,minH:i.minH},s=this.engine.willItFit(e)),s}}).on(this.el,"dropover",(e,t,i)=>{let s=t.gridstackNode;if(s?.grid===this&&!s._temporaryRemoved)return!1;s?.grid&&s.grid!==this&&!s._temporaryRemoved&&s.grid._leave(t,i),h=this.cellWidth(),l=this.getCellHeight(!0),(s=s||this._readAttr(t,!1)).grid||(s._isExternal=!0,t.gridstackNode=s),i=i||t;var o=s.w||Math.round(i.offsetWidth/h)||1,r=s.h||Math.round(i.offsetHeight/l)||1;return s.grid&&s.grid!==this?(t._gridstackNodeOrig||(t._gridstackNodeOrig=s),t.gridstackNode=s={...s,w:o,h:r,grid:this},this.engine.cleanupNode(s).nodeBoundFix(s),s._initDD=s._isExternal=s._temporaryRemoved=!0):(s.w=o,s.h=r,s._temporaryRemoved=!0),this._itemRemoving(s.el,!1),x.on(t,"drag",n),n(e,t,i),!1}).on(this.el,"dropout",(e,t,i)=>{var s=t.gridstackNode;return!!s&&(s.grid&&s.grid!==this||(this._leave(t,i),this._isTemp&&this.removeAsSubGrid(s)),!1)}).on(this.el,"drop",(e,t,i)=>{let s=t.gridstackNode;if(s?.grid===this&&!s._isExternal)return!1;var o=!!this.placeholder.parentElement,r=(this.placeholder.remove(),t._gridstackNodeOrig);if(delete t._gridstackNodeOrig,o&&r?.grid&&r.grid!==this){let e=r.grid;e.engine.removedNodes.push(r),e._triggerRemoveEvent()._triggerChangeEvent(),e.parentGridItem&&!e.engine.nodes.length&&e.opts.subGridDynamic&&e.removeAsSubGrid()}if(!s)return!1;if(o&&(this.engine.cleanupNode(s),s.grid=this),x.off(t,"drag"),i!==t?(i.remove(),t.gridstackNode=r,o&&(t=t.cloneNode(!0))):(t.remove(),this._removeDD(t)),!o)return!1;(t.gridstackNode=s).el=t;let n=s.subGrid?.el?.gridstack;return v.copyPos(s,this._readAttr(this.placeholder)),v.removePositioningStyles(t),this._writeAttr(t,s),t.classList.add(a.itemClass,this.opts.itemClass),this.el.appendChild(t),n&&(n.parentGridItem=s,n.opts.styleInHead||n._updateStyles(!0)),this._updateContainerHeight(),this.engine.addedNodes.push(s),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped({...e,type:"dropped"},r&&r.grid?r:void 0,s),window.setTimeout(()=>{s.el&&s.el.parentElement?this._prepareDragDropByNode(s):this.engine.removeNode(s),delete s.grid._isTemp}),!1}),this}_itemRemoving(e,t){let i=e?e.gridstackNode:void 0;i&&i.grid&&(t?i._isAboutToRemove=!0:delete i._isAboutToRemove,t?e.classList.add("grid-stack-item-removing"):e.classList.remove("grid-stack-item-removing"))}_setupRemoveDrop(){if(!this.opts.staticGrid&&"string"==typeof this.opts.removable){var e=document.querySelector(this.opts.removable);if(!e)return this;x.isDroppable(e)||x.droppable(e,this.opts.removableOptions).on(e,"dropover",(e,t)=>this._itemRemoving(t,!0)).on(e,"dropout",(e,t)=>this._itemRemoving(t,!1))}return this}_prepareDragDropByNode(r){let n=r.el;var e=r.noMove||this.opts.disableDrag,t=r.noResize||this.opts.disableResize;if(this.opts.staticGrid||e&&t)return r._initDD&&(this._removeDD(n),delete r._initDD),n.classList.add("ui-draggable-disabled","ui-resizable-disabled"),this;if(!r._initDD){let i,s,e=(e,t)=>{this._gsEventHandler[e.type]&&this._gsEventHandler[e.type](e,e.target),i=this.cellWidth(),s=this.getCellHeight(!0),this._onStartMoving(n,e,t,r,i,s)},t=(e,t)=>{this._dragOrResize(n,e,t,r,i,s)},o=t=>{this.placeholder.remove(),delete r._moving,delete r._event,delete r._lastTried;var i=t.target;if(i.gridstackNode&&i.gridstackNode.grid===this){if(r.el=i,r._isAboutToRemove){let e=n.gridstackNode.grid;e._gsEventHandler[t.type]&&e._gsEventHandler[t.type](t,i),this._removeDD(n),e.engine.removedNodes.push(r),e._triggerRemoveEvent(),delete n.gridstackNode,delete r.el,n.remove()}else v.removePositioningStyles(i),r._temporaryRemoved?(v.copyPos(r,r._orig),this._writePosAttr(i,r),this.engine.addNode(r)):this._writePosAttr(i,r),this._gsEventHandler[t.type]&&this._gsEventHandler[t.type](t,i);this._extraDragRow=0,this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()}};x.draggable(n,{start:e,stop:o,drag:t}).resizable(n,{start:e,stop:o,resize:t}),r._initDD=!0}return x.draggable(n,e?"disable":"enable").resizable(n,t?"disable":"enable"),this}_onStartMoving(e,t,i,s,o,r){this.engine.cleanNodes().beginUpdate(s),this._writePosAttr(this.placeholder,s),this.el.appendChild(this.placeholder),s.el=this.placeholder,s._lastUiPosition=i.position,s._prevYPix=i.position.top,s._moving="dragstart"===t.type,delete s._lastTried,"dropover"===t.type&&s._temporaryRemoved&&(this.engine.addNode(s),s._moving=!0),this.engine.cacheRects(o,r,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),"resizestart"===t.type&&(x.resizable(e,"option","minWidth",o*(s.minW||1)).resizable(e,"option","minHeight",r*(s.minH||1)),s.maxW&&x.resizable(e,"option","maxWidth",o*s.maxW),s.maxH&&x.resizable(e,"option","maxHeight",r*s.maxH))}_dragOrResize(e,t,i,s,o,r){let n,l={...s._orig},h=this.opts.marginLeft,a=this.opts.marginRight,d=this.opts.marginTop,p=this.opts.marginBottom,g=Math.round(.1*r),u=Math.round(.1*o);if(h=Math.min(h,u),a=Math.min(a,u),d=Math.min(d,g),p=Math.min(p,g),"drag"===t.type){if(s._temporaryRemoved)return;var c=i.position.top-s._prevYPix,c=(s._prevYPix=i.position.top,!1!==this.opts.draggable.scroll&&v.updateScrollPosition(e,i.position,c),i.position.left+(i.position.left>s._lastUiPosition.left?-a:h)),m=i.position.top+(i.position.top>s._lastUiPosition.top?-p:d),c=(l.x=Math.round(c/o),l.y=Math.round(m/r),this._extraDragRow);if(this.engine.collide(s,l)){let e=this.getRow(),t=Math.max(0,l.y+s.h-e);this.opts.maxRow&&e+t>this.opts.maxRow&&(t=Math.max(0,this.opts.maxRow-e)),this._extraDragRow=t}else this._extraDragRow=0;if(this._extraDragRow!==c&&this._updateContainerHeight(),s.x===l.x&&s.y===l.y)return}else if("resize"===t.type){if(l.x<0)return;if(v.updateScrollResize(t,e,r),l.w=Math.round((i.size.width-h)/o),l.h=Math.round((i.size.height-d)/r),s.w===l.w&&s.h===l.h)return;if(s._lastTried&&s._lastTried.w===l.w&&s._lastTried.h===l.h)return;m=i.position.left+h,c=i.position.top+d;l.x=Math.round(m/o),l.y=Math.round(c/r),n=!0}s._event=t,s._lastTried=l;e={x:i.position.left+h,y:i.position.top+d,w:(i.size?i.size.width:s.w*o)-h-a,h:(i.size?i.size.height:s.h*r)-d-p};this.engine.moveNodeCheck(s,{...l,cellWidth:o,cellHeight:r,rect:e,resizing:n})&&(s._lastUiPosition=i.position,this.engine.cacheRects(o,r,d,a,p,h),delete s._skipDown,n&&s.subGrid&&s.subGrid.onParentResize(),this._extraDragRow=0,this._updateContainerHeight(),m=t.target,this._writePosAttr(m,s),this._gsEventHandler[t.type]&&this._gsEventHandler[t.type](t,m))}_leave(e,t){let i=e.gridstackNode;i&&(x.off(e,"drag"),i._temporaryRemoved||(i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&t?t:e,!0===this.opts.removable&&this._itemRemoving(e,!0),e._gridstackNodeOrig?(e.gridstackNode=e._gridstackNodeOrig,delete e._gridstackNodeOrig):i._isExternal&&(delete i.el,delete e.gridstackNode,this.engine.restoreInitial())))}commit(){return this.batchUpdate(!1).prototype,this}}return R.Utils=v,R.Engine=n,R.GDRev="8.3.0",e.GridStack})()); \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/scripts/plugins/gridstack.js/gridstack.min.css b/Implem.Pleasanter/wwwroot/scripts/plugins/gridstack.js/gridstack.min.css new file mode 100644 index 000000000..dec30697c --- /dev/null +++ b/Implem.Pleasanter/wwwroot/scripts/plugins/gridstack.js/gridstack.min.css @@ -0,0 +1 @@ +.grid-stack{position:relative}.grid-stack-rtl{direction:ltr}.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack-placeholder>.placeholder-content{background-color:rgba(0,0,0,.1);margin:0;position:absolute;width:auto;z-index:0!important}.grid-stack>.grid-stack-item{position:absolute;top:0;left:0;padding:0}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack-item>.ui-resizable-ne,.grid-stack-item>.ui-resizable-nw,.grid-stack-item>.ui-resizable-se,.grid-stack-item>.ui-resizable-sw{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDUxMS42MjYgNTExLjYyNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTExLjYyNiA1MTEuNjI3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHBhdGggZD0iTTMyOC45MDYsNDAxLjk5NGgtMzYuNTUzVjEwOS42MzZoMzYuNTUzYzQuOTQ4LDAsOS4yMzYtMS44MDksMTIuODQ3LTUuNDI2YzMuNjEzLTMuNjE1LDUuNDIxLTcuODk4LDUuNDIxLTEyLjg0NSAgIGMwLTQuOTQ5LTEuODAxLTkuMjMxLTUuNDI4LTEyLjg1MWwtNzMuMDg3LTczLjA5QzI2NS4wNDQsMS44MDksMjYwLjc2LDAsMjU1LjgxMywwYy00Ljk0OCwwLTkuMjI5LDEuODA5LTEyLjg0Nyw1LjQyNCAgIGwtNzMuMDg4LDczLjA5Yy0zLjYxOCwzLjYxOS01LjQyNCw3LjkwMi01LjQyNCwxMi44NTFjMCw0Ljk0NiwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDVjMy42MTksMy42MTcsNy45MDEsNS40MjYsMTIuODUsNS40MjYgICBoMzYuNTQ1djI5Mi4zNThoLTM2LjU0MmMtNC45NTIsMC05LjIzNSwxLjgwOC0xMi44NSw1LjQyMWMtMy42MTcsMy42MjEtNS40MjQsNy45MDUtNS40MjQsMTIuODU0ICAgYzAsNC45NDUsMS44MDcsOS4yMjcsNS40MjQsMTIuODQ3bDczLjA4OSw3My4wODhjMy42MTcsMy42MTcsNy44OTgsNS40MjQsMTIuODQ3LDUuNDI0YzQuOTUsMCw5LjIzNC0xLjgwNywxMi44NDktNS40MjQgICBsNzMuMDg3LTczLjA4OGMzLjYxMy0zLjYyLDUuNDIxLTcuOTAxLDUuNDIxLTEyLjg0N2MwLTQuOTQ4LTEuODA4LTkuMjMyLTUuNDIxLTEyLjg1NCAgIEMzMzguMTQyLDQwMy44MDIsMzMzLjg1Nyw0MDEuOTk0LDMyOC45MDYsNDAxLjk5NHoiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K);background-repeat:no-repeat;background-position:center}.grid-stack-item>.ui-resizable-ne{transform:translate(0,10px) rotate(45deg)}.grid-stack-item>.ui-resizable-sw{transform:rotate(45deg)}.grid-stack-item>.ui-resizable-nw{transform:translate(0,10px) rotate(-45deg)}.grid-stack-item>.ui-resizable-se{transform:rotate(-45deg)}.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:0}.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:0;left:25px;right:25px}.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:0}.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px}.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px}.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:0;right:25px}.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px}.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px}.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none!important}.grid-stack-item.ui-draggable-dragging{will-change:left,top;cursor:move}.grid-stack-item.ui-resizable-resizing{will-change:width,height}.ui-draggable-dragging,.ui-resizable-resizing{z-index:10000}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px rgba(0,0,0,.2);opacity:.8}.grid-stack-animate,.grid-stack-animate .grid-stack-item{transition:left .3s,top .3s,height .3s,width .3s}.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack-animate .grid-stack-item.ui-resizable-resizing{transition:left 0s,top 0s,height 0s,width 0s}.gs-12>.grid-stack-item{width:8.333%}.gs-12>.grid-stack-item[gs-x="1"]{left:8.333%}.gs-12>.grid-stack-item[gs-w="2"]{width:16.667%}.gs-12>.grid-stack-item[gs-x="2"]{left:16.667%}.gs-12>.grid-stack-item[gs-w="3"]{width:25%}.gs-12>.grid-stack-item[gs-x="3"]{left:25%}.gs-12>.grid-stack-item[gs-w="4"]{width:33.333%}.gs-12>.grid-stack-item[gs-x="4"]{left:33.333%}.gs-12>.grid-stack-item[gs-w="5"]{width:41.667%}.gs-12>.grid-stack-item[gs-x="5"]{left:41.667%}.gs-12>.grid-stack-item[gs-w="6"]{width:50%}.gs-12>.grid-stack-item[gs-x="6"]{left:50%}.gs-12>.grid-stack-item[gs-w="7"]{width:58.333%}.gs-12>.grid-stack-item[gs-x="7"]{left:58.333%}.gs-12>.grid-stack-item[gs-w="8"]{width:66.667%}.gs-12>.grid-stack-item[gs-x="8"]{left:66.667%}.gs-12>.grid-stack-item[gs-w="9"]{width:75%}.gs-12>.grid-stack-item[gs-x="9"]{left:75%}.gs-12>.grid-stack-item[gs-w="10"]{width:83.333%}.gs-12>.grid-stack-item[gs-x="10"]{left:83.333%}.gs-12>.grid-stack-item[gs-w="11"]{width:91.667%}.gs-12>.grid-stack-item[gs-x="11"]{left:91.667%}.gs-12>.grid-stack-item[gs-w="12"]{width:100%}.gs-1>.grid-stack-item{width:100%} \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/scripts/sitesettings.js b/Implem.Pleasanter/wwwroot/scripts/sitesettings.js index 4a1237482..626fd95f8 100644 --- a/Implem.Pleasanter/wwwroot/scripts/sitesettings.js +++ b/Implem.Pleasanter/wwwroot/scripts/sitesettings.js @@ -241,4 +241,35 @@ $p.openRelatingColumnDialog = function ($control) { $p.setRelatingColumn = function ($control) { $p.setData($('#EditRelatingColumns'), $p.getData($control)); $p.send($control); +} + +$p.openDashboardPartDialog = function ($control) { + $p.data.DashboardForm = {}; + $p.openSiteSettingsDialog($control, '#DashboardPartDialog'); +} + +$p.setDashboardPart = function ($control) { + $p.setData($('#EditDashboardPart'), $p.getData($control)); + $p.send($control); +} + +$p.openDashboardPartTimeLineSitesDialog = function ($control) { + $p.data.TimeLineSitesForm = {}; + $p.openSiteSettingsDialog($control, '#DashboardPartTimeLineSitesDialog'); +} + +$p.updateDashboardPartTimeLineSites = function ($control) { + $p.send($control); +} + +$p.confirmTimeLineSites = function (value) { + var args = JSON.parse(value); + var result = confirm('基準となるサイトが変更されるため、「フィルタ」および「ソータ」をリセットします。'); + if (result) { + $('#DashboardPartTimeLineSitesValue').text(args.timeLineSites); + $p.set($('#DashboardPartTimeLineSites'), args.timeLineSites); + $p.set($('#DashboardPartBaseSiteId'), args.baseSiteId); + $p.send($("#ClearDashboardView")); + $p.closeDialog($("#DashboardPartTimeLineSitesDialog")); + } } \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/scripts/sitesettingsevents.js b/Implem.Pleasanter/wwwroot/scripts/sitesettingsevents.js index 7a67c3ec8..c1bbc6ffc 100644 --- a/Implem.Pleasanter/wwwroot/scripts/sitesettingsevents.js +++ b/Implem.Pleasanter/wwwroot/scripts/sitesettingsevents.js @@ -129,9 +129,11 @@ $(document).on('change', '#FormulaCondition', function () { $('#FormulaOutOfConditionField').toggle($(this).val() !== ''); }); - $(document).on('click', '#AddViewSorter', function () { - var $dataViewSorter = $('#ViewSorterSelector option:selected'); - var orderType = $('#ViewSorterOrderTypes option:selected').val(); + $(document).on('click', '.add-view-sorter', function () { + var $control = $(this); + var prefix = $control.data('prefix'); + var $dataViewSorter = $('#' + prefix + 'ViewSorterSelector option:selected'); + var orderType = $('#' + prefix + 'ViewSorterOrderTypes option:selected').val(); var orderText = ''; switch (orderType) { case 'asc': @@ -142,7 +144,7 @@ break; } $p.addBasket( - $('#ViewSorters'), + $('#' + prefix + 'ViewSorters'), $dataViewSorter.text() + orderText, $dataViewSorter.val() + '&' + orderType); }); @@ -191,4 +193,20 @@ $(document).on('change', '#KeepSorterState', function () { $('#ViewFiltersSorterConditionSettingsEditor').toggle(); }); + + $(document).on('change', '#DashboardPartType', function () { + let $control = $(this); + let selected = $control.val(); + $('#DashboardPartQuickAccessSitesField').toggle(selected === '0'); + $('#DashboardPartQuickAccessLayoutField').toggle(selected === '0'); + $('#DashboardPartViewFiltersTabControl').toggle(selected === '1'); + $('#DashboardPartViewSortersTabControl').toggle(selected === '1'); + $('#DashboardPartTimeLineSitesField').toggle(selected === '1'); + $('#DashboardPartTimeLineTitleField').toggle(selected === '1'); + $('#DashboardPartTimeLineBodyField').toggle(selected === '1'); + $('#DashboardPartTimeLineDisplayTypeField').toggle(selected === '1'); + $('#DashboardPartTimeLineItemCountField').toggle(selected === '1'); + $('#DashboardPartContentField').toggle(selected === '2'); + $('#DashboardPartHtmlContentField').toggle(selected === '3'); + }); }); \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/index.css b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/index.css new file mode 100644 index 000000000..c7b7555f4 --- /dev/null +++ b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/index.css @@ -0,0 +1,74 @@ +@font-face { + font-family: "Material Symbols Outlined"; + font-style: normal; + font-weight: 100 700; + font-display: block; + src: url("./material-symbols-outlined.woff2") format("woff2"); +} +.material-symbols-outlined { + font-family: "Material Symbols Outlined"; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + font-feature-settings: "liga"; +} + +@font-face { + font-family: "Material Symbols Rounded"; + font-style: normal; + font-weight: 100 700; + font-display: block; + src: url("./material-symbols-rounded.woff2") format("woff2"); +} +.material-symbols-rounded { + font-family: "Material Symbols Rounded"; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + font-feature-settings: "liga"; +} + +@font-face { + font-family: "Material Symbols Sharp"; + font-style: normal; + font-weight: 100 700; + font-display: block; + src: url("./material-symbols-sharp.woff2") format("woff2"); +} +.material-symbols-sharp { + font-family: "Material Symbols Sharp"; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + font-feature-settings: "liga"; +} diff --git a/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-outlined.woff2 b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-outlined.woff2 new file mode 100644 index 000000000..f226a949c Binary files /dev/null and b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-outlined.woff2 differ diff --git a/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-rounded.woff2 b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-rounded.woff2 new file mode 100644 index 000000000..cc52ab518 Binary files /dev/null and b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-rounded.woff2 differ diff --git a/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-sharp.woff2 b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-sharp.woff2 new file mode 100644 index 000000000..c52e120e1 Binary files /dev/null and b/Implem.Pleasanter/wwwroot/styles/plugins/material-symbols-0.8.0/material-symbols/material-symbols-sharp.woff2 differ diff --git a/Implem.Pleasanter/wwwroot/styles/responsive.css b/Implem.Pleasanter/wwwroot/styles/responsive.css index 4f587f40e..df66ede63 100644 --- a/Implem.Pleasanter/wwwroot/styles/responsive.css +++ b/Implem.Pleasanter/wwwroot/styles/responsive.css @@ -160,7 +160,9 @@ #Guide { font-size: 2.6vw; } -.alert-success { height: auto; font-size: 2.6vw; } +.alert-success, +.alert-warning, +.alert-error { height: auto; font-size: 2.6vw; } #MainCommandsContainer { height:auto; padding: 2vw 0; font-size: 2.6vw; z-index: 200; } #Footer { z-index: 102; } @@ -178,7 +180,7 @@ border-radius: 4px; border:1px solid #111; border-radius: 4px; } - +.message { bottom: 140px; } } @@ -527,6 +529,9 @@ overflow: hidden; .h350 { height: auto;} #EditInDialogBody { padding-bottom: 15%; } + +.links { + overflow: auto; } @media screen and (max-width: 980px) and (min-width: 0px) { diff --git a/Implem.Pleasanter/wwwroot/styles/site.css b/Implem.Pleasanter/wwwroot/styles/site.css index c71172342..ab89151da 100644 --- a/Implem.Pleasanter/wwwroot/styles/site.css +++ b/Implem.Pleasanter/wwwroot/styles/site.css @@ -1,79 +1,84 @@ @charset "utf-8"; -*{ +* { box-sizing: border-box; } -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video{ - margin:0; - padding:0; - border:0; - font-style:normal; - font-weight:normal; - vertical-align:baseline; +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-style: normal; + font-weight: normal; + vertical-align: baseline; } -article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section{ - display:block; +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } -input, textarea{ - margin:0; - padding:0; +input, textarea { + margin: 0; + padding: 0; } - -ol, ul{ - list-style:none; + +ol, ul { + list-style: none; } - -table{ - border-collapse:collapse; - border-spacing:0; + +table { + border-collapse: collapse; + border-spacing: 0; } - -caption, th{ - text-align:left; + +caption, th { + text-align: left; } -a:focus{ - outline:none; +a:focus { + outline: none; } .cf:before, -.cf:after{ - content:" "; - display:table; +.cf:after { + content: " "; + display: table; } -.cf:after{ - clear:both; +.cf:after { + clear: both; } -.cf{ - *zoom:1; +.cf { + *zoom: 1; } -.both{ - clear:both; +.both { + clear: both; } -img{ +img { max-width: 100%; height: auto; width /***/: auto; } ::-webkit-input-placeholder { - color: silver; } + color: silver; +} :-moz-placeholder { - color: silver; opacity: 1; } + color: silver; + opacity: 1; +} ::-moz-placeholder { - color: silver; opacity: 1; } + color: silver; + opacity: 1; +} :-ms-input-placeholder { - color: silver; + color: silver; } input[type="number"]::-webkit-outer-spin-button, @@ -83,1105 +88,1099 @@ input[type="number"]::-webkit-inner-spin-button { } input[type="number"] { - -moz-appearance:textfield; -} - -html{ - -} - -body{ - min-width:1200px; - font-size:0.75em; - font-family:Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; - clear:both; -} - -h1{ - clear:both; -} - -h2{ - clear:both; -} - -h3{ - clear:both; -} - -legend{ - cursor:pointer; -} - -legend > *{ - display:block; - float:left; -} - -label{ - position:relative; - cursor:pointer; - z-index:2; -} - -input{ - background-color:white; - position:relative; - z-index:2; -} - -select{ - position:relative; - z-index:2; -} - -table{ - width:100%; - border:0px; - border-collapse:collapse; - clear:both; -} - -td{ - padding:3px; - vertical-align:top; - color:black; -} - -td.right-align > p{ - float:right; -} - -pre{ - line-height:1.5em; - font-family:Terminal,Hiragino Kaku Gothic Pro; - word-wrap:break-word; - word-break:break-all; - white-space:pre-wrap; -} - -#Logo{ - padding:3px 0px; -} - -#CorpLogo{ - display:block; - float:left; - margin:3px 0px 0px 0px; -} - -#ProductLogo{ - display:block; - float:left; - padding:0px 0px 0px 5px; - font-size:26px; - font-weight:bold; - color:dimgray; - text-decoration:none; + -moz-appearance: textfield; } -#PortalLink{ - position:relative; - top:-38px; - right:40px; - float:right; +html { } -#LoginFieldSet{ - width:500px; - margin:150px auto 20px auto; - padding:50px; - background-color:whitesmoke; - border-radius:10px; -} - -#LoginCommands{ - text-align:right; - clear:both; -} - -#Demo{ - width:500px; - margin:0px auto; -} - -#DemoFields{ - padding:20px 10px 10px 10px; -} - -#SearchPermissionElements{ - margin-left:15px; -} - -#Breadcrumb{ - float:left; - margin:0px 0px 5px 0px; -} - -#Breadcrumb .item{ - display:block; - float:left; - padding:3px 5px; -} - -#Breadcrumb .item.trashbox{ - display:block; - float:left; - color:white; - background-color:red; - border-radius:3px; -} - -#Breadcrumb .separator{ - margin:0px 0px 0px 8px; -} - -#Guide > div{ - width:100%; - display:block; - float:left; - margin:0px 0px 5px 0px; - padding:5px 10px; - background:lightgoldenrodyellow; - border:solid 1px silver; - position:relative; - clear:both; - border-radius:5px; -} - -#CopyToClipboards > .display-control{ - float:left; - cursor:pointer; -} - -#Header{ - width:100%; - float:left; - padding:0px 6px; - border:none; - position:relative; - clear:both; -} - -#Navigations{ - height:30px; - margin:0px 0px 5px 0px; - padding:0px 5px 0px 15px; - border:none; - top:0px; - right:5px; - border-radius:20px 5px 5px 20px; - float:right; -} - -#NavigationMenu{ - float:left; - margin-right:5px; -} - -#NavigationMenu > li{ - width:158px; - height:30px; - display:block; - float:left; - position:relative; -} - -#NavigationMenu > li > div{ - height:30px; - text-align:center; - line-height:30px; - cursor:pointer; -} - -#NavigationMenu > li > div:hover{ - -} - -#NavigationMenu > li.sub-menu > div.hover{ - -} - -#NavigationMenu > li > div > a{ - height:30px; - display:block; - text-decoration:none; -} - -#NavigationMenu > li > div:hover > a{ - -} - -#NavigationMenu .menu{ - width:158px; - display:none; - border-top:none !important; - position:absolute; - top:30px; - right:0px; - border-radius:0px 0px 5px 5px; - z-index:3; -} - -#NavigationMenu .menu > li > a{ - display:block; - text-decoration:none; -} - -#NavigationMenu .menu > li > a.ui-state-active{ - font-weight:normal; - text-decoration:none; +body { + min-width: 1200px; + font-size: 0.75em; + font-family: Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; + clear: both; } -#TemplateDialog > div{ - padding:0px 15px; - overflow:hidden; +h1 { + clear: both; } -#SearchField{ - float:left; - margin:3px 0px; - color:black; +h2 { + clear: both; } -#Search{ - height:24px; +h3 { + clear: both; } -#SwitchUserInfo{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - color:white; - background-color:blue; - border-radius:7px; +legend { + cursor: pointer; } -#SwitchUserInfo > a{ - width:100%; - display:block; - float:left; - color:white; - text-decoration:none; -} + legend > * { + display: block; + float: left; + } -#ExcessLicenseWarning{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - color:white; - background:red; - border-radius:7px; +label { + position: relative; + cursor: pointer; + z-index: 2; } -#PublishWarning{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - background:red; - border-radius:7px; +input { + background-color: white; + position: relative; + z-index: 2; } -#PublishWarning > a{ - width:100%; - display:block; - float:left; - color:white; - text-decoration:none; +select { + position: relative; + z-index: 2; } -#LockedWarning{ - width:100%; - display:block; - float:left; - margin:0px 10px 5px 0px; - padding:5px 10px; - background:red; - border-radius:7px; -} - -#LockedWarning > div{ - width:100%; - display:block; - float:left; - color:white; - text-decoration:none; +table { + width: 100%; + border: 0px; + border-collapse: collapse; + clear: both; } -#Application{ - width:100%; - float:left; - margin:10px 0px 0px 0px; - padding:0px 10px 120px 10px; - position:relative; - clear:both; +td { + padding: 3px; + vertical-align: top; + color: black; } -#Application > .site-image-icon{ - display:block; - float:left; - margin:0px 10px 0px 0px; -} + td.right-align > p { + float: right; + } -#StartGuide{ - width:100%; - display:block; - float:left; - margin:0px 0px 10px 0px; - padding:50px 0px 0px 0px; - background-color:whitesmoke; - position:relative; - border-radius:10px; +pre { + line-height: 1.5em; + font-family: Terminal,Hiragino Kaku Gothic Pro; + word-wrap: break-word; + word-break: break-all; + white-space: pre-wrap; } -#StartGuide > #StartGuideContents{ - width:900px; - margin:0px auto; +#Logo { + padding: 3px 0px; } -#StartGuide > #StartGuideContents > a{ - width:150px; - display:block; - float:left; - margin:0px 37px; - padding:5px; - text-align:center; - border-radius:5px; +#CorpLogo { + display: block; + float: left; + margin: 3px 0px 0px 0px; } -#StartGuide > #StartGuideContents > a:hover{ - background-color:white; +#ProductLogo { + display: block; + float: left; + padding: 0px 0px 0px 5px; + font-size: 26px; + font-weight: bold; + color: dimgray; + text-decoration: none; } -#StartGuide > #StartGuideContents > a > *{ - display:block; - text-align:center; - clear:both; +#PortalLink { + position: relative; + top: -38px; + right: 40px; + float: right; } -#StartGuide > #StartGuideContents > a > img{ - width:50px; - margin:5px 50px; +#LoginFieldSet { + width: 500px; + margin: 150px auto 20px auto; + padding: 50px; + background-color: whitesmoke; + border-radius: 10px; } -#StartGuide > #DisableStartGuideField{ - display:block; - float:left; - margin:50px 0px 0px 20px; - clear:both; +#LoginCommands { + text-align: right; + clear: both; } -#StartGuide > .ui-icon{ - position:absolute; - top:10px; - right:10px; - cursor:pointer; +#Demo { + width: 500px; + margin: 0px auto; } -#SiteImageIconContainer{ - float:left; +#DemoFields { + padding: 20px 10px 10px 10px; } -#SiteImageIconContainer > *{ - margin:0px 5px 0px 0px; +#SearchPermissionElements { + margin-left: 15px; } -#HeaderTitleContainer{ - float:left; - margin:0px 0px 10px 0px; +#Breadcrumb { + float: left; + margin: 0px 0px 5px 0px; } -#HeaderTitle{ - font-size:20px; - font-weight:bold; - color:chocolate; -} + #Breadcrumb .item { + display: block; + float: left; + padding: 3px 5px; + } -#Notes > *{ - width:100%; - float:left; - margin:0px 10px 5px 0px; -} + #Breadcrumb .item.trashbox { + display: block; + float: left; + color: white; + background-color: red; + border-radius: 3px; + } -#Notes > .history{ - width:100%; - display:block; - float:left; - padding:5px 10px; - color:white; - background-color:blue; - border-radius:7px; -} + #Breadcrumb .separator { + margin: 0px 0px 0px 8px; + } -#Notes > .readonly{ - width:100%; - display:block; - float:left; - padding:5px 10px; - color:white; - background-color:orange; - border-radius:7px; +#Guide > div { + width: 100%; + display: block; + float: left; + margin: 0px 0px 5px 0px; + padding: 5px 10px; + background: lightgoldenrodyellow; + border: solid 1px silver; + position: relative; + clear: both; + border-radius: 5px; } -#ViewSelectorField{ - position:absolute; - top:-10px; - right:0px; +#CopyToClipboards > .display-control { + float: left; + cursor: pointer; } -#ViewFilters{ - width:100%; - float:left; - margin:0px 0px 5px 0px; - padding:5px 5px 2px 5px; - border:solid 1px silver; - border-radius:5px; +#Header { + width: 100%; + float: left; + padding: 0px 6px; + border: none; + position: relative; + clear: both; } -#ViewFilters.reduced{ - width:auto; - padding:0px; - border:none; +#Navigations { + height: 30px; + margin: 0px 0px 5px 0px; + padding: 0px 5px 0px 15px; + border: none; + top: 0px; + right: 5px; + border-radius: 20px 5px 5px 20px; + float: right; +} + +#NavigationMenu { + float: left; + margin-right: 5px; +} + + #NavigationMenu > li { + width: 158px; + height: 30px; + display: block; + float: left; + position: relative; + } + + #NavigationMenu > li > div { + height: 30px; + text-align: center; + line-height: 30px; + cursor: pointer; + } + + #NavigationMenu > li > div:hover { + } + + #NavigationMenu > li.sub-menu > div.hover { + } + + #NavigationMenu > li > div > a { + height: 30px; + display: block; + text-decoration: none; + } + + #NavigationMenu > li > div:hover > a { + } + + #NavigationMenu .menu { + width: 158px; + display: none; + border-top: none !important; + position: absolute; + top: 30px; + right: 0px; + border-radius: 0px 0px 5px 5px; + z-index: 3; + } + + #NavigationMenu .menu > li > a { + display: block; + text-decoration: none; + } + + #NavigationMenu .menu > li > a.ui-state-active { + font-weight: normal; + text-decoration: none; + } + +#TemplateDialog > div { + padding: 0px 15px; + overflow: hidden; +} + +#SearchField { + float: left; + margin: 3px 0px; + color: black; +} + +#Search { + height: 24px; +} + +#SwitchUserInfo { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + color: white; + background-color: blue; + border-radius: 7px; +} + + #SwitchUserInfo > a { + width: 100%; + display: block; + float: left; + color: white; + text-decoration: none; + } + +#ExcessLicenseWarning { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + color: white; + background: red; + border-radius: 7px; +} + +#PublishWarning { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + background: red; + border-radius: 7px; +} + + #PublishWarning > a { + width: 100%; + display: block; + float: left; + color: white; + text-decoration: none; + } + +#LockedWarning { + width: 100%; + display: block; + float: left; + margin: 0px 10px 5px 0px; + padding: 5px 10px; + background: red; + border-radius: 7px; +} + + #LockedWarning > div { + width: 100%; + display: block; + float: left; + color: white; + text-decoration: none; + } + +#Application { + width: 100%; + float: left; + margin: 10px 0px 0px 0px; + padding: 0px 10px 120px 10px; + position: relative; + clear: both; } -#ViewFilters > .field-auto-thin{ - height:32px; - float:left; - padding:0px; -} + #Application > .site-image-icon { + display: block; + float: left; + margin: 0px 10px 0px 0px; + } + +#StartGuide { + width: 100%; + display: block; + float: left; + margin: 0px 0px 10px 0px; + padding: 50px 0px 0px 0px; + background-color: whitesmoke; + position: relative; + border-radius: 10px; +} + + #StartGuide > #StartGuideContents { + width: 900px; + margin: 0px auto; + } + + #StartGuide > #StartGuideContents > a { + width: 150px; + display: block; + float: left; + margin: 0px 37px; + padding: 5px; + text-align: center; + border-radius: 5px; + } + + #StartGuide > #StartGuideContents > a:hover { + background-color: white; + } + + #StartGuide > #StartGuideContents > a > * { + display: block; + text-align: center; + clear: both; + } + + #StartGuide > #StartGuideContents > a > img { + width: 50px; + margin: 5px 50px; + } + + #StartGuide > #DisableStartGuideField { + display: block; + float: left; + margin: 50px 0px 0px 20px; + clear: both; + } + + #StartGuide > .ui-icon { + position: absolute; + top: 10px; + right: 10px; + cursor: pointer; + } + +#SiteImageIconContainer { + float: left; +} + + #SiteImageIconContainer > * { + margin: 0px 5px 0px 0px; + } + +#HeaderTitleContainer { + float: left; + margin: 0px 0px 10px 0px; +} + +#HeaderTitle { + font-size: 20px; + font-weight: bold; + color: chocolate; +} + +#Notes > * { + width: 100%; + float: left; + margin: 0px 10px 5px 0px; +} + +#Notes > .history { + width: 100%; + display: block; + float: left; + padding: 5px 10px; + color: white; + background-color: blue; + border-radius: 7px; +} + +#Notes > .readonly { + width: 100%; + display: block; + float: left; + padding: 5px 10px; + color: white; + background-color: orange; + border-radius: 7px; +} + +#ViewSelectorField { + position: absolute; + top: -10px; + right: 0px; +} + +#ViewFilters { + width: 100%; + float: left; + margin: 0px 0px 5px 0px; + padding: 5px 5px 2px 5px; + border: solid 1px silver; + border-radius: 5px; +} + + #ViewFilters.reduced { + width: auto; + padding: 0px; + border: none; + } + + #ViewFilters > .field-auto-thin { + height: 32px; + float: left; + padding: 0px; + } -#ViewFilters_Reset{ - display:block; - float:left; - margin:0px 20px 0px 0px; +#ViewFilters_Reset { + display: block; + float: left; + margin: 0px 20px 0px 0px; } -#ViewFilters > .display-control{ - float:left; - margin:0px 5px 0px 0px; - padding:5px 10px 5px 0px; - font-weight:bold; - cursor:pointer; +#ViewFilters > .display-control { + float: left; + margin: 0px 5px 0px 0px; + padding: 5px 10px 5px 0px; + font-weight: bold; + cursor: pointer; } #ViewFilters .ui-icon.ui-icon-info { transform: scale(1, -1); } -#FilterButton{ - display:block; - float:left; +#FilterButton { + display: block; + float: left; } -#Aggregations{ - width:100%; - float:left; - margin:0px 0px 5px 0px; - padding:3px 5px 5px 5px; - border:solid 1px silver; - border-radius:5px; +#Aggregations { + width: 100%; + float: left; + margin: 0px 0px 5px 0px; + padding: 3px 5px 5px 5px; + border: solid 1px silver; + border-radius: 5px; } -#Aggregations.reduced{ - width:auto; - padding:0px; - border:none; -} + #Aggregations.reduced { + width: auto; + padding: 0px; + border: none; + } -#Aggregations .label{ - height:26px; - display:block; - float:left; - margin:2px 5px 0px 0px; - padding:5px 10px; - background:gainsboro; - border-radius:5px; -} + #Aggregations .label { + height: 26px; + display: block; + float: left; + margin: 2px 5px 0px 0px; + padding: 5px 10px; + background: gainsboro; + border-radius: 5px; + } -#Aggregations .label.overdue{ - font-weight:bold; - color:white; - background-color:red; - cursor:pointer; -} + #Aggregations .label.overdue { + font-weight: bold; + color: white; + background-color: red; + cursor: pointer; + } -#Aggregations .data{ - height:26px; - display:block; - float:left; - margin:2px 5px 0px 0px; - padding:5px; -} + #Aggregations .data { + height: 26px; + display: block; + float: left; + margin: 2px 5px 0px 0px; + padding: 5px; + } -#Aggregations .data.overdue{ - color:red; - cursor:pointer; -} + #Aggregations .data.overdue { + color: red; + cursor: pointer; + } -#Aggregations em{ - display:block; - float:left; - margin-right:5px; - font-weight:bold; -} + #Aggregations em { + display: block; + float: left; + margin-right: 5px; + font-weight: bold; + } -#Aggregations > .display-control{ - float:left; - margin:0px 5px 0px 0px; - padding:5px 10px 5px 0px; - font-weight:bold; - cursor:pointer; -} + #Aggregations > .display-control { + float: left; + margin: 0px 5px 0px 0px; + padding: 5px 10px 5px 0px; + font-weight: bold; + cursor: pointer; + } -#SitePackagesSelectable span.include-data{ - margin:0px 0px 0px 10px; - color:red; +#SitePackagesSelectable span.include-data { + margin: 0px 0px 0px 10px; + color: red; } - -#CalendarDate{ - margin-right:10px; + +#CalendarDate { + margin-right: 10px; } - -#CalendarBody table{ - table-layout:fixed; + +#CalendarBody table { + table-layout: fixed; } - -#CalendarBody thead th{ - padding:5px; - text-align:center; - border:solid 1px silver; + +#CalendarBody thead th { + padding: 5px; + text-align: center; + border: solid 1px silver; +} + +th.calendar-header { + text-align: center; + background-color: white; } -th.calendar-header{ - text-align:center; - background-color:white; +#CalendarBody .saturday { + background-color: lightblue; } -#CalendarBody .saturday{ - background-color:lightblue; +#CalendarBody .sunday { + background-color: pink; } -#CalendarBody .sunday{ - background-color:pink; +#CalendarBody td { + padding: 0px; + border: solid 1px silver; } -#CalendarBody td{ - padding:0px; - border:solid 1px silver; -} + #CalendarBody td > div { + min-height: 50px; + padding: 5px; + } -#CalendarBody td > div{ - min-height:50px; - padding:5px; -} + #CalendarBody td.hover { + background-color: whitesmoke; + } -#CalendarBody td.hover{ - background-color:whitesmoke; +#CalendarBody .other-month { + background-color: gainsboro; } -#CalendarBody .other-month{ - background-color:gainsboro; +#CalendarBody .today { + border: solid 2px blue; + z-index: 20; } -#CalendarBody .today{ - border:solid 2px blue; - z-index:20; +#CalendarBody .item { + height: 25px; + margin: 5px 0px 0px 0px; + background-color: lightgoldenrodyellow; + border: solid 1px silver; + border-radius: 3px; } -#CalendarBody .item{ - height:25px; - margin:5px 0px 0px 0px; - background-color:lightgoldenrodyellow; - border:solid 1px silver; - border-radius:3px; -} + #CalendarBody .item.hover { + background-color: white; + border: solid 1px orange; + } -#CalendarBody .item.hover{ - background-color:white; - border:solid 1px orange; -} + #CalendarBody .item.changed { + font-weight: bold; + background-color: yellow; + border: solid 1px orange; + } -#CalendarBody .item.changed{ - font-weight:bold; - background-color:yellow; - border:solid 1px orange; -} + #CalendarBody .item .connection { + width: 14px; + height: 25px; + background-color: lightgoldenrodyellow; + border-top: solid 1px silver; + border-bottom: solid 1px silver; + position: relative; + top: -1px; + left: -14px; + } -#CalendarBody .item .connection{ - width:14px; - height:25px; - background-color:lightgoldenrodyellow; - border-top:solid 1px silver; - border-bottom:solid 1px silver; - position:relative; - top:-1px; - left:-14px; -} + #CalendarBody .item .connection.hover { + background-color: white; + border-top: solid 1px orange; + border-bottom: solid 1px orange; + } -#CalendarBody .item .connection.hover{ - background-color:white; - border-top:solid 1px orange; - border-bottom:solid 1px orange; -} + #CalendarBody .item .connection.changed { + font-weight: bold; + background-color: yellow; + border-top: solid 1px orange; + border-bottom: solid 1px orange; + } -#CalendarBody .item .connection.changed{ - font-weight:bold; - background-color:yellow; - border-top:solid 1px orange; - border-bottom:solid 1px orange; -} + #CalendarBody .item .title { + padding: 5px 0px; + position: absolute; + overflow: hidden; + white-space: nowrap; + z-index: 30; + } -#CalendarBody .item .title{ - padding:5px 0px; - position:absolute; - overflow:hidden; - white-space:nowrap; - z-index:30; -} + #CalendarBody .item .title.sub { + display: none; + } -#CalendarBody .item .title.sub{ - display:none; -} + #CalendarBody .item .title > span:not(.ui-icon) { + margin-right: 3px; + } -#CalendarBody .item .title > span:not(.ui-icon){ - margin-right: 3px; +#CalendarBody .dragging { + height: 25px; + padding: 5px; + background-color: lightgoldenrodyellow; + border-radius: 3px; + z-index: 50; } -#CalendarBody .dragging{ - height:25px; - padding:5px; - background-color:lightgoldenrodyellow; - border-radius:3px; - z-index:50; +#CalendarBody .dummy { + height: 25px; + margin: 5px 0px 0px 0px; } -#CalendarBody .dummy{ - height:25px; - margin:5px 0px 0px 0px; +#Crosstab .crosstab-row { + border-bottom: dotted 1px silver; } -#Crosstab .crosstab-row{ - border-bottom:dotted 1px silver; +#Crosstab .saturday { + background-color: #eeeeee; } -#Crosstab .saturday{ - background-color:#eeeeee; +#Crosstab .sunday { + background-color: #ffeeee; } -#Crosstab .sunday{ - background-color:#ffeeee; +#CrosstabMonth { + margin-right: 10px; } -#CrosstabMonth{ - margin-right:10px; +#Gantt { + width: 100%; + background-color: whitesmoke; + border-radius: 20px; } -#Gantt{ - width:100%; - background-color:whitesmoke; - border-radius:20px; -} + #Gantt .saturday { + fill: #eeeeee; + } -#Gantt .saturday{ - fill:#eeeeee; -} + #Gantt .sunday { + fill: #ffeeee; + } -#Gantt .sunday{ - fill:#ffeeee; -} + #Gantt .date { + stroke: white; + } -#Gantt .date{ - stroke:white; -} + #Gantt .now { + stroke: red; + } -#Gantt .now{ - stroke:red; -} + #Gantt .planned rect { + cursor: pointer; + fill: gainsboro; + } -#Gantt .planned rect{ - cursor:pointer; - fill:gainsboro; -} + #Gantt .planned rect.summary { + cursor: auto; + } -#Gantt .planned rect.summary{ - cursor:auto; -} + #Gantt .earned rect { + cursor: pointer; + fill: darkseagreen; + } -#Gantt .earned rect{ - cursor:pointer; - fill:darkseagreen; -} + #Gantt .earned rect.summary { + cursor: auto; + } -#Gantt .earned rect.summary{ - cursor:auto; -} + #Gantt rect.delay { + fill: #ffccd5; + } -#Gantt rect.delay{ - fill:#ffccd5; -} + #Gantt rect.delay.summary { + } -#Gantt rect.delay.summary{ + #Gantt rect.completed { + fill: lightsteelblue; + } -} + #Gantt .title text { + cursor: pointer; + } -#Gantt rect.completed{ - fill:lightsteelblue; -} + #Gantt .title text.delay { + fill: red; + } -#Gantt .title text{ - cursor:pointer; -} + #Gantt .title text.summary { + font-size: 1.2em; + font-weight: bold; + cursor: auto; + } -#Gantt .title text.delay{ - fill:red; +#GanttStartDate { + margin-right: 10px; } -#Gantt .title text.summary{ - font-size:1.2em; - font-weight:bold; - cursor:auto; +#GanttAxis { + width: calc(100% + 20px); + height: 50px; + margin-left: -10px; + margin-top: -25px; + background-color: rgba(255,255,255,0.5); + position: sticky; + left: 0px; + bottom: 75px; } -#GanttStartDate{ - margin-right:10px; -} + #GanttAxis text { + } -#GanttAxis{ - width:calc(100% + 20px); - height:50px; - margin-left:-10px; - margin-top:-25px; - background-color:rgba(255,255,255,0.5); - position:sticky; - left:0px; - bottom:75px; -} + #GanttAxis .saturday { + fill: gainsboro; + } -#GanttAxis text{ + #GanttAxis .sunday { + fill: #ffdddd; + } -} + #GanttAxis .weekday { + fill: whitesmoke; + } -#GanttAxis .saturday{ - fill:gainsboro; -} + #GanttAxis .date { + stroke: white; + } -#GanttAxis .sunday{ - fill:#ffdddd; +#BurnDown { + width: 100%; + height: 350px; + background-color: whitesmoke; + border-radius: 20px; } -#GanttAxis .weekday{ - fill:whitesmoke; -} + #BurnDown .now { + stroke: red; + } -#GanttAxis .date{ - stroke:white; -} + #BurnDown .total { + fill: none; + stroke: green; + } -#BurnDown{ - width:100%; - height:350px; - background-color:whitesmoke; - border-radius:20px; -} + #BurnDown .planned { + fill: none; + stroke: gray; + } -#BurnDown .now{ - stroke:red; -} + #BurnDown .earned { + fill: none; + stroke: orange; + } -#BurnDown .total{ - fill:none; - stroke:green; -} + #BurnDown .total circle { + fill: green; + } -#BurnDown .planned{ - fill:none; - stroke:gray; -} + #BurnDown .planned circle { + fill: gray; + } -#BurnDown .earned{ - fill:none; - stroke:orange; -} + #BurnDown .earned circle { + fill: orange; + } -#BurnDown .total circle{ - fill:green; +#BurnDownDetails > tbody > tr:hover { + background-color: whitesmoke; + cursor: pointer; } -#BurnDown .planned circle{ - fill:gray; +#BurnDownDetails > tbody > tr > td { + padding: 6px; } -#BurnDown .earned circle{ - fill:orange; -} + #BurnDownDetails > tbody > tr > td.warning { + font-weight: bold; + color: red; + } -#BurnDownDetails > tbody > tr:hover{ - background-color:whitesmoke; - cursor:pointer; -} + #BurnDownDetails > tbody > tr > td.difference { + font-size: 1.3em; + font-weight: bold; + color: blue; + background-color: lightcyan; + } -#BurnDownDetails > tbody > tr > td{ - padding:6px; -} + #BurnDownDetails > tbody > tr > td.difference.warning { + color: red; + background-color: #ffccd5; + } -#BurnDownDetails > tbody > tr > td.warning{ - font-weight:bold; - color:red; +#BurnDownDetails .user-info { + margin: 5px; + padding: 8px; + font-weight: bold; + background-color: palegoldenrod; } -#BurnDownDetails > tbody > tr > td.difference{ - font-size:1.3em; - font-weight:bold; - color:blue; - background-color:lightcyan; +#BurnDownDetails .items { + padding: 5px 0px 5px 20px; } -#BurnDownDetails > tbody > tr > td.difference.warning{ - color:red; - background-color:#ffccd5; -} + #BurnDownDetails .items a { + color: black; + text-decoration: none; + } -#BurnDownDetails .user-info{ - margin:5px; - padding:8px; - font-weight:bold; - background-color:palegoldenrod; -} + #BurnDownDetails .items a:hover { + color: blue; + text-decoration: underline; + } -#BurnDownDetails .items{ - padding:5px 0px 5px 20px; +#TimeSeries { + width: 100%; + height: 450px; + background-color: whitesmoke; + border-radius: 20px; } -#BurnDownDetails .items a{ - color:black; - text-decoration:none; -} + #TimeSeries .surface { + stroke: white; + } -#BurnDownDetails .items a:hover{ - color:blue; - text-decoration:underline; -} + #TimeSeries .index { + fill: black; + } -#TimeSeries{ - width:100%; - height:450px; - background-color:whitesmoke; - border-radius:20px; +#KambanBody .kamban-row { + border-bottom: dotted 1px silver; } -#TimeSeries .surface{ - stroke:white; +#KambanBody .kamban-container > div { + min-height: 30px; } -#TimeSeries .index{ - fill:black; +#KambanBody .kamban-container.hover { + background-color: whitesmoke; } -#KambanBody .kamban-row{ - border-bottom:dotted 1px silver; +#KambanBody .kamban-container .kamban-item:last-child { + margin: 3px 3px 30px 3px; } -#KambanBody .kamban-container > div{ - min-height:30px; +#KambanBody .kamban-item { + margin: 3px; + padding: 4px 16px 4px 5px; + background-color: lightgoldenrodyellow; + border: solid 1px silver; + position: relative; + cursor: pointer; + border-radius: 5px; } -#KambanBody .kamban-container.hover{ - background-color:whitesmoke; -} + #KambanBody .kamban-item:hover { + background-color: white; + border: solid 1px orange; + } -#KambanBody .kamban-container .kamban-item:last-child{ - margin:3px 3px 30px 3px; -} + #KambanBody .kamban-item.changed { + font-weight: bold; + background-color: yellow; + border: solid 1px orange; + } -#KambanBody .kamban-item{ - margin:3px; - padding:4px 16px 4px 5px; - background-color:lightgoldenrodyellow; - border:solid 1px silver; - position:relative; - cursor:pointer; - border-radius:5px; -} + #KambanBody .kamban-item .ui-icon { + position: absolute; + top: 0px; + right: 0px; + } -#KambanBody .kamban-item:hover{ - background-color:white; - border:solid 1px orange; -} + #KambanBody .kamban-item > span { + margin-right: 3px; + } -#KambanBody .kamban-item.changed{ - font-weight:bold; - background-color:yellow; - border:solid 1px orange; +#ImageLib .item { + width: 250px; + height: 250px; + float: left; + margin: 10px 10px 0px 0px; + padding: 10px; + border: solid 1px silver; + position: relative; + overflow: hidden; } -#KambanBody .kamban-item .ui-icon{ - position:absolute; - top:0px; - right:0px; -} - -#KambanBody .kamban-item > span{ - margin-right: 3px; -} - -#ImageLib .item{ - width:250px; - height:250px; - float:left; - margin:10px 10px 0px 0px; - padding:10px; - border:solid 1px silver; - position:relative; - overflow:hidden; -} - -#ImageLib .item .image{ - width:100%; - float:left; - margin:5px 0px 0px 0px; -} + #ImageLib .item .image { + width: 100%; + float: left; + margin: 5px 0px 0px 0px; + } -#ImageLib .item .delete-image{ - float:left; - position:absolute; - right:5px; - bottom:5px; -} - -#RecordHeader{ - width:100%; - float:left; - margin:0px 0px 5px 0px; -} - -#RecordInfo{ - float:left; - padding:6px 0px 0px 0px; -} - -#RecordInfo div{ - float:left; - margin-right:50px; -} + #ImageLib .item .delete-image { + float: left; + position: absolute; + right: 5px; + bottom: 5px; + } -#RecordInfo div p{ - float:left; - margin-right:5px; +#RecordHeader { + width: 100%; + float: left; + margin: 0px 0px 5px 0px; } -#RecordInfo div p .elapsed-time{ - float:left; - padding:0px 5px; - font-weight:bold; - background-color:#eee; - border-radius:2px; +#RecordInfo { + float: left; + padding: 6px 0px 0px 0px; } -#RecordSwitchers{ - float:right; -} + #RecordInfo div { + float: left; + margin-right: 50px; + } -#RecordSwitchers > *{ - float:left; -} + #RecordInfo div p { + float: left; + margin-right: 5px; + } -#RecordSwitchers .current{ - height:26px; - display:block; - float:left; - margin:0px 1px 0px 0px; - padding:5px; - border-radius:5px; -} + #RecordInfo div p .elapsed-time { + float: left; + padding: 0px 5px; + font-weight: bold; + background-color: #eee; + border-radius: 2px; + } -#TemplateTabsContainer{ - width:100%; - float:left; +#RecordSwitchers { + float: right; } -#Editor{ - width:100%; - float:left; - clear:both; + #RecordSwitchers > * { + float: left; + } + + #RecordSwitchers .current { + height: 26px; + display: block; + float: left; + margin: 0px 1px 0px 0px; + padding: 5px; + border-radius: 5px; + } + +#TemplateTabsContainer { + width: 100%; + float: left; +} + +#Editor { + width: 100%; + float: left; + clear: both; } -#EditorTabsContainer{ - width:73%; - float:left; - margin:0px 0px 20px 0px; +#EditorTabsContainer { + width: 73%; + float: left; + margin: 0px 0px 20px 0px; } -#EditorTabsContainer.max{ - width:100%; -} + #EditorTabsContainer.max { + width: 100%; + } -#MailEditorTabsContainer{ - width:100%; - float:left; - margin:0px 0px 20px 0px; - border:none; +#MailEditorTabsContainer { + width: 100%; + float: left; + margin: 0px 0px 20px 0px; + border: none; } -#EditorComments{ - width:27%; - float:right; - margin:0px 0px 15px 0px; - padding:0px 0px 0px 5px; +#EditorComments { + width: 27%; + float: right; + margin: 0px 0px 15px 0px; + padding: 0px 0px 0px 5px; } -#EditorComments .title-header{ - margin:3px 10px 8px 0px; -} + #EditorComments .title-header { + margin: 3px 10px 8px 0px; + } -#CommentField{ - margin:0px 0px 5px 0px; +#CommentField { + margin: 0px 0px 5px 0px; } -#OutgoingMailsForm{ - width:73%; - float:left; +#OutgoingMailsForm { + width: 73%; + float: left; } -#OutgoingMailsForm > .item{ - width:100%; - float:left; - position:relative; - border-radius:10px; -} + #OutgoingMailsForm > .item { + width: 100%; + float: left; + position: relative; + border-radius: 10px; + } -#OutgoingMailsForm .content{ - width:100%; - float:left; - margin:5px 0px 20px 0px; - padding:10px 0px 0px 0px; - border:solid 1px silver; - border-top:none; - border-radius:0px 0px 10px 10px / 0px 0px 10px 10px; -} + #OutgoingMailsForm .content { + width: 100%; + float: left; + margin: 5px 0px 20px 0px; + padding: 10px 0px 0px 0px; + border: solid 1px silver; + border-top: none; + border-radius: 0px 0px 10px 10px / 0px 0px 10px 10px; + } -#DropDownSearchDialogForm{ - width:100%; - padding:0px 20px; +#DropDownSearchDialogForm { + width: 100%; + padding: 0px 20px; } -#ProcessTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; +#ProcessTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -#StatusControlTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; +#StatusControlTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -#StatusControlColumnHash .column-control-types{ - margin:0px 0px 0px 10px; +#StatusControlColumnHash .column-control-types { + margin: 0px 0px 0px 10px; } #ViewTabsContainer { @@ -1189,2035 +1188,2356 @@ th.calendar-header{ clear: both; } -#ExportTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; -} - -#EditorDetailTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; -} - -#ColumnAccessControlTabsContainer{ - margin:0px 20px 10px 20px; - clear:both; -} - -#SearchResults{ - width:80%; - float:left; - margin:0px 100px; -} - -#SearchResults .count{ - float:left; - margin:0px 0px 10px 0px; -} - -#SearchResults .count .label{ - height:26px; - display:block; - float:left; - margin:0px 5px 5px 0px; - padding:5px 10px; - background:gainsboro; - border-radius:5px; -} - -#SearchResults .count .data{ - height:26px; - display:block; - float:left; - margin:0px 5px 5px 0px; - padding:5px; -} - -#SearchResults .result{ - width:100%; - float:left; - padding:15px; - border:solid 1px white; - clear:both; -} - -#SearchResults .result > ul{ - display:block; - float:left; - clear:both; -} - -#SearchResults .result > h3{ - display:block; - float:left; - margin:5px 0px; - clear:both; -} - -#SearchResults .result > h3 > a{ - font-size:1.3em; - font-weight:bold; -} - -#SearchResults .result > p{ - display:block; - float:left; - clear:both; -} - -#SearchResults .result:hover{ - border:solid 1px orange; - cursor:pointer; -} - -#MainCommandsContainer{ - width:100%; - height:47px; - padding:7px 0px 0px 0px; - background-color:rgba(0,0,0,0.65); - position:fixed; - left:0px; - bottom:30px; - z-index:100; -} - -#MainCommands{ - text-align:center; -} - -#MainCommands > button{ - display:inline; - float:none; - margin:2px 4px; -} - -#ApiEditorCommands{ - padding:0px 5px 200px 140px; -} - -#ApiEditorCommands > *{ - margin-right:10px; -} - -#BottomMargin{ - height:100px; - clear:both; -} - -#Video{ - width:640px; - height:480px; - display:block; - float:left; - margin:0px 16px; -} - -#Canvas{ - display:none; -} - -#Footer{ - width:100%; - height:30px; - display:block; - padding:5px 10px; - text-align:right; - background-color:black; - position:fixed; - left:0px; - bottom:0px; - z-index:100; -} - -#Footer a{ - color:white; - text-decoration:none; -} - -#Versions{ - width:500px; - margin:150px auto 20px auto; - padding:50px; - background-color:whitesmoke; - border-radius:10px; -} - -#Versions span{ - margin:10px; - line-height:30px; -} - -.template{ - width:100%; - display:block; - float:left; -} - -.template-selectable{ - width:340px; - display:block; - float:left; -} - -.template-viewer-container{ - width:100%; - display:block; - float:right; - margin:0px 0px 0px -340px; -} - -.template-viewer{ - margin:0px 0px 0px 340px; -} - -.template-viewer .description{ - margin:10px 0px 8px 0px; - padding:5px; - background-color:#fefedd; - border:solid 1px silver; - border-radius:5px; -} - -.template-viewer .samples-displayed{ - margin:0px 0px 8px 0px; - padding:5px; - color:red; - background-color:pink; - border:solid 1px red; - border-radius:5px; -} - -.template-tab-container{ - min-height:600px; -} - -.main-form{ - clear:both; -} - -.nav-sites{ - margin:0px -10px; - clear:both; -} - -.nav-site{ - width:220px; - height:70px; - float:left; - margin:10px; - position:relative; - top:0px; - left:0px; - border-radius:5px; -} - -.nav-site.sites{ - -} - -.nav-site .heading{ - width:50px; - height:9px; - position:absolute; - top:-10px; - left:5px; - border-radius:3px 3px 0px 0px / 3px 3px 0px 0px; -} - -.nav-site .stacking1{ - width:220px; - height:70px; - border-bottom:solid 1px silver; - border-right:solid 1px silver; - position:absolute; - top:1px; - left:1px; - border-radius:5px; -} - -.nav-site .stacking2{ - width:220px; - height:70px; - border-bottom:solid 1px silver; - border-right:solid 1px silver; - position:absolute; - top:4px; - left:4px; - border-radius:5px; -} - -.nav-site a{ - width:100%; - height:100%; - display:block; - padding:10px 3px 3px 10px; - overflow:hidden; - word-wrap:break-word; - text-decoration:none; -} - -.nav-site a:hover{ - -} - -.nav-site.has-image a{ - padding:10px 3px 3px 65px; -} - -.nav-site span.title{ - margin-left:5px; -} - -.nav-site.to-parent{ - height:36px; - background-color:white; -} - -.nav-site.to-parent a{ - padding:9px 3px 3px 30px; -} - -.nav-site.to-parent.has-image a{ - padding:9px 3px 3px 35px; -} - -.nav-site.to-parent .ui-icon{ - position:absolute; - top:9px; - left:9px; -} - -.nav-site .site-image-thumbnail{ - position:absolute; - top:8px; - left:8px; - border-radius:8px; -} - -.nav-site .site-image-icon{ - position:absolute; - top:4px; - left:8px; - border-radius:8px; -} - -.nav-site .conditions{ - font-size:0.75em; - color:black; - position:absolute; - right:1px; - bottom:1px; -} - -.nav-site .conditions span{ - display:block; - float:left; - margin:2px 2px 2px 0px; - padding:2px 5px; - background-color:#eee; - border-radius:2px; -} - -.nav-site .conditions span.overdue{ - color:white; - background-color:red; -} - -.nav-site .conditions span.elapsed-time.old{ - color:silver; -} - -.error-page{ - padding:30px 50px; - border-top:dotted 1px gray; -} - -.error-page-title{ - margin:0px 0px 20px 0px; - padding:10px 0px; - font-weight:bold; - color:red; - border-bottom:dotted 1px red; -} - -.error-page-body{ - -} - -.error-page-message{ - margin:15px 0px 0px 0px; - padding:5px 20px; - font-weight:bold; - color:white; - background-color:gray; -} - -.error-page-action{ - margin:5px 0px 0px 0px; - padding:5px 10px; - color:silver; - background-color:gainsboro; -} - -.error-page-action em{ - margin:10px; - color:black; -} - -.error-page-stacktrace{ - margin:5px 0px 0px 0px; - padding:5px 20px; - background-color:whitesmoke; -} - -.fieldset{ - -} - -.fieldset.enclosed{ - margin:0px 0px 10px 0px; - padding:10px; - border:solid 1px silver; - clear:both; -} - -.fieldset.enclosed-half{ - width:380px; - float:left; - margin:0px 0px 10px 0px; - padding:10px; - border:solid 1px silver; -} - -.fieldset.enclosed-thin{ - margin:0px 0px 10px 0px; - padding:5px 5px 5px 10px; - border:solid 1px silver; - clear:both; -} - -.fieldset.enclosed-thin [class*="field-auto"]{ - height:35px; -} - -.fieldset.enclosed-auto{ - float:left; - margin:0px 0px 10px 10px; - padding:5px 5px 5px 10px; - border:solid 1px silver; -} - -.fieldset[class^="enclosed"] > legend{ - margin:0px 0px 0px 10px; - font-weight:bold; -} - -.command-field{ - padding:10px 5px 5px 136px; - text-align:center; - clear:both; -} - -.command-field > button{ - display:block; - float:left; - margin:2px 4px; +#ExportTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -.command-center{ - padding:5px 5px 5px 5px; - text-align:center; - clear:both; +#EditorDetailTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -.command-center > button{ - display:inline; - float:none; - margin:2px 4px; +#ColumnAccessControlTabsContainer { + margin: 0px 20px 10px 20px; + clear: both; } -.command-left{ - float:left; - padding:5px 5px 5px 5px; - clear:both; +#SearchResults { + width: 80%; + float: left; + margin: 0px 100px; +} + + #SearchResults .count { + float: left; + margin: 0px 0px 10px 0px; + } + + #SearchResults .count .label { + height: 26px; + display: block; + float: left; + margin: 0px 5px 5px 0px; + padding: 5px 10px; + background: gainsboro; + border-radius: 5px; + } + + #SearchResults .count .data { + height: 26px; + display: block; + float: left; + margin: 0px 5px 5px 0px; + padding: 5px; + } + + #SearchResults .result { + width: 100%; + float: left; + padding: 15px; + border: solid 1px white; + clear: both; + } + + #SearchResults .result > ul { + display: block; + float: left; + clear: both; + } + + #SearchResults .result > h3 { + display: block; + float: left; + margin: 5px 0px; + clear: both; + } + + #SearchResults .result > h3 > a { + font-size: 1.3em; + font-weight: bold; + } + + #SearchResults .result > p { + display: block; + float: left; + clear: both; + } + + #SearchResults .result:hover { + border: solid 1px orange; + cursor: pointer; + } + +#MainCommandsContainer { + width: 100%; + height: 47px; + padding: 7px 0px 0px 0px; + background-color: rgba(0,0,0,0.65); + position: fixed; + left: 0px; + bottom: 30px; + z-index: 100; +} + +#MainCommands { + text-align: center; +} + + #MainCommands > button { + display: inline; + float: none; + margin: 2px 4px; + } + +#ApiEditorCommands { + padding: 0px 5px 200px 140px; +} + + #ApiEditorCommands > * { + margin-right: 10px; + } + +#BottomMargin { + height: 100px; + clear: both; } -.command-left > *{ - display:block; - float:left; +#Video { + width: 640px; + height: 480px; + display: block; + float: left; + margin: 0px 16px; } -.command-left > button{ - margin:2px 4px; +#Canvas { + display: none; } -.command-left > .ui-icon{ - margin:7px 3px 0px 15px; +#Footer { + width: 100%; + height: 30px; + display: block; + padding: 5px 10px; + text-align: right; + background-color: black; + position: fixed; + left: 0px; + bottom: 0px; + z-index: 100; } -.command-right{ - padding:5px 5px 5px 5px; - text-align:right; - clear:both; -} + #Footer a { + color: white; + text-decoration: none; + } -.command-right > button{ - display:inline; - float:none; - margin:2px 4px; +#Versions { + width: 500px; + margin: 150px auto 20px auto; + padding: 50px; + background-color: whitesmoke; + border-radius: 10px; } -.field-normal{ - width:340px; - height:45px; - float:left; - padding:0px 20px 10px 0px; -} + #Versions span { + margin: 10px; + line-height: 30px; + } -.field-normal > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; +.template { + width: 100%; + display: block; + float: left; } -.field-normal > .field-control{ - width:100%; - float:right; +.template-selectable { + width: 340px; + display: block; + float: left; } -:not(td) > div.field-normal .container-normal{ - width:auto; - margin-left:120px; +.template-viewer-container { + width: 100%; + display: block; + float: right; + margin: 0px 0px 0px -340px; } -td > .field-normal,td > .field-wide{ - width:100%; - padding:0px; +.template-viewer { + margin: 0px 0px 0px 340px; } -.field-normal > .buttons{ - padding:3px 10px; -} + .template-viewer .description { + margin: 10px 0px 8px 0px; + padding: 5px; + background-color: #fefedd; + border: solid 1px silver; + border-radius: 5px; + } -.field-normal .control-text{ - height:30px; -} + .template-viewer .samples-displayed { + margin: 0px 0px 8px 0px; + padding: 5px; + color: red; + background-color: pink; + border: solid 1px red; + border-radius: 5px; + } -.field-wide{ - width:100%; - min-height:45px; - float:left; - padding:0px 10px 10px 0px; - clear:both; +.template-tab-container { + min-height: 600px; } -.field-wide > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; +.main-form { + clear: both; } -.field-wide > .field-control{ - width:100%; - float:right; +.nav-sites { + margin: 0px -10px; + clear: both; } -:not(td) > div.field-wide .container-normal{ - margin-left:120px; +.nav-site { + width: 220px; + height: 70px; + float: left; + margin: 10px; + position: relative; + top: 0px; + left: 0px; + border-radius: 5px; +} + + .nav-site.sites { + } + + .nav-site .heading { + width: 50px; + height: 9px; + position: absolute; + top: -10px; + left: 5px; + border-radius: 3px 3px 0px 0px / 3px 3px 0px 0px; + } + + .nav-site.dashboards { + box-shadow: 4px 4px 2px rgba(0, 0, 0, 0.2); + } + + .nav-site .stacking1 { + width: 220px; + height: 70px; + border-bottom: solid 1px silver; + border-right: solid 1px silver; + position: absolute; + top: 1px; + left: 1px; + border-radius: 5px; + } + + .nav-site .stacking2 { + width: 220px; + height: 70px; + border-bottom: solid 1px silver; + border-right: solid 1px silver; + position: absolute; + top: 4px; + left: 4px; + border-radius: 5px; + } + + .nav-site a { + width: 100%; + height: 100%; + display: block; + padding: 10px 3px 3px 10px; + overflow: hidden; + word-wrap: break-word; + text-decoration: none; + } + + .nav-site a:hover { + } + + .nav-site.has-image a { + padding: 10px 3px 3px 65px; + } + + .nav-site span.title { + margin-left: 5px; + } + + .nav-site.to-parent { + height: 36px; + background-color: white; + } + + .nav-site.to-parent a { + padding: 9px 3px 3px 30px; + } + + .nav-site.to-parent.has-image a { + padding: 9px 3px 3px 35px; + } + + .nav-site.to-parent .ui-icon { + position: absolute; + top: 9px; + left: 9px; + } + + .nav-site .site-image-thumbnail { + position: absolute; + top: 8px; + left: 8px; + border-radius: 8px; + } + + .nav-site .site-image-icon { + position: absolute; + top: 4px; + left: 8px; + border-radius: 8px; + } + + .nav-site .conditions { + font-size: 0.75em; + color: black; + position: absolute; + right: 1px; + bottom: 1px; + } + + .nav-site .conditions span { + display: block; + float: left; + margin: 2px 2px 2px 0px; + padding: 2px 5px; + background-color: #eee; + border-radius: 2px; + } + + .nav-site .conditions span.overdue { + color: white; + background-color: red; + } + + .nav-site .conditions span.elapsed-time.old { + color: silver; + } + +.error-page { + padding: 30px 50px; + border-top: dotted 1px gray; +} + +.error-page-title { + margin: 0px 0px 20px 0px; + padding: 10px 0px; + font-weight: bold; + color: red; + border-bottom: dotted 1px red; +} + +.error-page-body { +} + +.error-page-message { + margin: 15px 0px 0px 0px; + padding: 5px 20px; + font-weight: bold; + color: white; + background-color: gray; +} + +.error-page-action { + margin: 5px 0px 0px 0px; + padding: 5px 10px; + color: silver; + background-color: gainsboro; +} + + .error-page-action em { + margin: 10px; + color: black; + } + +.error-page-stacktrace { + margin: 5px 0px 0px 0px; + padding: 5px 20px; + background-color: whitesmoke; +} + +.fieldset { +} + + .fieldset.enclosed { + margin: 0px 0px 10px 0px; + padding: 10px; + border: solid 1px silver; + clear: both; + } + + .fieldset.enclosed-half { + width: 380px; + float: left; + margin: 0px 0px 10px 0px; + padding: 10px; + border: solid 1px silver; + } + + .fieldset.enclosed-thin { + margin: 0px 0px 10px 0px; + padding: 5px 5px 5px 10px; + border: solid 1px silver; + clear: both; + } + + .fieldset.enclosed-thin [class*="field-auto"] { + height: 35px; + } + + .fieldset.enclosed-auto { + float: left; + margin: 0px 0px 10px 10px; + padding: 5px 5px 5px 10px; + border: solid 1px silver; + } + + .fieldset[class^="enclosed"] > legend { + margin: 0px 0px 0px 10px; + font-weight: bold; + } + +.command-field { + padding: 10px 5px 5px 136px; + text-align: center; + clear: both; } -.field-markdown{ - width:100%; - min-height:45px; - float:left; - padding:0px 10px 10px 0px; - clear:both; -} + .command-field > button { + display: block; + float: left; + margin: 2px 4px; + } -.field-markdown > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; +.command-center { + padding: 5px 5px 5px 5px; + text-align: center; + clear: both; } -.field-markdown > .field-control{ - width:100%; - float:right; -} + .command-center > button { + display: inline; + float: none; + margin: 2px 4px; + } -:not(td) > div.field-markdown .container-normal{ - margin-left:120px; +.command-left { + float: left; + padding: 5px 5px 5px 5px; + clear: both; } -.field-textarea{ - width:100%; - min-height:45px; - float:left; - padding:0px 10px 10px 0px; - clear:both; -} + .command-left > * { + display: block; + float: left; + } -.field-textarea > .field-label{ - width:120px; - float:left; - margin-right:-120px; - padding:7px 7px 7px 0px; - text-align:right; -} + .command-left > button { + margin: 2px 4px; + } -.field-textarea > .field-control{ - width:100%; - float:right; -} + .command-left > .ui-icon { + margin: 7px 3px 0px 15px; + } -:not(td) > div.field-textarea .container-normal{ - margin-left:120px; +.command-right { + padding: 5px 5px 5px 5px; + text-align: right; + clear: both; } -.field-auto{ - width:auto; - height:45px; - float:left; - margin-right:35px; - padding:0px 10px 10px 0px; -} + .command-right > button { + display: inline; + float: none; + margin: 2px 4px; + } -.field-auto > .field-label{ - width:120px; - float:left; - padding:7px 7px 7px 0px; - text-align:right; +.field-normal { + width: 340px; + height: 45px; + float: left; + padding: 0px 20px 10px 0px; } -.field-auto > .field-label > label{ + .field-normal > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -} + .field-normal > .field-control { + width: 100%; + float: right; + } -.field-auto > .field-control{ - width:auto; - float:left; +:not(td) > div.field-normal .container-normal { + width: auto; + margin-left: 120px; } -.field-auto-thin{ - width:auto; - height:45px; - float:left; - margin:0px 5px; - padding:0px 10px 10px 0px; +td > .field-normal, td > .field-wide { + width: 100%; + padding: 0px; } -.field-auto-thin > .field-label{ - float:left; - padding:7px 7px 7px 0px; - text-align:right; +.field-normal > .buttons { + padding: 3px 10px; } -.field-auto-thin > .field-label > label{ - +.field-normal .control-text { + height: 30px; } -.field-auto-thin > .field-control{ - width:auto; - float:left; +.field-wide { + width: 100%; + min-height: 45px; + float: left; + padding: 0px 10px 10px 0px; + clear: both; } -.field-auto-thin select{ - max-width:120px; -} + .field-wide > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -.field-vertical{ - width:330px; - height:100%; - float:left; - padding:0px 20px 20px 0px; -} + .field-wide > .field-control { + width: 100%; + float: right; + } -.field-vertical > .field-label{ - width:100%; - float:left; - margin-right:-120px; - padding:5px 10px; - text-align:center; +:not(td) > div.field-wide .container-normal { + margin-left: 120px; } -.field-vertical > .field-control{ - width:100%; - float:left; - clear:both; +.field-markdown { + width: 100%; + min-height: 45px; + float: left; + padding: 0px 10px 10px 0px; + clear: both; } -.field-label{ - overflow:hidden; -} + .field-markdown > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -label.required:after{ - margin-left:3px; - color:red; - content:'*'; -} + .field-markdown > .field-control { + width: 100%; + float: right; + } -.field-control .unit{ - display:block; - float:left; - padding:5px 0px 0px 5px; +:not(td) > div.field-markdown .container-normal { + margin-left: 120px; } -.field-section{ - width:100%; - display:block; - float:left; - margin:15px; - padding:2px 5px; - font-weight:bold; - border-bottom:solid 1px silver; - clear:both; +.field-textarea { + width: 100%; + min-height: 45px; + float: left; + padding: 0px 10px 10px 0px; + clear: both; } -.container-normal{ - position:relative; -} + .field-textarea > .field-label { + width: 120px; + float: left; + margin-right: -120px; + padding: 7px 7px 7px 0px; + text-align: right; + } -.container-left{ - width:340px; - float:left; - margin-right:-340px; - padding:0px 0px 15px 0px; - position:relative; + .field-textarea > .field-control { + width: 100%; + float: right; + } + +:not(td) > div.field-textarea .container-normal { + margin-left: 120px; +} + +.field-auto { + width: auto; + height: 45px; + float: left; + margin-right: 35px; + padding: 0px 10px 10px 0px; +} + + .field-auto > .field-label { + width: 120px; + float: left; + padding: 7px 7px 7px 0px; + text-align: right; + } + + .field-auto > .field-label > label { + } + + .field-auto > .field-control { + width: auto; + float: left; + } + +.field-auto-thin { + width: auto; + height: 45px; + float: left; + margin: 0px 5px; + padding: 0px 10px 10px 0px; +} + + .field-auto-thin > .field-label { + float: left; + padding: 7px 7px 7px 0px; + text-align: right; + } + + .field-auto-thin > .field-label > label { + } + + .field-auto-thin > .field-control { + width: auto; + float: left; + } + + .field-auto-thin select { + max-width: 120px; + } + +.field-vertical { + width: 330px; + height: 100%; + float: left; + padding: 0px 20px 20px 0px; +} + + .field-vertical > .field-label { + width: 100%; + float: left; + margin-right: -120px; + padding: 5px 10px; + text-align: center; + } + + .field-vertical > .field-control { + width: 100%; + float: left; + clear: both; + } + +.field-label { + overflow: hidden; +} + +label.required:after { + margin-left: 3px; + color: red; + content: '*'; +} + +.field-control .unit { + display: block; + float: left; + padding: 5px 0px 0px 5px; +} + +.field-section { + width: 100%; + display: block; + float: left; + margin: 15px; + padding: 2px 5px; + font-weight: bold; + border-bottom: solid 1px silver; + clear: both; } -.container-right{ - width:100%; - float:right; - position:relative; +.container-normal { + position: relative; } -.container-right > *{ - display:block; - margin-left:340px; +.container-left { + width: 340px; + float: left; + margin-right: -340px; + padding: 0px 0px 15px 0px; + position: relative; +} + +.container-right { + width: 100%; + float: right; + position: relative; } - -.control-text{ - width:100%; - min-height:30px; - display:block; - padding:6px 4px 2px 4px; - color:black; - background:whitesmoke; - border:solid 1px silver; - overflow:hidden; - border-radius:5px; + + .container-right > * { + display: block; + margin-left: 340px; + } + +.control-text { + width: 100%; + min-height: 30px; + display: block; + padding: 6px 4px 2px 4px; + color: black; + background: whitesmoke; + border: solid 1px silver; + overflow: hidden; + border-radius: 5px; } -.control-textbox{ - width:100%; - height:30px; - padding:4px; - border:solid 1px silver; - border-radius:5px; +.control-textbox { + width: 100%; + height: 30px; + padding: 4px; + border: solid 1px silver; + border-radius: 5px; } -.control-textbox.with-unit{ - width:70%; - display:block; - float:left; -} + .control-textbox.with-unit { + width: 70%; + display: block; + float: left; + } -.control-textbox.anchor{ - width:100%; - height:30px; - padding:4px; - border:solid 1px silver; - border-radius:5px; - z-index:0; -} + .control-textbox.anchor { + width: 100%; + height: 30px; + padding: 4px; + border: solid 1px silver; + border-radius: 5px; + z-index: 0; + } -.control-textarea{ - width:100%; - height:100px; - padding:4px 4px 4px 6px; - border:solid 1px silver; - border-radius:5px; +.control-textarea { + width: 100%; + height: 100px; + padding: 4px 4px 4px 6px; + border: solid 1px silver; + border-radius: 5px; } -.container-radio>label.error{ - top:0px; +.container-radio > label.error { + top: 0px; } -.control-attachments+label.error{ - height:22px; - position:absolute; - top:50px; +.control-attachments + label.error { + height: 22px; + position: absolute; + top: 50px; } -.control-attachments-upload{ - width:100%; - display:block; - float:left; - padding:25px 0px; - text-align:center; - border:dotted 2px #d19405; - border-radius:3px; +.control-attachments-upload { + width: 100%; + display: block; + float: left; + padding: 25px 0px; + text-align: center; + border: dotted 2px #d19405; + border-radius: 3px; } -.control-attachments-items{ - width:100%; - display:block; - float:left; +.control-attachments-items { + width: 100%; + display: block; + float: left; } -.control-attachments-item{ - width:100%; - display:block; - float:left; - margin:5px 0px 0px 0px; - padding:5px 10px; - text-align:left; - border:solid 1px #d19405; - border-radius:5px; -} +.control-attachments-item { + width: 100%; + display: block; + float: left; + margin: 5px 0px 0px 0px; + padding: 5px 10px; + text-align: left; + border: solid 1px #d19405; + border-radius: 5px; +} + +.progress-bar { + width: 100%; + height: 30px; + display: block; + float: left; + margin: 5px 0px 0px 0px; + vertical-align: top; + border: solid 1px #d19405; + overflow: hidden; + border-radius: 5px; +} + + .progress-bar > div { + width: 0; + height: 100%; + line-height: 22px; + color: white; + background-color: #fece2f; + border-radius: 3px; + } + +.already-attachments { + background-color: #fece2f; +} + +.preparation-delete { + background-color: whitesmoke; + border: solid 1px silver; +} + + .preparation-delete > a { + color: silver; + } + +.show-file { + display: block; + float: left; + margin: 0px; +} + +.file-name { + display: block; + float: left; +} + +.delete-file { + display: block; + float: right; + margin: 2px -5px 0px 0px; +} + +.field-control .control-markup { + width: 100%; + min-height: 100px; + float: left; + padding: 4px 25px 4px 6px; + color: black; + background: whitesmoke; + border: solid 1px silver; + border-radius: 5px; +} + +.md { + width: 100%; + float: left; + line-height: 1.5em; + font-family: Terminal,Hiragino Kaku Gothic Pro; + word-wrap: break-word; + word-break: break-all; +} + + .md > * { + float: left; + clear: both; + } + + .md h1 { + margin: 10px 0px 10px 0px; + font-weight: bold; + } + + .md h1:not(:first-child) { + margin: 20px 0px 10px 0px; + } + + .md h2 { + margin: 5px 0px 8px 0px; + font-weight: bold; + } + + .md h2:not(:first-child) { + margin: 20px 0px 8px 0px; + } + + .md h3 { + margin: 3px 0px 6px 0px; + font-weight: bold; + } + + .md h3:not(:first-child) { + margin: 10px 0px 6px 0px; + } + + .md h4 { + margin: 3px 0px 4px 0px; + font-weight: bold; + } + + .md h4:not(:first-child) { + margin: 10px 0px 4px 0px; + } + + .md h5 { + margin: 3px 0px 2px 0px; + font-weight: bold; + } + + .md h5:not(:first-child) { + margin: 10px 0px 2px 0px; + } -.progress-bar{ - width:100%; - height:30px; - display:block; - float:left; - margin:5px 0px 0px 0px; - vertical-align:top; - border:solid 1px #d19405; - overflow:hidden; - border-radius:5px; + .md h6 { + margin: 3px 0px 2px 0px; + font-weight: bold; + } + + .md h6:not(:first-child) { + margin: 10px 0px 2px 0px; + } + + .md hr { + float: none; + clear: both; + } + + .md ol { + margin: 0px 10px 10px 32px; + list-style-type: decimal; + } + + .md p { + margin: 0px 0px 10px 0px; + clear: both; + } + + .md table { + width: auto; + margin: 0px 0px 10px 0px; + background-color: white; + } + + .md td { + padding: 5px 10px; + border: solid 1px silver; + } + + .md th { + padding: 5px 10px; + font-weight: bold; + border: solid 1px silver; + } + + .md tbody tr:nth-child(odd) { + background-color: whitesmoke; + } + + .md ul { + margin: 0px 10px 10px 32px; + list-style-type: disc; + } + +.control-markdown { + width: 100%; + display: none; + padding: 4px 4px 4px 6px; + border: solid 1px silver; + border-radius: 5px; +} + +.control-dropdown { + width: 100%; + height: 30px; + padding: 4px; + border: solid 1px silver; + border-radius: 5px; +} + +.control-spinner { + width: auto; + height: 22px; + display: block; + float: left; + padding: 1px; + color: black; +} + +.control-checkbox { + display: block; + float: left; + margin: 8px 0px; +} + + .control-checkbox ~ label { + display: block; + float: left; + margin: 7px 5px 0px 6px; + } + + .control-checkbox + .ui-icon.ui-icon-info { + display: block; + float: left; + margin: 7px -7px 0px 0px; + } + +.field-normal .control-checkbox + label { + width: 175px; +} + +_::-webkit-full-page-media, _:future, :root .field-normal .control-checkbox + label { + width: 172px; } -.progress-bar > div{ - width:0; - height:100%; - line-height:22px; - color:white; - background-color:#fece2f; - border-radius:3px; +.container-radio { + padding: 7px 0px; } -.already-attachments{ - background-color:#fece2f; -} + .container-radio > label { + display: block; + float: left; + margin: 0px 5px 0px 0px; + white-space: nowrap; + } -.preparation-delete{ - background-color:whitesmoke; - border:solid 1px silver; +.control-radio { + display: block; + float: left; + margin: 3px; } -.preparation-delete > a{ - color:silver; +.radio-clear-both .container-radio > label { + clear: both; } -.show-file{ - display:block; - float:left; - margin:0px; +.control-slider { + width: 30px; + float: left; + margin: 8px 0px 0px 12px; +} + +.control-slider-ui { + width: 140px; + float: left; + margin: 11px 0px 0px 5px; +} + +.container-selectable .wrapper { + width: 100%; + min-height: 300px; + display: block; + float: left; + background-color: whitesmoke; + border: solid 1px silver; + overflow: auto; + border-radius: 5px; +} + +.control-selectable { + width: 100%; + display: block; + float: left; + padding: 5px 10px 5px 5px; + list-style-type: none; + touch-action: pan-y; +} + + .control-selectable li { + width: 100%; + min-height: 24px; + margin: 3px; + padding: 2px 5px; + border-radius: 5px; + } + + .control-selectable .ui-selecting { + } + + .control-selectable .ui-selected { + } + +.control-basket { + margin-left: 120px; + padding: 5px 5px 0px 5px; + background-color: whitesmoke; + border: solid 1px silver; + border-radius: 5px; +} + + .control-basket > li { + display: block; + float: left; + margin: 0px 5px 5px 0px; + padding: 3px 5px; + border-radius: 5px; + } + + .control-basket > li > span { + display: block; + float: left; + z-index: 2; + } + +.comment { + width: 100%; + display: block; + float: left; + margin: 0px 0px 5px 0px; + padding: 5px 10px 10px 20px; + background: lightgoldenrodyellow; + border: solid 1px silver; + position: relative; + clear: both; } -.file-name{ - display:block; - float:left; -} + .comment > * { + display: block; + float: left; + } -.delete-file{ - display:block; - float:right; - margin:2px -5px 0px 0px; -} + .comment > .time { + float: left; + margin: 0px 0px 8px -10px; + margin-right: 10px; + } -.field-control .control-markup{ - width:100%; - min-height:100px; - float:left; - padding:4px 25px 4px 6px; - color:black; - background:whitesmoke; - border:solid 1px silver; - border-radius:5px; -} + .comment > .body { + width: 100%; + clear: both; + } -.md{ - width:100%; - float:left; - line-height:1.5em; - font-family:Terminal,Hiragino Kaku Gothic Pro; - word-wrap:break-word; - word-break:break-all; -} + .comment > .button.edit { + position: absolute; + top: 3px; + right: 20px; + cursor: pointer; + } -.md > *{ - float:left; - clear:both; -} + .comment > .button.delete { + position: absolute; + top: 3px; + right: 5px; + cursor: pointer; + } -.md h1{ - margin:10px 0px 10px 0px; - font-weight:bold; -} + .comment > .control-markup { + width: 100%; + } -.md h1:not(:first-child){ - margin:20px 0px 10px 0px; -} + .comment > .control-markdown { + width: 100%; + display: none; + } -.md h2{ - margin:5px 0px 8px 0px; - font-weight:bold; +.user { + float: left; } -.md h2:not(:first-child){ - margin:20px 0px 8px 0px; -} + .user > span { + display: block; + float: left; + font-weight: bold; + } -.md h3{ - margin:3px 0px 6px 0px; - font-weight:bold; +.dept { + float: left; } -.md h3:not(:first-child){ - margin:10px 0px 6px 0px; -} + .dept > span { + display: block; + float: left; + font-weight: bold; + } -.md h4{ - margin:3px 0px 4px 0px; - font-weight:bold; +.both { + clear: both; } -.md h4:not(:first-child){ - margin:10px 0px 4px 0px; +.hidden { + display: none; } -.md h5{ - margin:3px 0px 2px 0px; - font-weight:bold; +.right { + float: right; } -.md h5:not(:first-child){ - margin:10px 0px 2px 0px; +.right-align { + text-align: right; + text-align-last: right; } -.md h6{ - margin:3px 0px 2px 0px; - font-weight:bold; +.tooltip { + display: none; + position: absolute; } - -.md h6:not(:first-child){ - margin:10px 0px 2px 0px; + +.no-border { + border: none; } - -.md hr{ - float:none; - clear:both; + +.grid { + margin: 0px 0px 10px 0px; } -.md ol{ - margin:0px 10px 10px 32px; - list-style-type:decimal; -} + .grid.fixed { + table-layout: fixed; + } + + .grid > thead > tr > caption { + margin: 0px 0px 5px 0px; + } + + .grid > thead > tr > th { + padding: 6px; + vertical-align: middle; + border-top: solid 1px transparent; + border-bottom: solid 1px transparent; + border-left: solid 1px transparent; + border-right: solid 1px white; + word-wrap: break-word; + } -.md p{ - margin:0px 0px 10px 0px; - clear:both; -} + .grid > thead > tr > th > div { + width: 100%; + float: left; + text-align: center; + z-index: 2; + } -.md table{ - width:auto; - margin:0px 0px 10px 0px; - background-color:white; -} + .grid > thead > tr > th span { + display: block; + float: left; + } -.md td{ - padding:5px 10px; - border:solid 1px silver; -} + .grid > thead > tr:first-child > th:first-child { + border-radius: 10px 0px 0px 0px / 10px 0px 0px 0px; + } -.md th{ - padding:5px 10px; - font-weight:bold; - border:solid 1px silver; -} + .grid > thead > tr:first-child > th:last-child { + border-right: solid 1px transparent; + border-radius: 0px 10px 0px 0px / 0px 10px 0px 0px; + } -.md tbody tr:nth-child(odd){ - background-color:whitesmoke; -} + .grid > thead > tr > th.sortable:hover { + cursor: pointer; + } -.md ul{ - margin:0px 10px 10px 32px; - list-style-type:disc; -} + .grid > tbody > tr > td { + max-width: 300px; + border-left: dotted 1px silver; + border-right: dotted 1px silver; + word-wrap: break-word; + } -.control-markdown{ - width:100%; - display:none; - padding:4px 4px 4px 6px; - border:solid 1px silver; - border-radius:5px; -} + .grid > tbody > tr.message-row > td { + padding: 0px; + text-align: center; + } -.control-dropdown{ - width:100%; - height:30px; - padding:4px; - border:solid 1px silver; - border-radius:5px; -} + .grid > tbody > tr [class*="status-"] { + padding: 0px 5px; + font-weight: bold; + border: solid 1px silver; + border-radius: 3px; + } -.control-spinner{ - width:auto; - height:22px; - display:block; - float:left; - padding:1px; - color:black; -} + .grid > tbody > tr > th { + padding: 6px; + vertical-align: middle; + font-weight: normal; + background-color: gainsboro; + border-top: solid 1px white; + border-bottom: solid 1px white; + border-left: solid 1px transparent; + border-right: solid 1px transparent; + word-wrap: break-word; + } -.control-checkbox{ - display:block; - float:left; - margin:8px 0px; +.grid-row { + background-color: white; + border-bottom: solid 1px silver; } -.control-checkbox ~ label{ - display:block; - float:left; - margin:7px 5px 0px 6px; -} + .grid-row td { + overflow: hidden; + } -.control-checkbox + .ui-icon.ui-icon-info{ - display:block; - float:left; - margin:7px -7px 0px 0px; + .grid-row .comment { + min-width: 200px; + max-height: 100px; + margin: 0px 0px 3px 0px; + padding: 3px 6px 3px 15px; + background: lightgoldenrodyellow; + border: solid 1px white; + clear: both; + overflow: hidden; + } + + .grid-row .comment.one-third { + max-height: 306px; + } + + .grid-row .comment.half { + max-height: 151px; + } + +.grid:not(.not-link) .grid-row:hover { + background-color: whitesmoke; + cursor: pointer; +} + +.grid-row:hover .comment { + background-color: lightyellow; +} + +.grid-row:hover .grid-title-body { +} + +.grid-row p { + float: left; +} + + .grid-row p.body { + clear: both; + } + +.grid-row[data-history] { + background-color: lightgray; +} + +.grid-title-body { + min-width: 200px; + max-height: 306px; + margin: 0px 0px 3px 0px; + padding: 3px 6px; + background: inherit; + border: solid 1px transparent; + clear: both; + overflow: hidden; } -.field-normal .control-checkbox + label{ - width:175px; -} + .grid-title-body > .body { + width: 100%; + } -_::-webkit-full-page-media, _:future, :root .field-normal .control-checkbox + label{ - width: 172px; -} + .grid-title-body > .title + .body { + padding: 8px 0px 0px 10px; + } -.container-radio{ - padding:7px 0px; +.links { + padding: 0px 10px; } -.container-radio > label{ - display:block; - float:left; - margin:0px 5px 0px 0px; - white-space:nowrap; +.link-creations button { + display: block; + float: left; + margin: 0px 10px 0px 0px; } -.control-radio{ - display:block; - float:left; - margin:3px; +.text { + width: 250px; + display: block; + float: left; + border: solid 1px silver; } -.radio-clear-both .container-radio > label{ - clear:both; +.datepicker { + display: block; + float: left; + border: solid 1px silver; } -.control-slider{ - width:30px; - float:left; - margin:8px 0px 0px 12px; +.dropdown { + display: block; + float: left; + border: solid 1px silver; } -.control-slider-ui{ - width:140px; - float:left; - margin:11px 0px 0px 5px; +[class*="limit-"] { + margin-left: 10px; + padding: 0px 5px; } -.container-selectable .wrapper{ - width:100%; - min-height:300px; - display:block; - float:left; - background-color:whitesmoke; - border:solid 1px silver; - overflow:auto; - border-radius:5px; +.limit-normal { } -.control-selectable{ - width:100%; - display:block; - float:left; - padding:5px 10px 5px 5px; - list-style-type:none; - touch-action:pan-y; +.limit-warning1 { + color: red; } -.control-selectable li{ - width:100%; - min-height:24px; - margin:3px; - padding:2px 5px; - border-radius:5px; +.limit-warning2 { + color: red; + background-color: #ffccd5; } -.control-selectable .ui-selecting{ - +.limit-warning3 { + color: white; + background-color: red; } -.control-selectable .ui-selected{ - +.message { + width: 100%; + text-align: center; + position: fixed; + left: 0px; + bottom: 78px; + z-index: 100; } -.control-basket{ - margin-left:120px; - padding:5px 5px 0px 5px; - background-color:whitesmoke; - border:solid 1px silver; - border-radius:5px; -} + .message .body { + margin-bottom: 4px; + position: relative; + border-radius: 20px; + } -.control-basket > li{ - display:block; - float:left; - margin:0px 5px 5px 0px; - padding:3px 5px; - border-radius:5px; -} + .message .close { + background-color: white; + position: absolute; + top: 11px; + right: 8px; + cursor: pointer; + border-radius: 10px; + } -.control-basket > li > span{ - display:block; - float:left; - z-index:2; +.message-dialog { + width: 100%; + display: block; + float: left; + margin: 0px auto; + text-align: center; } -.comment{ - width:100%; - display:block; - float:left; - margin:0px 0px 5px 0px; - padding:5px 10px 10px 20px; - background:lightgoldenrodyellow; - border:solid 1px silver; - position:relative; - clear:both; +.message-form-bottom { + width: 600px; + margin: 0px auto; + text-align: center; } -.comment > *{ - display:block; - float:left; +.alert-error { + min-height: 32px; + display: block; + padding: 5px; + color: white; + background-color: rgba(255,0,0,0.9); + border: solid 1px red; } -.comment > .time{ - float:left; - margin:0px 0px 8px -10px; - margin-right:10px; +.alert-success { + min-height: 32px; + display: block; + padding: 5px; + color: white; + background-color: rgba(0,128,0,0.9); + border: solid 1px green; } -.comment > .body{ - width:100%; - clear:both; +.alert-warning { + min-height: 32px; + display: block; + padding: 5px; + color: black; + background-color: yellow; + border: solid 1px yellow; } -.comment > .button.edit{ - position:absolute; - top:3px; - right:20px; - cursor:pointer; +.alert-information { + min-height: 32px; + display: block; + padding: 5px; + color: white; + background-color: blue; + border: solid 1px blue; } -.comment > .button.delete{ - position:absolute; - top:3px; - right:5px; - cursor:pointer; +label.error { + width: 100%; + display: block; + float: left; + padding: 0px 5px; + color: red; + background-color: white; + border-top: none; + top: -5px; + left: 0px; + border-radius: 0px 0px 5px 5px / 0px 0px 5px 5px; + z-index: 2; } -.comment > .control-markup{ - width:100%; +.ui-spinner > label.error { + margin-top: 3px; } -.comment > .control-markdown{ - width:100%; - display:none; +.error { + border: solid 1px red; } -.user{ - float:left; -} + .error + .ui-widget.ui-state-default.ui-multiselect { + border: solid 1px red; + } -.user > span{ - display:block; - float:left; - font-weight:bold; +.with-unit + label.error { + width: 70%; + position: absolute; + top: 25px; } -.dept{ - float:left; +.button-edit-markdown { + position: absolute; + top: 5px; + right: 5px; + cursor: pointer; + z-index: 1; } -.dept > span{ - display:block; - float:left; - font-weight:bold; +.comment > .button-edit-markdown { + top: 6px; + right: 20px; } -.both{ - clear:both; +.button-delete-address { + cursor: pointer; } -.hidden{ - display:none; +.button-right-justified { + float: right; } -.right{ - float:right; +.status-new { + background: white; } -.right-align{ - text-align:right; - text-align-last:right; +.status-preparation { + color: white; + background: darkorange; } -.tooltip{ - display:none; - position:absolute; +.status-inprogress { + color: white; + background: green; } -.no-border{ - border:none; +.status-review { + background: yellow; } -.grid{ - margin:0px 0px 10px 0px; +.status-closed { + color: white; + background: blue; } -.grid.fixed{ - table-layout:fixed; +.status-rejected { + color: white; + background: gray; } -.grid > thead > tr > caption{ - margin:0px 0px 5px 0px; +.always-hidden { + display: none; } -.grid > thead > tr > th{ - padding:6px; - vertical-align:middle; - border-top:solid 1px transparent; - border-bottom:solid 1px transparent; - border-left:solid 1px transparent; - border-right:solid 1px white; - word-wrap:break-word; +h3.title-header { + height: 40px; + padding: 10px 20px; + text-align: center; + background-color: gainsboro; + border: solid 1px darkgray; + border-radius: 10px 10px 0px 0px / 10px 10px 0px 0px; } -.grid > thead > tr > th > div{ - width:100%; - float:left; - text-align:center; - z-index:2; +.outgoing-mail .dialog { + padding: 0px !important; } -.grid > thead > tr > th span{ - display:block; - float:left; +.outgoing-mail .ui-dialog-titlebar { + display: none; } -.grid > thead > tr:first-child > th:first-child{ - border-radius:10px 0px 0px 0px / 10px 0px 0px 0px; +.svg-work-value { + width: 50px; + height: 40px; } -.grid > thead > tr:first-child > th:last-child{ - border-right:solid 1px transparent; - border-radius:0px 10px 0px 0px / 0px 10px 0px 0px; -} + .svg-work-value text { + } -.grid > thead > tr > th.sortable:hover{ - cursor:pointer; -} + .svg-work-value rect:nth-of-type(1) { + fill: gainsboro; + } -.grid > tbody > tr > td{ - max-width:300px; - border-left:dotted 1px silver; - border-right:dotted 1px silver; - word-wrap:break-word; -} + .svg-work-value rect:nth-of-type(2) { + fill: darkseagreen; + } -.grid > tbody > tr.message-row > td{ - padding:0px; - text-align:center; +.svg-progress-rate { + width: 50px; + height: 40px; } -.grid > tbody > tr [class*="status-"]{ - padding:0px 5px; - font-weight:bold; - border:solid 1px silver; - border-radius:3px; -} + .svg-progress-rate text { + } -.grid > tbody > tr > th{ - padding:6px; - vertical-align:middle; - font-weight:normal; - background-color:gainsboro; - border-top:solid 1px white; - border-bottom:solid 1px white; - border-left:solid 1px transparent; - border-right:solid 1px transparent; - word-wrap:break-word; -} + .svg-progress-rate.warning text { + fill: red; + } -.grid-row{ - background-color:white; - border-bottom:solid 1px silver; -} + .svg-progress-rate rect:nth-of-type(1) { + fill: gainsboro; + } -.grid-row td{ - overflow:hidden; -} + .svg-progress-rate rect:nth-of-type(2) { + fill: gray; + } -.grid-row .comment{ - min-width:200px; - max-height:100px; - margin:0px 0px 3px 0px; - padding:3px 6px 3px 15px; - background:lightgoldenrodyellow; - border:solid 1px white; - clear:both; - overflow:hidden; -} + .svg-progress-rate rect:nth-of-type(3) { + fill: darkseagreen; + } -.grid-row .comment.one-third{ - max-height:306px; -} + .svg-progress-rate.warning rect:nth-of-type(3) { + fill: #ffccd5; + } -.grid-row .comment.half{ - max-height:151px; +.svg-kamban-aggregation-view { + width: 100%; + height: 20px; } -.grid:not(.not-link) .grid-row:hover{ - background-color:whitesmoke; - cursor:pointer; -} + .svg-kamban-aggregation-view rect { + height: 20px; + fill: darkseagreen; + } -.grid-row:hover .comment{ - background-color:lightyellow; +.svg-crosstab { + width: 100%; + height: 20px; } -.grid-row:hover .grid-title-body{ + .svg-crosstab rect { + height: 20px; + fill: darkseagreen; + } +.axis { + fill: none; + stroke: gray; + shape-rendering: crispEdges; } -.grid-row p{ - float:left; +.h2 { + margin: 0px 0px 5px 0px; + padding: 0px; } -.grid-row p.body{ - clear:both; +.h3 { + margin: 0px 0px 5px 10px; + padding: 0px; } -.grid-row[data-history]{ - background-color:lightgray; +.h4 { + margin: 0px 0px 5px 20px; + padding: 0px; } -.grid-title-body{ - min-width:200px; - max-height:306px; - margin:0px 0px 3px 0px; - padding:3px 6px; - background:inherit; - border:solid 1px transparent; - clear:both; - overflow:hidden; +.h5 { + margin: 0px 0px 5px 30px; + padding: 0px; } -.grid-title-body > .body{ - width:100%; +.h6 { + margin: 0px 0px 5px 40px; + padding: 0px; } -.grid-title-body > .title + .body{ - padding:8px 0px 0px 10px; +.h2 > h2 { + padding: 5px 0px; + font-weight: bold; + border-bottom: solid 1px silver; } -.links{ - padding:0px 10px; +.h3 > h3 { + font-weight: bold; } -.link-creations button{ - display:block; - float:left; - margin:0px 10px 0px 0px; +.h4 > h4 { + font-weight: bold; } -.text{ - width:250px; - display:block; - float:left; - border:solid 1px silver; +.h5 > h5 { + font-weight: bold; } -.datepicker{ - display:block; - float:left; - border:solid 1px silver; +.h6 > h6 { + font-weight: bold; } -.dropdown{ - display:block; - float:left; - border:solid 1px silver; +.w50 { + width: 50px; } -[class*="limit-"]{ - margin-left:10px; - padding:0px 5px; +.w100 { + width: 100px; } -.limit-normal{ - +.w150 { + width: 150px; } -.limit-warning1{ - color:red; +.w200 { + width: 200px; } -.limit-warning2{ - color:red; - background-color:#ffccd5; +.w250 { + width: 250px; } -.limit-warning3{ - color:white; - background-color:red; +.w300 { + width: 300px; } -.message{ - width:100%; - text-align:center; - position:fixed; - left:0px; - bottom:78px; - z-index:100; +.w350 { + width: 350px; } -.message .body{ - margin-bottom:4px; - position:relative; - border-radius:20px; +.w400 { + width: 400px; } -.message .close{ - background-color:white; - position:absolute; - top:11px; - right:8px; - cursor:pointer; - border-radius:10px; +.w450 { + width: 450px; } -.message-dialog{ - width:100%; - display:block; - float:left; - margin:0px auto; - text-align:center; +.w500 { + width: 500px; } -.message-form-bottom{ - width:600px; - margin:0px auto; - text-align:center; +.w550 { + width: 550px; } -.alert-error{ - min-height:32px; - display:block; - padding:5px; - color:white; - background-color:rgba(255,0,0,0.9); - border:solid 1px red; +.w600 { + width: 600px; } -.alert-success{ - min-height:32px; - display:block; - padding:5px; - color:white; - background-color:rgba(0,128,0,0.9); - border:solid 1px green; +.h100 { + height: 100px; } -.alert-warning{ - min-height:32px; - display:block; - padding:5px; - color:black; - background-color:yellow; - border:solid 1px yellow; +.h150 { + height: 150px; } -.alert-information{ - min-height:32px; - display:block; - padding:5px; - color:white; - background-color:blue; - border:solid 1px blue; +.h200 { + height: 200px; } -label.error{ - width:100%; - display:block; - float:left; - padding:0px 5px; - color:red; - background-color:white; - border-top:none; - top:-5px; - left:0px; - border-radius:0px 0px 5px 5px / 0px 0px 5px 5px; - z-index:2; +.h250 { + height: 250px; } -.ui-spinner>label.error{ - margin-top:3px; +.h300 { + height: 300px; } -.error{ - border:solid 1px red; +.h350 { + height: 350px; } -.error+.ui-widget.ui-state-default.ui-multiselect{ - border:solid 1px red; +.h400 { + height: 400px; } -.with-unit+label.error{ - width:70%; - position:absolute; - top:25px; +.h450 { + height: 450px; } -.button-edit-markdown{ - position:absolute; - top:5px; - right:5px; - cursor:pointer; - z-index:1; +.h500 { + height: 500px; } -.comment > .button-edit-markdown{ - top:6px; - right:20px; +.h550 { + height: 550px; } -.button-delete-address{ - cursor:pointer; +.h600 { + height: 600px; } -.button-right-justified{ - float:right; +.m-l10 { + margin-left: 10px; } -.status-new{ - background:white; +.m-l20 { + margin-left: 20px; } -.status-preparation{ - color:white; - background:darkorange; +.m-l30 { + margin-left: 30px; } -.status-inprogress{ - color:white; - background:green; +.m-l40 { + margin-left: 40px; } -.status-review{ - background:yellow; +.m-l50 { + margin-left: 50px; } -.status-closed{ - color:white; - background:blue; +.paragraph { + padding: 3px 3px 3px 10px; } -.status-rejected{ - color:white; - background:gray; +.dialog { + display: none; + padding: 15px 0px 10px 0px !important; } -.always-hidden{ - display:none; -} + .dialog .fieldset { + margin: 0px 10px 10px 10px; + } -h3.title-header{ - height:40px; - padding:10px 20px; - text-align:center; - background-color:gainsboro; - border:solid 1px darkgray; - border-radius:10px 10px 0px 0px / 10px 10px 0px 0px; +.link span { + margin-right: 5px; } -.outgoing-mail .dialog{ - padding:0px !important; -} + .link span.bold { + font-weight: bold; + cursor: pointer; + } -.outgoing-mail .ui-dialog-titlebar{ - display:none; +.histories-form { + padding: 20px; } -.svg-work-value{ - width:50px; - height:40px; +.ui-widget input, .ui-widget select, .ui-widget button { + font-family: Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; } -.svg-work-value text{ - +.ui-widget textarea { + line-height: 1.5em; + font-family: Terminal,Hiragino Kaku Gothic Pro; } -.svg-work-value rect:nth-of-type(1){ - fill:gainsboro; +.ui-widget { + font-size: 1em; } -.svg-work-value rect:nth-of-type(2){ - fill:darkseagreen; +.ui-button { + padding: 4px 4px 4px 2px !important; } -.svg-progress-rate{ - width:50px; - height:40px; +.ui-dialog { + overflow: visible !important; } -.svg-progress-rate text{ - +.ui-icon.a { + float: left; + margin: 6px 0px 0px 0px; } -.svg-progress-rate.warning text{ - fill:red; +.ui-spinner { + display: block; + float: left; + background: white; + max-height: 46px; } -.svg-progress-rate rect:nth-of-type(1){ - fill:gainsboro; +.ui-widget.ui-state-default.ui-multiselect { + height: 30px; + background: white; + border: solid 1px silver; + overflow: hidden; + border-radius: 5px; } -.svg-progress-rate rect:nth-of-type(2){ - fill:gray; +.ui-multiselect-checkboxes { + min-height: 300px; } -.svg-progress-rate rect:nth-of-type(3){ - fill:darkseagreen; -} + .ui-multiselect-checkboxes input { + margin: 0px 5px; + } -.svg-progress-rate.warning rect:nth-of-type(3){ - fill:#ffccd5; +.ui-corner-all.ui-state-hover { + border-radius: 2px; } -.svg-kamban-aggregation-view{ - width:100%; - height:20px; +div.field-control .ui-multiselect.ui-state-disabled { + background-color: whitesmoke; + opacity: 1; } -.svg-kamban-aggregation-view rect{ - height:20px; - fill:darkseagreen; +.height-auto { + max-height: none !important; } -.svg-crosstab{ - width:100%; - height:20px; +.focus-inform { + background-color: white !important; + border: solid 1px orange !important; } -.svg-crosstab rect{ - height:20px; - fill:darkseagreen; +.menu-negative { + border-left: solid 1px white; + border-right: solid 1px white; + position: absolute; + z-index: 10; } -.axis{ - fill:none; - stroke:gray; - shape-rendering:crispEdges; -} + .menu-negative > li { + width: 100%; + display: block; + float: left; + border-top: dotted 1px white; + cursor: pointer; + clear: both; + } -.h2{ - margin:0px 0px 5px 0px; - padding:0px; +.sortable { } -.h3{ - margin:0px 0px 5px 10px; - padding:0px; +.menu-sort { + border-left: solid 1px white; + border-right: solid 1px white; + position: absolute; + border-radius: 0px 0px 10px 10px / 0px 0px 10px 10px; + z-index: 10; } -.h4{ - margin:0px 0px 5px 20px; - padding:0px; -} + .menu-sort > li { + width: 100%; + display: block; + float: left; + border-top: dotted 1px white; + cursor: pointer; + clear: both; + } -.h5{ - margin:0px 0px 5px 30px; - padding:0px; -} + .menu-sort > li.ui-menu-divider { + height: initial; + font-size: initial; + } -.h6{ - margin:0px 0px 5px 40px; - padding:0px; -} + .menu-sort > li:hover { + } -.h2 > h2{ - padding:5px 0px; - font-weight:bold; - border-bottom:solid 1px silver; -} + .menu-sort > li > * { + } -.h3 > h3{ - font-weight:bold; -} + .menu-sort > li.grid-header-filter .ui-icon { + position: initial; + } -.h4 > h4{ - font-weight:bold; -} + .menu-sort > li:not(.grid-header-filter) div.field-control > * { + border: solid 1px silver; + } -.h5 > h5{ - font-weight:bold; +.current-time { + position: absolute; + top: 9px; + right: -17px; + cursor: pointer; + z-index: 10; } -.h6 > h6{ - font-weight:bold; +.current-user { + position: absolute; + top: 9px; + right: -17px; + cursor: pointer; + z-index: 10; } -.w50{ - width:50px; +.current-dept { + position: absolute; + top: 9px; + right: -17px; + cursor: pointer; + z-index: 10; } -.w100{ - width:100px; +input:focus { + background-color: #ffffcc; } -.w150{ - width:150px; +select:focus:not(.has-css) { + background-color: #ffffcc; } -.w200{ - width:200px; +textarea:focus { + background-color: #ffffcc; } -.w250{ - width:250px; +.ssoLoginMessage { + margin: 10px; + padding: 6px; + border-top: solid 1px silver; } -.w300{ - width:300px; +#EnterPriseBanner { + width: 238px; + position: fixed; + right: 8px; + bottom: 280px; + z-index: 3; } -.w350{ - width:350px; +#SupportBanner { + width: 238px; + position: fixed; + right: 8px; + bottom: 180px; + z-index: 3; } -.w400{ - width:400px; +#CasesBanner { + width: 238px; + position: fixed; + right: 8px; + bottom: 80px; + z-index: 3; } -.w450{ - width:450px; +.annonymous .close-announcement { + display: none; } -.w500{ - width:500px; +.grid-stack { + background-color: white; + margin: 10px; } -.w550{ - width:550px; +.grid-stack-item-content { + background-color: whitesmoke; } -.w600{ - width:600px; +.dashboard-timeline-container { + display: flex; + flex-direction: column; + gap: 4px; } -.h100{ - height:100px; +.dashboard-timeline-item { + background-color: white; + margin: 4px; + padding: 8px; + transition: background-color 0.3s; + cursor: pointer; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + border-radius: 4px; } -.h150{ - height:150px; -} + .dashboard-timeline-item:hover { + background-color: #ebebeb; + } -.h200{ - height:200px; +.dashboard-timeline-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 4px; } -.h250{ - height:250px; -} + .dashboard-timeline-header a { + color: #007bff; + font-weight: bold; + min-width: 40px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } -.h300{ - height:300px; +.dashboard-timeline-header-closed { + overflow: hidden; + max-height: 0; + margin-bottom: 0; } -.h350{ - height:350px; +.dashboard-timeline-item:hover .dashboard-timeline-header-closed { + max-height: 200px; + margin-bottom: 4px; + overflow: auto; + transition: max-height 0.5s linear 1.0s; } -.h400{ - height:400px; +.dashboard-timeline-record-time { + font-size: 0.8em; + color: #777; + margin-left: 3px; + font-weight: bold; + display: flex; + white-space: nowrap; } -.h450{ - height:450px; -} + .dashboard-timeline-record-time time { + margin-left: 4px; + } -.h500{ - height:500px; -} + .dashboard-timeline-record-time .elapsed-time { + margin-left: 4px; + font-weight: bold; + background-color: #eee; + } -.h550{ - height:550px; +.dashboard-timeline-title { + font-size: 1.2em; + font-weight: bold; + color: #333333; } -.h600{ - height:600px; +.dashboard-timeline-body { + margin-top: 8px; + line-height: 1.5; + color: #555; } -.m-l10{ - margin-left:10px; +.dashboard-timeline-body-closed { + margin-top: 0; + overflow: hidden; + max-height: 0px; } -.m-l20{ - margin-left:20px; +.dashboard-timeline-item:hover .dashboard-timeline-body-closed { + margin-top: 8px; + max-height: 300px; + overflow: auto; + transition: max-height 0.5s linear 1.0s, margin-top 0s; + transition-delay: 1.0s } -.m-l30{ - margin-left:30px; +.grid-stack-item-content { + background-color: #f2f2f2; + padding: 16px; + border-radius: 5px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; } -.m-l40{ - margin-left:40px; +.dashboard-part-title { + font-size: 1.2em; + color: #333333; + font-weight: bold; + margin-bottom: 10px; } -.m-l50{ - margin-left:50px; +.dashboard-part-nav { + margin-top: 10px; } -.paragraph{ - padding:3px 3px 3px 10px; +.dashboard-part-nav-menu { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-wrap: wrap; +} + + .dashboard-part-nav-menu > .dashboard-part-nav-item { + max-width: 200px; + min-width: 120px; + margin-left: 10px; + white-space: nowrap; + overflow: hidden; + padding: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + } + +.dashboard-part-nav-menu-vartical { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; } -.dialog{ - display:none; - padding:15px 0px 10px 0px !important; +.dashboard-part-nav-item { + color: #333; + margin-bottom: 8px; + padding: 4px; + display: flex; + border-radius: 4px; + background-color: white; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } -.dialog .fieldset{ - margin:0px 10px 10px 10px; -} + .dashboard-part-nav-item:hover { + background-color: #dddddd; + } -.link span{ - margin-right:5px; +.dashboard-part-nav-link { + padding: 4px; + text-decoration: none; + color: inherit; + width: 100%; } -.link span.bold{ - font-weight:bold; - cursor:pointer; +.gs-20 > .grid-stack-item { + width: 5%; + min-width: 5%; } -.histories-form{ - padding:20px; -} + .gs-20 > .grid-stack-item[gs-w="1"] { + width: 5%; + min-width: 5%; + } -.ui-widget input, .ui-widget select, .ui-widget button{ - font-family:Hiragino Kaku Gothic Pro, "Meiryo UI", sans-serif; -} + .gs-20 > .grid-stack-item[gs-x="1"] { + left: 5%; + } -.ui-widget textarea{ - line-height:1.5em; - font-family:Terminal,Hiragino Kaku Gothic Pro; -} + .gs-20 > .grid-stack-item[gs-w="2"] { + width: 10%; + } -.ui-widget{ - font-size:1em; -} + .gs-20 > .grid-stack-item[gs-x="2"] { + left: 10%; + } -.ui-button{ - padding:4px 4px 4px 2px !important; -} + .gs-20 > .grid-stack-item[gs-w="3"] { + width: 15%; + } -.ui-dialog{ - overflow:visible !important; -} + .gs-20 > .grid-stack-item[gs-x="3"] { + left: 15%; + } -.ui-icon.a{ - float:left; - margin:6px 0px 0px 0px; -} + .gs-20 > .grid-stack-item[gs-w="4"] { + width: 20%; + } -.ui-spinner{ - display:block; - float:left; - background:white; - max-height:46px; -} + .gs-20 > .grid-stack-item[gs-x="4"] { + left: 20%; + } -.ui-widget.ui-state-default.ui-multiselect{ - height:30px; - background:white; - border:solid 1px silver; - overflow:hidden; - border-radius:5px; -} + .gs-20 > .grid-stack-item[gs-w="5"] { + width: 25%; + } -.ui-multiselect-checkboxes{ - min-height:300px; -} + .gs-20 > .grid-stack-item[gs-x="5"] { + left: 25%; + } -.ui-multiselect-checkboxes input{ - margin:0px 5px; -} + .gs-20 > .grid-stack-item[gs-w="6"] { + width: 30%; + } -.ui-corner-all.ui-state-hover{ - border-radius:2px; -} + .gs-20 > .grid-stack-item[gs-x="6"] { + left: 30%; + } -div.field-control .ui-multiselect.ui-state-disabled{ - background-color:whitesmoke; - opacity:1; -} + .gs-20 > .grid-stack-item[gs-w="7"] { + width: 35%; + } -.height-auto{ - max-height:none !important; -} + .gs-20 > .grid-stack-item[gs-x="7"] { + left: 35%; + } -.focus-inform{ - background-color:white !important; - border:solid 1px orange !important; -} + .gs-20 > .grid-stack-item[gs-w="8"] { + width: 40%; + } -.menu-negative{ - border-left:solid 1px white; - border-right:solid 1px white; - position:absolute; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="8"] { + left: 40%; + } -.menu-negative > li{ - width:100%; - display:block; - float:left; - border-top:dotted 1px white; - cursor:pointer; - clear:both; -} + .gs-20 > .grid-stack-item[gs-w="9"] { + width: 45%; + } -.sortable{ + .gs-20 > .grid-stack-item[gs-x="9"] { + left: 45%; + } -} + .gs-20 > .grid-stack-item[gs-w="10"] { + width: 50%; + } -.menu-sort{ - border-left:solid 1px white; - border-right:solid 1px white; - position:absolute; - border-radius:0px 0px 10px 10px / 0px 0px 10px 10px; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="10"] { + left: 50%; + } -.menu-sort > li{ - width:100%; - display:block; - float:left; - border-top:dotted 1px white; - cursor:pointer; - clear:both; -} + .gs-20 > .grid-stack-item[gs-w="11"] { + width: 55%; + } -.menu-sort > li.ui-menu-divider{ - height:initial; - font-size:initial; -} + .gs-20 > .grid-stack-item[gs-x="11"] { + left: 55%; + } -.menu-sort > li:hover{ + .gs-20 > .grid-stack-item[gs-w="12"] { + width: 60%; + } -} + .gs-20 > .grid-stack-item[gs-x="12"] { + left: 60%; + } -.menu-sort > li > *{ + .gs-20 > .grid-stack-item[gs-w="13"] { + width: 65%; + } + + .gs-20 > .grid-stack-item[gs-x="13"] { + left: 65%; + } -} + .gs-20 > .grid-stack-item[gs-w="14"] { + width: 70%; + } -.menu-sort > li.grid-header-filter .ui-icon{ - position:initial; -} + .gs-20 > .grid-stack-item[gs-x="14"] { + left: 70%; + } -.menu-sort > li:not(.grid-header-filter) div.field-control > *{ - border:solid 1px silver; -} + .gs-20 > .grid-stack-item[gs-w="15"] { + width: 75%; + } -.current-time{ - position:absolute; - top:9px; - right:-17px; - cursor:pointer; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="15"] { + left: 75%; + } -.current-user{ - position:absolute; - top:9px; - right:-17px; - cursor:pointer; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-w="16"] { + width: 80%; + } -.current-dept{ - position:absolute; - top:9px; - right:-17px; - cursor:pointer; - z-index:10; -} + .gs-20 > .grid-stack-item[gs-x="16"] { + left: 80%; + } -input:focus{ - background-color:#ffffcc; -} - -select:focus:not(.has-css){ - background-color:#ffffcc; -} + .gs-20 > .grid-stack-item[gs-w="17"] { + width: 85%; + } -textarea:focus{ - background-color:#ffffcc; -} + .gs-20 > .grid-stack-item[gs-x="17"] { + left: 85%; + } -.ssoLoginMessage{ - margin:10px; - padding:6px; - border-top:solid 1px silver; -} + .gs-20 > .grid-stack-item[gs-w="18"] { + width: 90%; + } -#EnterPriseBanner{ - width:238px; - position:fixed; - right:8px; - bottom:280px; - z-index:3; -} + .gs-20 > .grid-stack-item[gs-x="18"] { + left: 90%; + } -#SupportBanner { - width:238px; - position:fixed; - right:8px; - bottom:180px; - z-index:3; -} + .gs-20 > .grid-stack-item[gs-w="19"] { + width: 95%; + } -#CasesBanner{ - width:238px; - position:fixed; - right:8px; - bottom:80px; - z-index:3; -} + .gs-20 > .grid-stack-item[gs-x="19"] { + left: 95%; + } -.annonymous .close-announcement{ - display:none; -} + .gs-20 > .grid-stack-item[gs-w="20"] { + width: 100%; + } diff --git a/Implem.TestAutomation/implem.TestAutomation.csproj b/Implem.TestAutomation/implem.TestAutomation.csproj index 0cd3ba202..37b269bb4 100644 --- a/Implem.TestAutomation/implem.TestAutomation.csproj +++ b/Implem.TestAutomation/implem.TestAutomation.csproj @@ -4,9 +4,9 @@ Exe net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 Linux diff --git a/README.md b/README.md index acc2c2e8d..295ea8f74 100644 --- a/README.md +++ b/README.md @@ -39,18 +39,6 @@ Pleasanter is a development platform that utilizes both no-code and low-code app First, please make sure that Docker is available :) If necessary, run the Docker command with sudo when executing it. -1. Create database initialize query - - Create PostgreSQL initialize query file `setup.sql` in `initdb` directory. - - ```sql - create user "Implem.Pleasanter_Owner" with password ''; - create schema authorization "Implem.Pleasanter_Owner"; - create database "Implem.Pleasanter" with owner "Implem.Pleasanter_Owner"; - \c "Implem.Pleasanter"; - CREATE EXTENSION IF NOT EXISTS pg_trgm; - ``` - 1. Create docker network ```shell @@ -60,7 +48,7 @@ If necessary, run the Docker command with sudo when executing it. 1. Run PostgreSQL ```shell - docker run --rm -d -v $PWD/initdb:/docker-entrypoint-initdb.d \ + docker run --rm -d \ --network pleasanter-net \ --name db \ --env POSTGRES_USER=postgres \ diff --git a/Rds/Implem.IRds/ISqlDefinitionSetting.cs b/Rds/Implem.IRds/ISqlDefinitionSetting.cs index baadedcd2..e56ec5e5b 100644 --- a/Rds/Implem.IRds/ISqlDefinitionSetting.cs +++ b/Rds/Implem.IRds/ISqlDefinitionSetting.cs @@ -4,5 +4,7 @@ public interface ISqlDefinitionSetting { int IdentifierPostfixLength { get; } int NationalCharacterStoredSizeCoefficient { get; } + string SchemaName { get; set; } + bool IsCreatingDb { get; set; } } } diff --git a/Rds/Implem.IRds/ISqls.cs b/Rds/Implem.IRds/ISqls.cs index bc386dcaa..ef94a50bc 100644 --- a/Rds/Implem.IRds/ISqls.cs +++ b/Rds/Implem.IRds/ISqls.cs @@ -35,6 +35,7 @@ public interface ISqls string SiteDeptWhere { get; } string SiteGroupWhere { get; } string SiteUserWhere { get; } + string SitePermissionsWhere { get; } public string IntegratedSitesPermissionsWhere(string tableName, List sites); } } diff --git a/Rds/Implem.IRds/Implem.IRds.csproj b/Rds/Implem.IRds/Implem.IRds.csproj index 362648ca0..8347c9c93 100644 --- a/Rds/Implem.IRds/Implem.IRds.csproj +++ b/Rds/Implem.IRds/Implem.IRds.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj b/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj index eb1ce0dd9..444427ad2 100644 --- a/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj +++ b/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Rds/Implem.PostgreSql/PostgreSqlDefinitionSetting.cs b/Rds/Implem.PostgreSql/PostgreSqlDefinitionSetting.cs index d9590fe29..150c69212 100644 --- a/Rds/Implem.PostgreSql/PostgreSqlDefinitionSetting.cs +++ b/Rds/Implem.PostgreSql/PostgreSqlDefinitionSetting.cs @@ -2,7 +2,11 @@ { internal class PostgreSqlDefinitionSetting : ISqlDefinitionSetting { + private string schemaName = null; + private bool isCreatingDb = false; public int IdentifierPostfixLength { get; } = 32; public int NationalCharacterStoredSizeCoefficient { get; } = 4; + public string SchemaName { get { return schemaName; } set { schemaName = value; } } + public bool IsCreatingDb { get { return isCreatingDb; } set { isCreatingDb = value; } } } } diff --git a/Rds/Implem.PostgreSql/PostgreSqlSqls.cs b/Rds/Implem.PostgreSql/PostgreSqlSqls.cs index c1654fa62..b5e4b5808 100644 --- a/Rds/Implem.PostgreSql/PostgreSqlSqls.cs +++ b/Rds/Implem.PostgreSql/PostgreSqlSqls.cs @@ -312,51 +312,57 @@ union all public string SiteUserWhere { get; } = @" ( - exists + ""Users"".""UserId"" in ( - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Depts"" as ""PermissionDepts"" on ""Permissions"".""DeptId""=""PermissionDepts"".""DeptId"" inner join ""Users"" as ""PermissionUsers"" on ""PermissionDepts"".""DeptId""=""PermissionUsers"".""DeptId"" + inner join ""Users"" on ""PermissionUsers"".""UserId"" = ""Users"".""UserId"" where ""Permissions"".""ReferenceId""={0} - and ""PermissionUsers"".""UserId""=""Users"".""UserId"" and ""PermissionDepts"".""Disabled""='false' and ""PermissionUsers"".""Disabled""='false' union all - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Groups"" on ""Permissions"".""GroupId""=""Groups"".""GroupId"" inner join ""GroupMembers"" on ""Groups"".""GroupId""=""GroupMembers"".""GroupId"" inner join ""Depts"" as ""GroupMemberDepts"" on ""GroupMembers"".""DeptId""=""GroupMemberDepts"".""DeptId"" inner join ""Users"" as ""GroupMemberUsers"" on ""GroupMemberDepts"".""DeptId""=""GroupMemberUsers"".""DeptId"" + inner join ""Users"" on ""GroupMemberUsers"".""UserId"" = ""Users"".""UserId"" where ""Permissions"".""ReferenceId""={0} - and ""GroupMemberUsers"".""UserId""=""Users"".""UserId"" and ""Groups"".""Disabled""='false' and ""GroupMemberDepts"".""Disabled""='false' and ""GroupMemberUsers"".""Disabled""='false' union all - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Groups"" on ""Permissions"".""GroupId""=""Groups"".""GroupId"" inner join ""GroupMembers"" on ""Groups"".""GroupId""=""GroupMembers"".""GroupId"" inner join ""Users"" as ""GroupMemberUsers"" on ""GroupMembers"".""UserId""=""GroupMemberUsers"".""UserId"" + inner join ""Users"" on ""GroupMemberUsers"".""UserId"" = ""Users"".""UserId"" where ""Permissions"".""ReferenceId""={0} - and ""GroupMemberUsers"".""UserId""=""Users"".""UserId"" and ""Groups"".""Disabled""='false' and ""GroupMemberUsers"".""Disabled""='false' union all - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Users"" as ""PermissionUsers"" on ""Permissions"".""UserId""=""PermissionUsers"".""UserId"" + inner join ""Users"" on ""Users"".""Disabled""='false' where ""Permissions"".""ReferenceId""={0} and ""PermissionUsers"".""UserId""=""Users"".""UserId"" - and ""Users"".""Disabled""='false' and ""PermissionUsers"".""Disabled""='false' - union all + ) + )"; + + public string SitePermissionsWhere { get; } = @" + ( + exists + ( select ""Permissions"".""ReferenceId"" from ""Permissions"" where diff --git a/Rds/Implem.SqlServer/Implem.SqlServer.csproj b/Rds/Implem.SqlServer/Implem.SqlServer.csproj index 33a4924c9..94d650711 100644 --- a/Rds/Implem.SqlServer/Implem.SqlServer.csproj +++ b/Rds/Implem.SqlServer/Implem.SqlServer.csproj @@ -3,9 +3,9 @@ net6.0 Copyright © Implem Inc 2014 - 2023 - 1.3.43.0 - 1.3.43.0 - 1.3.43.0 + 1.3.44.0 + 1.3.44.0 + 1.3.44.0 disable diff --git a/Rds/Implem.SqlServer/SqlServerDefinitionSetting.cs b/Rds/Implem.SqlServer/SqlServerDefinitionSetting.cs index 617b8cce6..712e2dc64 100644 --- a/Rds/Implem.SqlServer/SqlServerDefinitionSetting.cs +++ b/Rds/Implem.SqlServer/SqlServerDefinitionSetting.cs @@ -4,5 +4,7 @@ internal class SqlServerDefinitionSetting : ISqlDefinitionSetting { public int IdentifierPostfixLength { get; } = 64; public int NationalCharacterStoredSizeCoefficient { get; } = 2; + public string SchemaName { get => ""; set => _ = value; } + public bool IsCreatingDb { get => false; set => _ = value; } } } diff --git a/Rds/Implem.SqlServer/SqlServerSqls.cs b/Rds/Implem.SqlServer/SqlServerSqls.cs index 44c634829..c50f69fd3 100644 --- a/Rds/Implem.SqlServer/SqlServerSqls.cs +++ b/Rds/Implem.SqlServer/SqlServerSqls.cs @@ -308,51 +308,57 @@ union all public string SiteUserWhere { get; } = @" ( - exists + ""Users"".""UserId"" in ( - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Depts"" as ""PermissionDepts"" on ""Permissions"".""DeptId""=""PermissionDepts"".""DeptId"" inner join ""Users"" as ""PermissionUsers"" on ""PermissionDepts"".""DeptId""=""PermissionUsers"".""DeptId"" + inner join ""Users"" on ""PermissionUsers"".""UserId"" = ""Users"".""UserId"" where ""Permissions"".""ReferenceId""={0} - and ""PermissionUsers"".""UserId""=""Users"".""UserId"" and ""PermissionDepts"".""Disabled""='false' and ""PermissionUsers"".""Disabled""='false' union all - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Groups"" on ""Permissions"".""GroupId""=""Groups"".""GroupId"" inner join ""GroupMembers"" on ""Groups"".""GroupId""=""GroupMembers"".""GroupId"" inner join ""Depts"" as ""GroupMemberDepts"" on ""GroupMembers"".""DeptId""=""GroupMemberDepts"".""DeptId"" inner join ""Users"" as ""GroupMemberUsers"" on ""GroupMemberDepts"".""DeptId""=""GroupMemberUsers"".""DeptId"" + inner join ""Users"" on ""GroupMemberUsers"".""UserId"" = ""Users"".""UserId"" where ""Permissions"".""ReferenceId""={0} - and ""GroupMemberUsers"".""UserId""=""Users"".""UserId"" and ""Groups"".""Disabled""='false' and ""GroupMemberDepts"".""Disabled""='false' and ""GroupMemberUsers"".""Disabled""='false' union all - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Groups"" on ""Permissions"".""GroupId""=""Groups"".""GroupId"" inner join ""GroupMembers"" on ""Groups"".""GroupId""=""GroupMembers"".""GroupId"" inner join ""Users"" as ""GroupMemberUsers"" on ""GroupMembers"".""UserId""=""GroupMemberUsers"".""UserId"" + inner join ""Users"" on ""GroupMemberUsers"".""UserId"" = ""Users"".""UserId"" where ""Permissions"".""ReferenceId""={0} - and ""GroupMemberUsers"".""UserId""=""Users"".""UserId"" and ""Groups"".""Disabled""='false' and ""GroupMemberUsers"".""Disabled""='false' union all - select ""Permissions"".""ReferenceId"" + select ""Users"".""UserId"" from ""Permissions"" inner join ""Users"" as ""PermissionUsers"" on ""Permissions"".""UserId""=""PermissionUsers"".""UserId"" + inner join ""Users"" on ""Users"".""Disabled""='false' where ""Permissions"".""ReferenceId""={0} and ""PermissionUsers"".""UserId""=""Users"".""UserId"" - and ""Users"".""Disabled""='false' and ""PermissionUsers"".""Disabled""='false' - union all + ) + )"; + + public string SitePermissionsWhere { get; } = @" + ( + exists + ( select ""Permissions"".""ReferenceId"" from ""Permissions"" where